curs 6 - babeș-bolyai university

28
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

Upload: others

Post on 04-Nov-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CURS 6 - Babeș-Bolyai University

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

Page 2: CURS 6 - Babeș-Bolyai University

instrucţiunile: expresie, return, break, continue şi goto

structura selectivă instrucţiunea switch

Page 3: CURS 6 - Babeș-Bolyai University

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; //instrucţiune de atribuire getch(); //apel de funcţie clrscr(); //apel de funcţie h_max=v0*v0/2/g; //atribuire y=sqrt(fabs(x-a)); //apel de funcţie şi atribuire i++; //atribuire --contor; //atribuire N=N0*exp(-lambda*t[i]); //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);

}

Page 4: CURS 6 - Babeș-Bolyai University

Instrucţiunile if şi if-else

Instrucţiunea if - folosită pentru implementarea structurilor alternative cu decizie simplă

if(expresie)

instrucţiune;

Sintaxa

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ă (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.

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.

Page 5: CURS 6 - Babeș-Bolyai University

Tips Pentru simplificarea expresiilor:

if(a!=0) {...} if(a) {...}

si:

if(a==0) {...} if(!a) {...}

Exemple //rezolvarea ecuaţiei de gradul 1: ax+b=0

...

if(a) //în loc de if(a!=0)

x=-b/a;

...

//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;

}

// Calculul solutiei unei ecuaţii neliniare

//folosind metoda lui Newton

...

if(df==0) //sau if(!df)

df=eps;

x=x-f(x)/df;

...

Page 6: CURS 6 - Babeș-Bolyai University

Rezolvarea ecuaţiilor prin metoda înjumătăţirii intervalului ... if(f(a)*f(c)<=0)

if(f(c)==0)

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!");

...

else face pereche cu cel mai apropiat if

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.

Page 7: CURS 6 - Babeș-Bolyai University

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

exp1 - secvenţa de iniţializare a instrucţiunii for exp2 - defineşte condiţia de continuare a ciclului

! Dacă exp2 are valoarea zero (este falsă) de la

început, corpul instrucţiune nu se execută niciodată. exp3 - secvenţa de reiniţializare a instrucţiunii for

Antet

Corp de instructiuni - se execută repetat cât timp este îndeplinită condiţia definită de exp2

for(exp1;exp2;exp3)

instrucţiune;

Sintaxa

Page 8: CURS 6 - Babeș-Bolyai University

Execuţie: 1. se execută secvenţa de iniţializare definită de către exp1. 2. se evaluează exp2. Dacă exp2≠0 (adevărată) se execută corpul de instrucţiuni al instrucţiunii for. Dacă exp2=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 exp3 şi se reia execuţia de la pasul 2.

! exp1, exp2 şi exp3 pot fi vide

caracterele ; trebuie să fie prezente şi în acest caz.

for(exp1;exp2;exp3)

instrucţiune;

Page 9: CURS 6 - Babeș-Bolyai University

Exemple

//Tiparirea tuturor literelor mari char c; for(c='A';c<='Z';c++)

putchar(c);

int i;

for(i=0;i<=100;i+=2)

printf("%d ",i);

//Tiparirea valorilor de la 0 la 100 din 2 in 2

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];

//Adunarea elementelor unui sir de numere

for(f=1,i=2;i<=n;i++)

f*=i;

//Calculul lui n!

for(p=1,i=1;i<=fabs(n);i++)

p=p*x;

if(n<0)

p=1/p;

//Calculul lui x^n

for(i=0;i<nl;i++)

for(j=0;j<nc;j++)

{

printf("A[%d,%d]= ",i,j);

scanf("%f",&A[i][j]);

}

//Citirea elementelor unei matrici

Page 10: CURS 6 - Babeș-Bolyai University

#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("\nC[%d,%d]= %g",i,j,C[i][j]);

...

//Produsul a doua matrici

Page 11: CURS 6 - Babeș-Bolyai University

Instrucţiunea while

-folosita pentru implementarea structurilor repetitive condiţionate anterior.

while(expresie )

instrucţiune;

Sintaxa

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.

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.

! Dacă expresie este falsă de la început, corpul de instrucţiuni al lui while nu se execută niciodată.

Page 12: CURS 6 - Babeș-Bolyai University

Exemple

Sau echivalent:

int i=0;

while((i+=2)<=100)

printf("%d ",i);

int i=0;

while(i<=100)

{

printf("%d ",i);

i+=2;

}

Tiparirea valorilor de la 0 la 100, din 2 in 2

int x;

double pi=4*atan(1.0);

x=-1;

while(++x<=360)

{

printf("\nsin(%d)= %.15f",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)

}

//Afisarea valorilor functiei sinus din grad in grad de la 0 la 360o, oprirea dupa afisarea a 24 linii pe ecran, cu evitarea opririi dupa afisarea valorii sin(0)

Page 13: CURS 6 - Babeș-Bolyai University

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%f%f",&m,&x,&y,&z)==4)

{

n++;

printf("\n%g\t%g\t%g\t%g",m,x,y,z);

}

