calculul cmmdc cmmmc

6
/* 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(); }

Upload: simona-radu

Post on 29-Oct-2015

50 views

Category:

Documents


3 download

DESCRIPTION

Cmmdc cmmmc

TRANSCRIPT

Page 1: Calculul cmmdc cmmmc

/* 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();

}

Page 2: Calculul cmmdc cmmmc

#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();}

Page 3: Calculul cmmdc cmmmc

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

Page 4: Calculul cmmdc cmmmc

Functia cmmdc() calculeaza divizorul comun maxim dintre a si b si depune rezultatul în c. Întrucât 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, facând 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, limitând 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 apelarevoid 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 realizând comunicatia între functia cmmdc() si functia main() nu prin variabile externe, ci prin parametri, folosind o functie care întoarce ca rezultat cmmdc.

Page 5: Calculul cmmdc cmmmc

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 încât 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.