Sunteți pe pagina 1din 41

Introducere in C - aplicatii rezolvate

1) Sa se scrie un program ce afiseaza textul: "Hello!".


#include<stdio.h> void main() { printf("Hello!"); getchar(); }

2) Sa se scrie un program care afiseaza textul "Hello!", astfel incat mesajul de afisat sa fie transmis prin intermediul unei variabile de un tip corect adaptat.
#include<stdio.h> void main() { char a[]="Hello!"; printf("%s",a); getchar(); }

3) Sa se scrie un program care afiseaza textul "Hello!", astfel incat mesajul de afisat sa fie transmis prin intermediul unei variabile de un tip corect adaptat, cu alt tip de memorare.
#include<stdio.h> void main() { char* a="Hello!"; printf("%s",a); getchar(); }

4) Sa se scrie un program care afiseaza textul "Hello!", astfel incat afisarea sa se realizeze prin intermediul unei functii definite de utilizator.
#include<stdio.h> void afisare() { printf("Hello!"); } void main() { afisare(); getchar(); }

5) Sa se scrie un program care afiseaza textul "Hello!", astfel incat afisarea sa se realizeze prin intermediul unei functii universale,cu posibilitatea transmiterii sirului prin parametru.
#include<stdio.h> void afiseaza(char a[]) { printf("%s", a); } void main() { afiseaza("Hello!"); getchar(); }

6) Sa se scrie un program care afiseaza textul "Hello!", astfel incat afisarea sa se realizeze prin intermediul unei functii universale, cu posibilitatea transmiterii sirului prin parametru, alt fel de scriere.
#include<stdio.h> void afiseaza(char* a) { printf("%s", a); } void main() { afiseaza("Hello!"); getchar(); }

7) Sa se scrie un program care introduce de la tastatura sirul dorit, apoi il afiseaza pe ecran.
#include<stdio.h> void main() { char* a; printf("Introduceti sirul de la tastatura:"); scanf("%s",a); printf(a); getchar(); }

8) Sa se scrie un program care introduce de la tastatura sirul dorit, apoi il afiseaza pe ecran (alta varianta decat cea de sus).
#include<stdio.h> void main() { char* a; printf("Introduceti sirul de la tastatura:"); gets(a); printf(a); getchar(); }

9) Sa se calculeze suma numerelor intregi, astfel: se dau doua valori direct in program memorate la cele doua locatii de memorie si se calculeaza suma lor.
#include<stdio.h> void main() { int a=3, b=7, c; c=a+b; printf("Suma celor doua nr este: %d\n", c); getchar(); }

10) Sa se calculeze suma numerelor intregi, astfel: se citesc doua numere de la tastatura si se calculeaza suma lor.
#include<stdio.h> void main() { int a,b; printf("Introduceti a=");

scanf("%d", &a); printf("Introduceti b="); scanf("%d", &b); printf("Suma a+b=%d\n", a+b); getchar(); int k; scanf("%d", &k); }

11) Sa se calculeze suma numerelor intregi, astfel: se citesc doua numere de la tastatura si se calculeaza suma lor, iar rezultatul e retinut prin intermediul unei variabile.
#include<stdio.h> void main() { int a,b; printf("Introduceti a:"); scanf("%d", &a); printf("Introduceti b:"); scanf("%d", &b); int c; c=a+b; printf("a+b=%d\n", c); getchar(); int k; scanf("%d",k); }

12) Sa se calculeze suma numerelor intregi, astfel: se va scrie o functie de sumare a doua numere intregi.
#include<stdio.h> int suma (int x, int { int s; s=x+y; return s; } void main() { int a,b; printf("dati printf("dati int c; c=suma(a,b); printf("Suma y)

a: "); scanf("%d",&a); b: "); scanf("%d",&b); este: %d\n",c);

getchar(); int k; scanf("%d", k); }

13) Sa se calculeze suma numerelor intregi, astfel: se citesc doua numere de la tastatura si se calculeaza suma lor. Se va scrie o functie de sumare a doua numere intregi. Functia va intoarce rezultatul prin linia de parametrii.
#include<stdio.h> void suma(int x,int y,int* s) { *s=x+y;

} void main() { int a,b; printf("dati a: "); scanf("%d",&a); printf("dati b: "); scanf("%d",&b); int c; suma(a,b,&c); printf("Suma este: %d\n",c); getchar(); int k; scanf("%d", k); }

14) Sa se scrie o functie care calculeaza media aritmetica a doua numere intregi.
#include<stdio.h> int media (int x, int y) { int ma; ma=(x+y)/2; return ma; } void main () { int a, b; printf("Introduceti a: "); scanf("%d", &a); printf("Introduceti b: "); scanf("%d", &b); int m; m=media(a,b); printf("Media aritmetica este: %d\n", m); getchar(); int k; scanf("%d", k); }

15) Sa se calculeze media aritmetica a doua numere intregi, astfel: se citesc doua numere de la tastatura si se calculeaza media artimetica a lor. Se va scrie o functie care calculeaza media aritmetica a doua numere intregi. Functia va intoarce rezultatul prin linia de parametrii.
#include<stdio.h> void media(int a, int b, int* c) { *c=(a+b)/2; } void main() { int x,y; printf("Introduceti x: "); scanf("%d", &x); printf("Introduceti y: "); scanf("%d", &y); int z; media(x,y,&z); printf("Media artimetica este: %d", z); getchar(); int k;

scanf("%d", k); }

16) Sa se calculeze media aritmetica a doua numere intregi.


#include<stdio.h> void main() { int a,b; printf("Introduceti a: "); scanf("%d", &a); printf("Introduceti b: "); scanf("%d", &b); int s=a+b; float m=(float)s/2; printf("Suma este: %d", s); printf("Media artitmetica este: %.2f", m); getchar(); int k; scanf("%d", k); }

17) Sa se calculeze puterea a n-a a lui 2, unde n este un intreg citit de la tastatura.
#include<stdio.h> void main() { int n; printf("Introduceti n:"); scanf("%d", &n); int p=1; printf("2^%d=%d",n,p=(p<<n)); //The shift operators shift (schimba) their first operand left (<<) //or right (>>) by the number of positions the second operand specifies getchar(); int k; scanf("%d", k); }

18) Se citeste un numar zecimal si unul in hexa de cel mult 4 cifre fiecare si se cere sa se afiseze valorile respective in sistemele de numerotatie cu baza 10, 8 si 16.
#include<stdio.h> void main() { unsigned int a,b; printf("Dati nr. intreg zecimal: "); scanf("%d",&a); printf("Dati nr. intreg hexazecimal: "); scanf("%x",&b); printf("\nnr. zecimal:\tBaza 10: %u\tBaza 8: %#o\tBaza 16: %#X",a,a,a); printf("\nnr. hexazecimal:\tBaza 10: %u\tBaza 8: %#o\tBaza 16: %#X",b,b,b); getchar(); int k; scanf("%d", k); }

