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;
}