Sunteți pe pagina 1din 6

Algoritmi si structuri de date (8.11.

2012) Informatic, Matematic, anul 1

ASD_C06

Algoritmi elementari folosind vectori


R1. Enunul problemei: S se determine valoarea minim i maxim dintre elementele unui vector. Metoda de rezolvare: Se iniializeaz valorile maxim i minim cu valoarea elementului de pe prima poziie din vector. Apoi se parcurg celelalte elemente ale vectorului i dac valoarea curent este mai mic/mare dect valoarea minim/maxim gsit pn acum, se actualizeaz aceste valori cu valoarea curent (min{v1,..., vi} = min{vi, min{v1,..., vi -1}}). Descrierea algoritmului n pseudocod:
citete n,v1,,vn min v1 *pp ca max v1 pentru i = 2,n,1 daca vi<min min daca vi>max max scrie min,max
val min si maxima sunt pe prima pozitie

repeta *ne uitam la valorile a 2-a a n-a atunci *val curenta bate min gasit pana acum vi *se actualizeaza val minima atunci *val curenta bate max gasit pana acum vi *se actualizeaza valoarea maxima

Descrierea algoritmului n C++: n primul rnd, va apare un decalaj n ceea ce privete indicii din ir: 2 n-1 n Pseudocod 1 vn-1 C / C++ v0 v1 vn-2 #include <conio.h> #include <iostream.h> int n,i; float v[30],min,max; //maxim v[0], v[1] v[29] void main() {//intai citim nr efectiv de elem si elementele vect cout<<endl<<Dati dimensiunea vectorului: ; cin>>n; for (i=0;i<n;i++) { cout<<v[<<i+1<<]=; //val nr. i+1 este memorata in vector pe pozitia i cin>>v[i]; } *det valoarea minima / maxima min = max = v[0]; //primele valori din vector for (i=1;i<=n-1;i++) //celelalte pozitii din vector { if (v[i]<min) min = v[i]; if (v[i]>max) max = v[i]; } cout<<Valoarea minima din vector: <<min; cout<<endl<<Valoarea maxima din vector: <<max; getch(); }

Algoritmi si structuri de date (8.11.2012) Informatic, Matematic, anul 1

ASD_C06

De exemplu, pentru n = 6 i v = [3 5 2 4 7 6]: Pas Instruciune min = max = v[0]; 1 pentru i=1: v[i]=5 < 2 / min=3, v[i]=5>max=3 pentru i=2: v[i]=2<min=3, v[i]=2 > 3 / max=5 pentru i=3: v[i]=4 < 4 / min=2, v[i]=4 > / max=5 pentru i=4: v[i]=7 < min=2, v[i]=7>max=5 5 / pentru i=5: v[i]=6 < 6 / min=2, v[i]=6 > / max=7

min 3 3 2 2 2 2

max 3 5 5 5 7 7

O alt variant n care nu se folosesc vectori, dar se folosesc numere ntregi citite pe rnd: #include <conio.h> #include <iostream.h> #include <values.h> //pt MAXINT int min,max,a,n,i; //min si max trebuie sa fie de acelasi //tip ca valorile din vector void main() { min = MAXINT; //pp ca valoarea min este 32767 max = -MAXINT-1; //pp ca valoarea min este -32768 cout<<endl<<"Cate elemente introduceti? "; cin>>n; cout<<"Dati elementele: "; for (i=0;i<n;i++) //pentru fiecare dintre elem. vect. { cin>>a; if (a<min) min=a; if (a>max) max=a; } cout<<"Valoarea minima: "<<min; cout<<"Valoarea maxima: "<<max; getch(); } R2. Enunul problemei: S se determine suma elementelor unui vector. Metoda de rezolvare: Se procedeaz ca n cazul general pentru determinarea unei sume, innd cont ca aceast sum se scrie restrns: S = Descrierea algoritmului n pseudocod:
citete n,v1,,vn S 0 pentru i = 1,n,1 repeta S S + vi scrie S
i =1

