Curs 3 3.3. Structura repetitiva Alexandru IOVANOVICI
3.3 Structura repetitiva <ul><li>Se foloseste pentru a implementa operatii care se repeta de mai multe ori in cadrul progr...
P.3.3.1 Suma cifrelor unui numar (1) <ul><li>Se citeste un numar intreg  n . Sa se calculeze si sa se afiseze suma cifrelo...
P.3.3.1 Suma cifrelor unui numar (2) Citeste n n<>0 u=n mod 10; S=S+u n=n/10 Scrie S
P.3.3.1 Suma cifrelor unui numar (3) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>...
P 3.3.2. Produsul cifrelor unui numar <ul><li>Tema !!! </li></ul><ul><li>Similar cu P3.3.1; </li></ul><ul><li>Atentie la i...
P3.3.3 Numere pana la citirea unui nr. (1) <ul><li>Se citeste un numar intreg  n  de la tastatura. Mai apoi se citesc nume...
P3.3.3 Numere pana la citirea unui nr. (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><u...
P3.3.4 Sirul lui Fibbonaci (1) <ul><li>Sa se afiseze primii  n  termeni ai sirului lui Fibbonaci; </li></ul><ul><li>SB se ...
P3.3.4 Sirul lui Fibbonaci (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>int  m...
P3.3.4 Maximul unui sir de numere (1) <ul><li>Se citesc numere  naturale  pana la introducerea lui zero (0); </li></ul><ul...
P3.3.4 Maximul unui sir de numere (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li...
P3.3.5 Minimul unui sir de numere <ul><li>Tema !!! </li></ul><ul><li>Problema P3.3.4 dar in loc de maxim se va calcula min...
P3.3.6 Verificarea primalitatii (1) <ul><li>Se citeste un numar  natural . Sa se verifice si sa se afiseze daca acest numa...
P3.3.6 Verificarea primalitatii (2) <ul><li>Metodologia: </li></ul><ul><ul><li>Se citeste numarul; </li></ul></ul><ul><ul>...
P3.3.6 Verificarea primalitatii (3) <ul><li>Pseudocod </li></ul><ul><li>prim=1; </li></ul><ul><li>citeste n; </li></ul><ul...
P3.3.6 Verificarea primalitatii (4) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>i...
P3.3.7 Filtru de esantionare (1) <ul><li>Exista o categorie de aplicatii de achizitie de semnal in care de la un senzor se...
P3.3.7 Filtru de esantionare (2) <ul><li>Formalizare: </li></ul><ul><ul><li>Fie S={s 1 , s 2 , ... s N_ES } setul de date ...
P3.3.7 Filtru de esantionare (3) <ul><li>Pseudocod: </li></ul><ul><li>contor=0; </li></ul><ul><li>M=-UINT_MAX; m=UINT_MAX;...
P3.3.7 Filtru de esantionare (4) <ul><li>Tema !!! </li></ul><ul><li>De implementat in C/C++ pseudocodul de mai sus; </li><...
Reprezentarea numerelor in calculator (1) <ul><li>Calculatorul foloseste notatia  binara , adica simboluri definite pe mul...
Reprezentarea numerelor in calculator (2) <ul><li>Reprezentarea numerelor in virgula fixa </li></ul><ul><ul><li>dedusa din...
Reprezentarea numerelor in calculator (3) <ul><li>Reprezentarea numerelor intregi cu semn </li></ul><ul><ul><li>Se stabile...
P3.3.8 Transformarea dec2bin (1) <ul><li>Se citeste un numar natural. Sa se afiseze acel numar in binar. Se va folosi nota...
P3.3.8 Transformarea dec2bin (2) <ul><li>Pseudocod </li></ul><ul><li>citeste n; </li></ul><ul><li>cat timp (n<>0) executa ...
P3.3.9 Transformarea dec2hex (1) <ul><li>Tema !!! </li></ul><ul><li>Se citeste un numar natural. Sa se afiseze reprezentar...
P3.3.9 Transformarea dec2hex (2) <ul><li>Pentru afisarea corecta a literelor puteti folosi ceva similar cu: </li></ul><ul>...
P3.3.10 dec2bin cu operatii pe biti <ul><li>Se citeste un numar pe 8 biti ( short int ). Sa se afiseze reprezentarea sa in...
P3.3.11 dec2hex cu operatii pe biti <ul><li>Tema !!! </li></ul><ul><li>Similar cu P3.3.10. </li></ul><ul><li>Se va folosi ...
P3.3.12 Cate numere au  k  divizori <ul><li>Se citesc de la tastatura doua numere intregi:  n  si  k . Sa se calculeze si ...
P3.3.13 Afisati divizorii unui numar <ul><li>Similar cu P3.3.12... dar mai simplu :) </li></ul><ul><li>In bucla interioara...
Upcoming SlideShare
Loading in...5
×

Curs5-PC-Cl9

1,759

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,759
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Curs5-PC-Cl9"

  1. 1. Curs 3 3.3. Structura repetitiva Alexandru IOVANOVICI
  2. 2. 3.3 Structura repetitiva <ul><li>Se foloseste pentru a implementa operatii care se repeta de mai multe ori in cadrul programului; </li></ul><ul><li>Diferitii pasi difera foarte putin unul de celalalt prin niste marimi usor de pus identificat si reprezentat; </li></ul><ul><li>Intotdeauna exista un sfarsit (! finitudine) </li></ul>
  3. 3. P.3.3.1 Suma cifrelor unui numar (1) <ul><li>Se citeste un numar intreg n . Sa se calculeze si sa se afiseze suma cifrelor sale. </li></ul><ul><li>Ex: n=1234 => S=1+2+3+4=10 </li></ul><ul><li>Pseudocod: </li></ul><ul><li>citeste n </li></ul><ul><li>cat timp (n<>0) executa { </li></ul><ul><li>u=n mod 10; </li></ul><ul><li>S=S+u; </li></ul><ul><li>} </li></ul><ul><li>afiseza S </li></ul>
  4. 4. P.3.3.1 Suma cifrelor unui numar (2) Citeste n n<>0 u=n mod 10; S=S+u n=n/10 Scrie S
  5. 5. P.3.3.1 Suma cifrelor unui numar (3) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>int main ( void ) { </li></ul><ul><li>int n, S = 0 ; </li></ul><ul><li>cout<<”N = “; </li></ul><ul><li>cin>>n; </li></ul><ul><li>while ( n != 0 ) { </li></ul><ul><li>S = S + n % 10 ; </li></ul><ul><li>n = n / 10 ; </li></ul><ul><li>} </li></ul><ul><li>cout<<”Suma cifrelor numarului “<<n<<” este “<<S; </li></ul><ul><li>return 0 ; </li></ul><ul><li>} </li></ul>
  6. 6. P 3.3.2. Produsul cifrelor unui numar <ul><li>Tema !!! </li></ul><ul><li>Similar cu P3.3.1; </li></ul><ul><li>Atentie la initializarea lui P </li></ul>
  7. 7. P3.3.3 Numere pana la citirea unui nr. (1) <ul><li>Se citeste un numar intreg n de la tastatura. Mai apoi se citesc numere intregi pana la introducerea lui n . Sa se calculeze si sa se afiseze media aritmetica a numerelor introduse (fara n ); </li></ul><ul><li>Atentie la tipul de date al mediei; </li></ul>
  8. 8. P3.3.3 Numere pana la citirea unui nr. (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>int main ( void ) { </li></ul><ul><li>int n,ct = 0 ; //in ct numar cate numere am </li></ul><ul><li>float M; </li></ul><ul><li>cout<<”Introduceti numarul cu rol de terminator : “; </li></ul><ul><li>cin>>n; </li></ul><ul><li>int nc = 0 ; //in nc voi pastra cate un numar citit pe rand </li></ul><ul><li>while ( nc != n ) { </li></ul><ul><li>cout<<”Numarul curent este : ”; </li></ul><ul><li>cin>>nc; </li></ul><ul><li>S = S + nc; </li></ul><ul><li>ct ++ ; </li></ul><ul><li>} </li></ul><ul><li>cout<<”Media celor “<<ct - 1 <<” numere este “<<S /( ct - 1 ) ; </li></ul><ul><li>return 0 ; </li></ul><ul><li>} </li></ul>
  9. 9. P3.3.4 Sirul lui Fibbonaci (1) <ul><li>Sa se afiseze primii n termeni ai sirului lui Fibbonaci; </li></ul><ul><li>SB se construieste in felul urmator: </li></ul><ul><ul><li>Primii doi termeni sunt 1 (Fb[1]=1, Fb[2]=1); </li></ul></ul><ul><ul><li>Pentru urmatorii termeni este valabila regula: fiecare termen este egal cu suma dintre precedentul si anteprecedentul; (Fb[k] = Fb[k-1] + Fb[k-2]) </li></ul></ul><ul><li>Exemplu: </li></ul><ul><li>Fb: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... </li></ul>
  10. 10. P3.3.4 Sirul lui Fibbonaci (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>int main ( void ) { </li></ul><ul><li>int tc; //termenul curent din sir </li></ul><ul><li>int ta = 1 ; //termenul anterior din sir </li></ul><ul><li>int taa = 1 ; //termenul ante-anterior din sir </li></ul><ul><li>int n; </li></ul><ul><li>cout<<”N = “; cin>>n; </li></ul><ul><li>for ( int i = 3 ;i< n ;i ++){ </li></ul><ul><li>tc = ta + taa; </li></ul><ul><li>cout<<tc<<” “; </li></ul><ul><li>taa = ta; </li></ul><ul><li>ta = tc; </li></ul><ul><li>} </li></ul><ul><li>return 0 ; </li></ul><ul><li>} </li></ul>
  11. 11. P3.3.4 Maximul unui sir de numere (1) <ul><li>Se citesc numere naturale pana la introducerea lui zero (0); </li></ul><ul><li>Sa se determine si sa se afiseze maximul dintre numerele citite; </li></ul><ul><li>Exemplu: </li></ul><ul><li>Sirul este: 2,1,3,4,2,7,8,0 </li></ul><ul><li>Maximul este: 8 </li></ul>
  12. 12. P3.3.4 Maximul unui sir de numere (2) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>#include <limits.h> </li></ul><ul><li>int main ( void ){ </li></ul><ul><li>unsigned int nc = 1 , max =- UINT_MAX; </li></ul><ul><li>while ( nc != 0 ){ </li></ul><ul><li>cout<< &quot;Introduceti un numar: &quot; ; </li></ul><ul><li>cin>>nc; </li></ul><ul><li>if ( nc>max ){ </li></ul><ul><li>max = nc; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>cout<< &quot;Maximul este: &quot; <<max<<endl; </li></ul><ul><li>return 0 ; </li></ul><ul><li>} </li></ul>
  13. 13. P3.3.5 Minimul unui sir de numere <ul><li>Tema !!! </li></ul><ul><li>Problema P3.3.4 dar in loc de maxim se va calcula minimul; </li></ul><ul><li>Consultati continutul fisierului limits.h </li></ul>
  14. 14. P3.3.6 Verificarea primalitatii (1) <ul><li>Se citeste un numar natural . Sa se verifice si sa se afiseze daca acest numar este prim sau nu. </li></ul><ul><li>Un numar este prim daca nu are drept divizori decat pe 1 si pe el insusi; </li></ul><ul><li>Exemplu: </li></ul><ul><ul><li>Numarul 7: Este prim (nu are alti divizori); </li></ul></ul><ul><ul><li>Numarul 8: Nu este prim (are divizori pe 2,4) </li></ul></ul>
  15. 15. P3.3.6 Verificarea primalitatii (2) <ul><li>Metodologia: </li></ul><ul><ul><li>Se citeste numarul; </li></ul></ul><ul><ul><li>Se presupune ca numarul este prim (prim=1); </li></ul></ul><ul><ul><li>Se parcurge cu un contor de la 2 la n/2 si se verifica daca este divizibil cu unul dintre acestea; </li></ul></ul><ul><ul><li>In caz afirmativ variabila care indica primalitatea devine falsa (prim=0); </li></ul></ul><ul><ul><li>La sfarsit se testeaza valoarea acestei variabile si se afiseaza un mesaj adecvat; </li></ul></ul>
  16. 16. P3.3.6 Verificarea primalitatii (3) <ul><li>Pseudocod </li></ul><ul><li>prim=1; </li></ul><ul><li>citeste n; </li></ul><ul><li>pentru (i=2,n/2) executa{ </li></ul><ul><li>daca (n%i==0) </li></ul><ul><li>prim=0 </li></ul><ul><li>} </li></ul><ul><li>daca (prim==1) { </li></ul><ul><li>scrie “e prim” </li></ul><ul><li>} </li></ul><ul><li>altfel { </li></ul><ul><li>scrie “nu e prim” </li></ul><ul><li>} </li></ul>
  17. 17. P3.3.6 Verificarea primalitatii (4) <ul><li>#include <conio.h> </li></ul><ul><li>#include <iostream.h> </li></ul><ul><li>int main ( void ) { </li></ul><ul><li>unsigned int n, prim = 1 ; </li></ul><ul><li>cout<<”N = “; </li></ul><ul><li>cin>>n; </li></ul><ul><li>for ( int i = 2 ;i< = n / 2 ;i ++){ </li></ul><ul><li>if ( n % i == 0 ){ </li></ul><ul><li>prim = 0 ; </li></ul><ul><li>break; //atentiune </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>if ( prim ) { </li></ul><ul><li>cout<<”Numarul “<<n<<” este prim”<<endl; </li></ul><ul><li>} </li></ul><ul><li>else { </li></ul><ul><li>cout<<”Numarul “<<n<<” nu este prim”<<endl; </li></ul><ul><li>} </li></ul><ul><li>return 0 ; </li></ul><ul><li>} </li></ul>
  18. 18. P3.3.7 Filtru de esantionare (1) <ul><li>Exista o categorie de aplicatii de achizitie de semnal in care de la un senzor se culeg valori cu o anumita rata de achizitie. Se pune problema de a determina o valoare cat mai exacta. </li></ul><ul><li>Metodologia este in felul urmator: </li></ul><ul><ul><li>Se culege un numar predefinit de esantioante (N_ES) </li></ul></ul><ul><ul><li>Se determina simultan maximul si minimul din esantion (M si m); </li></ul></ul><ul><ul><li>Se elimina din sirul de date valorile minime si maxime; </li></ul></ul><ul><ul><li>Se face media setului de date ramas; </li></ul></ul>
  19. 19. P3.3.7 Filtru de esantionare (2) <ul><li>Formalizare: </li></ul><ul><ul><li>Fie S={s 1 , s 2 , ... s N_ES } setul de date achizitionate; </li></ul></ul><ul><ul><li>Fie M=max(S) si m=min(S); </li></ul></ul><ul><ul><li>Vom defini S f ={{S}M}m; </li></ul></ul><ul><ul><li>In final vom calcula media lui S f ; Aceasta este valoare de interes. </li></ul></ul>
  20. 20. P3.3.7 Filtru de esantionare (3) <ul><li>Pseudocod: </li></ul><ul><li>contor=0; </li></ul><ul><li>M=-UINT_MAX; m=UINT_MAX; </li></ul><ul><li>cat timp (contor<=N_ES) executa { </li></ul><ul><li>citeste nc; </li></ul><ul><li>daca (nc>M) atunci M=nc; </li></ul><ul><li>daca (nc<m) atunci m=nc; </li></ul><ul><li>contor++; </li></ul><ul><li>suma+=nc; </li></ul><ul><li>} </li></ul><ul><li>suma=suma-max-min; </li></ul><ul><li>media=suma/(contor-2); </li></ul>
  21. 21. P3.3.7 Filtru de esantionare (4) <ul><li>Tema !!! </li></ul><ul><li>De implementat in C/C++ pseudocodul de mai sus; </li></ul><ul><li>Pentru a defini N_ES veti folosi o directiva #define astfel: </li></ul><ul><li>#define N_ES 10 </li></ul>Nu se pune ;
  22. 22. Reprezentarea numerelor in calculator (1) <ul><li>Calculatorul foloseste notatia binara , adica simboluri definite pe multimea B={0,1}; </li></ul><ul><li>Se folosesc doua tipuri de numere: intregi (in virgula fixa) si reale (in virgula flotanta) [en. floating point – FP]; </li></ul>
  23. 23. Reprezentarea numerelor in calculator (2) <ul><li>Reprezentarea numerelor in virgula fixa </li></ul><ul><ul><li>dedusa din forma zecimala ordinara a numerelor, in care numerele prezinta o virgula zecimala, la stanga acesteia este partea intreaga, iar la dreapta partea fractionara; </li></ul></ul><ul><ul><li>fiecare pozitie are asociata o pondere, fapt pentru care se spune ca numerele sunt scrise intr-o ,,notatie ponderata'' (notatie pozitionala); </li></ul></ul><ul><li>N =x n-1 2 n-1 +x n-2 2 n-2 + ... +x 1 2 1 +x 0 </li></ul><ul><ul><li>x n-1 se numeste bitul cel mai semnificativ (MSB), iar x 0 se numeste bitul cel mai putin semnificativ (LSB); </li></ul></ul><ul><ul><li>Astfel se pot deduce doua forme de scriere si utilizare: cu MSB-first sau LSB-first , in citirea de la stanga la dreapta . </li></ul></ul>
  24. 24. Reprezentarea numerelor in calculator (3) <ul><li>Reprezentarea numerelor intregi cu semn </li></ul><ul><ul><li>Se stabileste in mod conventional ca bitul MSB sa reprezinte semnul; </li></ul></ul><ul><ul><li>Tot prin conventie se stabileste ca MSB=0 inseamna numar pozitiv, iar MSB=1 numar negativ; </li></ul></ul><ul><ul><li>!!! de completat </li></ul></ul><ul><ul><li>Nu abordam FP (IEEE754) </li></ul></ul>
  25. 25. P3.3.8 Transformarea dec2bin (1) <ul><li>Se citeste un numar natural. Sa se afiseze acel numar in binar. Se va folosi notatia LSB (least significant bit) first. </li></ul><ul><li>Exemplu </li></ul><ul><li>n=3 10 => 110 2 </li></ul><ul><li>n=9 10 => 1001 2 </li></ul><ul><li>Pentru rezolvare de va proceda la impartirea succesiva cu 2 si retinerea restului (acesta poate fi 0 sau 1). Impartirea se va opri atunci cand n=0 </li></ul>
  26. 26. P3.3.8 Transformarea dec2bin (2) <ul><li>Pseudocod </li></ul><ul><li>citeste n; </li></ul><ul><li>cat timp (n<>0) executa { </li></ul><ul><li>cb=n mod 2; //cb-cifra binara {0,1} </li></ul><ul><li>afiseaza cb; </li></ul><ul><li>n=n/2; </li></ul><ul><li>} </li></ul>
  27. 27. P3.3.9 Transformarea dec2hex (1) <ul><li>Tema !!! </li></ul><ul><li>Se citeste un numar natural. Sa se afiseze reprezentarea sa in format hexazecimal. </li></ul><ul><li>Reprezenatrea hexa foloseste urmatorul set de simboluri H={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} </li></ul><ul><li>Se vor face impartiri la 16, cu retinerea restului (ch=n mod 16). </li></ul>
  28. 28. P3.3.9 Transformarea dec2hex (2) <ul><li>Pentru afisarea corecta a literelor puteti folosi ceva similar cu: </li></ul><ul><li>ch = n % 16 ; //obtinem restul impartirii la 16 </li></ul><ul><li>if ( ch> = 10 ) { </li></ul><ul><li>int d = ch - 10 ; //ne da distanta fata de 10 </li></ul><ul><li>char afis = 'A' + d; //la codul lui 'A' adunam // deplasamentul calculat mai sus </li></ul><ul><li>// !!! mai gasiti o solutie pt calc lui afis </li></ul><ul><li>cout<<afis; </li></ul><ul><li>} </li></ul><ul><li>else { </li></ul><ul><li>cout<<ch; //daca e <10 il afisam direct </li></ul><ul><li>} </li></ul><ul><li>ch = n / 16 ; </li></ul>
  29. 29. P3.3.10 dec2bin cu operatii pe biti <ul><li>Se citeste un numar pe 8 biti ( short int ). Sa se afiseze reprezentarea sa in binar folosind doar operatii logice pe biti, de tipul AND si shift -ari; </li></ul><ul><li>int nr; </li></ul><ul><li>cin>>nr; </li></ul><ul><li>short int mask = 1 ; // 00000001b = 0x01 </li></ul><ul><li>for ( int i = 1 ;i< = 8 ;i ++){ </li></ul><ul><li>short int u = n & mask; // SI pe biti </li></ul><ul><li>cout >>u; </li></ul><ul><li>n>> = 1 ; // echivalent n=n>>1; </li></ul><ul><li>} </li></ul>
  30. 30. P3.3.11 dec2hex cu operatii pe biti <ul><li>Tema !!! </li></ul><ul><li>Similar cu P3.3.10. </li></ul><ul><li>Se va folosi o masca care sa permita pastrarea ultimilor 4 biti (o cifra binara) ( short int mask = 15 ; ) </li></ul><ul><li>Se vor face deplasari la dreapta cu cate 4 biti ( n>> = 1 ; ) </li></ul><ul><li>Veti afisa cate o cifra hexa sub forma a 4 biti pe cate o linie; </li></ul>
  31. 31. P3.3.12 Cate numere au k divizori <ul><li>Se citesc de la tastatura doua numere intregi: n si k . Sa se calculeze si sa se afiseze cate dintre cele n numere au exact k divizori (1 este divizor pt. orice numar). </li></ul><ul><li>Pseudocod: </li></ul><ul><li>citeste n,k; </li></ul><ul><li>pentru i=(1,n){ </li></ul><ul><li>ndiv = 0; </li></ul><ul><li>pentru d=(1,i/2) { </li></ul><ul><li>daca (i/d == 0) ndiv++ </li></ul><ul><li>} </li></ul><ul><li>daca (ndiv == k){ </li></ul><ul><li>afiseaza (“numarul “ i “corespunde”) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  32. 32. P3.3.13 Afisati divizorii unui numar <ul><li>Similar cu P3.3.12... dar mai simplu :) </li></ul><ul><li>In bucla interioara in loc de a incrementa ndiv veti afisa respectivul divizor. </li></ul>

×