19) Se se realizeze o rutina care foloseste incrementarea (decrementarea) post si prefixata.


#include<stdio.h> void main() { int val=1; printf("utilizarea postfix %d\n", val++); printf("utilizarea dupa incrementare %d\n", val); printf("utilizare prefix %d\n", ++val); printf("utilizare dupa incrementare %d\n", val); printf("utilizare postfix %d\n", val--); printf("utilizare dupa decrementare %d\n", val); printf("utilizare prefix %d\n", --val); printf("utilizare dupa dcrementare %d\n", val); getchar(); int k; scanf("%d", k); }

20) Sa se realizeze o rutina care executa lucrul pe biti.


#include<stdio.h> void main() { unsigned int a=5; const int b=7; printf("%d <sau pe biti> %d este %d\n", a,b, a|b); printf("%d <si pe biti> %d este %d\n", a,b, a&b); printf("%d <sau exclusiv pe biti> %d este %d\n", a,b, a^b); printf("5 <complementat pe biti> este %u variabila fiind pe %u octeti\n",~a,sizeof(a)); getchar(); int k; scanf("%d", k); }

21) Sa se scrie un program care citeste valoarea lui x, pozitiv, afiseaza valorile lui x, [x], {x}, calculeaza si afiseaza valoarea urmatoarei expresii : 5*x*[x]-3*{x}+15.
#include<stdio.h> void main() { double x; int y; double z;

//pentru partea intreaga //pentru partea zecimala

printf("Introduceti x:"); scanf("%lf", &x); printf("x= %g\t", x); printf("[x]= %d\t", y=x); printf("{x}= %f\t", z=x-y); printf("e=%g\n", 5*x*x-3*z+15);

getchar(); int k; scanf("%d", k); }

22) Sa se determine maximul si minimul a doua numere intregi.


#define max(x,y) x>y?x:y //#define=dai nume semnificativ unei constante din program #define min(x,y) x<y?x:y #include<stdio.h> void main() { int x,y; printf("Introduceti x: "); scanf("%d", &x); printf("Introduceti y: "); scanf("%d", &y); printf("\n\Max este: %d\n", max(x,y)); printf("\n\Min este: %d\n", min(x,y)); getchar(); int k; scanf("%d", k); }

23) Se dau trei numere reale a,b,c. Pot reprezenta ele lungimile laturilor unui triunghi?
#include<stdio.h> void main() { float a,b,c; printf("Dati lungimile laturilor:\n"); scanf("%f %f %f", &a, &b, &c); (a>=0 && b>=0 && c>=0 && a<b+c && b<a+c && c<a+b)?printf("\t %4.2f, %4.2f si %4.2f formeaza triunghi.",a,b,c):printf ("\t Nu formeaza triunghi."); getchar(); int k; scanf("%d", k); }

24) Sa se scrie un rpogram care citeste pe n de tip intreg si afiseaza valoarea expresiei: n/(n+1) cu 15 zecimale.
#include<stdio.h> void main() { int n; printf("Introduceti n:"); scanf("%d", &n); float e; e=(float)n/(n+1); printf("Valoarea expresiei este: %.15f", e); getchar(); int k; scanf("%d", k); }

25) Sa se determine maximul si minimul a doua numere intregi, folosing macrouri.


#define max(x,y) x>y?x:y #define min(x,y) x<y?x:y #include<stdio.h> void main() { int x, y; printf( "Introduceti x si y:\n"); scanf("%d %d", &x, &y); printf("\n\tMax este: %d", max(x,y)); printf("\n\tMin este: %d", min(x,y)); getchar(); int k; scanf("%d", k); }

26) Sa se scrie un program care sa calculeze numarul de picioare dintr-o curte, in care se afla g gaini, p pisici si un om.
#include<stdio.h> void main() { int g,p; printf("\nIntroduceti numarul de gaini:" ); scanf("%d", &g); printf("\nIntroduceti numarul de pisici:" ); scanf("%d", &p); printf("\n\tNumarul de picioare este: %d", g*2+p*4+2); getchar(); int k; scanf("%d", k); }

27) Folosind operatorul conditional sa se verifice daca un numar real x se afla in intervalul [a,b), unde a si b sunt date de la tastatura.
#include<stdio.h> void main() { float x; printf("Introduceti x:"); scanf("%f", &x); int a,b; printf("Introduceti a: "); scanf("%d", &a); printf("Introduceti b: "); scanf("%d", &b); (x>=a&&x<b) ? printf("\n\tX se afla in intervalul [%d %d)", a,b) : printf("\n\tX nu se afla in intervalul [%d %d)", a,b); getchar(); int k; scanf("%d", k); }

28) Sa se scrie un program care citeste valoarea variabilei x si afiseaza valoarea functiei f(x) :
|3*x*x+7*x-10 f(x)= |2 |4*x*x #include<stdio.h> void main() { x<0 x=0 x>0

int x; printf("Introduceti x:"); scanf("%d", &x); if(x==0) printf("F(x)=2"); else if(x<0) printf("F(x)=%d",3*x*x+7*x-10); else printf("F(x)=%d",4*x*x); getchar(); int k; scanf("%d", k); }

C: Instructiuni - aplicatii rezolvate


1) Sa se scrie un program care executa operatia aritmetica dorita (+,-,/,*).
#include<stdio.h> void main() { int a,b; printf("Introduceti a: "); scanf("%d", &a); printf("Introduceti b: "); scanf("%d", &b); char x; getchar(); printf("Introduceti operatia dorita (+ - * /): "); scanf("%c", &x); switch(x) { case '+': printf("a+b= %d", a+b); break; case '-': printf("a-b= %d", a-b); break; case '/': printf("a/b=%.2f",a/(float)b); break; case '*': printf("a*b= %d", a*b); break; default: printf("Operatie necunoscuta"); } getchar(); int k; scanf("%d", k); }

2) Sa se scrie un program care calculeza suma primelor n numere naturale cu "for".


#include<stdio.h> void main() {

int n,s=0; printf("Introduceti n:"); scanf("%d",&n); for(int i=1;i<=n;i++) s+=i; //s=s+i; printf("Suma primelor %d numere naturale este: %d\n",n,s); getchar(); int k; scanf("%d", k); }

3) Sa se scrie un program care calculeaza suma primelor n numere naturale cu "while".


#include<stdio.h> void main() { int n, s=0, i=1; printf("Introduceti n:"); scanf("%d",&n); while(i<=n) { s+=i; i++; }

//s=s+i;

printf("Suma primelor %d numere naturale este: %d\n",n,s); getchar(); int k; scanf("%d", k); }

4) Sa se scrie un program care calculeaza suma primelor n numere naturale cu "do while".
#include<stdio.h> void main() { int n, s=0, i=1; printf("Introduceti n:"); scanf("%d",&n); do { s+=i; i++; } while(i<=n) printf("Suma primelor %d numere naturale este: %d\n",n,s); getchar(); int k; scanf("%d", k); } //s=s+i;

