27
PCLP6 - 1 Pana acum Tipuri simple de date Operatori Instructiuni instructiunea vida instructiunea simpla instructiunea compusa instructiuni conditionale: if, switch

ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

PCLP6 - 1

Pana acum

• Tipuri simple de date

• Operatori

• Instructiuni– instructiunea vida

– instructiunea simpla

– instructiunea compusa

– instructiuni conditionale: if, switch

Page 2: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

PCLP6 - 2

Astazi

• Instructiuni repetitive: while, do/while, for

• Instructiunea break

• Instructiunea continue

• Instructiunea goto

• Instructiunea return

Page 3: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

PCLP6 - 3

Instructiuni repetitive - while (1)

while(expresie)instructiune;

F A

instructiune

expresie

!!!bucle infinite

Page 4: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}

Page 5: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

}

Page 6: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 7: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}

Page 8: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 9: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}

Page 10: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 11: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 12: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 13: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 14: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

PCLP6 - 14

Instructiuni repetitive - do/while (1)

doinstructiune;

while(expresie);

instructiune;while(expresie)

instructiune; F T

instructiune

expresie

instructiune

F Texpresie

instructiune

Page 15: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 16: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}

Page 17: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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)

Page 18: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

PCLP6 - 18

Instructiuni repetitive - for (1)

for(expresie1;expresie2;expresie3)

instructiune;

F T

instructiune

expresie2

expresie1

expresie3

for(;;)

instructiune;

expresie1;

while(expresie2)

{ instructiune;

expresie3;}

Page 19: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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.

Page 20: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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:

Page 21: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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.

Page 22: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 23: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}

Page 24: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 25: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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

Page 26: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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″);…

Page 27: ARCSO - Arhitectura calculatorului si sisteme de operareusers.utcluj.ro/~simona/pclp/pclp6.pdf#define nume succesiune_de_caractere -substitutii de succesiuni de caractere - la procesare

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;

}