Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  

 
CATEGORII DOCUMENTE






AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


PROGRAMARE IN LIMBAJUL C - CULEGERE DE PROBLEME

c

+ Font mai mare | - Font mai mic


DOCUMENTE SIMILARE

Trimite pe Messenger
Probleme grafuri
Siruri de caractere
Derivare publica, functii virtuale
INSTRUCTIUNI DE CICLARE: for, while, break
Structuri elementare de date
Verificarea existentei a x elemente pare intr-o lista liniara
crearea unei liste liniare si determinarea primului element par
Struct (inregistrarea)
STRUCTURI DE DATE EXTERNE - SPECIFICUL DATELOR PE SUPORT EXTERN
Determinarea elementului mediu

TERMENI importanti pentru acest document

cum se aduna 2 polinoame in c programare :

PROGRAMARE IN LIMBAJUL C

CULEGERE DE PROBLEME

1. PROGRAME CU DATE NUMERICE (INSTRUCTIUNI SI OPERATII DE I/E)

2. PROGRAME CU VECTORI SI MATRICE

3. DEFINIREA SI UTILIZAREA DE FUNCTII

4. PROGRAME SI FUNCTII CU SIRURI DE CARACTERE

5. PROGRAME SI FUNCTII CU STRUCTURI

6. PROGRAME CU DATE ALOCATE DINAMIC

1. PROGRAME CU DATE NUMERICE

(UTILIZARE INSTRUCTIUNI SI FUNCTII DE I/E)

EXEMPLE DE PROGRAME

Exemple de afisare pe ecran si citire de la tastatura

E1.1 Afisarea unui text constant pe ecran.

#include <stdio.h>

void main ()

E1.2 Afisarea valorilor unor variabile intregi

#include <stdio.h>

void main ()

E1.3 Afisare text constant si valori variabile intregi

#include <stdio.h>

void main ()

E1.4 Citire si afisare numar intreg

#include <stdio.h>

void main ()

E1.5 Citire si afisare numer intreg lung

#include <stdio.h>

void main ()

E1.6 Citire si afisare numar real

#include <stdio.h>

void main ()

E1.7 Afisare rezultat functie de tip 'double'

#include <stdio.h>

#include <math.h>

void main ()

E1.8 Afisare rezultat functie, dupa conversie la intreg.

#include <stdio.h>

#include <math.h>

void main ()

E1.9 Afisare cu o precizie dorita

#include <stdio.h>

#include <math.h>

void main ()

E1.10 Afisarea unor numere pe coloane de dimensiuni egale

#include <stdio.h>

void main ()

E1.11 Afisare numere reale foarte mari sau foarte mici (cu exponent)

#include <stdio.h>

#include <math.h>

void main ()

Exemple cu expresii si instructiuni de atribuire

E1.12 Calcul arie triunghi cu laturi date

#include <stdio.h>

#include <math.h>

void main ()

E1.13 Calculul unghiuri dintr-un triunghi (in radiani)

#include <stdio.h>

#include <math.h>

void main ()

E1.14 Calcul lungime si panta segment dintre doua puncte date

#include <stdio.h>

#include <math.h>

#include <values.h>

void main ()

E1.15 Afisare cat si rest impartire intreaga numere cu semn.

#include <stdio.h>

void main ()

Exemple cu instructiuni 'if' si 'switch'

Directiva 'include <stdio.h>' si altele necesare nu mai apar in toate

exemplele, dar trebuie adaugate pentru compilarea corecta a programelor.

E1.16 Verifica daca un caracter dat este o litera ( fie mare, fie mica)

void main ()

char ch;

ch= getchar();

if ( ch >='a' && ch <='z' || ch >='A' && ch <='Z' )

printf ('este litera n');

else

printf (' nu este litera n');

}

E1.17 Determinare maxim dintre trei numere intregi

void main ()

E1.18 Determinare tip triunghi cu laturi date

void main ()

E1.19 Verifica existenta unui fisier inainte de creare fisier

// verifica existenta fisier inainte de crearea lui

#include <stdio.h>

void main ()

f=fopen(numef,'w'); // deschide fisier ptr creare

fputs (numef,f); // scrie in fisier chiar numele sau

fclose(f);

}

E1.20 Determinare numar de zile dintr-o luna

void main ()

printf ('luna %d are %d zile n',luna,zile);

}

Exemple cu instructiuni 'for', 'while', 'do'

E1.21 Citirea unui sir de numere, dupa citirea lungimii sirului.

#include <stdio.h>

#include <values.h>

// afisare valoare maxima dintr-un sir

void main ()

printf('%dn',amax);

}

E1.22 Citirea unui sir de numere terminat cu caracterul 'End of File'

recunoscut de sistem ( Ctrl-Z in DOS si Windows).

#include <stdio.h>

// suma valorilor dintr-un sir de numere

void main ()

E1.23 Citirea mai multor siruri de numere terminate fiecare cu un zero.

Sfarsitul datelor este marcat tot cu zero. Exemplu:

1 2 3 0 4 5 0 7 8 9 0 0

#include <stdio.h>

// sume valori din mai multe siruri terminate cu zero

void main () while (a);

if (m) // daca sir de lungime nenula

printf('%f n',sum);

} while (m);

}

Obs. Situatia de mai sus apare la verificarea unor programe cu mai multe

seturi de date (memorate probabil intr-un fisier), printr-o singura rulare

a fiecarui program.

E1.24 Afisarea unui numar intreg fara semn in binar folosind extragerea

selectiva de biti cu o masca ce contine un singur bit 1.

void main ()

printf('n');

}

E1.25 Determina cel mai mare divizor comun a doi intregi (ineficient).

void main ()

E1.26 Determina cel mai mare divizor comun a doi intregi (alg. lui Euclid).

void main ()

printf ('cmmdc= %dn', b);

}

E1.27 Varianta cu 'do-while' pentru algoritmul lui Euclid

void main ()

do while (r);

printf('%d n',a);

}

E1.28 Ciclu in ciclu. Numararea numerelor prime mai mici ca un intreg dat n.

#include <stdio.h>

main ()

np=3; // vor fi cel putin 3 numere prime

for (m=5;m<=n;m=m+2)

printf ('%dn',np);

}

E1.29 Suma unei serii definite printr-o relatie de recurenta intre termeni.

// suma seriei Taylor pentru e^x cu precizie maxima permisa de 'float'

void main ()

printf ('%15.6f %15.6f n',y, exp(x));

}

// varianta cu instructiunea 'for'

void main ()

printf ('%15.6f %15.6f n',y, exp(x));

}

E1.30 Program care afiseaza un meniu de optiuni si trateaza fiecare optiune

#include <stdio.h>

#include <conio.h>

void main ()

fflush(stdin); getchar();

} while (1);

}

E1.31 Afisarea in hexazecimal a octetilor din mai multe numere de tip 'float'

void main ()

}

PROBLEME PROPUSE

P1.1 Program care citeste coordonatele (x,y) ale unui punct din plan si

afiseaza numarul cadranului in care se afla (1,2,3,4). Se vor verifica

succesiv semnele valorilor x si y. S-ar putea folosi instructiunea 'switch'?

P1.2 Program pentru calculul sumei a doua intervale de timp exprimate

in ore, minute si secunde, cu si fara instructiunea 'if'. (rezultatul este

exprimat tot in ore, minute, secunde). Exemplu :

h1:m1:s1 = 02:49:48 ; h2:m2:s2 = 10:17:35

rezultat = 13:07:23

P1.3 Program pentru calculul timpului scurs intre doua momente de timp

exprimate in ore, minute si secunde (cu si fara 'if'). Exemplu :

h1:m1:s1 = 13:07:23 ; h2:m2:s2 = 02:49:48

rezultat = 10:17:35

P1.4 Program pentru determinarea celui mai mare intreg pentru care se mai