5) Sa se scrie un program care rezolva ecuatia de gradul al II-lea.


#include <stdio.h> #include <math.h> void main (void)

{ int a,b,c; float x1,x2,d; printf("Introduceti coeficientii ecuatiei.\n"); printf("\ta="); scanf("%d",&a); printf("\tb="); scanf("%d",&b); printf("\tc="); scanf("%d",&c); if(!a) //a==0 if(!b) if(!c) printf("Ecuatia are o infinitate de solutii."); else printf("Ecuatia nu are nici o solutie."); else { x1=-c/(float)b; printf("Solutia ec. este: %.2f.",x1); } else x1=-c/(float)b; printf("Solutia ec. este: %.2f.",x1); { d =b*b-4*a*c; if(d<0) printf("Ec nu are solutii reale."); else { x1=(-b-sqrt(d))/2*a; printf("Solutiile sunt:\n\tx1 este: %.2f\n",x1); x2=(-b+sqrt(d))/2*a; printf("\tx2 este: %.2f\n",x2); } } getchar(); int k; scanf("%d", k); }

6) sa se scrie un program care calculeaza valoarea expresiei S=1-2+3-4+....+, folosind functii proprii.
#include <stdio.h> int suma1(int n) { int s=0, i=1, semn=1; for(; i<=n; i++) { s+=semn*i; semn=-semn; } return s; } int suma2(int n) { int s=0, i=1, semn=1; while (i<=n) { s+=semn*i; semn=-semn; i++; } //cu instructiunea FOR

//s=s+semn*i

//cu instructiunea WHILE

//s=s+semn*i

return s; } int suma3(int n) { int s=0, i=1, semn=1; do { s+=semn*i; semn=-semn; i++; } while (i<=n); return s; } void main() { int n; printf("Introduceti n:"); scanf("%d", &n); printf("\n\tSuma calculata cu FOR are valoarea: %d" , suma1(n)); printf("\n\tSuma calculata cu WHILE are valoarea: %d" , suma2(n)); printf("\n\tSuma calculata cu DO WHILE are valoarea: %d" , suma3(n)); getchar(); int k; scanf("%d", k); } //cu instructiunea DO WHILE

//s=s+semn*i

7) Sa se scrie un program care calculeaza valoarea expresiei: P=1*2*3*4*...*n.


#include<stdio.h> int produs1(int n) { int P=1; for(int i=1; i<=n; i++) P=P*i; return P; } int produs2(int n) { int P=1; int i=1; while(i<=n) { P=P*i; i++; } return P; } int produs3(int n) { int P=1; int i=1; do{ P=P*i; i++; } while(i<=n); return P; } void main() { int n; //cu instructiunea DO WHILE //cu instructiunea FOR

//cu instructiunea WHILE

printf("Introduceti n: "); scanf("%d", &n); printf("\n\tProdusul calculat cu FOR are valoarea: %d.\n" , produs1(n)); printf("\n\tProdusul calculat cu WHILE are valoarea: %d.\n" , produs2(n)); printf("\n\tProdusul calculat cu DO WHILE are valoarea: %d.\n" , produs3(n)); getchar(); int k; scanf("%d", k); }

8) Sa se scrie un program care calculeaza valoarea expresiei: P=1*(1/2)*3*(1/4)*5*(1/6)*...n


#include<stdio.h> #include<math.h> float produs1(int n) { float p=1; float z=1; //cu instructiunea FOR

for(int i=1; i<=n; i++) { if (!(i%2)) //se mai putea scrie if(i%2==0) <=> testeaza dc nu e impar { z=1/(float)i; p =p*z; } else p=p*i; } return p; //pt impar

} float produs2(int n) //cu instructiunea WHILE { float p=1; float z=1; int i=1; while(i<=n) { if (!(i%2)) //se mai putea scrie if(i%2==0) <=> testeaza dc nu e impar { z=1/(float)i; p =p*z; } else p=p*i; //pt impar i++; } return p; } float produs3(int n) //cu instructiunea WHILE { float p=1; float z=1; int i=1; do { if (!(i%2)) //se mai putea scrie if(i%2==0) <=> testeaza dc e par { z=1/(float)i;

p =p*z; } else p=p*i; i++; } while(i<=n); return p; } void main() { int n; printf("Introduceti n: "); scanf("%d", &n); printf("\nProdusul cu FOR este: %.5f\n", produs1(n)); printf("\nProdusul cu WHILE este: %.5f\n", produs2(n)); printf("\nProdusul cu DO WHILE este: %.5f\n", produs3(n)); getchar(); int k; scanf("%d", k); } //pt impar

9) Sa se scrie un program care calculeaza valoarea expresiei: S=1+1*2+1*2*3+1*2*3*4+1*2*3*4*5+...+1*2*...*n.


#include<stdio.h> void main() { int n; int s=0; int p=1; printf("Introduceti n:"); scanf("%d", &n); for(int i=1; i<=n; i++) { p=p*i; s=s+p; } printf("Rezutatul este: %d", s); getchar(); int k; scanf("%d", k); }

10) Sa se scrie un program care calculeaza x la puterea y (folosind functia pow).


#include <math.h> #include<stdio.h> void main() { double x, y, z; printf("\nIntroduceti coeficientul: "); scanf("%lf", &x); printf("\nAti introdus x= %.2lf", x); printf("\n\nIntroduceti puterea: "); scanf("%lf", &y);

printf("\nAti introdus y= %.2lf", y); z=pow(x,y); printf("\n\n\%.2lf^%.2lf= %.2lf", x,y,z); getchar(); int k; scanf("%d", k); }

11) Se citeste un text format din cuvinte ce pot fi despartite prin spatiu sau virgula. Textul citit se termina cu punct sau enter. Sa se contorizeze vocalele si consoanele din acel text.
#include<stdio.h> void main() { int v=0; int c=0; printf("Introduceti textul dorit: "); char k; k=getchar(); //citeste un carater, care va fi primul din text, care va fi trimis variabilei k while(k!='.' && k!='\n') { if (k!=',' && k!=' ') switch (k) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': v++; break; default: c++; } k=getchar(); //urmatorul caracter din text va fi trimis in variabila k } printf("Numarul de vocale este: %u\n",v); printf("Numarul de consoane este: %u\n",c); getchar(); int z; scanf("%d", z); }

12) Se citeste un text format din cuvinte ce pot fi despartite prin spatiu sau virgula. Textul citit se termina cu punct sau enter. Sa se contorizeze vocalele si consoanele din acel text. Sa se rezolve problema folosind o bucla repetitiva conditionata posterior.
#include<stdio.h> void main() {

