solutii la probleme propuse
TRANSCRIPT
SOLUTII LA PROBLEME PROPUSE
// R3.1
// determinare nr de cifre la p.intreaga a unui nr. dat
int digits (double x)
return nc;
}
// varianta mai simpla ptr functia digits
int digits(double x)
// afisare vector de numere cu tabelare automata
void main ()
// printf ("nr. max. cifre=%d \n",max);
// afisare vector
nv=80/(max+1); // nr. maxim de coloane
for ( i=0;i<n;i++)
}
// R3.2
// verifica daca este numar prim
int prim ( int n)
// verif. ipotezei lui Goldbach
main ()
// R3.3
// factorul de multiplicitate al lui b in a
int mult (int a, int b, int * c)
*c=a;
return k;
}
// descompunere in factori primi
void main ()
printf("\n");
}
// varianta pentru functia "mult" (cu alt mod de folosire)
void mult (int a, int b, int * m, int *c)
*c=a; *m=k;
}
// R3.4
// determina pozitie maxim in vector de numere
int imax ( float x[], int n)
// ordonare vector
void sort ( float x[], int n)
}
// verificare
void main () ;
int i, n = sizeof(t)/sizeof(t[0]);
sort (t,n);
for (i=0;i<n;i++)
printf ("%.2f ",t[i]);
}
// R3.5
#include <stdio.h>
#include <math.h>
// semn numar algebric = -1 sau 1 sau 0
int sign (int x)
// determinare cadran
int cadran ( int x, int y)
}
// verificare functii
void main () while (1);
}
// R3.6
// cautare binara, nerecursiva
int caut(int b,int a[],int i,int j)
return -1;
}
// cautare binara, recursiva
int caut(int b,int a[],int i,int j)
}
// R3.7
// operatii cu multimi de biti
#include <stdio.h>
#define DIM 16
typedef unsigned int Set[DIM];
// initializare multime vida
void init (Set m)
// adauga la multimea m valoarea x
void add (Set m,int x)
// reuniune de multimi ( c=a+b)
void or (Set a, Set b, Set c)
// intersectie de multimi (c=a&b)
void and (Set a, Set b, Set c)
// diferenta simetrica de multimi
void xor (Set a, Set b, Set c)
// diferenta de multimi (c=a-b)
void dif (Set a, Set b, Set c)
// verifica aparteneta la multimea m a lui x
int is (Set m,int x)
// afisarea multimii m
void print (Set m)
\n");
}
// verificarea unor functii
main()
// R3.8
// operatii cu multimi reprezentate prin vectori neordonati
#include <stdio.h>
#define M 256 // dimensiune maxima vectori (multimi)
// initializare multime vida
void init (int a[])
// test daca o valoare data apartine unei multimi
int contine (int a[], int x)
// dimensiunea (cardinalul) unei multimi
int dim (int a[])
// adaugare element la o multime
void plus (int a[], int x)
// eliminare valoare data dintr-o multime
void minus (int a[], int x)
}
// afisarea elementelor unei multimi
void scrie (int a[])
printf (" } \n");
}
// reuniune de multimi
void plusm (int a[],int b[], int c[])
// intersectie de multimi
void inters (int a[],int b[], int c[])
// diferenta de multimi a-b
void minusm (int a[], int b[], int c[])
// comparatie la egalitate multimi
int egal (int a[], int b[])
// citire multime vector
int citmul (int a[]) while (a[i-1]);
return i;
}
// verificare functii
void main ()
// R3.9
#include <stdio.h>
// calcul valoare polinom ptr un x dat
long valPol ( int c[], int n, int x)
// vector cu divizorii unui intreg dat (pozitivi si negativi)
int div (int n, int d[])
return j;
}
// impartire polinom prin x-r
void impPol (int a[],int n, int b[], int r)
// radacini intregi ec. polinomiala
void main ()
}
} while (nr>0);
// scrie coeficienti polinom fara radacini intregi
// return ;
if (n >1)
}
// R3.10
#include <stdio.h>
// Interpolare Lagrange
float lagrange ( float x[], float y[], int n, float xx)
return s;
}
// program principal
void main ()
// creare vector de n-1 puncte prin interpolare
for (i=1;i<n;i++)
for (i=1;i<=n-1;i++)
printf ("%f %f \n", xm[i],ym[i]);
}
// R3.11
#include <stdio.h>
// produs dintre un polinom si un binom
// (a[n]+a[n-1]*x+...+a[0]*x^n)(x+c) = b[n+1]+b[n]*x+...+b[0]*x^(n+1)
int prodpoli (int a[], int n, int c, int b[])
// calcul produs (x+c[0])*(x+c[1])* ...(x+c[n-1])=b[n]+b[n-1]*x+...+b[0]*x^n
void produs (int c[], int n, int b[])
}
// verificare functii
void main ()
// R3.12
int cmmdc (int a,int b)
// R3.13
// recursiv
void binar (int n)
else
printf("0");
}
// iterativ (cu vector)
void binar2 ( int n)
printf ("%d\n",i);
// scrie vector in ordine inversa
while (i>0)
printf ("%d",c[--i]);
}
// R3.14
// cautare secventiala recursiva intr-un vector
int lsearch (int a[], int n, int b)
// R3.15
#include <stdio.h>
#define M 20 // dimensiuni matrice
typedef float num;
typedef num mat[M][M]; // definire tip "mat"
// generare matrice unitate
void matunit ( mat u,int n)
// produs matrice patratice
void prodmat ( mat a, mat b, mat c,int n)
// copiaza din t in c
for (i=0;i<n;i++)
for (j=0;j<n;j++)
c[i][j]=t[i][j];
}
// afisare matrice
void scrmat (mat a, int n)
}
// ridicare la putere matrice
void expmat (mat a,int n,int k, mat p)
// verificare functii
void main () ,,};
mat b,c ;
matunit(b,n);
prodmat (a,b,a,n);
scrmat (a,n);
// ridicare la putere matrice
expmat (a,n,2,c);
scrmat(c,n);
}
// R3.16
#include <stdio.h>
#define M 10 // nr maxim linii/coloane
typedef float mat[M][M];
// schimba intre ele doua linii dintr-o matrice patratica
void schimb ( mat a, int n, int i, int j)
}
// aducere valori nenule pe diagonala unei matrice patratice
// rezultat 1 daca a reusit si 0 daca nu a reusit
int transf (mat a, int n)
if (gasit) continue;
else return 0;
}
return 1;
}
// verificare functie
void main ()
i=transf (a,n); // transforma matricea a
if (i==0)
for (i=1;i<=n;i++)
}
SOLUTII LA PROBLEME PROPUSE
// R4.1
// lungime sir terminat cu zero
int strlen ( char * s)
// copiaza sir la adresa d de la adresa s
char * strcpy ( char * d, char * s)
// concatenare sir s in prelungirea sirului d
char * strcat (char * d, char * s)
// cauta un caracter c intr-un sir d
char * strchr (char * d, char c)
// cauta ultima aparitie a lui c in sirul d
char * strrchr (char * d, char c)
// comparare de siruri
int strcmp ( char * s1, char * s2) while ( *s1++ && *s2++);
return 0; // siruri egale pe toata lungimea
}
// cauta sirul s in sirul d
char * strstr ( char *d, char * s)
if ( *ps == 0)
return d;
else
++d;
}
return 0;
}
// R4.2
// echivalenta cu "strncpy"
char * stcpy (char* d, char * s,int n)
*d=0; return dd;
}
// echivalenta cu "strncat"
char * stcat (char* d, char * s,int n)
*d=0; return dd;
}
// echivalenta cu "strncmp"
int stcmp ( char * d, char *s, int n)
if (n==0 || (*d==0 && *s==0) )
return 0; // siruri egale
else
if (*d < *s)
return -1;
else
return 1;
}
// R4.3
/* sterge n caractere de la adresa d */
void strdel (char *d, int n)
// insertie sir s la adresa d
void strins (char *d, char *s)
// varianta de insertie sir
void strins (char *d, char *s)
// alta varianta de insertie sir s la adresa d
void strins (char *d, char *s)
// R4.4
// inlocuieste in txt toate apritiile lui s1 prin s2
void main ()
puts (txt); // afisare text dupa inlocuire
}
// R4.5
// extragere subsiruri dintr-un sir (var.1)
void data (char * d, int r[3])
// extragere subsiruri dintr-un sir (var. 2)
void data (char *d, int r[])
// verificare
void main ()
// R4.6
// afisare si numarare cuvinte
// (a) cu "strtok"
main ()
printf ("%d atomi \n", nt);
}
// afisare si numarare cuvinte (atomi)
// (b) cu "sscanf"
main ()
printf ("%d atomi \n", nt);
}
// R4.7
char *strtok2 (char * sir,char *separ, char * tok)
}
// afisare si numarare cuvinte (atomi)
main ()
printf ("%d atomi \n", nt);
}
// R4.8
// extrage de la adresa adr un sir de litere la adresa rez
char * nextword ( char * adr, char * rez)
// R4.9
// frecv de utilizare a unor cuvinte cheie
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// cauta in tabel de cuv cheie
int keyw ( char * nume, char * kw[], int n )
// extrage de la adresa adr un cuvint la adresa rez
char * next ( char * adr, char * rez)
void main () ;
int nr[5]=; // nr de aparitii ptr fiecare cuvint
int k,lc,n=5; // lungime vectori kw si nr
printf ("nume fisier: "); scanf("%s",buf);
f=fopen (buf,"r");
if (f==NULL)
while ( fgets(buf,128,f)!=0 )
}
for (k=0;k<n;k++)
printf ("%8s = %d \n",kw[k],nr[k]);
}
// R4.10
// compara doua siruri dupa cuvantul k din sir (k=0,1,..)
int compar ( char * a, char * b, int k)
return strcmp(w1,w2);
}
// ordonare linii din fisier text dupa orice cuvant din linie
void main ( int argc, char * argv[])
} while (!gata);
// afisare fisier ordonat
puts("");
for (k=0;k<n;k++)
printf("%s",tlin[k]);
}
// R4.11
typedef char word[30]; // un cuvint
// functie care cauta un sir intr-un vector de siruri
int caut ( word w, word t[], int n)
// program principal
void main () {
FILE * f; char numef[50]; // nume fisier text
word cuv[300]; // tabel de cuvinte
int nr[300]=; int n,k,lc;
char linie[80], * adr, *sep=" \t\n";
puts("Nume fisier:"); gets(numef);
f=fopen(numef,"r"); //deschide fisier
n=0; // nr de cuvinte in vector
while ( fgets(linie,80,f) != 0)
adr=strtok(0,sep); // urmatorul cuvant
}
}
// afisare rezultate
for (k=0;k<n;k++)
if ( nr[k] > 1)
printf ("%s %d \n", cuv[k],nr[k]);
}
// R4.16
// conversie din HTML in text ASCII
#include <stdio.h>
#include <string.h>
void main ()
tag=0;
while ( fgets(hline,132,html) )
}
*p2=0;
fputs (tline,text);
}
fclose(text);
}
SOLUTII LA PROBLEME PROPUSE
// R5.1
// produs de numere complexe
void prod_cx (Complex a, Complex b, Complex* pc)
// ridicare complex la putere intreaga
void put_cx (Complex a, int n, Complex * pc) ; int k;
for (k=0;k<n;k++)
prod_cx (a,c, &c);
*pc=c;
}
// valoare polinom de variabila complexa
void pol_cx ( int n, Complex c[], Complex x, Complex* rez)
*rez=sum;
}
// verificare functii
void main ()
// R5.2
#include <stdio.h>
// operatii cu momente de timp
typedef struct Time;
// verifica daca timp plauzibil
int corect (Time t)
// citire ora
Time rdtime () while (1);
return t;
}
// scrie ora
void wrtime ( Time t)
// compara momente de timp
int cmptime (Time t1, Time t2)
main () while (1);
}
// R5.4
// structuri in probleme geometrice : punct, poligon etc.
#include <stdio.h>
#include <math.h>
typedef double Real;
typedef struct Punct;
typedef struct Poligon;
// lungime segment delimitat de doua puncte
Real lung (Punct a, Punct b)
// calcul primetru poligon
Real perim ( Poligon p)
// verificare
void main ()
// R5.5
#include <stdio.h>
#include <stdlib.h>
#define INCR 100 // cu cat creste vectorul
typedef int T; // tip componente vector
typedef struct vf Vector;
// initializare vector
void initVec (Vector * v)
// adaugare element la vector
void addVec ( Vector * v, T x)
v->vec[v->dim]=x; v->dim ++;
}
// afisare vector
void printVec ( Vector v)
// afisare valoare de tip T
void printT (T x)
// creare si afisare vector
void main()
// R5.6
// frecventa de aparitie a cuvintelor, cu vector de structuri
#include <stdio.h>
#include <string.h>
#define MAXL 16 // nr maxim de litere dintr-un cuvant
#define MAXW 1000 // nr. maxim de cuvinte}
typedef struct Per; // pereche cuvint-numar
typedef struct Dic;
void initDic (Dic * d)
void printDic (Dic d)
// cautare/adaugare in dictionar
void addDic (Dic * d, char* w)
else // daca este o alta aparitie a unui cuvint
d->tc[i].na ++; // incrementare nr de aparitii
}
// creare si afisare dictionar
void main ()
// R5.7
// dictionar ca structura cu doi vectori
#include <stdio.h>
#include <string.h>
#define MAXL 16 // nr maxim de litere dintr-un cuvant
#define MAXW 1000 // nr. maxim de cuvinte
typedef struct Dic;
// initializare
void initDic (Dic * d)
// afisare dictionar
void printDic (Dic d)
// pune pereche cheie-valoare in dictionar
void putDic (Dic * d, char* cuv, int n)
else // cheie existenta
d->tf[i]=n;
}
// citire valoare asociata unei chei date
int getDic (Dic d, char * cuv)
// creare si afisare ductionar
void main ()
// R5.8
#include <stdio.h>
#include <stdlib.h>
#define M 10 // dimensiune initiala multime
typedef struct set * Set;
// initializare multime vida
void init (Set a)
// test daca o valoare data apartine unei multimi
int contine (Set a, int x)
// adaugare element la o multime
void plus (Set a, int x)
a->val[ a->n]=x; // adauga elem la multime
a->n ++; // creste numar de elemente din multime
}
// afisarea elementelor unei multimi
void scrie (Set a) \n");
}
// reuniune de multimi
void plusm (Set a, Set b, Set c)
// intersectie de multimi
void inters (Set a, Set b, Set c)
// diferenta de multimi a-b
void minusm (Set a, Set b, Set c)
// citire valori si creare multime
void citmul (Set a) while (x);
}
// program principal
void main ()
// R5.10
#include <stdio.h>
#include <assert.h>
#include <string.h>
// structura articole fisier
typedef struct Bon;
// adaugare bonuri la sfarsit de fisier (si creare fisier)
void adaugare (char * numef)
else
f=fopen (numef,"ab"); // pozitionare pe afarsit de fisier
puts ("Introducere bonuri si creare fisier \n");
printf (" nume, cantitate, valoare : \n\n");
while (scanf ("%s %d %ld ",b.nume, &b.cant, &b.val) != EOF)
fwrite(&b,sizeof(b),1,f);
fclose (f);
}
// afisarea tuturor bonurilor din fisier
void listare (char* numef)
// afisare si totalizare bonuri pentru un produs dat
void total (char * numef)
printf (" Valoare totala = %ld\n", sum);
fclose (f);
}
// afisare meniu si tratare optiuni
void main ()
getchar(); // pentru mentinere rezultate
} while ( opt[0] != 'x');
}
SOLUTII LA PROBLEME PROPUSE
// R6.5
#include <stdio.h>
#include <stdlib.h>
// definire tip Set
typedef struct * Set;
// initializare multime de n elemente
void init (Set m, int n)
// adauga un element la multime
void addelem (Set m,int el)
// adunare (reuniune) multimi
void add (Set a, Set b, Set c)
// intersectie de multimi
void inters (Set a, Set b, Set c)
// apartenenta la multime
int este(Set m,int el)
// nr de elemente in multime
int size ( Set m)
// afisare multime
void printset(Set m) \n");
}
// copiere multime
void clone ( Set a, Set c)
// verificare functii
void main()
// R6.6
// numere lungi ca sir de cifre bcd (o cifra pe octet)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char* bcd;
// conversie din ascii in bcd
bcd asc_bcd (char a[])
// conversie din bcd in ascii
void bcd_asc (bcd b, char a[])
// adunare de numere bcd
bcd add_bcd (bcd b1, bcd b2)
if (t)
return b3;
}
// verificare functii
void main () while (1);
}
// R6.7
#include <stdio.h>
#include <stdlib.h>
typedef struct Elem;
typedef struct Mat;
// citire matrice rara
void readMat ( Mat * p)
}
// afisare integrala matrice rara
void printMat (Mat * p)
else
printf ("%6.2f ",0);
printf("\n");
}
}
void main ()