poate calcula corect factorialul sau, succesiv pentru tipurile 'int',

'long', 'float' si 'double'.

Indicatie: Se compara k!/k cu (k-1)! si daca difera se afiseaza k.

P1.5 Program care aduna valoarea x de n ori, ca 'float' si ca 'double', si

afiseaza sumele sx si sy. sx este de tip 'float',iar sy de tip 'double'.

Se vor lua pe rnd :

x=0.1 n=100

x=0.01 n=1000

x=0.001 n=10000

Se vor afisa sumele partiale la fiecare n/10 termeni adunati, cu pauza

dupa fiecare 10 linii afisate ( pauza realizata cu functia 'getchar').

P1.6 Program pentru calculul combinarilor de n luate cite m , pentru n=10

si m intre 1 si 10, prin doua metode :

(a) Folosind relatia de recurenta:

C(n,k) = C(n,k-1) * (n-k+1)/k ptr. k=1,m si C(n,0)=1

(b) Folosind relatia de calcul:

C(n,m) = n!/ (m!*(n-m)!)

P1.7 Program pentru afisarea echivalentului binar al unui numar natural

(intreg cu semn) dat. Exemple: 11=1011, 25 =1001, 23= 10111.

Algoritm: Se repeta impartirea la puteri descrescatoare ale lui 2, iar

caturile sunt cifrele binare. Restul impartirii devine noul deimpartit.

Varianta: se foloseste o masca binara cu un singur bit 1 (deplasat mereu

la dreapta), cu care se extrag biti succesivi din numar.

P1.8 Program pentru calculul si afisarea radacinii patrate a unor numere

folosind urmatoarea relatie de recurenta intre doua aproximatii succesive

r1 si r2 ale radacinii lui x : r2 = ( r1 + x/r1)/2 .

Aproximatia initiala r1 poate fi orice valoare ( se va lua r1=x/2).

Relatia de recurenta se aplica atata timp cat r1 este diferit de r2.

Se va afisa pentru verificare si rezultatul functiei sqrt(x), pentru

primele 20 de numere pare.

P1.9 Program pentru afisarea tuturor numerelor naturale de 2 cifre care

au cel putin 7 divizori nebanali (altii decit 1 si numarul respectiv).

P1.10 Program pentru afisarea numarului maxim de divizori ai unui numar

natural de n cifre ( n<=5 sau n<=10). Se va completa programul cu afisarea

celui mai mare (celui mai mic) numar cu numar maxim de divizori.

P1.11 Program pentru afisarea tuturor descompunerilor unui numar natural

dat prin sume de numere naturale consecutive. Exemplu:

15 = 1+2+3+4+5 = 4+5+6 = 7+ 8

P1.12 Program pentru afisarea numerelor perfecte mai mici ca o valoare data.

(Un numar perfect este un numar egal cu suma tuturor divizorilor sai).

P1.13 Program care calculeaza valoarea functiilor sin(x) si cos(x) ca suma a

seriei de puteri si afisare alaturi de rezultatul functiilor de biblioteca.

sin(x) = x - x^3/3! + x^5/5! - x^7/7! +

cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! +

Se vor insuma toti termenii mai mari ca zero in valoare absoluta.

Observati ce se afiseaza pentru valori mari ale lui x si de ce este necesara

reducerea unghiului x la o valoare mai mica ca 2*PI.

P1.14 Program care determina numarul de zerouri cu care se termina

produsul a n numere naturale date (fara a efectua produsul si fara vectori).

Indicatie: Numarul de zerouri terminale este dat de numarul produselor 2*5

din produsul celor n numere, deci de minimul dintre numarul de cifre 2 si

numarul de cifre 5 care apar in produs. Se vor aduna puterile lui 2 si lui 5

din fiecare numar dat si se determina minimul dintre ele.

Exemplu: n=3, a=15, b=12, c=25

nr cifre 2 = 0 + 2 + 0 = 2

nr cifre 5 = 1 + 0 + 2 = 3

min (2,3)=2 deci produsul a*b*c are 2 zerouri la sfirsit (este 4500)

P1.15 Program pentru descompunerea unui numar natural dat in factori primi.

Se vor afisa factorii primi si puterile (exponentii) lor.

Exemplu: 60 = 2^2 * 3 ^1 * 5^1

SOLUTII LA PROBLEME PROPUSE

// R1.1

// afisare pozitie punct fata de cele 4 cadrane

#include <stdio.h>

void main ()

// R1.2

void main ()

m=m1+m2+m;

if (m >=60)

h=h1+h2+h;

// afisare rezultat

printf ('%02d:%02d:%02d n',h,m,s);

}

// R1.3

void main ()

// R1.4

// cel mai mare numar k pentru care se poate calcula k!

#include <stdio.h>

void main ()

else

kf1=kf2;

}

}

// R1.5

// erori la calcule cu numere reale

#include <stdio.h>

void main ()

n=n*10; x=x/10;

getchar();

}

}

// R1.6

// calcul combinari prin doua metode

#include <stdio.h>

void main ()

}

// R1.7

// cifrele binare sunt caturi ale impartirii prin puteri ale lui 2

void main ()

}

// afisare intreg in binar, cu extragere de biti succesivi

void main ()

}

// R1.8

// calcul radacina patrata prin aproximatii succesive

#include <stdio.h>

#include <math.h>

void main () while ( r1 != r2); // cat timp difera la primele 6 zecimale

printf ('%f %f %f n',x, r2, sqrt(x));

}

}

// R1.9

// numere de 2 cifre cu peste 6 divizori

void main ()

}

// R1.10

// nr maxim de divizori ptr un numar de n cifre

void main ()

}

printf ('%ld si %ld au %ld divizori n', nr1, nr2, max);

}

// R1.11

// toate secventele de numere naturale consecutive

// a caror suma este egala cu n

main ()

/* afisare numere ntre i si j */

if (s==n)

}

}

// R1.12

/* numere perfecte */

void main ()

if (m==s)

printf ('n %d', m);

}

}

// R1.13

// suma seriei Taylor pentru sin(x) si cos(x) cu precizie maxima

void main ()

printf ('%15.6f %15.6f n',sx, sin(x));

printf ('%15.6f %15.6f n',cx, cos(x));

}

// R1.14

// Determina numarul de zerouri cu care se termina produsul

// a n numere naturale date (fara efectuare produs)

#include <stdio.h>

void main ()

while ( a%5 ==0)

}

if ( n2<n5)

printf ('%dn',n2);

else

printf ('%dn',n5);

}

// R1.15

/* descompunere in factori primi */

#include <stdio.h>

main ()

if (p > 0) // daca m s-a impartit exact prin k

printf ('%d^%d*',k,p); // k este un factor prim, p este puterea sa

}

printf ('bn');

}

2. PROGRAME CU VECTORI SI MATRICE

EXEMPLE DE PROGRAME

E2.1 Citire-scriere vector cu numerotare componente de la zero

// Citirea si afisarea unui vector de numere intregi

#include <stdio.h>

void main ()

E2.2 Vectori cu numerotare de la 1 a elementelor

// Citirea coordonatelor a n puncte din plan

// (x[1],y[1]),(x[n],y[n])

#define M 100 // nr maxim de puncte

void main()

E2.3 Initializare partiala vector

// Generare vector cu primele n numere Fibonacci

#include <stdio.h>

void main () ; // celelalte elemente sunt zero

int n,i;

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

for (i=2; i<=n && fib[i]>0 ;i++)

fib[i]=fib[i-1]+fib[i-2];

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

printf ('%ld ',fib[i]);

}

E2.4 Cautare secventiala intr-un vector (prima si ultima aparitie a

numarului cautat).

# include <stdio.h>

void main () ; // un sir de intregi

int n,i,i1,i2, b; // b= valoare cautata