int v=0; int c=0; printf("Introduceti textul dorit: "); char k; do { k=getchar(); if (k!=',' && k!=' ' && k!='\n' && k!='.') switch (k) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': v++; break; default: c++; } } while(k!='.' && k!='\n'); printf("Numarul de vocale este %u\n",v); printf("Numarul de consoane este %u\n",c); getchar(); int z; scanf("%d", z); }

13) Sa se contorizeze numarul de vocale si cel de consoane din alfabet, folosind instructiunea de salt "goto".
#include<stdio.h> void main() { int v=0; int c=0; char litera='A'; eticheta: switch (litera) { case 'A': case 'E': case 'I': case 'O': case 'U': v++; break; default: c++; } litera++; if(litera<='Z') goto eticheta; printf("Numarul de vocale este %d\n",v); printf("Numarul de consoane este %d\n",c); getchar(); int var;

scanf("%d", var); }

14) Sa se afiseze din intregul alfabet doar literele caractere mari pana la 'M'. Bucla se va incheia in mod voit, prin folosirea instructiunii "break".
#include<stdio.h> void main() { for(char litera='A'; litera<='Z'; litera++) { if(litera=='M') break; printf("%c", litera); } getchar(); int var; scanf("%d", var); }

15) Sa se transforme un numar din baza 10 intr-o baza p, 2<=p<=10.


/* Vom mparti succesiv pe x (numarul dat) la p, retinnd cifrele din baza p ntr-un numar xpi, care va fi apoi rasturnat, pentru a obtine numarul xp, vazut ca reprezentarea n baza p a lui x. Pentru a nu avea probleme n cazul n care prima cifra a lui xpi ar fi 0, folosim o incrementare cu 1 a cifrelor la transformarea x->xpi, respectiv o decrementare la transformarea xpi->xp. */ #include<stdio.h> void main () { int x,xpi,xp,p; printf ("Dati x in baza 10:"); scanf ("%d",&x); printf("Dati noua baza p:"); scanf("%d",&p); //un alt mod de a scrie o instructiune for for (xpi=0; x; xpi=10*xpi+x%p+1,x=x/p); for (xp=0; xpi; xp=10*xp+(xpi-1)%10,xpi=xpi/10); printf("Numarul in baza %d este:%d",p,xp); getchar(); int var; scanf("%d", var); } /* De remarcat, in acest exemplu, folosirea operatorului "," in cadrul instructiunii for. De pilda, primul for se interpreteaza astfel: - se initializeaza xpi cu 0; - cat timp x este diferit de 0 executa: - xpi devine 10*xpi+x%p+1 - x se imparte la p (si se face conversia la int).*/

16) Sa se realizeze un program care intr-o bucla "while" calculeaza suma cifrelor unui numar introdus de la tastatura si afiseaza inversul lui.
#include<stdio.h> #include<math.h> void main() { int nr; int s=0;

//suma cifrelor

int inv=0; //inversul numarului printf("Introduceti numarul: "); scanf("%d",&nr); while (nr) //sau while(n!=0) { s=s+nr%10; inv=inv*10+nr%10; nr/=10; } /* instructiunea repetitiva de mai sus se mai putea scrie si asa: while(ninv*=10,ninv+=n%10,s+=n%10,n/=10); */ printf("Suma este: %d",s); printf("\nInversul este: %d",inv); getchar(); int var; scanf("&d", var); }

17) Fiind furnizate 3 numere intregi sa se verifice daca acestea pot fi masurile unui triunghi, si in caz afirmativ sa se calculeze perimetrul.
#include<stdio.h> int triunghi(int a,int b,int c) { if((a>0)&&(b>0)&&(c>0)&&(a<b+c)&&(b<a+c)&&(c<a+b)) return 1; else return 0; } void main() { int a,b,c,s=0; printf("a= ");scanf("%d",&a); printf("b= ");scanf("%d",&b); printf("c= ");scanf("%d",&c); if(triunghi(a,b,c)==1) { s=a+b+c; printf("Perimetrul triunghiului ABC este: %d",s); } else printf("Nu este triunghi"); getchar(); int var; scanf("&d", var); }

18) Sa se calculeze valoarea functiei f definita pe multimea numerelor reale pentru un x citit:
| x-3, ptr. x<5 F=| x+1, ptr. 5>x>25 | x-5x+6,ptr. x>25 #include<stdio.h> void main() { int x; printf("Introduceti numarul: "); scanf("%d",&x); if(x>=5&&x<=25) printf("F(x)= %d",x+1);

else { if(x<5) printf("F(x)= %d",x-3); else printf("F(x)= %d",x-5*x+6); } getchar(); int var; scanf("&d", var); }

19) Sa se afiseze suma cifrelor unui numar natural dat. Indicatie: se detaseaza fiecare cifra de la sfarsitul numarului calculand restul impartirii numarului la 10; numarul ramas dupa desprinderea cifrei este catul impartirii la 10.
#include<stdio.h> void main() { int n,s=0; printf("n= ");scanf("%d",&n); while(n!=0) { s=s+n%10; n=n/10; } printf("Suma cifrelor este: %d",s); getchar(); int var; scanf("&d", var); }

20) Sa se calculeze suma S=1!+2!+3!++n!


#include<stdio.h> int factorial(int n) { int p=1; for(int i=1;i<=n;i++) p*=i; return p; } void main() { int m,i,s=0; printf("\n\tIntroduceti nr: ");scanf("%d",&m); for(i=1;i<=m;i++) s=s+factorial(i); printf("\tSuma este: %d",s); getchar(); int var; scanf("&d", var); }

21) Sa se calculeze produsul: P=2*4*6*8*10**n, unde n=2k.


#include<stdio.h> void main() { int n,i,p=1; printf("Introduceti nr: "); scanf("%d",&n);

n=n*2; for(i=2;i<=n;i++) { if (!(i%2)) par p*=i; } printf("Produsul este: %d",p); getchar(); int var; scanf("&d", var); }

//se mai putea scrie if(i%2==0) <=> testeaza dc e

22) Sa se calculeze suma S=1^2+2^2+3^2+4^2+...+n^2.


#include<stdio.h> void main() { int n,s=0,i; printf("n= "); scanf("%d",&n); for(i=1;i<=n;i++) s=s+i*i; printf("Suma este egala cu: %d",s); getchar(); int var; scanf("&d", var); }

23) Sa se calculeze suma S=1-1*2+1*2*3-...1*2*3*...*n.


#include<stdio.h> int factorial(int n) { int p=1; for(int i=1;i<=n;i++) p*=i; return p;} void main() { int n,i,s=0,semn=1; printf("n= ");scanf("%d",&n); for(i=1;i<=n;i++) { s=s+semn*factorial(i); semn=-1; } printf("Suma este egala cu: %d",s); getchar(); int var; scanf("&d", var); }

24) Sa se transforme un numar din baza 10 n baza p<10.


#include<stdio.h>

void main() { int n,m,p,y=0,c; printf("Nr in baza 10 este: ");scanf("%d",&n); printf("Baza in care se converteste: ");scanf("%d",&p); while(n!=0) { c=n%p; y=y*10+c; n=n/p; } printf("Nr. in baza %d este: %d",p,y); getchar(); int var; scanf("&d", var); }

C: Pointeri si functii definite de utilizator aplicatii rezolvate


