Sunteți pe pagina 1din 231

LIMBAJUL C TEORIE I APLICAI I 9

1 Algoritmi
1.1 Introducere
n scurta istorie, de aproximativ 50 de ani, a calculatoarelor electronice, o dat
cu suportul hardware, au evoluat spectaculos i limbajele de programare, numrul
i diversitatea lor fiind astzi foarte mare.
Recomandrile cu caracter general, standardizrile limbajelor de programare s-
au impus abia la mijlocul deceniului opt, adic dup aproape 30 de ani de
existen a calculatoarelor electronice. In aceste condiii, criteriile de calificare a
programelor s-au diversificat, pe lng cerinele de funcionare corect i de
performan (vitez de execuie, capacitate), aprnd cele legate de uurina de
utilizare, respectiv uurina cu care programul va putea fi modificat de alii.
Aceste cerine de calitate au impus respectarea unor canoane (reguli) de
elaborare, care formeaz n ansamblu tehnologia programrii.
Programarea structurat i propune s elaboreze produse software n care s
se disting clar structurile principale ale programului (similar structurilor de
rezisten a cldirilor), structuri care vor fi proiectate, programate i testate nainte
de abordarea oricrei probleme de detaliu.
Stilul acesta de abordare a problemelor, ncepnd cu ansamblul i cobornd
treptat la detalii (top-down), caracterizeaz fiecare etap de lucru pe parcursul
elaborrii unui program structurat. Williams S. sintetizeaz [1] principalele
recomandri de programare structural.
Vom prezenta n continuare principalele mijloace care se vor folosi pe parcursul
elaborrii programelor n limbajul C.
1.2. Algoritmi i organigrame
Pentru a elabora un program care s rezolve o problem dat, este necesar
extragerea esenei problemei, mprind soluia n pai individuali de efectuat.
Secvena pailor altfel obinui, necesari pentru soluionarea problemei, se
numete algoritm. Algoritmul este smburele care a dat natere la disciplina
Informatic. Cuvntul algoritm provine de la matematicianul musulman Abu Ja
far Mohammed ibu Musa al-Khowrizm (780?-850?), care n lucrarea Kitab
hisab al-adad al-hindi:calcule numerice folosind o metod algebric. Dicionarul
explicativ al limbii romne d urmtoarea definiie a algoritmului :
Ansamblul de simboluri folosite n matematic i logic, permind gsirea n
mod mecanic (prin calcul) a unor rezultate .
Exemplificm noiunea de algoritm.
Exemplul.1. Procedura de realizare i turnare a unui element de beton.
1. Se aduc materialele necesare preparri betonului (nisip,balast,ciment,ap).
2. Se pune n funciune betoniera.
3. Se pun n betonier pe rnd, balastul, nisipul, cimentul.
LIMBAJUL C TEORIE I APLICAI I 10
4. Se amestec compoziia pentru a obine omogenizarea acesteia.
5. Se adaug apa i se continu amestecarea o anumit durat de timp.
6. Se scoate din betonier betonul proaspt i se transport la locul turnrii..
7. Se face turnarea betonului n cofrag pentru realizarea elementului dorit.
8. Dac cantitatea de beton preparat i turnat este mai mic dect volumul
elementului se reia procesul de la punctul 1, dac nu se oprete procesul de
preparare-turnare (STOP). Aceast procedur cunoscut de toi constructorii,
are toate elementele unui program de calculator. Distingem:
o secven de iniializare 1,
o terminare normal 8.
Exemplul 2. Algoritmul lui Euclid Pentru a obine c.m.m.d.c. a dou numere
ntregi a i b , b diferit de 0, mprim pe a la b , dac restul mpririi r1 este
0, atunci b este c.m.m.d.c. a celor dou numere, dac restul r1 este diferit de 0,
se mparte b la r1 i se obine restul r2, dac r2 este 0 se consider r1 cmmdc
al celor dou numere, dac r2 este diferit de 0 se mparte r1 la r2, rezult rest
r3 .a.m.d.
Ultimul rest nenul este cmmdc al celor dou numere a, b.
Dup aceste exemple putem s definim un algoritm = un sistem de reguli prin
care informaia iniial este transformat ntr-o informaie final (rezultat)
folosind un numr finit de calcule sau operaii intermediare (pai).
Informaia iniial pentru care un algoritm este aplicabil se va numi informaia
admisibil a algoritmului respectiv, totalitatea informaiilor admisibile formnd
domeniul algoritmului.
Este absolut necesar ca un algoritm s fie caracterizat prin finitudine, claritate,
generalitate i unicitate.
Finitudinea unui algoritm se refer la faptul
c pentru transformarea datelor de intrare n
datele de ieire (soluie) se folosesc un
numr finit de calcule (pai).
Unicitatea const n faptul c dup fiecare
pas din procesul de transformare, regulile
algoritmului determin n mod unic pasul
urmtor.
Generalitatea algoritmului se refer la
faptul c pentru orice informaie din
domeniul algoritmului (pentru orice dat de
intrare valid) se poate determina o mrime
de ieire (soluie). De exemplu, n cazul n
care dorim s scriem un program care
rezolv ecuaia de gradul I: 3x+4=0, nu vom
scrie un program care rezolv ecuaia dat
LIMBAJUL C TEORIE I APLICAI I 11
mai sus, ci un program general care rezolv
orice ecuaie de gradul I.
Prin claritatea algoritmului se nelege
formularea precis a regulilor dup care au
loc transformrile datelor de intrare pn
devin date de ieire.
Reprezentarea grafic a unui algoritm se numete organigram sau schem
logic. Organigrama este constituit dintr-o serie de csue denumite blocuri,
interconectate prin segmente direcionate, care arat cile de derulare ale
algoritmului. Organigramele sunt scrise folosind limbajul natural i/sau folosind
expresii matematice sau logice.
Blocurile i simbolurile care sunt folosite n schema logic sunt:
csua dreptunghiular, specific ntreprinderea unei aciuni (bloc de calcul)
csua romboidal, specific luarea unei decizii (bloc de decizie)
csua paralelogram, specific citirea sau tiprirea unor date (bloc de
intrare/ieire)
csua eliptic, specific nceputul sau sfritul algoritmului (bloc
delimitator).
csua circular, specific continurii algoritmului ce se desfoar pe mai
multe pagini.
sgeile care unesc aceste blocuri.
n paragraful urmtor vor fi prezentai principalii algoritmi ntlnii n tehnica
curent de programare.
1.2.1. Algoritmi liniari
Algoritmii liniari sau secveniali sunt acei algoritmi care conin doar secvene de
citire/scriere i de calcul. Organigrama unui algoritm secvenial are un parcurs
liniar de la debutul problemei (START) pn la terminarea ei (STOP).
Exemplul 1
S se descrie algoritmul rezolvrii ecuaiei de gradul I cu o necunoscut :
ax+b=0.a;bR a 0 i s se construiasc organigrama acestuia.
Rezolvare
1. Se citesc a i b,a diferit de 0.
2. Se calculeaz x := -b/a.
3. Se tiprete x;
4. STOP.
Start
a, b
x := -b/a
x
Stop
LIMBAJUL C TEORIE I APLICAI I 12
Observm c n pasul 2 al algoritmului am folosit operatorul := , n locul
operatorului = .
Operatorul := poart denumirea de operator de atribuire i are
semnificaia de atribuire a valorii obinute prin evaluarea (calcularea)
expresiei din partea dreapt a operatorului, variabilei din stnga
operatorului.
Un program de calculator va evalua ntotdeauna expresia din dreapta
operatorului atribuire (n cazul nostru -b/a) rezultatul obinut fiind atribuit
variabilei din stnga operatorului( n cazul nostru x).
Exemplul 2
S se descrie algoritmul conversiei unghiului a din grade sexazecimale n radiani
i s se realizeze organigrama (schema logic ) acestuia.
Rezolvare
1. Se citete a exprimat n grade sexazecimale.
2. Se calculeaz noua valoare a lui a exprimat n radiani a := a*/180.
3. Se tiprete a;
4. STOP.
Start
a
a:= a*/180
a
Stop
LIMBAJUL C TEORIE I APLICAI I 13
1.2.2. Algoritmi ramificai
Algoritmii ramificai sunt acei algoritmi care conin pe lng secvenele de
citire/scriere i de calcul ,i secvene de decizie. In urma secvenei de decizie doar
o singur secven este posibil, din dou secvene existente. Organigrama unui
algoritm ramificat prezint o bifurcare (ramificare) a parcursului n urma blocului
de decizie.
Exemplul 3
S se descrie algoritmul rezolvrii ecuaiei de gradul I, ax+b=0.a;bR, cu
verificarea coeficienilor introdui i s se construiasc organigrama acestuia.
Rezolvare
1 Se citesc coeficienii a i b.
2 Dac a este zero tiprim mesaj de eroare; STOP.
3 Se calculeaz x := - b/a.
4 Se tiprete x.
5 STOP.
Observm :
O ieire anormal a programului 2, respectiv o,
O ieire normal 3.
n organigramele urmtoare, vom renuna la blocul START pentru economie de
spaiu.
LIMBAJUL C TEORIE I APLICAI I 14
Exemplul 4
S se construiasc algoritmul care calculeaz modulul unui numr i s se
construiasc organigrama acestuia.
Rezolvare
1 Se citete numrul nr.
2 Dac numrul este mai mic dect zero, atunci nr := -nr.
3 Dac numrul este mai mare sau egal cu 0, atunci nr := nr.
4 Se tiprete numrul nr.
5 STOP.
nr
nr := -nr
nr
nr < 0
DA NU
a, b
x := -b/a
x
a = 0
Eroare
STOP
DA NU
LIMBAJUL C TEORIE I APLICAI I 15
Exemplul 5
S se construiasc algoritmul care determin valoarea maxim dintre cele trei
valori citite de la tastatur i s se deseneze schema logic a acestui algoritm.
Rezolvare 1
1. Se citesc cele trei variabile a,b,c.
2. Se noteaz d=max (a,b,c).
3. Se fac comparaiile : dac a>=b i a>=c rezult d= a.
4. dac b>=a i b>=c rezult d= b.
5. dac c>=b i c>=a rezult d= c.
6. se tiprete max=d
7. STOP
Aceast metod implic efectuarea a 6 comparaii. Urmtoarea metod folosete
mai puine comparaii.
Rezolvare 2
1. Se citesc cele trei variabile a, b, c.
2. Se noteaz d=max (a,b,c).
3. Se fac comparaiile : dac a>=b i a>=c rezult d= a.
4. Dac a>=b i a<c rezult d=c.
5. Dac a<b i b>=c rezult d=b.
6. Dac a<b i b<=c rezult d=c.
7. Se tiprete max=d.
8. STOP.
Algoritmul pentru determinarea valorii maxime dintre cele trei valori a,b,c
LIMBAJUL C TEORIE I APLICAI I 16
Exemplul 6
S se realizeze algoritmul i schema logic pentru ordonarea n sens cresctor a 3
numere de tip intreg.
Rezolvare Fie a, b, c cele 3 valori ntregi ce trebuie ordonate, se noteaz cu
a,b,c cele 3 valori de tip intreg. Se realiz o funcie ordonat care ordoneaz 2
valori x,y astfel: Dac x>y este necesar ca x s schimbe locul cu y. Folosim o
variabil temporar t i efectum urmtoarele operaii : t=y, y=x,
x=t, Dac x<y nu este necesar permutarea dintre x i y. Aceast funcie se aplic
de 3 ori valorilor a, b, c astfel : Ordonat (a, b)a<b. Ordonat (b, c) )b<c dar
a?b. Ordonat (a, b)a<b<c
START
TIPARE TE
MESAJ
CITETE
a,b,c
a>=b
b>=c
d=a
da
nu
da
d=c
d=c
da
nu
d=b
nu
a>=c
max=d
STOP
LIMBAJUL C TEORIE I APLICAI I 17
Ordonarea a trei numere (varianta 1)
START
CITETEa,b,c
a>b
b>c
da
nu
da
nu
STOP
t=b
b=a
a=t
t=c
c=b
b=c
a>b
t=b
b=a
a=t
da
da
nu
S TA RT
C ITE TE
a ,b ,c
x( 1 ) = a
y( 1 ) = b
z( 1 ) = c
o rd o na t
x(1 ) , y( 1 )
o rd o na t
y(1 ) ,z ( 1 )
o rd o na t
x(1 ) , y( 1 )
S TO P
ti p a re s te
a ,b ,c
O RD ONA T X , Y
X > Y
t= y
y= x
x= t
n u
d a
RE T UR N
LIMBAJUL C TEORIE I APLICAI I 18
Ordonare a trei numere (varianta 2)
Dup primele dou apeluri, n c avem maximul dintre valorile iniiale, dar despre
ordinea dintre a i b nu putem spune cu siguran nimic (ex. Iniial a=5, b=4, c=3),
de aceea este necesar i o rearanjare a valorilor a i b. (ultimul apel).
1.2.3. Algoritmi ciclici
Algoritmii ciclici sunt acei algoritmi care conin bucle sau cicluri (reluarea
anumitor secvene ale algoritmului de un numr finit de ori), n funie de
ndeplinirea unei condiii. Organigrama unui algoritm ciclic conine un parcurs
LIMBAJUL C TEORIE I APLICAI I 19
care este reluat de mai multe ori n funcie de o condiie impus ntr-un bloc de
decizie.
Exemplul 7
S se descrie algoritmul care calculeaz suma a n numere citite de la tastatur i s
se construiasc organigrama acestuia.
Rezolvare
1. Se citete n.
2. Se iniializeaz o variabil contor i cu valoarea 0.
3. Se citete un numr de la tastatur.
4. Se adun acest numr la sum i se incrementeaz contorul (se mrete cu 1).
5. Dac valoarea contorul este mai mic dect numrul n, se revine la pasul 3.
6. Se tiprete suma.
n acest program observm c secvena 3 - 4 se repet de n ori.
n pasul i := i + 1, se evalueaz expresia din dreapta operatorului (valorii lui i se
adaug 1), rezultatul obinut fiind atribut lui i. n urma acestei operaii i va fi mai
mare cu 1.
n
s := 0
i := 0
nr
s := s + nr
i := i + 1
i < n
s
LIMBAJUL C TEORIE I APLICAI I 20
n expresia s := s + nr, se evalueaz expresia din dreapta operatorului atribuire,
(valorii lui s se adaug valoarea lui nr), rezultatul obinut fiind atribuit lui s. n
urma acestei operaii s crete cu nr.
Exemplul 8
S se descrie algoritmul care calculeaz factorialul unui numr ntreg i s se
construiasc schema logic a acestuia.
Rezolvare
Factorialul unui numr n este produsul numerelor de la 1 la numrul n inclusiv.
1. Se citete n.
2. Se iniializeaz o variabil fact cu valoarea 1.
3. Se iniializeaz o variabil contor i cu valoarea 1.
4. Se nmulete fact cu contorul i, valoarea obinut fiind atribuit variabilei
fact i se incrementeaz contorul cu 1.
5. Dac contorul este mai mic sau egal dect numrul n, se revine la pasul 4.
6. Se tiprete fact.
n acest program observm c secvena 4 se repet de n ori.
Dac o schem logic este greu de neles, putem parcurge algoritmul pentru un
anumit numr de pai, pe hrtie.
S ncercm s parcurgem algoritmul nostru pentru n=3.
1. n := 3; variabilei n i se atribuie valoarea 3,
2. fact := 1; variabilei fact i se atribuie valoarea 1,
3. i := 1; variabilei contor i se atribuie valoarea 1,
n
fact := 1
i := 1
fact := fact i
i := i + 1
i n
fact
LIMBAJUL C TEORIE I APLICAI I 21
4. fact := 1 * 1 = 1; se nmulete fact cu i, valoarea obinut fiind atribuit
variabilei fact,
i := 1 + 1 = 2; se incrementeaz contorul i cu 1,
5. 2 3; da, se revine la pasul 4,
4. fact := 1 * 2 = 2;
i := 2 + 1 = 3;
5. 3 3; da, se revine la pasul 4,
4. fact := 2 * 3 = 6;
5. 4 3; nu,
7. tiprim fact, adic 6.
Exemplul 9
S se determine cel mai mare divizor comun a dou numere intregi i pozitive,
(algoritmul lui Euclid).
Rezolvare
Pentru a determina c.m.m.d.c. a dou numere a i b, ntregi i pozitive a>b, se va
aplica urmtorul procedeu:
Se mparte a la b i se obine un rest r, dac r=0 cmmdc al celor dou numere
este b, dac nu se va mprii b la rest r i se obine un nou rest r1.
Dac restul r1 =0 cmmdc este r, dac nu se va mprii r la r1 i se continu ciclul
pn cnd restul devine =0.
Ultimul rest diferit de zero este c.m.m.d.c. al celor dou numere a,b. Pentru a
relua procesul mpririi i determinarea restului, se consider c cel mai indicat
este folosirea unui ciclu cu pai necunoscui, la care prsirea ciclului se face cnd
restul mpririi devine zero.
Pentru a nu folosi o mulime de variabile n care s se depoziteze valorile
resturilor se folosete o permutare ntre a cu b i b cu r.
q=a/b
r=a-b*q
Dac r=0 c.m.m.d.c. =b.
Dac r0 a devine b iar r devine b i se reia procesul .
Dac a<b nu este necesar permutarea lui a cu b, fiinc dup primul ciclu se
realizeaz aceast permutare.
LIMBAJUL C TEORIE I APLICAI I 22
Cel mai mare divizor comun a doua numere
START
CITE TE
a,b
r=0
da
nu
STOP
q=a/b
r=a -b*q
a=b
b=r
cmmd=b
AFISEAZA
cmmd
LIMBAJUL C TEORIE I APLICAI I 23
2. Mediul de programare turbo c 2.0
Mediul integrat de dezvoltare Turbo C 2.0 (Integrated Development Environment)
permite editarea, depanarea programelor surs scrise n limbajul C i conine :
Compilator.
Editor.
Depanator.
Utilitare.
Lansarea mediului integrat Turbo C2.0
Mediul integrat lucreaz sub prompterul Dos i lansarea lui se efectueaz prin
emiterea comenzii :
TC Enter.
Dac directorul de lucru este TC.
Dac directorul n care se afl utilitarul TC este diferit de directorul TC, este
necesar ca n fiierul Autoexec.bat, s se specifice calea spre directorul ce conine
utilitarul TC.
Dup emiterea comenzii este afiat ecranul principal ,ce conine n partea
superioar o linie de meniuri derulante pe vertical, fereastra de editare, fereastra
de mesaje i linia de referine rapide.
2.1. Mediul de lucru
Pentru a stabili mediul de lucru, trebuie s se efectueze la prima lansare pe
calculator configurarea directoarelor. Se apas tasta F10 pentru a apela linia de
meniuri i se tasteaz O, pentru deschiderea meniului Options, sau se tasteaz
combinaia ALT i O . Se alege din meniul Options, submeniul Directories ce va
deschide o fereastr ce conine rublicile :
Include directories.
Library directories.
Output directories.
Turbo C.
La fiecare rublic sunt afiatedirectoarele configurate la momentul respectiv.
Pentru a funciona corect, este necesar s se modifice rublicile n conformitate cu
directoarele existente pe calculator.
Se va considera c exist pe hardul calculatorului directoarele :
C:\TC
C:\TC\INCLUDE
LIMBAJUL C TEORIE I APLICAI I 24
C:\TC\LIB
C:\TEMPC
Pentru a indica directorul ce conine fiierele header (cu extensia h), se va alege
opiunea Include directories i se apas Enter. n fereastra ce apare se va tasta
discul,directorul, ce conine fiierele header, n cazul de fa C:\TC\INCLUDE
Pentru a indica directorul ce conine fiierele de bibliotec, se va alege opiunea
Library directories i se apas Enter. n fereastra ce apare se va tasta
discul,directorul, ce conine fiierele header, n cazul de fa C:\TC\LIB .
Pentru a indica directorul ce va conine fiierelede obj, map, exe, se va alege
opiunea Output directory i se apas Enter. n fereastra ce apare se va tasta
discul,directorul, ce va conine fiierele de ieire, n cazul de fa C:\TEMPC .
Pentru a indica directorul ce conine fiierele necesare lucrului cu mediul Turbo,
la opiunea Turbo C se va alege C:\TC .
Dup realizarea acestor configurri se va apsa ESC, pentru a reveni n meniul
Options i se alege submeniul Save options se apas Enter, care va rescrie
fiierul TCCONFIG.TC , de pe hardiscul calculatorului, iar la o nou lansare a
mediului Turbo C, setrile se pstreaz, nefind necesar o nou configurare.
Observaie:
Se recomand s- fie realizat directorul de ieire TEMPC, pentru a se gi mai uor
fiierele EXE, sau pentru a terge fiierele OBJ, MAP, EXE.
2.1.1. Apelarea meniului, taste universale
Apelarea unui meniu de pe bara de meniuri, se face cu combinaia de taste
ALT+tasta corespunztoare primului caracter din meniul dorit.
Exemplu:
ALT+F =meniul File.
ALT+O =meniul Options.
ALT+E =meniul Edit.
ALT+R = meniul Run.
ALT+C =meniul Compile.
Pentru o apelare mai rapid a unui meniu, sau a unei opiuni dintr-un meniu, se
pot folosi tastele universale sau combinaia de taste. Cnd se folosesc tastele
universale, operaia curent este ntrerupt i se execut operaia ataat tastei
apelate. Doar n cazul c n lucru este o fereastr de dialog, se introduce
informaia cerut de fereastra de dialog i apoi se poate apela o tast universal.
LIMBAJUL C TEORIE I APLICAI I 25
TASTA Funcia realizat
F1 Afieaz help pentru operaia curent
F2 Salveaz fiierul curent
F3 ncarc un fiier n procesul de editare
F4 Execut programul pn la linia curent (linia pe care este cursorul)
F5 Focalizarea/defocalizarea ferestrei curente
F6 Bascularea ntre ferestrele active
F7 Ruleaz programul n mod depanare trasnd n funcii
F8 Ruleaz programul n mod depanare srind peste funcii
F9 Compilare i legare
F10 Basculare ntre meniu i fereastra activ
CTRL/F1 Ajutor doar n editare pentru obiecte C
CTRL/F2 Reseteaz programul Run/program reset
CTRL/F3 Afieaz stiva cu funciile apelate
CTRL/F4 Evalueaz sau modific o expresie
CTRL/F7 Adaug o expresie watch
CTRL/F8 Pune sau terge un punct de ntrerupere
CTRL/F9 Execut programul
SHIFT/F10 Indic numrul versiuni Turbo
ALT/F1 Readuce pe ecran ultimul ajutor
ALT/F3 Alege un fiier din lista pick
ALT/F5 Bascularea nte ecranul utilizatorului i ecranul Turbo
ALT/F6 Bascularea ntre fereastra watch i fereastra de mesaje
ALT/F7 Salt la eroarea precedent
ALT/F8 Salt la urmtoarea eroare
ALT/F9 Compilare i realizarea fiierului OBJ
ALT/B Deschiderea meniului Break
ALT/C Deschiderea meniului Compile
ALT/D Deschiderea meniului Debug
ALT/E Intrarea n Editor
ALT/F Deschiderea meniului File
ALT/O Deschiderea meniului Options
ALT/P Deschiderea meniului Project
ALT/R Deschiderea meniului Run
ALT/X Ieirea din Turbo i revenirea n linia de comand DOS
2.1.2.Meniul principal
Meniul principal permite alegerea urmtoarelor meniuri:
FILE Gestionarea fiierelor, directoarelor i ieirea din programul Turbo.
EDIT Permite editarea fiierului surs.
LIMBAJUL C TEORIE I APLICAI I 26
RUN Permite controlul execuiei programului rezultat n urma compilrii i
lincheditrii fiierului surs.
COMPILE Compileaz i creazfiierul executabil.
PROJECT Permite controlul programelor cu surse multiple.
OPTIONS Permite stabilirea opiunilor de compilare, definirea de macrouri,
modificarea fiierelor de configurare.
DEBUG Controleaz sesiunea de depanare a programului executabil.
BREAK/WATCH Faciliteaz depanarea prin lucrul cu puncte de ntrerupere i
supravegherea expresiilor.
2.1.2.1.Meniul FILE
Meniul File poate fi apelat prin ALT/F, sau tastnd F n meniul principal.
Opiunile meniului :
Load =ncarc un fiier n editor, prin tastarea numelui fiierului, sau se poate lsa
forma general *.C, care va deschide o fereastr, ce conine lista fiierelor cu
extensia C , folosind tastele de navigare (sgei), se selecteaz fiierul dorit i se
apas Enter.
Pick =permite selectarea unui fiier din lista ultimilor 8 fiiere editate, sau
selectnd ultima opiune load file, se poate specifica un alt fiier dect cele
prezentate.
New =Permite crearea de fiier nou n procesul de editare, cu numele generic
NONAME.C, care la prima salvare poate lua numele inpus de utilizator.
Save =Salvarea fiierului n procesul de editare.
Write To =Salvarea pe disc a fiierului curent, sub un nou nume impus de
utilizator.
Directory =Afieaz lista intrrilor ntr-un director specificat, sau se apas Enter
pentru directorul curent, permind ncrcarea n editor a fiierului selectat.
Change Dir = Afieaz directorul curent i permite schimbarea directorului curent.
Os Shell = Permite ieirea temporar din meniul Turbo i introducerea de comenzi
pe linia DOS, iar pentru revenire din DOS n meniu, se face prin tastarea
cuvntului Exit.
Quit = Permite prsirea mediului Turbo i revenire sub prompterul DOS.
2.1.2.2. Meniul Edit
Realizarea programului surs se poate face cu orice editor ASCII, dar se
recomand folosirea editorului propriu al mediului Turbo.
Lansarea procesului de editare se face prin comanda EDIT, din meniul EDIT sau
combinaia de taste ALT/E , care are ca efect activarea ferestrei de editare i
cursorul de editare se poziioneaz n text.
LIMBAJUL C TEORIE I APLICAI I 27
Introducerea textului se face normal ca i n alte editoare, trecerea pe rnd nou se
face apsnd tasta ENTER.
n partea superioar a ferestrei de editare se afl linia de stare, care ofer
informaii despre fiierul ce se editeaz, starea tastelor speciale de editare.
Informaiile prezentate pe linia de stare sunt :
Line, col, insert, tab, fill, indent, numele fiierului ce se editeaz.
Line = indic numrul liniei din fiier pe care este poziionat cursorul de editare.
Col = indic numrul coloanei din fiier pe care este poziionat cursorul de
editare.
Insert = indic modul de de editare cu posibilitatea de a insera text la poziia
cursorului de editare, dac se apas tasta Insert, se va bascula pe modul Overwrite
ce are ca efect tergerea caracterului de deasupra cursorului de editare i scrierea
noului caracter editat.
Indent = indic modul de lucru autoindentare.
Tab = indic modul de a insera taburi (spaiu liber de 8 caractere) n editare.
Fill = dac modul tabulare este activ, opiunea fill complecteaz nceputul liniilor
cu un numr optim de taburi.
Unindent = permite ca tasta BACKSPACE s efectueze salt napoi cu un nivel de
indentare.
Nume fiier = indic discul, directorul i numele fiierului ce se editeaz.
Comenzile de editare
Comenzi pentru deplasarea cursorului de editare
Deplasarea cursorului n cadrul fiierului aflat n procesul de editare se realizeaz
folosind tastele de navigare rapid sau combinaii de taste astfel :
CTRL/S sau sgeat la stnga = deplasarea cursorului spre stnga cu o poziie.
CTRL/D sau sgeat la dreapta = deplasarea la dreapta cu o poziie a cursorului.
CTRL/A sau CTRL/sgeat stnga = deplaseaz cursorul la primul caracter din
cuvntul precedent.
CTRL/F sau CTRL/sgeat dreapta = deplaseaz cursorul la primul caracter din
cuvntul urmtor.
CTRL/E sau sgeat n sus = deplaseaz cursorul de editare cu un rnd (linie) n
sus.
CTRL/X sau sgeat n jos = deplaseaz cursorul de editare cu un rnd (linie) n
jos.
CTRL/R sau PGUP = deplaseaz cursorul i textul n sus cu un ecran de editare.
CTRL/C sau PGDN = deplaseaz cursorul i textul n jos cu un ecran de editare.
CTRL/W = deplaseaz textul cu o linie n jos dar cursorul rmne pe poziia
curent.
LIMBAJUL C TEORIE I APLICAI I 28
CTRL/Z = deplaseaz textul cu o linie n sus dar cursorul rmne pe poziia
curent.
CTRL/S sau HOME = deplaseaz cursorul pe prima coloan (la inceputul liniei)
a liniei curente.
CTRL/QD sau END = deplaseaz cursorul pe ultima coloan (la sfritul liniei) a
liniei curente.
CTRL/QE = deplaseaz cursorul pe prima linie din ecranul de editare.
CTRL/QX = deplaseaz cursorul pe ultima linie din ecranul de editare.
CTRL/PGUP = deplaseaz cursorul la primul caracter din fiier.
CTRL/PGDN = deplaseaz cursorul la ultimul caracter din fiier.
Comenzi de tergere sau inserare.
INS = activeaz sau dezactiveaz modul de inserare.
BACKSPACE = terge caracterul din stnga cursorului de editare.
DEL = terge caracterul din dreptul cursorului de editare.
CTRL/T = terge cuvntul din dreapta cursorului de editare.
CTRL/N = insereaz o linie (rnd) goal n poziia cursorului de editare.
CTRL/Y = terge linia pe care este situat cursorul de editare.
CTRL/QY = terge textul de la poziia curent a cursorului pn la sfritul liniei.
Comenzi diverse.
Tab = insereaz un spaiu liber de 8 caractere sau cu o valoare impus prin
opiunea Tab size din meniul Options/environment.
CTRL/O i F = activeaz sau dezactiveaz modul de editare optim astfel:
Dac modul de editare optim este activ la inceputul fiecrei linii se complecteaz
cu un numr optim de spaii sau taburi.
CTRL/O i I = activeaz sau dezactiveaz modul de editare autoindentare astfel :
Modul de autoindentare activat va deplasa cursorul de editare dup apsarea tastei
ENTER sub coloana de nceput a liniei liniei anterioare.
CTRL/K i S = salveaz fiierul fr a prsi editorul.
CTRL/K i P tiprete la imprimant blocul marcat iar n lipsa acestuia tiprete
tot fiierul.
F3 = ncarc n editor un fiier existent n procesul de editare, sau creaz un fiier
nou.
Comenzi de realizare,mutare,copiere,tergere a blocurilor.
Blocul reprezint o poriune de text delimitat de markeri.
n cadrul unui fiier poate exista un singur bloc asupra cruia se pot efectua
urmtoarele operaii :
LIMBAJUL C TEORIE I APLICAI I 29
Marcarea nceputului unui bloc la poziia curent a cursorului de editare prin
combinaia de taste CTRL/K i apoi B.
Marcarea sfritului de bloc prin deplasarea cursorului de editare la poziia
dorit i realizarea combinaiei de taste CTRL/K i apoi K, ce are ca efect
punerea n eviden a blocului, prin schimbarea culorii de fond a zonei ocupat de
bloc.
Copierea unui bloc la poziia curent a cursorului : se deplaseaz cursorul de
editare la poziia dorit i se realizeaz combinaia de taste CTRL/K i apoi C, ce
are ca efect, copierea blocului n prealabil realizat i delimitarea acestei copii cu
markeri.
tergerea blocului se realizeaz prin combinaia de taste CTRL/K i Y, ce are ca
efect tergerea blocului marcat.
Activarea sau dezactivarea afiri blocului marcat se realizeaz prin
combinaia de taste CTRL/K i H , dac un bloc este marcat (afiat cu un fond
diferit de restul documentului), asupra lui se pot efectua operaiile de copiere,
mutare, stergere.
Mutarea unui bloc se realizeaz cu combinaia de taste CTRL/K i V , ce are ca
efect mutarea blocului marcat la poziia curent a cursorului de editare.
Inserarea unui fiier dac n cadrul fiierului ce se editeaz, se dorete inserarea
coninutului unui fiier existent pe hard disc, se realizeaz combinaia de taste
CTRL/K i R, care va deschide o fereastr de dialog, n care se va scrie calea i
numele fiierului ce se insereaz, textul inportat va fi marcat ca bloc.
Scrierea unui bloc intr-un fiier de pe hard disc se realizeaz prin combinaia de
taste CTRL/K i W, care va deschide o fereastr de dialog, n care se va specifica
calea i numele fiierului n care se va scrie blocul marcat.
Meniul Compile.
Meniul compile permite compilarea fiierului surs i crearea programului
executabil. Selectarea meniului Compile se face prin combinaia de taste ALT/C
sau tastnd C, cnd meniul principal este activ.
Opiunile meniului Compile sunt :
Compile to obj = compileaz fiierul surs scris n C i creaz un fiier obiect cu
acela nume ca i fiierul surs, dar extensia este obj. Alegerea acestei opiuni se
poate face i folosind combinaia de taste ALT/F9.
Make exe file = creaz fiierul executabil prin operaiile de compilare i
lincheditare (legare), iar numele fiierului executabil este indentic cu fiierul surs
dar va avea extensia exe.
Link exe file = realizeaz ediia de legturi i fiierul executabil.
Build all = creaz fiierul executabil compilnd i lincheditnd toate fiierele
proiectului.
Primary C file = ncarc n editor fiierul surs sau headerul n care s-au detectat
erori la compilare.
LIMBAJUL C TEORIE I APLICAI I 30
Get info = afieaz informaiile despre ultima compilare.
2.1.2.3. Meniul Run
Meniul Run permite depanarea programului surs, dup ce au fost eliminate
erorile de compilare i lincheditare.
Meniul Run se apeleaz combinaia de taste ALT/R sau tasta R cnd meniul
principal este activ.
Opiunile meniului Run sunt :
Run = CTRL/F9 execut programul executabil cu extensia exe, rezultat n urma
compilri i lincheditri, dac sursa a fost modificat de la ultima compilare, va
reface operaiile de compilare lincheditare si apoi ruleaz fiierul executabil.
Program reset = CTRL/F2 nchide sesiunea curent de depanare.
Go to cursor = F4 execuia programului se face pn la poziia curent a
cursorului de editare.
Trace info = F7 execuia programului se face instruciune cu instruciune,
inclusiv n interiorul funciilor apelate, fr ns a intra n funciile de bibliotec.
Step over = F8 execut programul instruciune cu instruciune , srind peste
apelurile de funcii, fr a se intra n interiorul funciei apelate.
User scrin ALT/F5 afieaz ecranul utilizatorului, revenirea n procesul de
editare se face apsnd orice tast.
2.1.2.4. Meniul Debug.
Meniul Debug se apeleaz folosind combinaia de taste ALT/D sau tastnd D n
meniul principal activat.
Opiunile meniului Debug sunt :
Evaluate = permite evaluarea i modificarea valorii unei expresii, pentru
introducere de nume, iar evaluarea sau modificarea deschide cte o fereastr.
Ferestrele folosite sunt :
Evaluate
Result.
New value.
Find function = permite afiarea n fereastra de editare a definiiei unei funcii,
aceast opiune se poate utiliza numai ntr-o sesiune Debug.
Call stack= permite deschiderea unui meniu intr-o fereastr, n care se poate
selecta funcia, din lista de funcii apelate pn la punctul curent de execuie a
programului i permite vizualizarea liniei executate curent dintr-o anumit
funcie.
Source debugging = permite introducerea a trei valori, care vor determina modul
de depanare introdus n fiierul executabil.
LIMBAJUL C TEORIE I APLICAI I 31
On depanarea se face cu depanatorul din Turbo Debugger sau depanatorul
integrat, i aceast valoare este implicit.
Standalone depanarea se face doar cu Turbo Debugger.
None programul nu poate fi depanat n nici un mod.
Display swapping = permite trei valori care determin cazurile pentru care Turbo
C realizeaz automat bascularea ntre ecranul utilizatorului i ecranul de editare n
cadrul unei sesiuni de depanare.
Smart trecerea se face la fiecare scriere pe ecran a programului.
Always trecerea se face la execuia fiecrei instruciuni.
None trecerea dintr-un ecran in altul nu se face n nici o situaie.
Refresh display = reface coninutul ecranului editorului, dac acesta a fost distrus
accidental.
2.1.2.5. Meniul Break/watch.
Apelarea meniului Break/watch se face prin combinaia de taste ALT/B, sau
tastnd B n cadrul meniului principal activat.
Prin meniul Break/watch se poate efectua depanarea programului prin intermediul
punctelor de ntrerupere i urmrirea expresiilor.
Opiunile meniului Break/watch sunt :
Add watch = permite introducerea unei expresii de supraveghere n fereastra de
urmrire.
Delete watch = terge expresia curent din fereastra de urmrire.
Edit watch = permite intr-o fereastr separat editarea expresiei curente din
fereastra de urmrire.
Remove all watches = terge fereasta de urmrire.
Toggle breakpoint = stabilete sau anuleaz un punct de ntrerupere n linia n
care este poziionat cursorul.
Clear all breakpoint = terge toate punctele de ntrerupere din cadrul
programului.
View new breakpoint = deplaseaz cursorul la urmtorul punct de intrerupere.
Ordinea de parcurgere a punctelor, este determinat de ordinea n care au fost
stabilite i nu de ordinea fizic n fiier.
2.1.2.6. Meniul options
Meniul Options poate fi apelat prin combinaia de taste ALT/O sau tastnd O n
meniul principal activat.
Prin intermediul acestui meniu se apeleaz submeniuri, prin care se stabilesc
opiunile generale ale modului de lucru ale compilatorului, modului de lucru al
LIMBAJUL C TEORIE I APLICAI I 32
editorului de legturi, modul de lucru al depanatorului, controleaz locaiile
fiierelor, argumentele programului.
Submeniurile meniului Options sunt :
Compiler. Linker. Environment.
Directories. Arguments. Save options. Retrieve options.
COMPILE.
Submeniul Compile permite stabilirea opiunilor compilatorului prin indicarea
modelului de memorie,editarea macrodefiniiilor,opiuni pentru crearea fiierului
obiect, specificarea procesorului pentru care se genereaz codul, a modelului n
virgul flotant, modului de aliniere, etc.
Opiunea Model.
Permite stabilirea modelului de memorie :
TINY. = 64 Ko pentru cod,date i tabele.
SMALL. = 64Ko pentru cod + 64 Ko pentru date.
MEDIUM. = 64Ko pentru date statice i 1 Mo pentru cod.
COMPACT. = 65 Ko pentru cod i 1 Mo pentru date.
LARGE. = 1Mo pentru date i 1 Mo pentru cod.
HUGE. = 1 Mo pentru date, 1Mo pentru cod i 64 Ko pentru date statice.
Opiunea Defines.
Permite introducerea de macrodefiniii pentru preprocesor.
MAX=50;
Simbolul MAX a fost definit cu valoarea 50.
Opiunea Instruction set.
Permite specificarea procesorului pentru care se va genera codul.
Opiunea Floating point.
Permite stabilirea modului de lucru n virgul flotant.
Utilizare coprocesor matematic 8087, 80287
Emulare coprocesor matematic
None nu se folosete virgul flotant.
LIMBAJUL C TEORIE I APLICAI I 33
3. Structura unui program surs n limbajul C.
Cel mai scurt program surs C este de forma:
void main ()
{
}
Acest program nu face nimic, dar este programul minimal pe care compilatorul C
l poate compila.
void main () este o funcie. Funcia void main () nu poate lipsi din nici un
program C, fiind funcia de intrare n program. Dup numele funciei, i cele dou
paranteze urmeaz o parantez acolad deschis, respectiv o parantez acolad
nchis. Cele dou paranteze definesc corpul funciei.
Un program C care va afia un mesaj este:
#include <stdio.h>
void main ()
{
printf("Acest program afiseaza un mesaj");
printf("\nAcesta este mesajul");
}
n acest program, n corpul funciei void main () avem dou rnduri n plus. Un
rnd care este terminat prin; (punct i virgul) se numete o instruciune. n cazul
nostru funcia void main (), conine dou instruciuni. Funcia void main () poate
conine oricte instruciuni dorim, fiecare instruciune trebuind separat prin;.
Vom anticipa i vom dezvlui faptul c printf() (cuvntul cheie care apare n cele
dou instruciuni) este tot o funcie, dar o funcie de bibliotec, adic inclus n
limbaj. Funcia printf() este folosit pentru afiarea mesajelor pe ecran. Funcia
printf() este echivalent cu instruciunea write din Pascal.
Fa de celelalte limbaje de programare, limbajul C nu are un set de instruciuni de
baz. Astfel, pentru a folosi funcia printf(), va trebui s indicm numele fiierului
bibliotec n care aceast funcie este declarat. Funcia printf() este declarat n
fiierul stdio.h, extensia h provine de la numele header, i este un fiier de
bibliotec care conine o mulime de funcii de intrare/ieire (standard
input/output).
Pentru a include acest fiier header n programul nostru, vom aduga un cuvnt
cheie la nceputul fiierului, sub forma:
#include <stdio.h>
Cuvintele cheie care ncep cu simbolul # (diez), se numesc directive procesor, sau
directive preprocesor. In cazul nostru am folosit directiva include care include
fiierul stdio.h n programul nostru.
Se remarc faptul c limbajul C este un limbaj bazat pe funcii. Pe lng funciile
de bibliotec i funcia void main (), putem defini i funcii proprii care ne ajut la
segmentarea programului. Definirea funciilor va fi descris mai pe larg n
capitolul Funcii.
LIMBAJUL C TEORIE I APLICAI I 34
S vedem un program C mai complex i s ncercm s punem n eviden
diferitele pri ale unui program C.
#include <stdio.h>
#define PI 3.1415
void titlu();
void main ()
{
int raza=5;
float aria;
aria=PI*raza*raza;
titlu();
printf("Aria cercului de raza %d este %f", raza, aria);
}
void titlu()
{
/* Functie care afiseaza un mesaj*/
printf("Program pentru calculul ariei unui cerc");
}
Programul nostru C conine la nceput zona directivelor preprocesor. Directiva
#include am vzut-o mai sus. Directiva #define permite definirea unor constante.
In cazul nostru am definit constanta PI.
Programul conine dou funcii: funcia void main () i funcia titlu(). Toate
funciile definite de utilizator, n cazul nostru funcia titlu(), trebuiesc declarate la
nceputul fiierului, dup zona directivelor preprocesor.
Funcia titlu() care este definit dup funcia void main () conine o singur
instruciune. Inainte de instruciunea printf(), n corpul funciei titlu(), avem un
text cuprins ntre simbolurile /* i */. Acest text se numete comentariu i este
folosit pentru a furniza lmuriri privind pri ale programului, pentru programator.
Textele cuprinse ntre /* i */ sunt ignorate de ctre compilator.
La nceputul funciei void main () este zona de declarare a variabilelor. In
programul nostru avem o variabil ntreag numit raza, iniializat la valoarea 5,
i o variabil real numit aria.
n continuare, funcia void main () conine trei instruciuni: o instruciune de
calcul, o instruciune de apel a funciei titlu() i o instruciune de tiprire folosind
funcia printf().
Atenie, limbajul C face distincie intre literele mari i mici.
3.1. Crearea unui program
Pentru a crea un program (un executabil), folosind limbajul C, trebuiesc parcurse
trei etape:
LIMBAJUL C TEORIE I APLICAI I 35
1. Crearea fiierului surs C
2. Compilarea programului
3. Linkeditarea programului
Crearea fiierului surs C poate fi fcut n editorul programului Turbo C.
Pentru a crea un fiier surs, se lanseaz programul Turbo C i se deschide
meniul FILE cu combinaia ALT/F, apoi cu sgeat n jos se selecteaz opiunea
NEW care are ca efect deschiderea automat a ferestrei de editare.
Se editeaz linie cu lunie fiierul. Trebuiesc respectate regulile de sintax, dup
cum au fost prezentate mai sus.
Textul programului surs poate fi salvat ntr-un fiier pe disc, selectnd comanda
Save din meniul File (Alt+F). In fereastra de dialog deschis la prima salvare va
apare numele generic NONAME.C, se tasteaz numele fiierului (respectnd
convenia DOS) i se apas tasta <Enter>.La o nou salvare a fiierului nu mai
este necesar indicarea numelui fiierului, considerndu-se vechiul nume.
Dac se dorete opinerea mai multor fiiere surs cu coninut puin diferit , se
recomand folosirea opiunii Write to care deschide o nou fereastr de dialog , n
care se va specifica numele ce se d fiierului duplicat, care urmeaz a fi
modificat.
Compilarea programului surs se poate face selectnd comanda Compile to OBJ
din meniul Compile (Alt+C). Compilarea creaz un fiier obiect (object file).
Fiierul obiect este un fiier binar cu extensia obj, care conine transformarea
instruciunilor cuprinse n fiierul surs C n instrucini care pot fi executate de
procesor (cod main). Fiierul obj nu poate fi rulat direct de ctre sistemul de
operare. El este un fiier intermediar.n urma procesului de compilare , dac sunt
erori de sintax sau de apelare a funciilor, acestea vor fi afiate intr-o fereastr de
mesaje, cu specificarea erorii i poziia n program a erorii.
Se vor analiza erorile i cauzele ce au produs aceste erori , iar dac aceste erori
sunt greu de eliminat se va analiza cu atenie meniurile lui Turbo C, respectiv
cile de cutare pentru fiierele necesare lucrului.
Se vor elimina toate erorile i abia apoi se poate trece la pasul urmtor.
Linkeditarea fiierului obiect se poate face selectnd comanda Link to EXE din
meniul Compile (Alt+C). Linkeditarea va aduga fiierului obiect, cod main
care permite accesul la dispozitivele de intrare/ieire pentru un anumit sistem de
operare. In urma linkeditrii rezult fiierul executabil, cu extensia exe. Acest
fiier, care se numete i fiier program, sau program pe scurt, poate fi rulat
(executat) de ctre sistemul de operare.
Compilarea/Linkeditarea poate fi fcut i ntr-un singur pas dac se selecteaz
comanda Run din meniul Run (Alt+R). Aceast comand compileaz,
linkediteaz i lanseaz n execuie programul nostru.
LIMBAJUL C TEORIE I APLICAI I 36
3.2. Tipuri de date.
Un tip de dat reprezint o mulime de valori pe care le poate lua o dat. In C
exist tipuri de date standard i tipuri de date definite de utilizator. Tipurile de
date standard n C vor fi prezentate mai jos.
3.2.1. Tipul ntreg
Permite reprezentarea numerelor ntregi. Tipuri mai uzuale sunt:
Numele
tipului
Domeniul de valori Lungi
mea
n
octei
Reprezentare
unsigned
char
0 255 1 ntreg fr semn
unsigned
int
0 65535 2 ntreg fr semn
int -32768 32767 2 ntreg cu semn
long -2.147.483.648
2.147.483.647
4 ntreg cu semn
Dac se depete domeniul de valori al unui tip de dat, fie va fi semnalat o
eroare la execuie, fie rezultatul afiat va fi eronat.
3.2.2. Tipul real
Permite reprezentarea numerelor reale. Atenie, reprezentarea numerelor reale n
orice sistem de calcul este aproximativ, pentru c numrul de zecimale care poate
fi reinut este limitat de tipul de dat.
Numele tipului Domeniul de valori Lungimea
n octei
Reprezentare
float 3.4E-38 3.4E+38 4 virgul mobil
double 1.7E-308 1.7E+308 8 virgul mobil
long double 3.4E-4932 1.1E+4932 16 virgul mobil
3.2.3. Tipul caracter
Este format din caracterele codului ASCII. Codul ASCII permite reprezentarea a
256 de caractere. Tipul caracter este reinut pe un octet.
Numele tipului Domeniul de valori Lungimea
n octei
Reprezentare
unsigned char 0 255 1 ntreg fr semn
char -128 127 1 ntreg cu semn
LIMBAJUL C TEORIE I APLICAI I 37
3.3. Constante i variabile
3.3.1. Constante
In C constantele trebuiesc precedate de cuvntul cheie const. Declararea unei
constante se face:
const [tipul de data] numele_constantei = valoarea;
O constant nu poate fi iniializat dect odat cu declararea ei. Dac tipul de dat
nu este precizat, constanta este implicit de tip ntreg. Constantele trebuiesc
declarate la nceputul funciei, sau la inceputul fiierului dup directivele
preprocesor.
#include <stdio.h>
const a=2;
void main ()
{
const b=3;
const float pi=3.1415;

}
n programul de mai sus, constanta a este declarat dup directivele preprocesor.
Ea este implicit de tip ntreg i are valoarea 2. Constantele b i pi sunt declarate la
nceputul funciei main. Constanta b este de tip ntreg i are valoarea 3, pe cnd
constanta pi este de tip float i are valoarea 3.1415;
Nu se permit operaii de modificare a valoarilor constantelor prin atribuire,
compilatorul semnalnd o eroare la compilare.
#include <stdio.h>
const a=2;
void main ()
{
const b=3;
const float pi=3.1415;

a=4; Eroare. Se ncearc modificarea valorii unei
constante
pi=3.14; Eroare. Se ncearc modificarea valorii unei
constante
}
3.3.2. Variabile
Declararea unei variabile n C se face:
tipul_de_data numele_variabilei [=valoare];
Variabilele trebuiesc declarate la nceputul funciei, sau la nceputul fiierului
dup directivele preprocesor. Valorile variabilelor pot fi modificate pe parcursul
programului.
LIMBAJUL C TEORIE I APLICAI I 38
#include <stdio.h>
int a=2;
void main ()
{
int b=3, c;
float d;
char ch='a';

a=4; Corect. Se modific valoarea variabilei a.
ch='1'; Corect. Se modific valoarea variabilei d.
}
Variabilele a, b i c sunt de tip ntreg. Variabila a este declarat la nceputul
fiierului dup directivele preprocesor i este iniializat cu valoarea 2. Variabilele
b i c sunt declarate la nceputul funciei main, variabila b este iniializat cu
valoarea 2, variabila c este neiniializat. Variabila d este de tip float i este
neiniializat. Variabila ch este de tip char i este iniializat cu valoarea a.
S reinem c operatorul = n C este operatorul de atribuire. Remarcm c tipului
de dat caracter i se poate atribui o valoare caracter. O valoare caracter n C este
reprezentat prin 'caracter'. In cazul nostru, variabila caracter ch este iniializat cu
valoarea a.
3.3.2.1. Variabile locale i globale
Am vzut mai sus c variabilele pot fi declarate fie la nceputul fiierului dup
directivele preprocesor, fie n interiorul unei funcii. Variabilele care sunt
declarate n interiorul unei functii (ntre acolade) se numesc variabile locale.
Variabilele locale pot fi folosite doar n interiorul funciei n care au fost declarate.
Variabilele care au fost declarate la nceputul fiierului, dup directivele
preprocesor, pot fi folosite n toate funciile programului. Aceste variabile se
numesc variabile globale.
#include <stdio.h>
void test();
int a=2; Variabila a este global.
void main ()
{
int b; Variabila b este local n funcia void main ().
float pi=3.1415;
test();
}
void test()
{
int c; Variabila c este local n funcia test().
c=b*2; Eroare. Variabila b este local n funcia void main ().
c=a*2;
}
n programul de mai sus, variabila a este o variabil global de tip ntreg,
iniializat cu 2. Variabila b este o variabil de tip ntreg local n funcia void
LIMBAJUL C TEORIE I APLICAI I 39
main (), variabila de tip float pi este local n funcia void main () i este
iniializat cu valoarea 3.1415.
Variabila c de tip ntreg este local n funcia test(). Instruciunea c=b*2; va
produce o eroare la compilare pentru c variabila b fiind local n funcia void
main () nu poate fi folosit n funcia test(). Instruciunea c=a*2; este corect
pentru c variabila a este global.
3.3.2.2. Convenia de denumire a variabilelor i constantelor.
Dei nici chiar prinii limbajului nu au menionat de o convenie de denumire a
variabilelor sau constantelor, n practica modern de programare se recomand
folosirea unei convenii de denumire a acestora pentru a uura munca
programatorului. In cazul programelor mari, care conin mii de instruciuni, este
necesar respectarea unei ordini privind denumirea variabilelor. De exemplu, dac
am declarat o variabil de tip ntreg cu numele a, i undeva n program i vom
atribui valoarea 3.4, uitnd faptul c variabila este de tip ntreg, variabila a va
conine doar 3, adic partea ntreag a valorii. Acest lucru duce la rezultate
eronate n continuare. Autorii recomand folosirea a unu - trei litere n faa
numelui unei variabile, pentru a indica tipul de dat a variabilei.
De exemplu
intraza, intcontor semnific variabile de tip int
flarie, flx1 semnific variabile de tip float
lnga, lngb semnific variabile de tip long
dblsuma, dblfx semnific variabile de tip double
chinitiala, chcod semnific variabile de tip char
sznume semnific variabile de tip ir de caractere.
3.4. Funcii. Introducere
Un program scris n limbajul C este alctuit din una sau mai multe funcii. O
funcie are urmtoarea structur :
Tip_de_data Nume(Lista declaratiilor parametrilor formali)
{
Declaratii;
Instructiuni;
}
Primul rnd reprezint antetul funciei, iar zona dintre parantezele acolad
reprezint corpul funciei.
n limbajul C funciile returneaz sau nu o valoare i n cazul c returneaz, tipul
funciei este indentic cu tipul valoarei returnate (int, float, double, char), iar n
cazul c nu returneaz o valoare tipul funciei este void care trebuie indicat, n
cazul c nu este indicat se consider c funcia returneaz o valoare de tip ntreg,
chiar dac n cadrul funciei nu este specificat explicit c returneaz o valoare.
O funcie poate avea zero sau mai muli parametrii formali, n cazul c nu are
parametrii formali se va specifica prin cuvntul void sau nu se va scrie nimic ntre
LIMBAJUL C TEORIE I APLICAI I 40
paranteze, n cazul c sunt mai muli parametri formali, acetia sunt separai prin
virgul ntre ei.
Prin intermediul parametrilor se transfer datele de la apelarea funciei n
interiorul funciei. Mai jos, sunt prezentate cteva exemple.
void main(void) sau void void main () funcia principal cu numele main nu
returneaz valoare i nu are parametrii formali.
float factorial (int n) funcia cu numele factorial returneaz o valoare
de tip float i are un parametru formal cu numele
n de tipul int.
puts ("ir de caractere") funcii standard de bibliotec pentru afiarea pe
monitor a irului de caractere incluse intre " ".
float fxy (int n, float x) funcia cu numele fxy returneaz o valoare de tip
float i necesit la apelare parametri formali de
tipul int, float.
n cadrul unui program o funcie are o singur definiie, dar poate fi apelat de
mai multe ori. Apelarea unei funcii se efectueaz prin numele funciei urmat de
lista parametrilor efectivi astfel :
Nume (lista parametrilor efectivi);
Parametrii efectivi pot fi o expresie, un nume de variabil. Parametrii efectivi
trebuie s corespund cu parametrii formali ai funciei prin ordine i tip. Dac
funcia returneaz o valoare ea se apeleaz ca un operand din cadrul unei expresii.
a=factorial (j); funcia factorial va returna n variabila a valoarea
rezultat prin calculul funciei cu parametrul efectiv j.
Dac parametrii efectivi sunt nume de tablouri, obligatoriu n antetul funciei se va
indica parametrii fictivi ca fiind tablouri.
double a [10];
int n;

citm (n,n,a);

Funcia citm va avea antetul :


void citm (int n, int m, double []) sau
void citm (int n, int m, double [10])
3.4.1. Funcii standard de intrare ieire
Setul de operaii care permit transferul de date ntre periferice i program
formeaz operaiile de intrare ieire, operaiile de introducere a datelor de la un
periferic se numesc operaii de citire, iar operaiile de ieire a datelor spre un
periferic se numesc operaii de scriere sau afiare (tiprire).
Limbajul C nu dispune de instruciuni specifice operaiilor de intrare ieire i
pentru a realiza aceste operaii folosete funcii standard de intrare ieire.
Funciile utilizate cel mai frecvent sunt :
getch(), gets(), scanf() pentru citirea darelor de la tastatar,
putch(), puts(), printf() pentru tiprirea datelor pe ecran.
LIMBAJUL C TEORIE I APLICAI I 41
Funcia getch() citete de la tastatur caracterul tastei apsate fr ecou pe ecranul
monitorului, i returneaz codul ASCI I al caracterului. Apelul funciei se face
astfel :
getch (); cnd se dorete s se apese o tast pentru
continuarea programului i vizualizarea ferestrei utilizatorului.
putch (getch ()); cnd funcia getch returneaz codul ASCII pentru
a fi afiat de funcia putch.
La apelarea funciei getch() dac se apas tasta ENTER valoarea returnat este 13.
Funcia gets() citete de la tastatur un ir de caractere terminat prin apsarea
tastei <Enter>. Funcia gets() returneaz adresa de nceput a zonei de memorie n
care se pstreaz irul de caractere citite de la tastatur. Citirea se efectueaz cu
ecou pe ecranul monitorului. Parametrul funciei gets() este adresa unui tablou
unidimensional de tip char (caracter), apelul funciei gets() este precedat de o
declaraie a unui tablou de tip caracter astfel :
char tabel1 [20]; declararea unui tablou cu numele tabel1 de tip
char cu lungimea 20.

gets ( tabel1); citete irul de caractere i l transfer la adresa


lui tabel1.
Funcia scanf() permite citirea datelor de la tastatur respectnd un format de
citire, iar apelul funciei este de forma :
scanf (control, parametru1, parametru2, , parametruln);
unde control este un ir de caractere ce definesc formatele de citire a datelor de
intrare, parametrul1, parametrul2, , sunt adresele la care se pstreaz datele
citite.
Specificatorii de format definesc conversiile din formate externe n cele interne i
ncep cu caracterul procent % urmat de 1 sau 2 litere ce definesc formatul astfel :
%c se folosete pentru a citi un singur caracter,
char d;
scanf (%c,&d ); citete caracterul curent i depoziteaz codul
ASCII al caracterului citit la adresa variabilei d de tip caracter.
%s se folosete pentru a citi un ir de caractere terminat prin caracterul
alb (spaiu), fie la caracterul prin care se ajunge la lungimea maxim de caractere
specificat de formatul de citire. Dup ultimul caracter citit se pstreaz automat
caractrul NUL.
char text1 [15];
scanf (%s,&text1); se tasteaz LABORATOR, irul de caractere
LABORATOR este citit i pus la adresa tabloului
text1.
LIMBAJUL C TEORIE I APLICAI I 42

char text1 [4];
char text2 [5];
scanf (%4s,&text1);
scanf (%5s,&text2); se tasteaz LABORATOR, irul de caractere
LABORATOR este citit i primele 4 caractere
LABO sunt puse la adresa tabloului text1 iar
caracterele RATOR sunt puse la adresa tabloului
text2.
%d se folosete pentru a citi valori ntregi din domeniul 32768 la +32767, numele
poate fi precedat de semnul minus i opional de semnul plus. Funcia scanf
returneaz o valoare ntreag = cu numrul de cmpuri citite corect. Dac n
specificatorul de format sunt dispuse cifre, ce indic lungimea maxim a
cmpurilor ce se citesc, este indicat s se introduc cu mare atenie irul de date
ce urmeaz a fi citite.
int i;
scanf (%d,&i); se citete o valoare intreag i se stocheaz la
adresa variabilei i de tip int (intreg).
int l,m,n ; declararea a trei variabile de tip int (intreg).
scanf (1%d %3d %2d,&l,&m,&n) ; dac se tasteaz 653276 valoarea 6 va fi
pstrat n variabila l, valoarea 532 va fi pstrat
n variabila m iar valoarea 76 va fi pstrat n
variabila n, respectndu-se lungimea formatelor
de citire.
Dac data de intrare este a12345 funcia scanf nu va citi considernd c este o
eroare, nceputul datei ncepe cu un caracter diferit de cifr i va returna valoarea
zero.
%o se folosete pentru a citi un ntreg octal
%x %X se folosete pentru a citi un ntreg de tip hexazecimal, cifrele hexazecimale
mai mari de 9 se vor reprezenta prin litere mari sau mici.
%u se folosete pentru a citi ntreg zecimal de tipul unsigned.
%f se folosete pentru a citi numerele zecimale cu sau fr exponent i pstrate n
format flotant simpl precizie, n domeniul modul 3,410
-38
3,410
38
a datelor de
tip float,
float a1,b; declaraii de tip float pentru a1 i b
scanf (%f %f,&a1,&b); citirea a dou valori separate prin caracterul, de
format float i depozitarea valorilor citite la
adresele lui a1 i b.
LIMBAJUL C TEORIE I APLICAI I 43
%lf se folosete pentru a citi numerele zecimale cu sau fr exponent i pstrate n
format flotant dubl precizie n domeniul 1,710
-308
1,710
308
a datelor de tip
double,
double a ; declararea variabilei a de tip double
scanf (%lf,&a); citirea unei date reale de tip double, care se
atribuie variabilei a.
%Lf se folosete pentru a citi numerele zecimale cu sau fr exponent i pstrate n
format flotant long double n domeniul 3,410
-4932
1,110
4932
.
Funcia putch() afieaz un singur caracter pe monitor i are ca parametru o
expresie sau o apelare a funciei getch(),
putch (getch ()); va afia caracterul citit de funcia getch.
Funcia puts() afieaz pe monitor irul de caractere delimitate de dublu apostrof
sau irul de caractere din cadrul unui tablou unidimensional.
puts (\n Apasa o tasta pentru terminarea programului);
are ca efect trecerea cursorului de afiare pe rnd nou datorit caracterelor \n i
apoi se va afia irul de caractere Apasa o tasta pentru terminarea programului.
Funcia printf() este folosit pentru a afia sub controlul unui format, datele de
ieire, folosind apelarea astfel :
printf (control, parametru1, parametru2, );
unde control este un ir de caractere care indic formatele de afiare i textul ce se
poate afia, parametru1, parametru2, , pot fi expresii sau denumirea
variabilelor a cror valoare se va afia.
%c se folosete pentru a afia un singur caracter,
char d;
printf (%c,d); afieaz caracterul stocat la adresa variabilei d,
de tip caracter.
%s se folosete pentru a afia un ir de caractere pstrat ntr-un tablou,
char text1 [15];
printf (%s,text1); se afieaz irul de caractere pus la adresa
tabloului text1.
printf (%s,erton); se afieaz irul de caractere erton dispuse intre
.
Dac n formatul de tiprire se folosesc valori numerice, care s indice lungimea
zonei de afiare , va afecta astfel tiprirea :
printf (*%8s*,erton); se afieaz ntre caracterele * * pe un spaiu de 8
caractere cuvntul erton astfel :
* erton*, dac valoarea 8 din formatul de tiprire este precedat de caracterul ,
afiarea se va face tot pe un spaiu de 8 caractere, cuvntul erton este urmat de
spaiu liber de 3 caractere astfel : *erton *.
%d se folosete pentru a afia valori intregi din domeniul 32768 la
+32767,
int i;
LIMBAJUL C TEORIE I APLICAI I 44
printf (%d,&i); se afieaz valoarea intreag depozitat la adresa
variabilei i de tip int (intreg).
int n,m ;
n=45;
m=30:
printf (*8d*,n); se afieaz * 45* lungimea zonei este de 8
caractere dispuse cu valoarea aliniat la dreapta.
printf (*08d*,n); afieaz *00000045* dispunnd zerouri n faa
valorii zerouri pn la lungimea indicat.
printf (*-8d*,n); afieaz *45 * asigurnd un spaiu de 8
caractere cu alinierea la stnga valorii.
%f se folosete pentru a afia numerele zecimale cu sau fr exponent i pstrate
n format flotant simpl precizie, n domeniul modul 3,410
-38
3,410
38
a datelor
de tip float. Numrul zecimalelor afiate implicit este 6, dac n specificatorul de
format se specific mrimea cmpului aceasta devine prioritar. Dac numrul de
zecimale specificate n format este mai mic dect numrul de zecimale calculate,
se va rotunji valoarea.
float a1,b; declaraii de tip float pentru variabilele a1 i b
printf(%f %f,&a1,&b); afiarea a dou valori de format float i
depozitate la adresele lui a1 i b.
float a1,b;
a1=23;
b=43.56;
c=43.34;
printf(%f %f %f,&a1,&b,&c); se afieaz cele 3 valori cu un numr de 6
zecimale (numr de zecimale implicit) astfel :
23.000000 43.560000 43.340000
printf(%5.1f %6.2f %6.1f,&a1,&b,&c);
se afieaz pe un cmp de 5 caractere valoarea lui a1 cu 1 zecimal astfel :
23.0
valoarea b se va afia pe un cmp de 6 caractere cu spaiu de 2 caractere pentru
zecimale astfel : 43.56 iar pentru valoarea c se va afia pe un spaiu de 6
caractere o singur zecimal, prin rotunjirea valorii astfel : 43.3 alinierea
valorilor afiate este la dreapta pentru lungimea cmpului rezervat.
%lf se folosete pentru a afia numerele zecimale cu sau fr exponent i
pstrate n format flotant dubl precizie n domeniul 1,710
-308
1,710
308
a datelor
de tip double,
double a; declararea variabilei a de tip double
printf (%lf,&a); afiarea valori variabilei a de tip double.
%Lf se folosete pentru a afia numerele zecimale cu sau fr exponent i
pstrate n format flotant long double n domeniul 3,410
-4932
1,110
4932
.
float ar;

LIMBAJUL C TEORIE I APLICAI I 45


printf (aria=%f\n,ar); va afia textul aria= urmat de valoarea variabilei
ar i apoi trecerea pe rnd nou datorit caracterelor speciale \n .
Pentru a dispune valorile pe cmpuri separate printr-un spaiu de 8 caractere (tab),
n specificatorul de format se vor folosi caracterele
float a1,b;
a1=23;
b=43.56;
c=43.34; de indicare a lui tab astfel \t.
printf(%f\t%f\t%f,&a1,&b,&c); se afieaz cele 3 valori cu un numr de 6
zecimale (numr de zecimale implicit) astfel :
23.000000 43.560000 43.340000
%e sau %Ese folosete pentru a afia numerele zecimale de tip float sau double
spre formatul cu parte ntreag.parte fracional exponent. Numrul zecimalelor
afiate depinde de specificatorul de format, dac precizia nu este specificat, se
vor afia 6 zecimale ( a se vedea exemplele de la % f).
Exponentul va avea caracterul e sau E dispus n faa funcie de caracterul
specificat n format :
float a =4.123456, b=23.45, c=0.45;
printf (a=%e b=%e c=%E ,a,b,c );
va afia :
a=4.123456e+00 b=2.345e+01 c=4.5E-01.
%g sau %G se folosete pentru a afia numerele zecimale cu sau fr exponent
fie ca n cazul specificatorului de format %f fie ca n cazul specificatorului de
format %e n funcie de mrimea valori astfel ca afiarea s ocupe un numr
minim de caractere. Specificatorul de format %g sau %G va afia maxim 6
zecimale dac acestea sunt semnificative.
float a=123.45678, b=23.45;
printf (a=%g b=%g ,a, b);
va afia
a=1.234568e+03 b=23.45.
Datele de tip float au o precizie de 7 zecimale iar datele de tip double au o precizie
de 15 zecimale. Funciile de intrare ieire au prototipurile n fiierele stdio.h i
conio.h care trebuie incluse n fiecare fiier surs .
%o datele de tip intreg (int) sau datele de tip intreg fr semn (unsigned) sunt
convertite n octal i apoi sunt afiate sub specificatorul de format :
printf (++%6o++.123); va afia pe un cmp de 6 caractere valoarea 123
convertit n octal=173 astfel : ++ 173++ , caracterele ++ au fost puse pentru a
se delimita lungimea cmpului afiat.
%x sau %X este folosit pentru a converti datele de tip int sau unsigned n
hexazecimal i apoi folosind specificatorul de format le va afia. Specificatorul
LIMBAJUL C TEORIE I APLICAI I 46
%x va afia cifrele mai mari de 9 cu caractere minuscule, iar %X va afia cu
caractere majuscule.
printf (%5x\t%x,124,124); va afia pe un cmp de 5 caractere : 7c urmat de un
spaiu de 1 tab apoi afiarea cu caractere majuscule a valorii mai mare dect 9
astfel 7C
%u este folosit pentru a afia o dat de tip unsigned n zecimal.
%l poate precede caracterele d, o, x, X, u pentru a converti datele din long n
long unsigned astfel :
%ld convertete data de tip long n zecimal
%lu convertete din long unsigned n zecimal
%lo convertete din long sau long unsigned n octal
%lx convertete din long sau long unsigned n octal.
#include<stdio.h>
#include<conio.h>
void main ()
{
int a,d; declarare de variabil de tip ntreg max 32767
unsigned b; declarare de variabil de tip fr semn 65535
long c; declarare de variabil intreag long max
2147483647
d=scanf ("%u,%d,%ld",&b,&a,&c); citirea a trei valori: unsigned, intreg, intreg
long.
printf ("unsigned %u int %d long %ld\n",b,a,c);afiarea celor trei valori citite.
}
Dac se introduc valorile 65535, 32767, 3456789, ce se afl n
Domeniul fiecrei tip de variabil, aceste date vor fi citite corect i apoi afiate
corect. Dac se introduc valorile -234, 33000, 234567se va observa c data
234 nu va fi citit finc are semnul minus, iar adoua valoare 33000 nu este
citit, finc valoarea depete domeniul variabilei de tip intreg.
Se recomand ca funcie de domeniul valorilor variabilelor folosite, s- se
aleag tipul variabilei.
3.5. Instruciuni. Expresii. Operatori
3.5.1. Instruciuni.
Prelucrarea datelor de intrare, de ieire, sau din interiorul programului se
realizeaz cu ajutorul instruciunilor. Ordinea de efectuare a acestor
instruciuni depinde de structura de control a programului. Structura de control
a programului poate fi :
Structura secvenial.
LIMBAJUL C TEORIE I APLICAI I 47
Structur alternativ.
Structur ciclic condiionat anterior.
Structur selectiv.
Structur ciclic condiionat posterior.
3.5.1.1. Instruciunea vid.
Instruciunea vid se realizeaz prin caracterul; i este folosit unde se cere
prezena unei instruciuni fr efect, n cadrul structurilor ciclice sau alternative.
3.5.1.2. Instruciunea expresie.
Instruciunea expresie are forma :
expresie;
n funcie de tipul expresiei instruciunea expresie se numete de atribuire sau de
apel.
A=5; este o instruciune de atribuire i are ca efect
atribuirea valorii 5 variabilei A.
B[2]=2.5; este o instruciune de atribuire i are ca efect
atribuirea valorii 2,5 variabilei indexate B[2].
X=X+2; este o instruciune de atribuire i are ca efect
mrirea valorii lui X cu 2.
puts (Dati o valoare); este o instruciune de apel a funciei puts.
I++; este o instruciune expresie i mrete valoarea lui
I cu o unitate.
J--; este o instruciune expresie i micoreaz
valoarea lui J cu o unitate.
3.5.1.3. Instruciunea compus.
Instruciunea compus se realizeaz prin includerea mai multor instruciuni i
declaraii ntre dou acolade deschis inchis.
{
declaratii;
instructiuni;
}
Declaraiile din cadrul unei instruciuni compuse au efect numai asupra
variabilelor declarate de ele i numai in efectuarea instruciunii compus.
Instruciunea compus se folosete n cadrul structurilor ciclice sau alternative.

{
puts ( dati valoarea elementului);
LIMBAJUL C TEORIE I APLICAI I 48
s canf (%d, &a[i]);
}
3.5.1.4. Instruciunea de atribuire.
Am amintit n capitolul Tipuri de date. Constante i variabile despre operatorul
=. Operatorul = este operatorul de atribuire. Instruciunea n care apare operatorul
de atribuire se numete instruciune de atribuire. Sintaxa instruciunii de atribuire
este:
nume_variabila = expresie;
Termenul stng al instruciunii de atribuire nu poate fi dect o variabil. Dac n
partea stng a operatorului nu se gsete o variabil, compilatorul va semnala o
eroare la compilare Lvalue required.
Termenul drept al instruciunii de atribuire este o expresie. O expresie este un
grup de variabile i constante legate ntre ele prin operatori matematici (adunare,
scdere, etc.).
n momentul rulrii programului, instruciunea de atribuire este rezolvat n doi
pai. Primul pas, const n evaluarea expresiei din dreapta operatorului atribuire.
Rezultatul obinut este atribuit variabilei din stnga operatorului.
#include <stdio.h>
void main ()
{
int i;
double d;
printf("Program care dubleaza valorile a 2 variabile");
printf("\nTastati un intreg si un real:");
scanf("%d %lf", &i, &d);
i=i*2;
d=d*2;
printf("\nDublul numarului intreg este: %d", i);
printf("\nDublul numarului real este: %f", d);
}
Dac cele dou numere au fost 5 i 4.7, programul va produce pe ecran urmtorul
rezultat:
Dublul numarului intreg este: 10
Dublul numarului real este: 9.400000
3.5.2. Operatori.
Am amintit mai sus c o expresie este un grup de variabile i constante legate ntre
ele prin operatori. Termenii care intervin ntr-o expresie se mai numesc i
operanzi. Limbajul C pune la dispoziia utilizatorului un mare numr de operatori.
Vom prezenta n continuare principalele grupe de operatori
LIMBAJUL C TEORIE I APLICAI I 49
3.5.2.1. Operatori aritmetici.
In C, avem urmtorii operatori aritmetici:
- minus unar
+ plus unar
* nmulire
/ mprire
% restul mpririi ntregi
+ adunare
- scdere
Exemplu
S se scrie programul C care calculeaz ecuaia de gradul I (vezi organigrama de
la Algoritmi liniari). Coeficienii a i b sunt ntregi.
Rezolvare
Chiar dac coeficienii a i b sunt ntregi, soluia x a ecuaiei poate fi real, astfel
vom declara variabila x de tip float.
#include <stdio.h>
void main ()
{
int a, b;
float x;
printf("Program care rezolva ecuatia de gradul I ax+b=0");
printf("\nDati coeficientii intregi a si b ");
scanf("%d %d", &a, &b);
x=-b/a;
printf("Solutia ecuatiei %dx+%d=0 este: %f", a, b, x);
}
Dac la mesajul Dati coeficientii intregi a si b, vom tasta 2 i 3, programul va
produce pe ecran urmtorul rezultat:
Solutia ecuatiei 2x+3=0 este: -1.000000
Observm c soluia este incorect. Problema const n instruciunea de atribuire
x=-b/a;. Expresia din partea dreapt a operatorului de atribuire, care este evaluat
prima, conine doi operanzi de tip ntreg i doi operatori minus unar i mprire.
Pentru c toi operanzii expresiei sunt de tip ntreg, programul va evalua expresia
i va atribui un ntreg variabilei din stnga, adic x. Rezultatul ntreg este obinut
prin trunchiere (adic eliminarea zecimalelor). Pentru ca programul s atribuie
variabilei din stnga o valoare de tip real (float), trebuie ca unul din termenii
expresiei s fie de tip float. Nu putem s schimbm tipul de dat al variabilelor a
i b, pentru c n enun s-a cerut ca a i b s fie ntregi.
3.5.2.2. Typecasting.
Din fericire, limbajul C permite schimbarea tipului de dat a unei variabile ntr-o
expresie cu ajutorul operatorului typecast. Operatorul typecast este folosit sub
forma:
LIMBAJUL C TEORIE I APLICAI I 50
(tip de data)nume_de_variabila
De reinut faptul c tipul de dat al varibilei nu este schimbat n program, ci doar
valoarea variabilei n expresia n care apare operatorul typecast este modificat la
tipul tip de dat. Astfel nct problema corect rezolvat este:
#include <stdio.h>
void main ()
{
int a, b;
float x;
printf("Program care rezolva ecuatia de gradul I ax+b=0");
printf("\nDati coeficientii intregi a si b ");
scanf("%d %d", &a, &b);
x=-(float)b/a;
printf("Solutia ecuatiei %dx+%d=0 este: %f", a, b, x);
}
Observm c n expresia -b/a am folosit operatorul typecast, transformnd-o sub
forma -(float)b/a. Pentru c operatorul typecast (float) este n faa variabilei b,
programul va considera valoarea lui b de tip float, astfel unul din operanzii din
expresie este de tip float i rezultatul returnat n urma evalurii expresiei este
float. Remarcm n plus c tipul de dat al variabilei b nu a fost schimbat, pentru
c instruciunea
printf("Solutia ecuatiei %dx+%d=0 este: %f", a, b, x);
folosete specificatorul de format %d pentru a tipri valoarea variabilei b, care produce
rezultatul ateptat pe ecran:
Solutia ecuatiei 2x+3=0 este: -1.500000
3.5.2.3. Operatori relaionali.
In limbajul C operatorii relaionali sunt:
< mai mic
<= mai mic sau egal
> mai mare
>= mai mare sau egal
== egal
!= diferit
Vom aminti aici un operator care nu poate fi clasificat n nici o grup, dar care
este foarte interesant, el nefiind prezent n nici unul din celelalte limbaje clasice
de programare, i anume operatorul decizie. Operatorul decizie ?, este folosit
pentru a selecta din dou expresii, doar una, n funcie de o condiie impus n
stnga operatorului. Sintaxa folosirii operatorului expresie este:
nume_de_variabila = conditie ? expresie1 : expresie2;
Dac condiia este adevrat, valoarea expresiei 1 este atribuit variabilei. Dac
condiia nu este adevrat (fals), valoarea expresiei 2 este atribuit variabilei.
Exemplu
Sa se scrie programul C care citete un numr ntreg de la tastatur i afieaz
mesajul Numarul este p, dac numrul este par, sau Numarul este i, dac numrul
este impar, folosind doar operatorii aritmetici i decizie.
LIMBAJUL C TEORIE I APLICAI I 51
Rezolvare
#include <stdio.h>
void main ()
{
int a, b;
char ip;
printf("Tastati un intreg");
scanf("%d", &a);
b=a%2;
ip= b==0 ? 'p':'i';
printf("Numarul este %c", ip);
}
Am folosit doi dintre operatorii prezentai mai sus. In instruciunea de atribuire
b=a%2;, b va avea valoarea 0 dac a este par i 1 dac a este impar, pentru c
operatorul % returneaz restul mpririi lui a la 2.
n expresia din urmtoarea instruciune de atribuire b==0 ? 'p':'i'; condiia este b
egal cu zero. Dac b este egal cu zero, variabilei ip din stnga operatorului de
atribuire i se va atribui expresia 'p' (adic ip='p'). Dac b nu este egal cu zero
(condiia nu este adevrat), variabilei ip i se va atribui expresia 'i' (adic ip='i'). n
final, programul va afia pe ecran:
Numarul este i
dac valoarea variabilei a este impar.
Exemplu
S se scrie programul C care citete dou numere reale de la tastatur i compar
cele dou numere folosind operatorul decizie. Programul s afieze Numrul a >
b, dac a este mai mare dect b, sau Numarul a < b, dac a este mai mic dect b.
Rezolvare
#include <stdio.h>
void main ()
{
float a, b;
char op;
printf("Tastati doua numere reale");
scanf("%f %f", &a, &b);
op= a>b ? '>':'<';
printf("Numarul %f %c %f", a, op, b);
}
S remarcm instruciunea de atribuire op= a>b ? '>':'<';. Condiia este a>b. Dac
condiia este adevrat, variabila op de tip caracter va primi valoarea '>'. Dac
condiia este fals, variabila op va primi valoarea '<'. Dac a este 3.5 i b este 4.2,
programul va afia pe ecran mesajul:
Numarul 3.500000 < 4.200000
3.5.2.4. Operatorii logici.
In limbajul C exist trei operatori logici:
! negare
&& i logic
LIMBAJUL C TEORIE I APLICAI I 52
|| sau logic
Operatorul negare produce urmtorul rezultat:
dac operandul are o valoare diferit de 0, rezultatul este 0, altfel rezultatul
operaiei este 1.
Operatorul sau logic produce urmtorul rezultat:
dac cel puin unul din operanzi are o valoare diferit de 0, rezultatul este 1, altfel
este 0.
Operatorul i logic produce urmtorul rezultat:
dac ambii operanzi sunt diferii de 0, rezultatul este 1, altfel rezultatul operaiei
este 0.
Exemplu
S se scrie programul C care citete dou numere ntregi de la tastatur i verific
dac ambele numere sunt pare. Dac ambele numere sunt pare programul afieaz
mesajul: Numerele sunt pare: d. In celelalte cazuri programul va afia: Numerele
sunt pare: n. Verificarea numerelor se va face folosind doar operatori.
#include <stdio.h>
void main ()
{
int a, b;
int p1, p2;
char pp;
printf("\nProgram care verifica daca 2 numere intregi sunt pare");
printf("\nDati 2 numere intregi");
scanf("%d %d", &a, &b);
p1= a%2 ? 0 : 1;
p2= b%2 ? 0 : 1;
pp= p1 && p2 ? 'd' : 'n';
printf("Ambele numere sunt pare: %c", pp);
}
3.5.2.5. Operatorii de incrementare i decrementare.
Sunt folosii pentru a aduna 1 sau pentru a scdea 1 la valoarea unei variabile de
tip ntreg. Sintaxa operatorilor de incrementare ++, sau decrementare -- este:
variabila++
variabila--
Dac operatorul de incrementare, decrementare apare n urma numelui variabilei,
vom spune c operaia de incrementare/decrementare este postfixat. Dac
operatorul de incrementare sau decrementare apare n faa variabilei
++variabila
--variabila
vom spune c operaia de incrementare/decrementare este prefixat. Dac operaia
de incrementare/decrementare prefixat este folosit ntr-o expresie, nti se
incrementeaz/decrementeaz valoarea variabilei, noua valoare fiind folosit n
expresie.
LIMBAJUL C TEORIE I APLICAI I 53
Dac operaia de incrementare/decrementare postfixat este folosit ntr-o
expresie, nti se evalueaz expresia cu valoarea variabilei
neincrementat/nedecrementat i apoi se incrementeaz/decrementeaz valoarea
variabilei.
#include <stdio.h>
void main ()
{
int a, b;
a=3;
b=++a;
printf("\nIncrementare prefix a=%d, b=%d", a, b);
a=3;
b=a++;
printf("\nIncrementare postfix a=%d, b=%d", a, b);
a=3;
b=--a;
printf("\nDecrementare prefix a=%d, b=%d", a, b);
a=3;
b=a--;
printf("\nDecrementare postfix a=%d, b=%d", a, b);
}
Programul va produce urmtorul rezultat pe ecran:
Incrementare prefix a=4, b=4
Incrementare postfix a=4, b=3
Decrementare prefix a=2, b=2
Decrementare postfix a=2, b=3
nainte de fiecare instruciune de tiprire, variabila ntreag a are valoarea 3.
Variabila a este folosit n cte o instruciune de atribuire, aplicnd asupra
variabilei operatorii de incrementare prefix/postfix i de decrementare
prefix/postfix.
n toate cazurile, valoarea variabilei a este incrementat sau decrementat de ctre
operatori. Dup incrementare, variabila a va avea valoarea 4, respectiv 2 dup
decrementare.
n expresii, folosind operatorul prefix, variabila b va primi valoarea
incrementat/decrementat a variabilei a, pe cnd folosind operatorul postfix,
variabila b va primi valoarea variabilei a neincrementat/nedecrementat.
3.5.3. Instruciunea if.
Instruciunea if se folosete la realizarea structurilor alternative i are urmtoarele
forme de scriere :
Forma 1
if (expresie)
instructiunea 1;
else
instructiunea 2;
instructiunea 3;
LIMBAJUL C TEORIE I APLICAI I 54
Se evalueaz expresia din parantezele de dup if i dac aceast expresie este
adevrat (are valoarea diferit de zero) se va efectua instruciunea 1, apoi se va
continua programul cu unstruciunea 3 dinafara instruciuni if. Dac valoarea
expresiei din parantezele de dup if este fals (are valoarea zero) se va efectua
instruciunea 2 i se va continua cu instruciunea 3.
Instruciunile 1 sau 2 pot fi instruciuni simple sau compuse sau chiar o nou
instruciune de tip if, n acest ultim caz se consider instruciunile if imbricate.
Forma 2
se evalueaz expresia i dac aceasta este adevrat, se execut instruciunea 1, iar
dac expresia este fals, se va executa expresia 2 dinafara instruciunii if.
if (expresie)
instructiunea 1;
instructiunea 2;
Exemplu
S se calculeze f(x) =4x
2
+7 pentru x<0 , f(x)=3x
2
-1 pentru x>=0.
Rezolvare
#include <conio.h> includerea fiierelor ce conin funciilor pentru
#include <stdio.h> citirea i afiarea datelor.
#include <math.h> includerea fiierului ce conine funciile
matematice.
void main () funcia principal
{
float x,fx; declaraii de variabile de tip real simpl precizie
puts ("Dati marimea lui x"); instruciune de apelare a funciei de afiare a
mesajului Dati marimea lui x
scanf ("%f",&x); instruciune de apelare a funciei de citire a lui x
cu formatul de citire de tip intreg
if (x<0) nceputul instruciunii if i x<0 expresia de
condiionare (decizie)
fx = 4*x*x+7; dac expresia de conditionare (decizie) este
adevrat, se execut instruciunea 1 din cadrul lui
if, care este n acest caz o instruciune de atribuire
else
eticheta ce delimiteaz instruciunea 1 de
instruciunea 2 a instruciunii if
fx=3*x*x-1; dac expresia de conditionare (decizie) este fals,
se execut instruciunea 2 din cadrul lui if, care
este n acest caz o instruciune de atribuire
LIMBAJUL C TEORIE I APLICAI I 55
printf ("f(x)=%f\n",fx); instruciunea 3, de dup instruciunea if cu rolul
de apelare a funciei de tiprire cu format de tip
real simpl precizie pentru valoarea variabilei fx,
\n are rolul s indice trecerea la rnd nou
puts ("Apasa o tasta"); instruciune de apelare a funciei de afiare a
mesajului Apasa o tasta
getch (); instruciune de apelare a funciei de citire a unui
caracter fr ecou, n acest caz folosit pentru
oprirea temporar a execuiei, pn la apsarea
unei taste, co scopul de a pstra ecranul
utilizatorului pentru citirea datelor afiate
}
Exemplu
n exemplul de mai jos este folosit instruciunea if n varianta II, fr
folosirea explicit a instruciunii 2 din corpul ei.
S se determine f(x)=x+4 pentru x<0, f(x)=x
2
pentru x>=0.
Rezolvare
#include <stdio.h> includerea fiierelor ce conin funciilor pentru
#include <conio.h> citirea i afiarea datelor.
void void main ()
{
float x,fx;
puts ("se calculeaza fx =");
puts ( "dati valoarea lui x ");
scanf ("%f",&x); citirea valorii de tip real simpl precizie a lui x i
dispunerea valorii citite la adresa lui x
if (x<0) nceputul instruciunii if i x<0 expresia de
condiionare, dac x<0 se va executa instruciunea
compus 1, dac nu se va sri peste instruciunea
compus 1 i se continu execuia cu instruciunea
de dup instruciunea if
{ nceputul instruciunii 1compuse
fx=x+4;
printf ("f(x)=%f\n",fx);
goto salt1; salt necondiionat la eticheta salt 1
} sfritul instruciunii compuse 1
LIMBAJUL C TEORIE I APLICAI I 56

fx=x*x; instruciunea de dup instruciunea if
printf ("f(x)=%f \n",fx);
salt1: eticheta la care se sare datorit instruciunii goto
puts ("apasa o tasta ");
getch ();
}
Exemplu
S se calculeze aria unui cerc dac raza cercului este mai mare dect zero.
#include <conio.h>
#include <math.h>
#include <stdio.h>
void main () funcia principal
{
float r,a,pi; declaraii de variabile de tip real simpl precizi,
separarea variabilelor din list prin caracterul ,

puts ("dati raza cercului"); instruciune de apelare a funciei de afiare a
irului de caractere (mesajul), dai raza cercului
scanf ("%f" ,&r); instruciune de apelare a funciei de citire cu
format de tip real , pentru citirea datei r i
dispunerea valorii citite la adresa lui r
if (r>0) inceputul instruciunii if i r>0 expresia de
condiionare, dac expresia r>0 este adevrat se
va executa instruciunea compus 1, n caz contrar
se va continua execuia cu instruciunea 2
{ nceputul instruciunii compus 1
pi=3.14156; instruciune de atribuire
a=pi*r*r; instruciune de atribuire
printf("aria cerc=%f",a);instruciune de apelare a funciei de tiprire
} sfritul instruciunii compuse 1
else
puts (Raza este <=0); instruciunea 2 din cadrul instruciunii if, de
apelare a funciei puts(), pentru afiarea irului de
caractere dispus ntre dublu apostroafe
puts ("apasa o tasta"); instruciunea 3 din afara instruciunii if, de apelare
a funciei puts(),pentru afiarea irului de
caractere dispus ntre dublu apostroafe
LIMBAJUL C TEORIE I APLICAI I 57
getch(); instruciune de apelare a funciei de citire a unui
caracter, n cazul de fa cu rolul de a pstra
ecranul utilizatorului pn la apsarea unei taste
} nchiderea corpului funciei principale void main ()
Exemplu
S se calculeze f(x)=4x
2
+7 pentru x<0, f(x)=4 pentru x=0, f(x)=3x
2
-1 pentru
x>=0.
Rezolvare
Pentru a calcula f(x) pe cele 3 domenii se va folosi instruciunea if de dou ori,
una inclus n alta de tip if imbricat, astfel :
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main ()
{
float x,fx;
puts ("dati marimea lui x");
scanf ("%f",&x);
if (x<0)
fx = 4*x*x+7;
else
if ( x==0) if imbricat
fx=4;
else
fx=3*x*x-1;
printf ("f(x)=%f\n",fx);
puts ("apasa o tasta");
getch ();
}
La execuia programului, dup citirea valorii ce este atribui variabilei x,
instruciunea if va evalua expresia x<0 . S considerm c s-a citit pentru x o
valoare negativ x=-2, dup evaluarea expresiei x<0 -2<0, adevrat, se va
continua execuia cu instruciunea 1 a primului if fx = 4*x*x+7, apoi se va
continua cu instruciunea 3 dinafara instruciunii 1 if, care va afia valoarea
lui f(x). S considerm c valoarea citit de la tastatur pentru x este 0, n
acest caz instruciunea 1 if, dup evaluarea expresiei x<0 0<0 fals, ce are ca
efect continuarea execuiei cu instruciunea 2 din cadrul instruciunii1 if, dar
instruciunea 2 este tot o instruciune if, care va evalua expresia din cadrul ei.
Evaluarea expresiei x==0 (x indentic zero i nu x=zero) rezult adevrat i se
execut instruciunea 1 din cadrul instruciunii 2 if, fx=4, se continu cu
instruciunea 3 care este aceeai cu instruciunea 3 de la instruciunea 1 if.
S considerm c valoarea citit pentru x este 3, n acest caz instruciunea 1 if,
dup evaluarea expresiei x<0 3<0 fals, ce are ca efect continuarea execuiei
LIMBAJUL C TEORIE I APLICAI I 58
cu instruciunea 2 din cadrul instruciunii1 if, dar instruciunea 2 este tot o
instruciune if, care va evalua expresia din cadrul ei.
Evaluarea expresiei x==0 3==0 (x indentic zero i nu x=zero) rezult fals i se
execut instruciunea 2 din cadrul instruciunii 2 if, fx=3*x*x-1, se continu
cu instruciunea 3 care este aceea cu instruciunea 3 de la instruciunea 1 if.
Aceste dou instruciuni if dispuse una n alta, se numesc instruciuni if
imbricate.
Exemplu
S se calculeze x=-b/a, rdcina ecuaiei de forma ax+b=0 (dac a este
diferit de zero). Dac a este zero se va afia mesajul nedeterminare dac b
egal zero se va afia mesajul solutia este x=0, dac b este diferit de zero se va
calcula valoarea lui x i se va afia aceast valoare.
Rezolvare
#include<stdio.h>;
#include<conio.h>;
void main ()
{
float x,a,b;
puts("se calculeaza radacina ecuatiei ax+b=0");
puts("dati pe a, b");
scanf("%f,%f",&a,&b); apelarea funciei de citire de la tastatur cu
formatul de tip rel simpl precizie a dou
valori separate prin caracterul virgul
if(a != 0) instruciunea if evalueaz expresia a!= 0
( a este diferit de zero) i dac aceasta este
adevrat se va executa instruciunea 1 din
cadrul lui if
{ nceputul corpului instruciunii compuse 1
x=-b/a;
printf ("a=%f b=%f x=%f \n",a,b,x);
} terminarea corpului instruciunii compuse 1
else
if (b==0)
puts ("ecuatie nedeterminata");
else
puts ("ecuatia nu are solutie");
puts("apasati o tasta");
getch();
}
Probleme propuse
1. S se determine aria unui triunghi cnd se dau cele 3 laturi: a, b, c. Ca cele 3
valori date s formeze un triunghi trebuie s se respecte condiiile:
cele 3 numere > 0
LIMBAJUL C TEORIE I APLICAI I 59
ntre numerele a, b, c, s existe relaiile:
a > b+c
b > c+d
c > a+b
Aria = ( ) ( ) ( ) c p b p a p p , unde p =
2
c b a + +
2. S se determine cantitatea de cldur necesar topirii unei cantiti de ghea cu
masa m de la temperatura t
1
pn la temperatura t
2
.
Condiii: t
1
< 0 i t
2
> 0
Q = Q
1
+ Q
2
+ Q
3
Q
1
=
( ) m t c
g

1
0
Q
2
=
m c
Q
3
=
2
t c m
a

c
g
= cldura specific gheii
c = cldura latent de topire a gheii
c
a
= cldura specific a apei
Date de intrare : t
1
, t
2
, m
Date de ieire : Q
3. S se determine alungirea sau scurtarea unui tirant, folosind formula
( ) EA l F l / .
unde
A = aria seciunii transversale [cm
2
]
l = lungimea tirantului [cm]
E = modulul de elasticitate [daN/cm
2
]
F = fora ce acioneaz [daN] (Dac F < 0 compresiune, altfel ntindere)
Date de intrare : A, l, E, F.
Date de ieire : l
4. S se determine valoarea lui F(x):
( ) ( )

'

+
>
< +

1 4
1 1
0 3
2
3
x x
x x x
x x
x F
Date de intrare : x
Date de ieire : F(x)
LIMBAJUL C TEORIE I APLICAI I 60
5. S se citeasc o valoare de la tastatur i s se verifice dac valoarea citit este
un numr. Dac valoarea este un numr s se afieze numrul, n caz contrar s se
afieze mesajul valoarea introdus nu este un numr.
6. S se determine soluiile x i y ale sistemului:
ax + by = c
dx + ey = f
Sistemul este compatibil dac: 0 d b e a
Date de intrare : a, b, c, d, e, f
Date de ieire : x, y
7. S se calculeze aranjamente de x luate cte y.
Date de intrare : x, y
Date de ieire:
y
x
A
8. S se calculeze numrul de combinaii a x luate cte y.
Date de intrare : x, y
Date de ieire :
y
x
C
Condiii : x > 1, y < x, y > 1
3.5.4. Instruciunea for.
Instruciunea for se utilizeaz pentru realizarea structurilor ciclice condiionate
anterior. Sintaxa instruciunii for este :
for (expresie1; expresie2; expresie3)
Instructiune simpla sau compusa;
Expresia 1 are rolul de a iniializa variabila ciclului for, expresia 2 are rolul de a
condiiona continuarea ciclului for, iar expresia 3 are rolul de a reiniializa variabila de
contor. Instruciunea for se execut astfel :
1. se evalueaz expresia 1 i valoarea acestei expresi devine valoarea de nceput
a variabilei de contor din ciclul for.
2. se evalueaz expresia 2 i dac este adevrat se execut instruciunea care
este n corpul lui for, dac expresia 2 este fals se prsete ciclul for i se
trece la urmtoarea instruciune.
3. dup executarea pasului 2 se execut expresia 3 de modificare a valorii
variabilei de contoar i se reia pasul 2.
Instruciunea for nu se execut niciodat dac expresia 2 are valoarea zero de la
nceput.
Dac imediat dup antetul instruciunii for se pune ; instruciunea for va efectua
instruciunea vid pn cnd condiia din expresia 2 este adevrat avnd rolul
doar de ntrziere a efecturi programului.
Exemplu
Adunarea numerelor naturale de la zero la numarul n citit de la tastatur
s=1+2+3+4+.+n-1
LIMBAJUL C TEORIE I APLICAI I 61
Rezolvare
Pentru a realiza aceast sum se va executa repetat instruciunea compus :
{
s=s+i;
i=i+1;
}
Iniial s=0 i i=0, i se repet instruciunea
{
s=s+i;
i=i+1;
}
pn cnd i<n .
nsumarea se poate executa folosind instruciunea for astfel :
s=0; i=0;
for (i=0;i<n; i=i+1) Expresia1 i=0 iniializeaz variabila contor i cu
valoarea 0; expresia2 i<n este condiia de execuie a
ciclului for; expresia3 i=i+1 este expresia de
reiniializare cu o unitate a variabilei contor .
s=s+i;
#include <conio.h> includerea fiierelor ce conin funciile de intrare
ieire
#include <stdio.h>
void main ()
{
int i,n,s; declararea variabilelor i, n, s de tip intreg
puts ("s =1+2+3+4+..n-1?"); apelarea funciei de afiare a irului de caractere
dispus ntre ghilimele duble
puts ("dati pe n mai mara dect zero =?");
scanf ("%d",&n); apelarea funciei de citire cu format de tip
intreg a unei date de la tastatur i dispunerea
valorii citite la adresa lui n
if (n<=0) condiionarea datei de intrare prin folosirea
instruciunii if
puts ("n a fost dat gresit");instruciunea 1 din corpul lui if
else
{ instruciunea compus 2 din corpul
instruciunii if
s=0; iniializarea sumei cu zero
LIMBAJUL C TEORIE I APLICAI I 62
for (i=1;i<n;i=i+1) antetul instruciunii for, prin care se
iniializeaz variabila de contor cu valoarea 1,
apoi expresia de control a ciclului for i<n i
expresia de reiniializare a variabilei de contor
i=i+1
s=s+i; instruciunea de atribuire pentru calculul sumei
s=1+2+3++n
printf("suma = %d\n",s); apelarea funciei de tiprire cu format pentru
afiarea sumei i salt la rnd nou prin folosirea
caracterelor \n
puts ("apasa o tasta"); apelarea funciei de afiare a irului de
caractere
getch (); apelarea funciei de citire a unui caracter de la
tastatur
} nchiderea corpului funciei principale main
La pornirea programului se citete de la tastatur numrul de termeni n-1 ai sumei,
valoarea citit este dispus la adresa lui n. S considerm c valoarea citit a lui n este
5. Variabila s este iniializat cu valoarea zero, se iniializeaz variabila de contor i a
lui for cu valoarea 1,
Suma s =0+1=1,
dup efectuarea primului ciclu for, se mrete variabila de contor cu o unitate datorit
expresiei
i=i+1,
se cuntroleaz dac noua valoare a lui
i =2
verific expresia de condiionare
i<n.
Valoarea lui i este 2<5 adevrat,
se va continua efectuarea instruciunii compuse din interiorul lui for.
s=s+i rezult
s=1+2
rezult
s=1+2 obinndu-se primi doi termeni ai sumei s.
Se continu creterea variabilei de contor cu o unitate
i=3,
se verific condiia de continuare a instruciunii for
i=3<5 adevrat,
s=s+i rezult
s=1+2+3 obinndu-se primi trei termeni ai sumei.
LIMBAJUL C TEORIE I APLICAI I 63
Se continu creterea variabilei de contor cu o unitate
i=4,
se verific condiia de continuare a instruciunii for
i=4<5 adevrat,
s=s+t*i rezult
s=1+2+3+4 obinndu-se primi patru termeni ai sumei.
Se continu creterea variabilei de contor cu o unitate
i=5,
se verific condiia de continuare a instruciunii for
i=5<5 fals,
se prsete instruciunea for i se continu execuia cu afiarea pe monitor a
sumei celor patru termeni.
Exemplu
S se realizeze programul ce adun termeni alternani pentru s=1-2+3- n.
Rezolvare
#include <conio.h>
#include <stdio.h>
void main ()
{
int i,n,s,t;
puts ( se calculeaza suma s=1-2+3-4+5-.n);
puts ("dati pe n >0=");
scanf ("%d",&n);
if (n<=0) se evalueaz expresia n<=0 i dac este
adevrat, se afieaz mesajul n a fost dat
gresit i se trece la instruciunea de dup
corpul instruciunii if.
puts ("n a fost dat gresit"); instruciunea 1 din corpul lui if
else
{ nceputul instruciunii compuse 2 a instruciunii if
s=0; iniializarea sumei s cu valoarea zero
t=-1; iniializarea termenului t=1, folosit pentru
alternarea termenilor din cadrul sumei s
for (i=1;i<=n;i=i+1) antetul instruciuni for, iniializarea lui i cu 1,
condiionare i<=n, reiniializarea variabilei i
cu o cretere =1 la fiecare ciclu parcurs
{ inceputul corpului instruciunii for
t=-t; instruciune de atribuire cu scopul alternrii
semnului termenului ce se adaug
LIMBAJUL C TEORIE I APLICAI I 64
s=s+i*t; instruciune de atribuire pentru calculul sumei
termenilor cu semn alternant
} sfritul corpului instruciunii for
printf ("suma = %d\n",s);
} sfritul instruciunii 2 a instruciuni if
puts ("apasa o tasta");
getch ();
}
La pornirea programului se citete de la tastatur numrul de termeni ai sumei, valoarea
citit este dispus la adresa lui n. S considerm c valoarea citit este 5. Variabila s
este iniializat cu valoarea zero, apoi termenul t ia valoarea 1, se iniializeaz
variabila de contor i a lui for cu valoarea 1, se realizeaz schimbarea de semn a lui t,
t devine egal cu 1.
Suma s =0+1*1=1,
dup efectuarea primului ciclu for, se mrete variabila de contor cu o unitate datorit
expresiei
i=i+1,
se controleaz dac noua valoare a lui
i =2
verific expresia de condiionare
i<=n.
Valoarea lui i este 2<=5 adevrat,
se va continua efectuarea instruciunii compuse din interiorul lui for.
t=-t
rezult t=-1,
s=s+t*i rezult
s=1+(-1)*2
rezult
s=1-2 obinndu-se primii doi termeni aisumei s.
Se continu creterea variabilei de contor cu o unitate
i=3,
se verific condiia de continuare a instruciunii for
i=3<=5 adevrat,
t=-(-1)=1,
s=s+t*i rezult
s=1-2+3 obinndu-se primii trei termeni ai sumei.
Se continu creterea variabilei de contor cu o unitate
i=4,
se verific condiia de continuare a instruciunii for
i=4<=5 adevrat,
t=-(1)=-1,
s=s+t*i rezult
LIMBAJUL C TEORIE I APLICAI I 65
s=1-2+3-4 obinndu-se primii patru termeni ai sumei.
Se continu creterea variabilei de contor cu o unitate
i=5,
se verific condiia de continuare a instruciunii for
i=5<=5 adevrat,
t=-(-1)=1,
s=s+t*i rezult
s=1-2+3-4+5 obinndu-se primii cinci termeni ai sumei.
Se continu creterea variabilei de contor cu o unitate
i=6,
se verific condiia de continuare a instruciunii for
i=6<=5 fals,
se prsete instruciunea for i se continu execuia cu afiarea pe monitor a
sumei celor cinci termeni.
Exemplu
S se afieze valorile funciei f(x)=4x
2
+3x+5 pe intervalul 2 la +2 cu pasul
x=0,1.
Rezolvare
#include <conio.h>
#include <stdio.h>
void main ()
{
float i,x,fx;
puts (se calculeaza f(x)=4x2+3x+5 pt. x=-2 la 2 cu pasul 0.1);
for (x=-2;x<=2;x=x+0.1) antetul instruciuni for, iniializarea lui x cu
valoarea -2, indentic cu nceputul intervalului
pentru x, condiionare x<=2, limita din dreapta
a intervalului pentru x, reiniializarea
variabilei x cu o cretere =0.1 la fiecare ciclu
parcurs
{ nceputul instruciunii compuse din corpul lui for
fx=-4*x*x+3*x+5; calculul lui fx la fiecare ciclu pentru x
printf ("F(x)=%f\n",fx);
} nchiderea corpului instruciunii compuse i inclusiv nchiderea
instruciunii for
puts("apasa o tasta");
getch ();
}
La execuia programului se va iniializa variabila de contor din ciclul for cu valoarea
2, se parcurge instruciunea compus, se determin valoarea lui fx pentru x=-2, se
afieaz valoarea calculat pentru fx, se reiniializeaz variabila de contoar cu o
cretere egal cu pasul dat de expresia x=x+0.1 i se verific dac noua valoare pentru
x respect condiia x<2 din expresia 2 a instruciunii for.
LIMBAJUL C TEORIE I APLICAI I 66
La al doi-lea pas
x=-2+0.1=-1.9
-1.9<2 adevrat
se reia execuia instruciunii de atribuire fx, se continu ciclul for pn cnd x
va avea valoarea 2, limita superioar a intervalului de definire pentru x.
pentru x=2 se calculeaz fx, se reiniialiteaz x cu noua valoare
x=2+0.1=2.1
2.1<2 fals
ciclul for se nchide i se continu programul cu instruciunea de dup
instruciunea for.
Exemplu
S se calculeze n! =123 n, unde n se citete de la tastatur, n >0.
Rezolvare
#include <conio.h>
#include <stdio.h>
void main ()
{
int n,i; declararea a dou variabile simple de tip treg
float p; declararea unei singure variabile simple de tip
real simpl precizie ( float)
puts ("dati numarul n=?"); afiarea irului de caractere dintre dati numarul
n=?
scanf ("%d",&n); citirea unei date de tip ntreg de la tastatur
if (n<=0) instruciunea if de condiionare
puts ("n este gresit"); instruciunea 1 a instruciunii if
else
{ nceputul instruciuni 2 a instruciuni if
p=1; iniializarea produsului cu valoarea 1
for (i=1;i<=n;i=i+1)
p=p*i; calculul produsului p=123 n
printf("N!=%g\n",p); afiarea factorialului, folosind reprezentarea ca
valoare simpl precizie sau sub forma valoare
reprezentat cu exponent pentru a utiliza optim
spaiul ocupat pentru afiare %g

printf("N!=%.1f\n",p); afiarea factorialului cu parte ntreag i o singur
zecimal prin controlul formatului de afiare
%.1f
} nchiderea instruciunii 2 a instruciunii if
puts("apasa o tasta");
getch ();
LIMBAJUL C TEORIE I APLICAI I 67
}
Exemplu
S se citeasc termenii unui vector i s se nmuleasc vectorul cu un scalar,
mrimea vectorului, termenii vectorului ct i scalarul se citesc de la tastatur.
Rezolvare
#include <conio.h>
#include <stdio.h>
void main ()
{
int n,i,k; declararea a trei variabile simple de tip ntreg
float a[10],b[10]; declararea variabilelor indexate de tip vector cu
mrimea =10
puts ("dati marimea vectorului n=?");
scanf ("%d",&n); citirea mrimii vectorului
for (i=1;i<=n;i=i+1) instruciunea for folosit pentru citirea termenilor
vectorului
{
printf("dati a[%d]=",i); afiarea numrului termenului ce se citete
scanf ("%f",&a[i]); citirea termenului [i] al vectorului a
} ncheierea operaiei de citire a termenilor
vectorului
puts("dati marimea scalarului k=");
scanf ("%d",&k); citirea scalarului de tip ntreg
for (i=1;i<=n;i=i+1) calculul produsului vectorului a cu scalarul k
b[i]=a[i]*k;
for (i=1;i<=n;i=i+1) afiarea celor doi vectori a[] i b[]
{
printf ("a[%d]=%f\t",i,a[i]);
printf("b[%d]=%f\t",i,b[i]);
}
puts("apasa o tasta");
getch ();
}
Un vector a[] se caracterizeaz prin numrul de termeni i valoarea fiecrui
termen . Pentru a citi valoarea ce se atribuie fiecrui termen, este nevoie s se
realizeze un grup de instruciuni, care s permit afiarea numrului termenului i
citirea valorii termenului.
Acest grup de instruciuni trebui reluat pentru fiecare termen, reluarea grupului se
va realiza prin intermediul instruciunii ciclice for. Prima instruciune
for (i=1;i<=n;i=i+1) va realiza prin intermediul instruciunii compuse :
LIMBAJUL C TEORIE I APLICAI I 68
afiarea numrului termenului vectorului
citirea valorii termenului vectorului
Pentru orice operaie asupra termenilor unui vector este necesar apelarea
instruciunii for prin care s- se parcurg operaia dorit asupra termenilor
vectorului. Astfel instruciunea a doua for are ca scop nmulirea termenilor
vectorului cu un scalar. Instruciunea a treia for are ca scop afiarea termenilor
vectorului a ct i a vectorului b.
Exemplu
S se citeasc termenii unui vector i s se caute dac o valoare citit de la
tastatur aparine vectorului, marimea vectorului, termenii vectorului ct i
valoarea cutat, se citesc de la tastatur.
Rezolvare
#include <stdio.h>
#include <conio.h>
void main ()
{
float t,a[10];
int i,n;
puts ("se determina daca o valoare citita apartine vectorului");
puts ( "dati marimea vectorului ");
scanf ("%d",&n);
for (i=1;i<=n;i++) instruciunea for pentru citirea termenilor
vectorului
{
printf ("dati termenul %d= ",i);
scanf ("%f",&a[i]);
}
puts ("dati valoarea care se cauta daca apartine vectorului");
scanf ("%f",&t);
for (i=1;i<=n;i++) instruciunea for pentru parcurgerea tuturor
termenilor vectorului i compararea fiecrui
termen cu valoarea cutat
if (t==a[i]) instruciunea de decizie
puts ("valoarea cautata apartine vectorului");
else
;
puts ("apasa o tasta ");
getch ();
}
Probleme propuse
1. S se determine valoarea lui sin (x) dat de relaia:
sin (x)= x-x
3
/3!+x
5
/5!-x
7
/7!..+(-1)
n
.x
2n+1
/(2n+1)
Date de intrare : valoare numeric real a lui x exprimat n radiani
Date de ieire : valoarea lui sin (x)
LIMBAJUL C TEORIE I APLICAI I 69
2. S se determine valoarea lui cos (x) dat de relaia:
cos (x)=1-x
2
/2!+x
4
/4!-x
6
/6!.+(-1
n
).x
2n
/(2n)
Date de intrare : valoare numeric real a lui x exprimat n radiani
Date de ieire : valoarea lui cos (x)
4. S se afieze viteza=v i spaiul s1= parcurs
n fiecare secund a unui corp n cdere
liber de la nlimea =h.
Date de intrare: inlimea h.
Date de ieire v, s1.
Timpul total de cdere =t= g h / 2 v=g.t s1=g(t
2
i+1
-t
2
i
)
Constant g=9.81 m/s
2
.
5. S se determine valoarea maxim a
termenului unui vector .
Date de intrare: mrimea i termenii vectorului
Date de ieire: valoarea maxim a termenului .
6. S se calculeze C=A.a1+B.b1
A, B vectori cu aceeai mrime
a1, b1 doi scalari
Date de intrare: n=mrimea vectorilor
Termenii celor doi vectori
Valoarea celor doi scalari
Date de ieire: vectorul C.
7. S se afieze valorile funciei f(x)=g.x
2
/2
pentru xa,b iar pasul de cretere a lui x
este p.
Date de intrare a, b, p.
Date de ieire valoarea lui f(x) .
8. S se determine suma s=1-2
2
+3
2
-4
2
.n
2
Date de intrare: mrimea n.
Date de ieire: valoarea sumei s.
9. S se determine valoarea lui e =1+1/1!
+1/21+1/31+1/n! cu precizia cerut de
utilizator prin epsilon.
Date de intrare: numrul de termeni, epsilon.
Date de ieire valoarea lui e.
LIMBAJUL C TEORIE I APLICAI I 70
10. S se determine media aritmetic i
geometric a n numere pozitive citite de la
tastatur.
Ma=(n1+n2+n3+nn)/n
Mg=
n
nn n n n ... 3 . 2 . 1

Date de intrare numrul de numere i valoarea acestora.
Date de ieire Ma i Mg.
3.5.5. Instruciunea while.
Instruciunea while este folosit pentru realizarea unei structuri ciclice
condiionate anterior i are sintaxa :
while (expresie de conditionare)
Instructiune simpla sau compusa;
Se evalueaz expresia dintre paranteze i dac aceasta este adevrat se
efectueaz instruciunea din corpul lui while, dup care se trece
la instruciunea urmtoare.
Dac expresia are valoare fals, nu se va executa instruciunea din corpul lui
while i se trece direct la instruciunea urmtoare, astfel instruciunea din
corpul lui while poate s nu se execute niciodat. n corpul instruciunii while
poate exista o nou instruciune while, n acest caz, se numesc instruciuni
while imbricate.
Instruciunea while se poate considera ca o instruciune ciclic condiionat
Anterior, definind o structur repetitiv.
Exemplu
S se afieze valorile funciei f(x)=4x
2
+3x+5 x 2 la +2 cu pasul =0.1 pt. x.
#include <conio.h>
#include <stdio.h>
void main ()
{
float i,x,fx;
puts (se calculeaza f(x)=4x
2
+3x+5 pt. x=-2 la 2 cu pasul 0.1);
x=-2; iniializarea lui x cu valoarea de nceput a
intervalului
while ( x<=2) instruciunea while condiioneaz execuia ct
timp x<=2
{ nceputul corpului instruciunii while
fx=-4*x*x+3*x+5;
printf ("x=%f F(x)=%f\n",x,fx);
x=x+0.1; modificarea variabilei de condiionare, pentru a se
parcurge domeniul lui x
} sfritul corpului lui while
puts("apasa o tasta");
LIMBAJUL C TEORIE I APLICAI I 71
getch ();
}
Observaie
Dac variabila x ce intr n expresia de condiionare a lui while nu se modific
n interiorul corpului instruciunii while, va rezulta un ciclu infinit.
n cazul de fa, nainte de execuia instruciunii while, x are valoarea 2 ce
este mai mic dect 2, astfel expresia x<=2 este adevrat i se ncepe
execuia instruciunii compuse din corpul lui while astfel :
Se calculeaz fx=-4*x*x+3*x+5; pentru x=-2
Se afieaz valoarea lui x i f(x) cu instruciunea
printf ("x=%f F(x)=%f\n",x,fx);
x=x+0.1; se modific valoarea lui x cu 0.1. x devine 1.9 i
se verific dac noua valoare a lui x respect
condiionarea din expresia lui while i se continu
pn cnd valoarea lui x devine mai mare dect 2.
Exemplu
S se afieze valorile funciei trigonometrice sin (x) pentru domeniul 0 la 359
de grade sexagesimale, din grad n grad, cu vizualizarea pagin cu pagin a
valorilor.
Rezolvare
Pentru calculul funciei sin (x) se va apela funcia de bibliotec
sin(parametru) din fiierul math.h cu observaia c parametrul funciei
sin(par) trebuie exprimat n radiani. Astfel, se va converti unghiul x din grade
sexagesimale n radiani par=x*PI/180
Pentru a afia pagin cu pagin, se va condiiona ca dupa fiecare valoare a lui
x=modul de 23 s se citeasc un caracter de la tastatur, cu scopul de a opri
temporar execuia programului n ecranul utilizatorului, pentru citirea valorilor
din pagina curent.
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define PI 3.14159265 definirea constantei PI
void main ()
{
int x;
double sx,x1;
x1=PI/180.0;
x=0;
while (x<=359) condiionarea execuiei instruciunii while
{
LIMBAJUL C TEORIE I APLICAI I 72
sx=sin (x*x1); calculul lui sx ca sin( x), x este transformat n
radiani pentru a apela corect funcia matematic
double sin (valoare double)
printf ("sin [%d]=%.10lf\n",x,sx);
x=x+1; modificarea valorii lui x pentru a parcurge
domeniul 0 359 grade
if ((x+1)%23==0) condiionarea afirii mesajului i ateptarea
apasrii unei taste dup 23 de linii afiate (dac
restul mpririi lui x la 23 este zero, adic x
modulo 23)
{
puts ("Apasati o tasta pentru a afisa pagina urmatoare");
getch ();
}
} nchiderea corpului instruciunii while
puts("apasa o tasta pentru terminarea programului ");
getch ();
}
Exemplu
S se citeasc mai multe valori reale separate prin spaiu alb sau Enter i s
se determine suma acestor valori. Terminarea irului de valori se relizeaz
prin apsarea unei taste liter sau caracterul virgul.
Rezolvare
Datorit faptului c nu se cunosc numrul de valori ce se vor citi, nu se poate
aplica instruciunea ciclic for, se va pune o condiie care s detecteze cnd
valoarea ce se citete nu mai este o valoare real.
Funcia scanf (%f..) returneaz valoarea 1, pentru o citire efectuat sub
controlul de format i valoarea 0 pentru cazul c nu s-a efectuat citirea.
Instruciunea while verific condiia ca citirea s aib loc (valoarea returnat
de funcia scanf s- fie ==1).
#include <stdio.h>
#include <conio.h>
void main ()
{
float t,s;
puts ("Se citesc valori reale separate prin spatiu si se afiseaza
suma lor ");
puts ( "inchiderea sirului cu caracterul virgula
dati valorile ");
s=0;
while (scanf ("%f",&t)==1) instruciunea while condiioneaz execuia
instruciunii s=s+t, dac funcia scanf ()
LIMBAJUL C TEORIE I APLICAI I 73
returneaz valoarea 1. corespunztoare citiri unei
date reale urmat de spaiu liber sau Enter. Dac
data citit este un caracter alfa sau virgul,
condiia lui while nu mai este adevrat, finc
funcia scanf va returna valoarea 0 (nu s-a citit
valoarea), se prsete while.
s=s+t; instruciunea din corpul lui while , care realizeaz
suma valorilor introduse de la tastatur.
printf ("suma valorilor introduse =%.3f \n",s); %.3f permite afiarea valorilor reale cu
3 zecimale
puts ("apasa o tasta ");
getch ();
}
Exemplu
S se citeasc termenii a doi vectori de tip real simpl precizie, s se
determine produsul scalar ai celor doi vectori.
Rezolvare
Se consider c termenii primului vector sunt n a, iar termenii celui de-al doilea
vector sunt n b. Datorit faptului c nu se cere pstrarea termenilor citii i
doar produsul scalar, nu este necesar declararea de tablouri de tip vectori.
Dac vectorul a are termenii a1, a2, a3, an iar vectorul b are termenii b1, b2,
b3, bn , produsul scalar a vectorilor a i b este dat de suma
a1*b1+a2*b2+a3*b3.an*bn.
Se vor citi perechi de valori ce reprezint termenul ai, bi, iar nchiderea irului
de perechi de valori se realizeaz ca i n exemplul anterior, prin a tasta un
caracter liter sau caracterul virgul.
#include <stdio.h>
#include <conio.h>
void main ()
{
float a,b,p;
int i; declararea variabilei i de tip intreg pentru ase afia
numrul termenului care se citete,sau se poate
folosi la indicarea numrului final de termeni ai
vectoruluia sau vectorului b
puts ("Se citesc valori reale perechi a termenilor a doi vectori ");
puts ( " Inchiderea sirului cu caracterul virgula sau caracter litera");
p=0.0;
i=1;
printf ("Dati valoari pentru a[%d] si b[%d]",i,i);
LIMBAJUL C TEORIE I APLICAI I 74
while (scanf ("%f %f",&a,&b)==2) condiia de continuare a instruciunii
compuse din corpul lui while
{
p=p+a*b;
i=i+1;
printf ("Dati valori pentru a[%d] si b[%d]",i,i);
}
printf ("Produsul scalar a termenilor celor 2 vectori =%.3f \n",p);
puts ("Apasa o tasta ");
getch ();
}
Probleme propuse
1. S se realizeze un program care s calculeze
4 x 3 F
2
x
+
, x>0
condiionat de o parol de intrare formate din 2-3 cifre.
Dat de intrare: parol i x
Dat de ieire
x
F
2. S se determine n! pentru n<100 n!=1*2*3*..*n
Dat de intrare: n
Dat de ieire n!
3. S se citeasc termeni unui vector i s se determine valoarea minim a
termenului vectorului.
Dat de intrare: termeni vectorului.
Dat de ieire minimul din termeni vectorului.
3.5.6. Instruciunea do while.
Instruciunea do while este utilizat pentru realizarea structurilor ciclice
condiionate posterior i are sintaxa :
do
Instructiune simpla sau compusa;
while (expresie);
Instruciunea se execut astfel :
1. Se execut instruciunea simpl sau compus de dupo do,
2. Se evalueaz expresia dintre parantezele de dup while i dac aceasta este
adevrat, se reia execuia instruciunii de dup do, dac valoarea expresiei
este fals se ncheie instruciunea do-while i se continu programul cu
urmtoarea instruciune.
Observaie
Indiferent de valoarea expresiei dintre parantezele de dup while, instruciunea din
corpul do-while se execut cel puin odat, de unde apare i denumirea de
structur condiionat posterior.
Exemplu
S se afieze valorile funciei f(x)=4x
2
+3x+5 pentu x intervalul de la k la
+2, x are pasul de cretere =0.1, dac k >2 se va calcula i afia pentru acest
LIMBAJUL C TEORIE I APLICAI I 75
k valoarea funciei f(x), dac k<2 se va determina f(x) de la k, la limita
superioar a intervalului (2) .
Rezolvare
#include <conio.h>
#include <stdio.h>
void main ()
{
float i,x,fx;
puts (se calculeaza f(x)=4x
2
+3x+5 pt. x k la 2, daca k <2, cu pasul 0.1);
puts (Dati valoarea de inceput a lui x= k);
scanf ( %f,&x);
do
{ nceputul corpului instruciunii do-while
fx=-4*x*x+3*x+5;
printf ("x=%f F(x)=%f\n",x,fx);
x=x+0.1; modificarea variabilei condiionat de while
pentru a se termina domeniul pt. x
} sfritul corpului lui do-while
while (x<=2) instruciunea while condiioneaz continuarea
execuiei instruciunii compuse din corpul lui do-
while ct timp x<=2
puts("apasa o tasta");
getch ( );
}
Cazul I. Presupunem c s-a dat pentru x=k valoarea 3, n acest caz se va
calcula f(x) pentru aceast valoare, se va afia valoarea lui x i f(x), dup care
se majoreaz valoarea lui x cu 0.1 i se evalueaz expresia x<=2 , 3.1 nu este
mai mic dect 2, expresia este fals, se prsete ciclul do while.
Cazul II. Presupunem c s-a citit pentru x valoarea 0, n acest caz se va
calcula f(x) pentru aceast valoare, se va afia valoarea lui x i f(x), dup care
se majoreaz valoarea lui x cu 0.1 x=0+0.1=0.1 i se evalueaz expresia
x<=2 , este mai mic dect 2, expresia este adevrat, se reia calculul lui f(x) i
calculul pentru noua valoare a lui x=0.1+0.1=0.2pn cnd x are valoarea 2,
se efectueaz ultimul calcul i se prsete ciclul do while.
Exemplu
S se determine numrul minim de monede i bacnote cu care se poate plti o
sum numr intreg pozitiv, monedele folosite sunt : 100, 500, 1000, iar
bacnotele sunt : 2000, 10000, 50000, 100000.
Rezolvare
Calculul ncepe prin a determina numrul ntreg de bacnote cu valoarea
maxim 100000 din care este realizat suma v.
Pentru a apela valorile diferite ale monedelor sau bacnotelor s-a folosit
LIMBAJUL C TEORIE I APLICAI I 76
vectorul moneda cu 7 termeni, a cror valoare reprezint valorile impuse n
enunul problemei.
Pentru aceasta se mparte suma v la valoarea bacnotei maxime,
I=7
n=v/moneda [i];
n = partea ntreag a mpriri la 100000 care va indica numrul de bacnote de
100000.
Pentru a determina restul mpriri la 100000 se va aplica expresia :
v=v%moneda [i]
astfel noua valoare a lui v conine multipli ai monedelor sau bacnotelor cu
valori mai mici de 100000.
Se repet procedeul de mai sus, prin modificarea termenului la care se va
mprii noua sum (restul de la mprirea cu 100000), find necesar
decrementarea lui i cu 1 :
i=i-1; rezult i=6
n=v/moneda [6]; rezult numrul de bacnote cu valoarea de 50000
v=v%moneda [5] rezult restul mpriri la 50000
Aceti pai se repet pn cnd valoarea restului este zero, valoarea sumei
trebuie s fie multiplu de 100 (valoarea minim a monedei impus n enunul
problemei).
#include <stdio.h>
#include <conio.h>
void main ()
{
long v,n; declararaii a tipului intreg long pentru a se putea
efectua operaii pe intregi cu valori mai mari de
32647
long i;
long moneda [8];
puts ("Se calculeaza numarul de bagnote si monede pt. o valoare data ");
puts ( "Dati valoarea intreaga multiplu de 100");
scanf("%ld",&v); citirea unei date de tip intreg long %ld
moneda [1]=100; atribuirea valorilor termenilor vectorului moneda
moneda [2]=500;
moneda [3]=1000;
moneda [4]=2000;
moneda [5]=10000;
moneda [6]=50000;
moneda [7]=100000;
LIMBAJUL C TEORIE I APLICAI I 77
i=7; iniializarea lui i cu valoarea max corespunztoare
numrului termenului maxim al vectorului
moneda
do nceperea ciclului do while
{
n=v/moneda [i];
if (n) dac valoarea sumei s este mai mic de 100 sau
nu este multiplu de 100, va rezulta n=0 i nu se va
afia numrul bacnotelor sau monedelor, datorit
faptului c suma nu poate fi reprezentat de nici o
manod
if (i<5)
if (n==1)
if (i==1)
puts ("O moneda de 100 lei");
else
printf ("o moneda a %ld lei\n",moneda [i]);
else
if (i==1)
printf ("%ld monede de 100lei\n",n);
else
printf ("%ld monede %ld lei\n",n,moneda [i]);
else
if (n==1)
printf ("O bacnota a %ld lei \n",moneda [i]);
else
printf ("%ld bacnote a %ld lei",n,moneda [i]);
}
while (v=v%moneda [i--]); expresia de condiionare a ciclului do while este
ca restul mpririi s fie diferit de zero i
suplimentar se face decrementarea cu 1 a valorii
lui i
puts ("Apasa o tasta ");
getch ();
}
Probleme propuse
1. S se realizeze un program care s afieze 3 x 4 F
2
x
+ indiferent de
valoarea lui x iar dac 4 0 x s afieze valorile lui
x
F pe acest interval cu
pasul de cretere a lui 5 , 0 x
Dat de intrare: x
Dat de ieire:
x
F
2. S se citeasc tasta apsat i dac aceasta nu este cifr atunci se efectueaz
programul de calcul a lui
x
F pentru o valoare 1 x iar dac tasta apsat este
1 s se afieze
x
F pe intervalul 10 0 x cu pasul 1.
LIMBAJUL C TEORIE I APLICAI I 78
1 x 2 x 4 F
2
x
+ + .
Dat de intrare: valoarea introdus
Dat de ieire:
x
F
3.5.7. Instruciunea break.
Instruciunea break este folosit n cadrul corpului unui ciclu al instruciunilor for,
do-while, while, switch i la ntlnirea acestei instruciuni se termin execuia
ciclului. Execuia se continu cu instruciunea de dup ciclul n care s-a ntlnit
instruciunea break. Sintaxa instruciunii break este :
break;
Exemplu
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main ()
{
int i,s;
float n,j,x,fx;
do
{
puts ("dati valoarea lui x");
if (scanf("%f",&x) == 1) dac data citit este de tip real, funcia scanf va
returna valoarea 1
break; instruciunea break foreaz ieirea din ciclul do
while
puts ("nu s-a citit un numar");
puts ("se reia citirea ");
fflush (stdin); funcia fflush are rolul de a goli registrul asociat
tastaturii pentru reluarea citirii
}
while (1);
for (j=x;j<=x+5;j++)
{
fx=4*j;
printf ("functia fx=%g \n",fx);
}
puts ("Apasa o tasta");
getch ();
}
3.5.8. Instruciunea continue.
Instruciunea continue se utilizeaz n corpul ciclului do while, while sau for i
permite abandonarea iteraiei.
Instruciunea continue n cadrul instruciunilor while i do while foreaz
oprirea iteraiei curente, se evalueaz expresia care stabilete continuarea sau
terminarea ciclului.
LIMBAJUL C TEORIE I APLICAI I 79
n cadrul instruciunii for, instruciunea continue foreaz abandonarea iteraiei
curente i se execut pasul de reiniializare.
Instruciunea continue este folosit n cadrul instruciunilor if imbricate din
cadrul unui ciclu for, do while, while.
3.5.9. Funcia exit.
Funcia exit are prototipul :
Void exit (int cod)
Parametrul de tip intreg definete starea programului la momentul apelrii funciei exit.
Valoarea 0 a parametrului indic o terminare normal a execuiei programului.
Valoarea diferit de 0 a parametrului indic o terminare anormal a programului.
La apelul funciei exit, se videaz bufferele fiierelor deschise n citire, se nchid toate
fiierele deschise i se ntrerupe programul.
Prototipul funciei exit este n stdlib.h i process.h.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <process.h>
void main ()
{
float a,b,p;
puts ("Se citesc valori reale perechi ");
printf ("Dati valoari pentru a si b separate prin spatiu\t");
if (scanf ("%f %f",&a,&b)!=2)
{
puts ("una sau ambele valori diferite de valori reale");
exit (1); apelarea funciei exit cu parametrul 1 pentru o
terminare anormal ( eroare de citire a uneia sau
ambele valori)
}
else
p=a*b;
printf ("Produsul scalar a*b= %.3f \n",p);
puts ("Apasa o tasta ");
getch ();
exit (0); apelarea funciei exit cu parametrul 0 pentru o
terminare normal
}
3.5.10. Instruciunea switch.
Instruciunea switch este folosit la realizarea structurilor selective, n locul
instruciunilor if imbricate. Instruciunea switch poate fi utilizat la realizarea
meniurilor, alegerea de opiuni, i are forma :
switch (expresie)
{
case c1:
LIMBAJUL C TEORIE I APLICAI I 80
instructiuni 1
break;
case c2:
instructiuni 2
break;
case c3:
instructiuni 3
break;
case cn:
instructiuni n
break;

case default:
instructiuni
break;
}
unde c1, c2, c3, , cn sunt constante; instructiuni1, instructiuni2, , instructiuni n
sunt grupuri de instruciuni.
Execuia instruciunii switch se face astfel :
Se evalueaz expresia dintre paranteze i se compar valoarea expresiei cu
valorile constantelor c1, c2, , cn.
Se execut grupul de instructiuni de dup constanta ci a crei valoare este egal cu
valoarea expresiei, apoi se iese din instruciunea switch.
Dac valoarea expresiei nu este egal cu nici o constant c1, c2, , cn se va
executa grupul de instructiuni de dupa eticheta default. Dac eticheta default i
instruciunile de dup ea lipsesc i valoarea expresiei este diferit de oricare dintre
constante, se iese din instruciunea switch.
Observaie
Din instruciunea switch poate lipsi eticheta default i instruciunea ataat lui
default, dar trebuie s existe minim o constant ci.
Instruciunea break este utilizat dup fiecare grup de instruciuni ataate
constantelor cu rolul de ieire din instruciunea switch.
Exemplu
S se creeze un program C care prin alegerea unei opiuni dintr-un meniu s
execute diferite operaii asupra datelor de intrare a, b i s tipreasc valorile
calculelor efectuate. Opiunile se indic prin valori numerice.
Rezolvare
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main ()
{
int n;
float a,b,c,d,e,f;
puts ("------------ MENIU--------- ");
LIMBAJUL C TEORIE I APLICAI I 81
puts ("----ADUNARE====1 ----");
puts ("----SCADERE====2 ----");
puts ("----INMULTIRE==3 ----");
puts ("----IMPARTIRE==4 ----");
puts ("----RADICAL====5 ----");
puts ("----IESIRE=====6 ----");
puts ("====dati valoarea optiunii===== ");
scanf ("%d",&n); se citete opiunea aleas de utilizator
if (n!=6) dac opiunea este mai mic de 6 se execut programul
{
puts ("dati doua numere");
scanf ("%f %f",&a,&b); se citesc dou valori de tip real (float)
switch (n) se evalueaz expresia dintre ( ) i valoarea acestei
expresii transfer execuia la constanta ce are
valoarea egal cu valoarea expresiei , de exemplu
dac n=2 se transfer execuia la case 2
{
case 1: dac valoarea lui n=1 transferul execuiei se face
la case 1
c=a+b; instruciunea 1 din grupul de instruciuni ale lui
case 1
printf("Suma=%f",c); instruciunea 2 din grupul de instruciuni ale lui
case 1
break; foreaz ieirea din instruciunea switch
case 2: dac valoarea lui n=2 transferul execuiei se face
la case 2
c=a-b;
printf ("Diferenta=%f",c);
break;
case 3: dac valoarea lui n=3 transferul execuiei se face
la case 3
c=a*b;
printf ("Produs=%f",c);
break;
case 4: dac valoarea lui n=4 transferul execuiei se face
la case 4
c=a/b;
printf ("Impartire=%f",c);
break;
case 5: dac valoarea lui n=5 transferul execuiei se face
la case 5
c=sqrt(a*b);
printf ("Radical=%f",c);
break;
}
}
else
puts ("programul sa terminat");
puts ("apasati o tasta pentru iesirea din program");
LIMBAJUL C TEORIE I APLICAI I 82
getch ();
}
Probleme propuse
1. S se afieze zilele sptmnii n romn i englez n funcie de valoarea
numeric din domeniul 1 la 7.
Dat de intrare:o valoarea numeric
Dat de ieire: numele zilei
2. S se realizeze un program cu opiuni numerice care permite:
1. citirea unui vector i afiarea acestuia
2. citirea unui vector i nmulirea cu un scalar a acestui vector
3. citirea a doi vectori i adunarea acestora
4. citirea a doi vectori i scderea acestora
5. ieire.
3.5.11. Instruciunea goto.
Instruciunea goto se utilizeaz pentru a indica ieirea din mai multe instruciuni
if imbricate sau din mai multe instruciuni for i transferul execuiei la
instruciunea de dup eticheta indicat de instruciunea goto.
Eticheta este un nume urmat de caracterul : (dou puncte), numele reprezint
chiar denumirea etichetei. Etichetele se folosesc n interiorul corpului funciei n
care este apelat instruciunea goto . Sintaxa instruciunii goto este :
goto nume;

nume:

Instruciunea goto poate face salt numai la o etichet urmat de o instruciune ce


se afl n corpul funciei din care face parte i ea.
Exemplu
S se calculeze funcia f(x) =4x/(x-2), pentru 5 valori cresctoare ale lui x cu 1,
valoarea lui x este citit de la tastatur, dac valoarea expresiei x-2=0, se va iei
din ciclul for i se va afia mesajul divizare prin zero.
Rezolvare
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main ()
{
int i,s;
float n,j,x,fx;
puts ("se determina f(x)=(4x)/(x-2) daca x-2 nu este egal cu zero");
puts ("dati valoarea de inceput a lui x ");
scanf ("%f",&x);
for (j=x;j<=x+5;j++)
{
if (j-2 == 0)
LIMBAJUL C TEORIE I APLICAI I 83
goto eroare; salt la instruciunea de dup eticheta eroare
else
fx=(4*j)/(j-2);
printf ("x= %f functia fx=%g \n",x,fx);
}
goto sfirsit; salt la instruciunea de dup eticheta sfirsit
eroare: eticheta eroare
puts ("divizare prin zero");
sfirsit: eticheta sfirsit
puts ("Apasa o tasta");
getch ();
}
3.6. Apelul prin valoare i apelul prin referin al unei funcii.
O funcie are urmtoarea structur :
Tip_de_data Nume(Lista declaratiilor parametrilor formali)
{
Declaratii;
Instructiuni;
}
La apelul unei funcii, fiecrui parametru formal i se atribuie valoarea
parametrului efectiv corespunztor i n acest caz se consider c apelul funciei
se face prin valoare.
Funcia n acest caz nu va modifica valoarea parametrului efectiv.
Dac se dorete ca funcia apelat s modifice valoarea parametrului efectiv se va
folosi apelul prin referin ce se realizeaz prin folosirea ca parametru efectiv
numele unui tablou iar dac parametrul efectiv este o variabil simpl se vor folosi
pointeri. De exemplu:
int n, j, a[10];

Functia1 (n, j, a);

La apelarea funciei Functia1 parametri efectivi n i j sunt de tipul parametri


apelai prin valoare, Functia1 nu poate modifica valoarea acestora, dar parametrul
a este de tip tablou i n acest caz apelul parametrului se face prin referin, ce
permite funciei Functia1 s modifice valoarea termenilor tabloului a[10].
3.7. Operaii asupra vectorilor.
n majoritatea problemelor tehnice de prelucrare a datelor de intrare, ieire
(presiune, temperatur, debit, viteze, mase, caracteristici geometrice, etc.) este
necesar dispunerea lor n tablouri cu una sau dou dimensiuni.
Pentru citirea, prelucrarea, afiarea acestor tablouri se vor realiza funcii specifice
operaiei dorite de tip :
Citirea unui vector.
Operaii asupra unuia sau mai multor vectori.
LIMBAJUL C TEORIE I APLICAI I 84
Afiarea unui vector.
Citirea unui tablou cu dou dimensiuni (matrice).
Operaii asupra unuia sau mai multor tablouri cu dou dimensiuni.
Afiarea unui tablou cu dou dimensiuni.
Pentru nelegerea algoritmului se vor folosi dou variante astfel : Prima va folosi
toate instruciunile necesare ntr-un singur fiier surs, a doua va folosi funcii
specifice scrise n fiiere separate de fiierul surs.
Exemplu
S se scrie un program care citete termenii unui vector, afieaz termenii
vectorului. Citirea mrimii vectorului ct i a termenilor vectorului se efectueaz
de la tastatur.
Rezolvare
#include <conio.h>
#include <stdio.h>
#include <math.h>
main( )
{
int n,i; variabila n pentru mrimea vectorului, variabila i
pentru contor
double a[10]; variabila indexat a unui tablou cu o dimensiune
maxim de 10 termeni [10]
puts ("dati marimea vectorului n=?");
scanf ("%d",&n); citirea mrimii vectorului
Pentru a citi termenii unui vector se va folosi un ciclu for cu variabila de contor i de la
1 la n cu pasul 1, la fiecare pas se va afia denumirea termenului ce se citete i apoi se
citete data de intrare a crei valoare este depozitat la adresa variabilei indexate a[i]
for (i=1;i<=n;i=i+1) ciclul for de citire al vectorului a[i]
{ inceputul instruciunii compuse
printf("dati a[%d]=",i); mesaj de indicare a termenului ce se citete
scanf ("%lf",&a[i]); citirea datei de intrare de tip real (double )
care se atribuie termenului [i]
} sfritul instruciunii compuse i a ciclului
for
for (i=1;i<=n;i=i+1) ciclul for de afiare a vectorului a[i]
printf ("a[%d]=%lf\t",i,a[i]); apelarea funciei de afiare cu format a
variabilelor i, a[i] i la fiecare apelare a
funciei de afiare se deplaseaz poziia
cursorului cu un tabulator (spaiu de 8
caractere) \t
puts("apasa o tasta");
getch ();
}
Pentru rezolvarea aceleai probleme se pot folosi dou funcii citv i tipv, care au
avantajul c pot fi utilizate n toate fiierele care necesit operaii de citire sau de
afiare a unui vector. Funcia citv are doi parametrii formali : n de tip variabil
LIMBAJUL C TEORIE I APLICAI I 85
simpl i a[10] de tip variabil indexat, astfel, apelul parametrului n se face prin
valoare iar apelul parametrului a[10] se face prin referin.
Fisier: citv.c
citv (int n, double a[30]) antetul funciei citv, ce conine tipul funciei prin
lips ntreg, denumirea funciei citv, parametrii formali ai funciei n de tip ntreg
i a[10] (tabloul) de tip double
{ nceputul corpului funciei citv
int i; variabil local de tip ntreg folosit n cadrul
funciei citv
double t; variabil local de tip double folosit n cadrul
funciei citv
for (i=1;i<=n;i++) ciclul for pentru citirea datelor de la tastatur i
transferarea acestora n tabloul a[10]
{
printf ("Dati elementul %d =",i);
scanf ("%lf",&t);
a[i]=t;
} nchiderea ciclului for
puts ("S-a citit vectorul");
} nchiderea corpului funciei citv
Pentru afiarea elementelor unui vector s-a realizat funcia tipv astfel:
Fisier tipv.c
tipv (int n, double a[30]) antetul funciei tipv, ce conine tipul de dat al
funciei prin lips ntreg, denumirea funciei tipv,
parametri formali ai funciei : n de tip ntreg i
a[10] tablou de tip double
{ nceputul corpului funciei tipv
int i; variabil local de tip ntreg folosit n cadrul funciei tipv
for (i=1;i<=n;i++) ciclul for pentru afiarea vectorului a[i]
printf (" %lf\t ",a[i]);
puts ("\n");
} nchiderea corpului funciei tipv
n fiierul de mai jos se prezint folosirea funciilor citv i tipv salvate n dou fiiere
citv.c i tipv.c.
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include citv.c includerea fiierului citv.c care conine funcia
citv creat anterior de ctre utilizator
#include tipv.c includerea fiierului tipv.c care conine funcia
tipv creat anterior de ctre utilizator
void main ()
{
LIMBAJUL C TEORIE I APLICAI I 86
int n;
double b[10]; variabila indexat a unui tablou cu dimensiunea
maxim de 10 termeni [10]
puts ("dati marimea vectorului n=?");
scanf ("%d",&n); citirea mrimii vectorului
citv (n, b); apelarea funciei de citire a unui vector, parametrii
efectivi sunt n i b, ce sunt transferai funciei, la
revenirea din funcia citv n parametrul b de tip
tablou prin referin se gsesc termenii citii ai
vectorului a n funcia citv.
tipv (n,b); apelarea funciei de afiare a unui vector,
parametrii efectivi sunt n i vectorul b.
puts("apasa o tasta");
getch ();
}
Observaie
Fiierul surs este mult mai scurt dect fiierul ce efectueaz operaiile de citire,
afiare, n interiorul fiierului. n plus, funciile apelate pot fi utilizate de toi
utilizatorii care includ fiierele ce conin funciile dorite. n exemplele ce urmeaz
se vor folosi funcii specifice operaiilor dorite, astfel programele vor conine ct
mai multe apelri de funcii.
Exemplu
S se adune termenii unui vector i s se afieze vectorul precum i suma
termenilor. Mrimea vectorului, termenii vectorului se citesc de la tastatur.
Rezolvare
Se va crea o funcie sumv care adun termenii unui vector. Funcia sumv va fi
salvat n fiierul sumv.c. Pentru citirea termenilor vectorului i afiarea
vectorului se vor folosi funciile citv, tipv.
Fiierul sumv.c ce conine funcia sumv este
float sumv (int n, double a[10]) antetul funciei sumv, ce conine tipul
float al funciei, denumirea funciei
sumv, parametrii formali ai funciei : n
de tip ntreg i a[10] tablou de tip
double
{ nceputul corpului funciei sumv
int i; variabil local de tip ntreg
double s; variabil local de tip double folosit n
cadrul funciei sumv
s=0; iniializarea sumei cu valoarea zero
for (i=1;i<=n;i++) ciclul for pentru calculul sumei
termenilor vectorului
s=s+a[i];
return (s); instruciunea de returnare a valorii lui s
n funcia din care a fost apelat funcia
sumv
LIMBAJUL C TEORIE I APLICAI I 87
} nchiderea corpului funciei sumv
Fiierul surs al programului principal va fi
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include citv.c includerea fiierului citv.c care conine funcia
citv
#include tipv.c includerea fiierului tipv.c care conine funcia
tipv
#include sumv.c includerea fiierului sumv.c care conine funcia
sumv
void main ()
{
int n;
double b[10], s; variabila indexat a unui tablou cu dimensiunea
maxim de 10 termeni [10] i variabila simpl s
n care se va depozita valoarea sumei termenilor
vectorului
puts ("dati marimea vectorului n=?");
scanf ("%d",&n);
citv (n,b) ; apelarea funciei de citire a unui vector
s= sumv (n,b); apelarea funciei sumv care returneaz o valoare
de tip float, pe care o atribuie variabilei s
tipv (n,b); apelarea funciei de afiare a unui vector
printf (suma termenilor vectorului =%lf \n,s);
puts("apasa o tasta");
getch ();
}
Exemplu
S se determine numrul de zile cu temperaturile sub zero, numrul de zile cu
temperatura de zero grade i numrul de zile cu temperatura peste zero grade.
Temperaturile zilelor sunt citite pe un interval de maxim 30 zile, introducerea
datelor fcndu-se de la tastatur.
Rezolvare
Fiierul surs al programului principal
#include <conio.h>
#include <stdio.h>
#include citv.c includerea fiierului citv.c care conine funcia
citv
void main ()
{
int n, i;
double b[30];
int poz, neg, nul;
puts ("dati numarul de zile pt. care s-a citit temperatura n=?");
scanf ("%d",&n);
poz=0;
LIMBAJUL C TEORIE I APLICAI I 88
nul=0;
neg=0;
puts ("dati temperatura zilelor \n");
citv (n,b) ; apelarea funciei de citire a unui vector citv
for (i=1;i<=n;i++)
if (b[i][j]<0)
neg=neg+1;
else
if(b[i][j]==0)
nul=nul+1;
else
poz=poz+1;
printf ("zile cu temperaturi pozitive= %d\n",poz);
printf ("zile cu temperaturi negative= %d\n",neg);
printf ("zile cu temperatura de zero = %d\n",nul);
puts ("\n apasa o tasta");
getch ();
}
Pentru problema anterioar se poate efectua o funcie general care poate
determina numrul de termeni negativi, nuli i pozitivi dintr-un vector citit.
Avnd n vedere c o funcie poate returna o singur valoare iar n acest caz este
necesar returnarea a 3 valori, se va folosi un tablou c[3] cu 3 termeni. Funcia care
face acest lucru este numtermv i va fi salvat n fiierul numtermv.c.
numtermv ( int n, double a[30], double c[3])
{
int poz,neg,nul, i; declarare de variabile locale utilizate de funcie
poz=0; iniializarea cu valoarea 0 a variabilelor folosite ca
i contor
nul=0;
neg=0;
for (i=1;i<=n;i++) ciclul for de parcurgere a tuturor termenilor
vectorului
if (a[i][j]<0) determinarea termenilor negativi
neg=neg+1; adugarea unei uniti la contorul neg
else
if(a[i][j]==0) determinarea termenilor nuli
nul=nul+1; adugarea unei uniti la contorul nul
else
poz=poz+1; adugarea unei uniti la contorul poz
c[0]=poz; transferul valorilor contoarelor n vectorul c
c[1]=nul;
c[2]=neg;
} nchiderea corpului funciei
Fiierul surs ce include funcia numtermv va fi.
#include <conio.h>
#include <stdio.h>
#include citv.c includerea fiierului citv.c care conine funcia
citv
LIMBAJUL C TEORIE I APLICAI I 89
#include numtermv.c includerea fiierului numtermv.c care conine
funcia numtermv ce determin termenii pozitivi,
nuli, negativi dintr-un vector
void main ()
{
int n, i,c[3];
double b[30];
puts ("dati numarul de zile pt. care s-a citit temperatura n=? ");
scanf ("%d",&n);
puts ("dati temperatura zilelor \n");
citv (n,b) ; apelarea funciei de citire a unui vector
numtermv (n,b,c); apelarea funciei de determinare a termenilor poz,
nuli, neg.
printf ("zile cu temperaturi pozitive= %d\n",c[0] );
printf ("zile cu temperaturi negative= %d\n",c[2] );
printf ("zile cu temperatura de zero = %d\n",c[1] );
puts ("\n apasa o tasta");
getch ();
}
Exemplu
S se determine valoarea minim a presiunii apei n circuitul de alimentare cu ap
al oraului. Valoarea presiunii este dat din or n or pe durata a 24 ore.
Pentru a determina valoarea minim a presiunii, se vor citi n cele 24 de ore, 24 de
valori ntr-un vector b i apoi se va apela funcia minv, care va returna valoarea
minim a presiunii apei din circuitul oraului. Dac valorile presiunii sunt
transferate automat printr-un sistem de achiziii de date intr-un fiier, datele vor fi
citite cu o funcie special din fiier, apoi se va aplica funcia minv asupra acestor
date.
Rezolvare
Algoritmul funciei minv cons n a alege o variabil local min, care iniial este
egal cu primul termen a vectorului ce se prelucreaz, apoi se compar aceast
variabil min pe rnd cu termenii vectorului. Dac min este mai mic dect
termenul analizat, valoarea variabilei min rmne nemodificat, dac valoarea
variabilei min este mai mare dect termenul analizat, variabilei min i se atribuie
valoarea acelui termen. Parcurgnd toi termenii vectorului, n final variabila min
va conine valoarea celui mai mic termen al vectorului. Funcia minv va fi salvat
n fiierul minv.c.
double minv(int n, double a[30]) antetul funciei minv ce are ca parametrii
formali: n =numrul de termeni ai vectorului
i a[30] vectorul ce preia termenii vectorului
citit n cadrul programului principal (transfer
LIMBAJUL C TEORIE I APLICAI I 90
prin referin). Funcia returneaz spre
funcia apelant o valoare de tip double.
{ nceputul corpului funciei minv,
int i; variabil local pentru ciclul for,
double min; variabil local folosit la prelucrarea termenilor
vectorului
min=a[1]; iniializarea lui min cu valoarea primului termen
al vectorului
for (i=1;i<=n;i=i+1) ciclul de comparare a lui min cu toti termeni
vectorului
if (min<=a[i]) condiia de control a valorii lui min.
; dac min este mai mic sau egal cu termenul
curent, valoarea lui min nu se modific
else
min=a[i]; atribuirea lui min a valorii termenului mai mic
dect min
return (min); returnarea valorii lui min spre funcia apelant
} nchiderea corpului funciei minv
Programul principal ce apeleaz funcia minv.
#include <conio.h>
#include <stdio.h>
#include citv.c includerea fiierului citv.c care conine funcia
citv
#include minv.c includerea fiierului minv.c care conine funcia
minv ce determin valoarea minim a termenilor
unui vector
void main ()
{
int n, b[30];
double min;
puts ("dati numarul de ore pt. care s-a citit presiunea n=?");
scanf ("%d",&n);
puts ("dati presiunea la ora indicata prin numarul elementului\n");
citv (n,b) ; apelarea funciei de citire a unui vector
min=minv (n,b); apelarea funciei de determinare a valorii minime
a termenilor.
printf ("presiunea minima n 24 ore= %lf\n", min);
puts ("\n apasa o tasta ");
getch ();
}
Exemplu
S se determine numrul de apariii ale unui numr din intervalul 1 la 45 la
tragerile loto din minim 2 extrageri. Numrul de numere asupra crora se face
studiul este maxim 100 i aceste numere sunt introduse de la tastatur. Numrul a
crui apariie se dorete, este cerut de funcia static1, iar citirea numerelor extrase
LIMBAJUL C TEORIE I APLICAI I 91
se face cu funcia citvint pentru numere ntregi. Funcia static1 va fi salvat n
fiierul static1.c.
int static1(int n, int b[100]) funcia de tip intreg cu doi parametrii de tip int
{ nceputul corpului funciei
int i,k, sta;
puts ("dati numarul cautat pt determinarea aparitiilor");
scanf ("%d",&sta);
k=0;
for (i=1;i<=n;i=i+1)
if (sta == b[i])
k=k+1;
else
;
return (k); funcia va returna valoarea ntreag a numrului
de apariii ale numrului cutat
}
Funcia citvint va fi salvat n fiierul citvint.c.
citvint (int n, int a[100])
{
int i;
for (i=1;i<=n;i++)
{
printf ("Dati elementul %d =",i);
scanf ("%d",&a[i]);
}
puts ("S-a citit vectorul");
}
Funcia sfirsit va fi salvat n fiierul sfirsit.c.
void sfirsit () funcia nu returneaz valoare i nu are parametrii.
{
puts ("\n Apasa o taasta");
getch ();
}
Programul principal statisc1 va fi salvat n fiierul statisc1.c care va apela
funciile de citire ale unui vector cu termeni ntregi, apoi va apela funcia de
determinare a apariiilor unei valori n cadrul vectorului, iar nchiderea
programului se face prin apelarea funciei sfirsit.
#include <conio.h>
#include <stdio.h>
#include "citvint.c"
#include "static1.c"
#include "sfirsit.c"
void main ()
{
int n,k, a[100];
puts ("dati marimea vectorului ( numarul de valori ) n=?");
scanf ("%d",&n);
LIMBAJUL C TEORIE I APLICAI I 92
citvint (n,a); apelarea funciei de citire a unui vector cu valori
intregi
k=static1 (n,a ); apelarea funciei de cutare a numrului de
apariii ale unei valori
printf ("numarul de aparitii este =%d\n",k);
sfirsit (); apelarea funciei sfirsit
}
Probleme propuse
Observaie: la rezolvarea problemelor propuse se vor folosi funciile deduse la
capitolele anterioare sau se vor realiza noi funcii de uz general.
1. S se citeasc un vector cu termenii de tip intreg i se
determine dac acest vector conine un numar dat i ce poziie ocup acest numr.
Date intrare: n=mrimea vectorului
Ai =termenii vectorului K=numrul cutat
Date ieire : poziia ocupat de numrul K
2. S se citeasc un vector cu termenii de tip intreg i s se ordoneze n sens
cresctor termenii vectorului.
Date de intrare : n, a
i
Date de ieire : b
i
vectorul cu termenii ordonai.
3. S se citeasc doi vectori cu mrimea n cu termenii de tip ntreg i s se
determine vectorul c
i
care conine termeni vectorului ai i termenii necomuni
dintre a
i
i b
i
.
Date de intrare: n=mrimea celor doi vectori a
i
, b
i
=termeni vectorilor ai, bi
Date de ieire : vectorul c
i
.
4. S se determine termenul cu valoare maxim dintr-un vector citit de la tastatur.
Date de intrare : n, a
i

Date de ieire : max (a
i
).
5. S se calculeze C=A
1
a
1
+A
2
a
2
+ A
m
a
m
.
Date de intrare : a
1
, a
2
, a
3
, , a
m
valori ale unor scalari citii de la tastatur
A
1
, A
2
, , A
n
vectori de tip double de mrime n citii de la tastatur
Valoarea m =numrul de vectori
Date de ieire : C =

m
i
ai Ai
1
6. S se compare valorile temperaturii de livrare a apei calde pe o perioad de 24
ore, (citirile temperaturii s-au fcut n fiecare or) i s se compare aceste
temperaturi cu o valoare limit inferioar dat de la tastatur. Dac valorile
temperaturilor citite sunt sub valoarea de temperatur limit, s se afieze aceste
valori i numrul lor.
Date de intrare : valorile temperaturii n 24 ore, valoarea temperaturii limit
LIMBAJUL C TEORIE I APLICAI I 93
Date de ieire : numrul de valori sub temperatura limit, i aceste valori.
7. S se citeasc ntr-un vector frecvena curentului trifazic din or n or i s se
determine dac aceast frecven este n afara domeniului de funcionare normal
dat de intervalul 49.9Hz la 50.1Hz.
Date de intrare : valoarea frecvenei i numrul de citiri.
Date de ieire : numrul de citiri din afara domeniului de funcionare normal.
8. S se compare doi vectori de mrimea n, de tip float i s se deduc vectorul c
care conine termenii egali din cei doi vectori.
Date de intrare : n, a
i
, b
i
Date de ieire : c
i
.
3.8. Operaii asupra tablourilor cu dou dimensiuni.
S se realizeze funcii pentru citirea unui tablou cu dou dimensiuni i afiarea
unui tablou cu dou dimensiuni. Valorile din tabloul citit sau afiat sunt de tip
double. Un tablou cu dou dimensiuni are termenii indexai cu doi coeficieni i i
j.
1
1
1
]
1

33 32 31
23 22 21
13 12 11
a a a
a a a
a a a

Pentru a accesa un termen al tabloului cu dou dimensiuni este necesar indicarea
liniei i coloanei termenului dorit, ceea ce implic folosirea a dou cicluri for care
s modifice valoarea independent a celor doi indici.
Funcia citm, care efectueaz citirea unui tablou bidimensional folosete dou
cicluri imbricate, ciclul exterior avnd variabila contor i, care parcurge rndurile
tabloului bidimensional, ciclul interior avnd variabila contor j, parcurge pentru
fiecare rnd, toate coloanele tabloului. S urmrim modul de incrementare al celor
doi contori. La nceput, variabila contor a ciclului exterior i va avea valoarea 1 i
se intr n ciclul interior, adic
i=1, j=1 se va citi termenul de pe primul rnd, prima coloan a
11
n continuare, se continu ciclul interior,
i=const =1, j crete cu o unitate j=j+1=2 se citete al doilea termen de pe prima
linie a
12

i=1, j=m se citete ultimul termen de pe prima linie a


1m
Se ncheie ciclul interior j i se crete cu o unitate variabila contor i. Se reia ciclul
interior, variabila contor j pornind de la 1, pentru a citi termenii de pe linia 2.
i=2, j=1 se citete a
21
i=2, j=2 se citete a
22

LIMBAJUL C TEORIE I APLICAI I 94


i=2, j=m se citete a
2m
Se reia ciclul exterior pn cnd se citesc toate elementele tabloului.
Pe acelai principiu se efectueaz tiprirea elementelor unui tablou cu dou
dimensiuni. Pentru a putea fi reutilizat, funcia citm va fi salvat n fiierul
citm.c
citm (int n, int m,double a[10][10]) funcia citm cu parametrii n, m, a
{ nceputul corpului funciei
int i,j; declararea variabilelor locale contor
double t; variabil necesar citiri valori de tip double
for (i=1;i<=n;i++) primul for ce parcurge liniile tabloului
for (j=1;j<=m;j++) al doilea for ce parcurge coloanele
{
printf ("Dati elementul %d %d=",i,j);
scanf ("%lf",&t);
a[i][j]=t;
}
puts ("S-a citit matricea");
}
Funcia tipm, care tiprete elementele tabloului, este salvat n fiierul tipm.c.
tipm (int n, int m, double a[][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
printf (" %lf\t ",a[i][j]);
puts ("\n");
}
Programul principal, care apeleaz funciile de citire i de tiprire a termenilor
unui tablou cu dou dimensiuni va fi
#include <conio.h>
#include <stdio.h>
#include "citm.c"
#include "sfirsit.c"
#include "tipm.c"
void main ()
{
int n,m
double a[10][10];
puts ("dati nr de linii n si nr de coloane m numere intregi");
scanf ("%d,%d",&n,&m);
citm (n,m,a); apelarea funciei pt citirea unui tablou cu dou
dimensiuni
tipm (n,m,a); apelarea funciei pt afiarea unui tablou cu dou
dimensiuni
sfirsit (); apelarea funciei pt terminarea programului
}
Exemplu
LIMBAJUL C TEORIE I APLICAI I 95
S se realizeze programul care adun dou matrici i apoi s se transforme
programul pentru a aduna mai multe matrici, fiecare matrice fiind nmulit cu un
scalar. Adic,
C=A+B etapa I
C=a
1
A
1
+a
2
A
2
+ a
n
A
n
etapa II
unde a
1
, a
2
, a
3
, ..a
n
sunt scalari, respectiv A
1
, A
2
, A
n
sunt tablouri cu dou
dimensiuni.
Funcia summ pentru adunarea a dou matrici va fi salvat n fiierul summ.c.
void summ (int l, int o, double d[10][10], double e[10][10],double f[10][10])
{
int i,j;
/*suma a doua matrici */
for (i=1;i<=l;i++)
for (j=1;j<=o;j++)
f[i][j]=d[i][j]+e[i][j]; termenul curent al matricei f este suma
termenilor celor dou matrici d i e
}
Programul principal pentru adunarea a dou matrici C=A+B va fi
#include <conio.h>
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "summ.c"
void main ()
{
int i,j,n,m;
double a[10][10],b[10][10],c[10][10];
puts ("dati marimea lui n =? si m = ? numere intregi");
scanf ("%d %d",&n,&m);
citm (n,m,a); apelarea funciei de citire a unui tablou cu dou
dimensiuni. n cazul tablourilor, variabila tablou a
este transmis prin referin
puts ("S-a citit tabloul a");
citm (n,m,b); apelarea funciei de citire a unui tablou cu dou
dimensiuni. n cazul tablourilor, variabila tablou b
este transmis prin referin
puts ("\t S-a citit tabloul b\n");
summ(n,m,a,b,c); efectuarea adunrii celor dou tablouri. Rezultatul
se va gsi n tabloul c.
tipm (n,m,c); afiarea tabloului rezultat prin suma celor dou
tablouri
sfirsit ( );
}
Pentru a rezolva etapa a II-a, programul care calculeaz expresia matriceal
C=a
1
A
1
+a
2
A
2
+ a
n
A
n
, vom defini o funcie care nmulete un tablou cu un
scalar.
LIMBAJUL C TEORIE I APLICAI I 96
Funcia scalarm, nmulete un tablou cu dou dimensiuni cu valoarea unui scalar
citit dintr-un vector ; n, m sunt parametrii transferai prin valoare ce indic
mrimea tabloului, k parametru ce indic numrul termenului vectorului cu care
se nmulete matricea. Tablourile v[], a[][], b[][] sunt parametrii transferai prin
referin. Tabloul b[][] va conine elementele tabloului a[][] nmulite cu scalar.
scalarm (int n, int m, int k, double v[10], double a[10][10],double b[10][10])
{
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
b[i][j]=a[i][j]*v[k]; operaia de nmulire cu un scalar a termenilor
unui tablou
}
Rezolvarea propriu zis a expresiei matriceale este fcut n programul principal, salvat
n fiierul matmul2.c.
#include <conio.h>
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "citv.c"
#include "summ.c"
#include "scalarm.c"
#include "sfirsit.c"
void main ()
{
int i,j,n,m, k;
double a[10][10],b[10][10],c[10][10], v[10];
puts ("dati marimea lui n =? si m = ? numere intregi");
scanf ("%d %d",&n,&m);
puts ("dati numarul de matrici ce se aduna k = ? ");
scanf ("%d",&k);
puts ("dati scalari a1, a2...an");
citv (k,v); citirea vectorului ce conine scalarii a
1
, a
2
, a
n
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
c[i][j]=0; iniializarea matricii c cu valoarea zero
for (i=1;i<=k;i++) la fiecare ciclu se efectueaz citirea,
nmulirea matricii A
k
cu un scalar i suma
matricilor
{
printf ("dati termenii matricei %d \n",i);
citm (n,m,a); citirea matricii A
k
scalarm (n, m, i, v, a, b); nmulirea matricii A
k
cu scalarul a
k
summ(n,m,c,b,c); adunarea matricii A
k
a
k
la matricea sum C
}
tipm (n,m,c); afiarea matricii C
sfirsit ( );
}
Exemplu
LIMBAJUL C TEORIE I APLICAI I 97
S se scrie programul C, ce nmulete dou matrici C=AB. nmulirea a dou matrici
are loc dac numrul de linii ale primei matrici este egal cu numrul de coloane ale
celei de-a doua matrici.
De exemplu, C=AB=
1
]
1

23 22 21
13 12 11
a a a
a a a

1
1
1
]
1

32 31
22 21
12 11
b b
b b
b b
=
1
]
1

22 21
12 11
c c
c c
.
Termenul de pe rndul 1, coloana 2 a matricii C se obine, nsumnd produsele
elementelor de pe rndul 1 al matricii A cu
elementele din coloana 2 a matricii B. Adica,
c
12
= a
11
b
12
+a
12
b
22
+ +a
1i
b
i2
+ +a
1n
b
n2
=

n
i
i i
b a
1
2 1
. Un termen oarecare al
matricii C, se va obine volosind expresia
c
ij
=

n
k
kj ik
b a
1
,
unde n reprezint numrul de coloane ale matricii A, sau linii ale matricii B.
Pentru calculul propriu zis al sumei n C, vom avea nevoie de trei cicluri ; un ciclu
exterior care parcurge numrul de rnduri ale matricii C, un ciclu interior care
parcurge coloanele matricii C, respectiv un ciclu care efectueaz suma produselor
folosind relaia de mai sus.
Funcia prodmat care calculeaz produsul a dou matrici este salvat n fiierul
prodmat.c. Dac matricea din stnga, A, are dimensiunea m n, matricea din
dreapta B, n p, matricea rezultat C, va avea dimensiunea m p.
prodmat(int m, int n, int p, int a[10][10], int b[10][10], int c[10][10])
{
int i,j,k;
for (i=1; i<=m; i++)
for (j=1; j<=p; j++)
{
c[i][j]=0; iniializarea termenilor matricii rezultate cu
valoarea 0
for (k=1; k<=n; k++) ciclul necesar pentru calculul sumei
produselor a
ik
b
kj
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
} nchiderea corpului funciei prodmat
Programul principal, care apeleaz funcia prodmat, este salvat n fiierul
prodmat1.c
#include <conio.h>
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "prodmat.c"
void main ()
LIMBAJUL C TEORIE I APLICAI I 98
{
int i,j,n,m,p;
double a[10][10],b[10][10],c[10][10];
puts ("dati marimea lui m, n si p numere intregi");
scanf ("%d %d %d", &m, &n, &p);
citm (m,n,a); se citete matricea A de dimensiune m n
puts ("S-a citit tabloul a\n");
citm (n,p,b); se citete matricea B de dimensiune n p
puts ("S-a citit tabloul b\n");
prodmat(m,n,p,a,b,c); se calculeaz matricea C=AB
tipm (m,p,c); se tiprete matricea C de dimensiune m p
sfirsit ( );
}
Exemplu
S se realizeze un program care s adune termenii de deasupra diagonalei
principale i de pe diagonala principal, a unui tablou cu dou dimensiuni.
Rezolvare
Pentru a parcurge doar termenii de deasupra diagonalei principale, ciclul exterior
va parcurge toate rndurile matricii, ncepnd cu rndul 1, pe cnd ciclul interior
va parcurge coloanele matricii ncepnd de la coloana j=i. Funcia care adun
termenii de deasupra diagonalei principale, inclusiv diagonala principal are
numele sumsup i va fi salvat n fiierul sumsup.c. Putem vorbi de diagonal
principal doar n cazul matricilor ptratice, adic de dimensiune n n.
double sumsup (int n, double a[10][10])
{
int i, j;
double s;
s=0; iniializarea sumei cu 0
/*se aduna termenii de deasupra si diagonala principala*/
for (i=1; i<=n; i++)
for (j=i; j<=n; j++) ciclul care parcurge coloanele matricii a
s=s+a[i][j]; calcului sumei termenilor
return (s); returnarea sumei spre funcia apelant
}
Pentru a se verifica dac algoritmul folosit este corect, se vor afia termenii de pe
diagonala principal i de deasupra diagonalei
principale, folosind funcia tipsupm. Funcia
tipsupm va fi salvat n fiierul tipsupm.c.
tipsupm (int n, double a[10][10])
{
int i,j;
/*se afiseaza termenii de deasupra si de pe diagonala principala*/
for (i=1; i<=n; i++)
{
puts ("\n");
for (j=i; j<=n; j++)
printf ("%lf\t",a[i][j]);
}
LIMBAJUL C TEORIE I APLICAI I 99
}
Exemplu
S se scrie o funcie care afieaz termenii de sub diagonala principal a unei
matrici ptratice.
Rezolvare
Algoritmul folosit se bazeaz pe observaia prezentat n exemplul precedent ; un
ciclu exterior care parcurge rndurile matricii, respectiv un ciclu interior care
parcurge coloanele matricii ncepnd cu prima coloan, pn la coloana de pe
diagonala principal, adic j=i. Funcia care afieaz termenii de sub diagonala
principal a unei matrici ptratice se numete tipinfm i va fi salvat n fiierul
tipinfm.c.
tipinfm(int n, double a[10][10])
{
int i, j;
/*se afiseaza termeni de sub diagonala principala*/
for (i=1; i<=n; i++)
{
puts("\n");
for(j=1; j<=i; j++) ciclul care parcurge coloanele matricii a
printf("%lf\t",a[i][j]);
}
}
Exemplu
Vom ncerca s punem toate funciile prezentate mai sus ntr-un program
principal. Programul va calcula suma termenilor unei matrici ptratice, situai
deasupra diagonalei principale, inclusiv elementele de pe diagonal, afiarea
termenilor care se adun, precum i termenii de sub diagonala principal. Citirea
mrimii matricii, valoarea termenilor ei se va face de la tastatur, pentru citirea
termenilor se va apela funcia citm.
Rezolvare
#include <conio.h>
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "sumsup.c"
#include "tipsupm.c"
#include "tipinfm.c"
#include "sfirsit.c"
void main ()
{
int i,j,n;
double a[10][10], s;
puts ("dati marimea matricii patratice n =? numar intreg");
scanf("%d",&n);
/*citirea matricii [a]*/
citm (n,n,a);
puts ("S-a citit matricea [a]");
s=sumsup(n,a);
tipsupm (n,a);
LIMBAJUL C TEORIE I APLICAI I 100
printf (suma termenilor deasupra diagonalei principale =%lf ,s);
tipinfm (n,a);
tipm (n,n,a);
sfirsit ( );
}
Probleme propuse
1. S se adune termenii de pe linia k a unei matrici A de dimensiune n m.
Date de intrare : dimensiunea matricii n, m , termenii matricii i numrul liniei k.
Date de ieire : s=

m
j
kj
a
1
2. S se adune termenii de pe coloana k a unei matrici A de dimensiune n m.
Date de intrare : dimensiunea matricii n, m , termenii matricii i numrul coloanei
k.
Date de ieire : s=

n
i
ik
a
1

3. S se compare dou matrici de dimensiune n m i s se deduc vectorul c care
conine termenii cu valoare egal din cele dou matrici .
Date de intrare : n, m, a
ij
, b
ij
Date de ieire : c
i
4. S se citeasc o matrice A de dimensiune n n i s se evalueze urmtoarea
expresie matriceal B=A+I, unde I este matricea unitate.
Date de intrare : n, A.
Date de ieire : B
5. S se adune termenii pozitivi de sub diagonala secundar a matricii A de
dimensiune n n.
Date de intrare : n, A
Date ieire : s=suma termenilor de sub diagonala secundar.
6. S se determine numrul termenilor pozitivi, negativi, nuli i s se calculeze
sumele acestor termeni, din matricea A citit de la tastatur.
Date de intrare : n, m dimensiunea matricii; A
Date de ieire : numrul termenilor pozitivi, negativi, nuli, suma termenilor
pozitivi, suma termenilor negativi.
3.9. Funcii de bibliotec.
Limbajul C a fost realizat ca un limbaj cu un set relativ redus de comenzi, pentru a
avea o vitez de execuie i flexibilitate mare. Astfel limbajul C nu are ncorporat
faciliti de prelocrare i citire direct a irurilor de caractere, mulimilor,
tablourilor. Pentru prelucrarea datelor de tip ir de caractere se folosesc tablouri
de caractere sau pointeri la caracter. Limbajul C nu are instruciuni de citire,
tiprire (operaii de intrare ieire) a datelor, nu are instruciuni de acces la fiiere.
LIMBAJUL C TEORIE I APLICAI I 101
Pentru aceste operaii limbajul C ofer o colecie de funcii standard de bibliotec.
n continuare se vor prezenta funciile de bibliotec cele mai folosite n cadrul
programelor.
3.9.1. Funcii de intrare ieire.
Aceste funcii sunt :
getch , gets, scanf pentru citirea datelor
putch, puts, printf pentru tiprirea datelor.
Funciile de intrare/ieire au prototipul n fiierele antet stdio.h i conio.h., i au
fost detaliate n capitolul 5.5.
3.9.2. Funcii matematice.
Funciile matematice au prototipul n fiierul antet math.h. n tabelul de mai jos
este prezentat o list exhaustiv a funciilor matematice ; prototipul lor precum i
efectul fiecrei funcii n parte.
Prototipul funciei Efectul funciei
double acos (double x)
arccosinus de x
double asin (double x)
arcsinus de x
double atan (double x)
arctangenta de x
double atan2(double y, double x)
arctangenta de y/x
double ceil (double x)
cel mai mic ntreg mai mare sau egal cu x
double cos (double x)
cosinus de x (x exprimat n radiani )
double exp (double x)
valoarea lui e
x
double fabs (double x)
valoarea absolut a lui x
double floor (double x)
cel mai mare ntreg mai mic sau egal cu x
double log (double x)
ln de x
double log10 (double x)
lg de x
double pow (double x, double y)
x la puterea y
double sin (double x)
sinus de x (x exprimat n radiani )
double sqrt (double x)
Radicalul de ordinul 2 a lui x
double tan (double x)
tangenta lui x (x exprimat n radiani )
double sinh (double x)
sh x
double coshn (double x)
ch x
double tanh (double x)
th x
double fmod (double x, double y)
Returneaz restul operaiei x/y
double modf (double n,double *i)
Descompune n n parte intreag i
fracionar, returneaz partea fracional, iar
partea ntreag n i
double frexp (double n, int*exp)
Descompune n n mantis 0,5 la 1 i
exponentul lui 2, astfel n=mantisa*2^exp
double ldexp (double n, int exp)
Returneaz valoarea lui n*2^exp
Tot n fiierul math.h sunt urmtoarele funcii :
LIMBAJUL C TEORIE I APLICAI I 102
double cabs (struct complex z); returneaz modulul numrului complex z
double poly (double x, int n, double c[]); returneaz valoarea polinomului n x de grad
n, coeficienii sunt situai n tabelul c n urmtoarea ordine :
c[0] = coeficientul termenului liber
c[1] = coeficientul lui x
1
c[n] = coeficientul lui x
n

n fiierul stdlib.h sunt declarate urmtoarele funcii :
int abs(int x) returneaz valoarea absolut a lui x de tip ntreg
long labs(long x) returneaz valoarea absolut a lui x de tip long
int rand(void) returneaz un numr natural aleator mai mic de 32768
int random(int n) returneaz un numr natural aleator mai mic dect n.
3.9.3. Funcii de uz general.
void clrscr(void) terge tot ecranul (clear screen)
int kbhit(void) returneaz o valoare diferit de zero dac exist un caracter
disponibil de la tastatur, sau returneaz valoarea zero n caz contrar.
n fiierul dos.h sunt declarate funciile pentru oprirea execuiei programului pe o
durat stabilit, respectiv funcii de producere de sunete cu frecvena dorit.
void delay(unsigned i) suspend execuia programulu pentru o durat de i
milisecunde
void sleep(unsigned n) suspend execuia programulu pentru o durat de n
secunde
void sound(unsigned h) trimite spre difuzorul calculatorului un sunet cu
frecvena =h
void nosound(void) oprete sunetul trimis de sound la difuzor.
char *ctime (const time_t *t)funcia returneaz un pointer ctre irul ce cuprinde
zi, luna, data, ora, minute, secunde, anul.
time_t time (time_t *timp) funcia time returneaz ora curent a sistemului, dac
sistemul nu poate returna ora curent, funcia va returna valoarea 1
struct tm *localtime (const time_t*timp) funcia localtime returneaz un
pointer ctre variabila timp de forma unei structuri de tip tm
char *asctime (const struct tm *p) funcia asctime convertete informaia din
structura indicat de pointerul p intr-un ir de forma: zi, luna, data, ora, minute,
secunde, anul i returneaz un pointer ctre irul convertit.
Double diftime (time_t t2, time_t1) funcia diftime returneaz diferena de timp
dintre t2 i t1 exprimat n secunde.
Funciile pentru gestionarea timpului sunt disponibile n time.h.
Exemplu.
S se determine timpul n secunde necesar pentru a parcurge ciclul for i s se
afieze timpul loca i timpul universal.
#include <stdio.h>
#include <conio.h>
#include <time.h>
void main ()
LIMBAJUL C TEORIE I APLICAI I 103
{
struct tm *local,*g; declarare de structuri de tip tm ce memoreaz data
i ora descompuse n elementele lor constitutive :
secunde, minute, ore, ziua, luna, an.
double dt,i;
time_t t,t1,t2; declararea de dat de tip long integer pentru dat
calendaristic
t=time (NULL); returnarea orei curente calendaristice a sistemului
local =localtime (&t); returneaz ctre pointerul local n forma unei
structuri de tip tm a timpului local generat de
apelul funciei time
t1=time (NULL);
for (i=0;i<=30000;i++)
t2=time (NULL);
dt=difftime (t2, t1); funcia difftime calculeaz diferena de timp
dintre t2 i t1 exprimat n secunde
printf ("Data si ora este %s\n",asctime (local)); convertirea datei din structura
local ntr-un ir de caractere de forma zi, luna,
data, ora, minute, secunde,an, pentru a putea fi
afiat
g=gmtime (&t); funcia gmtime returneaz la pointerul g a
timpului reprezentat ca timp cordonat universal
printf ("Data si ora universal %s\n",asctime (g));
printf ("durata ciclului for in secunde =%lf\n",dt);
puts ("\n Apasa o tasta ");
getch ();
}
div_t div (int numarator, int numitor) funcia div returneaz ctul i restul
mpririi numrtor/numitor ntr-o structur de
tipul div_t, structura div_t conine dou valori de
tip ntreg cu denumirile :
qout= ctul , rem =restul.
ldiv_t ldiv (long numarator, long numitor) funcia div returneaz ctul i restul
mpririi numrtor/numitor ntr-o structur de
tipul ldiv_t, structura ldiv_t conine dou valori de
tip long cu denumirile :
qout= ctul , rem =restul.
void srand (unsigned i) funcia srand stabilete punctul de nceput = i
pentru secvena generat de rand (), ca valoare a
lui i se poate folosi valoarea returnat de funcia
time (NULL), care este continu modificat de
ceasul sistemului.
LIMBAJUL C TEORIE I APLICAI I 104
int system (const char *sir) funcia system () transfer coninutul irului sir ca
instruciune de tip comand pentru sistemul de
operare.
#include <stdlib.h>
void main ()
{
system (dir c:\tempc); are ca efect afiarea coninutului directorului
TEMPC de pe discul C.
}
Pentru apelarea funciilor div (), ldiv (), srand () i system () se va include
fiierul stdlib.h.
Exemplu.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
void main ()
{
div_t n;
double dt,i;
int tt,tt1;
long t,t1,t2;
t=time (NULL);
for (i=0;i<30000;i++);
t1=time (NULL);
system ("dir /p c:\\tempc"); apelarea comenzi dir din sistemul de operare cu
parametri indicai de irul dintre
tt=(unsigned) t/2; conversia datei t de tip long in dat de tip int fr
semn
tt1=23400;
n=div (tt1,tt); detrminarea ctului i restului dintre tt1/tt
printf ("%d %d citul=%d restul=%d \n",tt1, tt,n.quot, n.rem);
afiarea celor dou numere i apoi ctul i restul
ca valori ale structuri n de tip div_t
srand (tt); funcia srand va livra o valoare pentru secvena de
numere aleatoare date de funcia rand ()
printf ("punct de inceput =%d numele aleator rezultat= %d\n",tt,rand ());
puts ("\n Apasa o tasta ");
getch ();
}
LIMBAJUL C TEORIE I APLICAI I 105
3.9.4. Funcii de conversie.
Funcia atoi convertete intregul zecimal definit de irul de caractere sir i
returneaz valoarea acestui ntreg.
Prototipul funciei atoi este :
int atoi (const char *sir);
Exemplu.
#include <stdio.h>
#include <conio.h>
void main ()
{
char st [10] ;
int i ;
gets (st) ;
i= atoi (st) ;
printf (s-a convertit sirul de caractere numerice in valoarea de tip intreg %d ,i);
}
Dac se tasteaz irul de caractere 123 n urma conversiei se va afia ntregul cu
valoarea 123.
Funcia atol convertete n ntreg zecimal de tip long int, irul de caractere sir i
returneaz valoarea acestui ntreg.
Prototipul funciei atol este :
int atol (const char *sir);
Exemplu.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
char sir1 [15] , sir2 [15];
long int a ;
puts ("Se converteste sirul de caractere format din cifre in int long");
puts ("dati primul sir de caractere format din cifre");
scanf ("%s",sir1);
puts ("dati al doilea sir de caractere format din cifre");
scanf ("%s",sir2);
a=atol (sir1)+ atol (sir2) ;
printf ("suma celor doua siruri convertite = %ld", a);
puts ("\n Apasa o tasta ");
getch ();
LIMBAJUL C TEORIE I APLICAI I 106
}
Funcia itoa convertete valoarea binar de tip ntreg n ntreg cu baza de
numeraie definit de baza i pstreaz rezultatul conversiei sub form de ir de
caractere.
Prototipul funciei itoa este :
char* itoa (int valoare, char *ir, int baza) ;
valoare = este valoarea binar de tip intreg ce se convertete
ir = este pointerul spre zona n care se pstreaz rezultatul conversiei
baza =baza de numeraie pentru ntregul rezultat n urma convertiri.
Exemplu.
S se converteasc o valoare ntreag < 26000 ntr-un ir de caractere, folosind ca
baz de conversie sistemul octal (8) .
Valoarea ntregului se introduce de la tastatur.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
char sir [15]; irul de caractere n care se va pstra rezultatul
conversiei
int a ;
puts ("dati un numar in baza 10");
scanf ("%d",&a);
puts ("se converteste intregul in sir de caractere echivalent in baza 8 ");
itoa (a,sir,8) ; apelarea funciei de conversie itoa, care
convertete valoarea ntreag a in valoare octal
(8) i depoziteaz valoare convertit n irul de
caractere sir
printf ("sirul rezultat in urma conversiei = %s", sir);
puts ("\n Apasa o tasta ");
getch ();
}
Exemplu.
S se converteasc o valoare ntreag < 26000 ntr-un ir de caractere, folosind ca
baz de conversie o valoare ntreag ntre 2 i 16.
Valoarea ntregului ce se convertete, ct i valoarea bazei de conversie se
introduc de la tastatur.
LIMBAJUL C TEORIE I APLICAI I 107
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
char sir [15];
int a,b ;
puts ("dati un numar in baza 10");
scanf ("%d",&a);
puts ("dati valoarea bazei de conversie 2,3,4,5,6,7,8,16");
scanf ("%d",&b);
printf ("se converteste intregul in sir de caractere echivalent in baza %d ",b);
itoa (a,sir,b) ;
printf ("sirul rezultat in urma conversiei = %s", sir);
puts ("\n Apasa o tasta ");
getch ();
}
Funcia ltoa convertete valoarea binar de tip long int n ntreg cu baza de
numeraie definit de baza i pstreaz rezultatul conversiei sub form de ir de
caractere.
Prototipul funciei ltoa este :
char* ltoa (long int valoare, char *ir, int baza) ;
valoare = este valoarea binar de tip long ntreg ce se convertete
ir = este pointerul spre zona n care se pstreaz rezultatul conversiei
baza =baza de numeraie pentru ntregul rezultat n urma convertiri.
Exemplu.
S se converteasc o valoare ntreag de tip long ntr-un ir de caractere, folosind
ca baz de conversie o valoare ntreag ntre 2 i 16.
Valoarea ntregului ce se convertete ct i valoarea bazei de conversie se
introduc de la tastatur.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
char sir [15];
long int a ;
int b ;
puts ("dati un numar in baza 10 de tip long int");
scanf ("%ld",&a);
puts ("dati valoarea bazei de conversie 2,3,4,5,6,7,8,16");
scanf ("%d",&b);
printf ("se converteste intregul in sir de caractere echivalent in baza %d ",b);
LIMBAJUL C TEORIE I APLICAI I 108
ltoa (a,sir,b) ;
printf ("sirul rezultat in urma conversiei = %s", sir);
puts ("\n Apasa o tasta ");
getch ();
}
3.10. Pointeri.
Pointerii sunt un tip de variabile particulare. O variabil de tip pointer poate reine
adresa unei variabile. Pointerii sunt asociai pentru fiecare tip de dat a limbajului
C. Declararea unei variabile pointer se face:
tip de data *nume_variabila_pointer;
Pentru a declara o variabil pointer trebuie folosit operatorul de indirectare *.
Operatorul indirectare * este folosit pentru a accesa valoarea pe care variabila
pointer o indic.
#include <stdio.h>
void main ()
{
int *pa;
printf("\nVariabila pa are valoarea %p", pa);
printf("\nValoarea stocata in locatia %p este %d", pa, *pa);
*pa=3;
printf("\nVariabila pa are valoarea %p", pa);
printf("\nValoarea stocata in locatia %p este %d", pa, *pa);
}
Programul va afia pe ecran:
Variabila pa are valoarea 06CB
Valoarea stocata n locatia 06CB este 28256
Variabila pa are valoarea 06CB
Valoarea stocata n locatia 06CB este 3
S disecm programul prezentat mai sus. In zona de declarare a variabilelor am
declarat o variabil de tip pointer cu numele pa (atenie la operatorul de
indirectare n faa numelui variabilei). Prima instruciune printf() tiprete
valoarea variabilei pointer pa. Specificatorul de format pentru variabilele de tip
pointer este %p. Observm c valoarea varibilei pointer este afiat n format
hexazecimal. (Valoarea acestei variabile este arbitrar, n cazul nostru este 06CB,
dar pe alte calculatoare poate avea o alt valoare). Valoarea 06CB reprezint o
locaie de memorie. Urmtoarea instruciune printf() tiprete valoarea de tip
ntreg care este stocat la adresa 06CB. Valoarea care este tiprit 28256 este
arbitar, pentru c nu am influenat cu nimic aceast locaie de memorie.
Urmtoarea instruciune este o instruciune de atribuire *pa=3;. Aceast
instruciune modific valoarea care este stocat n locaia de memorie 06CB la 3.
Ne putem convinge de asta prin urmtoarele dou instruciuni printf(). Valoarea
pointerului nu s-a modificat, dar s-a modificat valoarea ntreag care este stocat
la adresa 06CB.
LIMBAJUL C TEORIE I APLICAI I 109
Atunci cnd a fost prezentat instruciunea scanf(), am amintit de operatorul
adres &. Operatorul adres permite determinarea adresei unei variabile (locaia
de memorie n care variabila respectiv este stocat).
#include <stdio.h>
void main ()
{
int a=2;
int *pa;
printf("\nVariabila pointer pa are valoarea %p", pa);
printf("\nPointerul pa este stocat la adresa %p", &pa);
printf("\nVariabila a are valoarea %d", a);
printf("\nIntregul a este stocat la adresa %p", &a);
pa=&a;
printf("\nVariabila pointer pa are valoarea %p", pa);
printf("\nPointerul pa este stocat la adresa %p", &pa);
printf("\nVariabila a are valoarea %d", a);
printf("\nIntregul a este stocat la adresa %p", &a);
}
S disecm acest program. n partea de declarare a variabilelor, am declaarat o
variabil de tip ntreg i am iniializat-o cu 2, respectiv o variabil pointer de tip
ntreg pa. Primele patru instruciuni printf() care urmeaz vor afia pe ecran:
Variabila pointer pa are valoarea 006B
Pointerul pa este stocat la adresa FFD8
Variabila a are valoarea 2
Intregul a este stocat la adresa FFD6
Reinei c pentru afiarea adresei unei variabile am folosit tot specificatorul de
format %p. Instruciunea de atribuire pa=&pa; va atribui pointerului valoarea
adresei variabilei a. Dup aceast instruciune, programul va afia din nou patru
rnduri folosind instruciunea printf():
Variabila pointer pa are valoarea FFD6
Pointerul pa este stocat la adresa FFD8
Variabila a are valoarea 2
Intregul a este stocat la adresa FFD6
Observm c variabila pointer este nemodificat. Ea conine de data aceasta
valoarea adresei variabilei a. Celelalte valori sunt nemodificate: adresa
pointerului, valoarea variabilei a i adresa variabilei a.
S ncercm s punem cei doi operatori mpreun. S ne imaginm urmtorul
program:
#include <stdio.h>
void main ()
{
int a=2;
int *pa;
pa=&a;
*pa=3;
printf("\nVariabila a are valoarea %d", a);
}
Dac rulm programul de mai sus, pe ecran va fi afiat mesajul:
Variabila a are valoarea 3
LIMBAJUL C TEORIE I APLICAI I 110
Cnd s-a ntmplat asta? Nu am modificat de loc valoarea variabilei a printr-o
atribuire i totui valoarea ei este 3 n loc de 2. De fapt, prima instruciune de
atribuire pa=&a; atribuie variabilei pointer pa adresa variabilei a (deci variabila
pointer indic ctre locaia de memorie n care este pstrat variabila a.
A doua instruciune de atribuire *pa=3; atribuie locaiei indicate de pointer
valoarea 3. Dar locaia indicat de pointer este locaia unde este pstrat variabila
a, deci de fapt am modificat valoarea variabilei a..
De fapt, pointerii sunt folosiii pentru a putea returna mai multe valori din funcii.
Am vzut n paragraful referitor la funcii, c transmiterea parametrilor se face
prin valoare. S ne imaginm urmtoarea problem:
Exemplu
S se scrie un program C, care calculeaz soluiile ecuaiei de gradul II ntr-o
funcie. Citirea datelor de intrare i tiprirea datelor de ieire s fie fcut n
funcia void main ().
Rezolvare
tim de la funcii, c o funcie n C nu poate returna dect o singur valoare
folosind instruciunea return(). S ncercm s scriem programul sub aceast
form:
#include <stdio.h>
#include <math.h>
int ec2(float, float, float, float, float);
void main ()
{
int rez;
float a, b, c, x1, x2;
printf("\nProgram care rezolva ecuatia de gradul II ax^2+bx+c=0");
printf("\nIntroduceti coeficientii a, b si c");
scanf("%f %f %f", &a, &b, &c);
rez=ec2(a, b, c, x1, x2);
if (rez == 1)
printf ("Solutiile ecuatiei sunt x1=%f si x2=%f", x1, x2);
else
printf ("Ecuatia are solutii imaginare");
}
int ec2(float a, float b, float c, float x1, float x2)
{
float d;
d=b*b-4*a*c;
if (d < 0)
return (0);
else
{
x1=(-b-sqrt(d))/2/a;
x2=(-b+sqrt(d))/2/a;
return (1);
}
}
LIMBAJUL C TEORIE I APLICAI I 111
Dac vom introduce pentru coeficieni valorile 1, -3 i 2 pentru care soluia
ecuaiei este 1 i 2, programul va afia:
Solutiile ecuatiei sunt x1=0.000000 si x2=0.000000
De ce? Pentru c la apelul funciei ec2() din funcia void main (), nu se transmit
variabilele x1 i x2 (sau mai corect spus adresele variabilelor) ci valorile lor. In
funcia ec2() variabilele x1 i x2 care apar n lista parametrilor formali, sunt dou
variabile locale care nu sunt aceleai cu variabilele x1 i x2 declarate n funcia
void main (). La revenirea din funcia ec2() variabilele x1 i x2 (din funcia void
main ()) sunt nemodificate.
Rezolvarea problemei se face apelnd funcia ec2() cu adresele variabilelor x1 i
x2. In funcia ec2() vom atribui noile valori direct n adresa variabilei x1 i x2 din
funcia void main (). Fiierul surs corect este prezentat n continuare:
#include <stdio.h>
#include <math.h>
int ec2(float, float, float, float *, float *);
void main ()
{
int rez;
float a, b, c, x1, x2;
printf("\nProgram care rezolva ecuatia de gradul II ax^2+bx+c=0");
printf("\nIntroduceti coeficientii a, b si c");
scanf("%f %f %f", &a, &b, &c);
rez=ec2(a, b, c, &x1, &x2);
if (rez == 1)
printf ("Solutiile ecuatiei sunt x1=%f si x2=%f", x1, x2);
else
printf ("Ecuatia are solutii imaginare");
}
int ec2(float a, float b, float c, float *x1, float *x2)
{
float d;
d=b*b-4*a*c;
if (d < 0)
return (0);
else
{
*x1=(-b-sqrt(d))/2/a;
*x2=(-b+sqrt(d))/2/a;
return (1);
}
}
Lista parametrilor formali ai funciei ec2() este float a, float b, float c, float *x1,
float *x2, deci 3 variabile de tip float i dou variabile de tip pointer la float. In
interiorul funciei ec2() operaiile de atribuire sunt *x1= i *x2=, adic se
depun noile valori calculate n adresele indicate de pointerul x1 i pointerul x2.
LIMBAJUL C TEORIE I APLICAI I 112
Apelul funciei ec2() din funcia void main (), se face sub forma ec2(a, b, c, &x1,
&x2); adic se transmit valorile variabilelor a, b i c, precum i adresa variabilei
x1, respectiv a variabilei x2.
3.11. Structuri i tipuri definite de utilizator.
Datele prelucrate de programe pot fi singulare sau grupate, cele singulare au fost
prezentate n capitolele anterioare.
Datele grupate sunt mulimi de elemente care pot fi prelucrate att element cu element
ct i global. Un tip de date grupate sunt tablourile, dar ele implic c toate elementele
tabloului sunt de acelea tip.
Sunt situaii cnd se doresc gruparea de date de diferite tipuri exemplu :
Data calendaristic format din 3 elemente zi, lun, an, unde :
zi este de tip numeric
lun este de tip ir de caractere
an este de tip numeric
Aceast grupare de date poart numele de structur.
Referirea la elementele structuri se face prin construcii de felul numelui.
Structurile sunt date care se pot aloca :
Global
Automatic
Static
Structura se consider global dac a fost declarat n afara corpului oricrei funcii, se
consider automatic, dac a fost declarat n corpul unei funcii, se consider static
dac declaraia ei are prefixul cuvintul static.
Elementele care sunt componente ale structurii pot fi iniializate astfel, dup declararea
structurii se scrie caracterul = , urmat de construciile prin care se iniializeaz
componentele elementare ale structurii, valorile sunt cuprinse ntre paranteze acolade.
Valorile sunt separate prin virgul intre ele astfel :
Se consider o structur pentru pstrarea numerelor complexe ce au dou
componente :
Partea real
Partea imaginar
Se consider structura nume_complex cu dou elemente :
struct nume_complex
{
float real ;
float imaginar ;
} ;
Se consider c variabila x este o structur de tipul nume_complex prin declaraia de
mai jos :
struct nume_complex x ;
LIMBAJUL C TEORIE I APLICAI I 113
Dac se dorete iniializarea elementelor ce compun variabila x de tip complex, se
folosete declaraia de forma :
struct nume_complex x = {2.3, 4.0} ;
Astfel variabila x de tip nume complex va avea iniializate elementele, real cu valoarea
2.3 iar imaginar cu valoarea 4.0.
3.11.1. Declaraie de structur.
Declararea unei structuri se poate face prin dou moduri, cuvntul de nceput pentru o
structur este struct .
Modul 1
struct numele structuri
{
lista de declaratii
}
numele structurii1, numele structurii2.numele structuriin ;
numele structuri, numele structurii1, numele structurii2.. sunt nume date
variabilelor de acelea fel i obligatoriu unul din aceste nume trebuie s fie prezent.
Dac numele structuri este prezent , el definete o structur nou, iar numele
structurii1, numele structurii2 definesc variabile de tipul nume structur .
Exemplu.
struct complex
{
float real ;
float imaginar ;
}
x,y,z ;
Astfel compex este numele noi structuri ce are dou elemente de tip float, iar x,y,z
sunt variabile structur de tip complex.
struct data_calendar
{
int zi ;
char luna [15];
int an ;
}
data_nasterii, data_inscrierii ;
Structura data_calendar are trei elemente de tip intreg,caracter i intreg.
Data_ nasterii i data_inscrierii sunt variabile de tip structur ca structura
data_calendar.
Dac se dorete realizarea a dou variabile de tip structur asemntoare cu
structura data_calendar dar nu se dorete tipul data_calendar se folosete forma :
LIMBAJUL C TEORIE I APLICAI I 114
struct
{
int zi ;
char luna [15];
int an ;
}
data_nasterii, data_inscrierii ;
Modul 2
struct nume nume de structura ;
nume este o structur declarat anterior prin modul 1, iar nume de structura reprezint
o nou structur asemntoare cu structura nume.
Definirea unei structuri noi cu numele complex.
struct complex
{
float real ;
float imaginar ;
} ;
Definirea a 3 variabile x,z,y, (structuri) de tipul complex.
struct complex x,y,z ;
definirea a dou tablouri a [10], b[2][2], de tipul complex.
struct complex a[10],b [2][2] ;
n cadrul unei structuri la declararea elementelor ce formeaz structura se poate folosi
i element de tip structur, cu obligativitatea ca structura folosit la declararea
elementului s fie deja realizat.
Se declar structura date_personale care conine ca element i structura data_calendar.
struct data_personal
{
char nume ;
char prenume ;
struct data_calendar
data_nasteri ;
char adresa ;
char localitatea ;
} ;
Astfel elementul data_nasteri este la rndul su o structur definit anterior cu 3
elemente.
3.11.2. Accesul la elementele unei structuri.
Referirea la componentele unei structurise face utiliznd dou informaii, una este
numele structurii i a dou este numele componentei structurii. Pentru aceasta se
folosete construcia de forma :
Nume structur.numele elementului structurii
LIMBAJUL C TEORIE I APLICAI I 115
Separatorul ntre numele structuri i numele elementului este caracterul punct .
Exemplu.
Se consider structura complex cu 2 elemente componente i se dorete atribuirea
elementului reale a valori 2.1 iar a elementului imaginar valoarea 3.11.

struct complex
{
float real ;
float imaginar ;
}
x,a[3] ;
atribuirea valorilor pentru x se face astfel :
x.real=2.1;
x.imaginar=3.11;
iar pentru elementele variabilei a [2] se face astfel :
a[2].real=2.1;
a[2].imaginar=3.11;
Dac n cadrul structurii sunt elemente ce la rndul lor sunt structur, atribuirea de
valori la elemente se realizeaz prin indicarea succesiv a elementelor astfel :
struct data_calendar
{
int zi ;
char luna [15];
int an ;
};
struct data_personal
{
char nume ;
char prenume ;
struct data_calendar
data_nasteri ;
char adresa ;
char localitatea ;
}angajat ;
variabila angajat este o structur de tip data_personal ce include elementul
data_nasteri ca ostructur de tipul data_calendar.
Pentru a apela elementul zi din cadrul variabilei angajat se va scrie :
angajat.data_nasteri.zi =12 ;
Pentru a apela elementul nume din variabila angajat se va scrie :
strcpy (angajat.nume, Popescu) ;
LIMBAJUL C TEORIE I APLICAI I 116
sau folosind funcia gets () astfel :
printf (introduceti numele );
gets (angajat.nume) ;
se tasteaz numele Popescu .
Pentru a apela elementul an din substructura data_calendar a variabilei angajat se
va scrie :
angajat.data_nasteri.an =1949 ;
Dac se folosete tastatura pentru a introduce datele se scrie :
printf (introduceti data nasteri );
gets (b);
angajat.data_nasteri.an= atoi (b); se va tasta 1949
Pentru a afia valorile elementelor unei structuri, se va folosi adresarea numelui de
structur ct i numele elementului astfel :
Printf (anul nasteri =%d \n,angajat.data_nasteri.nume);
Printf (luna =%s \n,angajat.data_nasteri.luna);
Printf (ziua =%d \n,angajat.data_nasteri.zi);
Pentru a apela elementul luna din sustructura data_calendar a variabilei angajat se
va scrie :
strcpy (angajat.data_nasteri.luna, IANUARIE) ;
Exemplu.
S se realizeze o structur cu denumirea punct ce conine elementele :
x=numr linie intreg
y=numr coloan intreg
c=culoarea liniei caracter
i variabilele a, b[4] de tip structura punct.
S se citeasc de la tastatur valori pentru elementele dorite i s se afieze
valorile scrise n aceste elemente.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
struct punct declararea structurii punct
LIMBAJUL C TEORIE I APLICAI I 117
{
int x; declararea elementului x al structurii punct i
tipul elementului intreg
int y ; declararea elementului y al structurii punct i
tipul elementului intreg
char c [10] ; declararea elementului c al structurii punct i
tipul elementului ir de caractere
}a,b[4] ; declararea variabilelor a i b[4] de tip structur
punct
puts ("dati numarul liniei si numarul coloanei");
scanf ("%d,%d",&a.x,&a.y); citirea a dou date de tip intreg i atribuirea
acestor date elementelor x i y ale variabilei a de
tip structur punct
puts ("dati culoarea liniei");
scanf ("%s", a.c); citirea unui ir de caractere i atribuirea acestui ir
elementului c al variabilei a de tip structur
scanf ("%s",b[1].c); citirea unui ir de caractere i atribuirea acestui ir
elementului c al variabilei tablou b[1] de tip
structur
printf ("datele citite sunt x=%d y=%d \n",a.x,a.y); afiarea valorilor elementelor
x i y ale variabilei a de tip structura
printf ("culoarea este =%s \n",a.c); afiarea valorilor elementului c al variabilei
a de tip structura
printf ("culoarea lui b[1]=%s",b[1].c); afiarea valorilor elementului c al
variabilei tablou b[1] de tip structura
puts ("\n Apasa o tasta ");
getch ();
}
Transferarea unei structuri n cadrul unei funciise face prin pointeri spre structur.
Dac se consider o funcie f1 care prelucreaz structura punct, funcia va avea
antetul :
Tip f1 (struct punct *p)
Declaraia lui p specific c el are ca valoare adresa de nceput a zonei de memorie
unde este tipul punct.
Pentru a accesa elementele din structur, se va folosi :
(*p).x;
(*p).y;
aceast form se poate simplifica prin nlocuirea lui (*p). cu p->
p->x ;
LIMBAJUL C TEORIE I APLICAI I 118
p->y ;
operatorul sgeat -> se consider de prioritate maxim prin asociere de la
stnga la dreapta.
3.11.3. Asignri de nume pentru tipuri de date.
Tipurile predefinite de limbaj (int, char, float, double, long) se indentific prin
cuvntul cheie asociat lor. n cazul c utilizatorul dorete s realizeze tipuri de date
propri, va folosi o construcie de structur astfel :
struct nume {
declaraii;
} ;
sau se poate folosi forma :
typedef tip nume ;
typedef =cuvnt cheie
tip =tipul datei predefinit sau tipul creat de utilizator anterior
nume = numele ce se atribuie tipului definit de tip.
Dup declararea numelui unui tip se poate folosi pentru a declara date de tipul creat de
utilizator astfel :
typdef float real ;
astfel cuvntul real se poate utiliza pentru a defini date de tip float :
real x;
indentic cu
float x;
typedef struct punct {
int x;
int y;
} PT ;
s-a definit un tip cu numele PT care are caracteristicile unei structuri punct.
Declaraia de forma :
PT puncte, puncte1;
Indic c datele puncte i puncte1 sunt date de tip structur asemenea cu structura
punct.
typedef struct {
float real;
float imaginar ;
} complex ;
Utilizarea declaraiilor de mai jos :
complex a,b,c;
Are ca efect declararea a 3 variabile (a, b, c) ca numere complexe.
LIMBAJUL C TEORIE I APLICAI I 119
Exemplu.
S se scrie o funcie care determin modulul unui numr complex i s se apeleze
funcia ntr-un program ce citete o valoare de tip numr complex.
Numrul complex este de forma :
x+yi
iar modulul este :
sqrt (x.x+y.y)
Funcia modul_complex este realizat n fiierul erton13.c.
Fiierul erton13.c
float modul_complex (complex *c)
{
puts ("returneaza modulul numarului complex");
return sqrt (c->x*c->x+c->y*c->y) ;
}
Programul principal.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
typedef struct {
float x;
float y;
} complex;
#include "erton13.c"
void main ()
{
complex a ;
puts ("dati partea reala a numarului complex");
scanf ("%f",&a.x);
puts ("dati partea imaginara a numarului complex");
scanf ("%f",&a.y);
printf ("a+ai= %.2f+%.2f*i\n",a.x,a.y);
printf ("modulul =%f\n",modul_complex (&a));
puts ("\n Apasa o tasta ");
getch ();
}
3.12. Prelucrarea irurilor de caractere.
n practica de programare sunt dese situai cnd este necesar s se efectueze operaii cu
iruri de caractere astfel :
Citirea unui ir de caractere.
Compararea a dou iruri de caractere.
Determinarea lungimii irului de caractere.
Concatenarea a dou iruri de caractere.
LIMBAJUL C TEORIE I APLICAI I 120
Copierea unui ir de caractere.
Operaiile enumerate mai sus sunt necesare n realizarea de fiiere de comand, pentru
realizarea de transfer de date de pe dischet pe calculator sau invers, sub controlul unor
parametri impui de cel care livreaz fiierele cum ar fi :
Indicarea i alegerea discului pe care se va copia fiierele.
Indicarea ci de directoare, subdirectoare.
Indicarea numelui fiierului ce se copiaz sau mut.
Funciile pentru prelucrarea irurilor de caractere au prototipul n fiierul string.h,
coninut n biblioteca standard.
irurile de caractere sunt pstrate n memorie sub forma unui tablou cu o singur
dimensiune de tip char, iar fiecare caracter al irului este pstrat pe un octet n codul
ASCII.
La terminarea irului de caractere se poziioneaz caracterul NUL, care nu este
considerat ca i caracter la determinarea lungimii irului de caractere. Prezena acestui
caracter este necesar pentru a indica terminarea irului de caractere.
Operaiile asupra irului de caractere se realizeaz prin utilizarea numelui tabloului n
care se pstreaz irul de caractere, astfel primul termen al tabloului pstreaz valoarea
codului primului caracter, al doile-a termen al tabloului pstreaz valoarea codului
celui deal doile-a caracter i aa mai departe.
S- considerm c n tabloul sir1 se va pstra irul de caractere TEST PENTRU
SIRURI .
Char sir1 [20] = TEST PENTRU SIRURI ;
Astfel sir1 [0] va conine adresa caracterului T.
Astfel sir1 [1] va conine adresa caracterului E.
Astfel sir1 [0] va conine adresa caracterului S.
Astfel sir1 [0] va conine adresa caracterului T.
Astfel sir1 [0] va conine adresa caracterului spaiu.
Etc.
Astfel sir1 [18] va conine adresa ultimului caracter al irului I.
Pentru a se deosebi mai uor funciile ce prelucreaz iruri de caractere, s-a pus la
fiecare funcie prefixul str de la cuvntul string din englez.
3.12.1. Funcia strlen,lungimea irului de caractere.
Funcia strlen determin lungimea irului de caractere, prin numrarea caracterelor care
formeaz irul. La numrarea numrului de caractere a irului nu se adaug caracterul
de sfrit NUL a irului, rolul lui este de a opri numrarea caracterelor pn la el.
Prototipul funciei strlen este :
unsigned strlen (const char *sir1);
Funcia returneaz o valoare pozitiv ntreag ce reprezint numrul de
caractere din sirul de caractere sir1.
Parametrul formal al funciei strlen este un pointer spre o dat constant.
char sir1 [50];
int lun ;
LIMBAJUL C TEORIE I APLICAI I 121
scanf (%s,sir1);
lun= strlen (sir1);
S-au declarat variabila sir1 de tip caracter n care se va pstra irul de caractere citite i
variabila lun la care se va atribui valoarea returnat de funcia strlen.
Dac se dorete determinarea lungimii unui ir de caractere apelat chiar de funcia
strlen, secvena de program este :
int lun ;
lun= strlen (test pentru siruri);
astfel valoarea lui lun este chiar numrul de caractere al irului test pentru
siruri , n cazul de fa valoarea lui lun este 18, i spaiile libere din irul de caractere
este numrat.
printf (lungimea sirului este %d , strlen (test pentru sir));
La apelarea funciei printf se va afia valoarea 15 ce reprezint numrul de caractere
din irul test pentru sir .
3.12.2. Funcia strcpy, copierea unui ir de caractere.
Funcia strcpy permite copierea unui ir de caractere de la o adres de memorie la alt
adres de memorie.
Prototipul funciei strcpy este :
Char * strcpy (char*la destina ia, const char*de la sursa);
Funcia strcpy copiaz irul de caractere, inclusiv terminatorul irului NUL de la sursa
la destinaia indicat prin parametri formali ai funciei. Marimea zonei n care se face
copierea (destinaia) trebuie s fie egal sau mai mare dect lungimea irului +1, n caz
contrar caracterele surplus pot fi modificate necontrolat de program. Se recomand ca
naintea apelrii funciei strcpy s se determine lungimea irului ce se copiaz i s se
compare aceast lungime +1 cu mrimea zonei destinaie.
Funcia strcpy returneaz adresa de nceput a zonei n care s- a copiat irul, pointer spre
destinaie char*.
Funcia strcpy modific coninutul destinaiei dar nu poate modifica coninutul sursei
datorit modificatorului const pentru pointerul surs.
Exemple de folosire :
char sirsursa [30] ,sirdestinatie [30] ;
scanf (%s,sirsursa);
strcpy (sirdestinatia, sirsursa);
irul de caractere citit cu funcia scanf (%s,sirsursa); este alocat n tabloul sirsura, iar
prin apelul funciei strcpy irul de caractere din tabloul sirsursa este copiat n tabloul
sirdestinatie.
LIMBAJUL C TEORIE I APLICAI I 122
char sirsursa [30] ,sirdestinatie [30] ;
strcpy (sirdestinatia,inceput de drum);
Textul inceput de drum este copiat n tabloul sirdestinatie.
char sirsursa [30] ,sirdestinatie [30] ;
char *surs = o noua varianta ;
char *t1;
t1=strcpy (sirdestinatia,surs);
irul o noua varianta pstrat n zona spe care pointeaz *surs se copiaz n zona spre
care pointeaz sirdestinatia i apoi i se atribuie lui t1 valoarea adresei tabloului
sirdestinatia.
3.12.3. Funcia strncpy, copierea a cel mult n caractere ale unui ir de
caractere.
Funcia strncpy permite copierea a cel mult n caractere ale irului surs n irul
destinaie.
Dac valoarea lui n este mai mare dect lungimea irului surs, atunci toate caracterele
irului surs sunt transferate n irul destinaie.
Dac valoarea lui n este mai mic dect lungimea irului surs, atunci se va transfera
numai n caractere din irul surs n irul destinaie.
Prototipul funciei este :
char * strncpy (char * destinatie, const char* sursa , unsigned n);
Exemplu de apelare a funciei strncpy :
char sirsursa [30] ,sirdestinatie [10] ;
char *sirsursa = o noua varianta ;
strncpy (sirdestinatia,sirsursa,6);
Dup executarea liniilor de cod de mai sus, din irul de caractere o noua varianta se
vor copia n tabloul sirdestinatie numai primele 6 caractere
o noua .
3.12.4. Funcia strcat, concatenarea irurilor de caractere.
Funcia strcat permite concatenarea (adugarea) unui ir de caractere, numit surs, la
sfritul altui ir de caractere numit destinaie.
Lungimea tabloului destinaie trebuie s fie mai mare sau egal cu lungimea irului de
caractere existente n irul destinaie naintea apelri funciei strcat + lungimea irului
sursa +1 pentru caracterul de terminare NUL a noului ir.
Funcia strcat returneaz valoarea irului destinaie.
Funcia strcat are prototipul :
char * strcat (char * destinatie, const char* sursa);
LIMBAJUL C TEORIE I APLICAI I 123
Exemplu de folosire :
char sirsursa [30] ,sirdestinatie [50] ;
scanf (%s,sirsursa);
char *sirdestinatie = inceput de drum ;
strcat (sirdestinatia, sirsursa);
Dac la apelarea funciei de citire a unui ir de caractere se tasteaz pentru
concatenare i dac se va afia coninutul tabloului sirdestinatie, va rezulta irul de
caractere inceput de drum pentru concatenare
3.12.5. Funcia strncat, concatenarea irurilor de caractere cu
lungimea impus.
Funcia strncat permite concatenarea a dou iruri de caractere cu observaia c al
doilea ir ce se adaug este limitat de n caractere indicate de parametrul n al funciei.
Observaiile indicate la funcia strcat sunt recomandate i la funcia strncat.
Prototipul funciei strncat este :
char * strncat (char * destinatie, const char* sursa, unsigned n);
Exemplu de folosire :
char sirsursa [30] ,sirdestinatie [50] ;
scanf (%s,sirsursa);
char *sirdestinatie = inceput de drum ;
strncat (sirdestinatia, sirsursa,6);
printf (%s, sirdestinatie);
Dac la apelarea funciei de citire a unui ir de caractere se tasteaz pentru
concatenare se va afia coninutul tabloului sirdestinatie, va rezulta irul de caractere
inceput de drum pentru
irul de caractere concatenare nu mai este adugat la irul sirdestinaie.
3.12.6. Funcia strcmp, compararea a dou iruri de caractere.
Funcia strcmp compar dou iruri de caractere care au aceia lungime, i returneaz o
valoare intreag funcie de rezultatul comparri astfel :
Returneaz valoarea -1 dac sirul1 < sirul2.
Returneaz valoarea 0 dac sirul1 =sirul2.
Returneaz valoarea 1 dac sirul1 > sirul2
irul 1 se consider mai mic dect irul 2 dac exist mcar un termen
sir1[i]<sir2[i] indiferent de valoarea lui i iar restul
termenilor sunt egali .
irul 1 se consider egal dac pentru orice valoare a lui i este valabil relaia :
sir1[i]=sir2[i] iar restul termenilor sunt egali.
irul 1 se consider mai mare dect irul 2 dac exist mcar un termen pentru
care relaia
LIMBAJUL C TEORIE I APLICAI I 124
sir1[i]<sir2[i] este valabil indiferent de valoarea lui i iar restul
termenilor sunt egali.
Prototipul funciei strcmp are prototipul :
int strcmp (const char * sir1, const char* sir2);
Exemplu de apelare :
char *sir1 = inceput de drum ;
char *sir2 = inceput de drum ;
int i;
i=strcmp (sir1, sir2);
if (i==0)
printf(siruri egale);
if (i<0)
printf (sirul1 mai mic decit sirul2);
else
printf (sirul1 mai mare decit sirul2)
Dac se ruleaz aceast secven de cod, se va afia siruri egale.
Dac pentru irul doi se introduce inceput de druM , se va afia sirul1 mai mare decit
sirul2 deoarece litera m are o valoare mai mare dect litera M.
Dac pentru irul1 se introduce inceput De drum iar pentru irul2 se introduce inceput
de drum , se va afia sirul1 mai mic decit sirul2 .
3.12.7. Funcia stricmp, compararea a dou iruri fr a se face
distincia ntre litere mari sau mici.
Funcia stricmp lucreaz ca i funcia strcmp cu deosebirea c nu face distincie ntre
caracterele majuscule i minuscule.
Prototipul funciei este :
int stricmp (const char * sir1, const char* sir2);
Dac cele dou iruri conin textul :
Sir1 mic
Sir2 MIC
char *sir1 = mic ;
char *sir2 = MIC ;
int i;
i=strcimp (sir1, sir2);
if (i==0)
printf(siruri egale);
if (i<0)
printf (sirul1 mai mic decit sirul2);
else
printf (sirul1 mai mare decit sirul2)
LIMBAJUL C TEORIE I APLICAI I 125
La apelarea funciei stricmp asupra celor dou iruri valoarea returnat este 0, iruri
egale.
3.12.8. Funcia strincmp.
Funcia strincmp compar dou iruri de caractere, de la primul caracter pn la cel
mult n caractere i se ignor diferena dintre caracterele majuscule i caracterele
minuscule.
Prototipul funciei este :
int strincmp (const char * sir1, const char* sir2, usigned n);
Dac cele dou iruri conin textul :
Sir1 micut
Sir2 MIC
char *sir1 = micut ;
char *sir2 = MIC ;
int i;
i=strcinmp (sir1, sir2,3);
if (i==0)
printf(siruri egale);
if (i<0)
printf (sirul1 mai mic decit sirul2);
else
printf (sirul1 mai mare decit sirul2)
La apelarea funciei stricmp asupra celor dou iruri valoarea returnat este 0, iruri
egale, datorit faptului c s-au comparat numai primele 3 caractere ale irurilor.
Exemplu.
S se citeasc de la tastatur 3 iruri de caractere, s se compare lungimea primelor
dou iruri, s se realizeze o fraz cu cele trei iruri, s se copieze irul 1n irul2.
S se afieze la fiecare etap efectul operaiei.
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main ()
{
char sir1[30], sir2 [40], sir4 [30];declarare iruri de tip caracter
char sir3 []=" "; declararea irului 3 ce conine spiu liber
int i,j;
puts ("Se calculeaza lungimea sirurilor citite ");
puts ( "Dati sirul1");
scanf("%s",sir1); citirea unui ir de caractere fr spaiu liber nte
caractere
puts ("dati sirul2");
scanf ("%s",sir2);
puts ("dati sirul4");
scanf ("%s",sir4);
LIMBAJUL C TEORIE I APLICAI I 126
i=strlen (sir1); determinarea lungimii sirului (numrul de
caractere)
j=strlen (sir2);
if (i>j)
puts ("sirul1 mai lung decit sirul2");
else
if (i==j)
puts ("siruri cu lungimi egale");
else
puts ("sirul2 mai lung decit sirul1");
printf ("sir1 =%d caractere \t sirul2=%d caractere \n",i,j);
strcat (sir1,sir3); concatenarea la sfritul irului1 a irului 3 pentru
a introduce spaiu liber ntre cuvinte
strcat (sir1,sir2); concatenarea la sfritul noului ir1 a irului2
printf ("%s\n",sir1); afiarea primei fraze realizat din sirul1 pauz de
un caracter i apoi irul2
strcat (sir1,sir3); concatenarea ir3 la noul ir1
strcat (sir1,sir4); concatenarea ultimului ir4
printf ("%s\n",sir1); afiarea frazei format din 3 cuvinte i dou spaii
ntre cuvinte
strcpy (sir2,sir4); copierea irului4 n irul2
printf ("%s\n",sir2);
puts ("\n Apasa o tasta ");
getch ();
}
Dac la rularea programului se va tasta pentru irul1 ERTON, pentru irul2 ESTE, iar
pentru irul4 SPORTIV, n urma rulrii vor fi afiate :
Sirul1 mai lung decit sirul2
ERTON ESTE
ERTON ESTE SPORTIV
SPORTIV
Apasa o tasta
3.13. Prelucrarea fiierelor.
Operaiile de intrare, ieire asupra unui fiier se realizeaz prin intermediul
funciilor din biblioteca standard a limbajului C. Operaiile de intrare/ieire se
realizeaz de la tastatur, monitor dar sunt situaii multiple cnd aceste operaii se
efectueaz dintr-un fiier. Prelucrarea fiierelor se efectueaz prin operaii
specifice cum sunt :
Deschiderea fiierului
Citirea datelor din fiierul deschis
Actualizarea fiierului
Adugarea datelor n fiier
LIMBAJUL C TEORIE I APLICAI I 127
Poziionarea n cadrul fiierului, nchiderea fiierului
Crearea unui fiier
tergerea unui fiier
Funciile necesare operrii cu fiiere au prototipul n fiierul stdio.h. Prelucrarea
fiierelor se poate face la dou nivele :
Nivel inferior ce apeleaz direct sistemul de operare.
Nivelul superior ce apeleaz structuri speciale de tip FILE
3.13.1.1 Nivelul superior de prelucrare a fiierelor.
Deschiderea unui fiier
Deschiderea unui fiier se realizeaz prin funcia fopen ce returneaz un pointer
spre tipul FILE, sau pointer nul n cazul c fiierul indicat nu exist sau nu poate fi
deschis. Prototipul funciei fopen este :
FILE fopen (const char calea, const char *mod);
unde calea este pointerul spre un ir de caractere care indic calea spre fiierul ce
se deschide,
mod este pointerul spre irul de caractere care indic modul de prelucrare a
fiierului astfel :
"r" = deschidere n citire
"w" = deschidere n scriere
"a" = deschidere pentru adugare de nregistrri n fiier
"r+" = deschidere pentru modificare scriere,citire
"rb" = deschidere n citire binar
"wb" = scriere binar
"r+b" = citire sau scriere binar.
Dac fiierul ce urmeaz a se deschide nu este, se va apela opiunea w sau a care
va crea acest fiier, dac se deschide un fiier existent prin opiunea w, se vor
terge toate datele existente din fiier considerndu-se n modul creare. Dac se
deschide cu opiunea a un fiier existent noile date vor fi adugate dup ultima
dat din fiier.
nchiderea unui fiier
nchiderea unui fiier se realizeaz cu funcia fclose a crui prototip este :
int fclose (FILE*p):
unde p este pointerul spre tipul FILE definit prin funcia fopen.
Funcia returneaz o valoare de tip ntreg astfel :
0 la nchidere normal
1 la eroare
3.13.2. Intrri ieiri cu format.
Funciile folosite pentru citire sau scriere cu format din fiier sunt :
fscanf pentru citire din fiier.
fprintf pentru scrierea cu format n fiier.
LIMBAJUL C TEORIE I APLICAI I 128
Prototipul funciei fscanf este:
int fscanf (FILE*p, const char*format..);
unde p este pointer spre tipul FILE a crui valoare a fost definit de apelul funciei
de deschidere a fiierului fopen,
const char*format.. sunt parametrii ce indic formatele de citire ca i la funcia
scanf.
Funcia fscanf returneaz numrul cmpurilor citite corect iar la ntlnirea
sfritului de fiier va returna valoarea EOF.
Prototipul funciei fprintf este:
int fprintf (FILE*p, const char*format..);
unde p este pointer spre tipul FILE a crui valoare a fost definit de apelul funciei
de deschidere a fiierului fopen,
const char*format.. sunt parametrii ce indic formatele de citire ca i la funcia
printf.
Funcia fprintf returneaz numrul caracterelor scrise n fiier n caz de succes,
sau returneaz valoarea 1 n caz de eroare.
3.13.3. Poziionarea n fiier.
Operaiile de citire, scriere se efectueaz secvenial, astfel la fiecare apel de citire
scriere se citete nregistrarea curent, respectiv se scrie o nou nregistrare la
poziia curent.
n majoritatea cazurilor se dorete o poziionare n interiorul fiierului, astfel
operaiile de citire, scriere au loc aleator.
Pentru o poziionare n fiier se folosete funcia fseek cu prototipul:
int fseek (FILE*p, long deplasare, int origine);
unde p pointer spre tipul FILE a crui valoare a fost definit de apelul funciei de
deschidere a fiierului fopen,
deplasare este numrul de octei peste care se va deplasa capul de citire/scriere,
origine indic de unde se consider c este originea deplasrii:
0 = deplasarea se consider de la nceputul fiierului.
1 = deplasarea se consider de la poziia curent.
2 = deplasarea se consider de la sfritul fiierului.
Funcia fseek returneaz valoarea 0 la o poziionare corect i o valoare diferit de
0 n caz de eroare.
Exemplu
S se scrie un program C pentru scrierea ntr-un fiier a datelor citite de la
tastatur. Datele citite de la tastatur sunt scrise n fiierul avnd numele costi1.c
secvenial (nregistrare dup nregistrare) folosind un ciclu for cu un numr de 5
pai.
Rezolvare
LIMBAJUL C TEORIE I APLICAI I 129
Structura de tip FILE pointeaz la fl, iar funcia fopen pointeaz la acela fl.
Numele fiierului ct i calea la fiier sunt delimitate de dublu apostrof. Modul de
deschidere a fiierului este indicat prin caracterul "w" (mod de scriere secvenial).
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<fcntl.h>
void main ()
{
FILE *f1; fl este pointerul de tip structur FILE (fiier)
int a,b,c;
char d[10];
f1=fopen("COSTI1.C","w"); apelarea funciei de deschidere a fiierului in
mod scriere
for (a=1; a<=5; a=a+1) ciclul de citire de la tastatur i scriere n fiier
{
scanf ("%s",&d); citirea unei date de tip ir de caractere de la
tastatur
fprintf (f1,"%s \n",d); scrierea cu format a unei date in fiierul
deschis spe pointerul fl
printf ("s-a scris %s",d); afiarea pe monitor a datei citite i scrise n
fiier
}
puts ("Apasa o tasta");
getch ();
fclose (fl); nchiderea fiierului deschis de fopen ce
pointeaz la fl
}
Exemplu
S se scrie un program C care adaug 5 iruri de caractere, citite de la tastatur n
fiierul creat n exemplul precedent.
Rezolvare
n cazul n care se dorete adugarea de date ntr-un fiier existent, la apelarea
funciei fopen se va alege opiunea a (append).
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<fcntl.h>
void main ()
{
FILE *f1; fl este pointerul de tip strutur FILE (fiier)
int a,b,c;
char d[10];
f1=fopen("COSTI1.C","a"); deschiderea fiierului existent costi1.c in modul
adugare
/* se scrie in adaugare in fisierul costi1.c */
for (a=1; a<=5; a=a+1)
{
LIMBAJUL C TEORIE I APLICAI I 130
scanf ("%s",&d); se citesc 5 iruri de caractere de la tastatur
fprintf (f1,"%s \n",d);
printf ("s-a scris %s",d);
}
puts ("Apasa");
getch ();
fclose (fl); nchiderea fiierului deschis de fopen ce
pointeaz la fl
}
Exemplu
S se scrie programul C care citete un numr de n date de tip numr dintr-un
fiier existent.
Rezolvare
Creai fiierul citire1.dat n editorul DOS. Fiierul citire1.dat are organizate datele
separate fie prin spaiu, fie dispuse pe cte un rnd
fiecare. Coninutul fiierului citire1.dat este
5 12.4 34 56 trei date dispuse pe aceeai linie i separate prin spaiu
78 fiecare dat dispus pe un rnd.
23 fiecare dat dispus pe un rnd.
12 fiecare dat dispus pe un rnd.
45
56
Programul surs C este prezentat n continuare
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<fcntl.h>
#include <math.h>
void main ()
{
FILE * f1;
int i,j,m,n;
float a[100],b[100],c,xc,yc,nr,beta,xb,yb;
f1=fopen("CITIRE1.DAT","r"); funcia fopen deschide fiierul citire1.dat n
mod citire
puts ("DATI NUMARUL DE PUNCTE MASURATE");
scanf("%d",&n);
c=141.42135;
xb=100;
yb=0;
for (i=1; i<=n; i=i+1)
{
fscanf(f1,"%f",&nr); funcia fscanf face prima citire din
fiierul deschis
printf("%.2f ",nr);
fscanf(f1,"%f",&a[i]); se citete a doua dat din fiier
fscanf(f1,"%f",&b[i]); se citete a treia dat din fiier
printf("%f\t%f",a[i],b[i]); se afieaz pe monitor datele citite
beta=(a[i]*a[i]+c*c-b[i]*b[i])/(2*a[i]*c);
LIMBAJUL C TEORIE I APLICAI I 131
xc=xb+a[i]*0.7071068;
yc=yb+a[i]*0.7071068;
printf ("nr=%f\t",nr); se afieaz prima dat citit din fiier
printf ("xc=%f\tyc=%f\n",xc,yc); se afieaz valorile calculate xc, yc
}
puts ("Apasa o tasta pentru terminare");
fclose (f1); se nchide fiierul deschis de fopen
getch ();
}
Probleme propuse
1. S se citeasc de la tastatur mrimea unui vector i termenii vectorului, iar
aceste valori s fie scrise ntr-un fiier de date. S se citeasc fiierul de date i
apoi s se execute urmtoarele operaii asupra datelor :
a) afiarea mrimii vectorului
b) afiarea termenilor vectorului
c) suma termenilor vectorului
d) modificarea termenului n al vectorului cu o nou valoare citit de la tastatur
e) afiarea vectorului modificat.
2. S se citeasc de la tastatur mrimea unei matrici ptratice n n, i termenii
matricei.
a) s se scrie n fiierul mat1.dat mrimea matricei i termenii matricii
b) s se afieze valorile scrise n fiier
c) s se adune toi termenii matricii scrise n fiier
d) s se creeze un nou fiier vect1.dat, care s conin termenii de pe prima linie
a matricii
e) s se adune termenii vectorului din fiierul vect1.dat.
3. S se scrie ntr-un fiier presiune.dat valorile
citite ale presiunii apei i s se afieze aceste
valori cu citirea din fiier.
3.14. Preprocesorul C.
Prerocesorul C execut substituii de texte, realiznd :
Includere de fiiere surs
Definiii i apeluri de macrouri
Compilarea condiionat.
Preprocesorul recunoate construcii care ncep cu caracterul # numite directive.
Directivele recunoscute de preprocesorul C sunt :
#if
#ifdef
#ifndef
#else
#elif
#endif
#include
LIMBAJUL C TEORIE I APLICAI I 132
#define
#undef
#line
#error
#pragma
Fiecare directiv trebuie s ocupe un singur rnd n program astfel :
#include < math.h> #include <conio.h> este greit.
Corect se scriu pe fiecare rnd
#include < math.h>
#include <conio.h>
Directiva #include.
Aceast directiv indic compilatorului c afar de fiierul surs trebuie s mai citeasc
i fiierele declarate dup aceast directiv.
Numele fiierului ce se include se va delimita de apostroafe duble nume fiier sau
paranteze unghiulare < nume fiier >.
Delimitarea cu dublu apostroafe sau paranteze unghiulare indic modul de cutare a
fiierului inclus astfel :
Includerea ntre < > indic cutarea fiierului n directorul INCLUDE din
pachetul de directoare i fiiere ale limbajului C.
Includerea ntre indic cutarea fiierului n directorul de lucru sau n alt
director la care se indic calea de cutare.
Modul de ncadrare ntre este folosit pentru a include fiierele create de utilizator
astfel :
#include erton1.c fiierul erton1.c este n directorul de lucru.
#include c:\tempc\sursa1\erton2.c fiierul erton2.c este situat n
directorul sursa1 de pe calea c:\tempc .
directiva #define .
directiva #define definete un indentificator prin nume i un ir de caractere care vor
nlocui indentificatorul la apariia acestuia n cadrul programului. Standardul ANSII C
numete indentificatorul nume ca macrocomand.
#define nume ir de caractere
#define pi 3.14156
la ntlnirea numelui pi n cadrul programuluisurs se va nlocui acest nume cu
valoarea 3.14156.
#define MAX 100

LIMBAJUL C TEORIE I APLICAI I 133


float v [MAX] ;

Numele MAX va fi nlocuit n program cu irul 100 , astfel la declararea mrimi


vectorului v s-a folosit indentificatorul MAX, care va fi nlocuit cu 100, rezultnd un
vector cu 100 de elemente.
#include <stdio.h>
#include <conio.h>
#define unu 1 definirea macroului unu ce va fi nlocuit cu
caracterul 1 la ntlnirea acestui macrou
#define doi unu+unu definirea macroului doi realizat prin imbricarea de
dou ori a macroului unu
#define ADEVARAT 1 definirea macroului ADEVARAT
#define FALS 0 definirea macroului FALS
#define eroare "textul de eroare la citirea fisierului"
definirea macroului eroare care va fi nlocuit la
apelarea lui cu irul de caractere delimitat de
dublu apostroafe
void main ()
{
printf (" %d %d ",ADEVARAT, FALS); va afia 1 0
printf ("primul macrou %d al doilea macrou %d \n",unu,doi);
va afia 1 2
printf (eroare); va afia textul de eroare la citirea fisierului
puts ("\n Apasa o tasta ");
getch ();
}
Dac lungimea irului de caractere ce va nlocui macroul nume este mai lung de un
rnd, se va separa rndul 1 de rndul 2 prin caracterul backslash \ astfel :
#define sir_lung acest sir de caractere este desfasurat pe doua rinduri \
primul rind este acesta \ al doilea rind este acestaaaaaaa
La apelarea acestui macrou prin funcia printf
printf (sir_lung) ;
Se va afia :
acest sir de caractere este desfasurat pe doua rinduri primul rind este
acesta al doilea rind este acestaaaaaaa

nlocuirea indentificatorului cu irul de caractere se face n toate apariiile
acestuia, exceptnd cazurile n care numele indentificatorului este n interiorul unui
comentariu sau intr-un ir de caractere.
#define max1 25
LIMBAJUL C TEORIE I APLICAI I 134
printf (afiseaza macroul =%d, max1) ; va afia valoarea 25 definit de
macroul max1
printf (max1) ; va afia irul de caractere max1, max1 este n cadrul
unui ir de caractere i nu este tratat ca i macroul max1 definit de directiva # define.
Dac se dorete ca de la o anumit poziie n cadrul fiierului surs s nu se mai aplice
directiva #define se va scrie :
#undef nume
ce acioneaz numai asupra indentificatorului ce are definiia nume .
Din acest punct se poate definiun alt indentificator cu acelea nume dar un alt ir de
caractere ce l definesc folosind directiva #define .
n cadrul directivei #define se poate declara o alt directiv anterior declarat,
numindu-se directive imbricate.
Numrul maxim de imbricare este de opt (8).
Utilizarea macrourilor este indicat n declaraii de tablouri cu unul sau dou
dimensiuni.Prin faptul c dac se dorete modificarea dimensiunilor tablourilor n
cadrul programului, se va face doar modificarea irului de caractere, din directiva
asociat numelui macroului folosit la declararea dimensiunii tablourilor, nefind
necesar modificarea dimensiunii tablourilor n fiecare loc unde apar declaraii de
tablouri.
#define MAX 25

float a[MAX], b [MAX][MAX] , c [MAX][MAX] ;

functia matad (floatp [MAX][MAX] );


{
.
}
..
dac se dorete ca dimensiunea tablourilor s fie modificat la valoarea de 40 se va
modifica doar irul de dup macroul MAX astfel :
#define MAX 40
care are ca efect modificarea peste tot unde este gsit macroul MAX cu noua valoare
de 40, inclusiv n cadrul funciei matad.
Macrourile definite de directiva #define dup nume poate avea i parametrii astfel:
#define nume(par1,par2,..parn) text
par1, par2,..parn sunt parametri formali ai macrourilor i reprezint nume.
text este textul de substituie i conine parametrii formali par1,par2 parn,
LIMBAJUL C TEORIE I APLICAI I 135
n exemplul ce urmeaz s-a creat un macrou min (x,y) care determin valoarea minim
dintre parametrul x i parametrul y .
#include <stdio.h>
#include <conio.h>
#define min(x,y) ((x)<(y)?(x):(y)) definirea macroului min (x,y),
parametrul1formal este x iar parametrul2 formal
este y
void main ()
{
int a,b,minim;
puts ("dati doua numere, se determina minimul dintre ele");
scanf ("%d,%d",&a,&b);
minim =min(a,b); apelarea macroului min (x,y) cu parametri efectivi
a,b
printf ("minimul dintre cele doua numere este =%d",minim);
puts ("\n Apasa o tasta ");
getch ();
}
n exemplul urmtor macro realizat afieaz iruri de caractere n funcie de
valoarea parametrilor efectivi de la apelarea macro test.
La apelarea macro test, tot irul de caractere delimitat de {} ia locul lui macro
test dup ce parametri fictivi au fost nlocuii cu parametri efectivi de la
apelare macro test.
#include <stdio.h>
#include <conio.h>
#define test(x,y) {float x,y ;if(x==1) puts ("primul numar este=1");else \
puts ("primul numar este diferit de 1");\
if(y<0) puts ("al doilea numar este negativ");else \
puts ("al doilea numar este pozitiv"); }
void main ()
{
float a,b;
puts ("dati doua numere, ");
scanf ("%f,%f",&a,&b);
test(a,b);
puts ("\n Apasa o tasta ");
getch ();
}
Substituirea apelului unui macro prin textul de substituie se numete
expandare.
ntre numele macro i paranteza ( din faa parametrilor fictivi nu se las spaiu,
n caz contrar att parantezele () de delimitare a parametrilor ct i restul de text se
consider un simplu ir de caractere care va nlocui macro n poziia unde a fost apelat.
LIMBAJUL C TEORIE I APLICAI I 136
Directiva #error.
Directiva #error indic compilatorului s sisteze compilarea la ntlnirea acestei
directive. Forma directivei #error este :
#error mesajul ce va fi afiat pe linia de mesaje a compilatorului
Mesajul ataat directivei #error nu se introduce ntre apostroafe sau dublu ghilimele, la
ntlnirea directivei #error se afieaz mesajul fr a fi prelucrat de compilator.
#include <stdio.h>
#include <conio.h>
void main ()
{
float a,b;
puts ("dati doua numere, ");
if (scanf ("%f,%f",&a,&b)==2)
{
puts ("\n Apasa o tasta ");
getch ();
}
else
#error s-a tastat caracter nenumeric;directiva error i mesajul ataat care va fi
afiat pe linia de mesaje la compilare i oprete la
acest nivel compilarea
}
Compilarea condiionat.
Directivele din acest pachet permit ca la execuia compilrii s se aleag din codul
surs poriunile care s se compileze mpreun funcie de resursele hard ale
calculatorului sau de versiunea compilatorului.
Compilarea condiionat folosete directivele :
#if
#else
#endif
#elif
Directiva #if.
Forma general a directivei #if este :
Mod1
#if expresie constanta
secventa de instructiuni
#endif
sau
Mod2
#if expresie constanta
secventa de instructiuni 1
#else
secventa de instructiuni2
#endif
LIMBAJUL C TEORIE I APLICAI I 137
Dac expresia constant are valoarea 1 (adevrat), se supune preprocesrii secvena de
instruciuni de dup if, sau n modul2 se va supune preprocesrii secvena de
instruciuni 1. Dup care se continu cu secvena de program de dup directiva #endif.
Dac expresia constant are valoarea 0 (fals), se supune preprocesrii secvena de
instruciuni de dup #endif, sau n modul2 se va supune preprocesrii secvena de
instruciuni 2 i apoi se continu cu secvena de dup #endif.
Expresia constant de dup #if trebuie s conin numai constante i indentificatori
definii anterior .
Expresia constant nu poate conine variabile.
n programul ce urmeaz s-a condiionat preprocesarea funcie de mrimea constantei
simbolice MIN
#include <stdio.h>
#include <conio.h>
#define MIN 40
void main ()
{
float a,b,c[MIN];
#if MIN <30 directiva #if compar MIN cu valoarea 30, dac
expresia este adevrat se continu compilarea cu
secvena de dup #if
{
printf ("marimea vectorului este sub 30");
exit (0);
}
#else dac expresia de la directiva #if este fals de
continu compilarea cu secvena de dup #else
{
puts ("dati doua numere, ");
if (scanf ("%f,%f",&a,&b)==2)
{
printf ("%f %f",a,b);
puts ("\n Apasa o tasta ");
getch ();
}
else
{
puts ("una sau ambele valori nu sunt numere ");
puts ("stop");
}
}
#endif indiferent c expresia de dup #if este adevrat
sau fals se continu compilarea cu secvena de
dup #endif
}
LIMBAJUL C TEORIE I APLICAI I 138
Directiva #elif.
Directiva #elif determin un lan de if else if pentru mai multe opiuni de
compilare.Directiva #elif este n interiorul directivei #if - #else, urmat de o expresie
constant.
Dac expresia este adevrat, blocul de cod ataat directivei #elif este compilat i se
continu compilarea cu blocul de cod de dup directiva #endif.
Forma general a directivei #elif este .
#if expresie
blocul de instructiuni
#elif expresia1
bloc de instructiuni
#elif expresia2
bloc de instructiuni
.
#elif expresia n
bloc de instructiuni
#endif
n exemplul urmtor se va condiiona compilarea n funcie de valoarea
constantei simbolice TARA.
#include <stdio.h>
#include <conio.h>
#define ROMANIA 0
#define UNGARIA 1
#define BULGARIA 2
#define RUSIA 3
#define TARA ROMANIA
#if TARA ==ROMANIA
char moneda [] ="leu";
#elif TARA==UNGARIA
char moneda [] ="forint";
#elif TARA==BULGARIA
#elif moneda [] ="leva";
#else
char oneda [] ="rubla";
#endif
void main ()
{
float a,b;
scanf ("%f,%f",&a,&b);
printf ("suma monedelor =%f %s\n",a+b,moneda);
puts ("apasa o tasta");
getch ();
}
La rularea programului se va afia ca unitate monetar lei, dac se dorete
modificarea unitii monetare, se va modifica doar constanta din directiva
LIMBAJUL C TEORIE I APLICAI I 139
#define TARA.
Directivele #ifdef i ifndef.
Directiva #ifdef (dac este definit) controleaz dac numele indentificatorului a fost
definit anterior prin directiva #define i blocul de cod ataat lui #ifdef va fi compilat,
dac nu se va continua compilarea cu blocul de cod de dup #else dac este prezent,
sau cu blocul de cod de dup #endif.
Forma directivei #ifdef este :
#ifdef nume macro (indentificator)
secventa instructiuni (bloc)
#else
secventa instructiuni
#endif
secventa instructiuni (bloc)
sau
#ifdef nume macro (indentificator)
secventa instructiuni (bloc)
#endif
secventa instructiuni (bloc)
Directiva #ifndef (dac nu este definit) controleaz dac numele indentificatorului nu a
fost definit anterior prin directiva #define i blocul de cod ataat lui #ifndef va fi
compilat, dac nu se va continua compilarea cu blocul de cod de dup #else dac este
prezent, sau cu blocul de cod de dup #endif.
Forma directivei #ifndef este :
#ifndef nume macro (indentificator)
secventa instructiuni (bloc)
#else
secventa instructiuni
#endif
secventa instructiuni (bloc)
sau
#ifndef nume macro (indentificator)
secventa instructiuni (bloc)
#endif
secventa instructiuni (bloc)
n programul urmtor se controleaz compilarea prin directivele #ifdef i #ifndef.
#include <stdio.h>
#define MAX 20
#include <conio.h>
LIMBAJUL C TEORIE I APLICAI I 140
void main ()
{
float a, b[MAX];
#ifdef MAX
puts ("marimea maxima a vectorului este definita");
#else
puts ("marimea maxima a vectorului nu este definita");
#endif
#ifndef MIN
puts ("constanta simbolica MIN nu este definita");
#endif
puts ("dati doua valori");
scanf ("%f,%f",&a,&b[1]);
printf ("suma =%f \n",a+b[1]);
puts ("apasa o tasta");
getch ();
}
Diectiva #line.
Directiva #line modific coninutul indentificatorilor predefinii _LINE_ i _FILE_ ai
compilatorului.
Indentificatorul _LINE_ conine numrul liniei compilate, iar indentificatorul _FILE_
conine numele fiieruluisurs compilat sub forma unui ir de caractere.
Forma general a directivei #line este :
#line numar numefisier
numar = este orice ntreg pozitiv care devine noua valoare a lui _LINE_ .
numefisier = este un ir de caractere care poate deveni un nume valid de
fiier ce va nlocui pe _FILE_
#include <stdio.h>
#line 20
void main ()
{
printf (numarul acestei linii compilate este =%d,_LINE_) ;
puts (apasati o tasta ) ;
getch ( ) ;
}
Dup rularea programului se va afia valoarea 23 , numrarea liniilor
compilate va ncepe cu valoarea 20 la compilarea liniei void main ().
Operatori de preprocesare # i ##.
Aceti operatori se folosesc cu directiva #define i realizeaz urmtoarele operaii.
# numit operator de niruire , transform argumentul pe care l precede ntr-un
ir de caractere delimitat de dublu apostroafe ir .
#include <stdio.h>
#define text(a) # a
LIMBAJUL C TEORIE I APLICAI I 141
void main ()
{
puts (functia printf va afisa textul inceput de drum in C \n) ;
printf (text(inceput de drum in C)) ;
}
Dup rularea programului se va afia pe ecran inceput de drum in C ca i cum acesta ar
fi fost ncadrat ntre la compilare.
## numit operator de lipire va concatena cele dou argumente ale directivei
#define, astfel la apelarea macro va rezulta ca i cum ar avea un singur argument.
#include <stdio.h>
#define text(a,b) a ##b
void main ()
{
float ab=5 ;
puts (functia printf va afisa valoarea lui ab=5 \n) ;
printf ( %d text(a,b)) ;
}
4. Grafic n C.
Compilatorul C de sub Dos are dou moduri de lucru pentru prezentarea
informaiei pe ecranul monitorului :
Modul text.
Modul grafic.
Pentru fiecare mod de lucru utilizatorul poate alege diferite rezoluii.
Diferena esenial ntre cele dou moduri const n felul n care se adreseaz cea mai
mic unitate adresabil pe ecran.
Modul text lucreaz cu celula caracter, ce este o matrice de pixeli, aceasta
reprezint unitatea adresabil pe ecran. n modul text ecranul este mprit n linii i
coloane.
Modul grafic lucreaz cu pixel, ce este cel mai mic punct afiabil pe ecran.
Dimensiunile pixelului depind de calitiile monitorului folosit ct i de placa grafic
ce pregtete datele afiabile.
Forma unui pixel este dreptunghilar, care influeneaz aspectul informaiei afiate pe
ecran. Pentru monitoarele de tip VGA sau SVGA nu mai este nevoie s se corecteze
aspectul pixelului, prin indicarea raportului aspectual, care poate fi considerat egal 1.
Biblioteca grafic este portabil sub sistemul de operare DOS i conine :
Constante.
Structuri de date predefinite.
Prototipul funciilor grafice.
Codurile funciilor.
Driverele pentru monitor i placa grafic.
Seturi de caractere.
Pentru a se putea lucra n mod grafic, fiierul surs trebuie s aibe incluse fiierele :
graphics.h graphics.lib *.bgi
LIMBAJUL C TEORIE I APLICAI I 142
4.1. Moduri grafice.
Calculatoarele personale folosesc pentru prezentarea informaiilor grafice sau text o
plac grafic i un monitor. Funcie de combinaia monitor i placa grafic se definete,
numrul de culori i rezoluia de afiare. Adaptorul grafic i draivrul grafic suportat de
biblioteca grafic se prezint n tabelul urmtor.
Adaptor Driver
Color graphics adapter CGA
Multi color graphics adapter MCGA
Enhanced graphics adapter EGA, EGAMONO
Video graphics array VGA
Hercules graphics adapter HERCMONO
AT&T 400line graphics adapter ATT400
3270 PC graphics adapter PC3270
IBM 8514 graphics adapter IBM8541
Fiecare adaptor poate opera n mai multe moduri, utilizatorul este cel care va specifica
modul de lucru. Driverul i adaptorul grafic trebuie s fie n concordan cu sistemul
video existent pe calculator
Pentru a determina corect resursa video a calculatorului, se va folosi funcia initgraph.
n tabelul urmtor se prezint drivere, modurile grafice suportate de compilatorul
Borland.
DRIVER MOD VALOARE DESCRIERE
CGA CGAC0 0 320X200X4COLOR
CGAC1 1 320X200X4COLOR
CGAC2 2 320X200X4COLOR
CGAC3 3 320X200X4COLOR
CGAHI 4 640X200X2COLOR
MCGA MCGAC0 0 320X200X4COLOR
MCGAC1 1 320X200X4COLOR
MCGAC2 2 320X200X4COLOR
MCGAC3 3 320X200X4COLOR
MCGAMED 4 640X200X2COLOR
MCGAHI 5 640X480X2COLOR
EGA EGAL0 0 640X200X16COLOR
EGAHI 1 640X350X16COLOR
EGA64 EGA64L0 0 640X200X16COLOR
EGA64HI 1 640X350X16COLOR
EGAMONO EGAMONOHI 3 640X200X2COLOR
VGA VGAL0 0 640X200X16COLOR
VGAMED 1 640X350X16COLOR
VGAHI 2 640X480X16COLOR
ATT400C0 MCGAC0 0 320X200X4COLOR
LIMBAJUL C TEORIE I APLICAI I 143
ATT400C1 1 320X200X4COLOR
ATT400C2 2 320X200X4COLOR
ATT400C3 3 320X200X4COLOR
ATT400MED 4 640X200X2COLOR
ATT400HI 5 640X400X2COLOR
HERC HERCMONO 0 720X348X2COLOR
PC3270 PC3270HI 0 640X350X2COLOR
IBM8514 IBM8514L0 0 640X80X256COLOR
IBM8514HI 1 1024X768X256COLOR
4.2. Sisteme de cordonate.
n modul de lucru grafic ecranul monitorului este considerat o hart de pixeli,
poziionarea pe aceast hart se efectueaz prin indicarea cordonatelor x i y.
Numrul de pixeli pe orizontal i vertical este determinat de modul video obinut prin
funcia initgraph.
Biblioteca grafic folosete dou sisteme de cordonate astfel :
Sistemul de cordonate global (fizic ), cu originea sistemului n colul din
stnga sus aecranului.
Sistemul de cordonate al ferestrei de afiare (local), cu originea sistemului
n colul din stnga sus al ferestrei.
Axa pozitiv x se desfoar de la stnga la dreapta, iar axa pozitiv y de sus n jos, att
pentru sistemul global ct i sistemul local.
Sistemul global este folosit pentru poziionarea ferestrelor, implicit a sistemelor de
cordonate locale. Zona de afiare grafic implicit este tot ecranul i cele dou sisteme
de cordonate sunt identice.Poziia de lucru este dat de cursorul grafic, ce reprezint
punctul curent al pixelului, asupra cruia se va aplica noua comand.
Cursorul grafic este folosit ca punct de start n funciile grafice, iar poziia acestuia este
pstrat n cordonatele locale ale ferestrei active.
Poziia cursorului grafic poate fi modificat prin funciile moveto i moverel, sau
implicit prin aciunea funciilor lineto i outtext.
4.3. Culori i palete de culori.
n modul grafic fiecare pixel de pe ecran este caracterizat prin cordonatele x, y,
culoare. Culoarea pixelului este pstrat ca o valoare n paleta de culori curent.
Paleta de culori poate avea de la 2 la 256 de culori, n funcie de modurile suportate de
sistemul video al calculatorului. Adaptoarele EGA i VGA folosesc o palet de 16
culori prezentat n tabelul urmtor :
CONSTANTA DE CULOARE VALOARE INDEX DE PALET
EGA_BLACK 0 0
LIMBAJUL C TEORIE I APLICAI I 144
EGA_BLUE 1 1
EGA_GREEN 2 2
EGA_CYAN 3 3
EGA_RED 4 4
EGA_MAGENTA 5 5
EGA_LIGHTGRAY 7 6
EGA_BROWN 20 7
EGA_DARKGRAY 56 8
EGA_LIGHTBLUE 57 9
EGA_LIGHTGREEN 58 10
EGA_LIGHCYAN 59 11
EGA_LIGHTRED 60 12
EGA_LIGHTMAGENTA 61 13
EGA_YELLOW 62 14
EGA_WHITE 63 15
4.4. Moduri de umplere.
Funciile bar, bar3d, fillpoly i floodfill sunt folosite pentru a crea desene pline.
Pentru a crea aceste desene pline, este necesar s se foloseasc diferite modele de
umplere, ct i culori de umplere. Culoarea i modelul de umplere sunt controlate prin
funciile setfillpattern i setfillstyle.
Modelele de umplere sunt prezentate n tabelul urmtor.
CONSTANT VALOARE SEMNIFICAIE
EMPTY_FILL 0 Fr umplere
SOLID_FILL 1 Umplere cu culoare curent
LINE_FILL 2 Umplere cu linii orizontale
LITSLASH_FILL 3 Umplere cu slash-uri subiri
SLASH_FILL 4 Umplere cu slash-uri groase
BKSLASH_FILL 5 Umplere cu backslash-uri groase
LTBKSLASH_FILL 6 Umplere cu backslash-uri subiri
HATCH_FILL 7 Umplere cu deschizturi mici
XHATCH_FILL 8 Umplere cu deschizturi mari
INTERLEAVE_FILL 9 Umplere cu model ntreesut
WIDE_DOT_FILL 10 Umplere cu model punctat rar
CLOSE_DOT_FILL 11 Umplere cu model punctat des
USER_FILL 12 Umplere cu model definit de
utilizator
4.5. Stiluri de linii.
Majoritatea funciilor de desenare folosesc diferite modele de linii.
LIMBAJUL C TEORIE I APLICAI I 145
Stilul de linie descrie modelul de linie, grosimea de linie.
Modelul de linie poate fi ales dintre modele din biblioteca sau poate fi definit de
utilizator. n tabelul ce urmeaz se prezint modelele predefinite.
CONSTANT VALOARE SEMNIFICAIE
SOLID_LINE 0 Linie continu
DOTTED_LINE 1 Linie punctat
CENTER_LINE 2 Linie punctat centrat
DASHED_LINE 3 Linie intrerupt din linii
USERBIT_LINE 4 Linie definit de utilizator
Grosimea liniei poate avea dou valori de 1 pixel sau de 3 pixeli.
n tabelul ce urmeaz sunt prezentate valorile pentru grosimea liniei.
CONSTANTA VALOAREA SEMNIFICAIA
NORM_WIDTH 1 Grosimea de 1 pixel
THICK_WIDTH 3 Grosimea de 3 pixeli
4.6. Afiarea textului n mod grafic.
Funciile de afiare printf, sprintf i cprintf folosite n mod text, nu pot fi folosite n
modul grafic. Pentru prezentarea n modul grafic a textului se folosesc funcii
specificecum ar fi :
Gettextseting.
Outtext.
Outtextxy.
Settextjustify.
Settextstyle.
Textheight.
Pentru a lucra cu aceste comenzi, s-a prevzut o hart de 8x8 bii i 4 fonturi vectoriale
folosite la afiarea textului.
n tabelul se prezint fonturile folosite :
CONSTANT VALOARE SEMNIFICAIE
DEFAULT_FONT 0 Hartde 8x8 bii
TRIPLEX_FONT 1 Font vectorial triplex
SMALL_FONT 2 Font vectorial mic
SANS_SERIF_FONT 3 Font vectorial san_serif
GOTHIC_FONT 4 Font vectorial gotic
Dac compilatorul folosit accept versiunea Borland 3.1, la lista de fonturi prezentat
n tabelul se mai adaug un numr de 6 fonturi.
CONSTANT SEMNIFICAIE
BOLD_FONT font vectorial aldin
LIMBAJUL C TEORIE I APLICAI I 146
COMPLEX_FONT font vectorial complex
EUROPEAN_FONT font vectorial european
SCRIPT_FONT font vectorial de mn
SIMPLEX_FONT font vectorial simplex
TRIPLEX_SCRIPT_FONT font vectorial triplex de mn
Scrierea textului se poate efectua de la stnga la dreapta sau de jos n sus, apelnd dou
constante HORIZ_DIR i VERT_DIR.
Valorile acestor constante sunt 0 i respectiv 1.
Aezarea textului n raport cu poziia cursorului grafic se realizeaz cu funcia
settextjustify ce folosete urmtoarele constante :
Pentru aliniere orizontal se prezint n tabelul constantele i semnificaia lor.
CONSTANT VALOARE SEMNIFICAIE
LEFT_TEXT 0 Aliniat la stinga
CENTER_TEXT 1 Aliniat centrat
RIGHT_TEXT 2 Aliniat la dreapta
Pentru aliniere vertical se prezint n tabelul constantele i semnificaia lor.
CONSTANT VALOARE SEMNIFICAIE
BOTTOM_TEXT 0 Aliniat jos
CENTER_TEXT 1 Aliniat centrat
TOP_TEXT 2 Aliniat sus
4.7. Tipuri de date folosite n funciile grafice.
Pentru utilizarea funciilor grafice sunt necesare un anumit tip de date, care pot
fi : structuri, constante, ntregi.
arccoordstype
Transmiterea argumentelor funciei getarccoords se efectueaz printr-o dat de tip
structur numit arccoordstype astfel :
struct
{
int x,y ;
int xstar,ystar ;
int xend, yend ;
} ;
Unde x,y sunt coordoatele centrului cercului din care face parte arcul.
Xstar, ystar sunt coordonatele punctului de unde ncepe arcul .
LIMBAJUL C TEORIE I APLICAI I 147
Xend , yend sunt coordonatele punctului de sfrit a arcului.
Datele din structur pot fi folosite pentru a creea alte entiti legate de punctele
specifice ale arcului.
fillsettingstype
Tip de dat structur folosit la transmiterea argumentului funciei getfillsetting ce
conine setrile pentru umplerea suprafeelor.
Structura lui fillsettingstype este :
struct fillsettingstype
{
int pattern ;
int color :
};
Unde pattern este o valoare ntreag ce indic modelul de umplere conform
tabelului .
Color este o valoare de tip ntreg ce indic culoarea de umplere
conform tabelului .
Graphics_errors
Este o constant de tip enumerare ce conine codurile de eroare rezultate la
apelarea funciei graphresult, folosit pentru depanarea programelor de grafic cu erori.
n tabelul seprezint codul de eroare, constanta i mesajul de eroare.
COD DE
EROARE
CONSTANT MESAJ DE EROARE
0 grOK Nici o eroare
-1 grNoInitGraph Driverul grafic BGI neinstalat
-2 GrNotDetectd Placa grafic negsit
-3 GrFileNotFound Fiierul pentru driverul grafic negsit
-4 GrInvalidDriver Fiierul invalid pentru driver grafic
-5 GrNoLoadMem Memorie insuficient pentru driver grafic
-6 GrNoScamMem Memorie insuficient pentru fillpoly
-7 GrNoFloodMem Memoria insuficient pentru floodfill
-8 GrFontNotFound Fiier de font negsit
-9 GrNoFontMem Memorie insuficient pentru fonturi
-10 GrInvalidMode Mod grafic nepermis pentru driver grafic
-11 GrError Eroare grafic
-12 GrIError Eroare grafic de intrare-ieire
-13 GrInvalidFont Fiier de font invalid
-14 GrInvalidFontNum Numr de font invalid
-15 GrInvalidDeviceNum Numr de driver invalid
-18 grInvalidVersion Numr de versiune invalid
LIMBAJUL C TEORIE I APLICAI I 148
Linesettingstype
Dat de tip structur folosit pentru transmiterea argumentelor funciilor
getlinesetting i setlinestyle prin care se stabilete modelul i grosimea linilor.
Struct linesettingstype
{
int linestyle ;
unsigned upattern
int thicknes
}
linestyle determin cu ce model de linie vor fi desenate liniile de la acest
moment pn la o nou modificare a modelului.
Upattern determin modelul de umplere ce a fost n prealabil definit de
utilizator, aceast dat se folosete dac linestyle are valoarea USSERBIT_LINE.
Thicknes determin grosimea liniilor.
Palettetype

Dat de tip structur predefinit prin care se transmit argumentele funciei
getpalette, setpalette, setallpalette, prin indicarea numrului de culori din palet i
culoarea.
Struct palettetype
{
unsigned char size ;
signed char colors [MAXCOLORS +1] ;
}
size conine numrul de culori ale paletei curente,
colors este un tablou de tip vector, a crui mrime este egal cu size octei i
conine valoarea numeric pentru fiecare culoare din palet.
MAXCOLORS
MAXCOLORS este o constant ce conine numrul maxim de intrri n
paleta de culori a structurii palettetype. Valoarea acestei constante depinde de driverul
i modul grafic setat n cadrul sistemului.
Pointttype
Pointtype este o dat de tip structur care este folosit pentru reprezentarea unui punct.
Structura conine cele dou cordonate x,y ale punctului.
struct pointtype
{
int x;
LIMBAJUL C TEORIE I APLICAI I 149
int y;
}
textsettingstype
Dat de tip structur folosit de funcia gettextsettings pentru transmiterea
parametrilor. Funcia gettextsettings citete setrile curente pentru textul n mod
grafic.
Struct textsettingstype
{
int font ;
int direction ;
int charsize ;
int horiz ;
int vert ;
}
font reprezint fontul folosit la afiarea textului,
direction o valoare numeric 0 sau 1 ce indic direcia de scriere a textului,
charsize indic mrimea caracterelor folosite la scrierea i afiarea textului,
horiz reprezint o valoare numeric 0,1,2 ce indic modul de aliniere pe
direcia orizontal a textului,
vert reprezint o valoare numeric 0,1,2 ce indic modul de aliniere pe direcia
vertical a textului.
Viewporttype
Dat de tip structur folosit pentru transmiterea argumentelor funciei getviewsetting,
ce conine setrile curente ale ferestrei de afiare.
Struct viewporttype
{
int left ;
int top ;
int right ;
int bottom ;
int clip ;
}
left reprezint coordonata fizic a marginii din stnga a ferestrei curente,
top reprezint coordonata fizic a marginii superioare a ferestrei curente,
right reprezint coordonata fizic a marginii din dreapta a ferestrei curente,
bottom reprezint coordonata fizic a marginii inferioare a ferestrei curente,
clip reprezint atributul de decupare, care indic dac elementele desenate pot
fi reprezentate i n afara ferestrei curente, n caz contrar entitiile sunt tiate n afara
ferestrei curente.
LIMBAJUL C TEORIE I APLICAI I 150
4.8. FUNCII DE DESENARE.
4.8.1. ARC.
Funcia arc permite desenarea unui arc de cerc, la care utilizatorul va indica pe rnd:
Centrul cercului din care face parte arcul prin coordonatele x i y.
Unghiul de unde ncepe desenarea arcului.
Unghiul unde se termin desenarea arcului.
Raza cercului din care face parte arcul.
Desenarea arcului se face de la unghiul de nceput i se continu n sens trigonometric
pn la unghiul de terminare.
Valoarea 0 a unghiului este considerat quadrantul din dreapta centrului cercului.
Trasarea arcului se execut innd cont de grosimea liniei de desenare, dar nu permite
trasarea dect cu linie continu.
Prototipul funciei arc este :
Void far arc (int x,int y, int startangle, int endangle, int radius);
Funcia nu returneaz nici o valoare.
Valorile pentru x i y trebuie s fie pozitive i mai mici dect valorile maxime ale
ecranului de desenare, mrimea unghiurilor de start i de sfrit se indic n grade
sexazecimale, iar raza n uniti folosite la dimensionarea ecranului.
Exemplu.
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
# include <stdlib.h>
void main ()
{ Acest pachet de instruciuni i definirea
variabilelor pn la apelarea funciei setfillstyle
este comun majoritii programelor ce folosesc
funciile grafice, care vor fi descrise n capitolele
urmtoare.
int gdriver = DETECT,gmode,errorcode;
unsigned long s;
int xmax,ymax;
puts ("desenarea arcului de cerc");
getch ();
clrscr ();
xmax=getmaxx();ymax=getmaxy();
initgraph(&gdriver,&gmode," "); iniializarea modului grafic
setviewport(0,0,getmaxx(),getmaxy(),0); definirea zonei curente de desenare,
errorcode=graphresult();
if(errorcode!=grOk)
printf("Eroare grafica: %s\n",grapherrormsg(errorcode));
LIMBAJUL C TEORIE I APLICAI I 151
cleardevice(); tergerea coninutului ecranului grafic,
setcolor (RED); setarea culorii de desenare pe culoarea rou
setfillstyle (SOLID_FILL,RED);setarea tipului de umplere i culoarea

arc (50,50,0,180,25); desenarea arcului cu centru cercului la
coordonatele x=50, y=50, unghiul de start =0,
unghiul de sfrit =180 grade i raza =25 uniti
culoarea de desenare este rou.
arc (100,50,90,270,25); desenarea arcului cu centru cercului la
coordonatele x=100, y=50, unghiul de start =90,
unghiul de sfrit =270 grade i raza =25 uniti
culoarea de desenare este rou.
arc (150,50,0,-90,25); desenarea arcului cu centru cercului la
coordonatele x=150, y=50, unghiul de start =0,
unghiul de sfrit =-90 grade i raza =25 uniti
culoarea de desenare este rou.
setcolor (BLUE); setarea culorii de desenare pe culoarea albastru
(BLUE)
arc (150,100,0,270,50); desenarea arcului cu centru cercului la coordonatele
x=150, y=100, unghiul de start =0, unghiul de
sfrit =270 grade i raza =50 uniti culoarea de
desenare este albastru.
getch ();
}
4.8.2. Bar
Funcia bar deseneaz o bar dreptunghiular plin, culoarea de umplere este inpus de
funcia setfillstyle. Conturul barei nu este scos n eviden, de aceia se recomand
culoarea de umplere s fie diferit de culoarea de fond a ferestrei curente pentru
desenare. Prototipul funciei bar este -.
void far bar (int left, int top, int right, int bottom);
int left colul din stnga,
int top colul de sus,
int right colul din dreapta,
int bottom colul de jos,
Exemplu.
# include <stdio.h>
# include <conio.h>
LIMBAJUL C TEORIE I APLICAI I 152
# include <graphics.h>
void main ()
{
int gdriver = DETECT,gmode,errorcode;
int xmax,ymax;
clrscr (); tergerea ecranului n mod text,
initgraph(&gdriver,&gmode," ");iniializarea modului grafic
xmax=getmaxx();ymax=getmaxy();detectarea valorilor coordonatelor x, y ale
colului dreapta jos pentru driverul detectat,
setviewport(0,0,xmax,ymax,0);definirea zonei curente de desenare,
printf ("x max=%d y max=%d",xmax,ymax); xmax=639, ymax=479 i
reprezint coordonatele maxime ale colului din
dreapta jos, pentru driverul i modul grafic
detectat automat de gdriver, funcie de resursele
hard ale calculatorului,
errorcode=graphresult();
if(errorcode!=grOk)
printf("Eroare grafica: %s\n",grapherrormsg(errorcode));
getch ();
cleardevice(); tergerea coninutului ecranului grafic,
setfillstyle (SOLID_FILL,RED);se seteaz culoarea de umplere rou i modelul de
umplere linie solid plin
bar (100,100,300,479); se deseneaz o bar plin cu culoarea roie , colul
din stnga sus de coordonate 100, 100 i colul din
dreapta jos de coordonate 300,479,
setfillstyle (SOLID_FILL,BLUE); se seteaz culoarea de umplere albastru i modelul
de umplere linie solid plin
bar (300,240,638,450); se deseneaz o bar plin cu culoarea albastr,
colul din stnga sus de coordonate 300, 240 i
colul din dreapta jos de coordonate 638,450.
puts ("apasa o tasta");
getch ();
}
4.8.3. Bar3d
Funcia bar3d deseneaz o prism dreapt cu baza un dreptunghi, la care utilizatorul va
indica punctele caracteristice. Spre deosebire de funcia bar, funcia bar3d deseneaz
muchiile prismei cu culoarea de desenare setat, iar faa 1 (frontal) este umplut cu
culoarea i modelul date de funcia setfillstyle . Prin parametrul topflag funcia bar3d
va contura sau nu faa superioar a prismei.
Prototipul funciei bar3d este :
Void far bar3d (int left, int top, int right, int bottom, int depth, int topflag);
LIMBAJUL C TEORIE I APLICAI I 153
int left colul din stnga,
int top colul de sus,
int right colul din dreapta,
int bottom colul de jos,
int drepth adncimea prizmei dreptunghiulare, reprezentat prin uniti de
pixeli
int topflag are valoarea 0 sau pozitiv, dac valoarea este 0 nu se deseneaz
faa superioar, dac valoarea este pozitiv se va desena faa superioar a
prismei.
Exemplu.
n cadrul acestui exemplu se indic doar liniile de cod specifice utilizrii funciei
bar3d, pentru a realiza ntregul fiier se va aduga pachetul de linii de cod de nceput
prezentat n fiierul anterior.
cleardevice();
setfillstyle (SOLID_FILL,RED); se seteaz culoarea de umplere rou i modelul de
umplere linie solid plin
bar3d (100,100,300,479,30,1); se deseneaz o bar 3d plin cu culoarea roie ,
colul din stnga sus de coordonate 100, 100 i
colul din dreapta jos de coordonate 300,479,
adncimea de 30 pixeli, faa superioar a barei
este reprezentat.
Muchiile prizmei sunt desenate cu culoarea
implicit, n cazul de fa alb.
setfillstyle (SOLID_FILL,BLUE); se seteaz culoarea de umplere albastru i
modelul de umplere linie solid plin
setcolor (RED); se seteaz culoarea de desenare rou care va fi
culoarea de desenare a muchiilor barei3d,
bar3d (300,240,538,400,10,0); se deseneaz o bar plin cu culoarea albastr,
colul din stnga sus de coordonate 300, 240 i
colul din dreapta jos de coordonate 538,400,
adncimea de 10 pixeli, faa superioar a barei
este nereprezentat (topflag=0).
Muchiile prismei sunt desenate cu culoarea setat,
n cazul de fa rou.
.
puts ("apasa o tasta");
getch ();
}
LIMBAJUL C TEORIE I APLICAI I 154
4.8.4. Circle
Funcia circle deseneaz un cerc la care utilizatorul indic cordonatele x,y ale centrului
cercului i raza. Culoarea de desenare este culoarea curent, setat prin setcolor. Linia
de desenare a cercului poate avea grosime, dar tipul de linie este continu indiferent de
modelul de linie setat.
Prototipul funciei circle este ;
Void far circle (int x, int y, int radius);
int x coordonata x a centrului cercului,
int y coordonata y a centrului cercului,
int radius raza cercului exprimat n pixeli.
Exemplu.
cleardevice();
setfillstyle (SOLID_FILL,RED);
circle (50,50,25); deseneaz un cerc cu centru de coordonate x=50,
y=50 i raza =25, culoarea de desenare alb,
culoare setat implicit.
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
circle (100,200,50); deseneaz un cerc cu centru de coordonate x=100,
y=200 i raza =50, culoarea de desenare roie,
culoare setat prin funcia setcolor.
puts ("apasa o tasta");
getch ();
}
4.8.5. Rectangle
Funcia rectangle deseneaz un dreptunghi, la care utilizatorul va preciza colul
dinstnga sus i colul din dreapta jos. Culoarea de desenare a dreptunghiului ct i
modelul , stilul liniei de desenare sunt cele curente. Spre deosebire de funcia bar
conturul dreptunghiului este desenat cu culoarea curent i poate fi umplut cu o
anumit culoare sau model prin funcia floodfill.
Prototipul funciei rectangle este :
Void far rectangle (int left, int top, int right, int bottom) ;
int left colul din stnga,
int top colul de sus,
int right colul din dreapta,
int bottom colul de jos,
LIMBAJUL C TEORIE I APLICAI I 155
Exemplu
cleardevice();
setfillstyle (SOLID_FILL,RED);
rectangle (50,50,450,60); deseneaz un dreptunghi cu colul stnga sus de
coordonate x=50, y=50, iar colul dreapta jos de
coordonate x=450, y=60, dreptunghi dezvoltat pe
orizontal de culoare alb.
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
rectangle (150,200,160,400); deseneaz un dreptunghi cu colul stnga sus de
coordonate x=150, y=200, iar colul dreapta jos de
coordonate x=160, y=400, dreptunghi dezvoltat
pe vertical de culoare rou,
puts ("apasa o tasta");
getch ();
}
4.8.6. Line
Funcia line deseneaz o linie (un segment de dreapt) ntre dou puncte specificate de
utilizator, cu culoarea, tipul de linie setat anterior apelri funciei line. Poziia
cursorului grafic nu este modificat de funcia line.
Prototipul funciei line este :
Void far line (int x1, int y1, int x2, int y2) ;
int x1 coordonata x a primului punct ce delimiteaz linia,
int y1coordonata y a primului punct ce delimiteaz linia ,
int x2 coordonata x a celui de-al doilea punct ce delimiteaz linia,
int y2 coordonata y a celui de-al doilea punct ce delimiteaz linia,
Exemplu.
cleardevice();
setfillstyle (SOLID_FILL,RED);
line (50,50,450,50); deseneaz o linie orizontal ntre punctele de
coordonate x=50, y=50 i x=450, y=50, culoarea
i stilul liniei setat anterior,
line (60,70,60,200); deseneaz o linie vertical ntre punctele de
coordonate x=60, y=70 i x=60, y=200, culoarea
i stilul liniei setat anterior,
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
LIMBAJUL C TEORIE I APLICAI I 156
line (150,200,360,300); deseneaz o linie nclinat ntre punctele de
coordonate x=150, y=200 i x=360, y=300,
culoarea roie i stilul liniei setat anterior,
puts ("apasa o tasta");
getch ();
}
4.8.7. Moveto
Funcia moveto plaseaz cursorul grafic n punctul de coordonate x, y
specificate de utilizator prin argumentele funciei.
Deplasarea cursorului grafic ntr-un punct este necesar naintea apelrii funciilor
linerel, lineto, outtext, moverel.
Prototipul funciei move este :
Void far move (int x,int y) ;
int x coordonata x a punctului de poziionare pentru cursorul grafic,
int y coordonata y a punctului de poziionare pentru cursorul grafic,
4.8.8. linerel
funcia linerel deseneaz un segment de dreapt din poziia curent a
cursorului grafic, la punctul situat relativ fa de poziia cursorului grafic prin
deplasrile dx, dy . Deplasrile relative dx i dy pot avea valori pozitive, nule sau
negative. Linia desenat respect culoarea, stilul i modelul setate anterior apelrii
funciei linerel. Se recomand ca anterior apelrii funciei linerel s se apeleze funcia
move pentru poziionarea cursorului grafic n poziia dorit.
Prototipul funciei linerel este :
Void far linerel (int dx, int dy) ;
int dx deplasarea relativ a captului segmentului de dreapt pe direcia axei x
n raport cu poziia cursorului grafic,
int dy deplasarea relativ a captului segmentului de dreapt pe direcia axei y
n raport cu poziia cursorului grafic.
Exemplu
cleardevice();
setfillstyle (SOLID_FILL,RED);
LIMBAJUL C TEORIE I APLICAI I 157
moveto (50,50); poziionarea cursorului grafic n punctul de
coordonate x=50, y=50, necesar pentru trasarea
segmentului de dreapt din acest punct,
linerel (400,0); desenarea segmentului de dreapt din poziia
cursorului grafic, apelat prin funciia anterioar
moveto, la noul punct declarat prin coordonatele
relative dx=400, dy=0, rezult o dreapt
orizontal indentic cu dreapta obinut prin
apelarea funciei line (50,50,450,50);din exemplul
anterior.Folosirea acestui mod de trasare a unei
linii permite simplificarea argumentelor de
apelare a funciilor de desenare.
moveto (60,70); poziionarea cursorului grafic n punctul de
coordonate x=60, y=70, necesar pentru trasarea
segmentului de dreapt din acest punct,
linerel (0,130); desenarea segmentului de dreapt din poziia
cursorului grafic, apelat prin funciia anterioar
moveto, la noul punct declarat prin coordonatele
relative dx=0, dy=130, rezult o dreapt vertical
identic cu dreapta obinut prin apelarea funciei
line (60,70,60,200);
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
moveto (150,200); poziionarea cursorului grafic n punctul de
coordonate x=150, y=200, necesar pentru trasarea
segmentului de dreapt din acest punct,
linerel (210,100); desenarea segmentului de dreapt din poziia
cursorului grafic, apelat prin funciia anterioar
moveto, la noul punct declarat prin coordonatele
relative dx=210, dy=100, rezult o dreapt
nclinat identic cu dreapta obinut prin apelarea
funciei line (150,200,360,300);
puts ("apasa o tasta");
getch ();
}
4.8.9. lineto
funcia lineto deseneaz un segment de dreapt din poziia curent a cursorului grafic la
punctul de coordonate, x, y specificate n argumentele funciei.
LIMBAJUL C TEORIE I APLICAI I 158
Linia desenat respect culoarea, stilul i modelul setate anterior apelrii funciei
lineto. Se recomand ca anterior apelrii funciei lineto s se apeleze funcia move
pentru poziionarea cursorului grafic n poziia dorit.
Prototipul funciei lineto este :
void far lineto (int x, int y) ;
int x coordonata x a punctului de terminare pentru linia desenat,
int y coordonata y a punctului de terminare pentru linia desenat,
Exemplu.
cleardevice();
setfillstyle (SOLID_FILL,RED);
moveto (50,50);
lineto (450,50); deseneaz un segment de dreapt din poziia
curent a cursorului grafic indicat de funcia
moveto, la punctul de coordonate x=450, y=50,
rezult o dreapt orizontal identic cu dreapta
trasat prin funciile line (50,50,450,50); i linerel
(400,0);din exemplele anterioare,
moveto (60,70);
lineto (60,200); deseneaz un segment de dreapt din poziia
curent a cursorului grafic indicat de funcia
moveto, la punctul de coordonate x=60, y=200,
rezult o dreapt vertical identic cu dreapta
trasat prin funciile line (60,70,60,200); i linerel
(0,130); din exemplele anterioare,
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
moveto (150,200);
lineto (360,300); desenarea segmentului de dreapt din poziia
cursorului grafic, apelat prin funciia anterioar
moveto, la noul punct declarat prin coordonatele
x=360, y=300, rezult o dreapt nclinat identic
cu dreapta obinut prin apelarea funciilor line
(150,200,360,300); i linerel (210,100);
puts ("apasa o tasta");
getch ();
}
4.8.10. moverel
Funcia moverel poziioneaz cursorul grafic relativ fa de vechea poziie cu
deplasarile dx i dy indicate prin argumentele funciei.
Valorile deplasrilor dx i dy pot avea valori negative, nule sau pozitive.
LIMBAJUL C TEORIE I APLICAI I 159
Prototipul funciei moverel este :
Void far moverel (int dx, int dy) ;
int dx =deplasarea pe direcia axei x,
int dy = deplasarea pe direcia axei y.
Funcia moverel este folosit dup apelarea funciei setviewport, datorit faptului
c poziia curent a cursorului grafic devine 0,0 raportat la colul stnga sus a ferestrei
curente de desenare.
Exemplu.
cleardevice();
setviewport(150,150,xmax,ymax,0);definirea zonei curente de afiare grafic, cu
colul stnga sus dat de coordonatele x=150,
y=150, ce are ca efect i poziionarea cursorului
grafic n colul stnga sus a ferestrei curente.
setfillstyle (SOLID_FILL,RED);
moverel (50,50); deplasarea relativ a cursorului grafic cu dx=50,
dy=50 fa de vechea poziie a acestuia,
lineto (450,50); desenarea noilor entiti raportate la noua poziie
a cursorului grafic n noua fereastr,
moveto (60,70);
lineto (60,200);
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
moveto (150,200);
lineto (360,300);
puts ("apasa o tasta");
getch ();
}
4.8.11. drawpoly
Funcia drawpoly permite desenarea unei polilinii cu un numr de vrfuri specificat de
utilizator ct i coordonatele x, y ale fiecrui vrf.
Dac se dorete realizarea unei polilinii nchise (poligon) este necesar ca numrul de
vrfuri s fie cu 1 mai mare dect numrul de vrfuri ale poligonului i coordonatele
ultimului vrf s fie indentice cu coordonatele primului vrf.
Desenarea poliliniei se face cu culoarea, tipul de linie i modelul curent.
Prototipul funciei drawpoly este :
Void far drawpoly (int numr vrfuri, int far*puncte) ;
Int numr vrfuri = numrul de vrfuri ale poliliniei sau poligonului,
*puncte coordonatele x, y ale punctelor ce indic vrfurile, este un tablou de
tip vector cu mrimea egal cu numrul de vrfuri x 2.
LIMBAJUL C TEORIE I APLICAI I 160
Astfel :
puncte [0] = coordonata x a vrfului 1,
puncte [1] = coordonata y a vrfului 1,
puncte [2] = coordonata x a vrfului 2,
puncte [3] = coordonata y a vrfului 2,
..
puncte [2n-2] = coordonata y a vrfului n.
Exemplu.
int xmax,ymax, puncte [10],puncte1 [10]; declararea tablourilor puncte i
puncte1 care conin coordonatele x,y ale
vrfurilor poliliniei,

cleardevice();
setviewport(100,100,xmax,ymax,0);
setfillstyle (SOLID_FILL,RED);
setcolor (RED);
puncte [0]=20; atribuirea coordonatei x a primului vrf,
puncte [1]=10; atribuirea coordonatei y a primului vrf,
puncte [2]=40; atribuirea coordonatei x a vrfului 2,
puncte [3]=10; atribuirea coordonatei y a vrfului 2,
puncte [4]=40;
puncte [5]=20;89
puncte [6]=20;
puncte [7]=20;
puncte [8]=20; atribuirea coordonatei x a ultimului vrf identic
cu coordonata primului vrf,
puncte [9]=10; atribuirea coordonatei y a ultimului vrf identic
cu coordonata primului vrf,
drawpoly (5,puncte); desenarea unei polilinii cu 5 vrfuri la care vrful
1 este identic cu vrful 5, rezult un patrulater
(poligon nchis),
puncte1 [0]=200; atribuirea coordonatei x a primului vrf, pentru o
nou polilinie,
puncte1 [1]=100;
puncte1 [2]=400;
puncte1 [3]=100;
puncte1 [4]=300;
puncte1 [5]=200;
puncte1 [6]=20;
puncte1 [7]=50;
puncte1 [8]=120;
puncte1 [9]=130;
drawpoly (5,puncte1); desenarea unei polilinii deschise cu 5 vrfuri,
coordonatele vrfurilor find n tabloul puncte1,
puts ("apasa o tasta");
getch ();
LIMBAJUL C TEORIE I APLICAI I 161
}
4.8.12. ellipse
Funcia ellipse deseneaz un arc de elips la care utilizatorul precizeaz prin
argumentele funciei :
centru elipsei, unghiul de nceput, unghiul de sfrit i cele dou raze pe
direciile x,y.
Desenarea arcului de elips ncepe de la unghiul de nceput n sens trigonometric spre
unghiul de sfrit. Valoarea 0 a unghiului este considerat quadrantul din dreapta a
elipsei din care face parte arcul de elips. Trasarea arcului este n concordan cu
culoarea , grosimea liniei dar pentru modelul de linie folosete tipul continu.
Prototipul funciei ellipse este :
Void far ellipse (int x, int y, int unghi_inceput, int unghi_sfrit, int xraza, int
yraza) ;
int x= coordonata x a centrului elipsei din care face parte arcul,
int y= coordonata x a centrului elipsei din care face parte arcul,
int unghi_inceput =mrimea unghiului de inceput a arcului de elips,
int unghi_sfrit=mrimea unghiului de sfrit a arcului de elips,
int xraza=raza elipsei pe direcia x,
int yraza) =raza elipsei pe direcia y ;
Exemplu
cleardevice();
setfillstyle (SOLID_FILL,RED);
ellipse (100,200,0,90,40,80);deseneaz un arc de elips cu centrul n punctul de
coordonate x=100, y=200, cu unghiul de nceput 0
iar unghiul de sfrit =90, raza pe x=40, raza pe y
=80.
Dac cele dou raze sunt egale rezult un arc de
cerc.
ellipse (200,200,0,-45,40,100); deseneaz un arc de elips cu centrul n punctul
de coordonate x=200, y=200, cu unghiul de
nceput 0 iar unghiul de sfrit =-45, raza pe
x=40, raza pe y =100 care are ca efect desenarea
unui arc de elips ce se desfoar pe 7 pri din
cele 8 pri ale elipsei.
puts ("apasa o tasta");
getch ();
}
4.8.13. fillellipse
Funcia fillellipse deseneaz o elips complet. Culoarea de desenare i modul de
umplere sunt alese funcie de setrile curente. Parametrii funciei fillelipse sunt centrul
LIMBAJUL C TEORIE I APLICAI I 162
elipsei i cele dou raze pe direciile x i y. Dac cele dou raze sunt egale elipsa
desenat este un cerc plin.
Prototipul funciei fillellipse este :
Void far fillellipse (int x, int y, int razax, int razay) ;
int x = coordonata x a centrului elipsei,
int y = coordonata y a centrului elipsei,
int razax =mrimea razei elipsei pe direcia x,
int razay =mrimea razei elipsei pe direcia y,
Exemplu
cleardevice();
setfillstyle (SOLID_FILL,BLACK);setarea culorii de umplere indentic cu culoarea de
fond ferestrei de desenare, care va crea iluzia c
elipsa este trasat numai prin conturul ei,
fillellipse (100,200,40,80);desenarea elipsei cu centrul n punctul de coordonate
x=100, y=200 i razele rx=40, ry=80,
setfillstyle (SOLID_FILL,RED);setarea culoriide umplere pe rou,
fillellipse (200,200,100,50); desenarea elipsei care va avea culoarea de contur alb
i culoarea de umplere rou,
puts ("apasa o tasta");
getch ();
}
4.8.14. fillpoly
Funcia fillpoly deseneaz o polilinie nchis (poligon ) la care se va specifica
numrul de vrfuri i coordonatele x,y ale acestor vrfuri. Spre deosebire de funcia
drawpoly, funcia fillpoly nu cere s se specifice ca ultimul vrf s fie indentic cu
primul vrf i nchide automat linia poligonal de la ultimul vrf indicat la primul vrf
al acesteia.Tabloul ce conine coordonatele vrfurilor are mrimea dubl fa de
numrul de vrfuri.Primul termen al tabloului ce conine coordonatele x,y reprezint
coordonata x a primului vrf.
Prototipul funciei fillpoly este :
Void far fillpoly (int numr_vrfuri, int far*puncte) ;
int numr_vrfuri = numrul de vrfuri ale poliliniei sau poligonului,
*puncte= coordonatele x, y ale punctelor ce indic vrfurile, este un tablou de
tip vector cu mrimea egal cu numrul de vrfuri x 2.

Exemplu
LIMBAJUL C TEORIE I APLICAI I 163
cleardevice();
setviewport(100,100,xmax,ymax,0);
setfillstyle (SOLID_FILL,RED);
setcolor (RED);
puncte [0]=20; atribuirea coordonatei x a primului vrf,
puncte [1]=10; atribuirea coordonatei y a primului vrf,
puncte [2]=40; atribuirea coordonatei x a vrfului 2,
puncte [3]=10; atribuirea coordonatei y a vrfului 2,
puncte [4]=40;
puncte [5]=20;
puncte [6]=20;
puncte [7]=20; atribuirea coordonatei y a ultimului vrf
fillpoly (4,puncte); desenarea poligonului cu 4 vrfuri, culoarea de
umplere rou i culoarea de desenare alb
puncte1 [0]=200;
puncte1 [1]=100;
puncte1 [2]=400;
puncte1 [3]=100;
puncte1 [4]=300;
puncte1 [5]=200;
fillpoly (3,puncte1); desenarea poligonului cu 3 vrfuri (triunghi)
puts ("apasa o tasta");
getch ();
}
4.8.15. floodfill
Funcia floodfill umple zona nchis care conine punctul specificat de
utilizator prin coordonatele x,y. Modelul i culoarea de umplere sunt cele setate curent
prin funcia setfillstyle. Punctul care determin entitatea ce se umple trebuie s fie n
interiorul entitii i nu pe conturul ei. Entitiile asupra crora funcia floodfill sunt :
circle (cercul), rectangle (dreptunghiul).
Prototipul funciei floodfill este :
Void far floodfill (int x, int y, int margine) ;
int x= coordonata x a punctului interior a entitii ce se umple cu culoare i
model ,
int y= coordonata y a punctului interior a entitii ce se umple cu culoare i
model ,
int margine =culoarea entitii care conine punctul specificat.
Exemplu
cleardevice();
setfillstyle (SOLID_FILL,BLUE);
setcolor (RED);
rectangle (50,50,200,300);
LIMBAJUL C TEORIE I APLICAI I 164
setcolor (GREEN);
circle (300,200,50);
floodfill (100,150,RED); umplerea entitii ce conine punctul de
coordonate 100,150 n cazul de fa dreptunghiul
care are ca i culoare de grani culoarea rou ,
umplerea se face cu culoarea albastru,
floodfill (300,200,GREEN); umplerea entitii ce conine punctul de
coordonate 300,200 n cazul de fa cercul care
are ca i culoare de grani culoarea verde ,
umplerea se face cu culoarea albastru,
puts ("apasa o tasta");
getch ();
}
4.8.16. outtext
Funcia outtext permite afiarea unui ir de caractere, la poziia curent a
cursorului grafic.Se recomand ca anterior apelrii funciei outtext s se apeleze funcia
moveto pentru poziionarea cursorului grafic n poziia de unde s fie afiat textul. irul
de caractere afiat de funcia outtext poate fi direct specificat n apelarea funciei ct i
prin apelarea unui tablou de caractere ce conine textul.
Alinierea , culoarea, fontul, mrimea i direcia textului sunt cele curente.
Poziia cursorului grafic este influenat de funcia text numai n cazul alinierii la
stnga i direcia orizontal, n acest caz cursorul grafic se poziioneaz la terminarea
textului afiat. Dac irul de caractere afiat de funcia outtext depete marginile
zonei curente de afiare se trunchiaz.
Prototipul funciei outtext este :
Void far outtext (char *far ir de caractere) ;
char *far ir de caractere= irul de caractere ce se afieaz sau denumirea
tabloului ce conine irul de caractere.
Exemplu

char text1 [30]; declararea unui tablou ce va conine un ir de


caractere
int xmax,ymax;
clrscr ();
puts ("dati textul");
scanf ("%s",text1); citirea irului de caractere ce va fi memorat n
tabloul text1
.
cleardevice();
setcolor (RED);
outtext ("scriere pe prima linie stinga "); apelarea funciei de afiare a textului
scriere pe prima linie stinga , care va fi poziionat
LIMBAJUL C TEORIE I APLICAI I 165
pe prima linie i prima coloan a ferestrei de
afiare (la poziia curent a cursorului grafic,)
setcolor (GREEN);
outtext ("text 2 in continuarea primului text"); funcia outtext va afia noul ir de
caractere la noua poziie a cursurului grafic, care
se afl la sfritul irului de caractere de la
apelarea anterioar a funcieiouttext,
circle (300,200,50);
moveto (300,200); deplasarea cursorului grafic n centrul cercului,
outtext ("scrierea din centrul cercului"); afiarea textului din centrul cercului,
datorit funciei moveto care a poziionat cursorul
grafic.
moveto (200,100);
outtext (text1); preluarea textului de afiat din tabloul text1.
getch ();
}
4.8.17. outtextxy
Funcia outtextxy ca i funcia outtext afieaz irul de caractere specificat prin
parametri funciei, dar afiarea se ncepe din punctul de coordonate x,y. Toate
informaiile de la funciaouttext rmn valabile i la funcia outtextxy.
Prototipul funciei outtextxy este :
Void far outtextxy (int x, int y, char far*ir de caractere) ;
int x=coordonata x a punctului de unde ncepe afiarea textului,
int y=coordonata y a punctului de unde ncepe afiarea textului,
char *far ir de caractere= irul de caractere ce se afieaz sau denumirea
tabloului ce conine irul de caractere.
Exemplu

char text1 [30];


int xmax,ymax;
clrscr ();
puts ("dati textul");
scanf ("%s",text1);

cleardevice();
setcolor (RED);
outtextxy (100,200,"scriere din punctul x=100,y=200 "); apelarea funciei
outtextxy care va afia irul de caractere scriere
din punctul x=100,y=200 ncepnd din punctul
de coordonate x=100, y=200,
setcolor (GREEN);
LIMBAJUL C TEORIE I APLICAI I 166
outtextxy (200,300,text1); funcia outtextxy va prelua irul de caractere din
tabloul text1 i l va afia de la punctul de
coordonate x=200, y=300,
getch ();
}
4.8.18. pieslice
Funcia pieslice permite desenarea unui sector de cerc i umple acest sector de
cerc cu modelul, culoarea i tipul de linie curent.
Utilozatorul va preciza coordontele x,y ale centrului cercului, valoarea
unghiului de nceput, a unghiului de terminare i raza cercului.
Desenarea sectorului de cerc are loc de la valoarea cea mai mic a unghiului
spre valoarea cea mai mare a unghiului indiferent de ordinea de introducere a valorilor.
Exist o singur situaie cnd sectorul de cerc se deseneaz n sens trigonometric de la
unghiul pozitiv la unghiul negativ dac una sau ambele valori sunt negative.
Prototipul funciei pieslice este :
Void far pieslice (int x, int y, int unghi start, int unghi terminare, int raza);
int x= coordonata x a centrului cercului din care face parte sectorul de cerc,
int y= coordonata y a centrului cercului din care face parte sectorul de cerc,
int unghi start=valoarea unghiului de start,
int unghi terminare=valoarea unghiului de terminare,
int raza=mrimea razei cercului din care face parte sectorul de cerc.
Exemplu
cleardevice();
setcolor (RED);
pieslice (200,200,45,20,25); desenarea sectorului de cerc de la unghiul cu
valoare minim la unghiul cu valoare maxim (de
la 20 la 45 grade,)
pieslice (300,200,20,45,25);sectorul de cerc desenat este de aceea mrime
unghiulara ca i n cazul precedent
setcolor (GREEN);
pieslice (100,300,0,90,25);desenarea sectorului de cerc de la 0 la 90 grade cu
aceea deschidere unghiular ca n cazul ce
urmeaz,
pieslice (200,300,90,0,25);
pieslice (300,300,45,-90,25);desenarea sectorului de cerc de la unghiul de 45
grade n sens trigonometric la unghiul de
terminare 90 grade,
LIMBAJUL C TEORIE I APLICAI I 167
pieslice (350,300,-90,45,25);desenarea unui sector de cerc cu aceea deschidere
unghiular ca i n cazul precedent, una din valori
este negativ,
pieslice (400,300,-45,-90,25);desenarea sectorului de cerc de la 45 la 90 de
grade, ambele valori unghiulare sunt negative,
pieslice (350,400,0,-90,25);desenarea sectorului de cerc de la 0 la 90 grade n
sens trigonometric, valoarea 0 este considerat
pozitiv,
getch ();
}
4.8.19. putpixel
Funcia putpixel deseneaz pe ecranul grafic la coordonatele x,y un pixel de
culoarea specificat prin parametrii funciei.
Prototipul funciei putpixel este :
Void far putpixel (int x, int y, int culoare) ;
int x=coordonata x a punctului de pozoionare a pixelului,
int y=coordonata y a punctului de pozoionare a pixelului,
int culoare=culoarea de afiare a pixelului.
Exemplu
cleardevice();
setbkcolor (BLACK); setarea culori de fond pe negru
for (i=1;i<=10;i++)
{
putpixel (200+i,210,RED); trasarea unei linii orizontaledin 10 pixeli de
culoare rou,
putpixel (200,200+i,GREEN);trasarea unei linii verticale de 10 pixeli de culoare
verde,
}
getch ();
}
4.8.20. sector
Funcia sector deseneaz un sector de elips ntre unghiurile specificate.
Sectorul de elips este desenat de la unghiul cu valoare minim la unghiul cu valoare
maxim dac ambele valori ale unghiurilor au acela semn. Dac una din valurile
unghiulare este negativ, desenarea sectorului de elips se efectueaz n sens
trigonometric de la unghiul de start la unghiul de terminare.
Umplerea sectorului de elips se face cu modelul i tipul de linie setat, iar conturul
sectorului se realizeaz cu culoarea setat de funcia setcolor.
LIMBAJUL C TEORIE I APLICAI I 168
Prototipul funciei sector este :
Void far sector (int x, int y, int unghiul de start, int unghiul de terminare, int
razax, int razay);
int x = coordonata x a centrului elipsei,
int y = coordonata y a centrului elipsei,
int unghiul de start=valoarea unghiului de start,
int unghiul de terminare=valoarea unghiului de terminare nceput,
int razax =mrimea razei elipsei pe direcia x,
int razay =mrimea razei elipsei pe direcia y.
Exemplu
cleardevice();
setbkcolor (BLACK);
setcolor (RED);
sector (100, 200, 0, 90,20, 40);desenarea unui sector de elips ntre unghiurile 0,
90, sectorul face parte din elipsa cu centrul n
punctul de coordonate x=100, y=200 i cele dou
semiaxe de 20 pe x, 40 pe y,
sector (100,300,90,0,20,40);desenarea unui sector de elips cu aceea deschidere
unghiular ca n cazul anteriuor, dac unghiurile
sunt de acela semn, trasarea se face de la unghiul
mic la unghiul mare,
sector (200,300,0,-90,20,40);trasarea sectorului de elips se face de la unghiul
pozitiv la unghiul negativ n sens trigonometric
(de la dreapta la stnga,)
sector (300,300,-90,0,20,40);
sector (300,400,-80,-20,20,40);dac ambele unghiuri sunt negative, desenarea
sectorului de elips se face de la unghiul mai
negativ la unghiul mai puin negativ n sens
trigonometric,
sector (400,400,-20,-80,20,40);
getch ();
}
4.9. Funcii pentru setarea variabilelor in mod grafic
4.9.1. Setallpalette
Funcia setallpalette permite modificarea tuturor culorilor din paleta curent cu culorile
coninute n noua palet de culori specificat ca parametru.
Prototipul funciei setallpalette este :
Void far setallpalette (struct palettetype far*paleta);
LIMBAJUL C TEORIE I APLICAI I 169
struct palettetype far*paleta=noua palet .
4.9.2. setbkcolor
Funcia setbkcolor permite schimbarea culori fondului .
Prototipul funciei setbkcolor este :
Void far setbkcolor (int culoare) ;
int culoare= valoarea numeric sau numele constantei de culoare scris cu
majuscule BLACK.
4.9.3. Setcolor
Funcia setcolor determi culoarea curent de desenare pentru text,linii, arce.
Prototipul funciei setcolor este :
Void far setcolor (int culoare) ;
int culoare= valoarea numeric sau numele constantei de culoare
scris cu majuscule BLUE.
4.9.4. setpalette
Funcia setpalette modific n paleta curent o singur culoare cu o alt
culoare.
ndicarea culorilor se face prin valoarea numeric sau prin numele constantei de
culoare scris cu majuscule.
Prototipul funciei setpalette este :
Void far setpalette (int numrul culori din palet, int noua culoare) ;
int numrul culori din palet= valoare ntreag 0 la 15,
int noua culoare = valoarea numeric sau numele constantei de culoare scris
cu majuscule GREEN.
Exemplu
cleardevice();
setbkcolor (2); setarea culori pentru fundal la valoarea 2
(GREEN),
setpalette (1,62); schimbarea culori 1(BLUE) n paleta de culori cu
culoarea 62 (YELLOW),
setcolor (1); setarea culori de desenare pe culoarea 1
LIMBAJUL C TEORIE I APLICAI I 170
sector (100, 200, 0, 90,20, 40); se deseneaz un sector de elips pe fond verde,
culoarea de desenare galben, culoarea de
umplere alb (culoare nemodificat de funciile
apelate,)
getch ();
}
4.9.5. setfillstyle
Funcia setfillstyle determin culoarea i modul de umplere curent, parametrii
funciei vor indica modelul de umplere i culoarea.
Modelul creat de utilozator nu poate fi folosit prin intermediul acestei funcii, acest
model se va ncrca prin funcia setfillpatern.
Prototipul funcie setfillstyle este :
Void far setfillstyle (int patern, int culoare) ;
int patern= valoarea numeric sau denumirea constantei ce indic modelul de
umplere conform tabelului ,
int culoare= valoarea numeric sau numele constantei de culoare scris cu
majuscule GREEN.
4.9.6. setfillpattern
Funcia setfillpattern permite setarea unui model de umplere creeat de
utilizator i setarea culorii de umplere.
Prototipul funciei este :
Void far setfillpattern (char far*patern1, int culoare) ;
char far*patern1= modelul de umplere creeat de utilizator prin intermediul
unui tablou de 8 caractere ce conine 8 valori care indic dac pixelul corespunztor va
avea valoarea curent sau va avea valoarea neschimbat,
int culoare= culoarea de umplere.
Exemplu
char text1 [30], patern1 [8]=
{0x00,0x10,0x18,0x11,0x11,0x28,0x00,0x10}; creearea unuimodel de umplere
de ctre utilizator prin scrierea valorilor n tabloul
patern1 care va fi ales ca parametru la apelarea
funciei setfillpattern,
int xmax,ymax,i;

cleardevice();
setcolor (1);
LIMBAJUL C TEORIE I APLICAI I 171
setfillpattern (patern1,15); setarea modelului de umplere pentru un model
creat de utilizator prin indicarea valorilor din
tabloul patern1, culoarea de umplere este 15,
sector (100, 200, 0, 270,60, 140);desenarea sectorului de elips cu modelul de
umplere creat de utilizator, setat anterior ca model
curent,
getch ();
}
Exemplu
.
cleardevice();
setcolor (1);
setfillstyle (7,15); alegerea modelului de umplere corespunztor
valorii 7 i alegerea culorii de umplere
corespunztoare valorii 15 =alb,
sector (100, 200, 0, 270,60, 140);desenarea unui sector de elips cu modelul de
umplere setat anterior i culoarea de umplere alb,
getch ();
}
4.9.7. setlinestyle
Funcia setlinestyle permite alegerea stilului, modelului i al grosimii liniei de
desenare.
Prototipul funciei setlinestyle este :
Void far setlinestyle (int stilul liniei, unsigned model, int grosime) ;
int stilul liniei= o valoare numeric sau o constant ce definete stilul liniei
0==SOLID_LINE sau 1==DOTTED_LINE..,
unsigned model =un model de 16 bii care indic cum va arta linia ,
valoarea 0xFFFF indic o linie continu
valoarea 1101101101101101 indic o linie punctat cu 2 pixeli aprini, un
pixel stins ,
int grosime= o valoare =1 pentru grosimea de un pixel, valoare =3 pentru
grosimea liniei de 3 pixeli.
Exemplu
cleardevice();
setcolor (1);
LIMBAJUL C TEORIE I APLICAI I 172
setlinestyle (0,0xAAAA,3);setarea stilului de linie pe tipul continu =0 cu
grosimea de 3 pixeli, modelul utilizatorului nu
influeneaz aspectul liniei,
line (100,80,400,80); desenarea unei lini continue
setlinestyle (4,1111100001111101,3); stilul liniei este definit de utilizator prin
valoarea 4, iar modelul de linie definit de
utilizator este de 5 pixeli aprini, 4 pixeli stini, 5
pixeli aprini, 1 pixel stins, 1 pixel aprins,
line (100,100,400,100); linia ce se deseneaz va respecta modelul de linie
creeat de utilizator i setat prin funcia
setlinestyle,
setlinestyle (4,0xAAAA,3); setarea unui nou stil de linie cu un nou model
creeat de utilizator prin 0xAAAA,
line (100,120,400,120);
getch ();
}
4.9.8. settextjustify
Funcia settextjustify seteaz modul de aliniere orizontal i vertical al textului
n raport cu poziia curent a cursorului grafic. Parametrii funciei settextjustify trebuie
s fie n concordan cu valorile numerice sau a constantelor grafice din tabelul .
Prototipul funciei settextjustify este :
Void far settextjustify (int orizontal, int vertical) ;
int orizontal = valoare numeric 0, 1, 2 sau constantele LEFT_TEXT,
CENTER_TEXT sau RIGHT_TEXT ce indic alinierea textului pe orizontal,
int vertical =valoare numeric 0, 1, 2, sau constantele BOTTOM_TEXT,
CENTER_TEXT, TOP_TEXT.
Alinierea implicit orizontal este la stnga iar alinierea vertical este
TOP_TEXT.
Exemplu
n acest exemplu s-au folosit drepte ca reper pentru compararea alinierii textului
n raport cu aceste drepte. Prin funcia moveto s-a poziionat cursorul grafic la
inceputul dreptei din zona unde se va afia textul.
cleardevice();
settextjustify (0,0); alinierea orizontal la stnga iar vertical jos,
setcolor (4);
moveto (200,40); poziionarea cursorului grafic la captul
segmentului de dreapt,
outtext ("aliniat stinga jos"); afiarea textului cu setrile de aliniere date de
funcia settextjustify i poziionarea acestuia la
cursorul grafic,
line (200,40,200,60); afiarea liniei folosit ca reper,
LIMBAJUL C TEORIE I APLICAI I 173
settextjustify (1,0); modificarea alinierii orizontale la varianta centrat
la poziia cursorului grafic,
moveto (250,80);
outtext ("aliniat centrat jos");
line (250,80,250,100);
settextjustify (2,0); modificarea alinierii orizontale la varianta dreapta
la poziia cursorului grafic,
moveto (270,100);
outtext ("aliniat dreapta jos");
line (270,100,270,120);
settextjustify (0,1); modificarea alinierii verticale la varianta centrat la
poziia cursorului grafic,
moveto (290,120);
outtext ("aliniat stinga centrat");
line (290,120,290,140);
getch ();
}
4.9.9. settextstyle
Funcia settextstyle seteaz caracteristicile fontului cu care se va afia textul.
Caracteristicile ce se modific sunt :
Fontul.
Direcia de scriere a fontului.
Dimensiunea fontului.
Parametrii funciei settextstyle pot lua valori numerice sau constante grafice conform
tabelelor
Pentru direcie valoarea implicit este 0= HORIZ_DIR, iar pentru mrimea fontului se
folosesc valori nte 1 i 10.
Prototipul funciei settextstyle este :
Void far settextstyle (int font, int direcie, int mrimea caracterului) ;
int font =valoare numeric 0 la4 sau constante grafice DEFAULT_FONT,
TRIPLEX_FONT, SMALL_FONT, SAN_SERIF_FONT, GOTHIC_FONT care indic
noul font pentru afiarea textului,
int direcie= valoare numeric 0, 1 sau constanta grafic HORIZ_DIR,
VERT_DIR care indic sensul de scriere a textului, vertical =scriere pe direcia
vertical la 90 grade de jos n sus,
int mrimea caracterului= valoare numeric 0 la 10.
Exemplu
cleardevice();
settextjustify (0,0);
setcolor (4);
moveto (200,40);
LIMBAJUL C TEORIE I APLICAI I 174
settextstyle (TRIPLEX_FONT,0,0);alegerea fontului triplex cu direcia de scriere
orizontal,
outtext ("font triplex orizontal");
settextstyle (GOTHIC_FONT,0,0); alegerea fontului gotic cu direcia de scriere
orizontal,
moveto (250,80);
outtext ("GOTIC FONT ORIZONTAL ");
settextstyle (DEFAULT_FONT,0,2); alegerea fontului hart de bii cu direcia de
scriere orizontal i mrimea 2,
moveto (270,100);
outtext ("FONT HARTA DE BITI 2");
settextstyle (0,1,2); alegerea fontului hart de biicu direcia de scriere
vertical i mrimea 1,
moveto (150,320);
outtext ("text pe verticala");
getch ();
}
4.9.10. setviewport
Funcia setviewport seteaz mrimea zonei curente de afiare, prin indicarea
colului stnga sus i a colului dreapta jos. Dup setarea ferestrei de afiare (zonei)
cursorul grafic se poziioneaz la coordonatele 0,0 (colul stnga sus al ferestrei de
afiare).
Funciile care folosesc coordonate se vor raporta la un sistem ce are originea n colul
stnga sus al ferestrei curente.
La intrarea n modul grafic zona curent de afiare este tot ecranul cu coordonatele 0, 0
n colul stnga sus.
Pentru a modifica mrimea ferestre este necesar s se apelez din nou funcia
setviewport cu noi parametri. Coordonatele colurilor ferestrei sunt raportate la
sistemul general x, y, cu originea sistemului n colul stnga sus al ecranului
monitorului. Pentru a terge coninutul ferestrei active se va folosi funcia
clearviewport () ; , iar pentru a terge tot coninutul ecranului grafic se va folosi funcia
cleardevice ();.
Prototipul funciei setviewport este :
Void far setviewport (int stnga, int sus, int dreapta, int jos, int clip) ;
int stnga=coordonata x a colului 1 al ferestrei,
int sus= coordonata y a colului 1 al ferestrei,
int dreapta= coordonata x a colului 2 al ferestrei,
int jos= coordonata y a colului 2 al ferestrei,
int clip=valoare 0 sau diferit care indic dac elementele ce depesc
fereastra se deseneaz sau se truncheaz.
LIMBAJUL C TEORIE I APLICAI I 175
Exemplu
cleardevice(); funcia cleardevice () terge coninutul ecranului
grafic,
setbkcolor (1); setarea culori de fond pe albastru,
setviewport (100,100,400,400,0); setarea ferestrei de desenare, afiare cu
coordonatele colului stnga sus x=100, y=100, iar
colul dreapta jos x=400, y=400, entitiile ce se
deseneaz pot depi fereastra (nu sunt
trunchiate,)
rectangle (0,0,300,300);desenarea dreptunghiului la limitele ferestre curente
moveto (200,40); deplasarea cursorului grafic n raport cu
coordonatele relative ale ferestrei curente,
line (0,0,300,300); linia desenat are coordonatele raportate la
sistemul ferestrei curente, ct i textul afiat cu
funcia ce urmeaz,
outtext ("in fereastra");
moveto (305,80);
outtext ("inafara ferestrei");acest text apare pe ecran numai dac parametrul de
trunchiere al ferestrei curenteare valoarea 0, cum
este cazul de fa, dac acest parametru este trecut
pe 1 , acest text nu este afiat,
getch (); continuarea execuiei programului condiionat de
apsarea unei taste
setcolor (4);
setviewport (0,0,500,479,1);setarea unei noi ferestre de afiare, care va controla
entitile ce se vor desena, aceast fereastr are
parametrul de trunchiere pe valoarea 1, nu va afia
zona de entiti ce depesc conturul ferestrei,
coninutul primei ferestre nu este ters datorit
faptului c nu s-a apelat funciile cleardevice sau
clearviewport,
rectangle (5,5,500,470);acest dreptunghi se ncadreaz n noua fereastr i va
apare n totalitate pe ecran,
moveto (200,40); poziionarea cursorului grafic se raporteaz la
noua fereastr,
outtext ("aliniat la fereastra2");
line (10,20,80,70);
getch ();
}
4.9.11. cleardwvice
Funcia cleardevice tot coninutul ecranului grafic, umple tot ecranul cu
culoarea de fond curent.
Poziia cursorului grafic este n colul stnga sus al ferestre curente de afiare desenare.
LIMBAJUL C TEORIE I APLICAI I 176
Prototipul funciei este :
Void far cleardevice ();
4.9.12. clearviewport
Funcia clearviewport terge coninutul ferestrei curente de afiare desenare i
poziioneaz cursorul grafic n colul stnga sus al ferestre curente.
Prototipul funciei clearviewport este :
Void far clearviewport ();
Exemplu
cleardevice();
setbkcolor (1);
setviewport (100,100,400,400,0);
rectangle (0,0,300,300);
moveto (200,40);
line (0,0,300,300);
outtext ("in fereastra");
moveto (305,80);
outtext ("inafara ferestrei");
getch ();
clearviewport (); aceast linie de cod este introdus n plus fa de
exemplul anterior cu scopul de a terge coninutul
ferestrei curente de afiare desenare, care are ca
efect c textul in fereastr, dreptunghiul ce
delimita fereastra curent ct i diagonala nu vor
mai fi afiate dup executarea acestei linii de cod,
textul inafara ferestrei nu este afectat datorit
poziionri lui nafara ferestrei curente,
setcolor (4);
setviewport (0,0,500,479,1);
rectangle (5,5,500,470);
moveto (200,40);
outtext ("aliniat la fereastra2");
line (10,20,80,70);
getch ();
}
4.10. Funcii de interogare a sistemului.
4.10.1. getarccoords
funcia getarccoords returneaz intr-o structur de date coordonatele x,y ale centrului
cercului din care face parte ultimul arc desenat, coordonatele x,y ale punctelor de
nceput i sfrit ale arcului. Structura de date spre care pointeaz funcia getarccoords
este de tipul arccoordstype .
LIMBAJUL C TEORIE I APLICAI I 177
Prototipul funciei getarccoords este :
Void far arccoords (struct arccoordtype far*arccoords) ;
struct arccoordtype far*arccoords=structura de tip arccoordtype n care se rein
coordonatele punctelor caracteristice ale ultimului arc desenat.
Exemplu .
struct arccoordstype ar; declararea structurii ar de tipul arccoordstype n
care se vor returna elementele caracteristice ale
ultimuluiarc, determinate de funcia getarccoords,

cleardevice();
setbkcolor (2);
setviewport (0,0,500,470,0);
rectangle (0,0,300,300);
arc (100,150,0,90,50); desenarea arcului cu elementele x centru=100,
ycentru=150, unghiul de start 0, unghiul de sfrit
90 i raza=50,
getarccoords (&ar); interogarea ultimului arc desenat, returnarea
coordonatelor punctelor caracteristice n structura
ar,
printf ("x centru=%d y centru =%d \n",ar.x, ar.y); afiarea coordonatelor
centrului arcului desenat anterior prin apelarea
datelor x,y din structura ar,
printf ("x start=%d y start=%d \n",ar.xstart,ar.ystart); afiarea coordonatelor
x,y ale punctului de start ale arcului , prin apelarea
datelor xstart, ystart din structura ar,
printf ("x sfirsit= %d y sfirsit = %d ",ar.xend , ar.yend); afiarea coordonatelor
x,y ale punctului de sfrit ale arcului , prin
apelarea datelor xend, yend din structura ar,
setcolor (4);
line (ar.x,ar.y,ar.xend,ar.yend); desenarea liniei din centrul arcului la punctul de
sfrit al arcului,
line (ar.x, ar.y, ar.xstart, ar.ystart);desenarea liniei din centru arcului la punctul
de start ale arcului,
getch ();
}
4.10.2. getbkcolor
Funcia getbkcolor returneaz valoarea numeric a culorii de fond la momentul
emiterii funcii. Funcia getbkcolor returneaz o valoare de tip intreg (int) i are
prototipul :
LIMBAJUL C TEORIE I APLICAI I 178
Int far getbkcolor (void) ;
4.10.3. getcolor
Funcia getcolor returneaz valoarea numeric de tip ntreg a culorii curente
de desenare i are prototipul :
Valoarea numeric corespunztoare culorii este n concordan cu tipul
modelului grafic detectat de funcia detectgraph.
Int far getcolor (void);
Exemplu

int xmax,ymax,i, fond, culoare; declararea variabilelor fond, culoare pentru


reinerea valorilor returnate de funciile
getbkcolor i getcolor,

cleardevice();
setbkcolor (2); setarea culori de fond pe valoarea 2,
setcolor (4); setarea culori de desenare pe valoarea 4,
setviewport (0,0,500,470,0);
fond =getbkcolor (); apelarea funciei getbkcolor pentru determinarea
culoriide fond i returnarea acesteia n variabila
fond,
culoare =getcolor (); apelarea funciei getcolor pentru determinarea
culoriide de desenare i returnarea acesteia n
variabila culoare,
printf ("culoarea de fond =%d \n",fond); afiarea valorilor detectate pentru fond
i culoare de desenare n dou variante :
1 prin variabilele fond, culoare
2 prin apelarea direct a funciilor de interogare a
culorii
printf ("culoarea de desenare=%d \n",culoare);
printf ("culoarea de desenare =%d",getcolor ());
getch ();
}
4.10.4. getgraphmode
Funcia getgraphmode returneaz valoarea modului grafic curent. Apelarea
funcieise face dup iniializarea modului grafic. Valoarea returnat este de tip intreg
(int,) i are prototipul :
Int far getgraphmode (void) ;
LIMBAJUL C TEORIE I APLICAI I 179
4.10.5. getmaxmode
Funcia getmaxmode returneaz cea mai mare valoare pentru mod a driverului
curent, valoarea returnat este de tip intreg (int) i are prototipul :
Int far getmaxmode (void) ;
4.10.6. getmaxx
Funcia getmaxx returneaz coordonata x maxim acceptat de ecranul grafic, funcie
de driverul i modul grafic detectate la iniializarea modului grafic.
Valoarea returnat este de tip intreg i este cu o unitate mai mic dect rezoluia pe
orizontal a ecranului, datorit numerotrii cu valoarea 0 a primei coloane.
Prototipul funciei getmaxx este :
int far getmaxx (void) ;
4.10.7. getmaxy
Funcia getmaxy returneaz coordonata y maxim acceptat de ecranul grafic, funcie
de driverul i modul grafic detectate la iniializarea modului grafic.
Valoarea returnat este de tip intreg i este cu o unitate mai mic dect rezoluia pe
vertical a ecranului, datorit numerotrii cu valoarea 0 a primei linii.
Prototipul funciei getmaxy este :
int far getmaxy (void) ;
Exemplu
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
void main ()
{
int gdriver = DETECT,gmode,errorcode;
int xmax,ymax,i, fond, culoare;
clrscr ();
initgraph(&gdriver,&gmode," ");
xmax=getmaxx();ymax=getmaxy();apelarea funciilor pentru detectarea
rezoluiei ecranului pe orizontal i vertical,
cleardevice();
setviewport (0,0,500,470,0);
puts (" ");
printf (" rezolutia pe orizontala =%d \n",xmax+1);
printf (" rezolutia pe verticala=%d \n",ymax+1);
printf (" modelul grafic =%d \n",getgraphmode ());afiarea valorii modelului
grafic curent,
printf (" modelul maxim=%d \n",getmaxmode ());afiarea valorii modelului
grafic maxim acceptat,
LIMBAJUL C TEORIE I APLICAI I 180
getch ();
}
4.10.8. imagesize
Funcia imagesize dimensiunea spaiului de memorie necesar pentru a se putea
salva imaginea de pe ecran precizat printr-o zon dreptunghiular.
Utilizatorul va specifica coordonatele x, y ale colului stnga sus respectiv ale colului
dreapta jos ce delimiteaz zona de imagine.
Valoarea maxim returnat este 64 Ko, dac zona selectat necesit o valoare mai mare
de 64Ko, funcia va returna valoarea -1.
Prototipul funciei imagesize este :
Int far imagesize (int left, int top, int right, int bottom, );
int left= coordonata x a colului din stnga,
int top= coordonata y a colului din stnga,
int right= coordonata x a colului din dreapta,
int bottom= coordonata y a colului din dreapta,
Funcia returneaz o valoare de tip intreg fr semn ce reprezint mrimea in octei a
zonei de imagine indicat prin parametrii funciei.
4.10.9. getimage
funcia getimage salveaz n spaiul de memorie alocat o poriune
dreptunghiular din imaginea existent pe ecran la momentul apelrii funciei.
Poriunea de imagine salvat poate fi restaurat n fereastra dorit i la momentul dorit.
Datorit spaiului de memorie alocat pentru salvarea de imagini se recomand
caporiunea de imagine selectat s nu depeasc o zona de 300x300pixeli ce
corespunde unui spaiu de 64Ko de memorie. Pentru determinarea spaiului de
memorie necesar salvrii imagini se va apela anterior alocrii de memorie funcia
imagesize .
Prototipul funciei getimage este :
Void far getimage (int left, int top, int right, int bottom, void far *imagine);
int left= coordonata x a colului din stnga,
int top= coordonata y a colului din stnga,
int right= coordonata x a colului din dreapta,
int bottom= coordonata y a colului din dreapta,
void far *imagine= pointerul spre zona de memorie alocat salvrii.
Exemplu

LIMBAJUL C TEORIE I APLICAI I 181


void *ii; declararea pointerului ii,
unsigned int imag; declararea de variabil pentru valoarea returnat
de funcia imagesize,

cleardevice();
setbkcolor (1);
rectangle (10,10,300,300); desenarea de entiti care s formeze o imagine ce
se va salva n memorie,
moveto (200,40);
arc (100,100,0,90,50);
pieslice (100,100,0,180,45);
pieslice (200,200,180,0,45);
pieslice (300,300,0,180,45);
circle (100,100,70);
circle (200,200,70);
line (10,10,300,300);
outtext ("in fereastra");
imag=imagesize (0,0,350,350); determinarea mrimii imagini delimitat de
dtreptunghiul imaginar ale crui coluri sunt
parametrii funciei imagesize,
printf ("imagine=%u",imag); afiarea mrimii imaginii, pentru ase controla
dac nu s-a dept 64 Ko,
ii=malloc (imag); alocarea de spaiu pentru memorarea imaginii,
getimage (0,0,350,350,ii); salvarea imaginii delimitat de dreptunghiul ce
are coordonatele colului stnga x=0, y=0 i
colului dreapta jos x=350, y=350, imaginea este
salvat n zona de memorie alocat prin funcia
malloc,
getch ();
clearviewport ();
putimage (100,100,ii,COPY_PUT);dispunerea pe ecran a imaginii salvate anterior,
getch ();
}
4.10.10. getx
Funcia getx determin i returneaz valoarea coordonatei x a poziiei curente
pentru cursorul grafic. Valoarea coordonatei x este raportat la poziia relativ a
ferestrei grafice curente.
Prototipul funciei getx este :
Int far getx ( void) ;
Valoarea returnat este de tip ntreg (int).
LIMBAJUL C TEORIE I APLICAI I 182
4.10.11. gety
Funcia gety determin i returneaz valoarea coordonatei y a poziiei curente
pentru cursorul grafic. Valoarea coordonatei y este raportat la poziia relativ a
ferestrei grafice curente.
Prototipul funciei gety este :
Int far gety ( void) ;
Valoarea returnat este de tip ntreg (int).
4.10.12. getpixel
Funcia getpixel determin i returneaz culoarea pixelului de coordonate x,y
precizai prin parametrii funciei. Valoarea returnat este de tip ntreg (unsigned) i este
in concordan cu valorile pentru culoare funcie de driverul i modul grafic curent.
Prototipul funciei getpixel este :
unsigned far getpixel (int x, int y) ;
int x= coordonata x a pixelului ,
int y= coordonata y a pixelului.
Exemplu

int xmax,ymax,i,x,y;
unsigned int culoare;

cleardevice();
setbkcolor (1);
rectangle (10,10,300,300);
moveto (200,40);
arc (100,100,0,90,50);
x=getx (); detectarea coordonatei x a poziiei cursorului
grafic,
y= gety (); detectarea coordonatei y a poziiei cursorului
grafic,
culoare =getpixel (10,10);detectarea culorii pixelului de coordonate x=10, y=10,
printf ("coordonatele cursorului grafic x=%d y=%d \n",x,y);
printf ("culoarea pixelului de coordonate 10,10 =%d ",culoare);
getch ();
}
LIMBAJUL C TEORIE I APLICAI I 183
4.11. Funcii de iniializare i nchidere a sistemului grafic.
4.11.1. initgraph
Funcia initgraph ncarc sau valideaz un driver grafic i trece sistemul n
modul grafic. Aceast funcie este prima apelat pentru a detecta prin intermediul
funciei detectgraph driverul i modul grafic aceptat de hardul calculatorului.
La polul opus acestei funcii se afl funcia closegraph care nchide modul grafic i
trece sistemul n modul text.
Prototipul funciei initgraph este :
Void far initgraph (int far driver, int far mode, char far*cale pentru driver);
int far driver=valoarea driverului grafic ,
int far mode=valoarea modului grafic,
char far*cale pentru driver calea spre directorul ce conine driverul grafic.
4.11.2. closegraph
Funcia closegraph nchide sistemul grafic deschis de funcia initgraph i trece
modelul video la modelul text. Prototipul funciei closegraph este :
Void far closegraph ( void);
Exemplu
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
# include <stdlib.h>
void main ()
{
int gdriver = DETECT,gmode,errorcode;autodetecia adaptorului i modului
grafic la rezoluia maxim suportat de sitemul de
calcul prin apelarea prin DETECT,
int xmax,ymax;
initgraph(&gdriver,&gmode," ");iniializarea modului grafic,
xmax=getmaxx();ymax=getmaxy(); detectarea dimensiunii maxime a ecranului
n mod grafic,
setviewport(0,0,getmaxx(),getmaxy(),0);setarea ferestrei cu dimensiunile
maxime detectate de funciile getmaxx, getmaxy,
cleardevice();
setcolor (RED);
setfillstyle (SOLID_FILL,RED);
arc (50,50,0,180,25);
closegraph (); nchiderea sistemului grafic,
LIMBAJUL C TEORIE I APLICAI I 184
puts ("apasa o tasta");
getch ();
}
5. Programe aplicative
5.1. Programe i algoritmi pentru sortare i cutare.
Programul cautare1.c permite cutarea unui numr natural introdus de la tastatur
sau prin apelarea funciilor de citire dintr-un fiier sau valoare de tip ntreg livrat
de o plac de achiziii de date. Pentru a determina numrul livrat se vor parcurge
etapele astfel :
1. Se apeleaz un ciclu for de
la 0 la 10000 cu pasul 100 pentru a se determina intervalul de cte 100 uniti.
2. Se apeleaz un nou ciclu for cu limita inferioar mai
mic dect numrul n i limita superioar mai mare dect n iar pasul este de 10.
Limita superioar i inferioar a ciclului este livrat de primul ciclu for iar
lungimea intervalului este 100. n cadrul acestei etape domeniul n care se afl
numrul n are lungimea de 10.
3. Se apeleaz ultimul ciclu ce are limitele intervalului
n stnga i dreapta numrului n deduse de la etapa 2 i pasul de ciclare egal 1.
Folosirea acestui algoritm reduce timpul de cutare nefiind necesar parcurgerea
tuturor numerelor de la 0 la numrul cutat n.
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int j,k,x,i,n,p;
puts ("Algoritm de cautare a unui numar natural");
puts ("Dati numarul n ");
scanf ("%d",&n);
for (i=0; i<=10000; i=i+100)
if (n<i)
{
break;
puts ("pas1");
goto t1;
}
else
if (n==i)
{
p=i;
goto tip;
}
else
goto sfirsit;
t1 :
for (k=i-100; k<i; k=k+10)
if (n<k)
LIMBAJUL C TEORIE I APLICAI I 185
{
break;
puts ("pasul2");
goto t2;
}
else
if(n==k)
{
p=k;
break;
goto tip;
}
else
goto sfirsit;
t2 :
for (j=k-10; j<k; j=j+1)
if (n==j)
{
p=j;
goto tip;
}
else
;
tip :
printf ("n=%d ",p);
sfirsit :
puts ("APASA O TASTA");
getch ();
}
Programul zecimaln.c permite determinarea numrului de zecimale ale unui
numr mai mare dect 0. Algoritmul folosete funcia floor care rotunjete prin
lips valoarea parametrului apelat.
Numrul n citit de la tastatur se mulete cu 10, 100, 1000, i noua valoare
obinut se rotunjete prin lips apoi se compar cu valoarea nerotunjit, cnd se
obine egalitatea ntre noul numar i valoarea rotunjit a acestuia se oprete
procesul de amplificare cu 10 la puterea j, valoarea lui j indicnd numrul de
zecimale.
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int j;
float k,x,i,n,p;
puts ("Se determina numarul de zecimale ale unui numar");
puts ("Dati numarul n mai mic decit 1 si pozitiv ");
scanf ("%f",&n);
k=1;
j=0;
inceput : eticheta de salt a lui goto
LIMBAJUL C TEORIE I APLICAI I 186
x=n*k; amplificarea numrului cu 10 la puterea k i
atribuirea acestei valori variabilei x
p=floor (x); apelarea funciei de rotunjire prin lips asupra noului numr x
if (x==p)
{
printf ("Numarul introdus are %d zecimale \n",j);
goto sfirsit;
}
else
{
k=k*10;
j=j+1;
goto inceput;
}
sfirsit :
puts ("APASA O TASTA");
getch ();
}
Programul sortare2.c pentru ordonarea termenilor unui vector prin metoda shell.
Sortarea termenilor unui vector prin metoda shell const n compararea termenilor
a[i] i a[j] pentru i=j-1, j-2, , 1 iar j =2, 3, , n i dac a[i] este mai mare dect
a[j] se efectueaz operaia de interschimbare ntre a[i] i a[j].
sortare1 (float a [100],int j); prototipul funciei sortare1
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int n,i,j;
float a[100],x;
puts ("Se ordoneaza un vector metoda shell ");
puts ("Dati n marimea vectorului ");
scanf ("%d",&n);
for (i=1; i<=n; i++) ciclul for pentru citirea termenilor
vectorului
{
printf ("Dati vec [%d]= ",i);
scanf ("%f",&a[i]);
}
for (j=2; j<=n; j++)
sortare1(a,j); apelarea funciei sortare1 de n-1 ori care
compar pe a[i] cu a[j]
for (i=1; i<=n; i++) ciclul de afiare a vectorului cu termenii
ordonai
printf ("a[%d]=%.2f \t",i, a[i]);
puts (" \n APASA O TASTA");
getch ();
}
LIMBAJUL C TEORIE I APLICAI I 187
sortare1 (float a [100], int j) antetul funiei
{
int i;
float x;
inceput :
i=j-1;
if (a[i]>a[j]) dac a[i] >a[j] are loc interschimbarea celor
doi termeni
{
x=a[i];
a[i]=a[j];
a[j]=x;
}
else
;
;
if (i==1)
goto iesire;
else
{
j=j-1;
goto inceput;
}
iesire :
;
}
Programul pentru sortarea termenilor unui vector prin metoda bulelor (bubble
sort).Metoda bulelor const n operaia de interschimbare intre a[i] i a[j] dac i
numai dac a[i] > a[j]. n caz contrar elementele rmn neschimbate. Metoda
bulelor consum n-1 etape astfel : n prima etap se efectueaz comparaia
a[i] > a[j] ale perechilor de termeni a[1] > a[2], a[2] > a[3], , a[n-1] > a[n], ce
are ca efect c termenul a[1] se deplaseaz la dreapta peste toate elementele mai
mici dect el, apoi se reia procesul cu elementul a[2] i aa mai departe, pn cnd
se ajunge la elementul a[n-1]. Dup efectuarea acestei etape termenul cel mai
mare al vectorului va ocupa locul cel mai din dreapta n. Se reia procesul de
deplasare spre dreapta a termenilor 1 la n-1, rezultnd termenul ce va ocupa locul
n-1, se continu pn cnd se ordoneaz toi termenii vectorului.
Programul care sorteaz un vector cu metoda bulelor este prezentat n funcia
sortare5.
sortare5 (float a[100], int m); prototipul funciei sortare5
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int n,i,m,k;
float a[100],x;
puts ("Se ordoneaza un vector prin metoda bulelor ");
puts ("Dati n marimea vectorului ");
scanf ("%d",&n);
LIMBAJUL C TEORIE I APLICAI I 188
for (i=1; i<=n; i++)
{
printf ("Dati termenul [%d] al vectorului= ",i);
scanf ("%f",&a[i]);
}
for (m=n-1; m>=1; m=m-1)
sortare5 (a,m);
a [k+1]=x;
for (i=1;i<=n;i++)
printf ("a[%d]=%.2f \t",i, a[i]);
puts (" \n APASA O TASTA");
getch ();
}
Funcia sortare5 pentru ordonarea termenilor unui vector prin metoda bulelor.
sortare5 (float a[100], int m)
{
int i;
float x;
i=1;
inceput :
if (a[i]>a[i+1])
{
x=a[i];
a[i]=a[i+1];
a[i+1]=x;
}
else
;
if (i==m)
goto iesire;
else
i=i+1;
goto inceput;
iesire :
;
}
Programul sortare6.c pentru ordonarea termenilor unui vector prin metoda seleciei
directe. Sortarea prin selecie direct const n faptul c la pasul k, (k aparine
intervalului 1, , n-1) se calculeaz a[i] =max (a[1], a[2], a[3], , a[n-k+1]) i apoi se
face interschimbarea a[i] cu a[n-k+1].
sortare6 (float a[100], int m, int k);
sort61 (int k, int m, float a[100]);
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int n,i,m,k;
float a[100],x;
puts ("Se ordoneaza un vector prin metoda selectie directa");
puts ("Dati n marimea vectorului");
LIMBAJUL C TEORIE I APLICAI I 189
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf ("Dati vec [%d]= ",i);
scanf ("%f",&a[i]);
}
for (m=n; m>2; m=m-1)
{
sortare6 (a,m,k);
sort61 (k,m,a);
}
for (i=1;i<=n;i++)
printf ("a[%d]=%.2f \t",i, a[i]);
puts (" \n APASA O TASTA");
getch ();
}
sortare6 (float a[100], int m, int k) funcia determin pe k astfel ca a[k] =
max(a[1], a[2], a[3], , a[n])
{
int i;
k=2;
for (i=2; i<m;i++)
{
if (a[k]<a[i])
k=i;
else
;
}
}
sort61 (int k, int m, float a[100]) funcia de interschimbare a lui a[m] cu
a[k]
{
float x;
x=a[k];
a[k]=a[m];
a[m]=x;
}
5.2. Program pentru rezolvarea sistemelor de ecuaii liniare
Pentru rezolvarea sistemelor de ecuaii liniare, vom folosi metoda lui Gauss.
Metoda lui Gauss este n fapt metoda eliminrii pentru soluionarea sistemelor
liniare nvat n sistemul gimnazial. Pentru a formaliza aceast metod vom nota
elementele matricei iniiale prin
( )
n j i a
ij
, , 1 , ,
1

, iar membrul al doilea al
sistemului prin
( )
n i b
i
, , 1 ,
1
. Primul pas const n eliminarea necunoscutei x
1
din ecuaiile corespunztoare lui i = 2, , n. Presupunnd c a
11
este diferit de
zero, vom defini
( ) ( )
n i a a m
i i
, , 2 ,
1
11
1
1 1
.
LIMBAJUL C TEORIE I APLICAI I 190
Aceste cantiti sunt utilizate pentru eliminarea lui x
1
din ecuaiile ce i urmeaz
primeia. Noii coeficieni vor fi
( ) ( ) ( )
( ) ( ) ( )
n j i
b m b b
a m a a
i i i
j i ij ij
, , 2 , ,
1
1 1
1 2
1
1 1
1 2



Prima linie a matricei A i elementul b
1
rmn neschimbai. Sistemul dup aceast
etap are forma
( ) ( ) ( )
( ) ( )
( ) ( )
( )
( )
( )
1
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
1
]
1

2
2
2
1
1
2
1
2 2
2
2
2
2
22
1
1
1
12
1
11
0
0
n n nn n
r
r
b
b
b
x
x
x
a a
a a
a a a

Continum eliminarea cu coloanele urmtoare. Presupunem c dup r-1 pai


sistemul are forma
( ) ( ) ( ) ( )
( ) ( ) ( )
( ) ( )
( ) ( )
( )
( )
( )
( )
1
1
1
1
1
1
1
1
]
1

1
1
1
1
1
1
1
1
]
1

1
1
1
1
1
1
1
1
]
1

r
n
r
r
n
r
r
nn
r
nr
r
rn
r
rr
n r
n r
b
b
b
b
x
x
x
x
a a
a a
a a a
a a a a







2
2
1
1
2
1
2
2
2
2
2
22
1
1
1
1
1
12
1
11
0 0
0 0
0
Presupunnd
( ) r
rr
a diferit de zero, vom defini coeficienii
( ) ( )
n r i a a m
r
rr
r
ir ir
, , 1 , +
cu ajutorul crora vom elimina necunoscuta x
r
din ecuaiile ce urmeaz lui i=r.
Vom avea
( ) ( ) ( )
( ) ( ) ( )
n r j i
b m b b
a m a a
r
r ir
r
i
r
i
r
rj ir
r
ij
r
ij
, , 1 , ,
1
1
+


+
+
Prin aceste transformri liniile anterioare liniei i=r+1 din matricea A sunt lsate
neschimbate iar n coloana r sub diagonala principal se introduc zerouri. Dup n-
1 pai obinem sistemul sub forma
( ) ( ) ( )
( ) ( )
( )
( )
( )
( )
1
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
1
]
1

n
n n
n
nn
r
r
b
b
b
x
x
x
a
a a
a a a

2
2
1
1
2
1
2
2
2
22
1
1
1
12
1
11
0 0
0
Acest procedeu de transformare a matricei A ntr-o matrice superior triunghiular
se numete factorizare a matricii A prin procedura lui Gauss.
LIMBAJUL C TEORIE I APLICAI I 191
Soluia sistemului de ecuaii cu matricea A factorizat i vectorul b transformat
poate fi scris imediat :
( ) ( ) n
nn
n
n n
a b x
( ) ( ) ( )
1 , , 1 ,
1

,
_



+
n r a x a b x
r
rr
n
r j
j
r
rj
r
r r
Aceast etap poart numele de substituie invers (back substitution).
Programul care implementeaz algoritmul lui Gauss este prezentat n continuare.
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "eliml1.c"
#include "citv.c"
#include "triu1.c"
#include "adaugal.c"
#include "tipv1.c"
#include "scriev.c"
#include "adaugac.c"
#include "inlocc.c"
#include "egalm.c"
#include "elimc1.c"
#include <conio.h>
void main ()
{
int i,j,k,q,n,m,n1;
double a[10][10],b[10][10],c[10][10],e[10][10],x[10],s;
double det,det1[10],colt [10],p,e1[10],d[10][10];
puts ("Rezolvarea sistemelor liniare calcul determinant");
puts ("Dati marimea sistemului ");
scanf ("%d",&n);
citm (n,n,a);
puts ("Dati coloana terminilor liberi");
citv (n,colt);
egalm (n,n,a,b);
adaugac (n,n,b,colt,c);
adaugal (n,n,c);
n1=n+1;
triu1 (n1,n1,c);
eliml (n1,n1,n1,c,e);
puts (" ");
scriev (n,n1, e, e1);
tipv (n,e1);
elimc (n,n1,n1,e,d);
x[n]=e1[n]/d[n][n];
for (k=n-1;k>=1;k--) Substituia invers
{
s=0;
for (j=k+1;j<=n;j++)
s=s+d[k][j]*x[j];
x[k]=(e1[k]-s)/d[k][k];
LIMBAJUL C TEORIE I APLICAI I 192
}
for(i=1;i<=n;i++ )
printf ("x[%d]==%lf \n",i,x[i]);
puts ("\n Apasa o tasta ");
getch ();
}
Funcia egalm egaleaz matricea B cu matricea A, astfel nct matricea care se
prelucreaz s fie matricea B, iar matricea original A s rmn nemodificat.
Funcia este salvat n fiierul egalm.c
egalm (int n, int m, double a[10][10], double b[10][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
b[i][j]=a[i][j];
}
Funcia adaugl permite adugarea unei linii cu termenii egali cu 1 la o matrice cu
n linii i m coloane. Funcia este salvat n fiierul adaugal.c
adaugal (int n, int m, double c[10][10])
{
int i,j;
for (i=1;i<=n+1;i++)
for (j=1;j<=m+1;j++)
if (i>n)
c[i][j]=1;
else
c[i][j]=c[i][j];
}
Funcia adaugc permite adugarea unei coloane la o matrice, n cazul de fa
coloana ce se adaug este coloana termenilor liberi. Funcia este salvat n fiierul
adaugac.c
adaugac (int n, int m, double b[10][10], double d[10],double e[10][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m+1;j++)
if (j>m)
e[i][j]=d[i];
else
e[i][j]=b[i][j];
}
Funcia triu1 efectueaz triangularizarea unei matrici ptratice de mrime n n. Funcia
este salvat n fiierul triu1.c
triu1 (int n, int m, double a[10][10])
{
int i,j,k;
double p;
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
{
p=a[j][i]/a[i][i];
LIMBAJUL C TEORIE I APLICAI I 193
for (k=i;k<=n;k++)
a[j][k]=a[j][k]-p*a[i][k];
}
}
Funcia eliml elimin dintr-o matrice ultima linie. Funcia este salvat n fiierul
eliml1.c
eliml (int n, int m, int k, double a[10][10], double b[10][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (i!=k)
if(i<k)
b[i][j]=a[i][j];
else
b[i-1][j]=a[i][j];
}
Funcia elimc elimin coloana k dintr-o matrice. Funcia este salvat n fiierul
elimc.c
elimc (int n, int m, int k, float a[10][10], float b[10][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (j!=k)
if(j<k)
b[i][j]=a[i][j];
else
b[i][j-1]=a[i][j];
else
;
}
Funcia scriev transfer dintr-o matrice, ultima coloan ntr-un vector. Funcia este
salvat n fiierul scriev.c
scriev (int n, int m, double a[10][10], double b[10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (j==m)
b[i]=a[i][j];
else
;
}
5.3. Metoda Cramer pentru determinarea valorii determinantului
Fiierul cu programul surs este prezentat n continuare.
#include <stdio.h>
#include "citm.c"
#include "tipm.c"
#include "trimat.c"
#include "inlocc.c"
LIMBAJUL C TEORIE I APLICAI I 194
#include "egalm.c"
#include <conio.h>
void main ()
{
int i,j,k,q,n,m;
double a[10][10],b[10][10],c[10][10],det,det1[10],colt [10][10],p;
puts ("Rezolvarea sistemelor liniare calcul determinant");
puts ("Dati marimea sistemului ");
scanf ("%d",&n);
citm (n,n,a);
puts ("Dati coloana termenilor liberi");
citm (n,1,colt);
for (q=1;q<=n;q++)
{
egalm (n,n,a,b);
inlocc (n,n,q,b,colt);
det1[q]=trimat (n,n,b);
}
egalm (n,n,a,b);
tipm (n,1,colt);
tipm (n,n,b);
det=trimat (n,n,b);
printf (" determinantul==%.25lf\n",det);
if (det!=0)
{
for (i=1;i<=n;i++)
{
printf (" det1 [%d]=%.25lf\n",i,det1[i]);
printf (" x[%d] =%lf\n",i,det1[i]/det);
}
}
else
puts ("sistem incompatibil");
puts ("\n Apasa o tasta ");
getch ();
}
Funcia trimat efectueaz triangularizarea unei matrici ptratice de mrimea n n
i determin valoarea determinantului noii matrici triangularizate. Funcia este
salvat n fiierul trimat.c
double trimat (int n,int m, double a[10][10])
{
int i,j,k;
double det,p;
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
{
p=a[j][i]/a[i][i];
for (k=i;k<=n;k++)
a[j][k]=a[j][k]-p*a[i][k];
}
det=1;
for (i=1;i<=n;i++)
det=det*a[i][i];
LIMBAJUL C TEORIE I APLICAI I 195
return (det);
}
Funcia inlocc efectueaz nlocuirea coloanei i a matricii coeficienilor
necunoscutelor cu coloana termenilor liberi. Funcia este salvat n fiierul
inlocc.c
inlocc (int n, int m,int k, double b[10][10], double colt[10][10])
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (j==k)
b[i][j]=colt[i][1];
else
b[i][j]=b[i][j];
}
5.4. Caracteristicile geometrice ale seciunilor transversale
#include <conio.h>
#include <stdio.h>
#include "sfirsit.c"
#include "fz0g.c"
#include "fy0g.c"
#include "fIy.c"
#include "fIz.c"
#include "fIyz.c"
void main ()
{
float ai[10],y0i[10],z0i[10],y0g,z0g,Iy,Iz,Iyz;
int n,i;
float Iyi[10],Izi[10],Iyzi[10];
puts ("dati nr de elemente");
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf ("dati aria[%d] y0%d z0%d ",i,i,i);
scanf("%f %f %f",&ai[i],&y0i[i],&z0i[i]);
}
y0g=fy0g(n,y0i,ai);
z0g=fz0g(n,z0i,ai);
for (i=1;i<=n;i++)
{
printf ("dati Iyi[%d]= Izi%d= Iyz%d= ",i,i,i);
scanf ("%f %f %f",&Iyi[i],&Izi[i],&Iyzi[i]);
}
printf ("y0g=%f z0g=%f\n",y0g,z0g);
printf ("Iy=%f\n",fIy(n,z0g,ai,Iyi,z0i));
printf ("Iz=%f\n",fIz(n,y0g,ai,Izi,y0i));
printf ("Iyz=%f\n",fIyz(n,z0g,y0g,ai,Iyzi,z0i,y0i));
sfirsit ();
}
float fz0g (int n,float z0i[10],float ai[10])
{
LIMBAJUL C TEORIE I APLICAI I 196
int i;
float z0g,a;
z0g=0;a=0;
for (i=1;i<=n;i++)
a=ai[i]+a;
for(i=1;i<=n;i++)
z0g=z0g+z0i[i]*ai[i];
z0g=z0g/a;
return z0g;
}
float fy0g (int n,float y0i[10],float ai[10])
{
int i;
float y0g,a;
y0g=0;a=0;
for (i=1;i<=n;i++)
a=ai[i]+a;
for(i=1;i<=n;i++)
y0g=y0g+y0i[i]*ai[i];
y0g=y0g/a;
return y0g;
}
float fIy (int n,float z0g,float ai[10],float Iyi[10],float z0i[10])
{
int i;
float Iy=0;
for (i=1;i<=n;i++)
Iy=Iy+Iyi[i]+(z0i[i]-z0g)*(z0i[i]-z0g)*ai[i];
return Iy;
}
float fIz (int n,float y0g,float ai[10],float Izi[10],float y0i[10])
{
int i;
float Iz=0;
for (i=1;i<=n;i++)
Iz=Iz+Izi[i]+(y0i[i]-y0g)*(y0i[i]-y0g)*ai[i];
return Iz;
}
float fIyz (int n,float z0g,float y0g, float ai[10],float Iyzi[10],float z0i[10],float y0i[10])
{
int i;
float Iyz=0;
for (i=1;i<=n;i++)
Iyz=Iyz+Iyzi[i]+(z0i[i]-z0g)*(y0i[i]-y0g)*ai[i];
return Iyz;
}
5.5. Calculul analitic al eforturilor M, N, T
Programul care este prezentat n acest paragraf permite determinarea momentelor
de ncastrare perfect ale unei bare dublu ncastrat ncrcat cu fore concentrate
LIMBAJUL C TEORIE I APLICAI I 197
sau fore distribuite sau cu momente concentrate. Cu acest program se determin
foarte uor valoarea momentelor de ncastrare perfect n cadrul metodei
deplasrilor folosit la studiul structurilor nedeterminate static (la disciplina
Statica construciilor, metoda deplasrilor ce se studiaz n anul III).
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
#include "forta1.c"
#include "distrib1.c"
#include "momen1.c"
void IESIRE1 (void);
void main ()
{
int i,j,n,m,o;
float M1,M2,V1,V2,N1,N2,p,q,l;
puts ("SE DETERMINA FORTELE SI MOMENTELE NODALE ");
puts ("BARA DUBLU INCASTRATA ");
INCEPUT1 :
puts ("ALEGETI OPTIUNEA DORITA");
puts ("FORTA CONCENTRATA NORMALA =1");
puts ("FORTA DISTRIBUITA NORMALA =2");
puts ("MOMENT CONCENTRAT =3");
puts ("FORTA CONCENTRATA AXIALA =4");
puts ("IESIREA DIN PROGRAM =5");
fflush (stdin);
if (scanf ("%d",&o)==1)
switch (o)
{
case 1:
FORTACONCENTRATA1 ();
break;
case 2 :
FORTADISTRIBUITA ();
break;
case 3 :
MOMENTCONCENTRAT ();
break;
case 4 :
puts ("FORTAAXIALA ();");
break;
default :
IESIRE1 ();
}
else
{
puts ("ATI INTRODUS OPTIUNEA GRESITA ");
goto INCEPUT1;
}
}
LIMBAJUL C TEORIE I APLICAI I 198
void IESIRE1 (void)
{
puts ("APASA O TASTA");
getch ();
}
Funcia FORTACONCENTRATA1 permite determinarea valorii momentelor de capt
cnd pe bar acioneaz fore concentrate.
void FORTACONCENTRATA1 (void)
{
int i,j,n,m;
float M1,M2,V1,V2,N1,N2,a[10],l,p[10],b[10];
puts ("DATI LUNGIMEA BAREI ");
scanf ("%f",&l);
puts ("DATI NUMARUL DE FORTE CONCENTRATE PE BARA");
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf("DATI DISTANTA LA FORTA [%d]= SI MARIMEA FORTEI = ",i);
scanf ("%f,%f",&a[i],&p[i]);
b[i]=l-a[i];
}
M1=0; M2=0; V1=0; V2=0;
for (i=1;i<=n;i++)
{
M1=M1-p[i]*(a[i]*b[i]*b[i])/(l*l);
M2=M2-p[i]*(a[i]*a[i]*b[i])/(l*l);
}
printf ("Momentul 1 si 2 are valoarea =%f =%f \n ",M1,M2);
delay (1000);
puts ("APASATI O TASTA PENTRU REVENIREA IN PROGRAM ");
getch ();
}
Funcia FORTADISTRIBUITA permite determinarea valorii momentelor de capt
cnd pe bar acioneaz fore distribuite
void FORTADISTRIBUITA (void)
{
int i,j,n;
float M1,M2,V1,V2,N1,N2,a[10],l,q[10],c[10],b[10];
puts ("DATI LUNGIMEA BAREI ");
scanf ("%f",&l);
puts ("DATI NUMARUL DE FORTE DISTRIBUITE");
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf ("DATI DISTANTA PINA LA MIJLOCUL FORTEI [%d] ",i);
scanf ("%f",&a[i]);
printf ("DATI LUNGIMEA DE DISTRIBUTIE A FORTEI [%d] SI MARIMEA FORTEI=",i);
scanf ("%f %f",&c[i],&q[i]);
b[i]=l-a[i];
}
M1=0; M2=0; V1=0; V2=0;
for (i=1;i<=n;i++)
LIMBAJUL C TEORIE I APLICAI I 199
{
M1=M1+((q[i]*c[i])/(24*l))*(24*b[i]*b[i]*b[i]/l-(6*c[i]*c[i]*(a[i]
+c[i]/2))/l+3*c[i]*c[i]*c[i]/l+4*c[i]*c[i]-24*b[i]*b[i]);
M2=M2-((q[i]*c[i])/(24*l))*(24*b[i]*b[i]*b[i]/l-6*c[i]*c[i]*(a[i]
+c[i]/2)/l+3*c[i]*c[i]*c[i]/l+2*c[i]*c[i]-48*b[i]*b[i]+24*b[i]*l);
}
printf ("MOMENTELE M1=%f M2= %f ",M1,M2);
puts ("APASATI O TASTA ");
getch ();
}
Funcia MOMENTCONCENTRAT permite determinarea valori momentelor de
capt cnd pe structur acioneaz momente concentrate.
void MOMENTCONCENTRAT (void)
{
int i,j,n;
float M1,M2,V1,V2,N1,N2,a[10],l,m[10],b[10];
puts ("DATI LUNGIMEA BAREI ");
scanf ("%f",&l);
puts ("DATI NUMARUL DE MOMENTE CONCENTRATE PE BARA");
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf ("DATI DISTANTA PINA LA MOMENTUL [%d]= SI MARIMEA MOMENTULUI =
",i);
scanf ("%f,%f",&a[i],&m[i]);
b[i]=l-a[i];
}
M1=0; M2=0; V1=0; V2=0;
for (i=1;i<=n;i++)
{
M1=M1+m[i]*(4*a[i]*l-3*a[i]*a[i]-l*l)/(l*l);
M2=M2-m[i]*(2*l*a[i]-3*a[i]*a[i])/(l*l);
}
printf ("Momentul 1 si 2 are valoarea =%f =%f \n ",M1,M2);
delay (1000);
puts ("APASATI O TASTA PENTRU REVENIREA IN PROGRAM ");
getch ();
}
5.6. Calculul ariilor contururilor poligonale nchise
S considerm un poligon nchis, compus din segmente de dreapt ntre n vrfuri
(x
1
, y
1
), i =0, , n-1. Ultimul vrf este identic cu primul (adic poligonul este
nchis).
LIMBAJUL C TEORIE I APLICAI I 200
Aria poligonului va fi dat de formula
( )

+ +

1
0
1 1
2
1
n
i
i i i i
x x y x A .
Pentru ca aceast formul s poat fi aplicat, trebuie respectat un sens de
parcurgere al poligonului, coordonatele vrfurilor introducndu-se fie n sens orar,
fie n sens anti orar. Aria obinut va fi pozitiv, dac poligonul a fost parcurs n
sens anti orar, sau negativ, dac poligonul a fost parcurs n sens orar.
Deducerea formulei de mai sus este evident din figura de mai jos. Dac se
respect un sens de parcurs orar, aria conturului poligonal nchis se poate obine
ca suma trapezelor formate de laturile conturului poligonal i verticalele coborte
din vrfuri. Trapezele 1, 2 i 3 vor avea ariile pozitive, pe cnd trapezele 4, 5 i 6
vor avea ariile negative, nsumnd toate aceste arii cu semnele lor, rezultnd aria
poligonului.
1
2
3
4 5
x
y
f(x)
f(x)
(x
1
, y
1
)
(x
2
, y
2
)
(x
3
, y
3
)
(x
4
, y
4
)
n = 6
(x
0
, y
0
)
LIMBAJUL C TEORIE I APLICAI I 201
Programul surs C, care rezolv aceast problem este prezentat n continuare.
#include<stdio.h>
void main ()
{
int i, j, n;
float x[10], y[10], aria = 0;
printf("Cate varfuri:");
scanf("%d",&n);
for (i=0; i<n; i++)
{
printf("x(%d) y(%d)", i, i);
scanf("%f %f", &x[i], y[i]);
}
for (i=0; i<n; i++)
{
j = (i+1) % n;
aria += x[i] * y[j];
aria -= y[i] * x[j];
}
aria = aria / 2;
aria < 0 ? -aria: aria;
}
Vom atrage atenia asupra instruciunii de atribuire j = (i+1) % n;. De la i = 0,
pn la i = n-2, j va lua valorile 1 pn la n-1. Cnd i este n-1, j va lua valoarea 0,
asigurnd nchiderea conturului poligonal.
5.7. Calculul integralelor prin metoda dreptunghiului
Valoarea integralei definite n intervalul [a, b], a unei funcii continue f(x),
reprezint aria suprafeei mrginit de funcia f(x), axa absciselor, i cele dou
segmente de dreapt ce trec prin capetele intervalului.
Astfel, calculul numeric al integralei poate fi fcut mprind suprafaa respectiv
n suprafee elementare, a cror arie poate fi evaluat uor. Se pot folosi
dreptunghiuri sau trapeze pentru forma suprafeelor elementare. Metoda
aproximrii cu dreptunghiuri este mai uoar, necesitnd mai puine calcule.
f(x)
f(x)
LIMBAJUL C TEORIE I APLICAI I 202
Astfel, programul surs C, va fi:
#include <stdio.h>
void main ()
{
int n, i;
double a, b, x, fx, h, integ;
printf("\nProgramul calculeaza integrala functiei x^2 in intervalul [a, b]");
printf("\nDati capatele intervalului");
scanf("%lf %lf", &a, &b);
printf("\nCate diviziuni ale intervalului");
scanf("%d", &n);
h=(b-a)/n;
integ=0;
for (i=0; i<n; i++)
{
x=a+i*h;
fx=x*x;
integ=integ+fx*h;
}
printf("\nIntegrala din x^2 in intervalul [%lf, %lf] este %lf", a, b, integ);
}
Problem propus
S se scrie programul surs C care calculeaz integrala definit n intervalul [a, b]
a funciei continue f(x), folosind regula trapezului.
5.8. Soluionarea numeric a ecuaiilor neliniare prin metoda biseciei
Problema determinrii rdcinilor unei ecuaii de forma
f(x)=0,
unde f(x) este o funcie continu, apare frecvent n aplicaii. Metode analitice de
soluionare a unor astfel de ecuaii exist numai pentru cazuri particulare.
f(x)
b
x
a
x h
f(x)
LIMBAJUL C TEORIE I APLICAI I 203
In multe situaii problema fizic ce a condus la ecuaia f(x)=0 furnizeaz
informaii asupra distribuiei rdcinilor. In continuare presupunem depit
aceast etap, cu alte cuvinte, admitem c ecuaia f(x)=0 are o rdcin simpl x
1
n intervalul [a, b]. Ceea ce ne propunem este determinarea acestei rdcini cu
precizia , adic valoarea funciei n punctul x
1
s fie mai mic dect precizia .
Cea mai simpl metod de soluionare numeric a ecuaiei este metoda
njumtirii intervalului (a biseciei). Iat algoritmul metodei:
1. Se definete c := (a+b)/2
2. Dac f(b) f(c) 0, atunci a := c, altfel b := c
3. Dac f(c) , rdcina ecuaiei este c; STOP
4. Treci la pasul 1
Ideea metodei este simpl : intervalul [a, b] este njumtit la fiecare trecere, iar
condiia pus la pasul 2 ne asigur c rdcina este inclus n intervalul [a, b].
Programul surs al problemei este:
#include <stdio.h>
#include <math.h>
float f(float x)
{
return (x*x-3*x+2);
}
void main ()
{
int cont=0, err=0;
float a, b, c, eps=0.0001;
printf("\Program care calculeaza o radacina a ecuatiei f(x)=0 in intervalul [a, b]");
printf("\nDati limitele intervalului");
scanf("%f %f", &a, &b);
do
{
c=(a+b)/2;
if (f(b)*f(c) <= 0)
a=c;
else
b=c;
cont++;
if (cont > 1000)
{
err=1;
break;
}
} while(fabs(f(c))>eps);
if (err)
printf("\nNu exista solutie in intervalul ales");
else
printf("O solutie a ecuatiei este %f", c);
}
LIMBAJUL C TEORIE I APLICAI I 204
n problema noastr am ales ecuaia x2-3x+2 care are soluiile 1 i 2. Condiia de
ieire din ciclu este ca modulul funciei f n punctul c s fie mai mic dect precizia
eps.
Pentru a fi siguri c programul nu intr ntr-un ciclu infinit, am adugat o variabil
contor denumit cont, care este incrementat n fiecare ciclu. Dac contorul este
mai mare dect 1000, variabila ntreag err primete valoarea 1 i se ntrerupe
ciclul do while cu ajutorul instruciunii break. Variabila err este folosit dup
terminarea ciclului. Dac err este 0, nseamn c ciclul a fost terminat normal
(fr eroare). Dac err este 1, nsemn c am depit numrul maxim de cicluri i
se va tipri mesajul de eroare: Nu exista solutii in intervalul ales.
Problem propus
S se scrie programul surs C care calculeaz o rdcin a ecuaiei f(x)=0, n
intervalul [a, b] folosind metoda coardei. Funcia f(x) ale crei rdcini sunt
cutate este x3-6x2+11x-6.
Not
Metoda coardei este o modificare a metodei biseciei. Graficul funciei f(x) este
aproximat prin dreapta care unete punctele (a, f(a)) i (b, f(b)), iar punctul c se
gsete la intersecia acestei drepte cu axa Ox:
c := b-f(b)(b-a)/[f(b)-f(a)].
Algoritmul metodei coincide cu cel al bisectoarei cu deosebirea c la primul pas c
se calculeaz dup regula de mai sus.
5.9 Calculul coordonatelor unei retrointersecie
S se determine coordonatele unui numar n de puncte, la care s-au msurat
unghiul i distana de la staia de lucru la fiecare punct, folosind metoda
retrointerseciei .
Pentru staia de lucru se cunosc cele dou coordonate x i y.
Obs. Axa X este orientat pe vertical de jos n sus conform sistemului topografic.
Datele de intrare sunt :
Coordonatele staiei de lucru.
Numrul de puncte msurate din staia de lucru.
Distana i unghiul msurat la fiecare punct.
Datele de ieire:
Coordonatele X, Y ale fiecrui punct msurat afiate pe monitor i scrise intr-
un fiier, fiierul de lucru este topo_calc.c.
Pentru determinarea coordonatelor x, y se aplic relaiile de calcul :
x [i] =xs+dist [i]*cos (M_PI*unghi [i]/200);
y [i] =ys+dist [i]* sin (M_PI*unghi [i]/200);
xs=coordonata x a staiei de lucru.
Ys=coordonata y a staiei de lucru.
LIMBAJUL C TEORIE I APLICAI I 205
M_PI =valoarea constantei .
Unghiul citit este n grade centizimale (sistem topografic) i este convertit n
radiani, pentru a se utiliza funciile matematice din cadrul limbajului C.
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<math.h>
void main ()
{
FILE * f1;
int i,n;
float unghi [20], dist [20],x[20],y[20],xs,ys;
f1=fopen("topo_calc.c","w");
puts (" Calcul coordonate x, y, axa x este pe verticala ");
puts (" Dati numarul de puncte citite");
scanf ("%d",&n);
puts (" Dati coordonatele x si y ale statiei");
scanf ("%f,%f",&xs,&ys);
for (i=1;i<=n;i++)
{
printf (" Dati unghiul si distanta pentru punctul %d ",i);
scanf ("%f,%f",&unghi [i],&dist [i]);
x [i] =xs+dist [i]*cos (M_PI*unghi [i]/200);
y [i] =ys+dist [i]* sin (M_PI*unghi [i]/200);
fprintf (f1,"punctul %d u=%.4f d=%.2f x=%.3f y=
%.3f\n",i,unghi[i],dist[i],x[i],y[i]);
printf (" punctul %d u=%.4f d=%.2f x=%.3f y=
%.3f\n",i,unghi[i],dist[i],x[i],y[i]);
}
puts (" Valorile citite si calculate sunt scrise in fisierul topo_calc.c");
puts (" Apasa o tasta pentru terminarea programului");
getch ();
}
5.10 Calculul distanelor dintre puncte consecutive i calculul
distanei totale dintre primul i ultimul punct.
Se va determina distanele pariale i distana totaldintre un numr de
puncte la care se cunosc coordonatele x i y.
Date de intrare:
Numrul punctelor.
Coordonatele x, y ale fiecrui punct.
Date de ieire :
Distanele dintre puncte.
Distana total.

P1
P2
P3
X
Y
X1
Y1
X2
LIMBAJUL C TEORIE I APLICAI I 206
Distanele pariale dintre dou puncte consecutive se determin cu relaia :
d[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
distana total = d[i].
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<math.h>
void main ()
{
FILE * f1;
int i,n;
float x[20],y[20],l,d[20];
f1=fopen("topo_ca1.c","w");
puts (" Calcul distantelor dintre puncte si lungimea totala ");
puts (" Dati numarul de puncte ");
scanf (" %d",&n);
for (i=1;i<=n;i++)
{
printf (" Dati coordonatele x,y ale punctului %d ",i);
scanf (" %f,%f",&x [i],&y [i]);
}
l=0;
for (i=1;i<n;i++)
{
d[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
l=l+d[i];
fprintf (f1,"Distanta %d =%.4f \n",i,d[i]);
printf (" Distanta %d =%.4f \n",i,d[i]);
}
printf (" Lungimea totala =%.4f\n",l);
fprintf (f1,"Lungimea totala=%.4f",l);
puts (" Valorile distantelor si lungimea totala sunt scrise in fisierul
topo_ca1.c");
puts (" Apasa o tasta pentru terminarea programului");
getch ();
LIMBAJUL C TEORIE I APLICAI I 207
}
5.11. Calculul momentelor de inerie i poziia centrului de
greutate folosind o baz de date pentru profile standard
n cadrul acestui exemplu s-a creat o baz de date, pentru o categorie de profile i
s-a realizat o interfa grafic, pentru a se nelege mai bine forma seciunii
transversale.
Pentru exemplul ales numrul seciunii este 1, iar profolele disponibile n baza de
date sunt U6, 8, 10, 12.
Dup indicarea profilului ales din lista de profile disponibile, programul afieaz
caracteristicile principale ale profilului.
n etapa urmtoare se cere distana dintre cele dou profile U exprimat n cm.
Programul determin limea minim a platbandelor i indic aceast mrime, dup
care utilizatorul va introduce limea i grosimea celor dou platbande.
Programul livreaz aria,momentele de inerie fa de cele dou axe x, y.
Programul se poate dezvolta prin complectarea bazei de date cu noi valori, pentru
profilul U ct i prin adugarea de noi tipuri de seciuni.
Programul a fost efectuat cu scopul de a mbina noiunile de grafic, cu noiunile
de calcul i realizarea unei baze de date a caracteristicilor geometrice ale profilelor.
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
void void main ()
{
int gdriver = DETECT,gmode,errorcode;
int xmax,ymax,s,i,j,n,m;
float a,b,c,d,t,zog,yog;
float iyb, izb, iyzb, iy, iz, beta, wy, wz,iyy,izz;
float h1, b1, a1, iy1, iz1, ey1,iu, iv, iy1z1,ez1;
float u[80];
u[1]=6.5; u[2]=4.2; u[3]=9.03; u[4]=57.5; u[5]=14.1;
u[6]=1.42;
u[7]=8; u[8]=4.5; u[9]=11; u[10]=106; u[11]=19.4;
u[12]=1.45;
u[13]=10; u[14]=5; u[15]=13.5; u[16]=206; u[17]=29.3;
u[18]=1.55;
u[19]=12; u[20]=5.5; u[21]=17; u[22]=364; u[23]=43.2;
u[24]=1.6;
clrscr ();
initgraph(&gdriver,&gmode," ");
LIMBAJUL C TEORIE I APLICAI I 208
xmax=getmaxx();ymax=getmaxy();
printf ("x max=%d y max=%d",xmax,ymax);
errorcode=graphresult();
if(errorcode!=grOk) printf("Eroare grafica:
%s\n",grapherrormsg(errorcode));
cleardevice();
setviewport(0,0,xmax,ymax,0);
setfillstyle (SOLID_FILL,RED);
rectangle (50,50,120,54);
rectangle (50,129,120,133);
moveto (80,54);
linerel (0,75);
linerel (-25,0);
linerel (0,-4);
linerel (21,0);
linerel (0,-67);
linerel (-21,0);
linerel (0,-4);
linerel (25,0);
moveto (90,54);
linerel (25,0);
linerel (0,4);
linerel (-21,0);
linerel (0,67);
linerel (21,0);
linerel (0,4);
linerel (-25,0);
linerel (0,-75);
moveto (77,160);
outtext ("1");
gotoxy (10,15);
printf ("Alegeti numarul sectiunii=");
scanf ("%d",&s);
gotoxy (10,16);
printf ("Pentru sectiunea aleasa se vor introduce elementele
caracteristice");
gotoxy (20,17);
printf ("APASATI O TASTA PENTRU CONTINUARE");
getch ();
cleardevice ();
switch (s)
{
case 1:
{
rectangle (50,50,120,54);
LIMBAJUL C TEORIE I APLICAI I 209
rectangle (50,129,120,133);
moveto (80,54);
linerel (0,75);
linerel (-25,0);
linerel (0,-4);
linerel (21,0);
linerel (0,-67);
linerel (-21,0);
linerel (0,-4);
linerel (25,0);
moveto (90,54);
linerel (25,0);
linerel (0,4);
linerel (-21,0);
linerel (0,67);
linerel (21,0);
linerel (0,4);
linerel (-25,0);
linerel (0,-75);
gotoxy (10,10);
printf ("Dati marimea profilului U 6,8,10,12=");
scanf ("%d",&n);
printf (" ---- U%d are caracteristicile---\n",n);
switch (n)
{
case 6:
i=1;
break ;
case 8:
i=7;
case 10:
i=13;
break ;
case 12:
i=19;
}
printf ("h=%.2f b=%.2f a=%.2f iy=%.2f iz=%.2f e=%.2f
",u[i],u[i+1],u[i+2],u[i+3],u[i+4],u[i+5]);
printf ("\n Dati distanta dintre profile in cm d=");
scanf ("%f",&d);
printf ("Dati latimea mai mare sau = %.0f si grosimea
platbandei in cm=",2*u[i+1]+d);
scanf ("%f,%f",&b,&t);
iyb=u[i+3]*2+t*t*t*b/6+b*t*2*(u[i]/2+t/2)*(u[i]/2+t/2);
izb=u[i+4]*2+b*b*b*t/6+2*u[i+2]*(d/2+u[i+5])*(d/2+u[i+5]);
a=2*u[i+2]+b*t*2;
LIMBAJUL C TEORIE I APLICAI I 210
printf ("\n aria =%.2f Iy=%.2f Iz=%.2f\n",a,iyb,izb);
}
}
puts ("apasa o tasta");
getch ();
}
5.12 Program pentru rezolvarea ecuaiei de gradul II
Pentru ca elevul s poat lucra singur i s fie testat fr a implica factorul uman, s-
a realizat un program ce permite alegerea unui set de 9 ecuaii de gradul II ,
afiarea acestei ecuaii ntr-un mod indentic cu scrierea pe tabl, apoi afiarea
casetei de dialog, n care elevul va indica cele dou soluii.
n urmtoarea etap se evalueaz de calculator soluiile date cu soluiile corecte i
atribuie sau nu 1 punct .
Se continu evaluarea urmtoarelor 8 ecuaii, n final calculatorul afieaz
punctajul obinut i nota.
Programul combin modul grafic cu modul text i prin dezvoltarea bazei de date
aferente celor 3 coeficieni a, b, c ale ecuaiei de gradul II, se poate realiza
evaluarea a unui numr ct mai mare de elevi.
La modificarea bazei de date se va ine cont ca soluiile sistemului s fie valori
reale.Programul surs a fost realizat pentru numrul calculatorului =6.
# include <stdio.h>
# include <conio.h>
# include <dos.h>
# include <graphics.h>
# include <math.h>
# include <stdlib.h>
void gresit (void);
void corect (void);
int ecu2 (float,float,float,float,float);
caseta1 (int ,int,int ,int, int,int );
int caseta2 (int um ,int cul , int stinga, int sus , int cul1, int cul2);
void main ()
{
int gdriver = DETECT,gmode,errorcode;
unsigned long s;
int xmax,ymax,i,ii,j,l,n,x,y,a,b,c,t,r,d,f,g,w1,w2;
int e,e1;
int um,cul,stinga,jos,dreapta,sus,cul1,cul2;
float w,z[170],xx1,xx2;
fflush (stdin);
w1=0; w2=0;
z[136]=1; z[137]=3; z[138]=-4;
z[139]=-6; z[140]=0 ; z[141]=6;
z[142]=1; z[143]=6 ; z[144]=-7;
LIMBAJUL C TEORIE I APLICAI I 211
z[145]=1; z[146]=0; z[147]=-64;
z[148]=7; z[149]=0 ; z[150]=0;
z[151]=1; z[152]=-5 ; z[153]=0;
z[154]=1; z[155]=-12; z[156]=36;
z[157]=4; z[158]=-7 ; z[159]=3;
z[160]=5; z[161]=15 ; z[162]=10;
clrscr ();
xmax=getmaxx();ymax=getmaxy();
initgraph(&gdriver,&gmode," ");
setviewport(0,0,getmaxx(),getmaxy(),0);
errorcode=graphresult();
if(errorcode!=grOk) printf("Eroare grafica:
%s\n",grapherrormsg(errorcode));
cleardevice();
MENIU:
clrscr ();
setfillstyle (SOLID_FILL,RED);
bar (100,100,300,240);
setcolor (WHITE);
moveto (120,160);
lineto (120,120);
lineto (279,120);
setcolor (BLACK);
outtextxy (125,130," ALGEBRA ");
outtextxy (125,140," Cls.a VIII-a ");
moveto (120,160);
lineto (279,160);
lineto (279,120);
moveto (120,220);
lineto (120,180);
lineto (279,180);
setcolor (WHITE);
moveto (120,220);
lineto (279,220);
lineto (279,180);
moveto (105,285);
lineto (295,285);
lineto (295,285);
setfillstyle (SOLID_FILL,LIGHTGRAY);
bar (100,280,300,440);
setcolor (WHITE);
moveto (105,435);
lineto (105,285);
lineto (295,285);
setcolor (BLACK);
lineto (295,435);
lineto (105,435);
outtextxy (135,190,"TEST DE EVALUARE");
outtextxy (135,200,"CU CALCULATORUL ");
setcolor (RED);
outtextxy (125,315,"ECUATIA DE GRADUL ");
LIMBAJUL C TEORIE I APLICAI I 212
outtextxy (125,330," al doilea ");
outtextxy (125,345,"");
gotoxy (16,24);
printf (" INTRODUCETI NR ");
gotoxy (16,25);
printf (" CALCULATORULUI =");
scanf ("%d",&f);
setcolor (BLUE);
for (w=10;w<=50;w=w+2)
{
delay (30);
circle (450,300,60+w);
}
delay (3000);
cleardevice();
for (i=-26+27*f;i<=27*f;i=i+3)
{
a=z[i];
b=z[i+1];
c=z[i+2];
setfillstyle (SOLID_FILL,RED);
bar (100,100,310,190);
setcolor (WHITE);
moveto (120,170);
lineto (120,120);
lineto (290,120);
setcolor (BLACK);
lineto (290,170);
lineto (120,170);
gotoxy (18,9);
printf ("REZOLVATI ECUATIA");
gotoxy (20,10);
if (a==1)
{
if (b<0)
if (b==-1)
{
if (c<0)
printf ("x^2-x%d=0",c);
else
if (c==0)
printf ("x^2-x=0");
else
printf ("x^2-x+%d=0",c);
}
else
{
if (c<0)
printf ("x^2%dx%d=0",b,c);
else
if (c==0)
LIMBAJUL C TEORIE I APLICAI I 213
printf ("x^2%dx=0",b);
else
printf ("x^2%dx+%d=0",b,c);
}
else
if (b==0)
{
if (c<0)
printf ("x^2%d=0",c);
else
if (c==0)
printf ("x^2=0");
else
printf ("x^2+%d=0",c);
}
else
if (b==1)
{
if (c<0)
printf ("x^2+x%d=0",c);
else
if (c==0)
printf ("x^2+x=0");
else
printf ("x^2+x+%d=0",c);
;
}
else
if (c<0)
printf ("x^2+%dx%d=0",b,c);
else
if (c==0)
printf ("x^2+%dx=0",b);
else
printf ("x^2+%dx+%d=0",b,c);
;
}
else
{
if (b<0)
if(b==-1)
{
if (c<0)
printf ("%dx^2-x%d=0",a,c);
else
if (c==0)
printf ("%dx^2-x=0",a);
else
printf ("%dx^2-x+%d=0",a,c);
}
LIMBAJUL C TEORIE I APLICAI I 214
else
{
if (c<0)
printf ("%dx^2%dx%d=0",a,b,c);
else
if (c==0)
printf ("%dx^2%dx=0",a,b);
else
printf ("%dx^2%dx+%d=0",a,b,c);
}
else
if (b==0)
{
if (c<0)
printf ("%dx^2%d=0",a,c);
else
if (c==0)
printf ("%dx^2=0",a);
else
printf ("%dx^2+%d=0",a,c);
}
else
if (b==1)
{
if (c<0)
printf ("%dx^2+x%d=0",a,c);
else
if (c==0)
printf ("%dx^2+x=0",a);
else
printf ("%dx^2+x+%d=0",a,c);
;
}
else
if (c<0)
printf ("%dx^2+%dx%d=0",a,b,c);
else
if (c==0)
printf ("%dx^2+%dx=0",a,b);
else
printf ("%dx^2+%dx+%d=0",a,b,c);
;
}
setfillstyle (SOLID_FILL,CYAN);
bar (100,250,310,342);
setcolor (WHITE);
moveto (120,330);
lineto (120,265);
lineto (290,265);
setcolor (BLACK);
lineto (290,330);
LIMBAJUL C TEORIE I APLICAI I 215
lineto (120,330);
gotoxy (18,18);
printf ("SCRIETI SOLUTIILE");
gotoxy (20,19);
printf ("X1=");
scanf ("%f",&xx1);
gotoxy (20,20);
printf ("X2=");
scanf ("%f",&xx2);
w1= ecu2 (a,b,c,xx1,xx2);
setfillstyle (SOLID_FILL,YELLOW);
bar (320,100,560,190);
setcolor (WHITE);
moveto (340,180);
lineto (340,110);
lineto (550,110);
setcolor (BLACK);
lineto (550,180);
lineto (340,180);
gotoxy (45,9);
printf ("PUNCTAJUL OBTINUT");
gotoxy (45,10);
printf ("PARTIAL=%d",w1);
w2=w1+w2;
gotoxy (45,11);
printf ("TOTAL=%d",w2);
setfillstyle (SOLID_FILL,BLUE);
bar (200,348,380,370);
delay (100);
for (ii=1;ii<=5;ii=ii+1)
{
gotoxy (28,23);
puts (" ");
delay (100);
gotoxy (28,23);
puts (" Apasati o tasta ");
delay (200);
}
getch ();
clrscr ();
}
dd:
setfillstyle (SOLID_FILL,MAGENTA);
setcolor (BLUE);
bar (100,200,400,360);
gotoxy (15,15);
printf (" PUNCTAJUL TOTAL OBTINUT ESTE= %d \n",w2 );
gotoxy (15,17);
printf (" ATI OBTINUT NOTA : %d ",w2+1);
gotoxy (17,21);
puts (" APASATI O TASTA ");
LIMBAJUL C TEORIE I APLICAI I 216
getch ();
closegraph ();
}
int ecu2(float a, float b, float c, float xx1 ,
float xx2)
{
float x1,x2,x1r,x1i,x2i,d ;
int punctaj1 ,punctjt ,i;
char e;
inceput:
clrscr ();
sound (1200);
delay (200);
nosound ();
puts ("");
/* puts (" ECUATIA DE GRADUL AL
DOILEA CU COEFICIENTI REALI "); */
fflush (stdin);
d=b*b-4*a*c;
if(d>0)
{
d=sqrt (d);
d=d/(2*a);
x1=-b/(2*a)+d;
x2=-b/(2*a)-d;
/* printf (" Solutiile ecuatiei sunt reale si
diferite \n"); */
/* printf (" x1=%f x2=%f\n",x1,x2); */
}
else
if (d==0)
{
if (b==0)
{
x1=0;
x2=0;
}
else
{
x1=-b/(2*a);
x2=x1;
}
/* printf (" Solutiile ecuatiei sunt reale si
egale \n "); */
/* printf (" x1=x2=%f \n",x1,x2); */
}
else
{
LIMBAJUL C TEORIE I APLICAI I 217
d=-d;
d=sqrt (d);
x1r=-b/(2*a);
x1i=d/(2*a);
/* printf (" Solutiile ecuatiei nu sunt
numere reale \n"); */
/* printf (" x1=%f+i*%f x2=%f-i*
%f\n",x1r,x1i,x1r,x1i); */
}
fflush (stdin);
if (fabs (xx1-x1)<=0.02)
{
if (fabs(xx2-x2)<=0.02)
{
punctaj1=1;
corect ();
}
else
{
punctaj1=0;
gresit ();
}
}
else
{
if (fabs (xx2-x1)<=0.02)
{
if (fabs (xx1-x2)<=0.02)
{
punctaj1=1;
corect ();
}
else
{
punctaj1=0;
gresit ();
}
}
else
{
punctaj1=0;
gresit ();
}
}
setfillstyle (SOLID_FILL,GREEN);
bar (320,250,560,342);
setcolor (WHITE);
moveto (340,330);
lineto (340,265);
lineto (550,265);
LIMBAJUL C TEORIE I APLICAI I 218
setcolor (BLACK);
lineto (550,330);
lineto (340,330);
gotoxy (45,18);
printf ("SOLUTIILE CORECTE SUNT");
gotoxy (45,19);
printf ("X1=%.2f",x1);
gotoxy (45,20);
printf ("X2=%.2f",x2);
return (punctaj1);
}
void corect (void)
{
bar (200,200,380,240);
gotoxy (29,14);
printf (" CORECT ");
}
void gresit (void)
{
bar (200,200,380,240);
gotoxy (29,14);
printf (" GRESIT ") ;
}
caseta1 (int um ,int cul , int stinga, int sus , int cul1, int cul2)
{
int dreapta,jos ;
dreapta=stinga+200;
jos=sus+190;
setfillstyle (um,cul);
bar (stinga,sus,dreapta,jos);
setcolor (cul1);
moveto (stinga+20,sus+90);
lineto (stinga+20,sus+20);
lineto (dreapta-30,sus+20);
setcolor (cul2);
outtextxy (stinga+25,sus+40," test1 ");
outtextxy (stinga+25,sus+60," rind 2 ");
moveto (stinga+20,sus+90);
lineto (dreapta-30,sus+90);
lineto (dreapta-30,sus+20);
moveto (stinga+20,sus+170);
lineto (stinga+20,sus+100);
lineto (dreapta-30,sus+100);
setcolor (cul1);
moveto (stinga+20,sus+170);
lineto (dreapta-30,sus+170);
lineto (dreapta-30,sus+100);
}
LIMBAJUL C TEORIE I APLICAI I 219
int caseta2 (int um ,int cul , int stinga, int sus , int cul1, int cul2)
{
int dreapta,jos,punctaj1 ;
dreapta=stinga+250;
jos=sus+190;
setfillstyle (um,cul);
bar (stinga,sus,dreapta,jos);
setcolor (cul1);
moveto (stinga+20,sus+90);
lineto (stinga+20,sus+20);
lineto (dreapta-30,sus+20);
setcolor (cul2);
outtextxy (stinga+25,sus+40,"");
outtextxy (stinga+25,sus+60,"");
moveto (stinga+20,sus+90);
lineto (dreapta-30,sus+90);
lineto (dreapta-30,sus+20);
moveto (stinga+20,sus+170);
lineto (stinga+20,sus+100);
lineto (dreapta-30,sus+100);
setcolor (cul1);
moveto (stinga+20,sus+170);
lineto (dreapta-30,sus+170);
lineto (dreapta-30,sus+100);
outtextxy (stinga+38,sus+30,"SOLUTIILE CORECTE SUNT");
gotoxy (stinga/6+3,sus/12+3);
printf ("X1=%.2f \n");
gotoxy (stinga/6+3,sus/12+5);
printf ("X2=%.2f");
return (punctaj1);
}
caseta3 (int um ,int cul , int stinga, int sus , int cul1, int cul2)
{
int dreapta,jos ;
dreapta=stinga+250;
jos=sus+190;
setfillstyle (um,cul);
bar (stinga,sus,dreapta,jos);
setcolor (cul1);
moveto (stinga+20,sus+90);
lineto (stinga+20,sus+20);
lineto (dreapta-30,sus+20);
setcolor (cul2);
outtextxy (stinga+25,sus+40," test1 ");
outtextxy (stinga+25,sus+60," rind 2 ");
moveto (stinga+20,sus+90);
lineto (dreapta-30,sus+90);
lineto (dreapta-30,sus+20);
LIMBAJUL C TEORIE I APLICAI I 220
moveto (stinga+20,sus+170);
lineto (stinga+20,sus+100);
lineto (dreapta-30,sus+100);
setcolor (cul1);
moveto (stinga+20,sus+170);
lineto (dreapta-30,sus+170);
lineto (dreapta-30,sus+100);
gotoxy (45,18);
printf ("SOLUTIILE CORECTE SUNT");
gotoxy (45,19);
printf ("X1=%.2f");
gotoxy (45,20);
printf ("X2=%.2f");
}
5.13 Program de rezolvare a sistemului liniar cu 2 necunoscute.
Pentru ca elevul s poat lucra singur i s fie testat fr a implica factorul uman, s-
a realizat un program ce permite alegerea unui set de 9 sisteme liniare , afiarea
acestor sisteme ntr-un mod indentic cu scrierea pe tabl, apoi afiarea casetei de
dialog, n care elevul va indica cele dou soluii.
n urmtoarea etap se evalueaz de calculator soluiile date cu soluiile corecte i
atribuie sau nu a unui punct pentru fiecare sistem prelucrat .
Se continu evaluarea urmtoarelor 8 sisteme, n final calculatorul afieaz
punctajul obinut i nota.
Programul combin modul grafic cu modul text i prin dezvoltarea bazei de date
aferente celor 6 coeficieni a, b, c, d,e, f, ale sistemului liniar, se poate realiza
evaluarea a unui numr ct mai mare de elevi.
La modificarea bazei de date se va ine cont ca soluiile sistemului s fie valori
reale. Pentru a controla accesul n program ct i nchiderea programului, s-a
prevzut un cod de intrare 1900 i un cod de terminare 1800, aceste coduri se pot
modifica prin schimbarea valorilor aferente n programul surs.
Programul surs este efectuat pentru numrul calculatorului =1.
# include <stdio.h>
# include <conio.h>
# include <dos.h>
# include <graphics.h>
# include <math.h>
# include <stdlib.h>
# include <stdarg.h>
void gresit (void);
void corect (void);
int ecu2 (float,float,float,float,float,float,float,float);
void main ()
{
int gdriver = DETECT,gmode,errorcode;
LIMBAJUL C TEORIE I APLICAI I 221
unsigned long s;
int xmax,ymax,i,ii,j,l,n,x,y,a,b,c,a1,b1,c1,t,r,d,f,g,w1,w2;
int e;
int um,cul,stinga,jos,dreapta,sus,cul1,cul2;
float w,z[170],xx1,xx2,e1;
fflush (stdin);
w1=0; w2=0;
puts ("DATI CODUL");
scanf ("%d",&r);
if (r==1900)
{
clrscr ();
xmax=getmaxx();ymax=getmaxy();
initgraph(&gdriver,&gmode," ");
setviewport(0,0,getmaxx(),getmaxy(),0);
errorcode=graphresult();
if(errorcode!=grOk) printf("Eroare grafica:
%s\n",grapherrormsg(errorcode));
cleardevice();
MENIU:
/* settextstyle (SANS_SERIF_FONT,HORIZ_DIR,0); */
/* setusercharsize (6,2,6,2); */
setfillstyle (SOLID_FILL,RED);
bar (100,100,300,240);
setcolor (WHITE);
moveto (120,160);
lineto (120,120);
lineto (279,120);
setcolor (BLACK);
outtextxy (125,130," ALGEBRA ");
outtextxy (125,140," Cls.a VIII-a ");
moveto (120,160);
lineto (279,160);
lineto (279,120);
moveto (120,220);
lineto (120,180);
lineto (279,180);
setcolor (WHITE);
moveto (120,220);
lineto (279,220);
lineto (279,180);
moveto (105,285);
lineto (295,285);
lineto (295,285);
setfillstyle (SOLID_FILL,LIGHTGRAY);
bar (100,280,300,440);
setcolor (WHITE);
moveto (105,435);
lineto (105,285);
LIMBAJUL C TEORIE I APLICAI I 222
lineto (295,285);
setcolor (BLACK);
lineto (295,435);
lineto (105,435);
outtextxy (135,190,"TEST DE EVALUARE");
outtextxy (135,200,"CU CALCULATORUL ");
setcolor (RED);
outtextxy (125,315,"SISTEME DE ECUATII ");
outtextxy (125,330," ");
outtextxy (125,345,"");
gotoxy (16,24);
printf (" INTRODUCETI NR ");
gotoxy (16,25);
printf (" CALCULATORULUI =");
scanf ("%d",&f);
setcolor (BLUE);
for (w=10;w<=50;w=w+2)
{
delay (30);
circle (450,300,60+w);
}
delay (3000);
cleardevice();
z[1]=1; z[2]=0; z[3]=5;
z[4]=2; z[5]=3; z[6]=4;
z[7]=5;z[8]=-1;z[9]=3;
z[10]=0;z[11]=1;z[12]=2;
z[13]=1; z[14]=-3; z[15]=0;
z[16]=5; z[17]=-7; z[18]=8;
z[19]=-4;z[20]=1;z[21]=-3;
z[22]=1;z[23]=1;z[24]=7;
z[25]=1; z[26]=-1; z[27]=4;
z[28]=1; z[29]=1; z[30]=11;
z[31]=1;z[32]=2;z[33]=3;
z[34]=2;z[35]=1;z[36]=3;
z[37]=1; z[38]=1; z[39]=1;
z[40]=1; z[41]=-1; z[42]=-3;
z[43]=-1;z[44]=4;z[45]=5;
z[46]=1;z[47]=3;z[48]=2;
z[49]=3; z[50]=2; z[51]=10;
z[52]=7; z[53]=-8; z[54]=-2;
for (i=-53+54*f;i<=54*f;i=i+6)
{
setfillstyle (SOLID_FILL,RED);
bar (100,100,310,190);
setcolor (WHITE);
moveto (120,180);
lineto (120,110);
lineto (290,110);
setcolor (BLACK);
LIMBAJUL C TEORIE I APLICAI I 223
lineto (290,180);
lineto (120,180);
gotoxy (18,8);
printf ("REZOLVATI SISTEMUL");
gotoxy (20,10);
a=z[i];
b=z[i+1];
c=z[i+2];
a1=z[i+3];
b1=z[i+4];
c1=z[i+5];
if (a==1)
{
if (b<0)
if (b==-1)
{
if (c<0)
printf ("x-y=%d",c);
else
if (c==0)
printf ("x-y=0");
else
printf ("x-y=%d",c);
}
else
{
if (c<0)
printf ("x%dy=%d",b,c);
else
if (c==0)
printf ("x%dy=0",b);
else
printf ("x%dy=%d",b,c);
}
else
if (b==0)
{
if (c<0)
printf ("x=%d",c);
else
if (c==0)
printf ("x=0");
else
printf ("x=%d",c);
}
else
if (b==1)
{
if (c<0)
printf ("x+y=%d",c);
LIMBAJUL C TEORIE I APLICAI I 224
else
if (c==0)
printf ("x+y=0");
else
printf ("x+y=%d",c);
;
}
else
if (c<0)
printf ("x+%dy=%d",b,c);
else
if (c==0)
printf ("x+%dy=0",b);
else
printf ("x+%dy=%d",b,c);
;
}
else
if (a!=0)
{
if (b<0)
if(b==-1)
{
if (c<0)
printf ("%dx-y=%d",a,c);
else
if (c==0)
printf ("%dx-y=0",a);
else
printf ("%dx-y=%d",a,c);
}
else
{
if (c<0)
printf ("%dx%dy =%d",a,b,c);
else
if (c==0)
printf ("%dx%dy=0",a,b);
else
printf ("%dx%dy=%d",a,b,c);
}
else
if (b==0)
{
if (c<0)
printf ("%dx=%d",a,c);
else
if (c==0)
printf ("%dx=0",a);
else
printf ("%dx=%d",a,c);
LIMBAJUL C TEORIE I APLICAI I 225
}
else
if (b==1)
{
if (c<0)
printf ("%dx+y=%d",a,c);
else
if (c==0)
printf ("%dx+y=0",a);
else
printf ("%dx+y=%d",a,c);
;
}
else
if (c<0)
printf ("%dx+%dy=%d",a,b,c);
else
if (c==0)
printf ("%dx+%dy=0",a,b);
else
printf ("%dx+%dy=%d",a,b,c);
;
}
else
{
if (b<0)
if (b==-1)
{
if (c<0)
printf ("-y=%d",c);
else
if (c==0)
printf ("-y=0");
else
printf ("-y=%d",c);
}
else
{
if (c<0)
printf ("%dy=%d",b,c);
else
if (c==0)
printf ("%dy=0",b);
else
printf ("%dy=%d",b,c);
}
else
if (b==0)
LIMBAJUL C TEORIE I APLICAI I 226
{
if (c<0)
printf ("=%d",c);
else
if (c==0)
printf ("=0");
else
printf ("=%d",c);
}
else
if (b==1)
{
if (c<0)
printf ("y=%d",c);
else
if (c==0)
printf ("y=0");
else
printf ("y=%d",c);
}
else
if (c<0)
printf ("%dy=%d",b,c);
else
if (c==0)
printf ("%dy=0",b);
else
printf ("%dy=%d",b,c);
;
}
gotoxy (20,11);
if (a1==1)
{
if (b1<0)
if (b1==-1)
{
if (c1<0)
printf ("x-y=%d",c1);
else
if (c1==0)
printf ("x-y=0");
else
printf ("x-y=%d",c1);
}
else
{
if (c1<0)
printf ("x%dy=%d",b1,c1);
else
LIMBAJUL C TEORIE I APLICAI I 227
if (c1==0)
printf ("x%dy=0",b1);
else
printf ("x%dy=%d",b1,c1);
}
else
if (b1==0)
{
if (c1<0)
printf ("x=%d",c1);
else
if (c1==0)
printf ("x=0");
else
printf ("x=%d",c1);
}
else
if (b1==1)
{
if (c1<0)
printf ("x+y=%d",c1);
else
if (c1==0)
printf ("x+y=0");
else
printf ("x+y=%d",c1);
;
}
else
if (c1<0)
printf ("x+%dy=%d",b1,c1);
else
if (c1==0)
printf ("x+%dy=0",b1);
else
printf ("x+%dy=%d",b1,c1);
;
}
else
if (a1!=0)
{
if (b1<0)
if(b1==-1)
{
if (c1<0)
printf ("%dx-y=%d",a1,c1);
else
if (c1==0)
printf ("%dx-y=0",a1);
LIMBAJUL C TEORIE I APLICAI I 228
else
printf ("%dx-y=%d",a1,c1);
}
else
{
if (c1<0)
printf ("%dx%dy =%d",a1,b1,c1);
else
if (c1==0)
printf ("%dx%dy=0",a1,b1);
else
printf ("%dx%dy=%d",a1,b1,c1);
}
else
if (b1==0)
{
if (c1<0)
printf ("%dx=%d",a1,c1);
else
if (c1==0)
printf ("%dx=0",a1);
else
printf ("%dx=%d",a1,c1);
}
else
if (b1==1)
{
if (c1<0)
printf ("%dx+y=%d",a1,c1);
else
if (c1==0)
printf ("%dx+y=0",a1);
else
printf ("%dx+y=%d",a1,c1);
;
}
else
if (c1<0)
printf ("%dx+%dy=%d",a1,b1,c1);
else
if (c1==0)
printf ("%dx+%dy=0",a1,b1);
else
printf ("%dx+%dy=%d",a1,b1,c1);
;
}
else
{
if (b1<0)
LIMBAJUL C TEORIE I APLICAI I 229
if (b1==-1)
{
if (c1<0)
printf ("-y=%d",c1);
else
if (c1==0)
printf ("-y=0");
else
printf ("-y=%d",c1);
}
else
{
if (c1<0)
printf ("%dy=%d",b1,c1);
else
if (c1==0)
printf ("%dy=0",b1);
else
printf ("%dy=%d",b1,c1);
}
else
if (b1==0)
{
if (c1<0)
printf ("=%d",c1);
else
if (c1==0)
printf ("=0");
else
printf ("=%d",c1);
}
else
if (b1==1)
{
if (c1<0)
printf ("y=%d",c1);
else
if (c1==0)
printf ("y=0");
else
printf ("y=%d",c1);
}
else
if (c1<0)
printf ("%dy=%d",b1,c1);
else
if (c1==0)
printf ("%dy=0",b1);
else
printf ("%dy=%d",b1,c1);
LIMBAJUL C TEORIE I APLICAI I 230
;
}
setfillstyle (SOLID_FILL,CYAN);
bar (100,250,310,342);
setcolor (WHITE);
moveto (120,330);
lineto (120,265);
lineto (290,265);
setcolor (BLACK);
lineto (290,330);
lineto (120,330);
gotoxy (18,18);
printf ("SCRIETI SOLUTIA");
gotoxy (20,19);
printf ("X=");
scanf ("%f",&xx1);
gotoxy (20,20);
printf ("Y=");
scanf ("%f",&xx2);
w1= ecu2 (a,b,c,a1,b1,c1,xx1,xx2);
setfillstyle (SOLID_FILL,YELLOW);
bar (320,100,560,190);
setcolor (WHITE);
moveto (340,180);
lineto (340,110);
lineto (550,110);
setcolor (BLACK);
lineto (550,180);
lineto (340,180);
gotoxy (45,9);
printf ("PUNCTAJUL OBTINUT");
gotoxy (45,10);
printf ("PARTIAL=%d",w1);
w2=w1+w2;
gotoxy (45,11);
printf ("TOTAL=%d",w2);
setfillstyle (SOLID_FILL,BLUE);
bar (200,348,380,370);
delay (100);
for (ii=1;ii<=5;ii=ii+1)
{
gotoxy (28,23);
puts (" ");
delay (100);
gotoxy (28,23);
puts (" Apasati o tasta ");
delay (200);
}
getch ();
clrscr ();
LIMBAJUL C TEORIE I APLICAI I 231
}
dd:
setfillstyle (SOLID_FILL,MAGENTA);
setcolor (BLUE);
bar (100,200,400,360);
gotoxy (15,15);
printf (" PUNCTAJUL TOTAL OBTINUT ESTE= %d \n",w2 );
gotoxy (15,17);
printf (" ATI OBTINUT NOTA : %d ",w2+1);
gotoxy (17,21);
puts ("CODUL DE TERMINARE");
gotoxy (17,22);
fflush (stdin);
scanf ("%f",&e1);
if (e1==1800)
{
gotoxy (17,22);
puts (" ");
gotoxy (17,21);
puts ("CORECT APASATI O TASTA");
}
else
{
gotoxy (17,22);
puts (" ");
goto dd;
}
}
else
puts ("\n EROARE");
getch ();
closegraph ();
}
int ecu2(float a, float b, float c,float a1, float b1, float c1, float xx1 , float
xx2)
{
float x1,x2,d ;
int punctaj1 ,punctjt ,i;
char e;
inceput:
clrscr ();
sound (1200);
delay (200);
nosound ();
puts ("");
fflush (stdin);
d=a*b1-a1*b;
if(d==0)
LIMBAJUL C TEORIE I APLICAI I 232
{
printf (" Sistemul nu are solutii unice \n");
}
else
{
x1=(c1*b-c*b1)/(a1*b-a*b1);
x2=(c1*a-c*a1)/(a*b1-a1*b);
}
fflush (stdin);
if (fabs (xx1-x1)<=0.02)
{
if (fabs(xx2-x2)<=0.02)
{
punctaj1=1;
corect ();
}
else
{
punctaj1=0;
gresit ();
}
}
else
{
punctaj1=0;
gresit ();
}
setfillstyle (SOLID_FILL,GREEN);
bar (320,250,560,342);
setcolor (WHITE);
moveto (340,330);
lineto (340,265);
lineto (550,265);
setcolor (BLACK);
lineto (550,330);
lineto (340,330);
gotoxy (45,18);
printf ("SOLUTIILE CORECTE SUNT");
gotoxy (45,19);
printf ("X=%.2f",x1);
gotoxy (45,20);
printf ("Y=%.2f",x2);
return (punctaj1);
}
void corect (void)
{
bar (200,200,380,240);
gotoxy (29,14);
printf (" CORECT ");
LIMBAJUL C TEORIE I APLICAI I 233
}
void gresit (void)
{
bar (200,200,380,240);
gotoxy (29,14);
printf (" GRESIT ") ;
}
LIMBAJUL C TEORIE I APLICAI I 234
Bibliografie
1. Williams S., Programming the 68000, Sybex Inc., Berkeley, 1982
2. Patrubany M., Totul despre microprocesorul Z80, Editura tehnic, Bucureti,
1989
3. Caius I., .a., Matematici clasice i moderne, Editura tehnic, Bucureti, 1983
4. Bobancu V., .a., Dicionar de matematici generale, Editura enciclopedic
romn, Bucureti, 1974
5. Ionic A., Iordan V., Algoritmi i programe, Editura Mirton, Timioara, 1994
6. Ilin A., Munteanu C., Programarea calculaoarelor Limbajul C, Editura
orizonturi universitare, Timioara, 2000
7. Negrescu L., Limbajul C i C++ pentru nceptori, volumele 1, 2 i 3,
Editura microinformatica, Cluj, 1994
8. Cprariu V., Ghid de utilizare Turbo C 2.0, Editura microinformatica, Cluj,
1991
9. Chioreanu C., Utilizare comenzi interfee MS-DOS 6.0, Editura
microinformatica, Cluj, 1994
10. Lucanu D., Proiectarea algoritmilor Tehnici elementare, Editura univeritii
Al. I. Cuza, Iai, 1993
11. Cucuruz L. R., Radu B., Limbaje de programare i utilizarea calculatoarelor,
Editura Mirton, Timioara, 1998
12. Boian F., .a., Informatica pentru elevi, Editura microinformatica, Cluj, 1992
13. Swan T., nvm C++ pas cu pas, Editura tehnic, Bucureti, 1996
14. Catrina O., Cojocaru I., Turbo C++, Editura Teora, 1993
15. Doande P. Pintea D. Utilizarea calculatoarelor, Editura de Vest, Timioara,
2002.
LIMBAJUL C TEORIE I APLICAI I 235
CUPRINS
1 Algoritmi.....................................................................................................9
1.1 Introducere...................................................................................................9
1.2. Algoritmi i organigrame........................................................................................9
1.2.1. Algoritmi liniari.....................................................................................11
1.2.2. Algoritmi ramificai................................................................................13
1.2.3. Algoritmi ciclici......................................................................................18
2. Mediul de programare turbo c 2.0..........................................................23
2.1. Mediul de lucru..........................................................................................23
2.1.2.Meniul principal..................................................................................................25
2.1.2.1.Meniul FILE.....................................................................................................26
2.1.2.2. Meniul Edit......................................................................................................26
2.1.2.3. Meniul Run .....................................................................................................30
2.1.2.4. Meniul Debug..................................................................................................30
2.1.2.5. Meniul Break/watch........................................................................................31
2.1.2.6. Meniul options.................................................................................................31
3. Structura unui program surs n limbajul C.........................................33
3.1. Crearea unui program..............................................................................34
3.2. Tipuri de date. ..........................................................................................36
3.2.1. Tipul ntreg.........................................................................................................36
3.2.2. Tipul real............................................................................................................36
3.2.3. Tipul caracter......................................................................................................36
3.3. Constante i variabile................................................................................37
3.3.1. Constante...........................................................................................................37
3.3.2. Variabile.............................................................................................................37
3.3.2.1. Variabile locale i globale...............................................................................38
3.3.2.2. Convenia de denumire a variabilelor i constantelor.....................................39
3.4. Funcii. Introducere..................................................................................39
3.4.1. Funcii standard de intrare ieire.........................................................40
3.5. Instruciuni. Expresii. Operatori..............................................................46
3.5.1. Instruciuni..........................................................................................................46
3.5.1.1. Instruciunea vid............................................................................................47
3.5.1.2. Instruciunea expresie......................................................................................47
3.5.1.3. Instruciunea compus.....................................................................................47
3.5.1.4. Instruciunea de atribuire.................................................................................48
3.5.2. Operatori.............................................................................................................48
3.5.2.1. Operatori aritmetici.........................................................................................49
LIMBAJUL C TEORIE I APLICAI I 236
3.5.2.2. Typecasting......................................................................................................49
3.5.2.3. Operatori relaionali.........................................................................................50
3.5.2.4. Operatorii logici...............................................................................................51
3.5.2.5. Operatorii de incrementare i decrementare....................................................52
3.5.3. Instruciunea if......................................................................................53
3.5.4. Instruciunea for....................................................................................60
3.5.5. Instruciunea while. ...............................................................................70
3.5.6. Instruciunea do while...........................................................................74
3.5.7. Instruciunea break. .............................................................................78
3.5.8. Instruciunea continue...........................................................................78
3.5.9. Funcia exit.............................................................................................79
3.5.10. Instruciunea switch............................................................................79
3.5.11. Instruciunea goto.................................................................................82
3.6. Apelul prin valoare i apelul prin referin al unei funcii. ..................83
3.7. Operaii asupra vectorilor. .....................................................................83
3.8. Operaii asupra tablourilor cu dou dimensiuni.....................................93
3.9. Funcii de bibliotec...............................................................................100
3.9.1. Funcii de intrare ieire. ...................................................................................101
3.9.2. Funcii matematice. .........................................................................................101
3.9.3. Funcii de uz general. ......................................................................................102
3.9.4. Funcii de conversie..........................................................................................105
3.10. Pointeri...................................................................................................108
3.11. Structuri i tipuri definite de utilizator................................................112
3.11.1. Declaraie de structur.......................................................................113
3.11.2. Accesul la elementele unei structuri..................................................114
3.11.3. Asignri de nume pentru tipuri de date............................................118
3.12. Prelucrarea irurilor de caractere........................................................119
3.12.1. Funcia strlen,lungimea irului de caractere....................................120
3.12.2. Funcia strcpy, copierea unui ir de caractere.................................121
3.12.3. Funcia strncpy, copierea a cel mult n caractere ale unui ir de
caractere..........................................................................................................122
3.12.4. Funcia strcat, concatenarea irurilor de caractere.........................122
LIMBAJUL C TEORIE I APLICAI I 237
3.12.5. Funcia strncat, concatenarea irurilor de caractere cu lungimea
impus.............................................................................................................123
3.12.6. Funcia strcmp, compararea a dou iruri de caractere.................123
3.12.7. Funcia stricmp, compararea a dou iruri fr a se face distincia
ntre litere mari sau mici................................................................................124
3.12.8. Funcia strincmp. ...............................................................................125
3.13. Prelucrarea fiierelor............................................................................126
3.13.1.1 Nivelul superior de prelucrare a fiierelor. ..................................................127
3.13.2. Intrri ieiri cu format.....................................................................................127
3.13.3. Poziionarea n fiier...........................................................................128
3.14. Preprocesorul C.....................................................................................131
Directiva #include......................................................................................................132
directiva #define ........................................................................................................132
Directiva #error..........................................................................................................136
Compilarea condiionat.............................................................................................136
Directiva #if................................................................................................................136
Directiva #elif.............................................................................................................138
Directivele #ifdef i ifndef..........................................................................................139
Diectiva #line.............................................................................................................140
Operatori de preprocesare # i ##...............................................................................140
4. Grafic n C...........................................................................................141
4.1. Moduri grafice.........................................................................................142
4.2. Sisteme de cordonate...............................................................................143
4.3. Culori i palete de culori.........................................................................143
4.4. Moduri de umplere..................................................................................144
4.5. Stiluri de linii...........................................................................................144
4.6. Afiarea textului n mod grafic..............................................................145
4.7. Tipuri de date folosite n funciile grafice..............................................146
4.8. FUNCII DE DESENARE.....................................................................150
4.8.1. ARC.................................................................................................................150
4.8.2. Bar....................................................................................................................151
4.8.3. Bar3d................................................................................................................152
4.8.4. Circle................................................................................................................154
4.8.5. Rectangle..........................................................................................................154
4.8.6. Line...................................................................................................................155
4.8.7. Moveto..............................................................................................................156
4.8.8. linerel................................................................................................................156
LIMBAJUL C TEORIE I APLICAI I 238
4.8.9. lineto.................................................................................................................157
4.8.10. moverel...........................................................................................................158
4.8.11. drawpoly.........................................................................................................159
4.8.12. ellipse..............................................................................................................161
4.8.13. fillellipse.........................................................................................................161
4.8.14. fillpoly............................................................................................................162
4.8.15. floodfill...........................................................................................................163
4.8.16. outtext.............................................................................................................164
4.8.17. outtextxy.........................................................................................................165
4.8.18. pieslice............................................................................................................166
4.8.19. putpixel...........................................................................................................167
4.8.20. sector...............................................................................................................167
4.9. Funcii pentru setarea variabilelor in mod grafic.................................168
4.9.1. Setallpalette......................................................................................................168
4.9.2. setbkcolor ........................................................................................................169
4.9.3. Setcolor.............................................................................................................169
4.9.4. setpalette...........................................................................................................169
4.9.5. setfillstyle.........................................................................................................170
4.9.6. setfillpattern......................................................................................................170
4.9.7. setlinestyle........................................................................................................171
4.9.8. settextjustify.....................................................................................................172
4.9.9. settextstyle........................................................................................................173
4.9.10. setviewport.....................................................................................................174
4.9.11. cleardwvice.....................................................................................................175
4.9.12. clearviewport..................................................................................................176
4.10. Funcii de interogare a sistemului........................................................176
4.10.1. getarccoords...................................................................................................176
4.10.2. getbkcolor.......................................................................................................177
4.10.3. getcolor...........................................................................................................178
4.10.4. getgraphmode.................................................................................................178
4.10.5. getmaxmode...................................................................................................179
4.10.6. getmaxx..........................................................................................................179
4.10.7. getmaxy..........................................................................................................179
4.10.8. imagesize........................................................................................................180
4.10.9. getimage.........................................................................................................180
4.10.10. getx...............................................................................................................181
4.10.11. gety...............................................................................................................182
4.10.12. getpixel.........................................................................................................182
4.11. Funcii de iniializare i nchidere a sistemului grafic........................183
4.11.1. initgraph..........................................................................................................183
4.11.2. closegraph.......................................................................................................183
5. Programe aplicative..............................................................................184
5.1. Programe i algoritmi pentru sortare i cutare..................................184
LIMBAJUL C TEORIE I APLICAI I 239
5.2. Program pentru rezolvarea sistemelor de ecuaii liniare....................189
5.3. Metoda Cramer pentru determinarea valorii determinantului..........193
5.4. Caracteristicile geometrice ale seciunilor transversale.......................195
5.5. Calculul analitic al eforturilor M, N, T..................................................196
5.6. Calculul ariilor contururilor poligonale nchise...................................199
5.7. Calculul integralelor prin metoda dreptunghiului...............................201
5.8. Soluionarea numeric a ecuaiilor neliniare prin metoda biseciei.. . .202
5.9 Calculul coordonatelor unei retrointersecie..........................................204
5.10 Calculul distanelor dintre puncte consecutive i calculul distanei
totale dintre primul i ultimul punct.............................................................205
5.11. Calculul momentelor de inerie i poziia centrului de greutate folosind
o baz de date pentru profile standard.........................................................207
5.12 Program pentru rezolvarea ecuaiei de gradul II................................210
5.13 Program de rezolvare a sistemului liniar cu 2 necunoscute................220

S-ar putea să vă placă și