// repeta citire b si cautare in a

n=sizeof(a)/sizeof(a[0]); //lungime vector initializat

while ( scanf('%d',&b) ==1)

}

Obs. In expresia (i<n && b!=a[i]) ordinea celor 2 conditii este esentiala !

E2.5 Declarare si utilizare matrice

// Generare matrice unitate

#define M 20 // nr maxim de linii si de coloane

void main ()

E2.6 Initializare matrice cu zerouri

// Generare matrice unitate

#define M 20 // nr maxim de linii si de coloane

void main () ;

int i,j,n;

printf('nr.linii/coloane: '); scanf('%d',&n);

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

u[i][i]=1;

}

E2.7 Citire-scriere matrice de reali

void main ()

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

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

scnaf ('%f', &a[i][j]);

// afisare matrice

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

}

PROBLEME PROPUSE

P2.1 Program care citeste un sir de note si calculeaza media notelor de

trecere ( >= 5) si ponderea notelor sub 5 in totalul notelor (procentual).

P2.2 Program care citeste un sir de note (intre 0 si 10) si calculeaza

procentul de note din fiecare valoare posibila ( se afiseaza 10 procente

a caror suma este 100).

P2.3 Program care citeste n numere reale X si m+1 numere intregi A si

afiseaza numarul de valori X situat in fiecare din cele m intervale

delimitate de valorile din A. Se verifica daca valorile A sunt introduse

in ordine crescatoare si in caz contrar programul se opreste.

P2.4 Program care citeste doi vectori neordonati de numere distincte si

verifica daca ei contin aceleasi numere, indiferent de ordine (fara

ordonarea lor). Se poate folosi programul scris si pentru vectori cu

elemente repetate diferit in cei doi vectori ? (Ex: , )

P2.5 Program pentru interclasarea a doi vectori ordonati intr-un singur

vector ordonat, care se va afisa.

Exemplu de date : a=, b=;

Rezultat: 1,2,3,4,6,7,9,11

P2.6 Program pentru citirea unui vector de intregi si extragerea

elementelor distincte intr-un al doilea vector, care se va afisa.

P2.7 Program pentru ordonarea unui vector de numere intregi prin metoda

bulelor: se compara elemente vecine din vector (a[i] si a[i+1] ) si, daca

este necesar, se schimba intre ele pentru ca a[i] <= a[i+1]. In general

sunt necesare mai multe treceri prin vector pentru ordonarea sa. Variante:

(a) Numarul de treceri este egal cu dimensiune vector minus 1.

(b) Se fac atatea treceri cate sunt necesare pentru ordonarea vectorului

(se memoreaza daca au fost necesare schimbari de elemente in vector si se

opreste repetarea cand nu a mai fost necesara nici o schimbare).

(c) O trecere prin vector se face de la prima la ultima pereche

(d) O trecere prin vector se face de la ultima pereche catre prima pereche

P2.8 Program de sortare prin selectie: se compara fiecare element cu

toate elementele urmatoare si se fac schimbarile necesare. Se repeta acest

proces pentru un numar de elemente care scade progresiv. In aceasta varianta

se aduce minimul in prima pozitie din (sub)vector si se mareste indicele

primului element la trecerea urmatoare.

P2.9 Program de sortare prin selectie: se compara fiecare element (pornind

cu ultimul) cu toate elementele precedente si se fac schimbarile necesare.

Se repeta acest proces pentru un numar de elemente care scade progresiv.

In aceasta varianta se aduce maximul in ultima pozitie din (sub)vector si

se scade indicele ultimului element la trecerea urmatoare.

P2.10 Program de sortare prin numarare : se compara fiecare element cu

toate celelalte din vector si se creeaza un vector auxiliar care contine

in pozitia k numarul elemente din vectorul a mai mici decat a[k].

P2.11 Program pentru calculul valorii unui polinom cu coeficienti dati, prin

mai multe metode cu urmatoarea numerotare a coeficientilor:

P(x) = c[0]*x^n + c[1]*x^(n-1) + + c[n-1]*x + c[n]

Datele initiale : x, n, c[0],..c[n]

(a) Ca suma de termeni calculati separat (cu functia 'pow')

(b) Ca suma de termeni calculati unul din altul (fara ridicare la putere)

(c) Printr-o relatie de recurenta de forma P(x,k)=P(x,k-1)*x + c[k] si

P(x,0)=c[0].

P2.12 Program care calculeaza valoarea polinomului de interpolare Newton

cu coeficienti dati, ptr o valoare data xx :

P(xx) = c[0] + c[1]*(xx-x[1]) + c[2]*(xx-x[1])*(xx-x[2]) +

+ c[n]*(xx-x[1])*(xx-x[2])* *(xx-x[n])

Date: n, xx, Vectorul c, Vectorul x,

Obs. Produsele din fiecare termen se pot calcula unele din altele.

P2.13 Program pentru calculul normei pe linii a unei matrice de numere

reale. Norma este valoarea maxima dintre sumele valorilor absolute ale

elementelor din fiecare linie.

P2.14 Program pentru determinarea valorii minime dintre toate valorile

maxime pe liniile unei matrice de numere reale (punct in 'sa').

P2.15 Program pentru afisarea celei mai lungi secvente ordonate de elemente

consecutive dintr-un vector dat. Exemplu de date: 5 3 6 2 4 6 8 4 1

Rezultat: 2 4 6 8

Sa se verifice programul si pentru un vector ordonat descrescator.

P2.16 Un graf (orientat sau neorientat) este reprezentat printr-o matrice

de adiacente 'a', in care a[i][j]=1 daca exista muchie (arc) de la nodul

'i' la nodul 'j' si a[i][j]=0 daca nu exista arcul (i,j). Program pentru

citirea numarului de varfuri dintr-un graf neorientat si listei de muchii

si afisarea varfului cu numar maxim de vecini (de arce incidente).

P2.17 Un graf orientat poate fi reprezentat prin doi vectori de noduri

' v' si 'w', in care v[k]=i si w[k]=j daca exista muchie (arc) de la nodul

'i' la nodul 'j'. Program pentru citirea numarului de noduri din graf si

listei de arce si afisarea succesorilor si predecesorilor fiecarui nod.

Exemplu de date : 1 3 / 1 4 / 2 4 / 3 2 / 4 3 / 4 1 /

Liste de succesori: 1: 3,4 / 2: 4 / 3: 2 / 4: 3,1

Liste de predecesori: 1: 4 / 2: 3 / 3: 1,4 / 4: 1,2

P2.18 Program care citeste mai multe relatii de echivalenta intre

perechi de numere intregi si afiseaza clasele de echivalenta ce se pot

forma cu toate numerele citite. Exemplu de date:

3 6 / 5 7 / 2 5 / 1 3 / 1 6 / 4 8

Clasele de echivalenta sunt: , ,

Se va folosi o matrice patratica cu atatea linii si coloane cate numere

sunt in total. O linie corespunde unei clase de echivalente. Exemplu:

1 2 3 4 5 6 7 8

Clasa 1 1 0 1 0 0 1 0 0

Clasa 2 0 1 0 0 1 0 1 0

Clasa 3 0 0 0 1 0 0 0 1

P2.19 Program care citeste mai multe relatii de echivalenta intre

perechi de numere intregi si afiseaza clasele de echivalenta ce se pot

forma cu toate numerele citite. Exemplu de date:

3 6 / 5 7 / 2 5 / 1 3 / 1 6 / 4 8

Clasele de echivalenta sunt: , ,

Se vor folosi doi vectori: un vector cu elementele clasificate si un

vector cu numarul clasei de care apartine un element. Exemplu:

Elem. 1 2 3 4 5 6 7 8

Clasa 1 2 1 3 2 1 2 3

Obs. Clasele de echivalenta corespund unor grafuri neorientate conexe.

