ARCSO - Arhitectura calculatorului si sisteme de...
Transcript of ARCSO - Arhitectura calculatorului si sisteme de...
PCLP6 - 1
Pana acum
• Tipuri simple de date
• Operatori
• Instructiuni– instructiunea vida
– instructiunea simpla
– instructiunea compusa
– instructiuni conditionale: if, switch
PCLP6 - 2
Astazi
• Instructiuni repetitive: while, do/while, for
• Instructiunea break
• Instructiunea continue
• Instructiunea goto
• Instructiunea return
PCLP6 - 3
Instructiuni repetitive - while (1)
while(expresie)instructiune;
F A
instructiune
expresie
!!!bucle infinite
PCLP6 - 4
Instructiuni repetitive - while (2)Exemplul 1: Sa se calculeze si sa se afiseze valoarea
polinomului p(x)= 3x2+7x-10 pentru x=1,2,3,…,10.
#include <stdio.h>int main(){ int x;
x=1;while(x <= 10){ printf(″x = %d\tp(x)=%d\n″, x, 3*x*x+7*x-10);
x++;}return 0;
}
PCLP6 - 5
Instructiuni repetitive - while (3)x=1 p(x)=0x=2 p(x)=16x=3 p(x)=38x=4 p(x)=66x=5 p(x)=100x=6 p(x)=140x=7 p(x)=186x=8 p(x)=238x=9 p(x)=296x=10 p(x)=360
x=1;
while(x <= 10)
{ printf(″x = %d\tp(x)=%d\n″,\
x, 3*x*x+7*x-10);
x++;
}
PCLP6 - 6
Instructiuni repetitive - while (4)#include <stdio.h>int main(){ int x=0;
while(++x <= 10)printf(″x = %d\tp(x)=%d\n″, x, 3*x*x+7*x-10);
return 0;}
sau #include <stdio.h>int main(){ int x=0;
while(x++ < 10)printf(″x = %d\tp(x)=%d\n″, x, 3*x*x+7*x-10);
return 0;}
PCLP6 - 7
Instructiuni repetitive - while (5)Exemplul 2: Sa se afiseze valorile functiei sin(x) cu pasul
de 1 grad sexagesimal xє[0,360).
#include <stdio.h>#include <math.h>#define PI 3.14159265int main(){ int x;
double pas;pas = PI/180;x = 0;while(x < 360){ printf(″sin(%d)=%.16lf\n″, x, sin(x*pas) );
x++;}return 0;
}
PCLP6 - 8
Instructiuni repetitive - while (6)• Directiva #define
#define nume succesiune_de_caractere
- substitutii de succesiuni de caractere
- la procesare se substituie numele cu sirul de caractere
- succesiunea de caractere poate continua pe mai multe
randuri (\)
- utilizata frecvent pentru definirea constantelor
#undef nume
- dezactiveaza substitutia
PCLP6 - 9
Instructiuni repetitive - while (7)varianta 2:
#include <stdio.h>#include <math.h>#define PI 3.14159265
int main(){ int x;
double pas;pas = PI/180;x = -1;while(++x < 360)
printf(″sin(%d)=%.16lf\n″, x, sin(x*pas) );return 0;
}
PCLP6 - 10
Instructiuni repetitive - while (8)Sa se afiseze doar 30 de linii o data pe ecran.
#include <stdio.h>#include <math.h>#include <conio.h>#define PI 3.14159265int main(){ int x;
double pas;pas = PI/180;x = 0;while(x < 360){ printf(″sin(%d)=%.16lf\n″, x, sin(x*pas) );
if(++x%30 == 0){ printf(″Pentru a continua apasati o tasta.″);
getch();} /* sfarsit if */
} /* sfarsit while */return 0;
} /* sfarsit main */
PCLP6 - 11
Instructiuni repetitive - while (9)varianta 2:
#include <stdio.h>#include <math.h>#include <conio.h>#define PI 3.14159265void main(){ int x;
double pas;pas = PI/180;x = -1;while(++x < 360){ printf(″sin(%d)=%.16lf\n″, x, sin(x*pas) );
if(x%30 == 0){ printf(″Pentru a continua apasati o tasta.″);
getch();} /* sfarsit if */
} /* sfarsit while */} /* sfarsit main */
PCLP6 - 12
Instructiuni repetitive - while (10)
#include <stdio.h>
int main(){ int numar, suma;
numar = 11;suma = 0;while(numar != 15)
suma += numar;printf(″media aritmetica este %.2lf\n″, suma/5.0 );return 0;
}
Exemplul 3: Sa se calculeze media aritmetica anumerelor de la 11 la 15.
!!!! Bucla infinita
PCLP6 - 13
numar
10
11
12
13
14
15
16
Instructiuni repetitive - while (11)
#include <stdio.h>
int main(){ int numar, suma;
numar = 10;suma = 0;while(numar++ != 15)
suma += numar;printf(″media aritmetica este %.2lf\n″, suma/5.0 );return 0;
}
Modificarea buclei infinite. suma
0
11
23
36
50
65
PCLP6 - 14
Instructiuni repetitive - do/while (1)
doinstructiune;
while(expresie);
≡
instructiune;while(expresie)
instructiune; F T
instructiune
expresie
instructiune
F Texpresie
instructiune
PCLP6 - 15
Instructiuni repetitive - do/while (2)
Exemplul 1: Sa se calculeze radacina patrata a unui
numar pozitiv subunitar cu o eroare mai mica de 10-10
folosind metoda iterativa a lui Newton.
Fie sirul
x0, x1, x2,…, xn
unde:
x0 = 1 si xn+1 = 0,5(xn + a/xn)
Sirul este convergent si
|xn+1 – xn| < 10-10axnn
lim
PCLP6 - 16
Instructiuni repetitive - do/while (3)#include <stdio.h>#include <stdlib.h>#define ER 1e-10int main(){ double nr, x1, x2, y;
printf(″Introduceti valoarea numarului: ″);scanf(″%lf″, &nr);if(nr<=0 || nr>=1){ printf(″Numarul nu este in intervalul (0,1).″);
exit(1);}x2=1;do{ x1 = x2;
x2 = 0.5 * (x1 + nr/x1);}while(((y = x1-x2) < 0 ? –y : y) >= ER);printf(″nr = %lf\tsqrt(nr)=%.11lf\n″, nr, x2 );return 0;
}
PCLP6 - 17
Instructiuni repetitive - do/while (4)
• Functia exit()
void exit(int cod);
- definita in bibliotecile stdlib.h si process.h
- inchide toate fisierele deschise si se intrerupe
executia programului
- parametrul cod:
• 0 – terminare normala
• 1 – terminare anormala (prezenta unei erori)
PCLP6 - 18
Instructiuni repetitive - for (1)
for(expresie1;expresie2;expresie3)
instructiune;
F T
instructiune
expresie2
expresie1
expresie3
for(;;)
instructiune;
expresie1;
while(expresie2)
{ instructiune;
expresie3;}
PCLP6 - 19
Instructiuni repetitive - for (2)
#include <stdio.h>
int main()
{ int i, suma;
suma = 0;
for(i=1; i<=10; i++)
suma += i*i;
printf(″suma patratelor = %d\n″, suma );
return 0;
}
Exemplul 1: Sa se calculeze suma patratelornumerelor de la 1 la 10.
PCLP6 - 20
Instructiuni repetitive - for (3)
#include <stdio.h>
int main()
{ int i, suma;
for(i=1, suma=0; i<=10; i++)
suma += i*i;
printf(″suma patratelor = %d\n″, suma );
return 0;
}
Alta varianta:
PCLP6 - 21
Instructiuni repetitive - for (4)
#include <stdio.h>#include <stdlib.h>int main(){ int n, i;
double a, p;printf(″Baza a=: ″); scanf(″%lf″, &a);printf(″Exponent n=: ″); scanf(″%d″, &n);if(n <= 0){ printf(″Exponent negativ.\n″);
exit(1);}for(i= 1, p =1.0; i<=n; i++)
p *= a;printf(″a = %lf\tn=%d\ta**n=%lf\n″, a, n, p );return 0;
}
Exemplul 2: Sa se calculeze an unde a si n se citesc de laconsola, nєN* si aєQ.
PCLP6 - 22
Instructiuni repetitive - for (5)a) Utilizarea functiei pow:
double pow(double x, double y);
p = pow(a, (double)n);
b) a2, a4, a8, a16, a32,… sunt usor de calculat
Orice exponent il pot scrie in binar, de ex. n=43
n = 00101011 = 20 + 21 + 23 + 25 = 1 + 2 + 8 + 32 = 43
deci:
a43 = a1 * a2 * a8 * a32 , obs. ca a4, a16, a64, a128 lipsesc.
Deplasarea la dreapta a lui n => pe ultima pozitie se afla
bitul corespunzator inmultirii respective
PCLP6 - 23
Instructiuni repetitive - for (6)#include <stdio.h>#include <stdlib.h>int main(){ int n, i;
double a, p, f;printf(″Baza a=: ″); scanf(″%lf″, &a);printf(″Exponent n=: ″); scanf(″%d″, &n);if(n <= 0){ printf(″Exponent negativ.\n″);
exit(1);}i= n;for(p =1.0, f =a; n; n>>1){ if(n&1)
p *= f;f *=f; //genereaza termenul urmator din sir
}printf(″a = %lf\tn=%d\ta**n=%lf\n″, a, i, p );return 0;
}
PCLP6 - 24
Instructiunea - breakbreak;
#include <stdio.h>int main(){ int nr=1;
while(nr < 11){ if(nr==4)
break;printf(″in bucla, nr.=%d\n″, nr );++ nr;
}printf(″Bucla s-a terminat, nr.=%d\n″, nr);return 0;
}
T
++nr;
F T
Afiseaza nr
nr<11
nr==4 F
PCLP6 - 25
Instructiunea - continuecontinue;
int main(){ int nr;
for(nr=1; nr < 6; ++nr){ if(nr==3)
continue;printf(″in bucla, nr.=%d\n″, nr );
}printf(″Bucla s-a terminat, nr.=%d\n″, nr);return 0;
}
T
++nr;
F T
Afiseaza nr
nr<6
nr==3 F
PCLP6 - 26
Instructiunea - goto
goto eticheta;
unde
eticheta: instructiune;
….do{
…if(i==0)
goto divzero;else
x=y/i;….}while(…);... divzero: printf(″Impartire la 0\n″);…
PCLP6 - 27
Instructiunea - returnreturn;
saureturn expresie;
- revenirea dintr-o functie
double power(double baza, int putere){ double p;
int i;for(i= 0, p =1.0; i<putere; i++)
p *= baza;return p;
}