Sunteți pe pagina 1din 6

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 }

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

//punem in tabl matr adresele

printf("a[%d][%d]=", i, j); k=k+scanf("%d", (*(matr+i)+j) ); comportament identic // k=k+scanf("%d", matr[i][j] ); } return k; } void afisare_matr(int **matr, int n, int m) { int i, j; for( i=0; i<n; i++ ) { for (j=0; j<m; j++) printf("%d ", *(*(matr+i)+j) ); printf("\n"); } }

//sau,

S se scrie o funcie care calculeaz cel mai mare divizor comun dintre dou numere ntregi nenule, utiliznd algoritmul lui Euclid i un apelant pentru testare. #include <stdio.h> /*definirea functiei cmmdc*/ int cmmdc(int a, int b) { int r,d=a,i=b; do {r=d%i; d=i; i=r;} while(r<>0); return i;} void main() { int n1,n2; printf("Numerele pentru care se va calcula cmmdc:"); scanf("%d%d",&n1,&n2); if(n1&&n2) printf("\ncmmdc=%d",cmmdc(n1,n2)); else printf("Numerele nu snt nenule!");}

Acelai exemplu folosind prototip pentru funcia cmmdc: #include <stdio.h> /* prototipul functiei cmmdc*/ int cmmdc(int, int); void main() { int n1,n2; printf("Numerele pentru care se va calcula cmmdc:"); scanf("%d%d",&n1,&n2); if(n1&&n2) printf("\ncmmdc=%d",cmmdc(n1,n2)); else printf("Numerele nu snt nenule! ");} /*definirea functiei cmmdc*/ int cmmdc(int a, int b) { int r,d=a,i=b; do {r=d%i; d=i; i=r;} while(r<>0); return i;}

S se calculeze produsul scalar dintre doi vectori. a) rezultatul se ntoarce prin numele funciei: float ps(float x[], float y[], int n) { int i,prod=0; for(i=0;i<n;prod+=x[i]*y[i++]); return prod;} Apelul se realizeaz astfel: float a[30],b[30]; int dimensiune; printf("Produsul scalar al vectorilor a si b este:%f", ps(a,b,dimensiune)); b) rezultatul se ntoarce prin parametru de ieire: void ps(float x[], float y[], int n, float *prod) { int i; *prod=0; for(i=0;i<n;(*prod)+=x[i]*y[i++]);} Apelul se realizeaz astfel: float a[30],b[30],produs_scalar; int dimensiune; ps(a,b,dimensiune,&produs_scalar); printf("Produsul scalar al vectorilor a si b este:%f", produs_scalar);

S se calculeze elementul maxim dintr-un vector i poziiile tuturor apariiilor acestuia (v, n snt parametri de intrare; max, nr_ap, poz snt parametri de ieire). void maxim(float v[],int n,float *max,int *nr_ap,int poz[]) { int i; for(*max=v[0],i=1;i<n;i++) if(*max<v[i]) {*nr_ap=1;poz[0]=i; max=v[i];} else if(*max==v[i])poz[*nr_ap++]=i;} Apelul se realizeaz astfel: float a[30],el_max; int dimensiune,nr_aparitii,pozitii[30]; maxim(a,dimensiune,&max,&nr_aparitii,pozitii);

S se calculeze produsul dintre o matrice i un vector. #include<malloc.h> float * prod(float a[][30], float v[],int m, int n) { float *p;int i,j; p=(float *)malloc(sizeof(float)*m); for(i=0;i<m;i++) for(p[i]=0,j=0;j<n;j++) p[i]+=a[i][j]*v[j];

return p;} Apelul se realizeaz astfel: float a[20][30], b[30], *c; int m,n; c=prod(a,b,m,n);

S se realizeze un program C pentru ridicarea unei matrice la o putere. Pentru aceasta se folosesc dou funcii care returneaz, prin pointeri, produsul a dou matrice (nmulire), respectiv ridicarea unei matrice la o putere (putere). #include<stdio.h> #include<conio.h> #include<alloc.h> float** inmultire(float **a,float **b,int n) { int i,j,k; float **c; c=(float **)malloc(n*sizeof(float *)); for(i=0;i<n;i++) *(c+i)=(float *)malloc(n*sizeof(float)); for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0,c[i][j]=0;k<n;c[i][j]+=a[i][k]*b[k++][j]); return c;} float** putere(float **a,int p,int n) { float **c,**ap;int l,m,i; ap=(float **)malloc(n*sizeof(float *)); for(i=0;i<n;i++) *(ap+i)=(float *)malloc(n*sizeof(float)); for(l=0;l<n;l++) for(m=0;m<n;ap[l][m]=a[l][m],m++); for(i=0;i<p-1;i++) {c=inmultire(a,ap,n); for(l=0;l<n;l++) for(m=0;m<n;ap[l][m]=c[l][m],m++);} return ap;} void main() { int i,j,p,n,l,m; float **a,**ap,f; clrscr(); printf("\n n="); scanf("%i",&n); a=(float **)malloc(n*sizeof(float *)); for(i=0;i<n;i++) *(a+i)=(float *)malloc(n*sizeof(float)); for(i=0;i<n;i++) for(j=0;j<n;j++) {scanf("%f ",&f); *(*(a+i)+j)=f;} scanf("%i",&p); ap=putere(a,p,n); for(i=0;i<n;i++) {for(j=0;j<n;j++) printf("%f ",*((*(ap+i)+j))); printf("\n");} getch();}

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

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