SOLUTII LA PROBLEME PROPUSE

// R2.1

// media studentilor integralisti si ponderea restantierilor

#include <stdio.h>

void main ()

if ( m )

printf(' Medie integralisti= %5.2f n', (float)s/m );

printf (' Procent restantieri= %5.2f % n', 100.*(n-m)/n);

}

// R2.2

// statistica notelor unor elevi

#include <stdio.h>

void main ()

// R2.3

// clasifica n valori X in m intervale cu limitele A

#include <stdio.h>

void main () ; // init. vector nr

int n,m,i,j; float y;

// citire date

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

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

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

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

scanf('%d',&a[i]);

// verifica daca vectorul a este ordonat

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

if (a[i] >= a[i+1] )

// numara valorile din fiecare interval

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

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

if ( x[i] > a[j] && x[i] <=a[j+1])

nr[j+1]++;

// afisare contoare

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

printf ('%4d valori in intervalul %d n', nr[j],j);

}

// R2.4

// comparatie de vectori neordonati

#include <stdio.h>

void main () , b[]=;

int egale, este, i,j;

egale=1; // presupunem ca sunt egali

n=sizeof(a)/sizeof(a[0]); // dimensiune vector a

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

}

printf (egale ? 'egalen':'diferiten');

}

Obs. Programul se simplifica daca se defineste o functie de cautare a

unui numar intr-un vector.

// R2.5

// interclasare vectori ordonati

void main ()

// copiaza in c elem. ramase in a sau in b

for (k=ia;k<=na;k++)

c[ic++]=a[k];

for (k=ib;k<=nb;k++)

c[ic++]=b[k];

nc=--ic; // dimensiune vector rezultat

// afisare vector rezultat

for (k=1;k<=nc;k++)

printf ('%d ',c[k]);

}

// R2.6

// extragere elemente distincte dintr-un vector

#include <stdio.h>

void main () ; // un vector de intregi

int b[100]; // aici se pun elementele distincte din a

int n,m,i,j, gasit;

n=sizeof(a)/sizeof(a[0]);

m=0; // dimensiune vector b

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

}

m=m-1; // dimensiune vector b

// scrie vector b

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

printf ('%3d',b[j]);

}

Obs. Programul se simplifica daca se defineste o functie de cautare a

unui numar intr-un vector.

// R2.7

// ordonare prin metoda bulelor (var. a)

#include <stdio.h>

void main ()

// afisare vector ordonat

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

printf ('%4d',a[i]);

}

// ordonare prin metoda bulelor (var. b)

#include <stdio.h>

void main ()

} while ( ! gata);

// afisare vector ordonat

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

printf ('%4d',a[i]);

}

// R2.8

// sortare prin selectie directa (aduce valori mici la inceput)

#include <stdio.h>

void main ()

// scrie vector ordonat

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

printf ('%d ',a[i]);

}

// R2.9

// sortare prin selectie directa (aduce valori mari la sfarsit)

#include <stdio.h>

void main ()

// scrie vector ordonat

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

printf ('%d ',a[i]);

}

// R2.10

// sortare prin numarare

#include <stdio.h>

void main ()

// afisare vector a pe baza lui nr

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

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

if (nr[j]==i)

printf ('%3d',a[j]);

}

// R2.11

// calcul valoare polinom cu coeficienti dati

#include <stdio.h>

#include <math.h>

void main () ; // vector coeficienti polinom

int n,i; // n= nr coef. polinom

int x, y, px; // x=valoare ptr care se calculeaza polinom

n=sizeof(c)/sizeof(c[0]); // nr de coeficienti

while (scanf('%d',&x)==1)

printf ('%d ',y);

// metoda 3 : relatie de recurenta intre polinoame

y=0; // polinom de grad 0

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

y=y*x+c[i];

printf ('%d n',y);

}

}

// R2.12

// valoare polinom de interp. Newton

#include <stdio.h>

void main () , x[]=;

n=4;

xx=5;

// mai putin eficient

yy=c[0];

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

printf ('%f ',yy);

// mai eficient

yy=c[0];

p=1;

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

printf ('%f n',yy);

}

// R2.13

// norma unei matrice (cu numerotare de la 1 ptr linii si col)

#include <math.h>

#include <stdio.h>

#define M 20 // dimensiuni maxime matrice

void main () , , , };

int i,j; float s, smax;

smax=0;

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

printf ('%f n', smax);

}

// R2.14

// valoare in 'sa' dintr-o matrice

// minim dintre val. maxime pe linii

#include <stdio.h>

#include <math.h>

#define M 20 // nr maxim de linii/coloane

void main () , , , };

int i,j; float min, max;

min = 1e30;

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

printf ('%f n', min);

}

// R2.15

// secventa ordonata de lungime maxima

#include <stdio.h>

void main () ; // un sir terminat cu zero

int i,j,imax,l, lmax; // imax,lmax = inceput si lungime secventa maxima

imax=i=0; lmax=0; // sau lmax=1

while (a[i])

i=j+1; // continua cautarea din poz. j+1

}

printf ('n %d n', lmax); // lungime secventa

for (i=imax; i<imax+lmax;i++)

printf ('%d ', a[i]);

}

// R2.16

# include <stdio.h>

# define M 30 // nr. maxim noduri graf

void main ()

// determina nod cu nr maxim de vecini

max=0; imax=0; // nr maxim de vecini

for (i=1;i<=n;i++) // retine nr maxim de vecini

}

// afisare nod cu nr maxim de vecini

printf ('Varful %d are %d vecini n ', imax, max);

}

// R2.17

// graf reprezentat prin lista arcelor sale

#include <stdio.h>

# define M 30 // nr. maxim noduri graf

void main ()

// afisare liste de succesori noduri

printf ('Liste de succesori:n');

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

// afisare liste de predecesori noduri

printf ('Liste de predecesori:n');

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

}

// R2.19

/* Program care citeste mai multe relatii de echivalenta intre

perechi de numere intregi si afiseaza clasele de echivalenta ce se pot

forma cu toate numerele citite.

Exemplu de date:

30 60 / 50 70 / 20 50 / 10 30 / 10 60 / 40 80

Clasele de echivalenta sunt: , ,

Se vor folosi doi vectori: un vector cu elementele clasificate si un

vector cu numarul clasei de care apartine un element. Exemplu:

Elem. 10 20 30 40 50 60 70 80

Clasa 1 2 1 3 2 1 2 3

*/

#include <stdio.h>

#define M 100 // numar maxim de elemente clasificate

// reunire clase ce contin valorile p si q

void unif (int cls[],int n,int p,int q) else

}

// determina indice in vector de valori

int indexOf (int val[],int n, int x)

void main () , cls[M]=; // valorile si clasele lor

int i,j,p,q,n,m,cl;

// citire relatii de echivalenta

cl=0; // numar clase curente

n=0;

while (scanf('%d%d',&p,&q) > 0)

j=indexOf(val,n,q);

if (j < 0)

unif(cls,n,i,j);

}

// afisare clase

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

if (m)

printf('n');

}

}

3. DEFINIREA SI UTILIZAREA DE FUNCTII

EXEMPLE DE PROGRAME

E3.1a Functie fara argumente si fara rezultat asociat numelui sau.

// Stergere ecran in mod text, prin defilare

#include <stdio.h>

// definire functie

void clear()

// utilizare functie

void main ()

Observatii:

- Functia 'clrscr()' nu este standard in limbajul C, dupa cum nici fisierul

antet CONIO.H nu este standard (dar ele exista in Borland-C).

- Dupa stergere ecran cu 'clrscr' cursorul este in prima linie de sus si

ecranul trece in mod pagina (implicit este in modul defilare).

E3.1b Aceeasi functie de la 3.1a, dar plasata dupa programul principal

#include <stdio.h>

