Documente Academic
Documente Profesional
Documente Cultură
#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 jos
functia free
}
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*/
return matr;
}
Să se scrie o funcţie care calculează cel mai mare divizor comun dintre
două numere întregi nenule, utilizînd 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 sînt nenule!");}
float a[30],el_max;
int dimensiune,nr_aparitii,pozitii[30];
maxim(a,dimensiune,&max,&nr_aparitii,pozitii);
#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);
#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 soluţia unei ecuaţii de forma f(x)=0 prin metoda
bisecţiei.
#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;}