Sunteți pe pagina 1din 8

1.

Funcii
S se scrie funcia pentru aproximarea valorii unei integrale, definit prin funcia f(x), pe un interval dat, prin metoda trapezelor. Funcia are ca parametri de intrare capetele intervalului pe care este definit integrala (a i b), numrul de diviziuni ale intervalului (n) i adresa funciei care se integreaz (f). Funcia returneaz, prin numele ei, valoarea aproximativ a integralei. Cu ct numrul de diviziuni este mai mare (lungimea unui subinterval mai mic) cu att mai bun este aproximarea.
double trapez(double a,double b,int n,double (*f)(double)) { double h,i; int j; h=(b-a)/n; i=0.0; for(j=0;j<=n;j++) i+=(*f)(a+j*h); i*=h; return i;}

i.

S se scrie funcia pentru determinare celui mai mare divizor comun dintre 2 numere naturale. Funcia are ca parametri de intrare cele dou numere (a i b) i returneaz, prin numele ei, valoarea celui mai mare divizor comun. - varianta recursiv:
long cmmdc(long a,long b) { long c; if(a==b) c=a; else if(a>b) c=cmmdc(a-b,b); else c=cmmdc(a,b-a); return c;}

ii.

- varianta iterativ:
long cmmdc(long a,long b) { long r,d=a,i=b; do {r=d%i; d=i; i=r;} while(r!=0); return d;}

tiina nvrii unui limbaj de programare. Aplicaii

S se scrie o funcie eficient pentru ridicarea unui numr la o putere natural. Funcia are ca parametri baza (b) i exponentul (e) i returneaz, prin numele ei, valoarea cerut. -varianta iterativ:
long putere(int b,int e) { long p=1; while(e) if(e%2) {p*=b;e--;} else {b*=b; e/=2;} return p;}

iii.

-varianta recursiv:
long putere(int b,int e) { long p; if(!e) p=1; else if(e%2) p=b*putere(b,e-1); else p=putere(b,e/2)*putere(b,e/=2); return p;}

S se scrie funcia pentru calcularea sumei elementelor unui masiv tridimensional. S se foloseasc diferite variante pentru transmiterea masivului ca parametru. Funcia are ca parametri de intrare masivul tridimensional (a) i dimensiunile sale efective (m, n, p). n prima variant toate cele trei dimensiuni snt precizate. n a doua variant numrul de plane este omis (facilitate permis n C). n a treia variant se trimite un pointer spre o matrice. Cele trei variante de transmitere a masivului snt echivalente.
int s1(int a[3][3][3],int m,int n,int p) { int s=0,i,j,k; for(i=0;i<m;i++) for(j=0;j<n;j++) for(k=0;k<p;k++) s+=a[i][j][k]; return(s);} int s2(int a[][3][3],int m,int n,int p) { int s=0,i,j,k; for(i=0;i<m;i++) for(j=0;j<n;j++) for(k=0;k<p;k++) s+=a[i][j][k]; return(s);} int s3(int (*a)[3][3],int m,int n,int p) { int s=0,i,j,k; for(i=0;i<m;i++)

iv.

Funcii
for(j=0;j<n;j++) for(k=0;k<p;k++) s+=a[i][j][k]; return(s);}

S se scrie funcia pentru afiarea coninutului binar al unei zone de memorie n care se afl memorat un ir de caractere. Funcia are ca parametru de intrare adresa irului de caractere care trebuie afiat i folosete o masc pentru a selecta fiecare bit al fiecrui caracter.
void bin(char *s) { unsigned char masca; while(*s) {masca=128; while(masca) {if(*s&masca)putch('1'); else putch('0'); masca>>=1;} s++; printf("\n");}}

v.