1) Exemplificare in declarare si folosirea variabilelor pointer. Transferul se va face intre adrese ale locatiilor de memorie, cu retinere simultana si a valorilor retinute la acestea.
#include<stdio.h> void main() { int a=1; /* a este o locatie de memorie pentru elemente de tip int pe doi octeti, pe care am initializat-o cu valoarea 1 */ int* b; /* b este o variabila pointer spre tipul int, adica capabila a retine adrese ale altor variabile de tipul specificat */ //declaram pointerul /* in adresa b retinem adresa locatiei de memorie (adica a variabilei) a, deci b devine adresa locatiei de memorie a */ printf("Val a= %d\t Val b= %d\n\n", a,*b); printf("Adresa a= %p\t Adresa b= %p", &a, b); getchar(); int k; scanf("&d", k); }

b=&a;

2) Exemplificare in declarare si folosirea variabilelor pointer. Transferul se va face doar intre valori retinute la anumite locatii de memorie.
#include<stdio.h> void main() { int a=1; /*a este o locatie de memorie pentru elemente de tip int pe doi octeti, pe care am initializat-o cu valoarea 1 */ int x=55;

int *b; /* b este o variabila pointer spre tipul int, adica capabila a retine adrese ale altor variabile de tipul specificat */ //declaram pointerul b=&x; variabilei) x, deci b devine adresa locatiei de memorie x */ *b = a; */ printf("Val a= %d\t Val b= %d\n\n", a,*b); printf("Adresa a= %p\t Adresa b= %p", &a, b); getchar(); int k; scanf("&d", k); } /* transferul se face intre valori; valorii retinute la adresa b ii atribuim valoarea retinuta in a //initializam pointerul /* in adresa b retinem adresa locatiei de memorie (adica a

3) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre adrese ale locatiilor de memorie, elementul auxiliar interschimbarii fiind tot o adresa.
#include<stdio.h> void main() { int *a, *b, *c; int x=55; int y=66; a=&x; b=&y; //initializam a //initializam b

printf("Introduceti a: ",a); scanf("%d", a); printf("Introduceti b: ",b); scanf("%d", b); printf("\nInainte de interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); //interschimbarea c=a; a=b; b=c; printf("\nDupa interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); getchar(); int k; scanf("&d", k); }

4) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre adrese ale locatiilor de memorie, elementul auxiliar interschimbarii nefiind o adresa (un pointer).

#include<stdio.h> void main() { int *a, *b, c; int x=2, y=5; a=&x; b=&y; //initializam a //initializam b

printf("Introduceti a: ",a); scanf("%d", a); printf("Introduceti b: ",b); scanf("%d", b); printf("\nInainte de interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); //interschimbarea c=*a; valida a=b; b=&c; printf("\nDupa interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); getchar(); int k; scanf("&d", k); } // transfer intre valori, pt ca expresia &c=a; nu ar fi fost

5) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre valorile retinute la locatiile de memorie ale respectivelor adrese, elementul auxiliar interschimbarii fiind o adresa (un pointer).
#include<stdio.h> void main() { int *a, *b, *c; int x=2, y=5, z=7; a=&x; b=&y; c=&z; //initializam a //initializam b //initializam c

printf("Introduceti a: ",a); scanf("%d", a); printf("Introduceti b: ",b); scanf("%d", b); printf("\nInainte de interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); //interschimbarea *c=*a; // transfer intre valori *a=*b;

*b=*c; printf("\nDupa interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); getchar(); int k; scanf("&d", k); }

6) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre valorile retinute la locatiile de memorie ale respectivelor adrese, elementul auxiliar interschimbarii nefiind o adresa (un pointer).
#include<stdio.h> void main() { int *a, *b, c; int x=2, y=5; a=&x; b=&y; //initializam a //initializam b

printf("Introduceti a: ",a); scanf("%d", a); printf("Introduceti b: ",b); scanf("%d", b); printf("\nInainte de interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); //interschimbarea c=*a; *a=*b; *b=c; // transfer intre valori

printf("\nDupa interschimbare: \n"); printf("\tVal a= %d\tVal b= %d\n\n", *a,*b); printf("\tAdresa a= %p\tAdresa b= %p\n", a, b); getchar(); int k; scanf("&d", k); }

7) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv adunare/scadere de valori.
#include<stdio.h> void main() { int a[]={10,20,30,40,50}; /*am declarat un sir de elemente de tip int pe care

l-am initializat cu valorile aflate in multime*/ int* b; // b este pointer spre tipul int b=a; //in adresa b retinem sirul a /* transferul se face astfel deoarece a este o adresa prin numele sau, adresa primului element din sir*/ for(int i=1; i<=5; i++) { printf("%d\n", *b); /* b-ul prin transfer fiind adresa primului element, rezultatul acestei expresii, va fi prima valoare din sir, adica 10*/ b++; //se face trecerea la elementul urmator din sir } // ne vom intoarce cu pointerul de cursor al sirului in prima pozitie b-=5; //sau b=b-5 printf("Primul element al sirului: %d\n", *b); /* ne pastram pozitia de pointare in sir, daca vrem sa afisam elementul al treilea al sirului*/ printf("Al treilea element al sirului: %d\n", *(b+2)); getchar(); int k; scanf("&d", k); }

8) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv adunare/scadere asupra unui sir de caractere prin prelucrare pe subsiruri ale acestuia.
#include<stdio.h> void main() { char a[]="ABCDE"; //sirul a retine un sir de caractere, in numar de 5 char* b; b=a; for(int i=1;i<=5;i++) { printf("%s\n",b); /* un sir este o adresa, iar, mesajul acesta va afisa subsirul incepand cu prima pozitie, adica "ABCDE" */ b++; } b-=5; printf("subsirul incepand cu prima pozitie: %s\n",b); printf("subsirul incepand cu a treia pozitie: %s",b+2); getchar(); int k; scanf("&d", k); }

9) Alocarea memorie dinamice n lucrul cu variabile pointer. S se realizeze un program care interschimb dou valori reale folosind variabile pointer.
#include<stdio.h> #include<stdlib.h> //sau #include<alloc.h> void main() { double *a,*b,*c; /* vom crea variabile dinamice, adica variabile ce isi vor pastra memoria extinsa intr-o zona, numita zona HEAP */ a=(double*)malloc(sizeof(double)); suficient pentru /* in zona HEAP am rezervat spatiu

memorarea unei variabile de tipul double */ printf("Introduceti a: "); scanf("%lf",a); b=(double*)malloc(sizeof(double)); printf("Introduceti b: "); scanf("%lf",b); c=a; /* pentru c nu este nevoie sa alocam memorie dinamica, pentru ca c primeste prin transfer de la a */ a=b; b=c; printf("dupa interschimbare: a= %.2lf\tb= %.2lf",*a,*b); /* desi in acest caz nu este necesar, pentru ca o variabila dinamica nu mai este viabila la sfarsitul executiei functiei, totusi noi putem opta pentru dealocare explicita pentru variabilele create dinamic */ free(a); free(b); getchar(); int k; scanf("&d", k); }

