Sunteți pe pagina 1din 4

Algoritmi si structuri de date (8-9.11.

2012) Informatic, anul 1

ASD_L05

Algoritmi elementari folosind vectori (continuare)


Algoritmi fcui la tabl: R1. Scriei un algortim pentru determinarea mediei geometrice a numerelor strict pozitive dintr-un vector (n cazul n care nu sunt elemente strict pozitive se va afisa mesajul nu exist numere strict pozitive). R2. Scriei un algoritm pentru a stabili dac un vector de numere reale este cresctor (vi vi+1, pentru orice i = 1,, n-1) sau nu (sugestie: se presupune c vectorul este cresctor, apoi se parcurge vectorul cu i = 1,, n-1 i n cazul n care vi > vi+1, atunci nu este cresctor). R3. Enunul problemei: S se creeze un vector doar cu elementele de valoare par ale unui alt vector dat. Descrierea algoritmului n pseudocod:
citete n,x1,,xn m 0 *indicele de dinaintea celui in care punem efectiv pentru i = 1,n,1 repeta * parcurgem vect initial daca x[i]%2 = 0 atunci *am gasit un elem cu prop dorita m m+1 * facem loc pt un nou elem in y y[m]=x[i] *pe poz. m in vectorul y punem elem x[i]

daca m=0 atunci


scrie sir vid altfel scrie y1,,ym

Descrierea algoritmului n C++: #include <iostream.h> #include <conio.h> int n,m,x[20],y[20],i; void main() { cout<<"Dati dimensiunea vect initial: "; cin>>n; for (i=0;i<n;i++) { cout<<"x["<<i+1<<"]="; cin>>x[i]; } m=-1; //in C/C++ este diferenta la indici de -1 for (i=0;i<n;i++) if (x[i]%2==0) //sau (!(x[i]%2)) y[++m]=x[i]; //sau {m++; y[m]=x[i];} //incrementam intai m si apoi punem val din x if (m==-1) cout<<"Nu exista elem pare in vect dat"; else { cout<<"Elementele pare din vector sunt: "; for (i=0;i<=m;i++) cout<<y[i]<< " "; } getch(); } 1

Algoritmi si structuri de date (8-9.11.2012) Informatic, anul 1

ASD_L05

Exist un dezavantaj la programul C++ la care algoritmul a fost gndit ca n pseudood, i anume: elementele din noul vector sunt puse pe poziiile 0, 1, , m. De obicei, elementele ntr-un vector de dimensiune n sunt puse pe poziiile 0, 1, , n-1. Atunci este de preferat s se se modifice un pic modul de gndire cnd se lucreaz n C++: #include <iostream.h> #include <conio.h> int n,m,x[20],y[20],i; void main() { cout<<"Dati dimensiunea vect initial: "; cin>>n; for (i=0;i<n;i++) { cout<<"x["<<i+1<<"]="; cin>>x[i]; } m = 0; //deocamdata sunt 0 elemente in vectorul y for (i=0;i<n;i++) //parcurgem vectorul initial if (x[i]%2==0) //am gasit un element corespunzator y[m++]=x[i]; //sau {y[m]=x[i]; m++;} //intai punem pe pozitia curenta valoarea din x //apoi m trece mai departe (inca un elem in y) if (m == 0) cout<<"Nu exista elem pare in vect dat"; else { cout<<"Elementele pare din vector sunt: "; for (i=0;i<m;i++) cout<<y[i]<< " "; } getch(); }

R4. Enunul problemei: Memorai ntr-un vector de numere ntregi, primele n numere prime. Metoda de rezolvare: Primul numr prim este 2, aadar de la el vom porni. Apoi, dac n-am gsit cte numere prime doream, trecem la urmtorul numr natural i verificm dac este prim sau nu; n caz afirmativ n trecem n vector i se continu procedeul. Descrierea algoritmului n pseudocod: functie Prim(n) *stabileste daca un nr n oarecare e prim daca n=0 sau n=1 atunci returneaza 0 altfel pentru i=2,[n] repeta daca n%i = 0 atunci returneaza 0 *se iese din fct cu val 0 (nu prim) returneaza 1 citete n m 0 *deocamdata 0 elem prime in vector x 2 *pornim de la 2 2

Algoritmi si structuri de date (8-9.11.2012) Informatic, anul 1

ASD_L05

