Академический Документы
Профессиональный Документы
Культура Документы
ASD_L05
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
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
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).
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.)