10) Transferul parametrilor prin valoare.


#include<stdio.h> void modifica(int x, int y, int z) { printf("Valori initiale in functie: %d %d %d\n",x,y,z); //1 2 3 x+=10; y+=10; z+=10; printf("Valori finale in functie: %d %d %d\n",x,y,z); //11 12 13 } void main() { int a=1,b=2,c=3; printf("Valori initiale in program: %d %d %d\n",a,b,c); //1 2 3 modifica(a,b,c); printf("Valori finale in program: %d %d %d\n",a,b,c); //1 2 3 getchar(); int k; scanf("&d", k); }

11) Transferul parametrilor prin valoare.


#include<stdio.h> int suma (int s) { for(int i=0; i<=10; i++) s=s+i; return s; } void main() { int s=0; suma(s); printf("Suma este: %d", s); getchar(); int k; scanf("%d",k); }

//Sume este 0

12) Transferul parametrilor prin adresa.


#include<stdio.h> void modifica(int* x, int* y, int* z) { printf("Valori initiale in functie: %d %d %d\n",*x,*y,*z); *x+=10; *y+=10; *z+=10; printf("Valori finale in functie: %d %d %d\n",*x,*y,*z); } void main() { int a=1,b=2,c=3; printf("Valori initiale in program: %d %d %d\n",a,b,c); 3 modifica(&a,&b,&c); printf("Valori finale in program: %d %d %d\n",a,b,c); getchar(); int k; scanf("%d",k); }

//1 2 3

//11 12 13

//1 2 //11 12 13

13) Transferul parametrilor prin adresa.


#include<stdio.h>void suma(int* s) { for(int i=0; i<=10; i++) *s=*s+i; } void main() { int s=0; suma(&s); printf("Suma este: %d\n", s); getchar(); int k; scanf("%d",k); }

//Sume este 55

14) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n afara execuiei funciei.
#include<stdio.h> //citirea unei variabile reale void citire(float* x, char c) { printf("Introduceti %c: ", c); scanf("%f", x); } //afisarea continutului unei variabile reale void afisare(float x, char c) { printf("Valoarea din %c este: %.2f\n", c,x); } //functia de interschimbare a continutului a doua variabile reale void interschimbare(float *x, float *y) { float z; z=*x; *x=*y; *y=z; } void main() { float a, b; citire(&a,'a'); citire(&b,'b'); printf("\nINITIAL:\n"); afisare(a,'a'); afisare(b,'b'); printf("\nDUPA INTERSCHIMBARE:\n"); interschimbare(&a,&b); afisare(a,'a'); afisare(b,'b'); getchar(); int k; scanf("%d",k); }

15) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip standard definit.
#include<stdio.h> float a,b; //functia de citire a celor doua variabile void citire() { printf("Introduceti a: "); scanf("%f", &a); printf("Introduceti b: "); scanf("%f", &b); } //functia de afisare

void afisare() { printf("Valoarile sunt: a=%.2f, b=%.2f\n", a, b); } //functia de interschimbare void interschimbare() { float c; c=a; a=b; b=c; } void main() { citire(); afisare(); printf("\n"); interschimbare(); afisare(); getchar(); int k; scanf("%d",k); }

16) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip pointer spre un tip real.
#include<stdio.h> #include<stdlib.h> float*a,*b; void alocare() { a=(float*)malloc(sizeof(float)); b=(float*)malloc(sizeof(float)); } void citire() { alocare(); printf("dati a: "); scanf("%f",a); printf("dati b: "); scanf("%f",b); } void afisare() { printf("valorile sunt: a=%.2f, b=%.2f\n",*a,*b); } void interschimba() { float c; c=*a; *a=*b; *b=c; } void main() { citire(); afisare(); printf("\n"); interschimba(); afisare();

getchar(); int k; scanf("%d",k); }

17) Ce va afisa programul de mai jos?


#include<stdio.h> int a,b; int f(int m,int n) { m=n+b; //printf("\nm=%d", m); n+=1; //printf("\nn=%d", n); return n+b+m; //printf("\nm=%d", n+b+m); } void main() { a=6; b=5; printf("\n%d %d ",a,b); printf("\n%d ",f(a,b)); printf("\n%d %d ",a,b); getchar(); int k; scanf("%d",k); } Raspuns: 6 5 21 6 5

18) Se cere a se scrie o funcie care va calcula suma cifrelor unui numar. Funcia se va scrie cu prototip (zona declarativ difereniat de cea definitiv).
#include<stdio.h> //in acest caz rezultatul se va transmite prin tipul rezultat int suma(int); //suma cifrelor unui nr. intreg void main() { int n, suma_cifrelor=0, nr_invers=0; printf("Introduceti n: "); scanf("%d",&n); suma_cifrelor=suma(n); printf("\nSuma cifrelor sale este: %d", suma_cifrelor); getchar(); int k; scanf("%d",k); } /* suma cifrelor unui numar intreg: Presupunem nr. dorit ca fiind 523 ptr. care sa calculam suma cifrelor 523 : 10 = 52 rest 3 Suma cifrelor intermediara: 0+3=3 52 : 10 = 5 rest 2

Suma cifrelor intermediara: 3+2=5 5 : 10 = 0 rest 5 Suma cifrelor finala: 5+5=10 */ int suma(int n) { int s=0; while (n) { s=s+n%10; n/=10; } return s; } /* inversul unui numar intreg: Presupunem nr. dorit ca fiind 523 ptr. care dorim sa-i aflam inversul 523 : 10 = 52 rest 3 Numarul invers intermediar: 0*10+3=3 52 : 10 = 5 rest 2 Numarul invers intermediar: 3*10+2=32 5 : 10 = 0 rest 5 Numarul invers final: 32*10+5=325 */

19) Folosind o funcie s se realizeze un program care calculeaz urmtoarea expresie: (1+ + 1/3+ ++1/n)^n , unde n este un ntreg dat de la tastatur.
#include<stdio.h> #include<math.h> float suma (int n) { float s=0; float p=1; for(int i=1; i<=n; i++) { p=1/(float)i; s=s+p; } s=pow(s,n); return s; } void main() { int n; printf("\nIntroduceti n: "); scanf("%d", &n); printf("\n\tRezultatul expresiei este: %.2f", suma(n)); getchar(); int k; scanf("%d", k); }

20) S se realizeze un program care calculeaza prin intermediul a dou funcii cmmdc-ul i cmmmcul a dou numere date de la tastatur.
#include <stdio.h> #include <math.h> int cmmdc (int n, int m)

{ while(n!=m) { if(n>m) n =n-m; else m =m-n; } return n; } int cmmmc (int n, int m) { int z; z=(n*m)/cmmdc(n,m); return z; } void main() { int n,m; printf("\nIntroduceti n: "); scanf("%d", &n); printf("\nIntroduceti m: "); scanf("%d", &m); printf("\nCmmdc este: %d", cmmdc(n,m)); printf("\nCmmmc este: %d", cmmmc(n,m)); getchar(); int k; scanf("%d", k); }

