curs 6 - babeș-bolyai university
TRANSCRIPT
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
instrucţiunile: expresie, return, break, continue şi goto
structura selectivă instrucţiunea switch
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);
}
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.
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;
...
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.
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
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;
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
#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
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ă.
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)
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
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.
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
...
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
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
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:
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!"); } }
#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
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;
}
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.
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
#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
- 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
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
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
#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