void clear(); // declarare functie (prototip)

// utilizare functie

void main ()

// definire functie (cu declaratie ca in C++)

void clear()

E3.2 Functie de tip 'void' cu un argument

#include <stdio.h>

// Desenarea unei bare orizontale compuse din n caractere

void bar (int n)

// Desenare histograma pe baza unui vector de intregi

void main () ,n=5,k;

clear(); // sterge ecran

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

bar (a[k]); // desenare bara k de lungime a[k]

}

E3.3 Functie de tip 'void' cu doua argumente de tipuri diferite

// Desenarea unei bare orizontale din n caractere ch

void bar1 (int n, char ch)

E3.4 Functie de tip 'void' cu argument de tip vector

// Desenare histograma pe baza unui vector de intregi

void hist (int a[], int n)

E3.5 Functie cu rezultat si argument de tip vector

// Determinare valoare minima dintr-un vector dat

float minim (float x[], int n)

// utilizare functie

void main () , tmin;

printf ('%f n', minim(t,6));

}

E3.6 Functie care verifica satisfacerea unei conditii

// Verifica daca un caracter dat este un spatiu alb

int isspace (char ch)

Obs.

- In C exista functii standard pentru verificarea tipului unui caracter dat

(isspace, isalpha,isdigit,), declarate in CTYPE.H.

E3.7 Functie care verifica respectarea unei conditii de catre toate

elementele unui vector dat.

// Verifica daca un vector este ordonat crescator sau nu

int sorted (int a[], int n)

E3.8 Functie cu doua rezultate (cu argumente de tip pointer)

// Determinare minim si maxim dintr-un vector

void minmax ( float x[],int n,float* pmin, float* pmax)

*pmin=xmin; *pmax=xmax;

}

// utilizare functie

void main () ;

float a1,a2;

minmax (a,6,&a1,&a2);

printf('%f %f n',a1,a2);

}

Obs.: Este preferabila scrierea a doua functii separate care transmit prin

numele functiei valoarea minima sau maxima.

E3.9 Functie cu argument vector apelata pentru o linie dintr-o matrice

// Determinare valoare minima dintr-o matrice

float minim (float x[],int n); // prototip functie

void main ()

E3.10 Functie cu argument matrice (cu numar impus de coloane)

// Generare matrice unitate

void matrunit (float u[][30], int n)

}

// afisare matrice patratica (cu 30 de coloane declarate)

void scrmatr (float a[][30], int n)

}

// utilizare

void main ()

}

E3.11 Functie recursiva pentru ridicarea unui numar la o putere intreaga

pe baza relatiei de recurenta x^k = x * x^(k-1) si cu x^0=1

double power (double x, int n)

E3.12 Functie recursiva pentru ridicarea unui numar la o putere intreaga

cu numar redus de inmultiri, pe baza relatiei de recurenta

x^k = x^(k/2) * x^(k/2) daca k este par si x^k= x * x^(k-1) daca k impar

double power (double x, int n)

else

return (x * power (x,n-1));

}

PROBLEME PROPUSE

P3.1 Functie pentru determinarea numarului de cifre al unui numar dat (de

orice tip intreg). Program pentru citirea unui intreg n si afisarea a n

numere aleatoare intre 0 si n, cu determinare numar de coloane in functie

de valorile afisate. ( nr de coloane = 80/(nr.cifre+2) )

Se va utiliza functia 'random' declarata in <math.h>

P3.2 Functie care verifica daca un numar dat este prim sau nu. Program

pentru afisarea descompunerilor numerelor pare mai mici ca un intreg dat

in sume de doua numere prime (Ipoteza lui Goldbach = orice numar par se

poate scrie ca suma a doua numere prime).

P3.3 Functie care primeste doi intregi a si b si determina alti doi

intregi k si c astfel ca a = c * b^k ( b este un divizor posibil al lui a,

k este ordinul de multiplicitate, c este numarul ramas dupa k impartiri

repetate a lui a prin b). Program pentru descompunerea unui numar dat in

factori primi (cu puterile lor) folosind functia. Exemplu:

360 = 2^3 * 3^2 * 5^1

P3.4 Functie care determina pozitia valorii maxime intr-un vector. Program

pentru ordonarea unui vector de numere prin determinarea repetata a valorii

maxime dintr-un vector si schimbarea cu ultimul element din vector.

P3.5 Functie care determina semnul unui numar intreg ('sign') si are

rezultat 0 (valoare zero), -1 (numar negativ) sau +1 (numar pozitiv).

Functie care determina numarul cadranului in care se afla un punct de

coordonate intregi date x,y; rezultatul este 0 daca punctul se afla pe

una din axe sau la intersectia axelor. Indicatie: Se face o selectie

('switch') dupa valoarea 3*sign(x)+sign(y). Program de verificare.

P3.6 Functie pentru cautare binara intr-un vector ordonat in doua moduri:

iterativ si recursiv. Cautarea binara se face prin compararea valorii

cautate cu valoarea din mijlocul vectorului cercetat si alegerea primei

sau ultimei jumatati din vector pentru pasul urmator, in functie de

rezultatul comparatiei. Procesul de injumatatire a vectorului se opreste

fie la gasirea valorii cautate, fie la reducerea dimensiunii pana la 1.

Functia primeste ca argumente valoarea cautata, adresa vectorului si

indicii (pozitiile) din vector intre care se cauta.

P3.7 Functii pentru operatii cu multimi de 256 intregi realizate printr-un

sir de 256 de biti (16 intregi fara semn sau 32 de octeti). Bitul k din

sir este 1 daca multimea contine elementul cu valoarea k si este zero

daca multimea nu contine valoarea k. Bitul k din sir se afla in bitul cu

numarul k%16 din intregul k/16 din vectorul de 16 intregi. Operatii

(functii): initializare multime vida, adaugare intreg la multime, verifica

apartenenta unui numar la o multime, afisare multime (intre acolade),

reuniune, intersectie si diferenta de multimi.

Program pentru verificarea acestor functii

P3.8 Functii pentru operatii cu multimi de numere intregi reprezentate

prin vectori neordonati de lungime fixa, in care elementele multimii sunt

grupate la inceputul vectorului, dupa care urmeaza zerouri. Operatii:

initializare multime vida, verificare apartenenta la o multime, adaugare

element la o multime (daca nu exista deja), afisare multime (intre acolade),

reuniune, intersectie si diferenta de multimi. Program pentru verificarea

acestor functii.

P3.9 Functie pentru determinarea divizorilor unui numar intreg dat.

Functie pentru calculul valorii unui polinom cu coeficienti intregi.

P(x)= a[0]*x^n+a[1]*x^(n-1)+ +a[n-1]*x + a[n]

Functie pentru determinarea coeficientilor polinomului cat ('b') al

impartirii unui polinom (dat prin coeficientii 'a') prin (x-r). Se vor

folosi relatiile de recurenta urmatoare:

b[0]=a[0]; b[k]=a[k]+b[k-1]*r k=1,n-1

Program care determina si afiseaza radacinile unei ecuatii polinomiale

cu coeficienti intregi, aflate printre divizorii termenului liber; se

vor afisa divizorii (cu valori pozitive sau negative) care anuleaza

valoarea polinomului dat. exemplu: x^3+3x^2+2x+6 are ca radacina x=-3

(dar nu are radacinile 2,-2,3). Coeficientul puterii maxime a lui x va fi 1.

P3.10 Functie pentru calculul valorii polinomului de interpolare Lagrange

pentru o valoare data xx folosind relatia :