S se scrie funcia pentru aproximarea valorii soluiei unei ecuaii algebrice transcendente prin metoda biseciei. Funcia are ca parametri de intrare capetele intervalului n care se caut soluia (x0 i x1), numrul maxim de iteraii (n), precizia dorit (eps), funcia asociat ecuaiei (f) i adresa unde se va nscrie soluia. Prin numele funciei se returneaz un cod de eroare cu urmtoarea semnificaie: 0 nu s-a gsit soluie datorit numrului prea mic de iteraii sau preciziei prea mari cerute; 1 s-a obinut soluia exact; 2 s-a obinut o soluia aproximativ; 3 intervalul dat nu conine nici o soluie. -varianta iterativ
int bisectie(float x0,float x1,unsigned n,float eps,float (*f)(float), float *sol) { int cod=0; if ((*f)(x0)*(*f)(x1)>0) cod=3; else while((n)&&(!cod)) {*sol=(x0+x1)/2; if((*f)(*sol)==0) cod=1; if(fabs(x0-x1)<=eps) cod=2; else {if((*f)(*sol)*(*f)(x0)<0)x1=*sol; else x0=*sol; n--;}} return cod;}

vi.

-varianta recursiv
int bisectie(float x0,float x1,unsigned n,float eps,float (*f)(float),float *sol)

tiina nvrii unui limbaj de programare. Aplicaii