vi .

Observaie: Pentru a aduna doar componentele cu o anumit proprietate, de exemplu cele pozitive, mai punem o conditie nainte de a aduna componenta curenta:
citete n,v1,,vn S 0 pentru i = 1,n,1 repeta daca vi>0 atunci S S + vi scrie S

Algoritmi si structuri de date (8.11.2012) Informatic, Matematic, anul 1

ASD_C06

R3. Enunul problemei: S se determine media aritmetic, media geometric i media armonic a elementelor unui vector de maxim 30 componente strict pozitive. Metoda de rezolvare: Reamintim definiiile tuturor mediilor din enun pentru vectorul (vi)i=1, 2,, n, cu vi>0:

vi v1 + v 2 + ... + v n i =1 media aritmetic = = n n


n media geometric = n v1v 2 ...v n = n vi i =1

media armonic =

Astfel, calculele au la baz determinarea a dou sume i a unui produs. Descrierea algoritmului n pseudocod:
citete n,v1,,vn * ai trebuie sa fie strict pozitive ma 0 pentru i = 1,n,1 repeta ma ma + vi ma ma /n mg 1 pentru i = 1,n,1 repeta mg mg * vi mg n mg marm 0 pentru i = 1,n,1 repeta marm marm + 1/vi marm n/marm scrie ma,mg,marm

n n = 1 + 1 + ... + 1 n 1 v1 v2 vn v i =1 i

Descrierea algoritmului n C++: #include <conio.h> #include <iostream.h> #include <math.h> #include <stdlib.h> int n,i; float v[30],ma,mg,marm; void main() { cout<<endl<<Dati dimensiunea vectorului: ; cin>>n; for (i=0;i<n;i++) { cout<<v[<<i+1<<]=; cin>>v[i]; if (v[i]<=0) //controlez componenta i introdusa {//vi nu este strict poitiva cout<<componentele vectorului sa fie pozitive; getch(); //se vizualizeaza mesajul anterior exit(1); //se iese din program } 3

Algoritmi si structuri de date (8.11.2012) Informatic, Matematic, anul 1

ASD_C06

} //ma = marm = 0; for (i=0;i<n;i++) ma += v[i]; ma /= n; \ mg = 1; for (i=0;i<n;i++) mg *= v[i]; mg = pow(mg,1.0/n); for (i=0;i<n;i++) marm += 1/v[i]; marm = n/marm; cout<<Media aritmetica: ,ma; cout<<endl<<Media geometrica: <<mg; cout<<endl<<Media arminica: <<marm; getch(); } R4. Enunul problemei: S se calculeze valoarea unui polinom ntr-un punct dat. Metoda de rezolvare: Considerm un polinom de forma: P(X) = an X n + an-1 X n-1 + + a1X + a0 ce are gradul n (an 0) i coeficienii an, an-1, , a1, a0. Se cere s calculm P(x0) pentru x0 citit de la tastatur. O variant ar fi cea clasic P(x0) = an (x0)n + an-1 (x0) n-1 + + a1x0 + a0 = Pentru a evita expresia 00 din i=0 => P(x0)= a0 + ai ( x 0 ) i
i =1 n i =0

ai ( x 0 ) i

i =0

ai ( x 0 ) i

(cnd x0=0 i i=0) vom scoate din sum termenul

Descrierea algoritmului n pseudocod:


citete n,an,,a0,x0 S a0 pentru i = n,1,-1 repeta S S + ai(x0)i scrie S

Descrierea algoritmului n pseudocod C++: #include <conio.h> #include <iostream.h> #include <math.h> float a[20],x0,S; int n,i; void main(){ cout<<endl<<"Dati gradul polinomului: "; cin>>n; cout<<"Dati coeficientii polin (de la coef cel mai semnificativ):"<<endl; for (i=n; i>=0; i--) { cout<<"a["<<i<<"]="; cin>>a[i]; } cout<<"Dati x0: "; cin>>x0; S = a[0]; //initializez suma cu termenul liber 4