yy = Suma (y[k]*Prod((xx-x[i])/(x[k]-x[i]) )

Suma pentru k=1,n. Produs pentru i=1,n si i!=k

Program pentru citirea a 2 vectori x si y ce definesc o functie prin n

puncte si calculeaza valorile functiei la mijlocul intervalelor de pe

axa X prin interpolare Lagrange. Se vor afisa coordonatele celor n-1

puncte astfel determinate.

P3.11 Functie pentru inmultirea unui polinom cu coeficienti dati cu un

binom de forma (x+c). Program pentru calculul coeficientilor polinomului

care are ca radacini numerele intregi c[1],c[2],c[n] (citite ca date

initiale). (Termenul liber trebuie sa fie egal cu produsul r[1]*r[2]*,

iar coeficientul lui x^(n-1) sa fie egal cu suma r[1]+r[2]+r[n])

Pentru c[1]=c[2]=..=c[n]=1 coeficientii afisati sunt coeficientii puterii

n a binomului (x+1)

P3.12 Functie recursiva pentru determinarea celui mai mare divizor comun

a 2 intregi, pe baza relatiei cmmdc(a,b) = cmmdc (b,a%b) daca a%b != 0

si cmmdc(a,b) =b daca a%b==0.

P3.13 Functie recursiva pentru afisare in binar a unui intreg primit ca

argument. Algoritm: echivalentul binar al lui m se obtine din echivalentul

binar al lui m/2 urmat de cifra binara m%2. Scrieti si o forma iterativa

pentru acest algoritm de impartiri succesive la 2 si afisare de resturi

in ordinea inversa obtinerii lor.

P3.14 Functie recursiva pentru cautarea secventiala intr-un vector a unei

valori date, cu rezultat pozitia in vector a numarului cautat sau -1 daca

negasit. Rezultatul cautarii intr-un vector a cu n elemente este fie

a[n-1] fie egal cu rezultatul cautarii in primele n-1 elemente (daca n>0).

P3.15 Functie pentru inmultirea a doua matrice patratice cu acelasi numar

de linii si coloane. Functie pentru ridicarea unei matrice patratice la

o putere intreaga, prin inmultiri repetate (folosind prima functie).

Program pentru verificare pe o matrice unitate.

P3.16 Functie care schimba intre ele doua linii i si j dintr-o matrice

patratica. Program care foloseste functia pentru a aduce pe diagonala

principala numai elemente nenule (daca este posibil). Se va afisa matricea

obtinuta prin schimbari de linii.

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 ('%dn',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++)

}

4. PROGRAME SI FUNCTII CU SIRURI DE CARACTERE

EXEMPLE DE FUNCTII SI PROGRAME

E4.1 Program pentru citirea si afisarea unor linii la consola

#include <stdio.h>

void main ()

E4.2 Program pentru citirea unui text in memorie, cu pastrarea

caracterelor terminator de linie.

#include <stdio.h>

#include <string.h>

void main () {

char linie[80]; // aici se citeste o linie

char text[30000]=; // aici se memoreaza toate liniile

while ( gets (linie) != NULL)

puts(text); // afisare text citit, pe linii

}

Obs: O forma mai compacta pentru ciclul de citire, adaugare la text:

while ( gets (linie) != NULL)

strcat (text, strcat(linie,'n'));

E4.3 Program pentru citirea de siruri separate prin spatii albe intre ele

(se pot introduce mai multe siruri intr-o linie):

#include <stdio.h>

#include <string.h>

void main ()

Obs.: Toate programele de mai sus pot fi folosite cu fisiere text de

intrare si de iesire prin redirectarea fisierelor standard stdin si stdout.

E4.4 Functie pentru insertia unui caracter la o adresa dintr-un sir.

Functie pentru insertia unui sir s la o adresa data din alt sir d.

// insertie caracter intr-un sir

void chins (char *d, char ch)

// insertie sir s la adresa d

void strins (char *d, char *s)

E4.5 Functie echivalenta ca efect cu functia 'strstr'

#include <stdio.h>

#include <string.h>

// cauta un sir in alt sir

char * strstr ( char * s1, char* s2)

// verificare functie

void main ()

E4.6 Functie echivalenta ca efect cu functia 'strtok' :

//extrage din sir atomi separati prin caractere specificate

char *strtok (char * sir,char *separ)

}

E4.7 Program pentru numararea liniilor si cuvintelor dintr-un fisier text,

al carui nume se da in linia de comanda. Cuvintele sunt siruri de orice

caractere separate intre ele prin (oricate) spatii albe. Se va folosi

functia de biblioteca 'strtok'.

#include <stdio.h>

#include <string.h>

// numarare linii si cuvinte dintr-un fisier text

void main ( int argc, char *argv[] )

if( (f = fopen (argv[1],'r')) == NULL)

while ( fgets (linie,200,f) != NULL)

}

printf ('n %d linii %d cuvinte',nl,nc); // si alte operatii cu linia citita

fclose(f);

}

E4.8 Program pentru numararea liniilor si cuvintelor dintr-un fisier text,

al carui nume se da in linia de comanda. Cuvintele sunt siruri de orice

caractere separate intre ele prin (oricate) spatii albe. Nu se vor folosi

functii pe siruri de caractere din <string.h>.

#include <stdio.h>

#include <ctype.h>

// numarare linii si cuvinte dintr-un fisier text

void main ( int argc, char *argv[] )

}

printf ('%d linii %d cuvinte',nl,nc); // si alte operatii cu linia citita

fclose(f);

}

E4.9 Program pentru citirea unui fisier de numere (reprezentate prin

siruri de caractere separate prin spatii albe) si crearea unui alt fisier

cu aceleasi numere ordonate crescator. Numele celor doua fisiere se dau in

linia de comanda.

// ordonare fisier de numere

#include <stdio.h>

#include <stdlib.h>

// compara doi intregi (ptr qsort)]

int intcmp (const void* a , const void * b)

// program de ordonare fisier de numere

int main (int na, char ** arg)

// citire fisier de date

if ( (f1=fopen (arg[1],'rt'))==0)

i=0;

while ( fscanf(f1,'%d',&num[i]) != EOF)

i++;

n=i; // lungime vector

// ordonare vector cu functia 'qsort'

qsort (num,n,sizeof(int), intcmp);

// scrie vector ordonat in fisier

f2=fopen(arg[2],'wt');

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

fprintf(f2,'%d ',num[i]);

fclose(f2);

}

Obs: Nu era posibila ordonarea numerelor ca siruri de caractere (fara

conversie in binar), deoarece sirul '7' este superior sirului '123', dar

numarul 7 este inferior numarului 123.

E4.10 Program pentru citirea unui fisier text creat in Unix (in care fiecare

linie se termina cu un singur caracter 'n' ) si crearea unui alt fisier

cu acelasi continut, dar in care liniile se termina cu doua caractere: 'rn'.

In final se sterge fisierul initial si se schimba numele noului fisier in

numele fisierului initial. Functia 'fputs' adauga caracterul 'r' inaintea

caracterului 'n'.

#include <stdio.h>

#include <string.h>

void main ()

strcpy(nume2,nume1);

point = strchr (nume2,'.');

if (point==0)

point=nume2+strlen(nume2);

strcpy(point+1,'$$$');

f2 =fopen (nume2,'w');

while ( fgets (line,200,f1) != 0)

fputs (line,f2);

if (fclose(f1)<0 || fclose(f2)<0)

remove(nume1); rename(nume2,nume1); // schimba nume1.$$$ in nume1.*

}

PROBLEME PROPUSE

P4.1 Functii echivalente ca efect cu functiile de biblioteca strlen,

strcpy, strcat, strcmp, strchr, strrchr

P4.2 Functii echivalente ca efect cu functiile de biblioteca

strncpy, strncat, strncmp.

P4.3 Functie pentru eliminarea unui subsir de lungime data dintr-un sir

dat prin adresa sa (si terminat cu zero). Functie pentru inserarea

unui sir dat la o adresa dintr-un sir terminat cu zero.

P4.4 Program care inlocuieste toate aparitiile unui sir dat printr-un

