CURS 6 Instructiunile limbajului C Instructiuni pri de
CURS 6 Instructiunile limbajului C Instructiuni - părţi de program care prin compilare produc coduri executabile - specifică ordinea şi modul în care vor fi efectuate calculele impuse de modul de prelucrare a datelor de intrare ale programului. structura secvenţială instrucţiuni compuse structura alternativă instrucţiunea if sau instrucţiunea if-else structura repetitivă instrucţiunile for, while sau do-while
structura selectivă instrucţiunea switch instrucţiunile: expresie, return, break, continue şi goto
Instrucţiunea expresie ; - se obţine adăugând terminatorul de instrucţiune după o expresie - poate fi concret o instrucţiune de atribuire sau o instrucţiune de apel de funcţie. Exemple pi=3. 1415; getch(); clrscr(); h_max=v 0*v 0/2/g; y=sqrt(fabs(x-a)); i++; --contor; N=N 0*exp(-lambda*t[i]); //instrucţiune de atribuire //apel de funcţie //atribuire //apel de funcţie şi atribuire //atribuire Instrucţiunea compusă - folosită la codificarea structurilor secvenţiale - constă dintr-o succesiune de instrucţiuni cuprinse între acolade Exemple { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } { k++; printf("n%d: t%d", k*k); }
Instrucţiunile if şi if-else Instrucţiunea if - folosită pentru implementarea structurilor alternative cu decizie simplă Executie - se evaluează expresie - dacă expresie este adevărată (are valoare diferită de zero) se execută instrucţiune, iar dacă expresie este falsă nu se execută instrucţiune şi se trece la instrucţiunea imediat următoare lui if. Sintaxa if(expresie) instrucţiune; Instrucţiunea if-else - folosita pentru implementarea structurilor alternative cu decizie dublă Sintaxa if(expresie) instrucţiune_1; else instrucţiune_2; Executie - se evaluează expresie dacă expresie este adevărată se execută instrucţiune_1 după care se trece la instrucţiunea imediat următoare lui if-else. Dacă expresie este falsă se execută instrucţiune_2 după care se trece la execuţia instrucţiunii care urmează după if-else.
Exemple Tips Pentru simplificarea expresiilor: if(a!=0) {. . . } si: if(a==0) {. . . } if(a) {. . . } if(!a) {. . . } //rezolvarea ecuaţiei de gradul 1: ax+b=0. . . if(a) //în loc de if(a!=0) x=-b/a; . . . // Calculul solutiei unei ecuaţii neliniare //folosind metoda lui Newton. . . if(df==0) //sau if(!df) df=eps; x=x-f(x)/df; . . . //ordonarea crescătoare a unui şir de numere //(metoda bulelor). . . if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i]=t; ordonat=0; }
Rezolvarea ecuaţiilor prin metoda înjumătăţirii intervalului. . . if(f(a)*f(c)<=0) if(f(c)==0) else face pereche cu cel mai apropiat if sol=c; else b=c; else a=c; . . . Discutati secventa: . . . if(n>0) { if(i<n) s[i]=2*a[i]; } else printf("n n este negativ!"); . . . Exerciţiu: Scrieţi un program care să calculeze impedanţa unui circuit de curent alternativ. Se vor citi valorile R, L şi C, precum şi tipul circuitului (serie sau paralel). În funcţie de valorile datelor de intrare se va calcula Z.
Instrucţiunea for - utilizată pentru implementarea unei structuri repetitive condiţionată anterior, atunci când se ştie apriori de câte ori se repetă blocul de calcul al acesteia Sintaxa for(exp 1; exp 2; exp 3) instrucţiune; Antet Corp de instructiuni - se execută repetat cât timp este îndeplinită condiţia definită de exp 2 exp 1 - secvenţa de iniţializare a instrucţiunii for exp 2 - defineşte condiţia de continuare a ciclului ! Dacă exp 2 are valoarea zero (este falsă) de la început, corpul instrucţiune nu se execută niciodată. exp 3 - secvenţa de reiniţializare a instrucţiunii for
for(exp 1; exp 2; exp 3) instrucţiune; Execuţie: 1. se execută secvenţa de iniţializare definită de către exp 1. 2. se evaluează exp 2. Dacă exp 2≠ 0 (adevărată) se execută corpul de instrucţiuni al instrucţiunii for. Dacă exp 2=0 (falsă) se termină execuţia instrucţiunii for şi se trece la execuţia instrucţiunii imediat următoare lui for. 3. după execuţia corpului de instrucţiuni al instrucţiunii for se execută secvenţa de reiniţializare definită de exp 3 şi se reia execuţia de la pasul 2. ! exp 1, exp 2 şi exp 3 pot fi vide caracterele ; trebuie să fie prezente şi în acest caz.
Exemple //Tiparirea tuturor literelor mari char c; for(c='A'; c<='Z'; c++) putchar(c); //Tiparirea valorilor de la 0 la 100 din 2 int i; for(i=0; i<=100; i+=2) printf("%d ", i); //Adunarea elementelor unui sir de numere int n=4, j; float s, sir[4]={3. 5, -2, 8, 14. 1}; for(s=0, j=0; j<n; j++) s=s+sir[j]; //Calculul lui n! for(f=1, i=2; i<=n; i++) f*=i; //Calculul lui x^n for(p=1, i=1; i<=fabs(n); i++) p=p*x; if(n<0) p=1/p; //Citirea elementelor unei matrici for(i=0; i<nl; i++) for(j=0; j<nc; j++) { printf("A[%d, %d]= ", i, j); scanf("%f", &A[i][j]); }
//Produsul a doua matrici #define m 2 #define n 3 #define p 3. . . for(i=0; i<m; i++) for(j=0; j<p; j++) { C[i][j]=0; for(k=0; k<n; k++) C[i][j]=C[i][j]+A[i][k]*B[k][j]; } for(i=0; i<m; i++) for(j=0; j<p; j++) printf("n. C[%d, %d]= %g", i, j, C[i][j]); . . .
Instrucţiunea while -folosita pentru implementarea structurilor repetitive condiţionate anterior. Sintaxa while(expresie ) instrucţiune; Antet Corp de instructiuni - se execută repetat cât timp expresie are valoare logica de adevar (diferita de zero) Execuţie: 1. Se evaluează expresie. Dacă expresie este adevărată (are valoare nenulă) se execută corpul instrucţiunii while şi se revine la evaluarea expresiei. 2. Când expresie devine falsă se trece la instrucţiunea imediat următoare instrucţiunii while. ! Dacă expresie este falsă de la început, corpul de instrucţiuni al lui while nu se execută niciodată. Pentru a se evita ciclarea infinită a corpului de instrucţiuni al lui while, acesta trebuie să conţină în mod obligatoriu instrucţiuni prin care să se modifice termenii expresiei lui while.
Exemple Tiparirea valorilor de la 0 la 100, din 2 int i=0; Sau echivalent: while(i<=100) { printf("%d i+=2; } int i=0; ", i); while((i+=2)<=100) printf("%d ", i); //Afisarea valorilor functiei sinus din grad de la 0 la 360 o, oprirea dupa afisarea a 24 linii pe ecran, cu evitarea opririi dupa afisarea valorii sin(0) int x; double pi=4*atan(1. 0); x=-1; while(++x<=360) { printf("nsin(%d)= %. 15 f", x, sin(x*pi/180)); if(x%24==0&&x) //stop din afisare dupa 24 de linii si evitarea while(!_kbhit()); // opririi dupa afisarea valorii sin(0) }
//Citirea dintr-un fisier, a cate 4 valori simultan, pana se ajunge la sfarsitul fisierului FILE *fin; float m, x, y, z; int n=0; fin=fopen("d: \user\c\test. dat", "r"); while(!feof(fin)) if(fscanf(fin, "%f%f", &m, &x, &y, &z)==4) { n++; printf("n%gt%gt%g", m, x, y, z); } fclose(fin); printf("nn= %d", n);
Instrucţiunea do-while - utilizată pentru implementarea structurilor repetitive condiţionate posterior. Sintaxa do instrucţiune; while(expresie ) Execuţie: 1. Se execută instructiune. 2. Se evaluează expresie. Dacă expresie este adevărată ( ≠ 0 ) se revine la pasul 1, altfel se trece la instrucţiunea imediat următoare lui do-while. ! Corpul de instrucţiuni al lui do-while se execută cel puţin o dată, chiar dacă expresie este falsă de la început. Pentru a se evita ciclarea infinită a corpului de instrucţiuni al lui do-while, acesta trebuie să conţină în mod obligatoriu instrucţiuni prin care să se modifice termenii expresiei.
Exemple //Metoda bisectiei. . . do { c=(inf+sup)/2. 0; if((*pf)(c)==0) return c; if((*pf)(inf)*(*pf)(c)<0) sup=c; else inf=c; } while(fabs((*pf)(c)) >= eps);
//Metoda Newton . . . float newton(float (*)(float), float xv, float er) { float xn, der, eps=5 e-4; //xnou=xvechi-f(xvechi)/f'(xvechi) xn=xv; do { xv=xn; der=(f(xv+eps)-f(xv))/eps; if(der= =0. 0) der=eps; xn=xv-f(xv)/der; } while(fabs(f(xn))>er); return xn; }. . .
Instrucţiunea switch - folosită pentru codificarea structurii selective (o generalizare a structurii alternative) - echivalentă cu mai multe instrucţiuni if imbricate - are avantajul că duce la creşterea lizibilităţii şi calităţii programului Sintaxa http: //www. tutorialspoint. com/cplus/cpp_switch_statement. htm Optionala! switch (expresie) { case c 1: instrucţiune_1; break; case c 2: instrucţiune_2; break; . . . case cn: instrucţiune_n; break; default: instrucţiune; break; } c 1, c 2, . . . , cn - etichete case - reprezintă valori constante instrucţiune_1, instrucţiune_2, . . . , instrucţiune_n şi instrucţiune - instrucţiuni simple sau compuse. break; - instrucţiune care ca scop întreruperea instrucţiunii switch sau întreruperea unui ciclu. - la întâlnirea acesteia se iese imediat din switch şi execuţia programului continuă cu instrucţiunea imediat
Execuţie: 1. se evaluează expresie; fie v valoarea acesteia. 2. se compară v cu valorile constantelor c 1, c 2, . . . , cn. Dacă v este egală cu una dintre aceste constante, de exemplu ci, atunci se execută instrucţiune_i şi apoi se trece la instrucţiunea de după switch. 3. Dacă v nu coincide cu nici una dintre constantele ci se execută instrucţiunea de după default (dacă aceasta există) după care se continuă la instrucţiunea de după switch. Instrucţiunea switch este echivalentă cu o succesiune de mai multe instrucţiuni if imbricate: if(expresie==c 1) instrucţiune_1 else if(expresie==c 2) instrucţiune_2 else if. . . else if(expresie==cn) instrucţiune_n else instrucţiune switch (expresie) { case c 1: instrucţiune_1; break; case c 2: instrucţiune_2; break; . . . case cn: instrucţiune_n; break; default: instrucţiune; break; }
Simularea unui calculator de operaţii simple #include<stdio. h> #include<stdlib. h> #include<conio. h> int main() { char oper; float op 1, op 2, rez; printf("Tastati o expresie de forma: operand 1 if(scanf("%f%c%f", &op 1, &oper, &op 2)!=3) { printf("n. Expresie eronata!"); exit(1); } switch(oper) { case '+': rez=op 1+op 2; break; case '-': rez=op 1 -op 2; break; case '*': rez=op 1*op 2; break; operatie operand 2: n");
case '/': if(op 2==0) { printf("Eroare! Divizor nul. "); rez=0; } else rez=op 1/op 2; break; default: printf("Operator ilegal!"); rez=0; } printf("n%g %c %g = %g", op 1, oper, op 2, rez); while(!_kbhit()); return 0; }
Tema: Folosiţi instrucţiunea switch pentru a modela următorul experiment: generaţi 100 de valori aleatoare între 1 şi 5. Tipăriţi un grafic de forma alăturată, în funcţie de apariţiile fiecărei valori generate. Termen: 18. 11. 2015, ora 10. 00 //Functie gotoxy #include <stdio. h> #include <windows. h> using namespace std; HANDLE console = Get. Std. Handle(STD_OUTPUT_HANDLE); COORD Cursor. Position; void gotoxy(int x, int y) { Cursor. Position. X = x; // Locates column Cursor. Position. Y = y; // Locates Row Set. Console. Cursor. Position(console, Cursor. Position); // Sets position for next thing to be printed } int main() { int i, j; char si='x'; for(i=0; i<80; i++) for(j=0; j<=24; j++) { gotoxy(i, j); printf("%c", si); } getchar(); return 0; }
Instrucţiunile break şi continue break - întrerupe execuţia unui ciclu (for, while sau do-while) sau a unei instrucţiuni switch - se foloseşte pentru ieşirea imediată, fără testarea unei anumite condiţii, dintr-un ciclu şi renunţarea la execuţia în continuare a acestuia continue - abandonează iteraţia curentă a ciclului şi reia ciclul cu iteraţia următoare - se foloseşte numai în interiorul instrucţiunilor for, while sau dowhile Sintaxa break; Sintaxa continue;
Exemple Folosirea instrucţiunilor break şi continue #include <stdio. h> #include <conio. h> int main() { int k; for( k=0; k<6; k++) { if(k==3) break; // se abandoneaza instructiunea for printf("In ciclul for cu *break*, k are acum valoarea %dn", k); } for(k=0; k<6; k++) { if(k==3) continue; // se abandoneaza iteratia corespunzatoare lui k=3 printf("In ciclul for cu *continue*, k are acum valoarea %dn", k); } while(!_kbhit()); return 0; }
Funcţia exit - folosită pentru evitarea nivelelor mari de imbricare ale instrucţiunilor if sau if-else. - prototipul funcţiei este: void exit (int stare) - se găseşte în <stdlib. h> şi în <process. h> -are rolul de a întrerupe execuţia programului şi închiderea tuturor fişierelor deschise. Stare defineşte starea programului în momentul apelului: § valoarea 0 (zero) pentru stare corespunde unei întreruperi normale, fără eroare a programului § o valoarea diferită de zero defineşte o întrerupere cu eroare a programului.
Exemple Se citeşte o valoare, se testează dacă ea aparţine intervalului [1, 10] şi se calculează pătratul acestei valori #include <stdio. h> #include <stdlib. h> #include <conio. h> int main() { int v; printf("Introduceti o valoare in intervalul [1, 10]: "); if(scanf("%d", &v)!=1) { printf("Valoare incorecta"); while(!_kbhit()); exit(1); } if((v<1)||(v>10)) puts("Eroare! v este in afara intervalului"); else printf("%d^2= %d", v, v*v); while(!_kbhit()); return 0; }
Instrucţiunea goto - transfera controlul execuţiei programului la o instrucţiune etichetată - poate fi utilă doar atunci când se doreşte ieşirea din mai multe instrucţiuni if imbricate Sintaxa goto eticheta; etichetă - şir de caractere urmat de caracterul : şi care precede o anumită instrucţiune
Exemple Găsirea unui element comun a două şiruri #include <stdio. h> #include <stdlib. h> #include <conio. h> int main() { int n, i, j, a[10], b[3]={0, 5, 10}; //Cauta in sirul a un element al sirului b. //Daca un astfel de element este gasit, cautarea inceteaza printf("Dimensiunea primului sir: "); scanf("%d", &n); printf("Introduceti elementele primului sirn"); for(i=0; i<n; i++) scanf("%d", &a[i]); for(i=0; i<3; i++) for(j=0; j<n; j++) if(b[i]==a[j]) goto gasit; printf("n. Nu s-a gasit nici un element comun al celor doua siruri"); while(!_kbhit()); exit(0); gasit: printf("n. S-a gasit elementul comun: %d", b[i]); while(!_kbhit()); return 0; }
- Slides: 27