Algoritmi si structuri de date (8.11.2012) Informatic, Matematic, anul 1

ASD_C06

for (i=1; i<=n; i++) S += a[i]*pow(x0,i); cout<<"Valoarea polinomului este: "<<S; getch(); } O variant iterativ, mai dificil, dar care evit folosirea funciei putere: P(X) = an X n + an-1 X n-1 + + a1X + a0 = a0 + X(a1+ X(a2 + .+X(an))) n acest caz, algoritmul este urmtorul. Descrierea algoritmului n pseudocod:
citete n,an,,a0,x0 S an pentru i = n-1,0,-1 repeta S ai + x0S scrie S

Descrierea algoritmului n C++: #include <conio.h> #include <iostream.h> float a[20],x0,S; int n,i; void main(){ cout<<endl<<"Dati gradul polinomului: "; cin>>n; cout<<"Dati coeficientii polin (de la coef cel mai semnificativ):"<<endl; for (i=n; i>=0; i--) { cout<<"a["<<i<<"]="; cin>>a[i]; } cout<<"Dati x0: "; cin>>x0; S = a[n]; for (i=n-1; i>=0; i--) S = x0*S + a[i]; cout<<"Valoarea polinomului este: "<<S; getch(); } R5. Enunul problemei: S se determine dac un numr ntreg este palindrom sau nu, adic se citete la fel de la stnga la dreapta i de la dreapta la stnga (numrul este identic cu rsturnatul su). De exemplu, 4357534 este palindrom. Metoda de rezolvare: O prim variant const n determinarea rsturnatului numrului ntreg dat i apoi testarea condiiei ca numrul dat s coincid cu rsturnatul su. Pentru determinarea rsturnatului vezi ASD_C05.doc, problema 7 suplimentar. O variant mai simpl este aceea n care se reprezint numrul ca ir de caractere i atunci trebuie verificat dac prima cifr coincide cu ultima, a doua cu penultima, etc., pn la jumtatea irului: 1 2 lungime-1 sir1 sir2 sirlungime-1 adic sir1 ?= sirlungime (primul caracter din ir coincide cu ultimul) sir2 ?= sirlungime-1 (al doilea caracter din ir coincide cu penultimul) . siri ?= sirlungime + 1 i, i = 1, 2,, lungime/2. 5 lungime sirlungime

Algoritmi si structuri de date (8.11.2012) Informatic, Matematic, anul 1

ASD_C06

Descrierea algoritmului n pseudocod:


citete sir palindrom adevarat pentru i = 1,lungime_sir/2 repeta daca sir[i] sir[lungime_sir-i+1] atunci palindrom fals daca palindrom = adevarat atunci scrie Este palindrom altfel scrie Nu este palindrom

Descrierea algoritmului n C++: Decalajul de indici n vector fa de C++ este urmtorul: 0 1 lungime-2 lungime-1 sir0 sir1 sirlungime-2 sirlungime-1 adic sir0 ?= sirlungime-1 (primul caracter din ir coincide cu ultimul) sir1 ?= sirlungime-2 (al doilea caracter din ir coincide cu penultimul) . siri ?= sirlungime 1 i, i = 1, 2,, lungime/2. Deci: #include <iostream.h> #include <conio.h> #include <string.h> char sir[100]; int palindrom,i; void main(){ cout<<"Dati numarul: "; cin>>s; //n C:scanf("%s",&sir); //caracterele sirului: sir[0]....sir[strlen(sir)]-1 //sir[strlen(sir)] = '\0' (caracterul sfarsit de sir) palindrom = 1; //presup. ca este palindrom (verif.prop) for (i=0;i<=strlen(sir)/2;i++) if (sir[i]!=sir[strlen(sir)-i-1]) palindrom = 0; if (palindrom==1) //sau (palindrom) cout<<"Este palindrom"; else cout<<"Nu este palindrom"; getch(); }