alt sir (de lungime diferita), intr-un text aflat in memorie. Se pot folosi

functiile din programul anterior.

P4.5 Functie care primeste o data calendaristica ca un sir de forma

'DD-MM-YY' si produce un vector cu 3 intregi ce corespund numarului zilei

(DD), lunii(MM) si anului(YY). Se pot folosi functii de biblioteca

(sscanf, atoi, strtok, strchr etc.). Program ptr verificare functie.

P4.6 Program pentru numararea si afisarea cuvintelor separate prin spatii

albe (dintr-un text) in doua variante :

(a) folosind functia de biblioteca 'strtok'.

(b) folosind functia de biblioteca 'sscanf'

P4.7 Sa se rescrie functia 'strtok' astfel ca primul argument sa reprezinte

adresa din sir de unde incepe cautarea, la fiecare apel (fara variabila

statica). Se adauga un al treilea argument unde functia depune atomul

extras din text, iar rezultatul functiei este adresa urmatoare atomului

gasit. Sa se modifice si programul care foloseste functia modificata.

P4.8 Functie care extrage urmatorul sir de litere de la o adresa data

(se ignora caracterele dinainte care nu sunt litere). Rezultatul este

adresa imediat urmatoare sirului gasit sau NULL daca nu s-a gasit nici

un sir de litere.

P4.9 Program pentru citirea unui text sursa C in memorie si afisarea

frecventei de aparitie a urmatoarelor cuvinte cheie in text: if, for,

do, while, switch, break.

P4.10 Program pentru ordonarea unui fisier text dupa cuvantul numarul k

din fiecare linie (k=0,1,..n-1). Fiecare linie contine n cuvinte separate

prin spatii albe. Numele fisierului si intregul k se transmit prin linia de

comanda ( exemplu: sort linii 1).

P4.11 Program pentru afisarea frecventei de aparitie a cuvintelor folosite

de mai multe ori intr-un fisier text. Nu se vor afisa cuvintele folosite o

singura data.

P4.12 Program pentru citirea unui fisier text si crearea unui alt fisier text

cu linii de o lungime maxima impusa, fara a desparti cuvintele la trecerea de

pe o linie pe alta. Cuvintele sunt siruri separate prin unul sau mai multe

spatii albe.

P4.13 Program pentru citirea unui fisier text si scrierea unui alt fisier

(cu acelasi numar de linii) in care fiecare linie se termina cu un caracter

diferit de spatiu alb, prin inserarea de blancuri intre cuvinte cat mai

uniform posibil. In fisierul de iesire toate liniile au aceeasi lungime,

specificata in linia de comanda, dupa numele fisierului de intrare.

P4.14 Program pentru citirea unui fisier sursa C si afisarea textului

dupa eliminarea comentariilor din text. Se vor elimina ambele tipuri de

comentarii: cele care incep prin '//' si cele delimitate de '/*' si '*/'.

Un comentariu nu poate contine nici un alt comentariu. Perechile de

caractere //,/* si */ intr-o constanta sir nu semnifica comentarii.

P4.15 Program care inlocuieste toate aparitiile unui sir dat printr-un

alt sir (de lungime diferita), intr-un fisier text. Se va crea un alt

fisier text (cu acelasi nume dar cu extensia '$$$'). In final se

schimba extensia fisierului initial in 'BAK' si fisierul creat primeste

extensia fisierului initial.

P4.16 Program care citeste un fisier HTML si creeaza un fisier text (ASCII)

dupa eliminarea tuturor marcajelor din text. Un marcaj ('tag') incepe prin

caracterul '<' si se termina cu caracterul '>', poate contine oricite

caractere si se poate extinde pe mai multe linii. Programul va verifica daca

primele caractere diferite de blanc din fisierul de intrare sunt <HTML >

sau <!DOCTYPE HTML >.

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=' tn';

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

}

5. PROGRAME SI FUNCTII CU STRUCTURI

EXEMPLE DE PROGRAME SI FUNCTII

E5.1 Functii pentru operatii cu structuri (fara pointeri, cu rezultat

structura).

typedef struct Complex;

// citire numar complex

Complex cit_cx ()

// scriere numar complex

void scr_cx (Complex c)

// adunare numere complexe (cu 2 argumente)

Complex plus_cx (Complex c1, Complex c2)

// verificare functii

main () ,c2, c3;

c2=cit_cx (); scr_cx(c2);

c3=ad_cx(c1,c2);

scr_cx(c3);

}

E5.2 Operatii cu structuri realizate prin functii 'void' (cu pointeri)

typedef struct Complex;

// citire numar complex

void cit_cx (Complex * px)

// adunare numere complexe

void ad_cx (Complex c1, Complex c2, Complex * pc3)

main () ,c2, c3;

cit_cx (&c2); scr_cx(c2);

ad_cx(c1,c2,&c3);

scr_cx(c3);

}

E5.3 Ordonare vector de structuri cu functie de comparare structuri

#include <stdio.h>

typedef struct Date;

// comparare de date

int cmpdat ( Date d1, Date d2)

// ordonare vector de date

void sort (Date a[], int n)

} while ( ! gata);

}

// verificare

void main ()

E5.4 Utilizare structuri pentru reducere numar de argumente la functii

// vectori reprezentati prin structuri

#include <stdio.h>

#define M 100

typedef struct sv Vector;

// citire vector

Vector citvec ( )

// afisare vector

void scrvec (Vector v)

// extrage elemente comune din doi vectori

Vector comun(Vector a, Vector b)

// verificare functii

void main ()

E5.5 Structuri cu continut variabil in timp (uniuni)

#include <stdio.h>

// numar de orice tip

struct number v;

};

typedef struct number Num;

// afisare numar

void write (Num n)

}

// citire numar

Num read (char tip)

return n;

}

// verificare functii

void main ()

Obs. Memorarea unor date de tipuri diferite la o aceeasi adresa se poate

realiza si fara tipul 'union', folosind pointeri de tip 'void *'.

E5.6 Crearea si afisarea unui fisier de articole ce corespund unor structuri

din memorie (cu numele si mediile unor elevi).

// structura articole din fisier

typedef struct Elev;

// creare - afisare fisier de articole

void main ()

E5.7 Cautarea si modificarea unor articole dintr-un fisier de articole.

// structura articole din fisier

typedef struct Elev;

// adaugare articole la sfarsit de fisier

void adaugare (char * numef)

// cautare si modificare articole

void modificare (char * numef)

if ( pos < 0) break;

printf ('noua medie: '); scanf ('%f', &e.medie);

fseek (f,pos,0); // pozitionare pe inceput de articol gasit

fwrite(&e,sizeof(e),1,f); // rescrie articol modificat

} while (eof!=EOF);

fclose (f);

}

// actualizare fisier existent

void main ()

PROBLEME PROPUSE

P5.1 Functii pentru inmultirea a doua numere complexe si pentru ridicarea

la o putere intreaga a unui numar complex prin inmultiri repetate. Program

pentru calculul valorii (complexe) a unui polinom de variabila complexa,

cu coeficienti numere complexe.

P5.2 Sa se defineasca o structura 'Time' care grupeaza 3 intregi ce

reprezinta ora, minut si secunda pentru un moment (sau un interval) de timp.

Functii pentru citire, scriere si comparare de structuri 'Time'. Functia

de comparare dupa modelul functiei 'strcmp'. Program pentru verificarea

functiilor.

P5.3 Program pentru ordonarea cronologica a unor momente de timp si afisarea

listei ordonate, folosind functii din programul anterior.

P5.4 Sa se defineasca o structura 'Punct' pentru un punct din plan ( cu

doua coordonate x,y de tip 'float') si o structura 'Poligon' pentru un

poligon definit prin numarul de varfuri si un vector de coordonate ale

