Sunteți pe pagina 1din 5

/* Calculul c.m.m.d.c. si a c.m.m.m.c a doua numere naturale a si b */ #include <conio.h> #include <stdio.

h> main() { nt a,b,a1,b1,cmmdc,cmmmc,rest; printf("Introduceti a="); scanf("%d",&a); printf("Introduceti b="); scanf("%d",&b); /* Aflarea c.m.m.d.c. */ a1=a;b1=b; do { rest=a1%b1; a1=b1; b1=rest; } while (rest!=0); cmmdc=a1; cmmmc=a*b/cmmdc; clrscr(); printf("a=%d b=%d cmmdc(a,b)=%d cmmmc=%d",a,b,cmmdc,cmmmc); getch(); }

#include<iostream.h> #include<conio.h> cmmdc(int n1, int n2){ int i = n1, cmmdc; if(n1 > n2)i=n2; while(i>=1){ if (n1 % i == 0 && n2 % i == 0){ cmmdc = i; goto end;} i=i-1;} end: return cmmdc; } main(){ int n, v_cmmdc, numar, i=2; cout<<"Introuceti numarul de valori care vor fi citite: ";cin>>n; cout<<"Introduceti numarul #1 ";cin>>v_cmmdc; while(i<=n){ i=i+1; cout<<"Introduceti numarul #"<<(i-1)<<" ";cin>>numar; v_cmmdc = cmmdc(v_cmmdc, numar); } cout<<"Cel mai mare divizor al numerelor introduse este "<<v_cmmdc; getch(); }

Program bun :)(cred) include<iostream.h> int cmmdc(int a, int b) { int r; r=a%b; while(r!=0) { a=b; b=r; r=a%b; } return b; } void main (void) { int x,y,divizor; cout<<Dati primul numar; cin>>x; cout<<Dati al doilea numar; cin>>y; divizor=cmmdc(x,y); cout<<C.m.m.d.c. este <<divizor ;}

Functia cmmdc() calculeaza divizorul comun maxim dintre a si b si depune rezultatul n c. ntruct nu transmite date prin lista de parametri si nu ntoarce vreun rezultat, functia va avea prototipul void cmmdc(): #include <stdio.h> unsigned long a, b, c; // variabile externe // definirea functiei cmmdc() void main(void) { scanf(%lu%lu, &a, &b); printf(%lu / %lu = , a, b); cmmdc(); a/=c; b/=c; printf(%lu / %lun, a, b); } Definitia functiei cmmdc()din Exemplul 11, este: void cmmdc() { unsigned long r; do { r=a%b; a=b; b=r; } while (r); c=a; } Daca se executa acest program, se constata un rezultat ciudat, si anume, orice fractie, prin simplificare ar fi adusa la forma 1/0 ! Explicatia consta n faptul ca functia cmmdc() prezinta efecte laterale, si anume modifica valorile variabilelor externe a, b si c; la iesirea din functie a==c si b==0, ceea ce explica rezultatul. Asadar, un efect lateral (sau secundar),reprezinta modificarea de catre functie a unor variabile externe. n multe situatii aceste efecte sunt nedorite, duc la aparitia unor erori greu de localizat, facnd programele neclare, greu de urmarit, cu rezultate dependente de ordinea n care se aplica functiile care prezinta efecte secundare. Astfel ntr-o expresie n care termenii sunt apeluri de functii, comutarea a doi termeni ar putea conduce la rezultate diferite! Vom corecta rezultatul, limitnd efectele laterale prin interzicerea modificarii variabilelor externe a si b, ceea ce presupune modificarea unor copii ale lor n functia cmmdc()sau din programul de apelare void cmmdc(void) { unsigned long r, ca, cb; ca=a; cb=b; do{ r=ca%cb; ca=cb; cb=r; } while (r); c=ca; Singurul efect lateral permis n acest caz modificarea lui c asigura transmiterea rezultatului catre functia apelanta. Solutia mai naturala si mai putin expusa erorilor se obtine realiznd comunicatia ntre functia cmmdc() si functia main() nu prin variabile externe, ci prin parametri, folosind o functie care ntoarce ca rezultat cmmdc.

Transmiterea parametrilor prin valoare, mecanism specific limbajului C, asigura pastrarea intacta a parametrilor actuali x si y, desi parametrii formali corespunzatori: u si v se modifica! Parametrii actuali x si y sunt copiati n variabilele u si v, astfel nct se modifica copiile lor nu si x si y. In fisierul sursa functiile pot fi definite n orice ordine.Mai mult, programul se poate ntinde n mai multe fisiere sursa. Definirea unei functii nu poate fi totusi partajata n mai multe fisiere. O functie poate fi apelata ntr-un punct al fisierului sursa, daca n prealabil a fost definita n acelasi fisier sursa, sau a fost anuntata.