{ int cod; if ((*f)(x0)*(*f)(x1)>0) cod=3; else if (n==0) cod=0; else {*sol=(x0+x1)/2; if((*f)(*sol)==0) cod=1; else if(fabs(x0-x1)<=eps) cod=2; else {if((*f)(*sol)*(*f)(x0)<0) cod=bisectie(x0,*sol,n-1,eps,f,sol); else cod=bisectie(*sol,x1,n-1,eps,f,sol);} return cod;}

S se scrie funcia pentru aproximarea valorii soluiei unei ecuaii algebrice transcendente prin metoda tangentei. Funcia are ca parametri de intrare soluia iniial (x0), numrul maxim de iteraii (n), precizia cerut (eps), valoarea minim a tangentei (eps2), funcia asociat ecuaiei (f), derivata funciei asociate ecuaiei (fd), derivata funciei de iteraie (gd) i adresa unde se va nscrie soluia. Funcia returneaz prin numele su un cod de eroare cu urmtoarea semnificaie: 0 nu s-a gsit soluie datorit numrului prea mic de iteraii; 1 nu s-a gsit soluie datorit anulrii derivatei funciei asociate ecuaiei; 2 nu s-a gsit soluie deoarece metoda nu este convergent pentru datele primite; 3 s-a gsit soluie aproximativ. -varianta iterativ
int tangenta(float x0,int n,float eps,float eps2,float (*f)(float), float(*fd)(float),float(*gd)(float),float *x) { int cod=0; while((n)&&(!cod)) {if(fabs((*fd)(x0))<eps2) cod=1; else if(fabs((*gd)(x0))>1) cod=2; else {*x=x0-(*f)(x0)/(*fd)(x0); if(fabs(*x-x0)<eps1) cod=3; else {x0=*x; n--;} } } return cod;}

vii.

-varianta recursiv
int tangenta(float x0,int n,float eps,float eps2,float (*f)(float), float(*fd)(float),float(*gd)(float),float *x) { int cod; if(n==0) cod=0; else {if(fabs((*fd)(x0))<eps2) cod=1; else if(fabs((*gd)(x0))>1) cod=2; else {*x=x0-(*f)(x0)/(*fd)(x0); if(fabs(*x-x0)<eps1) cod=3; else cod=tangenta(*x,n-1,eps,eps2,f,fd,gd,x);} } return cod;}

Funcii

S se scrie funcia pentru calcului lui n!, recursiv i nerecursiv. Funcia are ca parametru de intrare pe n i returneaz, prin numele ei, valoarea factorialului. -varianta recursiv
long fact(long n) { long f; if (n==1)f=1; else f=n*fact(n-1); return(f);}

viii.

-varianta iterativ
long fact(long n) {long f=1; for(long i=1;i<=n;i++) f*=i; return(f);}

S se scrie funcia pentru calcularea termenului de ordin n al irului Fibonacci, recursiv i nerecursiv. Funcia are ca parametru de intrare indicele termenului pe care trebuie s l calculeze i returneaz, prin numele ei, valoarea cerut. Indicii termenilor irului ncep de la 1. -varianta iterativ
long fib(int n) { long f,a,b; int i; if ((n==1)||(n==2))f=1; else {a=1;b=1; for(i=3;i<=n;i++) {f=a+b; a=b;b=f;} } return(f);}

ix.

-varianta recursiv
long fib(int n) { long f; if ((n==1)||(n==2))f=1; else f=fib(n-1)+fib(n-2); return(f);}

tiina nvrii unui limbaj de programare. Aplicaii

S se scrie un program n care funcia main() afieaz parametrii primii n linia de comand. Funcia main() trateaz parametrii din linia de comand folosind parametrii argc i argv. Parametrul argc este de tip ntreg i reprezint numrul parametrilor din linia de comand plus 1 (primul parametru este considerat a fi numele programului executabil, cu calea complet). Parametrul argv este un vector de iruri de caractere. Fiecare element al vectorului este unul din parametrii primii de program, n ordinea primirii lor.
#include <stdio.h> main(int argc, char *argv[]) { while(argc) {printf("\n%s",*argv); argc--; argv++;} }

x.

S se scrie o funcie cu numr variabil de parametri care returneaz produsul parametrilor primii. - Numrul parametrilor variabili este transmis ca parametru fix n funcie:
int prod(int n,...) { int nr,pr; va_list vp; va_start(vp,n); pr=1; for(int i=0;i<n;i++) {nr=va_arg(vp,int); pr*=nr;} va_end(vp); return(pr);}

xi.

-Sfritul listei de parametri este marcat prin transmiterea unei valori convenionale (-1 n exemplul urmtor). Deoarece trebuie s existe cel puin un parametru fix, primul parametru este adresa unde se va depune rezultatul.
int prod(int *pr,...) {int nr; va_list vp; va_start(vp,n); *pr=1; while((nr=va_arg(vp,int))!=-1) *pr*=nr; va_end(vp); return(*pr);}

Funcii

xii. a. b. c. d. e.

S se scrie programul care, n funcie de numrul valorilor ntregi citite de la tastatur selecteaz i lanseaz automat una din funciile: f1=-1, dac nu se citete nici o valoare; f2=x2, dac se citete o valoare; f3=x*y, dac se citesc 2 valori; f4=x+y+z, dac se citesc 3 valori; f5=x*y+z*t, dac se citesc 4 valori.

Selectarea funciilor se face verificnd valoarea ntoars de funcia scanf, adic numrul parametrilor corect citii de la tastatur.
#include<stdio.h> int f1(int a, int b, int c, int d) { return -1;} int f2(int a, int b, int c, int d) { return a*a;} int f3(int a, int b, int c, int d) { return a*b;} int f4(int a, int b, int c, int d) { return a+b+c;} int f5(int a, int b, int c, int d) { return a*b+c*d;} void main() { int (*pf)(int, int, int, int); int v, x,y,z,t; switch(scanf("%d %d %d %d",&x, &y, &z, &t)) { case 0: pf=f1;break; case 1: pf=f2;break; case 2: pf=f3;break; case 3: pf=f4;break; case 4: pf=f5;break; default: break;} v=(*pf)(x,y,z,t); printf("\n Rezultat=%d",v);}

S se scrie funcia recursiv C pentru rezolvarea problemei turnurilor din Hanoi. Funcia are ca parametri numrul de discuri (n) i cele trei tije (a, b, c), n ordinea surs, destinaie, intermediar.
void Hanoi(unsigned n,unsigned a, unsigned b,unsigned c) { if(n>0){ Hanoi(n-1,a,c,b); printf("Transfer disc de pe tija %u pe tija %u\n",a,b); Hanoi(n-1,c,b,a);} }

xiii.

tiina nvrii unui limbaj de programare. Aplicaii

xiv.

k Scriei o funcie C pentru calculul recursiv al valorii C n .

Funcia are ca parametri valorile n i k i ntoarce, prin numele ei, valoarea

C .
long comb(unsigned n, unsigned k) { long rez; if (k>n) rez=0; if ((k==0)||(k=n)) rez=0; rez comb(n-1,k)+comb(n-1,k-1); return rez;}

k n

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