varfurilor (de tip 'Punct'). Functie pentru calculul distantei dintre

doua puncte din plan. Functie pentru calculul perimetrului unui poligon.

Program pentru calculul perimetrului unui triunghi si unui patrulater.

P5.5 Sa se defineasca o structura 'Vector' pentru un vector alocat dinamic

si extensibil, care contine dimensiunea maxima si dimensiunea efectiva a

vectorului. Functii pentru initializarea unui vector, pentru adaugarea unui

element (cu extindere daca este necesara) si pentru afisarea unui vector de

tip 'Vector'. Tipul elementelor T este neprecizat si poate fi orice tip

predefinit sau definit de utilizator. Program care foloseste functiile.

P5.6 Sa se defineasca o structura 'Per' pentru o pereche cuvant- numar

si o structura 'Dic' pentru un dictionar ca vector de perechi 'Per'.

Program pentru afisarea frecventei de aparitie a unor cuvinte (citite de la

consola) si care foloseste un dictionar de cuvinte si numar de aparitii. Se

va defini si folosi o functie pentru cautarea unui cuvant in dictionar si

adaugarea unei perechi cuvant-numar la dictionar (daca cuvant negasit) sau

modificarea numarului de aparitii (daca cuvant gasit).

P5.7 Sa se defineasca o structura 'Dic' pentru un dictionar compus din doi

vectori: un vector de cuvinte (siruri) si un vector de intregi, plus

dimensiunea lor comuna (vectori cu dimensiune fixa). Program pentru afisarea

frecventei de aparitie a unor cuvinte (citite de la consola) care foloseste

un dictionar de cuvinte si numar de aparitii. Se vor defini functii pentru

adaugarea unei prechi cuvant-numar la dictionar si respectiv pentru cautarea

unui cuvant in dictionar, cu rezultat numar de aparitii sau -1 daca negasit.

P5.8 Sa se defineasca un tip 'Set' ca pointer la o structura ce reuneste

adresa, dimensiunea alocata si dimensiunea efectiva pentru un vector

alocat si realocat dinamic prin care se reprezinta o multime de numere

intregi. Multimea vida are dimensiunea zero. Functii pentru creare multime

vida, adaugare numar la multime, test apartenenta la multime, afisare

multime, comparatie la egalitate, reuniune, intersectie si diferenta de

multimi. Functiile au argumente de tip 'Set'. Program pentru verificarea

acestor functii.

P5.9 Sa se reuneasca operatiile cu fisierul de elevi din exemplele anterioare

intr-un singur program cu mai multe functii si un meniu de alegere a operatiei

afisat pe ecran dupa fiecare operatie. Optiuni meniu: creare, listare,

adaugare la sfarsit, modificare continut, terminare (iesire).

P5.10 Sa se defineasca o structura 'Bon' pentru un bon de vanzare ce contine

numele unui produs (max 30 caractere), cantitatea (un intreg) si valoarea

unei vanzari (un numar neintreg). Program pentru urmatoarele operatii cu

acest fisier: adaugare la sfarsit fisier (cu creare daca nu exista), afisare

integrala fisier, afisare bonuri pentru un produs specificat, cu totalizare

valoare bonuri pe acel produs.

SOLUTII LA PROBLEME PROPUSE

// R5.1

// alte functii (citire, scriere, adunare)

// 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 : nn');

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 = %ldn', sum);

fclose (f);

}

// afisare meniu si tratare optiuni

void main ()

getchar(); // pentru mentinere rezultate

} while ( opt[0] != 'x');

}

6. PROGRAME CU DATE ALOCATE DINAMIC

EXEMPLE DE PROGRAME

E6.1 Functie echivalenta cu functia de biblioteca 'strdup'

#include <string.h>

#include <alloc.h>

// alocare memorie si copiere sir

char * strdup ( char * adr)

// utilizare 'strdup'

#include <stdio.h>

void main () while (1);

}

E6.2 Vector alocat dinamic (cu dimensiune cunoscuta la eexecutie)

#include <stdio.h>

#include <stdlib.h>

void main ()

E6.3 Vector realocat dinamic (cu dimensiune necunoscuta)

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#define INCR 4

void main()

v[i++]=x;

}

m=i;

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

printf ('%.2f ',v[i]);

}

E6.4 Matrice alocata dinamic (cu dimensiuni cunoscute la executie)

#include <stdio.h>

#include <stdlib.h>

void main ()

}

E6.5 Vector de pointeri la siruri alocate dinamic

/* Creare/ afisare vector de pointeri la siruri */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// afisare siruri reunite n vector de pointeri

void printstr ( char * vp[], int n)

// ordonare vector de pointeri la siruri

void sort ( char * vp[],int n)

}

// citire siruri si creare vector de pointeri

int readstr (char * vp[])

return n;

}

void main ()

E6.6 Structuri alocate dinamic si legate prin pointeri (liste inlantuite)

// creare si afisare lista simplu inlantuita

#include <stdio.h>

#include <stdlib.h>

// definire tip nod de lista

typedef struct snod nod;

void main ()

// afisare lista

p=list;

while ( p != NULL)

}

PROBLEME PROPUSE

P6.1 Program care citeste mai multe linii de text de la tastatura si

le memoreaza intr-un vector de caractere alocat si realocat dinamic

(textul va fi terminat cu zero si va rezulta prin concatenare de linii).

P6.2 Program care citeste mai multe linii de text de la tastatura, aloca

dinamic memorie pentru fiecare linie si pune adresa liniei intr-un vector

de pointeri (vector alocat si realocat dinamic)

P6.3 Program pentru crearea si afisarea unei liste inlantuite de pointeri

la siruri alocate dinamic.

P6.4 Sa se scrie o functie pentru alocarea unor matrice patratice cu

dimensiuni date de reali (de tip 'double'). Sa se scrie un program care

citeste si afiseaza valori in/din matricea astfel alocata (dimensiunea se

citeste in programul principal).

P6.5 Functii pentru operatii cu multimi realizate ca vectori de biti

alocati dinamic. Se va defini un tip 'Set' ca pointer la o structura care

reuneste adresa si dimensiunea vectorului multime. Functii pentru afisare

multime, creare multime vida, adaugare numar la multime, copiere multime,

test de apartenenta, reuniune si intersectie de multimi. Valoarea k este

in multime daca este 1 bitul k%16 din intregul aflat in pozitia k/16 in

vector. Dimensiunea multimii (ca numar de biti) se da la creare multime

vida si nu mai poate creste prin adaugare de elemente.

P6.6 Functie pentru adunarea a doua numere intregi fara semn cu maxim 254

cifre zecimale, reprezentate prin vectori de cifre zecimale (cate o cifra

pe un octet), precedate de lungimea lor . Numerele pot avea lungimi diferite,

iar prima cifra este cea mai putin semnificativa (cifra unitatilor). Functii

pentru conversia din sir de caractere in numere reprezentate ca vectori de

cifre si pentru conversia inversa. Memoria se aloca dinamic pentru fiecare

sir de cifre. Program pentru verificarea functiilor prin citire, adunare

si afisare suma de intregi foarte lungi.

Exemplu de adunare: 567089 + 432 = 567521

P6.7 Functii pentru operatii cu liste inlantuite de numere: initializare

lista vida, adaugare la sfarsit de lista, afisare lista. Program pentru

creare si afisare lista folosind aceste functii.

P6.8 Functii pentru operatii cu liste ce contin la inceput un nod fara

date (element santinela creat la initializarea listei). Program pentru

crearea si afisarea unei liste de numere.

P6.9 Functie pentru adaugare la o lista ordonata de numere, cu pastrarea

ordinii. Program pentru crearea si afisarea unei liste ordonate de numere.

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

}

DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 527
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Distribuie URL

Adauga cod HTML in site

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2014. All rights reserved