Documente Academic
Documente Profesional
Documente Cultură
PR
RE
EFFA
A
Programarea
Calculatoarelor in
Limbajul C
Mulumiri
Mulumim familiilor noastre care ne-au susinut n
realizarea acestei cri i au ndurat orele trzii de munc.
Mulumim colegilor care au fcut observaii pertinente
privind coninutul acestei cri i personalului Editurii Europolis
pentru sfaturile privind tehnoredactarea.
De asemenea, mulumim anticipat celor care vor aduce
sugestii pentru mbuntirea acestei cri.
Cu toii ne-au ajutat n ncercarea noastr de a scrie o
carte fr greeli. Erorile pe care cititorul le va gsi ne aparin n
totalitate.
Autorii.
Decembrie 2006
C
CU
UP
PR
RIIN
NS
S
1. Algoritmi i limbaje algoritmice ................................................. 9
1.1. De la problem la program ................................................ 9
1.2. Noiunea de algoritm ....................................................... 11
1.3. Reprezentarea algoritmilor .............................................. 12
1.4. Exemple .......................................................................... 17
1.5. Exerciii ............................................................................ 24
2. Uniti lexicale ........................................................................ 25
2.1. Mulimea caracterelor ...................................................... 25
2.2. Comentarii ....................................................................... 26
2.3. Tipuri de date primare ..................................................... 27
2.4. Constante ........................................................................ 28
2.5. Cuvinte cheie ................................................................... 31
2.6. Identificatori ..................................................................... 31
2.7. Exemple .......................................................................... 33
2.8. Exerciii ............................................................................ 34
3. Expresii. Operanzi. Operatori. ................................................ 36
3.1. Expresii ............................................................................ 36
3.2. Operanzi .......................................................................... 37
3.3. Conversii implicite de tip .................................................. 37
3.4. Operatori ......................................................................... 37
3.5. Exemple .......................................................................... 48
3.6. Exerciii ............................................................................ 54
4. Instruciuni.............................................................................. 56
4.1. Instruciuni expresie......................................................... 56
4.2. Instruciuni de decizie ...................................................... 56
4.3. Instruciuni de ciclare ....................................................... 59
4.4. Instruciuni de salt............................................................ 61
4.5. Exemple .......................................................................... 63
4.6. Exerciii ............................................................................ 77
5. Funcii standard de intrare/ieire ............................................ 78
5.1. Funcii pentru caractere ................................................... 78
5.2. Funcii pentru iruri de caractere ..................................... 79
3
11.. A
ALLG
GO
OR
RIITTM
MII
II LLIIM
MB
BA
AJJE
EA
ALLG
GO
OR
RIITTM
MIIC
CE
E
1.1. De la problem la program
Rezolvarea unei probleme ncepe cu specificarea
acesteia i se ncheie cu obinerea unui program concret i
corect. Programele sunt scrise pentru a instrui mainile s
lucreze cu sarcini specifice sau s rezolve probleme specifice. O
procedur (descris pas cu pas) asociat unei sarcini se numete
algoritm. Programarea este activitatea de codificare a algoritmilor
n calculatoare. Procesul de programare are (n general) patru
pai:
1. Specificarea problemei;
2. Proiectarea unui algoritm pentru rezolvarea sa;
3. Codificarea algoritmului ntr-un limbaj de programare;
4. Testarea programului.
Stop
variabila=expresie
nu
14
nu
secventa A
secventa B
conditie
da
nu
secventa
repet
secvena
ct timp test
conditie
nu
16
contor=start
contor<=sfarsit
da
secventa
nu
1.4. Exemple
1.
Scriei un algoritm care s primeasc la intrare o
temperatur n grade Celsius i s calculeze temperatura
corespunztoare n grade Farenheit i Kelvin.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: c numr real
date de ieire: f, k numere reale
funcionalitate: calculeaz f = 32 + 9*c/5 i k=c-273,15.
Soluia, n pseudocod i schem logic este urmtoarea:
citete c
f = 32 + 9*5/c
k = c + 273,15
scrie f,k
17
Start
c
f=32+9*c/5
k=c-273,15
f, k
Stop
2.
Scriei un algoritm pentru rezolvarea ecuaiei ax+b=0, unde
a i b sunt numere reale citite de la tastatur.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: a, b numere reale
date de ieire: x numr real
funcionalitate: dac a=0 i b=0, atunci afieaz mesajul
Orice numr real este soluie; dac a=0 i b0 atunci
afieaz mesajul Nu exist soluii reale; altfel afieaz
soluia ecuaiei de grad 1 (x=-b/a).
Soluia, n pseudocod i schem logic este urmtoarea:
citete a,b
dac a=0 atunci
dac b=0 atunci
scrie "Orice numr real este soluie"
altfel
scrie "Nu exist soluii reale"
sfrit
altfel
x = -b/a
scrie x
sfrit
18
Start
a,b
a=0
da
nu
b=0
da
"Orice
numar real
este solutie"
nu
x=-b/a
"Nu exista
solutii
reale"
x
Stop
3.
Scriei un algoritm pentru rezolvarea ecuaiei ax2+bx+c=0,
unde a, b i c sunt numere reale citite de la tastatur.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: a, b, c numere reale
date de ieire: x1, x2 numere reale
funcionalitate: dac a=0, atunci (pentru simplitate)
afieaz mesajul "Ecuaia nu este de gradul 2", altfel
calculeaz d=b2-4ac; dac d<0, atunci afieaz mesajul
"Ecuaia are soluii complexe", altfel afieaz soluiile
ecuaiei de grad 2 (x1=(-b-sqrt(d))/(2a) i x2=(b+sqrt(d))/(2a), unde sqrt reprezint funcia radical).
Soluia, n pseudocod i schem logic este urmtoarea:
citete a,b,c
dac a=0 atunci
scrie "Ecuaia nu este de gradul 2"
altfel
d = b*b-4*a*c
dac d<0 atunci
scrie "Ecuaia are soluii complexe"
altfel
x1=(-b-sqrt(d))/(2a)
x2=(-b+sqrt(d))/(2a)
19
Start
a,b,c
a=0
da
d=b*b-4*a*c
nu
x1=(-b-sqrt(d))/(2a)
x2=(-b+sqrt(d))/(2a)
nu
d<0
da
"Ecuatia
nu este de
gradul 2"
x1,x2
"Ecuatia are
solutii complexe"
Stop
4.
Scriei un algoritm care determin cel mai mare divizor
comun a dou numere naturale.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: a, b numere naturale
date de ieire: c numr natural
funcionalitate: folosind algoritmul lui Euclid, se determin
r, restul mpririi lui a la b (notat cu r=a%b), i dac r este
nenul se repet operaia pentru a=b i b=r.
Soluia, n pseudocod i schem logic este urmtoarea:
citete a,b
repet
r = a % b
a = b
b = r
ct timp r0
c = a
scrie c
20
Start
a,b
r=a%b
a=b
b=r
da
r!=0
nu
c=a
c
Stop
5.
Scriei un algoritm care determin dac un numr este prim
sau nu.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: a numr natural
date de ieire: mesajul "prim" sau "compus"
funcionalitate: Fie d numrul de divizori ai lui a (adic
numere naturale din intervalul [2, a/2] pentru la care a se
mparte fr rest). Dac d este 0, atunci numrul este prim,
altfel este compus.
Soluia, n pseudocod i schem logic este urmtoarea:
citete a
d = 0
pentru i=2 la a/2 pas 1 repet
dac a % i = 0 atunci
d = d + 1
sfrit
sfrit
21
Start
a
d=0
a%i=0
da
nu
da
d=d+1
i=i+1
i<=a/2
nu
"compus"
nu
d=0
da
"prim"
Stop
6.
Fie n un numr natural i a1,,an, respectiv, b1,,bn, doi
vectori de n numere reale. Scriei un algoritm care determin
produsul scalar al vectorilor a i b.
Din enunul problemei extragem urmtoarele cerine:
date de intrare: n numr natural, a1,,an, b1,,bn
numere reale
date de ieire: p numr real
22
citete n
pentru i = 1 la n repet
citete a[i], b[i]
sfrit
p = 0
pentru i = 1 la n repet
p = p + a[i]*b[i]
sfrit
scrie p
Start
n
p
p=0
i=1
i=1
nu
nu
i<=n
i<=n
i=i+1
i=i+1
da
a[i], b[i]
da
p=p+a[i]*b[i]
Stop
23
1.5. Exerciii
1.
Scriei un algoritm care determin perimetrul i aria unui
dreptunghi cunoscnd lungimile laturilor.
2.
Scriei un algoritm care determin consumul de combustibil
la o sut de kilometri al unui vehicul tiind consumul total pe
parcursul unei anumite distane.
3.
Scriei un algoritm care determin maximul a trei numere
reale citite de la tastatur.
4.
Scriei un algoritm care, cunoscnd trei valori naturale,
determin dac acestea pot reprezenta laturile unui triunghi. n
caz afirmativ, s se afieze dac triunghiul este oarecare, isoscel
sau echilateral.
5.
Scriei un algoritm pentru rezolvarea sistemului:
a*x + b*y = c
d*x + e*y = f
unde a, b, c, d, e, f sunt numere reale date.
6.
Scriei un algoritm care determin divizorii unui numr
natural nenul.
7.
Scriei un algoritm care determin factorialul unui numr
natural.
8.
Scriei un algoritm care transform un numr din baza 10 n
baza 2.
9.
Scriei un algoritm care transform un numr din baza 2 n
baza 10.
10. Fie n un numr natural i a1,,an numere reale. Scriei un
algoritm care determin media aritmetic a numerelor a1,, an.
11. Fie n un numr natural i a1,,an numere reale. Scriei un
algoritm care determin suma valorilor pozitive din mulimea
a1,,an.
12. Fie n un numr natural i a1,,an numere reale. Scriei un
algoritm care determin valoarea minim din mulimea a1,,an.
13. Fie n un numr natural i m, a1,,an numere reale. Scriei
un algoritm care afieaz toate valorile i pentru care ai=m.
14. Fie n un numr natural i a1,, an numere reale. Scriei un
algoritm care ordoneaz cresctor numerele a1,, an.
24
22.. U
UNNIITTII LLEEXXIICCAALLEE
Unitile lexicale sunt atomii unui program C, aa cum un
roman este format din fraze, iar acestea din cuvinte. Scopul
acestui capitol este s v prezinte aceste noiuni fundamentale.
Orice program C este alctuit din cel puin o funcie (funcia
main). Orice funcie conine zero, una sau mai multe expresii. O
expresie este construit din operanzi conectai prin operatori
conform anumitor reguli sintactice. n plus, textul programelor
poate conine comentarii care s ajute la nelegerea acestuia.
C
aracter
,
:
Denumire
virgul
dou
C
aracter
.
;
'
(
semnul
ntrebrii
apostrof
parantez
rotund stnga
punct
punct
virgul
puncte
?
Denumire
!
"
)
semnul
exclamrii
ghilimele
parantez
rotund dreapta
25
Uniti lexicale
[
{
<
^
+
*
%
|
_
&
parantez
dreapt stnga
acolad
stnga
mai mic
sgeat sus
plus
asterisc
procent
bar
vertical
underscore
ampersand
parantez
dreapt dreapta
}
acolad
dreapta
>
mai mare
=
egal
minus
/
slash
\
backslash
~
tild
]
diez
Co
d ASCII
32
9
10
13
11
12
De
numire
sp
aiu
tab
Semnificaie
un spaiu
2.2. Comentarii
Un comentariu este o poriune de text care este ignorat
de ctre compilatorul C. Un comentariu pe o singur linie ncepe
dup o secven slash-slash // i se termin la sfritul liniei
curente. Un comentariu pe una sau mai multe linii ncepe dup o
secven slash-star /* i se termin la prima secven star-slash
26
sau
suma = a + b; /* calculam suma lui a si b */
Tip/subti
p
unsigned
Mri
me (octei)
1
Domeniu de valori
0255
char
27
Uniti lexicale
signed
char
-128127
char
depinde (cu sau fr
semn)
short
signed int
short
unsigned int
short int
-3276832767
065535
depinde (cu sau fr
2
semn)
long
signed int
long
unsigned int
long int
4
4
21474836482147483647
0 4294967296
depinde (cu sau fr
4
semn)
signed int
2 sau
2 sau
4
unsigned
int
4
int
float
double
2 sau
4
semn)
4
8
-3,401038...3,41038
1,7910308...1,7910308
2.4. Constante
Constantele reprezint cel mai simplu tip de operanzi,
mai exact o valoare care nu poate fi modificat i care are asociat
un tip (stabilit n funcie de modul de scriere al valorii constantei).
S
ecven
escape
\a
\n
\r
\t
\v
\f
\b
\\
\
\
\o
oo
\x
hh
Semnificaie
alert produce un sunt n difuzorul
calculatorului
new line trecerea la rndul urmtor
carriage return revenirea la captul rndului
horizontal tab deplasarea pe orizontal cu
un tab
vertical tab deplasarea pe vertical cu un
tab (la imprimant)
form feed trecerea la pagina urmtoare (la
imprimant)
backspace deplasarea napoi a cursorului
cu un caracter
backslash caracterul backslash
single quote caracterul apostrof
double quote caracterul ghilimele
octal caracterul cu codul ASCII ooo (unde
ooo este un numr n baza 8, vezi Anexa 2 Setul de
caractere ASCII)
hexazecimal caracterul cu codul ASCII hh
(unde hh este un numr n baza 16, vezi Anexa 2
Setul de caractere ASCII)
Uniti lexicale
este un sir). Daca o constant de tip ir de caractere este
prea lung, ea poate fi scris pe mai multe linii n program fie prin
terminarea fiecrui rnd (cu excepia ultimului) cu caracterul
backslash, fie prin scrierea fiecrui rnd ntre ghilimele. De
exemplu, urmtoarele trei iruri sunt identice:
Acesta este un sir
Acesta este \
un sir
Acesta este
un sir
30
2.6. Identificatori
Un identificator este un nume pe care programatorul l d
unei entiti (aceasta poate fi o variabil vezi seciunea
urmtoare, funcie vezi capitolul 7, sau tip de date vezi
31
Uniti lexicale
2.6.1. Variabile
O variabil este un identificator care are asociat un tip, o
adres de memorie i o valoare (i.e. informaia din memorie de la
adresa asociat variabilei). nainte de a fi folosit n program,
orice variabil trebuie declarat, adic se specific numele i tipul
variabilei. Tipul variabilei determin ce operaii se pot efectua cu
valoarea variabilei. Adresa de memorie unde va fi stocat
valoarea variabilei se stabilete automat. Valoarea variabilei
poate fi specificat n faza de declarare (operaie denumit
iniializare) sau ulterior (operaie denumit atribuire).
De exemplu, pentru a defini o variabil de tip flotant dublu
cu numele PI i valoarea 3,1415926, i dou variabile de tip
ntreg fr semn cu numele varsta i greutate, din care varsta
este iniializat cu valoarea 26 vom scrie:
double PI = 3.1415926;
unsigned int varsta = 26, greutate;
2.6.2. Masive
Masivele (sau tablourile de date) sunt blocuri de variabile
de acelai tip, grupate n memorie, accesibile printr-un nume
comun i coordonatele lor n interiorul grupului. Declararea unui
masiv i accesarea elementelor acestuia se realizeaz cu ajutorul
caracterelor paranteze ptrate (denumite n acest context
operator de indexare). Indexarea masivelor se face n limbajul C,
pornind de la 0. Masivele i proprietile acestora sunt prezentate
n capitolul 6. Deocamdat vom prezenta doar cteva exemple:
float v[10];
reale
char c[65];
32
2.7. Exemple
7.
Programul urmtor exemplific noiunile discutate n acest
capitol. Instruciunea de preprocesare din prima linie cere
folosirea bibliotecii de funcii stdio.h, care conine funcii standard
de intrare/ieire (vezi capitolul 4) precum printf. Urmeaz
definiia funciei main, punctul de pornire al oricrui program C. n
corpul funciei main (ntre cele dou acolade), se declar
variabilele PI, raza i aria, prima fiind i iniializat. Funcia
printf afieaz pe ecran mesajul "Introducei raza", iar valoarea
introdus de utilizator este memorat n variabila raza cu ajutorul
funciei scanf. Instruciunea urmtoare calculeaz aria unui cerc
i atribuie rezultatul variabilei aria. n final, funcia printf
afieaz rezultatul calculelor. Codurile %g din mesajul funciei vor
fi nlocuite cu valorile corespunztoare parametrilor raza i aria.
Instruciunea return din final este opional, dar scrierea ei este
o practic bun, valoarea 0 simboliznd terminarea fr erori a
programului.
#include <stdio.h>
#include <conio.h>
int main()
{
float PI = 3.1415926, raza, aria;
printf("Introduceti raza:");
scanf("%f", &raza);
aria = PI * raza * raza;
printf("Aria unui cerc cu raza %g este %g.\n",
raza, aria);
getch();
return 0;
}
33
Uniti lexicale
Introduceti raza:3.1
Aria unui cerc cu raza 3.1 este 30.1907.
8.
#include <stdio.h>
#include <conio.h>
int main()
{
int a, b;
printf("Introduceti a si b");
scanf("%i %i", &a, &b);
printf("%i + %i = %i", a, b, a+b);
getch();
}
2.8. Exerciii
15. Determinai tipul unitilor lexicale din exemplele anterioare.
16. Care dintre urmtoarele secvene sunt constante de tip
caracter: 'a', a, "a", \a i 'aa'?
17. Care dintre urmtoarele secvene sunt constante de tip ir
de caractere: 'a', a, "a", "a"a", "a\"a", "a\\"a" i "aa"?
18. Care dintre urmtoarele secvene sunt constante de tip
ntreg: a, 0xa, 0a, 10, 10.1, 10ul i 10.?
19. Care dintre urmtoarele secvene sunt constante de tip
flotant (simplu sau dublu): 10, 10.1, 10ul, 10.f i 10.?
20. Care dintre urmtoarele secvene pot fi folosite ca
identificator: test, test10, _test10, test_10, 10test, _10test i _10?
21. Determinai tipul, numele i valoarea urmtoarelor variabile:
int test=10, real=010, fictiv=0x10;
float greutate=1.3e2, densitate=3.2;
34
35
33.. E
EXXPPRREESSIIII.. O
OPPEERRAANNZZII.. O
OPPEERRAATTO
OR
RII..
3.1. Expresii
O expresie este o secven de operanzi i operatori. Un
operand poate fi o constant, o variabil sau o alt expresie. O
expresie este caracterizat de o valoare i un tip. Valoarea i tipul
expresiei sunt determinate de operatorii i operanzii care
formeaz expresia.
Regulile de asociativitate i preceden a operatorilor
sunt n general aceleai ca cele din matematic cu unele excepii,
dar o expresie poate conine paranteze rotunde pentru
schimbarea prioritii de evaluare subexpresiilor sale. De
exemplu, fie expresia:
a = (a*b-c/d)*(a-b);
36
3.2. Operanzi
Un operand poate fi: o constant, o constant simbolic,
un identificator de variabil simpl, un identificator de tablou, un
element de tablou, un identificator de structur, un membru al
unei structuri, numele unei funcii, un apel de funcie sau o
expresie.
3.4. Operatori
Limbajul C dispune de un set puternic de operatori.
Operatorii se pot clasifica dup aritate, dup asociere sau dup
prioritatea la evaluare ntr-o expresie. Din punct de vedere al
aritii (adic numrul de operanzi), operatorii sunt unari, binari i
ternari. Operatorii unari se scriu n general naintea operandului
lor (de exemplu: -5, !a, ~x, etc.). Excepie de la aceast regul fac
37
Nivel
Cate
gorie
Oper
atori
de
adresare
Operator
()
Aritate
(asociativitate)
[]
.
->
2
Oper
atori unari
!
~
+ ++ -SD)
&
38
Semnifica
Apel
funcie
s
schimbare prioritat
2 (SD)
Operator
indexare
2 (SD)
Operator
selecie direct
2 (SD)
Operator
selecie indirect
1 (DS)
Negare log
1 (DS)
Negare
nivel de bit
1 (DS)
Operator
semn
1 (DS,
Incrementa
decrementare
1 (DS)
Operator
adres
*
1 (DS)
sizeo
1 (DS)
(tip)
1 (DS)
*
/
%
+
<<
2 (SD)
2 (SD)
2 (SD)
2 (SD)
2 (SD)
2 (SD)
>>
2 (SD)
<
<=
2 (SD)
2 (SD)
>
>=
2 (SD)
2 (SD)
==
!=
2 (SD)
2 (SD)
Operato
adresare indirec
Dimensi
n
octei
operandului
Convers
explicit de tip (c
nmulire
mprire
Modulo
Adunare
Scdere
Deplasa
stnga
Deplasa
dreapta
Mai mic
Mai mic
egal
Mai mar
Mai mar
egal
Egal
Diferit
&
^
2 (SD)
2 (SD)
I pe bi
SAU ex
4
5
Oper
atori
multiplicativi
Oper
atori aditivi
Oper
atori
de
deplasare
Oper
atori
relaionali
8
9
Oper
atori
de
egalitate
Oper
atori pe bii
pe bii
10
11
12
13
14
Oper
atori logici
Oper
ator ternar
Oper
atori
de
|
&&
||
?:
2 (SD)
2 (SD)
2 (SD)
3 (DS)
2 (DS)
SAU pe
I logic
SAU log
Operato
condiional
Atribuire
simpl
39
atribuire
15
Oper
ator
secvenial
*=
2 (DS)
/=
2 (DS)
%=
2 (DS)
+=
2 (DS)
-=
2 (DS)
&=
2 (DS)
^=
2 (DS)
|=
2 (DS)
<<=
2 (DS)
>>=
2 (DS)
2 (SD)
nmulire
atribuire
mprire
atribuire
Modulo
atribuire
Adunare
atribuire
Scdere
atribuire
I pe bii
atribuire
SAU exclu
pe bii i atribuire
SAU pe bi
atribuire
Deplasare
stnga i atribuire
Deplasare
dreapta i atribuire
Evaluare li
expresii
40
Valoarea
Valoarea
Valoarea
Valoarea
Valoarea
Valoarea
Valoarea
Valoarea
Valoarea
18 de tip intreg
6.6 de tip real
8.91 de tip real
2 de tip intreg
0 de tip intreg
2.7 de tip real
7.36 de tip real
3 de tip intreg
0 de tip intreg
= 1.1;
b);// Valoarea
b);// Valoarea
b);// Valoarea
c);// Valoarea
d);// Valoarea
d);// Valoarea
8 de tip intreg
-2 de tip intreg
3.12 de tip real
11.12 de tip real
9.21 de tip real
7.02 de tip real
44
a = 20, b =
a<b;
//
a<=b;
//
a>b;
//
a>=b;
//
13, c;
c este
c este
c este
c este
0
0
1
1
a b
&b
0 0
0 1
1 0
1 1
De exemplu, fie secvena:
short
c = a
d = a
e = a
int a = 20,
& b;
// c
^ b;
// d
| b;
// e
a
^b
0
0
0
1
a
|b
0
1
1
0
a
0
1
1
1
b = 13, c, d, e;
este 4
este 25
este 29
//
//
//
//
//
a
c
b
b
d
este
este
este
este
este
5
12.21
8 (se face conversie la int)
20 (se face conversie la int)
caracterul x
De exemplu:
int a = 3, b = 5;
a += b; // Echivalent cu a = a+b, deci a = 8
47
3.5. Exemple
9.
Programul urmtor exemplific funcionarea operatorilor
unari !, ~, ++, , &, *.
#include <stdio.h>
#include <conio.h>
int main()
{
int val, temp, rez, *pint;
char oper;
printf("Testarea operatorilor unari.\n");
printf("Introduceti operandul:");
scanf("%d",&val);
printf("Introduceti operatorul:");
scanf(" %c",&oper);
switch(oper) {
case '!':
// Operatorul !
rez=!val;
printf("!%d = %d", val, rez);
break;
case '~':
// Operatorul ~
rez=~val;
printf("~%d = %d", val, rez);
break;
case '+':
// Operatorul ++
48
49
50
}
getch();
initiala
lui x +=
lui x -=
lui x *=
lui x /=
lui x %=
finala a
a lui x este 5.
3 este 8.
2 este 6.
1 este 6.
4 este 1.
5 este 1.
lui x este 1.
52
3.6. Exerciii
25. Scriei un program C care citete de la tastatur o
temperatur n grade Celsius i afieaz pe ecran temperatura n
grade Farenheit i Kelvin.
26. Scriei un program C care citete de la tastatur un numr
ntreg i determin dac acesta este divizibil cu 2, 3, 5, 10 i 100.
27. Scriei un program C care determin perimetrul i aria unui
dreptunghi cunoscnd lungimile laturilor.
28. Scriei un program C care determin consumul de
combustibil la o sut de kilometri al unui vehicul tiind consumul
total pe parcursul unei anumite distane.
54
55
Instruciuni
44.. IINNSSTTRRUUCCIIUUNNII
Instruciunile unui program C determin operaiile pe care
acesta le efectueaz. O instruciune este format din cuvinte
cheie, expresii i/sau alte instruciuni. O instruciune care apare n
interiorul altei instruciuni formeaz corpul acesteia din urm.
O instruciune compus este un grup de zero sau mai
multe instruciuni incluse ntr-o pereche de acolade. Efectul
execuiei acesteia este acela al execuiei rnd pe rnd a
instruciunilor care o compun.
Cu excepia instruciunilor compuse, toate instruciunile
se termin prin punct i virgul. Instruciunea vid este o
instruciune care nu face nimic, fiind reprezentat de un singur
caracter punct i virgul. Ea se folosete n locurile unde este
necesar o instruciune, dar nu vrem s se efectueze nici o
operaie.
56
57
Instruciuni
instructiune;
...
...
default:
instructiune;
...
...
case constantan:
instructiune;
...
58
Instruciuni
60
n exemplul urmtor:
int i, j;
for(i = 1, j = 0; i <= 5; ++i)
j = j+i;
61
Instruciuni
62
4.5. Exemple
16. Urmtorul program determin soluia unei ecuaii de gradul
1 cu coeficieni reali, de forma ax+b = 0.
#include <stdio.h>
#include <conio.h>
int main()
{
float a, b;
printf("Introduceti a: ");
scanf("%f", &a);
printf("Introduceti b: ");
scanf("%f", &b);
if(a == 0)
if(b == 0)
printf("Orice numar real e solutie");
else
printf("Nu exista solutii reale");
else {
float x = -b/a;
printf("Solutie: %f", x);
}
getch();
}
Instruciuni
64
65
Instruciuni
11! = 39916800 se termina cu
2 zerouri
n 2 .
lui n este : 7
1
1
2
3
5
8
13
67
Instruciuni
#include "conio.h"
int main()
{
int n,x0,x1,xn,xn1,xn2,dif;
printf(" n = ");
scanf("%d",&n);
if(n>1)
{
x0=1;
x1=1;
dif=n;
while(dif>2)
{
xn=x0;
xn1=x1;
xn2=xn1+xn;
while(xn2<dif)
{
xn=xn1;
xn1=xn2;
xn2=xn1+xn;
}
printf(" %d ",xn1);
dif=dif-xn1;
}
if(dif==2) printf(" %d ",x1+x0);
else printf(" %d ",x0);
}else printf(" Valoarea introdusa nu este in domeniu
\n");
getch();
}
68
69
Instruciuni
36 satisface proprietatea
36 = 1 + 8 + 27
73 satisface proprietatea
73 = 1 + 8 + 64
92 satisface proprietatea
92 = 1 + 27 + 64
99 satisface proprietatea
99 = 8 + 27 + 64
70
produs
0
200
200
600
a = 93
b = 10
a
b
93
10
93
10
46
20
23
40
11
80
11
80
5
160
5
160
2
320
1
640
93 * 10 = 930
produs
0
10
10
50
50
130
130
290
290
930
numrul
folosind
1
. Valoarea aproximativ este afiat la
2
i 1 i
fiecare 1000 de pai i la ultimul pas.
formula n 6
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int n;
double s, p;
printf("Valoarea lui n este : ");
scanf("%d",&n);
71
Instruciuni
s = 0;
for(int i=1; i<=n; ++i) {
s += 1.0/(i*i);
if(i == n || i % 1000 == 1) {
p = sqrt(6*s);
printf("pi(%i) = %f\n", i, p);
}
}
getch();
}
72
restul impartirii
catul impartirii
%d la suma. A mai ramas %d\n",
12345
ramas
ramas
ramas
ramas
ramas
1234
123
12
1
0
73
Instruciuni
Rasturnatul este 54321
74
75
Instruciuni
76
getch();
4.6. Exerciii
36. Scriei un program C care calculeaz produsul cifrelor unui
numr natural.
37. Scriei un program C care determin dac un numr natural
n este prim sau compus.
38. Scriei un program C care determin divizorii unui un numr
natural n.
39. Scriei un program C care citete un numr natural n i dac
1 n 12 afieaz numele lunii a n-a, altfel afieaz "Eroare".
n!
40. Scriei un program C care calculeaz Ank
pentru n
(n k )!
i k numere naturale.
n!
41. Scriei un program C care calculeaz Cnk
pentru
k !(n k )!
n i k numere naturale.
42. Scriei un program C care calculeaz n k pentru n i k
numere naturale.
43. Scriei un program C care aproximeaz numrul e folosind
n
1
formula en pentru un numr natural n.
i 0 i !
77
Prototip
Descriere
int
Efect: afieaz caracterul cu codul
putchar
(int ASCII c pe ecran
c)
int
getchar()
78
Prototip
Descriere
int puts
Efect: afieaz pe ecran irul din
(char *s)
variabila s i trece pe linia urmtoare
79
Prototi
p
Descriere
int
Efect: scrie pe ecran irul fmt n care
printf (char codurile de format sunt nlocuite cu valorile
*fmt, ...);
C
Descriere
aracter
s
informaia este completat n partea stng cu
paiu
spaii (opiunea implicit)
0
informaia este completat n partea stng cu
(zero)
zerouri
informaia este completat n partea dreapt
(minus)
cu spaii
Tabel 5.5 Caractere modificatori pentru valori numerice
C
aracter
+
Descriere
C
aracter
h
Descriere
C
aracter
d
i
u
Tip
parametru
int
int
unsi
gned int
unsi
o
gned int
unsi
x
gned int
X
f
e
E
g
82
unsi
gned int
doub
le
le
le
le
doub
doub
doub
Format ieire
numr ntreg scris n baza 10
numr ntreg scris n baza 10
numr ntreg scris n baza 10
numr ntreg scris n baza 8
numr ntreg scris n baza 16,
cu literele "abcdef"
numr ntreg scris n baza 16,
cu literele "ABCDEF"
numr real scris n baza 10
numr real scris n baza 10 cu
exponent "e"
numr real scris n baza 10 cu
exponent "E"
format e sau f (care este mai
scurt)
G
c
s
le
doub
int
char
un caracter
un ir de caractere
void
C
aracter
h
Descriere
l
l
84
C
aracter
d
Tip
parametru
Format intrare
int*
long
int*
I
u
10
int*
long
int*
unsign
ed int*
unsign
ed long*
unsign
o
ed int*
unsign
O
ed long*
unsign
x
ed int*
X
f
, e, E, g,
G
c
unsign
ed long*
float*
char*
un
caracter
(inclusiv
caractere de spaiere)
char*
s
un ir de caractere
int*
n
nimic
(la
adresa
din
parametru va fi memorat numrul de
caractere citite pn n prezent)
void**
p
un pointer (rar folosit)
De exemplu, secvena urmtoare:
85
Prototip
Descriere
int
Efect: scrie n irul dest irul fmt n
sprintf (char* care codurile de format sunt nlocuite cu
dest,
char
valorile expresiilor marcate prin trei puncte;
*fmt, ...);
5.5. Exemple
33. Programul urmtor citete de la tastatur caracter cu
caracter i afieaz pe ecran doar literele. Programul se oprete
la citirea primului caracter punct.
86
87
2
4
6
8
10
12
14
16
18
20
3
6
9
12
15
18
21
24
27
30
4
8
12
16
20
24
28
32
36
40
5
10
15
20
25
30
35
40
45
50
6
12
18
24
30
36
42
48
54
60
7
14
21
28
35
42
49
56
63
70
8
16
24
32
40
48
56
64
72
80
9 10
18 20
27 30
36 40
45 50
54 60
63 70
72 80
81 90
90 100
88
Caracter");
}
}
}
Kelvin
-303.15
-293.15
-283.15
-273.15
-263.15
-253.15
-243.15
Farenheit
-22
-4
14
32
50
68
86
5.6. Exerciii
44. Scriei un program C care afieaz valorile polinomului
p( x) 2,1x2 3,5x 8, 2 pentru toate valorile [n, n p, n 2 p,..., m] ,
unde n, p i m sunt numere reale citite de la tastatur.
45. Scriei un program C care citete un ntreg zecimal de cel
mult 5 cifre de la tastatura i l afieaz ncadrat de 2 caractere %
astfel: n octal, pe 10 poziii, aliniat la dreapta, i n hexazecimal,
pe 15 poziii i aliniat la stnga.
89
90
unde: tip este tipul datelor din masiv, nume este numele
masivului, iar dim1, dim2, ..., dimk sunt expresii constante a cror
valori reprezint numrul de componente pentru fiecare
dimensiune.
De exemplu, urmtoarea secven de program declar
vectorul v cu 20 de elemente de tip ntreg, matricea mat cu 5x5
elemente de tip caracter i masivul tridimensional masiv cu 3x4x3
elemente de tip real.
int v[20];
char mat[5][5];
float masiv[3][4][2];
91
sau
int v[4]={-1,2,4};
6.2. Structuri
Spre deosebire de masive, care grupeaz sub un singur
nume, date de acelai tip, structura este un tip nou de dat care
grupeaz date de tipuri diferite. Un element al unei structuri se
numete membru sau cmp al structurii. Un membru al unei
structuri poate fi folosit fie ca un singur tip de dat, fie ca o dat
individual. Fiecare membru al unei structuri are un tip predefinit
92
93
94
studentul respectiv:
void afiseaza(struct student *p) {
printf("%s %s %d\n", p->nume, p->prenume, p>nota);
}
6.3. Uniuni
Uniunile ofer utilizatorului posibilitatea refolosirii
aceleiai zone de memorie pentru a memora date de tipuri diferite
la momente diferite de timp. Astfel, o zon de memorie poate
memora date de tip int, pentru ca ulterior aceeai zon s
memoreze date de tip float, ceea ce nu are loc n cazul
structurilor. Scopul acestor reutilizri ale memoriei este
economisirea acesteia.
Uniunile se declar i se folosesc la fel ca structurile,
deosebirea constnd n nlocuirea cuvntului cheie struct cu
cuvntul cheie union. n cazul structurilor se rezerv pentru
fiecare membru cte o zon de memorie de dimensiune
corespunztoare. n cazul uniunilor se rezerv o singur zon de
memorie, de dimensiune egal cu valoarea maxim a
dimensiunilor necesare membrilor si. n cazul uniunilor
utilizatorul trebuie s monitorizeze tipurile de date aflate n
memorie, n fiecare moment al execuiei programului.
n declaraia:
union anstudiu {
char cod;
int numar;
} an;
95
6.4. Cmpuri
Un cmp este un ir de bii definit ca membru al unei
structuri. Un cmp se declar ca un membru de tip unsigned,
numele fiind urmat de un ntreg care precizeaz dimensiunea n
bii a cmpului respectiv. n memorie cmpurile sunt grupate, n
ordinea declarrii lor, de la dreapta spre stnga. Forma general
de declarare a unor cmpuri este:
struct tipstructura {
...
unsigned camp1:dim1;
unsigned camp2:dim2;
...
} identificator;
n care campi este numele cmpului i care ocup dimi bii. Nici
un cmp nu poate avea o dimensiune mai mare dect lungimea
unui cuvnt calculator (32 bii). Nu se pot defini masive de
cmpuri. Operatorul unar adres & nu poate avea ca operand un
cmp.
Prin declaraia:
struct {
unsigned bitii01:2;
unsigned bitii25:4;
unsigned bitii68:3;
} campuri;
6.5. Exemple
38. Programul urmtor citete un numr ntreg n i dac
1 n 7 , atunci afieaz numele zilei corespunztoare din
sptmn, altfel afieaz "Eroare".
#include <stdio.h>
#include <conio.h>
96
97
98
1.000000
99
100
102
frecventelor
6 ori
4 ori
2 ori
2 ori
2 ori
1 ori
1 ori
1 ori
1 ori
1 ori
103
de
de
de
de
1
1
1
1
ori
ori
ori
ori
a1 X a0 ,
ai Z ,
i 0,1,..., n ,
104
Pentru
P X X 3 2X 2 X 2 ,
105
106
}
for(i=0;i<p;i++)
for(j=0;j<q;j++) {
printf("b[%d][%d]=",i,j);
scanf("%f",&b[i][j]);
}
for(i=0;i<m;i++)
for(j=0;j<q;j++) {
c[i][j]=0;
for(k=0;k<n;k++)
c[i][j] += a[i][k]*b[k][j];
printf("c[%d][%d]=%f\n",i,j,c[i][j]);
}
} else {
printf("Produsul A*B nu este definit\n");
}
getch();
1 1 2
1 2
De exemplu, fie matricele A
i B
.
2 0 1
3 4
1 2 1 1 2 5 1 4
Produsul este A B
.
3 4 2 0 1 11 3 10
Numarul de linii a matricei A: 2
Numarul de coloane a matricei A: 2
Numarul de linii a matricei B: 2
Numarul de coloane a matricei B: 3
Se calculeaza produsul A*B
a[0][0] = 1
a[0][1] = 2
a[1][0] = 3
a[1][1] = 4
b[0][0] = -1
b[0][1] = 1
b[0][2] = 2
b[1][0] = -2
b[1][1] = 0
b[1][2] = 1
c[0][0]= -5.000000
c[0][1]= 1.000000
c[0][2]= 4.000000
107
48. Urmtorul program reprezint un dicionar romn-englezfrancez "de jucrie". Programul folosete funcii pentru iruri de
caractere descrise n capitolul 9.
#include <stdio.h>
#include <string.h>
#include <conio.h>
char* cuvinte[][3] = {
"masa", "table", "table",
"scaun", "chair", "chaise",
"mancare", "food", "nourriture",
"apa", "water", "eau",
"om", "human", "humain",
NULL, NULL, NULL
};
int main(void)
{
char cuv_rom[80];
int i;
printf("Introduceti cuvantul romana:");
gets(cuv_rom);
/* cautam cuvantul in dictionar */
for(i = 0; cuvinte[i][0] != NULL; ++i)
if(!strcmp(cuv_rom, cuvinte[i][0])) {
printf("Engleza: %s\nFranceza: %s\n",
cuvinte[i][1], cuvinte[i][2]);
break;
}
if(cuvinte[i][0] == NULL)
printf("Cuvant necunoscut.\n");
getch();
}
108
109
6.6. Exerciii
51. Scriei un program C care afieaz suma elementelor pare
i produsul elementelor impare dintr-un vector de numere reale.
52. Scriei un program C care afieaz poziia primei apariii a
unui numr m ntr-un vector de numere reale.
53. Scriei un program C care afieaz produsul scalar a doi
vectori de numere reale.
54. Scriei un program C care afieaz suma a doi vectori de
numere reale.
111
112
77.. FFUUNNCCIIII
Pentru scrierea unor programe de complexitate cel puin
medie, exist posibilitatea organizrii unor date i a unor aciuni
asupra lor, ntr-o entitate independent, numit funcie. Limbajul
C pune la dispoziia utilizatorului diverse funcii predefinite,
numite funcii standard. Utilizatorul poate s defineasc i s
utilizeze propriile sale funcii, numite funcii utilizator.
Exist o funcie standard, principal, funcia main(),
apelat de sistemul de operare la nceputul execuiei oricrui
program. Funciile apelate pot comunica cu funciile apelante prin
intermediul parametrilor.
unde
tip identificator(lista parametri formali)
Funcii
iar identificator este numele funciei. Pentru funciile care nu
returneaz nici o valoare, tipul funciei este void. Pentru fiecare
parametru din lista parametri formali trebuie specificat tipul
Funcii
sau
#include <numebiblioteca.h>
De exemplu, secvena:
int f(int x)
{
return x-1;
}
116
117
Funcii
int n;
printf(" Valoarea lui n = ");
scanf("%d",&n);
printf("Suma primelor %d numere naturale este
%d\n", n, suma(n));
getch();
}
118
Funcii
120
121
Funcii
s+=vector[i];
return s;
}
int main()
{
int i;
printf(" Numar de componente n = ");
scanf("%d",&n);
citvector();
printf("Suma componentelor este: %d\n",suma());
getch();
}
122
7.4. Recursivitate
Recursivitatea este o tehnic de programare frecvent
utilizat n implementarea funciilor. Tehnica recursivitii const
n autoapelul funciei (de ctre ea nsi), n mod direct sau
indirect. Tehnica poate fi folosit n cazul problemelor cu natur
recursiv i simplific scrierea programelor prin scrierea direct a
formulelor recursive.
Definiia unui proces recursiv trebuie s satisfac condiia
de consisten, adic s se termine ntr-un numr finit de pai.
Un exemplu de funcie inconsistent este urmtorul: fie
1
n0
funcia f : N N N , f n
, n N . De
n
f
n
1
altfel
funcia f : N N , f n
, n N . Evident:
n f n 1 altfel
f (3) 3 f 2 3 2 f 1 3 2 1 f 0 3 2 1 1 3! 6 , ceea ce
Funcii
prezentat
7.5. Exemple
52. Programul urmtor prezint o funcie pentru determinarea
celui mai mare divizor comun a dou numere naturale cu
algoritmul lui Euclid i un program care testeaz aceast funcie.
n program se definete funcia euclid de tip ntreg care are
parametrii formali p i q de tip ntreg. Funcia returneaz valoarea
cmmdc(p,q). Apelul funciei cu parametrii actuali m i n,
euclid(m,n) determin calculul cmmdc(m,n).
#include <stdio.h>
#include <conio.h>
int euclid(int p, int q)
{
int r;
while(r=p%q) {
p=q;
q=r;
}
return q;
}
int main()
{
int m,n;
printf("Valoarea lui m = ");
scanf("%d",&m);
printf("Valoarea lui n = ");
scanf("%d",&n);
printf("cmmdc(%d,%d) = %d \n", m, n,
euclid(m,n));
getch();
}
Prototipul functiei
m = ");
n = ");
= %d \n", m, n,
// Definitia functiei
125
Funcii
nsalv=n;
s=0;
while(n!=0)
{
uc=n%10;
s+=uc;
n/=10;
}
printf(" Suma cifrelor numarului %d este %d
\n",nsalv,s);
if(s%3) return 0;
else return 1;
return s;
}
int main()
{
int n;
printf(" n = ");
scanf("%d",&n);
if(test3(n))
printf(" Numarul %d este divizibil cu 3 \n",n);
else
printf(" Numarul %d nu este divizibil cu 3
\n",n);
getch();
}
126
int s,uc,nsalv;
nsalv=n;
s=0;
while(n!=0)
{
uc=n%10;
s+=uc;
n/=10;
}
printf(" Suma cifrelor numarului %d este %d
\n",nsalv,s);
if(s%9) return 0;
else return 1;
return s;
}
int main()
{
int n;
printf(" n = ");
scanf("%d",&n);
if(test9(n))
printf(" Numarul %d este divizibil cu 9 \n",n);
else
printf(" Numarul %d nu este divizibil cu 9
\n",n);
getch();
}
127
Funcii
#include "stdio.h"
#include "conio.h"
int test4(int n)
{
int udc,uc,k,nsalv;
nsalv=n;
udc=n%10;
n/=10;
k=1;
while(n!=0 && k<=1)
{
uc=n%10;
uc*=10;
udc+=uc;
k++;
n/=10;
}
printf(" Numarul format cu ultimele doua cifre\n");
printf(" ale numarului %d este egal cu %d
\n",nsalv,udc);
if(udc%4==0) return 1;
else return 0;
}
int main()
{
int n;
printf(" n = ");
scanf("%d",&n);
if(test4(n))
printf(" Numarul %d este divizibil cu 4 \n",n);
else
printf(" Numarul %d nu este divizibil cu 4
\n",n);
getch();
}
128
129
Funcii
Numarul 432 nu este divizibil cu 11
130
131
Funcii
printf(" Linia %d inexistenta \n",k);
getch();
}
132
133
Funcii
int n,i,j,a[20][20];
printf(" Dimensiunea: ");
scanf("%d",&n);
printf(" Elementele matricei \n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf(" a [ %d ][ %d ] = ",i,j);
scanf("%d",&a[i][j]);
}
printf(" Suma elementelor de pe diagonala secundara
este %d \n",sum(a,n));
getch();
}
134
135
Funcii
{
int i,j,s;
s=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i<j) s+=a[i][j];
return s;
}
int main()
{
int n,i,j,a[20][20];
printf(" Dimensiunea: ");
scanf("%d",&n);
printf(" Elementele matricei \n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf(" a [ %d ][ %d ] = ",i,j);
scanf("%d",&a[i][j]);
}
printf(" Suma elementelor supradiagonale este %d
\n",sum(a,n));
getch();
}
137
Funcii
if(n%i==0)
sum_div+=i;
if(n==sum_div)
return 1;
else return 0;
}
int main()
{
int i,k,n;
printf(" k = ");
scanf("%d",&k);
printf(" Primele %d numere perfecte sunt \n",k);
i=1;
n=1;
while(n<=k)
{
if(perfect(i))
{
printf(" %d este numar perfect \n",i);
i++;
n++;
}
else
i++;
}
getch();
}
139
Funcii
n = 220
m = 264
Numerele 220 si 264 nu sunt prietene
141
Funcii
getch();
}
142
143
Funcii
int main()
{
int k,n,produs;
printf(" n = ");
scanf("%d",&n);
for(k=2;k<=n;k++)
{
produs=k*(k+1);
printf(" %d < %d * %d = %d < %d \n",produs1,k,k+1,produs,produs+1);
if(prim(produs-1))
printf(" %d este numar prim \n",produs-1);
if(prim(produs+1))
printf(" %d este numar prim \n",produs+1);
}
getch();
}
uc(int);
sc(int);
nc(int);
dis(void);
c1(void);
145
Funcii
v[i]=uc;
i++;
}
return sc;
146
int li,ls,i,nt;
nt=0;
printf(" li = ");
scanf("%d",&li);
printf(" ls = ");
scanf("%d",&ls);
if(li <= ls && nc(li)==5)
{
for(i=li;i<=ls;i++)
{
if(sc(i)%2==1){
if(dis() && c1() && uc(i)==7){
nt++;
printf(" %d. i = %d \n",nt,i);
}}
}
printf(" Numar total de numere %d \n",nt);
}
else
printf(" Numarul %d nu are 5 cifre sau %d > %d
\n",li,li,ls);
getch();
}
147
Funcii
int i;
for(i=0;*(s+i)!='\0';i++);
n=i;
}
int main()
{
char s[100];
int lung;
puts(" Sirul ");
gets(s);
strlen(s,lung);
printf(" Sirul %s are %d caractere \n",s,lung);
getch();
}
148
getch();
Sir sursa
functie pentru copiere sir de caractere
Sirul sursa
functie pentru copiere sir de caractere
Sirul destinatie
functie pentru copiere sir de caractere
Adresa sir destinatie returnata de functie este
22fec0
Adresa sir destinatie din functia main este 22fec0
149
Funcii
}
Sir sursa
concatenare
Sir destinatie
functie pentru
Sirul concatenat
functie pentru concatenare
Adresa sir destinatie returnata de functie este
22fec0
Adresa sir destinatie din functia main este 22fec0
150
.
cmmdc (m, n)
cmmdc m, cmmdc n, m%n daca n 0
Programnd aceast relaie de recuren se obine urmtorul
cod:
// Varianta recursiva a algoritmului lui Euclid
#include "stdio.h"
#include "conio.h"
int cmmdc(int m, int n)
{
if(n==0) return m;
else return cmmdc(n,m%n);
151
Funcii
}
int main()
{
int m,n;
printf(" m = ");
scanf("%d",&m);
printf(" n = ");
scanf("%d",&n);
if(cmmdc(m,n)==1)
printf(" Numerele %d si %d sunt prime intre ele
\n",m,n);
else
printf(" Numerele %d si %d nu sunt prime intre
ele \n",m,n);
printf(" cmmdc( %d , %d ) = %d
\n",m,n,cmmdc(m,n));
getch();
}
Se obin rezultatele:
m = 124
n = 24
Numerele 124 si 24 nu sunt prime intre ele
cmmdc( 124 , 24 ) = 4
77. Program urmtor afieaz primii n termeni ai irului lui
Fibonacci, definit prin: fib : N N , fib 0 1 , fib 1 1 ,
fib n fib( n 1) fib n 2 , n 2 .
#include <stdio.h>
#include <conio.h>
int fib(int n)
{
if (n==0 || n==1)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n,i;
152
78. Programul afieaz primii n termeni din irurile aritmeticgeometric-armonic ale lui Gauss, definite de relaiile de recuren:
a b c
a0 p 0 ,
b0 q 0 ,
c0 r 0 ,
an n1 n1 n1 ,
3
3
, n N * .
bn 3 an1 bn1 cn1 , cn
1
1
1
153
Funcii
if (n==0) return q;
else return pow(a(n-1)*b(n-1)*c(n-1), 1./3);
}
double c(int n)
{
if (n==0) return r;
else return 3/(1/a(n-1)+1/b(n-1)+1/c(n-1));
}
int main()
{
int n,i;
printf("Sirurile aritmetic-geometric-armonic ale
lui Gauss\n");
printf("a( 0 ) = p = ");
scanf("%lf", &p);
printf("b( 0 ) = q = ");
scanf("%lf", &q);
printf("c( 0 ) = r = ");
scanf("%lf", &r);
printf(" Rangul maxim al termenilor n = ");
scanf("%i", &n);
for(i=0;i<n;i++)
printf("a( %d ) = %.4f\tb( %d ) = %.4f\tc(
%d ) = %.4f\n", i, a(i), i, b(i), i, c(i));
getch();
}
Sirurile aritmetic-geometric-armonic
a( 0 ) = p = 1
b( 0 ) = q = 2
c( 0 ) = r = 3
Rangul maxim al termenilor n = 4
a( 0 ) = 1.0000 b( 0 ) = 2.0000 c(
a( 1 ) = 2.0000 b( 1 ) = 1.8171 c(
a( 2 ) = 1.8178 b( 2 ) = 1.8117 c(
a( 3 ) = 1.8117 b( 3 ) = 1.8117 c(
0
1
2
3
)
)
)
)
=
=
=
=
3.0000
1.6363
1.8056
1.8117
n 1,
m0
Ack m, n
Ack m 1,1 ,
n 0 , m, n N N .
Ack m 1, Ack m, n 1 , altfel
154
#include <stdio.h>
#include <conio.h>
int ack(int m,int n)
{
if (m==0)
return n+1;
else if (n==0)
return ack(m-1,1);
else
return ack(m-1,ack(m,n-1));
}
int main()
{
int n,m,i,j;
printf(" Functia lui Ackerman \n");
printf(" Tastati valoarea lui m = ");
scanf("%d",&m);
printf(" Tastati valoarea lui n = ");
scanf("%d",&n);
for(i=0;i<=m;i++)
for(j=0;j<=n;j++)
printf("Ackerman ( %d , %d ) = %d\n",
i, j, ack(i,j));
getch();
}
Functia lui Ackerman
Tastati valoarea lui
Tastati valoarea lui
Ackerman ( 0 , 0 ) =
Ackerman ( 0 , 1 ) =
Ackerman ( 0 , 2 ) =
Ackerman ( 1 , 0 ) =
Ackerman ( 1 , 1 ) =
Ackerman ( 1 , 2 ) =
Ackerman ( 2 , 0 ) =
Ackerman ( 2 , 1 ) =
Ackerman ( 2 , 2 ) =
Ackerman ( 3 , 0 ) =
Ackerman ( 3 , 1 ) =
Ackerman ( 3 , 2 ) =
m = 3
n = 2
1
2
3
2
3
4
3
5
7
5
13
29
155
Funcii
x 1,
x 12
, x R .
f ( x)
f
f
x
2
,
altfel
#include <stdio.h>
#include <conio.h>
double f(double x)
{
if (x>=12)
return x-1;
else
return f(f(x+2));
}
int main()
{
float x,a,b,h;
int n,i;
printf(" Intervalul [a,b] \n");
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf(" Numarul de puncte n = ");
scanf("%i", &n);
h=(b-a)/n;
for(i=0;i<=n;i++){
x=a+i*h;
printf("MP( %g ) = %g\n", x, f(x));
}
getch();
}
Intervalul
a = 11.5
b = 13.5
Numarul de
MP( 11.5 )
MP( 11.7 )
MP( 11.9 )
MP( 12.1 )
156
[a,b]
puncte n = 10
= 11.5
= 11.7
= 11.9
= 11.1
12.3
12.5
12.7
12.9
13.1
13.3
13.5
)
)
)
)
)
)
)
=
=
=
=
=
=
=
11.3
11.5
11.7
11.9
12.1
12.3
12.5
.
hn, s, d , m
hn 1, s, m, d s d hn 1, m, d , s daca n 1
Rezolvarea const n programarea relaii de recuren a irului de
mutri din problema turnurilor din Hanoi. Programul afieaz
pentru orice n N * dat, mutrile care conduc la soluia problemei.
#include <stdio.h>
#include <conio.h>
void hanoi(int n, char a, char b, char c)
157
Funcii
{
if (n==1) {
printf("Se muta discul %d de pe %c pe %c\n",
n, a, b);
} else {
hanoi(n-1,a,c,b);
printf("Se muta discul %d de pe %c pe %c\n",
n, a, b);
hanoi(n-1,c,b,a);
}
}
int main()
{
int n;
printf("Problema turnurilor din Hanoi\n");
printf("Numarul de discuri n = ");
scanf("%d",&n);
hanoi(n,'A','B','C');
getch();
}
Problema turnurilor din Hanoi
Numarul de discuri n = 3
Se muta discul 1 de pe A pe B
Se muta discul 2 de pe A pe C
Se muta discul 1 de pe B pe C
Se muta discul 3 de pe A pe B
Se muta discul 1 de pe C pe A
Se muta discul 2 de pe C pe B
Se muta discul 1 de pe A pe B
7.6. Exerciii
60. S se scrie funcia void citirevector(int v[], int n)
care citete de la tastatur n numere ntregi i le memoreaz n
vectorul v.
61. S se scrie funcia void afiarevector(int v[], int
n) care afieaz pe ecran primele n numere ntregi din vectorul v.
62. Scriei un program C care s testeze cele dou funcii (adic
citete un vector de la tastatur i l afieaz pe ecran).
63. Scriei o funcie care afieaz suma elementelor pare i
produsul elementelor impare dintr-un vector i un program C care
s o testeze.
158
159
88.. P
PO
OIIN
NTTE
ER
RII
II G
GE
ES
STTIIU
UN
NE
EA
AD
DIIN
NA
AM
MIIC
C
A
AM
ME
EM
MO
OR
RIIE
EII
8.1. Pointeri
Un pointer este o variabil a crei valoare este o adres
din memoria calculatorului. Prin intermediul pointerului,
programatorul poate accesa i modifica informaia stocat n
memorie la adresa indicat de acesta. Pentru a accesa ntr-un
mod coerent informaia stocat n memorie, fiecare pointer are un
tip de baz care determin tipul informaiei aflate n memorie.
Pentru a declara o variabil de tip pointer se folosete
sintaxa:
tip *nume;
160
p-3
p+3
p+2 este egal cu q, p-q este egal cu 2, q-2 este egal cu p, iar p[2],
q[0], *q i vec[4] reprezint aceeai informaie.
162
Prototi
p
Descriere
void*
calloc
163
164
Prototi
p
void*
memcpy (void
*dest,
void
*src,
unsigned
cnt)
void*
memccpy
(void *dest,
void
*src,
int
c,
unsigned
cnt)
Descriere
Efect: copiaz cnt octei din zona de
memorie src n dest (src i dest trebuie s fie
disjuncte)
Rezultat: adresa destinaie dest
165
8.7. Exemple
82. Programul urmtor citete un vector de dimensiune n (n citit
de la tastatura) i l afieaz n ordine invers. Dimensiunea
maxim a vectorului depinde doar de memoria calculatorului,
nefiind fixat la compilare. Accesul la elementele vectorului se
face prin pointeri i operatorul de derefereniere.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int n, i;
166
free(vector);
getch();
vectorului n:6
v[0]:1
v[1]:2
v[2]:3
v[3]:4
v[4]:5
v[5]:6
167
168
170
}
// Functia pentru afisarea crescatoare a numerelor
void afis_sortc(int v[], int m)
{
int i,k;
printf(" Afisare crescatoare \n");
for(i=1;i <= m;i++) {
if(v[i]!=0)
for(k=1;k<=v[i];k++)
printf("%d ",i);
}
printf("\n");
}
// Functia pentru afisarea descrescatoare a
numerelor
void afis_sortd(int v[], int m)
{
int i,k;
printf(" Afisare descrescatoare \n");
for(i=m;i >= 1 ;i--) {
if(v[i]!=0)
for(k=1;k<=v[i];k++)
printf("%d ",i);
}
printf("\n");
}
// Vectorul numere (alocat dinamic) contine numerele
citite
// Vectorul v este vectorul (alocat dinamic)
// frecventelor numerelor in vectorul numere
// n numarul de numere citite
// nmax si m limitele lui n respectiv a valorilor
numerelor citite
int main()
{
long int nmax = 1000000;
int n, m = 100, *numere, *v;
171
172
1
2
3
4
5
6
7
=
=
=
=
=
=
=
7
2
2
2
3
4
4
vectorului n:5
v[0]:1
v[1]:2
v[2]:3
v[3]:7
v[4]:2
8.8. Exerciii
74. Scriei o funcie care primete ca parametri dou numere
naturale m i n i citete de la tastatur o matrice de numere
reale de dimensiune m x n. Memoria necesar pentru stocarea
173
174
Prototi
p
Descriere
unsign
Efect: calculeaz lungimea irului de
ed
strlen caractere sir
(char *sir)
sir
char*
Efect: transform majusculele din irul
strlwr (char sir n minuscule
*sir)
sir)
char*
Efect: transform minusculele din irul
strupr (char sir n majuscule
*sir)
sir)
char*
strcat (char dest
*dest,
char
*src)
dest)
char*
Efect: adaug cel mult cnt caractere din
strncat
irul src la sfritul irului dest
(char *dest,
Rezultat: adresa irului modificat (adic
char
*src,
dest)
unsigned
cnt)
char*
Efect: caut prima apariie n irul src a
strchr (char caracterului c.
*src, int c)
sir)
char*
Efect: copiaz irul src n irul dest
strcpy (char
Rezultat: adresa irului modificat (adic
*dest,
char
dest)
*src)
char*
Efect: copiaz cel mult cnt caractere din
strncpy
irul
src
n irul dest (numrul de caractere
(char *dest,
char
*src, copiate este minimul dintre cnt i lungimea
irului src).
unsigned
cnt)
Rezultat: adresa irului modificat (adic
dest)
char*
Efect: copiaz irul src ntr-o zon de
strdup (char memorie alocat cu malloc; programatorul
*src)
trebuie s elibereze cu funcia free zona de
char*
strset (char
*dest,
int
c)
char*
strnset
(char *dest,
int
c,
unsigned
cnt)
char*
Efect: compar caracterele din irurile
strcmp (char src1 i src2
*src1,
char
Rezultat: valoarea 0 dac irurile src1 i
*src2)
178
n este 5
n este -1
s1 este "limba"
n este 1
Prot
otip
int
isalpha
(int c)
int
islower
(int c)
int
isupper
(int c)
int
isdigit
(int c)
int
isxdigit
(int c)
int
isalnum
(int c)
int
isblank
Descriere
Efect: testeaz dac c este o liter
Rezultat: 1 dac c este liter, 0 altfel
Efect: testeaz dac c este o minuscul
Rezultat: 1 dac c este minuscul, 0 altfel
Efect: testeaz dac c este o majuscul
Rezultat: 1 dac c este majuscul, 0 altfel
Efect: testeaz dac c este o cifr
Rezultat: 1 dac c este cifr, 0 altfel
Efect: testeaz dac c este o cifr
hexazecimal
Rezultat: 1 dac c este hexazecimal, 0
altfel
Efect: testeaz dac c este liter sau cifr
(echivalent cu expresia isalpha(c) || isdigit(c))
Rezultat: 1 dac c este liter sau cifr, 0
altfel
Efect: testeaz dac c este caracter gol
179
int
iscntrl
(int c)
int
ispunct
(int c)
int
isgraph
(int c)
int
isprint
(int c)
int
tolower
(int c)
int
toupper
(int c)
180
9.4. Exemple
87. Programul urmtor citete un mesaj de la tastatur i
afieaz un extras din acesta. Extrasul este specificat prin poziia
de nceput i lungimea maxim admis.
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main()
{
char mesaj[256], extras[256];
int i, n, l;
printf("Introduceti un text:\n");
gets(mesaj);
printf("Pozitie de start: ");
scanf("%i", &n);
printf("Lungime: ");
scanf("%i", &l);
i = 0;
do {
extras[i] = mesaj[i+n];
++i;
} while(extras[i-1] != 0 && i<l);
printf("Extras: %s", extras);
getch();
}
Introduceti un text:
Limbajul C are doar 32 de instructiuni!
Pozitie de start: 9
Lungime: 10
Extras: C are doar
181
183
de
un
se
ir
185
186
187
189
190
191
192
193
9.5. Exerciii
79. Scriei un program C care citete de la tastatur un ir de
caractere A i un caracter B, i afieaz numrul de apariii ale
caracterului B n irul A.
80. Scriei un program C care citete de la tastatur dou iruri
de caractere A i B, i afieaz numrul de apariii ale irului B n
irul A.
81. Scriei un program C care citete de la tastatur dou iruri
de caractere A i B, i un numr natural n, i afieaz pe ecran
irul A n care a fost inserat irul B la poziia n.
82. Scriei un program C care citete de la tastatur iruri de
caractere i afieaz pe ecran lungimea i irul respectiv. Citirea
se oprete la introducerea irului vid (cu lungime 0) de ctre
utilizator.
83. Scriei un program C care citete de la tastatur iruri de
caractere i le afieaz pe ecran nlocuind majusculele cu
minuscule. Citirea se oprete la introducerea irului vid (cu
lungime 0) de ctre utilizator.
84. Scriei un program C care citete o succesiune de cuvinte.
Citirea se oprete la introducerea irului vid (cu lungime 0) de
ctre utilizator. Programul afieaz apoi cuvntul cel mai lung.
85. Scriei un program C care citete o succesiune de cuvinte.
Citirea se oprete la introducerea irului vid (cu lungime 0) de
ctre utilizator. Programul afieaz apoi cuvntul cel mai mare
din punct de vedere lexicografic (de exemplu, "casa" este mai
mare din punct de vedere lexicografic dect "dar").
86. Scriei un program C care citete o succesiune de cuvinte,
le sorteaz n ordine cresctoare i apoi le afieaz n aceast
ordine.
194
1100.. FFUUNNCCIIII M
MA
ATTE
EM
MA
ATTIIC
CE
E
Biblioteca limbajului C pune la dispoziia utilizatorului un
numr de funcii matematice. Aceste funcii au prototipurile n
fiierul antet math.h, stdlib.h i/sau complex.h. Orice program
care folosete astfel de funcii trebuie s conin directivele
compilator:
#include <math.h>
#include <stdlib.h>
#include <complex.h>
Num
Valoare
Descriere
e
M_E
2.7182818284590
1.4426950408889
log2 e
452354
G2E
G10E
2
10
M_LO
634074
M_LO
M_LN
M_LN
M_PI
_2
M_PI
M_PI
_4
0.4342944819032
5182765
0.6931471805599
4530942
2.3025850929940
4568402
3.1415926535897
9323846
1.5707963267948
9661923
0.7853981633974
4830962
lg e
ln 2
ln10
4
195
Funcii matematice
M_1_
0.3183098861837
PI
9067154
M_2_
PI
M_2_
SQRTPI
M_SQ
RT2
M_SQ
RT1_2
0.6366197723675
8134308
1.1283791670955
1257390
1.4142135623730
9504880
0.7071067811865
4752440
1
2
Proto
tip
doub
le
sin
(double x)
doub
le
cos
(double x)
doub
le
asin
(double x)
Funcie
Returneaz sin x n 1,1
Returneaz cos x n 1,1
Returneaz
Argumentul x 1,1
arcsin x
, .
2 2
doub
arccos x
Returneaz
n
0, .
le
acos
(double x)
Argumentul x 1,1
doub
Returneaz tg x n R , x 2k 1 ,
le
tan
2
(double x)
k Z
doub
le
atan
(double x)
doub
le
atan2
(double x,
double y)
196
Returneaz arctg x n ,
2 2
x
Returneaz arctg n ,
2 2
y
Funcie
Prototi
p
doubl
e
pow
(double
x,
double y)
doubl
e
sqrt
(double x)
Returneaz
xy , x 0
Returneaz
x , x0
Funcie
Prototi
p
double
(double
Returneaz e x
double
(double
Returneaz ln x , x 0
double
log10
(double x)
double
log2 (double
x)
double
sinh (double
x)
double
cosh (double
x)
double
tanh (double
x)
double
asinh
(double x)
Returneaz lg x , x 0
exp
x)
log
x)
cosh
x)
double
(double
Returneaz l o g 2 x , x 0
e x e x
2
x
e e x
Returneaz ch( x)
2
sh( x)
Returneaz th( x)
ch( x)
Returneaz
inversa
x
x
e e
sh( x)
2
Returneaz
inversa
x
x
e e
ch( x)
2
Returneaz sh( x)
funciei
funciei
197
Funcii matematice
double
Returneaz
tanh (double
sh
( x)
x)
th( x)
inversa
funciei
ch( x)
Prototip
Descriere
int
atoi
Conversie ir de caractere n
(const char* c)
ntreg
double atof
Conversie ir de caractere n
(const char* c)
double
long
atoll
Conversie ir de caractere n
(const char* c)
ntreg lung
Tabel 10.6 Funcii de rotunjire, trunchiere, modul
Prototi
p
Funcie
double
Returneaz cel mai mare ntreg mai
floor
mic dect x , x
(double x)
double
Returneaz cel mai mic ntreg mai
ceil (double
mare dect x , x
x)
double
Funcie de rotunjire a lui x
round
(double x)
double
Returneaz trunchierea lui x
trunc
(double x)
int
Returneaz x , x Z
abs (int x)
double
Returneaz x , x R
fabs (double
x)
Tabel 10.7 Funcii pentru generare numere aleatoare
Prototi
p
int
rand ()
srand
198
void
Descriere
Returneaz la fiecare apel un numr
natural aleatoriu
Iniializeaz valoarea de start a
10.1. Exemple
101. Programul urmtor calculeaz valorile unei funcii reale de o
singur variabil real, ntr-un interval dat. Fie funcia f : R R ,
definit astfel:
2
xe1 x ,
x , 1
2
f x 3 x 1ln 1 x
x 1,1
x 1,
sin x * sh x
Vom scrie programul care calculeaz valorile funciei f
n n 2 puncte din intervalul a , b . Folosind expresia analitic a
a, b
a, b
n care se calculeaz
199
Funcii matematice
int main()
{
double a,b,h,x;
int n,k;
printf("Extremitatile intervalului [a,b] \n");
printf(" a = ");
scanf(%lf, &a);
printf(" b = ");
scanf(%lf, &b);
printf("Numarul de puncte din intervalul (%f,
%f) in care se calculeaza f(x)=", a, b);
scanf("%d",&n);
h=(b-a)/n;
for(k=0,x=a; k<=n+1; x=a+k*h,k++)
printf("%d. f ( %f ) = %f \n",k+1,x,f(x));
getch();
}
200
n domeniul
a , b c, d R 2 .
limbajul C astfel:
double f(double x, double y)
{
return atan(x+y);
}
\n");
\n");
(%f,
(%f,
201
Funcii matematice
for(k=0,x=a,nrp=1;k<=n;k++,x=a+k*hx)
for(p=0,y=c;p<=m;p++,y=c+p*hy,nrp++)
printf("%d. f ( %f, %f ) = %f\n", nrp,
x, y, f(x,y));
getch();
}
m2.
Extremitatile intervalului [a,b]
a = -2
b = 1
Extremitatile intervalului [c,d]
c = -3
d = 4
Numarul de puncte din intervalul (-2.000000,
1.000000) in care se calculeaza f(x) = 2
Numarul de puncte din intervalul (-3.000000,
4.000000) in care se calculeaza f(x) = 2
1. f ( -2.000000, -3.000000 ) = -1.373401
2. f ( -2.000000, 0.500000 ) = -0.982794
3. f ( -2.000000, 4.000000 ) = 1.107149
4. f ( -0.500000, -3.000000 ) = -1.292497
5. f ( -0.500000, 0.500000 ) = 0.000000
6. f ( -0.500000, 4.000000 ) = 1.292497
7. f ( 1.000000, -3.000000 ) = -1.107149
8. f ( 1.000000, 0.500000 ) = 0.982794
9. f ( 1.000000, 4.000000 ) = 1.373401
x a, b
f xn
, n N . Acest ir este convergent i tinde la
f xn
intervalul
f x . Funcia recursiv x
funciile
calculeaz termenii irului aproximaiilor.
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
double f(double x)
{
return pow(x,3)-3*x+1;
}
double fd(double x)
{
return 3*pow(x,2)-3;
}
double fd2(double x)
{
return 6*x;
}
double x(int n, double p)
{
if(n==0) return p;
else return x(n-1,p)-f(x(n-1,p))/fd(x(n-1,p));
}
int main()
{
double p, e, eps, a, b;
int n;
printf("Intervalul [a,b]\n");
printf("a = ");
scanf("%lf",&a);
printf("b = ");
scanf("%lf",&b);
if(f(a)*fd2(a)>0) p=a;
if(f(b)*fd2(b)>0) p=b;
printf("Eroarea de aproximare eps : ");
scanf("%d",&eps);
e=eps+1;
n=0;
203
Funcii matematice
while(e>eps) {
printf("x ( %d ) = %f\n",n,x(n,p));
e=fabs(x(n+1,p)-x(n,p));
n++;
}
printf("Numar total de iteratii = %d \n",n-1);
printf("Solutia ecuatiei cu eroarea %f este
%f\n", eps, x(n,p));
getch();
}
integralei
f x dx
a
continu pe a , b , a ,b x0 , x1,
ba
, xi x0 ih ,
2n
i 1, 2,..., 2n . n aceste condiii, se poate demonstra c are loc
aproximarea
b
n 1
n
h
f
x
dx
~
f
a
f
b
2
f
x
4
f x2 k 1 ,
2k
a
3
k 1
k 1
a, b ,
a x0 x1 ... x2n b , h
f x dx .
a
204
Ca
1 x
205
Funcii matematice
a, b ,
ba
yi y xi
,
xi x0 ih ,
n
i 1, 2,..., n . n aceste condiii, se poate demonstra c valorile
funciei necunoscute y , n punctele diviziunii a ,b , sunt date de
a x0 x1 ... xn b ,
termenii
irului
lui
Euler:
y0 y a ,
yi 1 yi hf xi , yi ,
exemplu
206
Valoare exacta
y(0.000000) = 1.000000
y(0.100000) = 1.010050
y(0.200000) = 1.040811
y(0.300000) = 1.094174
y(0.400000) = 1.173511
y(0.500000) = 1.284025
y(0.600000) = 1.433329
y(0.700000) = 1.632316
y(0.800000) = 1.896481
y(0.900000) = 2.247908
y(1.000000) = 2.718282
207
Funcii matematice
10.2. Exerciii
87. Scriei un program C care determin perimetrul i aria unui
triunghi cunoscnd lungimile laturilor.
88. Scriei un program C care citete un unghi n grade
sexagesimale i calculeaz valoarea funciei sinus, cosinus i
tangent.
208
cu formula n 6
i 1
1
s scad sub un anumit prag specificat
i2
de utilizator.
90. Scriei un program C care afieaz valoarea funciei
n
209
210
Prototi
p
Descriere
FILE*
Efect: deschide fiierul name n modul
fopen
(char de accesare mode.
*name,
char
Rezultat: returneaz un pointer la o
*mode)
Prototip
Descriere
int
Efect: scrie caracterul cu codul ASCII
fputc (int c, c n fiierul fptr
FILE * fptr)
Un alt exemplu:
FILE *fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("Eroare la deschiderea fisierului");
}else {
int c=fgetc(fp);
if(c==EOF)
printf("Fisierul este gol.\n");
else
printf("Am citit caracterul %c", c);
fclose(fp);
}
212
Prototip
Descriere
Efect: scrie irul s n fiierul fptr
Rezultat: un numr nenegativ n caz
de succes sau EOF n caz de eroare
char*
Efect: citete un ir de maximum
fgets (char *s, cnt-1 caractere din fiierul fptr i l pune
int cnt, FILE
n memorie la adresa s
*fptr)
Rezultat: adresa irului sau NULL
daca s-au terminat datele sau a aprut o
eroare
Exemplul urmtor scrie un mesaj n fiierul test.txt.
int fputs
(char *s, FILE
*fptr)
213
Prototi
p
Descriere
int
Efect: scrie n fiierul fptr irul fmt n
fprintf
care codurile de format sunt nlocuite cu valorile
(FILE *fptr,
char
*fmt, expresiilor marcate prin trei puncte;
Rezultat: numrul de caractere scrise
...);
De exemplu:
FILE *fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("Eroare la deschiderea fisierului");
}else {
char cuvant[100];
fscanf(fp, "%s", cuvant);
printf("Am citit %s.\n", cuvant);
fclose(fp);
}
Prototi
p
unsign
ed
fread
(void *dest,
unsigned
size,
unsigned
cnt,
FILE
*fptr)
unsign
ed
fwrite
(void
*src,
unsigned
size,
unsigned
cnt,
FILE
*fptr)
Descriere
Efect: citete maxim cnt elemente de
dimensiune size din fiierul fptr n zona de
memorie dest.
Rezultat: numrul de elemente citite
complet
Efect: scrie maxim cnt elemente de
dimensiune size n fiierul fptr din zona de
memorie src.
Rezultat: numrul de elemente scrise
complet
De exemplu:
FILE *fp = fopen("test.txt", "wb");
if(fp == NULL) {
printf("Eroare la deschiderea fisierului");
}else {
int valori[] = {1, 2, 3, 5};
fwrite(valori, sizeof(int), 4, fp);
fclose(fp);
}
De exemplu:
FILE *fp = fopen("test.txt", "rb");
if(fp == NULL) {
printf("Eroare la deschiderea fisierului");
}else {
int valori[20];
int citite = fread(valori, sizeof(int), 20, fp);
printf("Am citit %d intregi.\n", citite);
fclose(fp);
}
215
Prototi
p
Descriere
long
Rezultat: poziia curent n fiier sau
ftell ( FILE EOF n caz de eroare
*fptr)
int
Efect: mut poziia curent pentru
fseek
(FILE fiierul fptr cu offset octei relativ la poziia
*fptr,
long
offset,
int specificata de parametrul origin.
Rezultat: numrul de elemente scrise
origin)
complet
Parametrul origin al funciei fseek poate fi una din
constantele SEEK_CUR (denot poziia curent), SEEK_END
(denot sfritul fiierului), SEEK_SET (denot nceputul fiierului).
De exemplu:
FILE *fp = fopen("test.txt", "wb");
if(fp == NULL) {
printf("Eroare la deschiderea fisierului");
}else {
fseek(fp, 0, SEEK_END); // la sfarsitul
fisierului
printf("Fisierul are %li octeti.\n", ftell(fp));
fseek(fp, 0, SEEK_SET); // la inceputul
fisierului
fclose(fp);
}
ntr-un
program
necesit
Prototi
p
int
remove (char
*nume)
int
rename (char
*vechi, char
*nou)
int
chdir
(char
*nume)
char*
getcwd (char
*dest,
int
cnt)
int
mkdir
(char
*nume)
int
rmdir
(char
*nume)
Descriere
Efect: terge fiierul nume
Rezultat: 0 n caz de succes sau diferit
de zero altfel
Efect: redenumete fiierul vechi n nou
Rezultat: 0 n caz de succes sau diferit
de zero altfel
Efect: face nume directorul curent de
lucru
Rezultat: 0 n caz de succes sau diferit
de zero altfel
Efect: copiaz n zona de memorie dest
(cu dimensiune maxim de cnt octei) calea
directorului curent.
Rezultat: dest n caz de succes i NULL
altfel
Efect: creeaz directorul nume
Rezultat: 0 n caz de succes sau diferit
de zero altfel
Efect: terge directorul nume
Rezultat: 0 n caz de succes sau diferit
de zero altfel
11.10. Exemple
107. Programul urmtor copiaz coninutul unui fiier n alt fiier
folosind funciile pentru blocuri de date. Numele fiierelor sunt
citite de la tastatur.
#include <stdio.h>
#include <conio.h>
int main()
{
char sursa[256], destinatie[256];
printf("Fisierul sursa: ");
gets(sursa);
printf("Fisierul destinatie: ");
217
if(rename(numeVechi, numeNou) != 0)
printf("Redenumirea nu s-a efectuat");
else
printf("Redenumirea s-a efectuat");
getch();
218
219
220
else
}
<stdio.h>
<conio.h>
<string.h>
<ctype.h>
struct contact {
char nume[50];
char adresa[100];
char telefon[15];
}agenda[100];
int intrari;
char * numefisier = "agenda.dat";
void incarcare(void)
{
puts("Incarcare agenda");
FILE *f = fopen(numefisier,"rb");
if(f == NULL) {
printf("Fisierul %s lipseste. Incep o agenda
noua.\n", numefisier);
intrari = 0;
}else{
intrari = fread(agenda, sizeof(contact),
100, f);
fclose(f);
}
}
void salvare(void)
{
puts("Salvare agenda");
FILE *f = fopen(numefisier, "wb");
if(f == NULL) {
printf("Fisierul %s nu poate fi
modificat.\n", numefisier);
}else{
221
222
223
224
afieaz
mesajele
Incarcare agenda
Fisierul agenda.dat lipseste. Incep o agenda noua.
Functia dorita:
[1] Cautare in agenda dupa nume
[2] Cautare in agenda dupa numar
[3] Cautare in agenda dupa adresa
[4] Adaugare in agenda
[5] Listare agenda
[6] Stergere din agenda
[7] Sortare agenda
[0] Terminare
225
226
nume
numar
adresa
nume
numar
adresa
nume
numar
adresa
[4]
[5]
[6]
[7]
[0]
0
Salvare agenda
nume
numar
adresa
nume
numar
adresa
227
nume
numar
adresa
nume
numar
adresa
228
[3]
[4]
[5]
[6]
[7]
[0]
5
Intrarea 0:
Nume: Andrei Bautu
Adresa: Constanta
Telefon: 123456
Intrarea 1:
Nume: Paul Vasiliu
Adresa: Constanta
Telefon: 654321
Intrarea 2:
Nume: Elena Bautu
Adresa: Constanta
Telefon: 123654
Au fost gasite 3 contacte.
Functia dorita:
[1] Cautare in agenda dupa nume
[2] Cautare in agenda dupa numar
[3] Cautare in agenda dupa adresa
[4] Adaugare in agenda
[5] Listare agenda
[6] Stergere din agenda
[7] Sortare agenda
[0] Terminare
0
Salvare agenda
11.11. Exerciii
96. Scriei un program C care afieaz pe ecran doar literele i
spaiile din coninutul unui fiier al crui nume a fost citit de la
tastatur.
97. Scriei un program C care copiaz coninutul unui fiier n alt
fiier caracter cu caracter (folosind funciile fgetc i fputc),
exceptnd semnele de punctuaie care sunt nlocuite cu spaiu.
98. Scriei un program C care copiaz coninutul unui fiier n alt
fiier linie cu linie (folosind funciile fgets i fputs), transformnd
majusculele n minuscule.
229
230
231
Metode de programare
1122.. M
MEETTO
OD
DE
ED
DE
EP
PR
RO
OG
GR
RA
AM
MA
AR
RE
E
12.1. Metoda Divide et Impera
Metoda const n descompunerea problemei de rezolvat n dou
sau mai multe subprobleme care, la rndul lor se descompun n
dou sau mai multe subprobleme, pn cnd se obin
subprobleme a cror rezolvare este direct i nu mai necesit
alte descompuneri. Soluia problemei iniiale se obine prin
combinarea soluiilor problemelor cu rezovare direct n care a
fost descompus.
S presupunem c urmeaz procesarea irului sk , sk 1, , s p i
exist
cu proprietatea
k m p . irul
sk , sk 1,
, sp
se
k i
, sp .
, s p are parametrii de
12.2. Exemple
77. Program pentru calculul sumei primelor n numere naturale
Fie suma S 1, n a1 a2
an i
a ak 1
S k, p k
ak
kp
. Evident se poate defini relaia
kp
ap
ak
kp
de recuren: S k , p k p
,
k p
S k , 2 S 2 1, p k p
232
n 5 se obine:
S 1,5 S 1,3 S 4,5 S 1, 2 S 3,3 S 4, 4 S 5,5
k k 1
S k, p
k
p kp
. Evident se poate defini relaia
kp
k
kp
de recuren: S k , p k p
.
k p
S k , 2 S 2 1, p k p
Astfel, pentru n 5 se obine:
S 1,5 S 1,3 S 4,5 S 1, 2 S 3,3 S 4, 4 S 5,5
233
Metode de programare
{
afis(k,(k+p)/2);
afis((k+p)/2+1,p);
printf(" S(%d,%d)=%d
\n",k,(k+p)/2,s(k,(k+p)/2));
printf(" S(%d,%d)=%d
\n",(k+p)/2+1,p,s((k+p)/2+1,p));
}
}
int main()
{
int k,p;
printf(" n = ");
scanf("%d",&n);
afis(1,n);
printf(" S = %d ",s(1,n));
getch();
}
n = 5
S(1,1)=1
S(2,2)=2
S(1,1)=1
S(2,2)=2
S(3,3)=3
S(1,2)=3
S(3,3)=3
S(4,4)=4
S(5,5)=5
S(4,4)=4
S(5,5)=5
S(1,3)=6
S(4,5)=9
S = 15
234
ap
kp
. Evident se poate defini relaia de
kp
ak
kp
recuren: P k , p k p k p
,
P k , 2 P 2 1, p k p
relaie care este o descompunere a lui P 1, n . Astfel, pentru
n 5 se obine:
P 1,5 P 1,3 P 4,5 P 1, 2 P 3,3 P 4, 4 P 5,5
k k 1
P k, p
k
p k p
. Evident se poate defini relaia de
kp
k
kp
recuren: P k , p k p k p
.
P k , 2 P 2 1, p k p
Astfel, pentru n 5 se obine:
P 1,5 P 1,3 P 4,5 P 1, 2 P 3,3 P 4, 4 P 5,5
235
Metode de programare
if(k==p)
printf(" fact(%d,%d)=%d \n",k,k,fact(k,k));
else
{
afis(k,(k+p)/2);
afis((k+p)/2+1,p);
printf(" fact(%d,%d)=%d
\n",k,(k+p)/2,fact(k,(k+p)/2));
printf(" fact(%d,%d)=%d
\n",(k+p)/2+1,p,fact((k+p)/2+1,p));
}
}
int main()
{
int k,p;
printf(" n = ");
scanf("%d",&n);
afis(1,n);
printf(" S = %d ",fact(1,n));
getch();
}
n = 5
fact(1,1)=1
fact(2,2)=2
fact(1,1)=1
fact(2,2)=2
fact(3,3)=3
fact(1,2)=2
fact(3,3)=3
fact(4,4)=4
fact(5,5)=5
fact(4,4)=4
fact(5,5)=5
fact(1,3)=6
fact(4,5)=20
S = 120
max xk , xk 1,
max max xk , xk 1,
, xp
, x k p , max x k p , x k p ,
1
2
2
2 2
xk
237
Metode de programare
Numarul de termeni din sir n = 5
Termenul 1 = 23
Termenul 2 = 21
Termenul 3 = 44
Termenul 4 = 55
Termenul 5 = 32
Maximul din sir este 55.000000
Metode de programare
Pasul 1:
starea iniial a problemei este prima alternativ
posibil pentru starea curent ; fie aceasta x1 S1 ;
Pasul 2:
dac starea curent rezultat prin alternativa x1
Pasul 6:
dac starea curent nu este starea final atunci:
Pasul 7:
dac pentru starea curent exist alternative
disponibile, atunci se alege prima dintre ele i se continu;
Pasul 8:
altfel, se revine la starea anterioar celei curente,
soluia parial construit devine x x1 , x2 , , xk 1 i se face salt
la Pasul 7.
Pasul 9:
dac, n urma unui pas de revenire, s-a ajuns la
starea iniial i nu mai sunt alternative disponibile, atunci
problema nu are soluie i stop.
n cazul n care trebuie determinate toate soluiile problemei,
cutarea continu dup determinarea fiecrei soluii prin
efectuarea de reveniri succesive.Terminarea cutrii este decis
n momentul n care s-a revenit la starea iniial i nu mai exist
alternative disponibile.
Dac se dorete obinerea numai a soluiilor care optimizeaz o
funcie
criteriu, atunci metoda se aplic pentru determinarea tuturor
soluiilor problemei,
fiecare nou soluie rezultat fiind comparat cu cea mai bun
soluie determinat anterior. Pentru aceasta este necesar
reinerea celei mai bune soluii calculate la fiecare moment.
240
241
Metode de programare
Funcia validare verific dac sunt satisfcute condiiile interne
specifice problemei i care atribuie variabilei ev (este valid)
k=1;x[k]=0;
while(k>0)
do
{
succesor(x,k,as);
if(as)
validare(x,k,ev);
}while(as && !ev);
if(as)
if(k==n) afisare(x,k);
else
{
k=k+1;
242
12.5. Exemple
Prezentm n continuare cteva exemple clasice de aplicare a
metodei backtracking. Pentru fiecare exemplu este furnizat codul
surs i un exemplu de execuie a programului.
80. Program pentru generarea permutrilor unei mulimi de n
obiecte
// Generare permutari de n obiecte si a numarului
lor nf
#include "stdio.h"
#include "conio.h"
typedef int sir[100];
sir a,x;
int i,k,n,as,ev,nf;
void succesor(sir x,int k,int &as)
{
if(x[k]<n)
{
as=1;
x[k]=x[k]+1;
}
else as=0;
}
void validare(sir x,int k, int &ev)
{
ev=1;
for(i=1;i<=k-1;i++)
if(!(x[k]!=x[i]))
ev=0;
}
void afisare(sir x, int k)
{
int i;
printf(" %d ( ",nf);
243
Metode de programare
for(i=1;i<=k-1;i++)
printf("%d, ",a[x[i]]);
printf("%d ) \n",a[x[i]]);
}
int main()
{
printf(" Generarea permutarilor de n obiecte
\n");
nf=0;
printf(" Numarul de obiecte n = ");
scanf("%d",&n);
printf(" Tastati obiectele \n");
for(i=1;i<=n;i++)
{
printf(" a [ %d ] = ",i);
scanf("%d",&a[i]);
}
k=1;x[k]=0;
while(k>0)
{
do
{
succesor(x,k,as);
if(as)
validare(x,k,ev);
}while(as && !ev);
if(as)
if(k==n) {nf++;afisare(x,k);}
else
{
k=k+1;
x[k]=0;
}
else k=k-1;
}
printf(" Numarul permutarilor de %d obiecte
este egal cu %d \n",n,nf);
getch();
}
244
245
Metode de programare
printf("%d ) \n",a[x[i]]);
}
int main()
{
printf(" Generarea combinarilor de n luate cate p
\n");
cnp=0;
printf(" Numarul de obiecte n = ");
scanf("%d",&n);
printf(" Tastati obiectele \n");
for(i=1;i<=n;i++)
{
printf(" a [ %d ] = ",i);
scanf("%d",&a[i]);
}
printf(" Combinari luate cate p = ");
scanf("%d",&p);
if(p<=n)
{
k=1;x[k]=0;
while(k>0)
{
do
{
succesor(x,k,as);
if(as)
validare(x,k,ev);
}while(as && !ev);
if(as)
if(k==p) {cnp++;afisare(x,k);}
else
{
k=k+1;
x[k]=0;
}
else k=k-1;
}
printf(" Numarul combinarilor de %d obiecte
luate cate %d este egal cu %d \n",n,p,cnp);
getch();
}
else
printf(" Eroare in date: p>n \n");
getch();
}
246
247
Metode de programare
}
void afisare(sir x, int k)
{
int i;
printf("%d ( ",anp);
for(i=1;i<=k-1;i++)
printf("%d, ",a[x[i]]);
printf("%d ) \n",a[x[i]]);
}
int main()
{
printf(" Generarea aranjamentelor de n luate
cate p \n");
anp=0;
printf(" Numar de obiecte n = ");
scanf("%d",&n);
printf(" Tastati obiectele \n");
for(i=1;i<=n;i++)
{
printf(" a [ %d ] = ",i);
scanf("%d",&a[i]);
}
printf(" Aranjamente luate cate p = ");
scanf("%d",&p);
if(p<=n)
{
k=1;x[k]=0;
while(k>0)
{
do
{
succesor(x,k,as);
if(as)
validare(x,k,ev);
}while(as && !ev);
if(as)
if(k==p) {anp++;afisare(x,k);}
else
{
k=k+1;
x[k]=0;
}
else k=k-1;
}
printf(" Numarul de aranjamente de %d luate
cate %d este egal cu %d\n",n,p,anp);
248
249
Metode de programare
as=1;
x[k]=x[k]+1;
}
else
as=0;
}
void validare(int &ev)
{
ev=1;
}
void afisare(sir x,int k)
{
printf(" %d (",nel);
for(i=1;i<=k;i++)
printf(" %d ",a[i][x[i]]);
printf(")\n");
}
int main()
{
int i;
nel=0;
printf(" Produs cartezian \n");
printf(" Numarul de multimi m = ");
scanf("%d",&m);
printf(" Tastati elementele multimilor \n");
for(i=1;i<=m;i++)
{
printf(" Numarul de elemente ale multimii %d
n[%d] = ",i,i);
scanf("%d",&n[i]);
printf(" Tastati elementele multimii %d \n",i);
for(j=1;j<=n[i];j++)
{
printf(" a%d[%d] =",i,j);
scanf("%d",&a[i][j]);
}}
printf(" Produsul cartezian a celor %d multimi are
elementele :\n",m);
k=1;x[k]=0;
while(k>0)
{
do
{
succesor(x,k,as);
if(as)
validare(ev);
250
251
Metode de programare
4 ( 1 11 99 )
5 ( 1 22 66 )
6 ( 1 22 77 )
7 ( 1 22 88 )
8 ( 1 22 99 )
9 ( 1 33 66 )
10 ( 1 33 77 )
11 ( 1 33 88 )
12 ( 1 33 99 )
13 ( 2 11 66 )
14 ( 2 11 77 )
15 ( 2 11 88 )
16 ( 2 11 99 )
17 ( 2 22 66 )
18 ( 2 22 77 )
19 ( 2 22 88 )
20 ( 2 22 99 )
21 ( 2 33 66 )
22 ( 2 33 77 )
23 ( 2 33 88 )
24 ( 2 33 99 )
Numarul total de elemete este egal cu 24
252
253
Metode de programare
{
succesor(x,k,as);
if(as)
validare(x,k,ev);
}while(as&&!ev);
if(as)
if(k==n) {
printf("
Solutia %d
\n",nsol);
nsol++;
afisare(x,k);
getch();
}
else
{
k++;
x[k]=0;
}
else k--;
}
printf(" Numarul total de solutii rezultat este %d
\n",nsol-1);
getch();
}
Problema celor n dame
Numarul de dame n = 4
Solutia 1
Dama 1 este pe linia 1 si coloana
Dama 2 este pe linia 2 si coloana
Dama 3 este pe linia 3 si coloana
Dama 4 este pe linia 4 si coloana
Solutia 2
Dama 1 este pe linia 1 si coloana
Dama 2 este pe linia 2 si coloana
Dama 3 este pe linia 3 si coloana
Dama 4 este pe linia 4 si coloana
Numarul total de solutii rezultat
2
4
1
3
3
1
4
2
este 2
Metode de programare
int succesor(sir x,int k,int &as)
{
if(x[k]<n)
{
as=1;
x[k]=x[k]+1;
}
else
as=0;
return as;
}
12.7. Exemple
Relum exemplele din seciunea 12.3.2 pentru care folosim
metoda backtracking n variant recursiv.
85. Program pentru generarea permutrilor unei mulimi de n
obiecte. n acest caz, S1 S 2 S n a1 , a2 , an . Alternativele
256
a1, a2 ,
an .
Funcia validare
257
Metode de programare
{
ev=1;
for(i=1;i<=k-1;i++)
if(!(x[k]!=x[i]))
ev=0;
return ev;
}
void afisare(sir x, int k)
{
int i;
printf(" %d ( ",nf);
for(i=1;i<=k-2;i++)
printf("%d, ",a[x[i]]);
printf("%d ) \n",a[x[i]]);
}
void back(int k)
{
if(sol(k)) {nf++;afisare(x,k);}
else
{
init(k);
while(succesor(x,k,as))
if(validare(x,k,ev))
back(k+1);
}
}
int main()
{
printf(" Generarea permutarilor de n obiecte
\n");
nf=0;
printf(" Numarul de obiecte n = ");
scanf("%d",&n);
printf(" Tastati obiectele \n");
for(i=1;i<=n;i++)
{
printf(" a [ %d ] = ",i);
scanf("%d",&a[i]);
}
back(1);
printf(" Numarul permutarilor de %d obiecte este
egal cu %d \n",n,nf);
getch();
}
258
259
Metode de programare
return as;
}
int validare(sir x,int k, int &ev)
{
ev=1;
for(i=1;i<=k-1;i++)
if((k>=2) && !(a[x[k]]>a[x[k-1]]))
ev=0;
return ev;
}
void afisare(sir x, int k)
{
int i;
printf(" %d ( ",cnp);
for(i=1;i<=k-2;i++)
printf("%d, ",a[x[i]]);
printf("%d ) \n",a[x[i]]);
}
void back(int k)
{
if(sol(k)) {cnp++;afisare(x,k);}
else
{
init(k);
while(succesor(x,k,as))
if(validare(x,k,ev))
back(k+1);
}
}
int main()
{
printf(" Generarea combinarilor de n luate cate
p \n");
cnp=0;
printf(" Numarul de obiecte n = ");
scanf("%d",&n);
printf(" Tastati obiectele \n");
for(i=1;i<=n;i++)
{
printf(" a [ %d ] = ",i);
scanf("%d",&a[i]);
}
printf(" Combinari luate cate p = ");
scanf("%d",&p);
if(p<=n)
{
260
261
Metode de programare
}
int sol(int k)
{
return k==p+1;
}
int succesor(sir x,int k,int &as)
{
if(x[k]<n)
{
as=1;
x[k]=x[k]+1;
}
else
as=0;
return as;
}
int validare(sir x,int k, int &ev)
{
ev=1;
for(i=1;i<=k-1;i++)
if(x[k]==x[i])
ev=0;
return ev;
}
void afisare(sir x, int k)
{
int i;
printf(" %d ( ",anp);
for(i=1;i<=k-2;i++)
printf("%d, ",a[x[i]]);
printf("%d ) \n",a[x[i]]);
}
void back(int k)
{
if(sol(k)) {anp++;afisare(x,k);}
else
{
init(k);
while(succesor(x,k,as))
if(validare(x,k,ev))
back(k+1);
}
}
int main()
{
262
263
Metode de programare
11 ( 4, 2 )
12 ( 4, 3 )
Numarul de aranjamente de 4 luate cate 2 este egal
cu 12
264
265
Metode de programare
Numarul de multimi m = 3
Tastati elementele multimilor
Numarul de elemente ale multimii 1 n[1] = 2
Tastati elementele multimii 1
a1[1] =11
a1[2] =22
Numarul de elemente ale multimii 2 n[2] = 3
Tastati elementele multimii 2
a2[1] =1
a2[2] =2
a2[3] =3
Numarul de elemente ale multimii 3 n[3] = 4
Tastati elementele multimii 3
a3[1] =6
a3[2] =7
a3[3] =8
a3[4] =9
Produsul cartezian a celor 3 multimi are elementele
:
1
( 11 1 6 )
2
( 11 1 7 )
3
( 11 1 8 )
4
( 11 1 9 )
5
( 11 2 6 )
6
( 11 2 7 )
7
( 11 2 8 )
8
( 11 2 9 )
9
( 11 3 6 )
10
( 11 3 7 )
11
( 11 3 8 )
12
( 11 3 9 )
13
( 22 1 6 )
14
( 22 1 7 )
15
( 22 1 8 )
16
( 22 1 9 )
17
( 22 2 6 )
18
( 22 2 7 )
19
( 22 2 8 )
20
( 22 2 9 )
21
( 22 3 6 )
22
( 22 3 7 )
23
( 22 3 8 )
24
( 22 3 9 )
Numarul total de elemete este egal cu 24
266
267
Metode de programare
void back(int k)
{
if(sol(k))
{
printf("
Solutia %d
\n",nsol);
nsol++;
afisare(x,k);
}
else
{
init(k);
while(succesor(x,k,as))
if(validare(x,k,ev))
back(k+1);
}
}
int main()
{
nsol=1;
printf(" Problema celor n dame \n");
printf(" Numarul de dame n = ");
scanf("%d",&n);
back(1);
printf(" Numarul total de solutii rezultat este %d
\n",nsol-1);
getch();
}
268
2
4
1
3
3
1
4
2
este 2
Metode de programare
B
pentru i 0; i n; i
repeta
x sel ( A)
if (test ( B, x))
adaug ( B, x)
afis ( B)
Dificultatea n aceast variant const n scrierea funciei sel.
Dac funcia sel este bine conceput, atunci putem fi siguri c
soluia B gsit este o soluie optim. Dac funcia sel nu este
foarte bine conceput, atunci soluia B va fi doar o soluie
posibil i nu va fi optim. Ea se poate apropia ns mai mult sau
270
B
prel A
pentru i 0; i n; i
repeta
x A[i ]
if (test ( B, x))
adaug ( B, x)
afis ( B)
Funciile test, adaug i afis joac acelai rol ca n prima
variant de implementare a metodei greedy.
Prezentm n continuare exemple de probleme rezolvate cu
metoda greedy.
90. Fie A o mulime cu n elemente numere reale. S se
determine mulimea B cu numr maxim de elemente a cror
sum s fie maxim.
Este evident c pentru ca numrul elementelor mulimii B
s fie maxim i suma lor s fie maxim, trebuie ca B s conin
numai elemente pozitive i nule. Funcia alege selecteaz
elemetele mulimii A. Funcia posibil returneaz o valaore
nenul (1) dac a fost selectat un element pozitiv sau nul din
271
Metode de programare
12.9. Exemple
// Problema sumei maxime
#include "stdio.h"
#include "conio.h"
int n,m,i;
float sel(float a[])
{
return a[i];
}
int test(float b[],float x)
{
if(x>=0)
return 1;
else return 0;
}
void adaug(float b[],float x)
{
b[m]=x;
m++;
}
void afis(float b[])
{
float s;
if(m)
{
printf(" Multimea B are %d elemente \n",m);
for(i=0,s=0;i<m;s+=b[i],i++)
printf(" B [ %d ]= %f \n",i,b[i]);
s+=b[i];
printf(" Suma elementelor multimii B este %f \n",s);
}
else
printf(" Multimea B este vida \n");
}
void greedy(float a[],float b[])
272
float x;
for(i=0;i<n;i++)
{
x=sel(a);
if(test(b,x))
adaug(b,x);
}
afis(b);
}
int main()
{
float a[50],b[50];
printf(" Numarul de elemente ale multimii n =
");
scanf("%d",&n);
printf(" Elementele multimii A : \n");
for(i=0;i<n;i++)
{
printf(" A [ %d ] = ",i);
scanf("%f",&a[i]);
}
greedy(a,b);
getch();
}
Metode de programare
Numarul de elemente ale multimii n = 3
Elementele multimii A :
A [ 0 ] = -9.
A [ 1 ] = -1.
A [ 2 ] = -2.
Multimea B este vida
274
}
int main()
{
int a[50],b[50],k;
printf(" Numarul de elemente ale multimii n =
");
scanf("%d",&n);
printf(" Elementele multimii A : \n");
for(i=0;i<n;i++)
{
printf(" A [ %d ] = ",i);
scanf("%d",&a[i]);
}
printf(" Divizorul comun k = ");
scanf("%d",&k);
greedy(a,b,k);
getch();
}
Metode de programare
Numarul de elemente ale multimii n = 6
Elementele multimii A :
A [ 0 ] = 2
A [ 1 ] = 3
A [ 2 ] = 4
A [ 3 ] = 1
A [ 4 ] = 12
A [ 5 ] = 22
Divizorul comun k = 5
Submultimea multiplilor de 5 este vida
276
277
Metode de programare
{
if(obiect[i].g<=dif)
{
rucsac[m].nr=obiect[i].nr;
rucsac[m].g=obiect[i].g;
rucsac[m].benef=obiect[i].benef;
rucsac[m].raport=obiect[i].raport;
grcurent+=rucsac[m].g;
benef+=rucsac[m].benef;
rucsac[m].f=1.;
m++;
}
else
{
rucsac[m].nr=obiect[i].nr;
rucsac[m].g=dif;
rucsac[m].benef=(obiect[i].benef/obiect[i].g)*dif;
rucsac[m].raport=rucsac[m].benef/rucsac[m].g;
benef+=rucsac[m].benef;
rucsac[m].f=rucsac[m].g/obiect[i].g;
m++;
}
}
void afis(void)
{
if(m)
{
printf(" Rucsacul contine %d obiecte \n",m);
for(i=0;i<m;i++)
{
printf(" Obiectul %d \n",rucsac[i].nr);
printf("\t\t Greutate %f \n",rucsac[i].g);
printf("\t\t Fractiunea de greutate %f
\n",rucsac[i].f);
printf("\t\t Beneficiu %f \n",rucsac[i].benef);
printf("\t\t Raport beneficiu/greutate %f
\n",rucsac[i].raport);
}
printf(" Beneficiul total este %f \n",benef);
}
else
printf(" Rucsacul este gol \n");
}
void greedy(void)
{
prel();
278
279
Metode de programare
Obiectul 1
Beneficiu 20.000000
Raport beneficiu/greutate 4.000000
Greutate 2.000000
Fractiunea de greutate 1.000000
Beneficiu 6.000000
Raport beneficiu/greutate 3.000000
Obiectul 0
Greutate 4.000000
Fractiunea de greutate 1.000000
Beneficiu 8.000000
Raport beneficiu/greutate 2.000000
Beneficiul total este 34.000000
Beneficiul total este 34.000000
280
Metode de programare
12.11. Exemple
Vom exemplifica aplicarea metodei programrii dinamice unor
probleme clasice.
93. Problema nmulirii optime a matricilor. Fie n matrici
Ap0 p1 , Ap1 p2 , , Apn1 pn . Deoarece nmulirea matricilor este
asociativ, produsul Ap0 p1 Ap1 p2 Apn1 pn poate fi calculat n mai
multe moduri. Se pune problema determinrii acelei asocieri a
factorilor pentru care produsul celor n matrici se poate efectua cu
un numr minim de nmuliri elementare. Este cunoscut faptul c
numrul de nmuiri necesare efectrii produsului a dou matrice
M pq M qr este egal cu p q r . De exemplu, pentru matricele
282
A22 , A23 , A34 , produsul A22 A23 A34 se poate calcula folosind
asocierea
care
2 2 3 2 3 4 36
necesit
p0 p1
Ap1 p2
Apn1 pn , ceea
nmuliri
elementare
necesare
calculului
produsului
Ap0 p1 , Ap1 p2 , , Apn1 pn . Pentru ca asocierea factorilor produsului
Ap0 p1 Ap1 p2
factorilor
Ap0 p1 Ap1 p2
Ap0 p1 Ap1 p2
Apn1 pn
produselor
efecturii
produsului
Apk pk 1
Ap j1 p j ,
egal
cu
283
Metode de programare
sol[i ][i ] 0 i 1, 2,
,n .
284
285
Metode de programare
printf("\n\n Asocierea optima a factorilor
produsului este: \n\n");
afis(1,n);
printf("\n\n Numarul minim de inmultiri este egal cu
%d \n",sol[1][n]);
getch();
}
, ik ,
287
Metode de programare
1 j m
1.1, 2.3, 2.5 , 2.3, 2.5, 7.,3.2 , 1.1, 2.3, 2.5, 7.,3.2 , 7.,3.2 .
Cel mai lung subir comun este 1.1, 2.3, 2.5, 7.,3.2 i are
lungimea 5. Fie X k x1 , x2 , , xk subirul primilor k termeni al
lui X , numit prefixul de ordin k al lui X , Yp y1, y2 ,
, yp
egalitatea:
l X k 1 , Yp1
l X k , Yp
max l X k 1, Yp , l X k , Yp1
daca
X k Yp
daca
X k Yp
l[k ][ p ]
. Programul
max l[k ][ p 1], l[k 1][ p ] daca x[k ] y[ p ]
primete la intrare dimensiunile i termenii celor dou iruri. Se
afieaz, dac exist, lungimea i termenii subirului comun
288
de recuren.
// Cel mai lung subsir comun si lungimea lui
#include "stdio.h"
#include "conio.h"
float x[50],y[50],l[50][50],subsir[50];
int k,p;
void sir(int n,int m)
{
for(k=1;k<=n;l[k][0]=0,k++);
for(p=1;p<=m;l[0][p]=0,p++);
for (k=1; k<=n; k++)
for (p=1; p<=m; p++)
if (x[k]==y[p])
l[k][p]=1+l[k-1][p-1];
else
l[k][p]=(l[k-1][p]>l[k][p-1]) ? l[k-1][p] : l[k][p1];
}
int main()
{
int n,m,i;
printf(" Numarul de termeni ai sirului X : ");
scanf("%d",&n);
printf(" Termenii sirului X \n");
for(i=1;i<=n;i++)
{
printf(" x [ %d ] = ",i);
scanf("%f",&x[i]);
}
printf(" Numarul de termeni ai sirului Y : ");
scanf("%d",&m);
printf(" Termenii sirului Y \n");
for(i=1;i<=m;i++)
{
printf(" y [ %d ] = ",i);
scanf("%f",&y[i]);
}
sir(n,m);
printf(" Lungimea subsirului comun maximal este %d
\n",(int)l[n][m]);
if(l[n][m])
{
printf(" Cel mai lung subsir comun este: \n");
289
Metode de programare
for (i=0,k=n,p=m;l[k][p];)
if (x[k]==y[p])
{
subsir[i++]=x[k];
k--;
p--;
}
else
if (l[k][p]==l[k-1][p])
k--;
else
p--;
for (k=0;k<=i-1; k++)
printf(" %f ",subsir[k]);
}
else
printf(" Nu exista subsiruri comune \n");
getch();
}
290
3.200000
-7.000000
291
Metode de programare
int main()
{
int n,m,i;
printf(" Numarul de termeni ai sirului X : ");
scanf("%d",&n);
printf(" Termenii sirului X \n");
for(i=1;i<=n;i++)
{
printf(" x [ %d ] = ",i);
x[i]=getche();
printf("\n");
}
printf(" Numarul de termeni ai sirului Y : ");
scanf("%d",&m);
printf(" Termenii sirului Y \n");
for(i=1;i<=m;i++)
{
printf(" y [ %d ] = ",i);
y[i]=getche();
printf("\n");
}
sir(n,m);
printf(" Lungimea subsirului comun maximal este %d
\n",(int)l[n][m]);
if(l[n][m])
{
printf(" Cel mai lung subsir comun este: \n");
for (i=0,k=n,p=m;l[k][p];)
if (x[k]==y[p])
{
subsir[i++]=x[k];
k--;
p--;
}
else
if (l[k][p]==l[k-1][p])
k--;
else
p--;
for (k=0;k<=i-1; k++)
printf(" %c ",subsir[k]);
}
else
printf(" Nu exista subsiruri comune \n");
getch();
}
292
293
ntrebri de autoevaluare
294
a. 15 (adic 25 -10)
b. 25 (adic valoarea cea mai mare)
c. 4 sau 8 (depinde de implementarea tipului double)
d. 2 (adic sizeof(a), a fiind singura variabila din expresie)
e. eroare (operatorul sizeof nu se aplica unei expresii)
6. Care este valoarea lui a dup secvena urmtoare?
int a = 4;
a==-5+2;
a. 0
b. eroare deoarece operatorul de inegalitate (!=) este scris invers
c. 1
d. alta valoare
e. rezultatul depinde de valoarea lui y
8. Indicai ce afieaz urmtoarele instruciuni:
int a=3, b=5;
printf (a=b ? "egale" : "diferite");
a. diferite
b. egale
c. instruciunile conin erori de sintaxa
d. true
e. false
9. Indicai valoarea lui x in urma instruciunilor:
int x=0, y=1, z=0;
x=x||!y&&z;
ntrebri de autoevaluare
b. 0
c. 1
d. 2
e. nici una din variante
10. Indicai valoarea lui x in urma instruciunilor:
int x=2, y=1, z;
x=x&&y||z;
a. 1, 2, 2
b. 2, 2, 2
c. 1, 2, 3
d. 2, 2, 3
e. 4, 3, 5
13. Indicai ce afieaz urmtoarele instruciuni:
int a=3, b=7%4;
printf(a==b ? "egale" : "diferite");
e. false
13.3. Instruciuni
14. Ce afieaz secvena de cod urmtoare?
int i, j;
for(i=1,j=1;i<4; j=++i) {
int k=1;
printf("%d%d%d", i, j, k);
k++;
}
a. 111222333
b. 111122133
c. 111221331
d. 111211311
e. 111111111
15. Ce afieaz secvena de cod urmtoare?
int i, j;
for(i=1,j=1;i<4; i++) {
int k=1;
printf("%d%d%d", i, j, k);
j++;k++;
}
a. 111221331
b. 111222333
c. 111111111
d. 111211311
e. 111122133
16. Ce afieaz secvena de cod urmtoare?
int i=3;
while(--i);
printf("%d",i);
a. 2 1 0
b. 3 2 1
c. 0
32
21
297
ntrebri de autoevaluare
a. 009 0x9 9
b. 009 0x9 11
c. 009 0x9 11 9
d. 009 0x9 9 9
e. 9 9 9 9
20. Ce afieaz urmtoarea secven de program dac datele
introduse de la tastatur sunt Decembrie 2006:
int a; char x[10];
scanf("%s%2d", x, &a);
printf("%d, %.3s", a, x);
a. 20, Dec
b. 2006, Dec
c. 2006, Decembrie
d. 2006 Decembrie
e. nimic
298
a. 30 de elemente
b. 3 elemente
c. 4 elemente
d. 0 elemente
e. secvena nu este corect
23. Care instruciunea afieaz numele coloanei a 3-a din linia a
6-lea?
struct {
struct {
char nume[20];
int latime;
} coloane[5];
} linii[10];
13.6. Funcii
24. Care este valoarea expresiei f(21)?
int f(int n) {
if (n<3) return n;
299
ntrebri de autoevaluare
else return f(n/2);
}
a. 1
b. 2
c. 3
d. 0
e. 5
25. Care este valoarea expresiei f(5)?:
int f(int n) {
if (n<2) return 1;
else return n * f(n-1);
}
a. 120
b. 5
c. 1
d. 6
e. 12345
26. Care este valoarea expresiei f(2,5)?
int f(int n, int m) {
if (m<1) return 1;
else return n * f(n, m-1);
}
a. 2
b. 5
c. 32
d. 1
e. 0
27. Care este valoarea expresiei f(5)?
int f(int n) {
if (n<2) return 1;
else return n / f(n-1);
}
a. 1
b. 5
c. 0
300
d. 1.2
e. 15
28. Care este valoarea expresiei f(5,0)?
int f(int n, int m) {
if (n<0) return f(n+1, m+n);
else if (n>0) return f(n-1, m+n);
else return m;
}
a.15
b. 5
c. 0
d. -5
e. 12345
29. Care este valoarea expresiei f(6)?
int f(int n) {
if (n<2) return 1;
else return n / f(n-1);
}
a. 1
b. 5
c. 0
d. 1.2
e. 6
301
ntrebri de autoevaluare
char nume[20];
int latime;
} coloane[5];
} *linie;
a. 3 6 2
b. 3 2 5
c. 6 5 5
d. 3 7 5
e. 3 7 2
a. out.txt
b. txt
c. out.
302
d. t
e. fiierul este gol
35. Precizai valoarea expresiei strlen(test) dac variabila test
este declarata astfel:
char test[100]="Examen";
a. o valoare pozitiva
b. o valoare negativa
c. zero
d. apel eronat deoarece compara doua constante
e. apel eronat deoarece compara doua adrese
ntrebri de autoevaluare
b. fabs
c. strlen
d. pow
e. sqrt
39. Ce constant predefinit are valoarea numrului ?
a. PI
b. M_PI
c. pi
d. m_pi
e. Pi
a. 7
b. 5
c. 123
d. 0
e. fiierul este gol
41. Ce conine fiierul out.txt dup execuia secvenei de cod:
char s[] = "out.txt";
FILE *fout = fopen(s, "wt");
fprintf(fout, "%d", strlen(s));
fclose(fout);
a. 7
b. 5
c. 123
d. 0
e. fiierul este gol
42. Ce conine fiierul out.txt dup execuia secvenei de cod:
char s[] = "out.txt";
FILE *fout = fopen(s, "wt");
304
a. out.txt
b. t.txt
c. txt.tuo
d. t
e. fiierul este gol
43. In ce biblioteca este declarata fprintf?
a. file.h
b. stdio.h
c. strlib.h
d. math.h
e. string.h
44. Care instruciune nchide fiierul asociat variabilei fis?
a. fclose(fis);
b. close(fis)
c. fclose fis;
d. close fis;
e. *fis = fclose;
Tabel 13.1 Rspunsuri la ntrebri
1
6
R
d
b
2
7
R
c
c
3
8
R
d
b
4
9
e
2
c
7
a
2
c
7
a
2
a
e
3
a
8
a
3
a
8
b
3
a
c
4
d
9
a
4
a
9
b
4
c
R
d
b
5
1
R
c
b
0
1
1
6
2
1
2
6
3
1
3
1
2
2
3
3
1
2
2
3
3
5
1
0
2
5
2
0
3
5
3
305
ntrebri de autoevaluare
6
4
1
306
7
a
2
8
a
3
9
b
4
0
4
1144.. A
ANNEEXXAA 11 M
MEEDDIIUULL DDEE PPRRO
OG
GR
RA
AM
MA
AR
RE
ED
DEEVV--C
C++++
Dev-C++, realizat de Bloodshed Software, este un mediu
integrat de dezvoltare pentru limbajul C/C++ pentru Windows,
gratuit i complet. Un mediu integrat de dezvoltare este un pachet
de programe care permit editare, compilarea, executarea i
verificarea programelor direct din programul principal.
Dev-C++ folosete varianta Mingw a compilatorului GCC
(GNU Compiler Collection), recunoscut pentru calitile sale.
Printre calitile mediului Dev-C++ se numr:
funcii avansate de editare, cutare i nlocuire, tiprire,
CVS (Concurrent Versioning System), list To Do, etc;
interfa n diverse limbi (printre care i limba romn);
colorarea i completarea codului;
depanator de programe integrat;
crearea rapid a programelor Windows (cu sau fr
interfa grafic) i a bibliotecilor (statice i dinamice);
manager de instrumente (pentru integrarea altor unelte de
dezvoltare n mediul Dev-C++);
manager de proiecte (pentru gestionarea uoar a
proiectelor medii i mari);
manager pe pachete (pentru instalarea uoara a unor
module suplimentare).
14.1. Instalare
Programul de instalare poate fi descrcat gratuit de pe
situl Bloodshed (la adresa http://www.bloodshed.net) sau de pe
SourceForge (la adresa http://sourceforge.net/projects/dev-cpp).
V recomandm s descrcai programul de instalare care
include compilatorul Mingw, instalarea fiind mai simpl.
Dup descrcare pornii programul de instalare i urmai
paii indicai de acesta. Noi vom discuta etapele necesare pentru
Dev-C++ versiunea 4.9.9.2. La pornirea programului de instalare,
acesta v cere s dezinstalai eventuale versiuni mai vechi ale
307
14.2. Configurare
14.2.1. Prima pornire
La prima pornire, programul trebuie configurat pentru a
satisface preferinele dumneavoastr. Vom folosi limba englez,
deoarece opiunile mediului Dev-C++ seamn cu opiunile din
alte medii de programare. Valorile pentru restul opiunilor depind
de dumneavoastr. Apsai pe Next.
14.2.2. Editorul
n mod implicit, la pornire Dev-C++ afieaz fereastra Tip
of the day cu sfaturi utile pentru utilizatorii nceptori. Dac
observai c v-ai nsuit aceste sfaturile, putei bifa opiunea
Dont display tips at startup, nainte de a nchide fereastra.
Pentru a configura editorul, selectai din meniul Tools
opiunea Editor options. n seciunea General, efectuai
urmtoarele verificri/modificri:
bifai Auto indent, astfel programele vor fi mai uor de
urmrit, deoarece instruciunile vor fi deplasate automat la
stnga, n funcie de context;
bifai Use Tab Character, astfel apsarea tastei Tab
introduce n fiier un caracter tab, n loc de spaii; setai
valoarea Tab size la 4;
debifai Smart tabs, altfel programele vor fi greu de
urmrit, datorit indentrii inegale a liniilor;
debifai Keep Trailing Spaces, astfel fiierele nu vor
conine spaii inutile;
310
14.3. Utilizare
14.3.1. Scrierea unui program C
Realizarea unui program ncepe cu transcrierea
algoritmului acelui program n limbajul de programare dorit
(limbajul C n cazul nostru). n mediul Dev-C++, aceast activitate
ncepe cu deschiderea unui fiier surs: din meniul File,
selectai opiunea New, apoi opiunea Source File.
n zona de editare se deschide un fiier nou, denumit
Untitled1. n acest fiier trebuie scrise instruciunile C care
312
formeaz programul
urmtorul program:
nostru.
Pentru
exemplificare,
scriei
#include <stdio.h>
#include <conio.h>
int main() {
printf("Un mic exemplu");
getch();
}
14.3.4. Depanarea
Chiar dac un program nu conine erori de sintax (deci a
fost compilat cu succes), el poate s conin erori de programare.
Acestea se manifest prin furnizarea de rezultate incorecte
pentru toate sau doar anumite cazuri de test. n aceast situaie
funcia de depanare (debugging) a mediului Dev-C++ faciliteaz
detectarea i eliminarea erorilor.
Pentru depanarea unui program se folosesc opiunile din
meniul Debug dup etapa de compilare. Programatorul poate
selecta opiunea Run to cursor pentru a executa programul
pn ajunge la linia unde este cursorul editorului. Odat ajuns pe
aceast linie, execuia programului se suspend. n acest
moment, opiunea Next step execut urmtoarea instruciune,
opiunea Step into execut prima instruciune din funcia care
urmeaz, iar opiunea Continue reia execuia programului.
n timpul depanrii, opiunea Add Watch permite
monitorizarea i modificarea valorilor variabilelor. Astfel
programatorul poate s vad unde apar nepotriviri ntre program
i algoritm.
Opiunea Toogle breakpoint permite adugarea i
anularea punctelor de oprire, adic linii din program n care
execuia programului se suspend, controlul fiind redat din nou
programatorului.
n orice moment, depanarea poate fi oprit folosind
opiunea Stop debugging.
314
1155.. A
ANNEEXXAA 22 S
SEETTUULL DDEE CCAARRAACCTTEERREE A
AS
SC
CIIII
Cod n baza
1
8
6
0
0
00
x00
1
0
01
x01
2
0
02
x02
3
0
03
x03
4
0
04
x04
5
0
05
x05
6
0
06
x06
7
0
07
x07
8
0
10
x08
9
0
11
x09
1
0
12
x0A
1
0
Caracter (semnificaie)
1
0
ENQ (Enquiry)
ACK (Acknowledgment)
BEL (Bell)
BS (Backspace)
HT (Horizontal Tab)
LF (Line Feed)
VT (Vertical Tab)
315
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
316
Cod n baza
1
8
6
13
x0B
1
0
14
x0C
1
0
15
x0D
1
0
16
x0E
1
0
17
x0F
1
0
20
x10
1
0
21
x11
1
0
22
x12
1
0
23
x13
2
0
24
x14
2
0
25
x15
2
0
26
x16
2
0
27
x17
2
0
30
x18
2
0
31
x19
2
0
32
x1A
2
0
33
x1B
Caracter (semnificaie)
1
FF (Form Feed)
CR (Carriage Return)
SO (Shift Out)
SI (Shift In)
0
NAK
(Negative
Acknowledgement)
0
SYN (Synchronous Idle)
0
CAN (Cancel)
EM (End of Medium)
SUB (Substitute)
ESC (Escape)
0
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
Cod n baza
1
8
6
2
0
34
x1C
2
0
35
x1D
3
0
36
x1E
3
0
37
x1F
3
0
40
x20
3
0
41
x21
3
0
42
x22
3
0
43
x23
3
0
44
x24
3
0
45
x25
3
0
46
x26
3
0
47
x27
4
0
50
x28
4
0
51
x29
4
0
52
x2A
4
0
53
x2B
4
0
Caracter (semnificaie)
1
0
FS (File Separator)
GS (Group Separator)
0
RS (Request to Send) (Record
Separator)
0
US (Unit Separator)
0
SP (spaiu)
"
# (diez)
$ (dollar)
% (procent)
& (ampersand)
' (apostof)
* (asterisk)
,
317
0
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
318
Cod n baza
1
8
6
54
x2C
4
0
55
x2D
4
0
56
x2E
4
0
57
x2F
4
0
60
x30
4
0
61
x31
5
0
62
x32
5
0
63
x33
5
0
64
x34
5
0
65
x35
5
0
66
x36
5
0
67
x37
5
0
70
x38
5
0
71
x39
5
0
72
x3A
5
0
73
x3B
6
0
74
x3C
Caracter (semnificaie)
1
/ (slash)
<
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
Cod n baza
1
8
6
6
0
75
x3D
6
0
76
x3E
6
0
77
x3F
6
0
100
x40
6
0
101
x41
6
0
102
x42
6
0
103
x43
6
0
104
x44
6
0
105
x45
7
0
106
x46
7
0
107
x47
7
0
110
x48
7
0
111
x49
7
0
112
x4A
7
0
113
x4B
7
0
114
x4C
7
0
Caracter (semnificaie)
1
0
>
@ (simbol AT)
M
319
0
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
320
Cod n baza
1
8
6
115
x4D
7
0
116
x4E
7
0
117
x4F
8
0
120
x50
8
0
121
x51
8
0
122
x52
8
0
123
x53
8
0
124
x54
8
0
125
x55
8
0
126
x56
8
0
127
x57
8
0
130
x58
8
0
131
x59
9
0
132
x5A
9
0
133
x5B
9
0
134
x5C
9
0
135
x5D
Caracter (semnificaie)
1
\ (backslash)
0
4
5
6
7
8
9
00
01
02
03
04
05
06
07
08
09
Cod n baza
1
8
6
9
0
136
x5E
9
0
137
x5F
9
0
140
x60
9
0
141
x61
9
0
142
x62
9
0
143
x63
1
0
144
x64
1
0
145
x65
1
0
146
x66
1
0
147
x67
1
0
150
x68
1
0
151
x69
1
0
152
x6A
1
0
153
x6B
1
0
154
x6C
1
0
155
x6D
1
0
Caracter (semnificaie)
1
0
^ (circumflex)
_ (underscore)
` (apostrof invers)
n
321
0
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
322
Cod n baza
1
8
6
156
x6E
1
0
157
x6F
1
0
160
x70
1
0
161
x71
1
0
162
x72
1
0
163
x73
1
0
164
x74
1
0
165
x75
1
0
166
x76
1
0
167
x77
1
0
170
x78
1
0
171
x79
1
0
172
x7A
1
0
173
x7B
1
0
174
x7C
1
0
175
x7D
1
0
176
x7E
Caracter (semnificaie)
1
| (bar vertical)
~ (tild)
0
27
Cod n baza
1
8
6
1
0
177
x7F
Caracter (semnificaie)
1
0
DEL (delete)
323
B
BIIBBLLIIO
OG
GR
RA
AFFIIE
E
[1] Chiorean L., Chiorean M. PC Iniiere Hard i Soft, Editura
Microinformatic, Cluj-Napoca,1999.
[2] Cormen T.H., Leiserson C.E., Rivest R.R.. Introducere n
algoritmi, Editura Computer Libris Agora, Cluj Napoca, 2000
[3] Cristea V. Limbajul C Standard, Editura Teora, Bucureti,
1992
[4] Gheorghe M., Popoviciu I., Chiru C., Vasiliu P., Lupei T.
Limbajul C. Programare prin exemple, Editura Academia Naval
Mircea cel Btrn, Constana, 2001
[5] Vasiliu P., Butu A. Programarea calculatoarelor n
limbajul C, Editura Europolis, Constana, 2006.
[6] Ivan I. Limbajul C, Editura Academiei de Studii
Economice, Bucureti, 1992
[7] Kernigham B., Ritchie D. The C programming language,
Practice Hall, 1975
[8] Knuth D.E. Tratat de programarea calculatoarelor, vol.I-II,
Editura Tehnic, Bucureti,1974
[9] Livovschi L., Georgescu H. Sinteza i analiza algoritmilor,
Editura tiinific i Enciclopedic, Bucureti, 1992
[10] Negrescu L. Limbajul Turbo C, Editura Libris, ClujNapoca, 1992
[11] Negrescu L. Limbajele C i C++ pentru nceptori, Editura
Albastr, Cluj-Napoca, 1998
[12] Petrovici V., Goicea F. Programarea n limbajul C, Editura
Tehnic, Bucureti, 1993
[13] Schildt H. C++ manual complet, Editura Teora, 1997
324
325