cat_timp m<n repeta *n-am gasit n elem prime daca Prim(x)=adevarat atunci *x e prim m m+1 *am mai gasit un elem prim vm x *il adaug in vector x x + 1 *trecem la urmatorul numar scrie v1,,vm Descrierea algoritmului n pseudocod C++: #include <iostream.h> #include <conio.h> #include <math.h> //pt sqrt int Prim(int n) { //if (n==0 || n==1) return 0; //else for (int i=2;i<=sqrt(n);i++) if (n%i==0) return 0; return 1; } void main() { int n,x,m,v[100]; cout<<endl<<"n="; cin>>n; m=0; //0 elem in v sau prima pozitie disponibila x=2; //primul elem prim while (m<n) //n-am gasit n elem prime { if (Prim(x)) v[m++] = x; //intai pun pe poz. m, apoi incrementez m x++; //trec la urmatorul numar } cout<<"Primele "<<n<<" elemente prime: "; for (x=0; x<m; x++) cout<<v[x]<<" "; getch(); } Rulare: n=3 <Enter> Primele 3 elemente prime: 2 3 5 sau n=7 <Enter> Primele 7 elemente prime: 2 3 5 7 11 13 17 Tema 06 termen maxim 2 sptmni (se va transmite prin e-mail ntr-un fiier electronic sau personal pe foaie scris de mn sau listat cel trziu 23.11.2012): 1) Se consider rezultatele obinute la examenul de Algoritmi i structuri de date de studenii de la informatic, anul 1. S se determine procentul studenilor promovai. (Sugestie: rezultatele se pot reine ntr-un vector, iar procentul = contor_stud_prom * 100 / total_studenti (valoarea ntre 0 i 100); se parcurg elementele vectorului cu notele reale, de de dimensiune total_studenti i n contor_stud_pro se numr valorile 5).

Algoritmi si structuri de date (8-9.11.2012) Informatic, anul 1

ASD_L05

2) Cunoscnd numrul familiilor dintr-un jude, valoarea veniturilor lor, precum i valoarea coului minim, s se stabileasc numrul de familii ce triesc sub nivelul minim de trai. De exemplu, pentru 5 familii, vectorul veniturilor (900, 750, 700, 800, 680, 600) i coul minim de 700 de lei, avem 2 familii ce triesc sub nivelul minim de trai. (Sugestie: veniturile familiilor se pot reine ntr-un vector, apoi se parcurge acest vector i se contorizeaz componentele care au valoarea strict mai mic dect coul minim). 3) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru a cte numere pare, respectiv impare conine un vector de numere ntregi (Sugestie: se folosesc dou variabile contr, se parcurge vectorul de numere ntregi i dac valoarea curent este par se incrementeaz contorul celor pare, altfel se incrementeaz contorul celor impare). 4) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru a stabili dac un vector are toate elementele egale (Sugestie: este vorba de verificarea unei proprieti, similar cu monotonia, ns de data aceasta, cnd parcurgem vectorul, dac vi vi+1, atunci vectorul nu are elemente egale). 5) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru a determina norma i produsul scalar a doi vectori. Reamintim c pentru x = (x1, x2, , xn) i y = (y1, y2, , yn): - norma vectorului x este x = - norma vectorului xy este y =

i =1

( xi ) 2
i =1

( yi ) 2
n i =1

- produsul scalar dintre cei doi vectori este x, y = xi y i . (Sugestie: Se citete nti dimensiunea comun a celor doi vectori, apoi se citesc componentele vectorului x i apoi componentele vectorului y. Norma vectorului x, se poate considera nti suma de sub radical (deci se inializeaz cu 0, apoi se parcurge vectorul i se adaug componenta curent la ptrat), apoi se actualizeaz variabila cu radical din suma calculat. Similar si la norma lui y. Produsul scalar este o simpl sum.) Probleme suplimentare: 1) S se determine prima apariie (indicele) a unei valori date ntr-un vector. Sugestie: parcurgem vectorul i cum am gsit o component egal cu valoarea cutat se scrie indicele din vector i se oprete parcurgerea vectorului (n C/C++ break iese din for, etc). 2) S se determine ultima apariie a unei valori ntr-un vector. Sugestie: similar cu problema anterioar, doar c parcurgem invers, de la poziia n-1 napoi la 1. 3) S se determine toate apariiile unei valori ntr-un vector. Sugestie: se parcurge vectorul i cum se gsete valoarea cutat se afieaz indicele componentei din vector. 4) Stabilii dac un vector de numere este monoton (cresctor sau descresctor) sau nu (Sugestie: nti se studiaz dac vectorul este cresctor i n cazul n care este se afieaz mesajul cresctor => monoton, altfel se pornete studiul monotoniei descresctoare i n cazul n care aeste descresctor se afieaz mesajul cresctor => monoton, altfel se afieaz mesajul vectorul nu este monoton.)