fclose(fin);

printf("\nn= %d",n);

//Citirea dintr-un fisier, a cate 4 valori simultan, pana se ajunge la sfarsitul fisierului

Page 14: CURS 6 - Babeș-Bolyai University

Instrucţiunea do-while - utilizată pentru implementarea structurilor repetitive condiţionate posterior.

do

instrucţiune;

while(expresie )

Sintaxa

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.

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 .

! Corpul de instrucţiuni al lui do-while se execută cel puţin o dată, chiar dacă expresie este falsă de la

început.

Page 15: CURS 6 - Babeș-Bolyai University

Exemple

...

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 bisectiei

Page 16: CURS 6 - Babeș-Bolyai University

...

float newton(float (*)(float), float xv, float er)

{

float xn,der,eps=5e-4;

//xnou=x

vechi-f(x

vechi)/f'(x

vechi)

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;

}

...

//Metoda Newton

Page 17: CURS 6 - Babeș-Bolyai University

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

switch (expresie) { case c1: instrucţiune_1; break; case c2: instrucţiune_2; break; ... case cn: instrucţiune_n; break; default: instrucţiune; break; }

Sintaxa

http://www.tutorialspoint.com/cplusplus/cpp_switch_statement.htm

c1, c2, ..., cn - etichete case

- reprezintă valori constante

instrucţiune_1, instrucţiune_2, ... , instrucţiune_n şi instrucţiune - instrucţiuni simple sau compuse.

Optionala!

break; - instrucţiune care are 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

Page 18: CURS 6 - Babeș-Bolyai University

Execuţie: 1.se evaluează expresie; fie v valoarea acesteia.

2.se compară v cu valorile constantelor c1, c2, ..., 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.

switch (expresie) { case c1: instrucţiune_1; break; case c2: instrucţiune_2; break; ... case cn: instrucţiune_n; break; default: instrucţiune; break; }

if(expresie==c1) instrucţiune_1 else if(expresie==c2) instrucţiune_2 else if ... ... else if(expresie==cn) instrucţiune_n else instrucţiune

Instrucţiunea switch este echivalentă cu o succesiune de mai multe instrucţiuni if imbricate:

Page 19: CURS 6 - Babeș-Bolyai University

Exemple Meniu pentru alegerea rezolvării unui sistem de ecuaţii, calculul unui determinant sau determinarea inversei unei matrici

#include<stdio.h> int main() { char optiune; printf("\t\tMeniu:\nS)istem\t\tD)eterminant\tI)nversa\n"); optiune=getchar(); switch(optiune) { case 'S': printf("Ati ales rezolvarea unui sistem de ecuatii"); break; case 'D': printf("Ati ales calculul unui determinant"); break; case 'I': printf("Ati ales determinarea inversei unei matrici"); break; default: printf("Optiune ilegala!"); } }

Page 20: CURS 6 - Babeș-Bolyai University

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

int main()

{

char oper;

float op1, op2, rez;

printf("Tastati o expresie de forma: operand1 operatie operand2: \n");

if(scanf("%f%c%f",&op1,&oper,&op2)!=3)

{

printf("\nExpresie eronata!");

exit(1);

}

switch(oper)

{

case '+':

rez=op1+op2;

break;

case '-':

rez=op1-op2;

break;

case '*':

rez=op1*op2;

break;

Simularea unui calculator de operaţii simple

Page 21: CURS 6 - Babeș-Bolyai University

case '/':

if(op2==0)

{

printf("Eroare! Divizor nul.");

rez=0;

}

else

rez=op1/op2;

break;

default:

printf("Operator ilegal!");

rez=0;

}

printf("\n%g %c %g = %g",op1,oper,op2,rez);

while(!_kbhit());

return 0;

}

Page 22: CURS 6 - Babeș-Bolyai University

Exerciţiu: 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.

Page 23: CURS 6 - Babeș-Bolyai University

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 do-while

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

break;

Sintaxa

continue;

Sintaxa

Page 24: CURS 6 - Babeș-Bolyai University

#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 %d\n",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 %d\n",k); }

while(!_kbhit());

return 0; }

Folosirea instrucţiunilor break şi continue

Exemple

Page 25: CURS 6 - Babeș-Bolyai University

- 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.

Funcţia exit

Page 26: CURS 6 - Babeș-Bolyai University

Exemple

#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;

}

Se citeşte o valoare, se testează dacă ea aparţine intervalului [1,10] şi se calculează pătratul acestei valori

Page 27: CURS 6 - Babeș-Bolyai University

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

goto eticheta;

Sintaxa

etichetă - şir de caractere urmat de caracterul : şi care precede o anumită instrucţiune

Page 28: CURS 6 - Babeș-Bolyai University

#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 sir\n");

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("\nNu s-a gasit nici un element comun al celor doua siruri");

while(!_kbhit());

exit(0);

gasit:

printf("\nS-a gasit elementul comun: %d",b[i]);

while(!_kbhit());

return 0;

}

Găsirea unui element comun a două şiruri Exemple