21) S se realizeze adunarea i nmulirea a dou numere reale folosind variabile de tipul pointer.
#include<stdio.h> void main() { int a; printf("Introduceti a: "); scanf("%d", &a); int b; printf("Introduceti b: "); scanf("%d", &b); int* n; //declar pointer int* m; //declar pointer n=&a; m=&b; //initializez pointer //initializez pointer

printf("\nSuma este: %d", *n+*m); printf("\nProdusul este: %d", *n * *m); getchar(); int k; scanf("%d", k); }

22) Scriei o funcie care primete ca parametru lungimea laturii unui ptrat i returneaz aria sa i o funcie care returneaz diagonala.
#include<stdio.h> #include<math.h> float lungime (int n) { float aria; aria=n*n; return aria; } float diagonala (double n) { double diag; diag=sqrt((n*n)+(n*n)); return diag; } void main() { int n; printf("Introduceti n: "); scanf("%d", &n); printf("\nAria patratului este: %.2f", lungime(n)); printf("\nDiagonala patratului este: %.2lf", diagonala(n)); getchar(); int k; scanf("%d", k); }

23) Scriei o funcie care primete 3 parametri de tip real, cu semnificaia de lungimi pentru 3 segmente. Funcia va returna 1, dac cele trei segmente pot forma un triunghi i 0, n caz contrar.
#include<stdio.h> #include<math.h> int triunghi (float x, float y, float z) { if((x>0)&&(y>0)&&(z>0)&&(x<y+z)&&(y<x+z)&&(z<x+y)) return 1; else return 0; } void main() { float x; float y; float z; printf("Introduceti x: "); scanf("%f", &x); printf("Introduceti y: "); scanf("%f", &y); printf("Introduceti z: "); scanf("%f", &z); printf("Rezultat: %d",triunghi(x,y,z)), getchar(); int k; scanf("%d", k); }

24) Scriei o funcie care returneaz ultima cifr a unui numr natural. De exemplu, dac numrul este 234, funcia va returna 4.
#include<stdio.h> #include<math.h> int cifra (int a) { int b; b=a%10; return b; } void main() { int a; printf("Introduceti numarul: "); scanf("%d", &a); printf("Ultima cifra este: %d",cifra(a)); getchar(); int k; scanf("%d", k); }

C: Recursivitate - aplicatii rezolvate


1) S se calculeze n! in varianta iterativa.
#include<stdio.h> long int factorial (int n) { long int f=1; for (int i=1; i<=n;i++) f=f*i; return f; } void main() { int n; printf("Introduceti n= "); scanf("%d", &n); if(!n) printf("0!=1\n"); else printf("%d!=%ld\n",n,factorial(n)); getchar(); int var; scanf("%d", var); }

2) S se calculeze n! in varianta recursiva.


// factorial(3)=3*factorial(2)=3*2*factorial(1)=3*2*1 #include<stdio.h> long int factorial (int n) { if (n==1) return 1; else return n*factorial(n-1);

} void main() { int n; printf("Introduceti n= "); scanf("%d", &n); if(!n) printf("0!=1\n"); else printf("%d!=%ld\n",n,factorial(n)); getchar(); int var; scanf("%d", var); }

3) S se calculeze recursiv suma elementelor unui sir.


#include<stdio.h> int suma(int n) { if (n==0) return 0; else return (n + suma(n-1)); } void main() { int n; printf("Introduceti n: "); scanf("%d", &n); printf("Suma elementelor este %d\n",suma(n)); getchar(); int var; scanf("%d", var); }

4) Scrieti o functie proprie care realizeaza calculul recursiv al sumei elementelor unui vector, de n<=10, de nr reale. Scrieti functia main care citeste datele de la tastatura, calculeaza suma, utilizand functia recursiva anterior definita si afiseaza valoarea obtinuta.
#include <stdio.h> #include <conio.h> int a[10], n; int Suma (int n, int a[10]) { if(n==0) return 0; else return(a[n]+Suma(n-1,a)); } void main() { // Citire date de intrare printf("Introduceti nr de elemente: "); scanf("%d", &n); for (int i=1; i<=n; i++) { printf("Elementul [%d] = ", i); scanf("%d", &a[i]); } // Afisarea rezultatelor printf("Suma = %d", Suma(n,a));

getch(); }

5) S se scrie un program C, pentru rezolvarea cmmdc-ului dintre dou numere ntregi fr semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). Varianta iterativa.
#include <stdio.h> #include <conio.h> unsigned int cmmdc(unsigned int a, unsigned int b) { while(a!=b) { if(a>b) a =a-b; else b =b-a; } return a; } void main() { unsigned int x,y; printf("Introduceti x: "); scanf("%u",&x); printf("Introduceti y: "); scanf("%u",&y); if(!x || !y) //daca x=0 sau y=0 printf("cmmdc(%u,%u) = 1\n",x,y); else printf("cmmdc(%u,%u) = %u\n",x,y,cmmdc(x,y)); getch(); }

6) S se scrie un program C, pentru rezolvarea cmmdc-ului dintre dou numere ntregi fr semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). Varianta recursiva.
#include <stdio.h> #include <conio.h> unsigned int cmmdc(unsigned int a, unsigned int b) { if(a==b) return a; else if(a>b) return cmmdc(a-b,b); else return cmmdc(a,b-a); } void main() { unsigned int x,y; printf("Introduceti x: "); scanf("%u",&x); printf("Introduceti y: "); scanf("%u",&y); if(!x || !y) //daca x=0 sau y=0 printf("cmmdc(%u,%u) = 1\n",x,y); else printf("cmmdc(%u,%u) = %u\n",x,y,cmmdc(x,y)); getch();

7) S se scrie un program C, pentru rezolvarea cmmdc-ului a n numere ntregi fr semn (pentru determinarea cmmdc-ului vom folosi algritmul lui Euclid prin scderi). Varianta recursiva.
#include <stdio.h> #include <conio.h> unsigned int cmmdc_2(unsigned int a, unsigned int b) { if(a==b) return a; if(a>b) return cmmdc_2(a-b,b); else return cmmdc_2(a,b-a); } unsigned int cmmdc_n(unsigned int x[], int n) { if (n==2) return cmmdc_2(x[0],x[1]); else return cmmdc_2(cmmdc_n(x,n-1),x[n-1]); } void main() { unsigned int x[20]; int n; printf("Introduceti n: "); scanf("%d",&n); for(int i=0;i<n;i++) { printf("elementul %d= ",i+1); scanf("%u",&x[i]); } if (n==1) printf("\nCmmdc-ul numerelor: %u",x[0]); else printf("\nCmmdc-ul numerelor: %u",cmmdc_n(x,n)); getch(); }

