Exemplu (alocarea dinamică a unui text

):
#include <stdlib.h> #include <stdio.h> char *citire_text(void); void main(void) { char *g_text; puts(""); if ( g_text=citire_text() ) // daca s-a reusit citirea printf("\ntextul citit:\n%s", g_text); free(g_text); // elibereaza zona de memorie; vezi mai functia free }

jos

char *citire_text(void) { char *text=NULL; // se creează un pointer care se initializeaza cu NULL (pointer vid), pentru ca realloc sa se comporte ca si malloc la prima apelare char c; int n=0; while ( (c=getchar()) != EOF) { if((text=(char*)realloc( text, (n+2)*sizeof(char) ))==NULL) return NULL; // a aparut o eroare text[n]=c; ++n; } // n+2 = n+1 elem(deoarece n porneste de la 0) + 1 pentru'\0' text[n]='\0'; // termintorul de sir return text; // returneaza adresa sirului de caractere citit }

&m). printf("N=").h> /* problema care citeste si afiseaza o matrice alocata dinamic. i++ ) matr[i]=matr[0]+i*(*am). i<n. m). int m). printf("M="). for( i=0. void main(void) { int **matr. } int citire_matr(int **matr.am ). functia returneaza NULL // se aloca memorie pentru matricea efectiva if ( ( matr[0]=(int *)calloc((*an)*(*am). j. int m). m. &n. // daca nu se aloca mem. n. j++) { //punem in tabl matr adresele . k=0. int *am). int *an. int n. scanf("%d". i<*an. // se aloca memorie pentru pointerii unde se stocheaza inceputul adresa liniilor if ( (matr=(int **)calloc(*an. i++ ) for (j=0. functia returneaza NULL for( i=1. int n. // se termina programul } afisare_matr(matr. m). celr n linii din matrice return matr. int n. printf("\nmatricea are N linii si M coloane\n"). return.h> #include <stdio. int *an.#include <stdlib. int citire_matr(int **matr. scanf("%d". else { printf("eroare la alocare").sizeof(int)))==NULL ) // operatorul cast return NULL. j<m.sizeof(int *) ) )==NULL ) return NULL. int m) { int i. matricea este alocata astfel incat sa poata fi accesata ca o matrice alocata static*/ int **alocare_matr(int **matr. n. int *am) { int i. n. // daca nu se aloca mem. j. void afisare_matr(int **matr.an ). } int **alocare_matr(int **matr. if (matr!=NULL) //s-a putut aloca memorie citire_matr(matr. matr=alocare_matr(matr.

} return k.cmmdc(n1. i++ ) { for (j=0. void main() { int n1. return i. int n.cmmdc(n1. #include <stdio. j. if(n1&&n2) printf("\ncmmdc=%d".n2. d=i. do {r=d%i.&n1.n2)). i=r. int).h> /*definirea functiei cmmdc*/ int cmmdc(int a.h> /* prototipul functiei cmmdc*/ int cmmdc(int. Să se scrie o funcţie care calculează cel mai mare divizor comun dintre două numere întregi nenule. scanf("%d%d". matr[i][j] ). i<n.i=b. comportament identic // k=k+scanf("%d". i=r.n2. *(*(matr+i)+j) ).} Acelaşi exemplu folosind prototip pentru funcţia cmmdc: #include <stdio.&n2).} /*definirea functiei cmmdc*/ int cmmdc(int a. int m) { int i. int b) { int r. printf("Numerele pentru care se va calcula cmmdc:"). printf("\n").} . } void afisare_matr(int **matr. printf("Numerele pentru care se va calcula cmmdc:"). (*(matr+i)+j) ). int b) { int r.} void main() { int n1. do {r=d%i. j++) printf("%d ".d=a. utilizînd algoritmul lui Euclid şi un apelant pentru testare.i=b.} while(r<>0).d=a. else printf("Numerele nu sînt nenule! "). d=i. j). return i. j<m. if(n1&&n2) printf("\ncmmdc=%d".printf("a[%d][%d]=". for( i=0. scanf("%d%d".} while(r<>0).&n2). } } //sau. i.n2)). else printf("Numerele nu sînt nenule!"). k=k+scanf("%d".&n1.

for(*max=v[0]. #include<malloc. maxim(a. float v[].i<n. int n) { float *p.} else if(*max==v[i])poz[*nr_ap++]=i.int *nr_ap.pozitii[30].j.j++) p[i]+=a[i][j]*v[j].b[30].j<n. ps(a. for(i=0. poz sînt parametri de ieşire).i<n.Să se calculeze produsul scalar dintre doi vectori. return prod. a) rezultatul se întoarce prin numele funcţiei: float ps(float x[].} Apelul se realizează astfel: float a[30].int n. int n.&nr_aparitii.&max.int m. Să se calculeze elementul maxim dintr-un vector şi poziţiile tuturor apariţiilor acestuia (v.i<m.} Apelul se realizează astfel: float a[30]. max=v[i]. float y[]. b) rezultatul se întoarce prin parametru de ieşire: void ps(float x[]. n sînt parametri de intrare.dimensiune. for(i=0.&produs_scalar).dimensiune. int n) { int i.b.i++) if(*max<v[i]) {*nr_ap=1. nr_ap.prod+=x[i]*y[i++]).(*prod)+=x[i]*y[i++]).produs_scalar.pozitii). printf("Produsul scalar al vectorilor a si b este:%f".prod=0.i=1.j=0. produs_scalar). ……………… printf("Produsul scalar al vectorilor a si b este:%f".i++) for(p[i]=0.h> …………………… float * prod(float a[][30].b.b[30].nr_aparitii.dimensiune)). int dimensiune.int i. ps(a. float *prod) { int i.el_max. void maxim(float v[]. Să se calculeze produsul dintre o matrice şi un vector. float y[].} Apelul se realizează astfel: float a[30].i<n. . max.float *max. for(i=0.int poz[]) { int i. int dimensiune. *prod=0. int dimensiune.poz[0]=i. p=(float *)malloc(sizeof(float)*m).

j.m++). for(l=0. Să se realizeze un program C pentru ridicarea unei matrice la o putere.l.return p. clrscr().} .**ap.j. *(*(a+i)+j)=f.i++) *(ap+i)=(float *)malloc(n*sizeof(float)).int n) { float **c. prin pointeri. scanf("%i". printf("\n n="). Pentru aceasta se folosesc două funcţii care returnează.i++) {c=inmultire(a. produsul a două matrice (înmulţire).} return ap.int n) { int i. float **a.i<n. ap=(float **)malloc(n*sizeof(float *)).p.ap.m<n.*((*(ap+i)+j))).k.j<n.i.i<n. a=(float **)malloc(n*sizeof(float *)).ap[l][m]=a[l][m].ap[l][m]=c[l][m].i<n. for(i=0. for(i=0.c[i][j]+=a[i][k]*b[k++][j]). for(i=0.l<n. printf("\n").i++) *(a+i)=(float *)malloc(n*sizeof(float)). b[30].h> float** inmultire(float **a.int l.} float** putere(float **a.j++) {scanf("%f ". float **c.h> #include<alloc. for(l=0.float **b. ap=putere(a.l++) for(m=0.i<n. for(i=0. int m.c[i][j]=0.m++).j<n.l<n.n.i++) *(c+i)=(float *)malloc(n*sizeof(float)). c=(float **)malloc(n*sizeof(float *)). ………………………… c=prod(a. for(i=0.f.n.m.m.k<n.i++) {for(j=0.i<n.n).} getch().int p.n).b.p.h> #include<conio.i++) for(j=0.&f).} void main() { int i.**ap.j<n. for(i=0. respectiv ridicarea unei matrice la o putere (putere).i<n.i<p-1.n). #include<stdio.j++) printf("%f ".&n). return c. *c.j++) for(k=0.} scanf("%i".l++) for(m=0.m. for(i=0.&p).m<n.} Apelul se realizează astfel: float a[20][30].i++) for(j=0.

int cod.c++) {*x=(a+b)/2. if ((*f)(*x)*(*f)(a)<0)b=*x.long.(c<n)&&!gata.float. printf("Introduceti capetele intervalului:"). if(!cod)printf("\nNu se poate calcula solutia aproximativa").long n.float(*f)(float).b. /*prototipul functiei pentru care se aplica metoda bisectiei*/ float fct(float). /* functia principala*/ void main() { float a. gata=fabs(*x-a)<eps.} /*functia ce implementeaza metoda bisectiei*/ void bisectie(float a. long c.x.&eps). printf("\nEroarea admisa:"). clrscr().float b. scanf("%f%f".&x).&n).long n.b.functie.float *x) { int gata=0.n.x). else a=*x.} /*descrierea functiei pentru care se aplica metoda bisectiei*/ float fct(float x) { return x*x*x-3*x+14.eps.&b).float (*f)(float). for(c=0.float *). float (*functie)(float). #include<stdio. else printf("\n Solutia aproximativa este: %f".&cod.Să se aproximeze soluţia unei ecuaţii de forma f(x)=0 prin metoda bisecţiei.h> #include<conio.h> /*prototipul functiei bisectie*/ void bisectie(float. scanf("%li".float eps.h> #include<math. printf("\nNumarul maxim de termeni construiti:").} *cod=gata. functie=fct.eps. bisectie(a.int *.float. scanf("%f".} . int *cod.&a.

Sign up to vote on this title
UsefulNot useful