Setul 8

Problema 1

Implementați funcția lui Ackermann recursiv. Verificați corectitudinea calculelor folosind valori din tabelul pe care îl găsiți pe Wikipedia: http://en.wikipedia.org/wiki/Ackermann_function.

#include <stdio.h>

#include <stdlib.h>

/* functia lui Ackermann:

ack(m,n) = ack(m-1, ack(m, n-1));

ack(0,n) = n+1;

ack(m,0) = ack(m-1,1);

*/

int ackermann(int m,int n)

{

if(m==0)

return n+1;

else

if(n==0)

return ackermann(m-1,1);

else

return ackermann(m-1,ackermann(m,n-1));

}

int main()

{

printf("Hello world!\n");

int m,n;

printf("m="); scanf("%d",&m);

printf("n="); scanf("%d",&n);

printf("%d\n",ackermann(m,n));

return 0;

}

Problema 2

Implementați funcția factorial în variantă recursivă și iterativă. Comparați timpii de execuție pentru 10.000.000 de repetări ale calculului funcției factorial în varianta iterativă și cea recursivă.

#include <stdio.h>

#include <stdlib.h>

#include<time.h>

double long factr(double long n)

{

if(n==1)

return 1;

else

return n*factr(n-1);

}

double long fact(double long n)

{

double i,s=1;

for(i=1;i<=n;i++)

s=s*i;

return s;

}

int main()

{

printf("Hello world!\n");

double n,j,timp_total;

clock_t t1,t2;

printf("n=");scanf("%lf",&n);

t1=clock();

for(j=1;j<=10000;j++)

factr(n);

t2=clock();

timp_total=(double)(t2-t1)/(double long)CLOCKS_PER_SEC;

printf("Timpul recursiv: %.31f\n",timp_total);

t1=clock();

for(j=1;j<=10000;j++)

fact(n);

t2=clock();

timp_total=(double)(t2-t1)/(double long)CLOCKS_PER_SEC;

printf("Timpul nerecursiv: %.31f\n",timp_total);

return 0;

}

Problema 3 - Combinari cu repetitie

Generați combinările cu repetiție pentru o mulțime de caractere citite dintr-un fișier text. Mulțimea soluţiilor se va scrie într-un fișier text. Datele de intrare vor fi validate pentru a se asigura unicitatea caracterelor. În cazul în care datele de intrare sunt eronate se va genera o soluție pentru caracterele unice.

rezolvare partial corecta

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int n, m;

char caractere[20];

int indici[20];

void tipareste()

{

int i;

for(i=m-1;i>=0;i--)

printf("%c",caractere[indici[i]]);

printf("\n");

}

void comb_r(int k)

{

int j;

if (k==-1)

tipareste();

else

for(j=0;j<n;j++)

{

indici[k]=j;

if(indici[k]>indici[k+1])

comb_r(k-1);

}

}

int main()

{

printf("Hello world!\n");

int i,j,dim=0;

char **linii,sir[100];

FILE *f,*g;

f=fopen("bac.txt","r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului.");

exit(EXIT_FAILURE);

}

g=fopen("bac.out","w");

if(g==NULL)

{printf("Eroare la deschiderea fisierului de scriere");

fclose(f);

exit(EXIT_FAILURE);

}

linii=(char**)malloc(sizeof(char*));

while(fgets(sir,1000,f))

{

linii=(char**)realloc(linii,(dim+1)*sizeof(char*));

linii[dim]=strdup(sir);

dim++;

}

n=0;

for(i=0;i<dim;i++)

for(j=0;j<strlen(linii[i]);j++)

{caractere[n]=linii[i][j];

n++;

}

printf("Am citit %d caractere:\n",n);

for(i=0;i<n;i++)

printf("%c", caractere[i]);

printf("\n");

do

{

printf("m=");scanf("%d",&m);

}while((m<=0)||(m>n));

for(i=0;i<=m;i++)

indici[i]=-1;

comb_r(m-1);

for(i=0;i<dim;i++)

free(linii[i]);

free(linii);

fclose(f);

fclose(g);

return 0;

}

Problema 4 - Functie cu numar variabil de argumente

Scrieţi o funcție cu număr variabil de argumente care primește ca prim parametru un număr N, iar ca următorii N parametri primește N numere reale. Funcția va returna suma celor N numere reale. Verificați funcția prin câteva apeluri ale ei cu diverse seturi de parametri.

#include <stdio.h>

#include <stdlib.h>

float functie(unsigned N,...)

{

va_list ap;

int i;

float suma=0;

va_start(ap,N);

for(i=0;i<N;i++)

suma=suma+va_arg(ap,float);

va_end(ap);

return suma;

}

int main()

{

printf("Hello world!\n");

float suma;

suma=functie(4,3.4,3.0,2.0,0.6);

printf("%f\n",suma);

suma=functie(2,3.0,2.0);

printf("%f\n",suma);

return 0;

}