8) Se considera urmatoarele declaratii i conventii: typedef int vector[20]; x este un vector (sir de elemente) n este lungimea sa (n>=1) Se cere sa se scrie functii recursive pentru a determina, pentru un vector x de lungime n, urmatoarele: a. citirea componentelor sirului b. afisarea elementelor din sir c. suma componentelor d. produsul componentelor e. numarul componentelor negative f. produsul componentelor pozitive g. media aritmetica a elementelor
#include<stdio.h> #include<conio.h> /* un tip propriu definit pentru memorarea sirurilor de elemente intregi, cu o dimensiune maxima de 20 de componente */ typedef int vector[20]; //functia de citire void citire(vector x,int n) //n este dimensiunea reala a sirului { //citim ultimul element din sir printf("\telementul %d: ",n); scanf("%d",&x[n-1]);

if(n>=2) citire(x,n-1); //apelul recursiv al functiei } //functia de afisare void afisare(vector x,int n) //n este dimensiunea reala (nr. de elem. din sir) { //afisam ultimul element printf("%d ",x[n-1]); if(n>=2) afisare(x,n-1); //apelul recursiv al functiei } //adunarea componentelor unui sir int suma(vector x,int n) //n in acest caz il consideram fiind indice element dinsir { if(n==-1) return 0; //situatia in care nu mai sunt elemente in sir, pozitia n=-1 nefiind in sir else return x[n]+suma(x,n-1); } //produsul componentelor int produs(vector x,int n) { if(n==-1) return 1; else return x[n]*produs(x,n-1); } //numarul de componente negative int numar_negative(vector x,int n) { //ne pozitionam pe primul element din sir si verificam dc acesta este negativ if(n==0) return (x[n]<0); //expresia conditionata va returna 1 in caz de adv. si 0 in caz de fals else return (x[n]<0)+numar_negative(x,n-1); } //produsul componentelor pozitive int produs_pozitive(vector x,int n) { if(n==0) return (x[n]>0?x[n]:1); /* am folosit operatorul de conditionare, care, daca expresia evaluata ca fi adv. se va lua in calcul x[n], altfel, valoarea 1 */ else return (x[n]>0?x[n]:1)*produs_pozitive(x,n-1); } //media aritmetica a componentelor sirului float media(vector x, int m, int n) //cu m am notat indicele elementelor, iar cu n dimensiunea reala a sirului { return (float)x[m]/n + ((m!=0)?media(x,m-1,n):0); /* - am folosit expresia (float) pentru o conversie explicita a rezultatului spre un tip real - prin x[m]/n intelegem un element (in prima faza, acesta fiind ultimul element din sir) impartit la numarul total de componente */ } //functia principala in rulare void main() { vector x; //sirul de elemente int n; //dimensiunea sa (numarul de componente citite) //realizarea operatiei de citire a sirului printf("Dati numarul de elemente: "); scanf("%d",&n); printf("Introduceti elementele sirului:\n");

citire(x,n); //realizarea operatiei de afisare a sirului printf("Sirul de elemente este: "); afisare(x,n); //sumarea elementelor printf("\nSuma elementelor: %d",suma(x,n-1)); /* am apelat cu n-1, ptr ca am spus mai sus ca acest parametru reprezinta indicele ultimului element din sir */ //produsul elementelor printf("\nProdusul elementelor: %d",produs(x,n-1)); //numarul elementelor negative din sir printf("\nNumarul elementelor negative: %d",numar_negative(x,n-1)); //produsul componentelor pozitive printf("\nProdusul elementelor pozitive: %d",produs_pozitive(x,n-1)); //media componentelor din sir printf("\nMedia componentelor din sir: %.2f",media(x,n-1,n)); /* primul parametru - sirul, al doilea parametru - indicele ultimului element din sir, al treilea parametru - dimensiunea reala a sirului (numarul de elemente citite) */ getch(); }

9) Sa se scrie o functie recursiva pentru determinarea sumei cifrelor unui numar natural. Indicatie: Se izoleaza ultima cifra, iar lui n i se atribuie ctul ntreg dintre vechea valoare i 10.
#include<stdio.h> #include<conio.h> int suma(int n) { if(!n) return 0; else return n%10+suma(n/10); } void main() { int n; printf("Introduceti numarul: "); scanf("%d", &n);

//!n=daca nu exista n

printf("Suma cifrelor numarului este: %d", suma(n)); getch(); }

10) Sa se scrie o functie recursiva pentru a transforma un numar natural n, din baza 10 n baza k (1<k<=10). Indicatie: Numarul se mparte la k, se retine restul, ctul se mparte la k, se retine restul... pna cnd ctul este mai mic dect mpartitorul. Rezultatul se obtine prin scrierea n ordine inversa a resturilor obtinute. Tiparirea restului se face dupa autoapel.
#include<stdio.h> #include<conio.h> void transform(int n,int b) { int rest=n%b; if (n>=b) transform(n/b,b);

printf("%d",rest); } void main() { int n,b; printf("n="); scanf("%d",&n); printf("baza="); scanf("%d",&b); transform(n,b); getch(); }

11) Se citeste x din Z . Se cere subprogramul pentru calculul functiei Manna-Pnuelli:


x-1, x>=12 F(x)= F(F(x+2)), x<12 #include<stdio.h> #include<conio.h> int F(int x) { if (x>=12) return x-1; return F(F(x+2)); } void main() { int x; printf("x="); scanf("%d",&x); printf("Valoarea functiei este: %d",F(x)); getch(); }

12) Se considera sirul lui Fibonacci (Un) definit astfel:


Un= 0, n=0 1, n=1 Un-1+Un-2, altfel

Se citeste n, un numar natural. Sa se calculeze Un, in varianta iterativa.


#include<stdio.h> #include<conio.h> void main() { int n,U0=0,U1=1,U2; printf("n="); scanf("%d",&n); if(!n) printf("%d",U0); else if (n==1) printf("%d",U1); else { for (int i=2;i<=n;i++) { U2=U0+U1; U0=U1; U1=U2; } printf("%d",U2); } /* ptr. n=3 i=2: U2=U0+U1 U0=U1

U1=U2 i=3: U2=U1+U2 */ getch(); }

13) Se considera sirul lui Fibonacci (Un) definit astfel:


Un= 0, n=0 1, n=1 Un-1+Un-2, altfel

Se citeste n, un numar natural. Sa se calculeze Un, in varianta recursiva.


#include<stdio.h> #include<conio.h> int U (int n) { if (!n) return 0; else if (n==1) return 1; else return U(n-1)+U(n-2); } void main() { int n; printf("Introduceti n="); scanf("%d",&n); printf("Valoarea sirului in n este: %d",U(n)); getch(); }

http://mchelariu.wordpress.com/category/c2-programare/c2_1-algoritmica/ http://andrei.clubcisco.ro/cursuri/anul-1-sem-1/programarea-calculatoarelor http://problemeinfo.3x.ro/cpp.htm

S-ar putea să vă placă și