Documente Academic
Documente Profesional
Documente Cultură
Probleme 2
Probleme 2
int** m;
int n,p;
/* se alocă spaţiu pentru vectorul cu adresele celor n linii ale
matricei */
m=(int**)malloc(m*sizeof(int*));
for(int i=0;i<m;i++)
/*se alocă spaţiu pentru fiecare linie a matricei, cîte p elemente*/
m[i]=(int*)malloc(n*sizeof(int));
3. Să se scrie o funcţie care să citească cel mult n numere întregi şi le păstreze în zona de
memorie a cărei adresă de început este dată printr-un pointer. Funcţia returnează numărul
valorilor citite.
#include<stdio.h>
#include<conio.h>
#include<math.h>
float fct(float);
/* functia principala*/
void main()
{ float a,b,eps,x;
int cod;
long n;
float (*functie)(float);
clrscr();
scanf("%f%f",&a,&b);
printf("\nEroarea admisa:");
scanf("%f",&eps);
scanf("%li",&n);
functie=fct;
bisectie(a,b,functie,eps,n,&cod,&x);
if(!cod)
else
float fct(float x)
{ return x*x*x-3*x+14;
{ 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;
}
6. Căutarea în vectori sortaţi (căutarea binară)
Fie v este un vector de numere reale sortat crescător şi k este un număr real dat. Problema este de
a identifica (dacă există) o valoare poz, astfel încât v[poz]=k. Rezolvarea ei porneşte cu luarea în
considerare a întregului vector v şi determinarea poziţiei mijlocului m= n/2 . Dacă v[m]=k,
atunci poz:=m. Dacă v[m]>k, atunci se procedează în acelaşi mod cu vectorul format din primele
m componente din v, altfel cu cel format din componentele v[m+1],…,v[n-1]. Se generează astfel
subvectori din ce în ce mai mici până când valoarea k este găsită sau până când nu mai poate fi
generat un nou subvector.
#include <stdio.h>
#include <conio.h>
void main()
{ clrscr();
printf("Dimensiunea vectorului:");
int n;
scanf("%i",&n);
printf("Elementele vectorului\n");
float v[100];
for(unsigned i=0;i<n;i++)
scanf("%f",&v[i]);
printf("Cheia de cautare:");
float k;
scanf("%f",&k);
int c=cauta_binar(v,0,n-1,k);
if(c==-1)
{ if(li>ls)
return -1;
int mij=(li+ls)/2;
if(v[mij]==k)
return mij;
if(v[mij]>k)
return cauta_binar(v,li,mij-1,k);
return cauta_binar(v,mij+1,ls,k);
Funcţia are ca parametri baza (b) şi exponentul (e) şi returnează, prin numele ei, valoarea cerută.
-varianta iterativă:
{ long p=1;
while(e)
if(e%2) {p*=b;e--;}
return p;}
-varianta recursivă:
{ long p;
if(!e) p=1;
else p=putere(b,e/2)*putere(b,e/=2);
return p;}
8. Să se scrie funcţia pentru aproximarea valorii soluţiei unei ecuaţii algebrice transcendente prin
metoda tangentei. Funcţia are ca parametri de intrare soluţia iniţială (x0), numărul maxim de
iteraţii (n), precizia cerută (eps), valoarea minimă a tangentei (eps2), funcţia asociată ecuaţiei (f),
derivata funcţiei asociate ecuaţiei (fd), derivata funcţiei de iteraţie (gd) şi adresa unde se va
înscrie soluţia. Funcţia returnează prin numele său un cod de eroare cu următoarea semnificaţie:
0 – nu s-a găsit soluţie datorită numărului prea mic de iteraţii; 1 – nu s-a găsit soluţie datorită
anulării derivatei funcţiei asociate ecuaţiei; 2 – nu s-a găsit soluţie deoarece metoda nu este
convergentă pentru datele primite; 3 – s-a găsit soluţie 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;}
-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;}
9. Să se scrie funcţia pentru calcului lui n!, recursiv şi nerecursiv. Funcţia 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);}
-varianta iterativă
long fact(long n)
{long f=1;
for(long i=1;i<=n;i++)
f*=i;
return(f);}