Partea II- IDD Programarea in Limbajul C
Transcript of Partea II- IDD Programarea in Limbajul C
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
1/192
71
10. INTRODUCERE }N LIMBAJUL
DE PROGRAMARE C
Limbajul Ca fost inventat =i implementat prima dat[ ]n anii 70 de c[treDennis Ritchie, programator de sistem la Bell Laboratories. El ]=i are originea ]n
limbajul BCPL (Basic Computer Programming Language) care, prin
perfec\ion[ri =i dezvolt[ri succesive a devenit limbajul B =i ]n final limbajul C.
R[sp ndirea ini\ial[ a limbajului C se datoreaz[ folosirii sale ]n scrierea
sistemului de operare UNIX, sistem care cunoa=te ast[zi o ascensiune constant[
printre sistemele de operare existente.
Una din versiunile remarcabile ale limbajului C este cea furnizat[]mpreun[ cu versiunea a 5 a sistemului de operare UNIX. Aceast[ versiune este
descris[ prima oar[ ]n cartea lui Brian Kernighan =i Dennis Ritchie intitulat[ The
C Programming Language. Cartea este cunoscut[ ca un punct de referin\[ ]n
evolu\ia limbajului, fiind asimilat[ cu un adev[rat standard.
Apari\ia microcalculatoarelor a contribuit la r[sp ndirea spectaculoas[ a
limbajului C ]n diverse variante. De=i diferen\a dintre ele nu a fost niciodat[
semnificativ[, totu=i, pentru eliminarea anumitor neconcordan\e, ]n anul 1983 o
comisie special[ ]ncepe lucrul pentru elaborarea standardului ANSI (American
National Standards Institute) al limbajului C, care apare 6 ani mai t rziu, ]n anul
1989. La ora actual[ majoritatea compilatoarelor C sunt compatibile cu acest
standard.
}n primele 12 capitole ale lucr[rii se prezint[ limbajul C standard.
Datorit[ importan\ei domeniului s-a considerat util[ =i o ini\iere, ]n capitolul al
13-lea, ]n grafica pe calculator, folosind func\iile video Borland C++.
10.1. LOCUL LIMBAJULUI C }N FAMILIA
LIMBAJELOR DE PROGRAMARE
Familia limbajelor de programare se poate clasifica ]n: limbaje de nivel
cobor t, limbaje de nivel ]nalt=i limbaje de nivel mediu.
Prima categorie cuprinde limbajul cod-ma=in[=ilimbajul de
asamblare. Ambele sunt specifice tipului de ma=in[ de calcul pe care sunt
implementate. Limbajul cod ma=in[ este limbajul alc[tuit din acele instruc\iuni
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
2/192
72
elementare care sunt ]n\elese =i executate de un anumit tip de calculator.
Limbajul de asamblare folose=te ]n locul codurilor numerice reprezent[ri
simbolice, numite =i mnemonice, care u=ureaz[ munca de programare.
Opera\iile limbajului de asamblare sunt opera\ii de baz[ ale calculatorului. El nu
accept[ structuri de control =i date structurate, dar permite adresarea simbolic[ aloca\iilor de memorie. Din aceste motive programele ]n limbaj de asamblare sunt
lungi =i se scriu anevoios, dar sunt performante din punct de vedere al vitezei de
execu\ie =i al posibilit[\ilor de acces la resursele hardware.
A doua categorie, cea alimbajelor de nivel ]nalt, include nume
binecunoscute: Fortran, Cobol, Basic, Pascal etc.. O parte din tr[s[turile lor
comune se refer[ la posibilitatea de a folosi structuri de control, date structurate,
de a elabora cu u=urin\[ programe portabile (care se pot adapta u=or la
implementarea pe diverse categorii de sisteme de calcul). Limbajele din aceast[
categorie pierd ]ns[ calitatea esen\ial[ a limbajelor de nivel cobor t, aceea de a
exploata eficient resursele ma=inii de calcul pe care sunt implementate.
Categoria limbajelor de nivel mediu]mbin[ tr[s[turile principale ale
limbajelor de nivel ]nalt cu cele ale limbajelor de nivel cobor t. Limbajul C este
un limbaj de nivel mediu.
10.2. C~TEVA TRAS{TURI ALE
LIMBAJULUI C
Limbajul C ofer[ posibilitatea organiz[rii programelor ]n module =i
permite implementarea unor structuri de control =i tipuri de date care faciliteaz[
programarea structurat[. Ca =i limbajele de nivel ]nalt este u=or de ]nv[\at =i de
folosit, iar ]n plus are un num[r foarte mic de cuvinte cheie (32
cuvinte dup[
standardul ANSI C). Portabilitatea specific[ limbajelor de nivel ]nalt este
accentuat[ ]n C prin folosirea func\iilor de bibliotec[ ]n realizarea opera\iilor de
intrare/ie=ire =i de prelucrare a fi=ierelor. Num[rul mic de cuvinte cheie =i
prezen\a unei bogate familii de operatori permit realizarea unor programe
concise, cu un cod surs[ relativ mic. Compilatorul C este mai pu\in sever ]n
compara\ie cu majoritatea compilatoarelor limbajelor de nivel ]nalt. Dac[ la
aceste tr[s[turi ad[ug[m =i posibilitatea de a oferi facilit[\i ale limbajelor de nivel
cobor t (lucru cu adrese de memorie, accesarea regi=trilor, increment[ri,
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
3/192
73
decrement[ri, apelul unor func\ii ale sistemului de operare) ob\inem imaginea
unui limbaj puternic =i flexibil preferat ]n special de programatorii profesioni=ti.
10.3. STRUCTURA GENERAL{A UNUI PROGRAM C
Structura general[ a unui program Ceste urm[toarea:
directive preprocesordeclaratii globale
tip main(lista de parametri){declaratii locale
instructiuni}
tip f1(lista de parametri){declaratii localeinstructiuni}
tip f2(lista de parametri){declaratii locale
instructiuni}. . . . .
tip fn(lista de parametri){declaratii localeinstructiuni}
Preciz[ ri \i az[ uzual o f unc\i e
pr i nci pal [ =i ma i mu l t e f unc\i i secundare al e acest ei a. Rezul t at ul acest ei f aze ] l
const i t ui e o reprezent are modul ar [ , care ref l ect [ i nt erdependen\a di nt re f unc\i i le
pr obl emei . }n pr i nci pi u, or i ce program C este o secven\[ de f unc\i i af l ate l a
acel a=i ni vel .
Cuv i ntel emain, f1,f2,,fnsunt nume de f unc\ii C. Or i ce f unc\i e
di nt r -un progr am poat e apel a or i care al t [ f unc\i e di n program. Excep\i e face
f unc\i amain()care poat e apel a al t e f unc\i i , dar nu poat e f i apel at [ di nt r -o
f unc\i e a pr ogr amu l ui . La execu\i a unui pr ogr am C p rima f unc\i e apel at [ est emain(): execu\i a progr amu l ui ] ncepe =i se termi n[ cu i nst ruc\i uni di nmain(). Ea
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
4/192
74
este obl i gat ori e =i poate f i gura or i unde ] n pr ogr am. De obi cei est e pl asat [ l a
] nceput ul pr ogramu l ui , pent ru a -i m[ri l i zi bi l i tatea.
Directivele preprocesorsunt i nstruc\i uni dest i nat e
compilatorului, care f ace t ransf orm[ r i prel i mi nare asupra t extul ui ] nai nt e de a
] ncepe comp i l area. Faza preproces[ r i i are drept rezul t at ob\i nerea unei unit[ \i
de compilare. Un i t at ea de comp i l are est e anal i zat [ si nt act i c (comp i l at [ ), i ar
rezul t at ul este depus ]nmodule obiect. Modul el e obi ect rezul t at e, ]mpr eun[ cu
modul el e obi ect corespunz[ t oare f unc\ii l or de bi bl i ot ec[ f ol osi t e sunt >l egat e>
cu aj ut or ul pr ogramu l ui linkeditor(editor de leg[ tur i) ob\i n`ndu-se progr amu l
execut abi l . Di rect i vel e se const i t ui e ca un l i mbaj ]n i nteri orul l imbaj ul ui C =i
of er [ anumite faci l i t[ \i : comp i l ar ea condi\i onat [ a unor por\i uni de cod,
] nl ocui rea ] n t ext a unui i dent i f i cat or l a f i ecare apar i\i e cu un set de caractere,
i ncl uderea unui f i =i er surs[ ] n program etc..
O func\ie Ceste alc[tuit[ din antet =i un bloc de declara\ii =i instruc\iuni
delimitat de acoladele{ =i }, numit =i corpul func\iei. Antetul con\ine numele
func\iei, tipul valorii returnate (]ntreg, real etc.) =i o list[ de parametri formali care
poate fi eventual vid[.
O func\ie estedefinit[dac[ este prezentat[ complet, adic[ are forma:
antetcorpul func\iei
Dac[ se prezint[ doar antetul func\iei, se spune c[ func\ia estedeclarat[.
Declara\ia modern[ a unei func\ii poart[ numele deprototip.
Apelul func\iei se face sub forma
nume_functie(lista de parametri actuali)
=i presupune transferul controlului execu\iei programului c[tre instruc\iunile din
corpul func\iei, execu\ia acestora =i revenirea ]n func\ia apelant[ ]n punctul unde
se execut[ opera\ia care urmeaz[. Schema de apel este urm[toarea:
func\ie func\ie
apelant[ apelat[
apel functie
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
5/192
75
Figura 10.1 -Schema de apel a unei f unc\ii .
O func\ie C nu poate fi declarat[ sau definit[ ]n interiorul altei func\ii.
Declaratiile globalese refer[ la entit[\i (tipuri de date,
variabileetc.) care sunt recunoscute de toate func\iile.Declaratiile
localelimiteaz[ valabilitatea acestor entit[\i doar la nivelul func\iei unde se
fac. Prezen\a prototipului unei func\ii ]n zona declara\iilor globale face posibil[
recuno=terea sa ]n toate func\iile care o apeleaz[ =i permite evitarea unor erori de
apelare, ]nc[ din faza de compilare.
}n construc\ia unui program C se pot folosi dou[ categorii de func\ii:
func\ii utilizator, elaborate de programator;
func\ii standard(predefinite), care pot fi preluate dinbiblioteca
standarda limbajului C.
Func\iile standard ale limbajului se pot clasifica ]n: func\ii de
intrare/ie=ire, func\ii pentru prelucrarea caracterelor, func\ii pentru prelucrarea
=irurilor de caractere etc.. }n mod corespunz[tor prototipurile acestor func\ii suntgrupate ]n fi=iere speciale numitefi=iereantetsauheader(au extensia ). De
exemplu, func\iile matematice sunt grupate ]n fi=ierul antetmath.h,
func\iile de manipulare a =irurilor de caractere ]nstring.hetc.. Pentru a
utiliza o func\ie standard ]n program trebuie cunoscut prototipul ei. Acest lucru
este posibil prin includerea fi=ierului antet ]n program utiliz nd directiva
#include.
Un program C poate avea func\iile editate ]ntr-un singur fi=ier(programemonofi=ier) sau ]n mai multe fi=iere (programe multifi=ier). Un
exemplu simplu de program C este urm[torul:
Exemplul 10.1
Pr i mu l program C
#include stdio.h
void main(void)
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
6/192
76
{printf(\nPrimul program C!);}
Se observ[ c[ programul este alc[tuit dintr-o singur[ func\ie, func\ia
main()=i folose=te func\ia standardprintf()cu prototipul ]nstdio.h.
TESTE DE CONTROL
10.1Limbajul C a fost inventat de:
a) Niklaus Wirth
b) Dennis Ritchie
c) Brian Kernighan
10.2Limbajul C este:
a) un limbaj de nivel cobor t
b) un limbaj de nivel mediu
c) un limbaj de nivel ]nalt
10.3}n C, o func\ie:
a) nu se poate declara sau defini ]n interiorul alteia
b) poate apela o alt[ func\ie
c)
este alc[tuit[ din antet =i un bloc de declara\ii =i instruc\iuni delimitat
de cuvintelebegin=i end
10.4Func\iamain()
a) poate s[ lipseasc[ dintr-un program C
b) este obligatorie =i figureaz[ prima ]n program
c) este obligatorie =i poate figura oriunde ]n program
10.5}n C, o func\ie:a) poate include declara\ia sau defini\ia altei func\ii
b) poate fi declarat[ sau definit[ ]n interiorul altei func\ii
c) se poate apela numai dinmain()
d) se poate apela din orice alt[ func\ie
R{ SPUNSURI
10.1-b 10.2-b 10.3-a, b 10.4-c 10.5-d
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
7/192
77
11. ELEMENTE DE BAZ{
ALE LIMBAJULUI C
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
8/192
78
A=a cum se ]nt mpl[ cu orice limbaj artificial, temelia pe care se cl[desc
programele C este alcatuit[ dinalfabet=i vocabular(atomi lexicali).
Combin nd atomii lexicali dup[ regulile specifice de sintax[ se construiesc linii
valide de program =i, ]n final, programul.
11.1. ALFABETUL LIMBAJULUI
Alfabetul limbajului este alc[tuit dintr-o mul\ime de simboluri care se pot
clasifica ]nsimboluriafi=abile=i neafi=abile.
Setul minim desimboluriafi=abile(care pot fi reprezentate grafic) este
alc[tuit din:
litere mari ale alfabetului englez:A B C D E F G H I J K L M N O P Q R S TU V W X Y Z
litere mici ale alfabetului englez:
a b c d e f g h i j k l m n o p q r s tu v w x y z
cifre zecimale:0 1 2 3 4 5 6 7 8 9
liniu\[ de subliniere: _
semne de punctua\ie =i semne speciale:
, . ; : ? ( ) [ ] < > ! | \ / ~ # &
^ * - = + { } %
Prezent[m ]n Tabelul 11.1 denumirea unora din semnele enumerate.
Tabelu l 11.1 C` t eva semne fol osi te ]n C =i denumi rea l or
Semn Nume Semn Nume
| bar[ vertical[ / slash
\ backslash ~ tilda
# diez _ liniu\[ de subliniere (underscore)
& ampersand ^ s[geat[ sus
Simbolurile neafi=abile(f[r[ echivalent grafic) sunt reprezentate prin
secven\eescape(de evitare) sau coduribackslash-caracter. Aceste simboluri
reprezint[ coduri ASCII care nu pot fi citite de la tastatur[. Folosirea lor ]n
programe ]n locul echivalentelor ASCII este recomandat[ din ra\iuni de
portabilitate.
Codurile backslash ale limbajului C sunt prezentate ]n Tabelul 11.2.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
9/192
79
Tabelu l 11.2 \ i a l or
Coduri backslash Semnifica\ie
\a Alarm[
\b backspace (recul cu o pozi\ie)
\f form feed (salt pagin[ nou[)
\n newline (salt la r nd nou =i de la cap[t)
\r carriage return (retur car)
\t horizontal tab (tab orizontal)
\v vertical tab (tab vertical)
\ apostrof
\ ghilimele
\0 caracter nul
\\ backslash
\ddd caracter ASCII ]n nota\ie octal[
\xdd caracter ASCII ]n nota\ie hexazecimal[
Observa\ii:
Tab or i zont al ] nseamn[ sal t ul cursorul ui cu un num[ r de col oane, i ar t ab
ver t i cal sal t ul cursorul ui cu un num[ r de l ini i .
Nota\i a octal [ f ol ose=t e ci f re ] n baza8( adi c[ 0,1,2,3,4,5,6,7), iar
nota \i a hexazeci ma l [ ci f r e ] n baza16( adi c[ 0,1,2,3,4,5,
6,7,8,9,A,B,C,D,E,F). Se observ[ c[ l i t erel eA,B,C,D,E,F
corespund respect i v numerel or 10,11,12,13,14,15. Secven\el e\ddd
permi t scr i erea or i c[ rui caract er di n set ul ASCI I ca un num[ r oct al forma t di n
t rei ci f re, i ar secven\el e\xddca un num[ r hexazeci ma l forma t di n dou[
ci fre. De exemp l u, caract erul backspacepoat e f i scri s ca\010sau
\x08.
11.2. VOCABULARUL LIMBAJULUI
Vocabularul limbajului este alc[tuit din atomi lexicali. Ace=tia reprezint[
grupuri de simboluri afi=abile care primesc ]n timpul procesului de compilare oanumit[ semnifica\ie. Prezent[m mai jos urm[torii atomi lexicali:
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
10/192
80
identificatori (nume)
constante
operatori
semne de punctua\ie
simboluri speciale
11.2.1. IDENTIFICATORI
Un identificatorreprezint[ o secven\[ de litere, cifre, liniu\e de
subliniere, primul caracter din secven\[ fiind obligatoriu o liter[ sau liniu\[ de
subliniere.
De exemplu,Cod_mat,cod_mat,y_1,ax,_olsunt identificatori,
]n timp cex...1, a&b, 3xynu sunt. }n leg[tur[ cu identificatorii facem
urm[toarele preciz[ri:
}n C se face deosebirea ]ntre literele mari =i mici ale alfabetului. De exemplu,
Cod_mat=i cod_matreprezint[ nume diferite;
De=i sunt permi=i, este recomandabil ca identificatorii care ]ncep cu liniu\[ de
subliniere s[ fie evita\i. Ei pot coincide cu nume rezervate, invizibile
programatorului, provoc nd erori;
Standardul ANSI C nu limiteaz[ num[rul de caractere (lungimea) unui
identificator. Un compilator C va ignora ]ns[ caracterele aflate pe pozi\ii mai
mari dec t un num[r prestabilit.
Cuvintele cheiesunt cuvinte rezervate C care au o destina\ie prestabilit[
(nu pot fi folosite ca nume de func\ie sau variabil[). Standardul ANSI C are32
de cuvinte cheie, din care27au fost definite de varianta original[ a limbajului C
(standardul Kernighan/Ritchie).
Tabelu l 11.3 Cuv i nt e chei e dup[ st andardul Kerni ghan / Ri t chi e
auto break case char continue
default do double else extern
float for goto if int
long register return short sizeof
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
11/192
81
static struct switch typedef union
unsigned while
Tabelu l 11.4 Cuv i nt e chei e ad[ ugat e de st andar dul ANSI C
const enum signed void volatile
Dup[ cum se poate observa cuvintele cheie din C se scriu cu litere mici.
Pe l ng[ cuvintele cheie rezervate de standardul ANSI C, diverse tipuri de
compilatoare C includ =i cuvinte cheie folosite ]n exploatarea eficient[ a mediului
de operare specific (facilit[\i privind programarea interlimbaje, accesarea
]ntreruperilor etc.), numite cuvinte cheie extinse.
Cuvintele cheie extinse folosite cel mai des sunt:
asm cdecl far huge interrupt near
pascal _cs _ds _es _ss
11.2.2. CONSTANTE
Constantelepot fi numere, caractere, =iruri de caractere; valoarea lor nu
se schimb[ ]n timpul execu\iei unui program. }n C exist[ patru tipuri deconstante:]ntreg, real, caracter, =ir.
O constant[ ]ntreag[este un num[r zecimal, octal sau hexazecimal care
reprezint[ o valoare ]ntreag[ pozitiv[. Dac[ se doresc =i reprezent[ri ale unor
numere ]ntregi negative se adaug[ semnul minus ]n fa\a constantei respective.
Constantele ]ntregi zecimalesunt numere ]ntregi scrise ]n baza10(de
exemplu:759,+38,6496),constantele octalesunt numere ]n baza8care
]ncep, pentru identificare, cu cifra zero (de exemplu: 012,0765), iar
constantele hexazecimalesunt numere ]n baza16care ]ncep pentru identificare
cu caracterele0x(de exemplu:0xA3,0xBC1,0x7E31).
Constantele realesunt numere reale pozitive. Pentru a reprezenta valori
reale negative se plaseaz[ semnul minus ]n fa\a constantei. Semnul minus este
tratat ca operator aritmetic. Exist[ dou[ modalit[\i de reprezentare o constantelor
reale: ]nformatF(cu punct zecimal) =i ]nformat exponen\ial (form[
=tiin\ific[).
Reprezentarea ]n format F estereprezentarea uzual[pentru numere
reale. De exemplu, constantele32.753,0.591,-4296.823, .69sunt
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
12/192
82
valori reale reprezentate ]n format F. Se observ[ c[ partea ]ntreag[ a reprezent[rii
poate s[ lipseasc[ atunci c nd este egal[ cu zero (.69este tot una cu0.69).
O constant[ real[ ]n format exponen\ial are forma general[:
numar simbexp valexpunde:
numareste o constant[ ]ntreag[ sau o constant[ real[ ]n formatF
simbexpesteEsaue
valexpeste o constant[ ]ntreag[ pozitiv[ precedat[ sau nu de
semnele+sau-
grupulsimbexp valexpse interpreteaz[ ca fiind egal cu
10valexp.
Remarc[ .}n real i t ate ]nt renumar, simbexp, valexpnu aparspa\ii . De exemp l u, numerel e real e: 1.6*103, -2.6*10-4, 0.32*106,
423*104se scr i u, respecti v:1.6E+3,-2.6E-4,
0.32e+6,423E+04.
O constant[ caractereste o liter[, cifr[, semn de punctua\ie sau
secven\[ escape cuprinse ]ntre dou[ apostrofuri. Exemplu de constante caracter:
a,\n,\,7reprezent nd respectiva,newline,
apostrof,7.
O constant[ =ireste o secven\[ de litere, cifre =i simboluri incluse ]ntre
ghilimele. Exemple de constante =ir: \n Acesta e un sir, Str.
Cameliei, nr.3etc.. Constantele =ir se memoreaz[ ]n octe\i consecutivi
(un octet pentru fiecare caracter). Sf r=itul =irului este marcat de un octetnul
(care con\ine\0) ce se adaug[ automat. Din acest motiv un =ir cun
caractere ocup[ n+1octe\i consecutivi.
11.2.3. OPERATORI
Operatoriireprezint[ combina\ii de semne speciale care arat[
modalitatea de prelucrare sau atribuire a valorilor. Limbajul C posed[ o bogat[
familie de operatori, fapt ce permite elaborarea unor programe compacte.
}n Tabelul 11.5 prezent[m lista operatorilor C =i semnifica\ia lor.
Tabelu l 11.5 Li st a operat or i l or C =i semn i fi ca\i a l or
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
13/192
83
Operator Semnifica\ie
[] paranteze drepte (st ng[ si dreapt[)
() paranteze rotunde (st ng[ si dreapt[)
. membru structur[
referin\[ indirect[ la membru de structur[++ incrementare (prefix sau postfix)
-- decrementare (prefix sau postfix)
sizeof dimensiunea unei variabile sau unui tip ]n octe\i
~ NOT pe bit
! NOT logic
& adres[, +I pe bit
* indirectare, ]nmul\ire/ ]mp[r\ire
+ adunare
- sc[dere, nega\ie aritmetic[
> deplasare logic[ pe bit la dreapta
== egalitate
!= neegalitate< mai mic
> mai mare
= mai mare sau egal cu
^ SAU exclusiv pe bit
SAU pe bit
&& +I logic
|| SAU logic
?: operator condi\ional
= atribuire simpl[
op= atribuire compus[
% modul
, virgula (operator de secven\iere)
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
14/192
84
Observa\ie. Caract er ul opde l a at r i bui rea compus[ poat e f i unul di n semne l e*
/ % + - >> >= = . De la
regula de mai sus face excep\ie operatorul condi\ional (?:) care are alt[
interpretare.
11.2.4. SEMNE DE PUNCTUA| IE
Semnele de punctua\ie folosite ]n C sunt:... # : {}
Utilizarea lor va fi exemplificat[ pe parcursul lucr[rii.
11.2.5. SIMBOLURI SPECIALE
Orice simbol care nu apar\ine alfabetului C este considerat atom lexical.
Astfel de semne sunt:@=i $.Ele pot fi folosite ]n construc\ia constantelor
caracter =i a =irurilor. Ca exemplu, consider[m constanta =irAm folosit
semnul @ in FoxPro.
Atomii lexicali sunt separa\i ]n cadrul programului prin simboluri ale
alfabetului cu rol de separator.Separatoriisunt: spa\iul, tabul (orizontal =i
vertical), sf r=it de linie, sf r=it de pagin[, comentariu. Princomentariuse
]n\elege orice succesiune de simboluri cuprinse ]ntre /*=i */. Comentariile nu
sunt luate ]n considerare de compilator, ele servesc la documentarea programului
u=ur nd ]n\elegerea =i depanarea lui. Un comentariu poate fi plasat oriunde ]n
program =i se poate ]ntinde pe unul sau mai multe r nduri.
Exemplu:
/*Acest program calculeaza produsul a doua
matrici. Matricile de intrare A(4x3) si B(3x2) se
citesc de la tastatura, iar matricea produs
rezultata este C(4x2).
*/
Comentariile nu pot fi imbricate (incluse unul ]n altul). De exemplu,
urm[toarea construc\ie este eronat[:
/* Un comentariu care include
/* un comentariu inclus */
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
15/192
85
*/
Modul ]n care sunt aranja\i atomii lexicali ]ntr-un program este impus de
specificul problemei =i de regulile de sintax[ ale limbajului.
TESTE DE CONTROL
11.1Un identificator este:
a) o secven\[ de cifre, liniu\e de subliniere =i litere
b) o secven\[ de cifre, liniu\e de subliniere =i litere, primul caracter din
secven\[ fiind obligatoriu liniu\[ de subliniere sau liter[
c) o secven\[ de cifre, litere, spa\ii, liniu\e de subliniere
11.2}n C un identificator poate fi scris:a) numai cu litere mici
b) numai cu litere mari
c) combinat, cu litere mici =i litere mari
11.3Dac[ ]ntr-un identificator C se ]nlocuie=te o liter[ mic[ (mare) cu litera sa
omoloag[ mare (mic[) atunci:
a) identificatorul ob\inut este considerat identic cu primul
b) se ob\ine un identificator diferit
11.4}n C exist[:
a) patru tipuri de constante: ]ntregi, reale, caracter, =ir
b) patru tipuri de constante: naturale, reale, complexe, caracter
c) cinci tipuri de constante: ]ntregi, reale, complexe, caracter, =ir
11.5}n C secven\a de cifre0631este interpretat[ ca:
a) o constant[ ]n baz[ 10
b) o constant[ ]n baz[ 8
c)
o constant[ ]n baz[ 16
11.6Secven\a de caractere0xABCpoate fi:
a) un identificator
b) o constant[ hexazecimal[
c) =i una =i alta
11.7Cuvintele cheie:
a) au semnifica\ii date de programator
b)
au semnifica\ii prestabilitec) au semnifica\ii date de contextul ]n care sunt utilizate
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
16/192
86
11.8Despre constantele reale3.0E-2=i .03se poate afirma c[:
a) sunt gre=ite deoarece con\in punct ]n loc de virgul[
b) sunt corecte =i reprezint[ valori diferite
c) sunt corecte =i reprezint[ aceea=i valoare
d)
sunt gre=ite deoarece prima con\ine literaE, iar a doua nu are parte]ntreag[
11.9Secven\aareprezint[:
a) un =ir
b) un caracter
11.10Secven\a
Citirea matricii A
reprezint[:
a) un =ir
b) un comentariu
c) nici una, nici alta
11.11Construc\iile
a
=i
a:
a)
reprezint[ acela=i lucru
b) reprezint[ un =ir, respectiv un caracter
c) reprezint[ un caracter, respectiv un =ir
R{ SPUNSURI
11.1-b 11.2-c 11.3-b 11.4-a 11.5-b
11.6-b 11.7-b 11.8-c 11.9-b 11.10-c
11.11-c
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
17/192
87
12. EXPRESII }N C. FUNC| II DEINTRARE/IE+IRE UZUALE
PENTRU CONSOL{
Expresiilesunt combina\ii valide sintactic de date =i operatori. Aici, prin
date, ]n\elegem deopotriv[ constante =i variabile. Spre deosebire de constante
care sunt valori fixe, variabilele semnific[ valori care se pot modifica prin
program.
}n C, ca =i ]n alte limbaje, datele sunt clasificate ]n tipuri de date. Exist[
tipuri de date fundamentale(numite =i predefinite, simplesaude baz[) =i
tipuri de date derivate. Tipurile derivate (tablouri, pointeri, structuri, uniuni,
enumer[ri =i orice tip definit de programator) se bazeaz[ pe tipurile
fundamentale.
12.1. TIPURILE FUNDAMENTALE DE DATE }N
C
Tipurile de date fundamentale din C se ]mpart ]n cinci categorii:char,
int, float, double=i void. Primele patru tipuri se mai numesc =i tipuri aritmetice
=i se refer[ respectiv la valori caracter, ]ntregi, reale ]n simpl[ precizie =i reale ]ndubl[ precizie. Tipul de datevoidindic[ absen\a oric[rei valori =i este utilizat, de
exemplu, la descrierea func\iilor care nu returneaz[ nici o valoare.
Dimensiunea zonei de memorie alocate =i domeniul de valori asociate
tipurilor aritmetice pot s[ difere func\ie de varianta de implementare a limbajului
=i de tipul de procesor folosit.
Standardul ANSI C nu precizeaz[ dec t domeniul minimal de valori al
fiec[rui tip de date, nu =i dimensiunea sa. }n majoritatea implement[rilor ]ns[,
tipulcharocup[ un octet, intocup[ doi octe\i, iar floatpatru octe\i. Domeniul
de valori poate fi modificat utiliz ndmodificatorii de tip. Ace=tia sunt:signed,
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
18/192
88
unsigned, short=i long. Modificatorii signed, unsigned, short=i longse pot
aplica tipului int, signed=i unsigned, tipuluichar, iar long, tipuluidouble.
Efectul aplic[rii modificatorilor signedsauunsignedasupra tipurilor de date
]ntregi const[ ]n interpretarea diferit[, din punct de vedere al semnului, a
informa\iei memorate. S[ consider[m o configura\ie binar[ de lungime N, bi\iifiind numerota\i ca mai jos:
N - 1 N - 2 1 0
Figura 12.1 Conf i gura\i e bi nar [ de N bi \i
Dac[ aceast[ zon[ o destin[m memor[rii doar a ]ntregilor pozitivi, printr-
un calcul simplu se poate vedea c[ plaja de reprezentare este[0, 2N-1]. Dac[
zona este destinat[ memor[rii at t a ]ntregilor cu semn c t =i f[r[ semn, bitul N-1
va fi folosit pentru reprezentarea semnului (0 pentru numere pozitive, 1 pentru
numere negative), iar plaja de reprezentare va fi[-2N-1, 2N-1-1].
Av nd ]n vedere aceste considera\ii , de exemplu, o variabil[ de tip
signedintva avea un domeniu de valori cuprins ]ntre -32768 =i 32767, iar una
de tipunsignedintva lua valori ]ntre 0 =i 65535.
Observa\ii:
Pent ru t i pul ] nt reg de dat e (char, int, short, long) reprezent area i mp l i ci t[
estesigned.
Speci f i carea unui modi f i cat or f [ r[ t i p ] nseamn[ consi derarea i mp l i ci t [ a
t i pul ui int.
}n C nu exi st [ t i pul de dat e bool ean. Di n acest mo t i v f unc\i oneaz[
urm[ t oar ea conven\i e: or i ce expresi e di f er i t [ de zero are val oareaadev[ rat, i ar
dac[ e egal [ cu zer o, val oar eafals.
12.2. VARIABILE +I TIPURI DE DATE
Asocierea dintre numele unei variabile =i un anumit tip de date se face
folosind declara\iile. Forma general[ adeclara\ieiuneivariabileeste:
tip lista_de_variabile;
unde:
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
19/192
89
tippoate fi orice tip de date recunoscut ]n C, iar
lista_de_variabilecon\ine unul sau mai mul\i identificatori desp[r\i\i
prin virgul[. }n exemplele de mai jos vom folosi doar tipurile fundamentale.
Exemplede decl ara\i i de vari abi l e:
float x,y;
int a,b1;
short a_x,b_y;
double z;
Orice variabil[ folosit[ ]n program trebuie mai ]nt i declarat[. Dac[ pe
linia de declarare variabila este ini\ializat[ se spune c[ are loc o definirea
variabilei.
Exemplede decl ara\i i =i def i ni\i i de vari abi l e:float x=38.981,I;
int ab=-453;
char ch=A,z;
Orice variabil[ definit[ (adic[ declarat[ =i ini\ializat[) p[streaz[ ]n
continuare atributul de baz[ al variabilei, adic[ poate fi modificat[. Dac[ se
dore=te asocierii dintre o variabil[ =i o anumit[ valoare se utilizeaz[
modificatorul de acces(saucalificatorul) const. Practic, efectul unei declara\ii
de genul
const tip nume_variabila;
este crearea constantei simbolicenumecare poate fi utilizat[, dar nu poate fi
modificat[ prin program. Dac[ tiplipse=te se consider[ implicit c[ tipul este
int. }n exemplul de mai jos se definesc dou[ constante, constantapi=i constanta
de tip int, ore_zi.
Exemplu:
const double pi=3.1415926536;
const ore_zi=24;
12.3. CONSTANTE +I TIPURI DE DATE
}nCapitolul 11(vezi paragraful Vocabularul limbajului), am prezentat
o clasificare a constantelor ]n: ]ntregi, reale, caracter, =ir. Se pune problema, c[rui
tip de date ]i apar\ine o constant[ numeric[? C nd constanta este caracter,
r[spunsul este simplu: tipuluichar. De asemenea, constanta ]n virgul[ mobil[ (]n
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
20/192
90
nota\ie uzual[ cu punct sau ]n nota\ie =tiin\ific[) va apar\ine tipului double.
Pentru celelalte constante numerice compilatorul va considera implicit ]ncadrarea
]n cel mai mic tip de date compatibil. De exemplu, 23este de tipint, 65000de
tipunsigned, 2000002de tip longint. }ncadrarea ]ntr-un tip de date se poate
face =i explicit ad[ug nd constantei unul din sufixurileLsauU, dac[ e ]ntreag[sauFsauL, dac[ e real[. Constanta ]ntreag[ cu sufixul Leste de tiplong, iar cu
sufixulU, de tipunsigned. Constanta real[ cu sufixul Fare tipulfloat, iar dac[ e
urmat[ de sufixul Lare tipul longdouble.
12.4. FUNC| II UZUALE DE INTRARE/IE+IRE
PENTRU CONSOL{.
DESCRIPTORI DE FORMAT
Prezent[m ]n continuare func\iile folosite frecvent pentru transferul de
date de la tastatur[ ]n memoria calculatorului (func\ii de intrare) =i din memoria
calculatorului pe ecran (func\ii de ie=ire); cu aceast[ ocazie introducem =i
descriptorii de formatcei mai folosi\i. Deosebim trei categorii de func\ii de
intrare/ie=ire pentru consol[:
func\ii generale de intrare/ie=ire (scanf()=i printf());
func\ii speciale de intrare/ie=ire:
func\ii pentru citirea =i scrierea caracterelor;
func\ii pentru citirea =i scrierea =irurilor de caractere.
12.4.1. FUNC| IILE PRINTF() +I SCANF()
Aceste func\ii reprezint[ echivalentele pentru consol[ a func\iilor de
intrare/ie=ire pentru fi=iere,fprintf()=i fscanf().
Forma general[ a func\iei de afi=areprintf()este:
int
printf(sir_format,lista_de_argumente);
unde:
sir_formatpoate con\ine: mesaje pentru utilizator, secvente escape
=i descriptori de format pentru valorile care se afi=eaz[;
lista_de_argumentereprezint[ variabile sau expresii al c[ror
con\inut se va afi=a.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
21/192
91
Func\ia ]ntoarce num[rul de caractere scrise efectiv sau o valoare
negativ[ ]n caz de insucces.
Preciz[ ri:
Descri pt ori i de f ormat servesc l a ef ectuarea conversi i l or di nt rereprezent area ext ern[ =i i nt ern[ ( l a ci t i re) =i ] nt re reprezent area i nt ern[ =i
ext ern[ ( l a scr i ere); f orma t ul extern presupune succesi uni de caractere, i ar cel
i nt ern succesi uni de ci f re bi nare;
At `t l a scri ere c t =i l a ci t i re, descri pt ori i de forma t sunt pu=i ] n
coresponden\[ de l a st ` nga spre dreapta cu el ement el e l i st ei de argumente.
Ar gument ul t rebui e s[ f i e compat i bi l cu t i pul anun\at ] n descr i pt orul de f orma t
cor espunz[ t or ;
Dac[ num[ r ul de ar gument e est e ma i mi c dec`t num[ r ul descr i pt or i l or de
forma t , dat el e de i e=i re sunt nedef i ni t e; dac[ num[ r ul ar gument el or est e ma i
mar e dec` t num[ r ul descr i pt or i l or de forma t , argument el e ] n pl us sunt i gnorat e.
}n Tabelul 12.1 prezent[m lista celor mai utiliza\i descriptori folosi\i de
func\ia printf()=i semnifica\ia lor.
Tabelu l 12.1Descri pt or i de f ormat
Descriptori Utilizare
%u numere ]ntregi zecimale f[r[ semn
%d sau%i numere ]ntregi zecimale cu semn
%c caracter
%f numere reale ]n nota\ie uzual[
%e sau% E numere reale ]n nota\ie =tiin\ific[ (e sau E)
%x sau%X hexazecimal f[r[ semn (litere mici sau
majuscule)
%o octal f[r[ semn
%s =ir de caractere
%g sau%G se alege reprezentarea cu num[rul cel mai
mic de caractere dintre cea ]n nota\ie uzual[
=i cea ]n nota\ie =tiin\ific[ (de tip e sau E)
%p valoare pointer
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
22/192
92
Descriptorul%xare ca efect afi=area cifrelor hexazecimale
A,B,C,D,E,Fcu liter[ mic[; dac[ se folose=te%Xse afi=eaz[ cu litere mari.
Dac[ se folose=te%eliteraedin nota\ia =tiin\ific[ apare cae, iar dac[
se folose=te %E, apare ca majuscul[ (literaE).Valorile de tip long intse afi=eaz[ utiliz nd%ld,%li,%lu,%lo
sau%lx.
Valorile de tipshort intse afi=eaz[ utiliz nd%hd,%hi,%hu,%ho
sau%hx.
Pentru a afi=a valori doublese va alege una din variantele:
%lf,%le,%lE,%lg,%lG, iar pentru valori long doubleuna din variantele:
%Lf,%Le,%LE,%Lg,%LG.Tabelul 3.1 prezint[ descriptori de format f[r[ caracteristici de lungime,
precizie =i aliniere. Folosi\i astfel, ei aliniaz[ implicit valorile la st nga =i folosesc
spa\iu de afi=are necesar reprezent[rii acestor valori dup[ cum urmeaz[:
%f afi=eaz[ implicit partea ]ntreag[, punctul =i 6 cifre la partea subunitar[;
%esau%E afi=eaz[ implicit o cifr[ la partea ]ntreag[, 6 cifre la partea
subunitar[, caracterul esauE=i exponentul precedat de+sau-;
%gsau%G alege reprezentarea cu cel mai mic num[r de caractere dintre
cea uzual[ =i cea =tiin\ific[.
%d,%i,%c,%o,%x,%X,%s,%p folosesc un num[r de coloane egal cu
num[rul de caractere ce trebuie afi=ate.
Exemplific[m folosirea descriptorilor prezenta\i =i a secven\elor de
evitare cu ajutorul urm[toarelor programe:
Exemplul 12.1
Af i =area val or i l or =i sumei a dou[ numere ] nt regi , sub f orma:
x=valoare y=valoaresuma=valoare
# include "stdio.h"
void main(void){int x=10, y=-43;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
23/192
93
printf ("\n\tx=%d\t\y=%d\n\t suma=%i", x,y,x+y);
}
Exemplul 12.2
Af i =area unei constant e ] nt regi =i a val or i l or sal e ] n octal =i hexazeci ma l pe c`t e
un r ` nd.
#include "stdio.h"
void main(void){const x=4529;printf("\n numarul este=%d\n",x);printf("\n valoarea in octal este=%o",x);
printf("\n valoarea in hexazecimal este=%x",x);}
Exemplul 12.3
Af i =ar ea unui caract er =i a codul ui s[ u ASCI I ; af i =area se va t ermi na cu un
semnal sonor .
#include "stdio.h"
void main(void){char a='Q';printf("\n caracterul %c are codul
ASCII=%i\a",a,a);}
Exemplul 12.4
Af i =area unor val or i f ol osi nd di ver=i descr i pt or i de f orma t ; coment ar i i l e arat [
ef ectul execu\i ei f unc\i ei printf().
#include "stdio.h"
void main(void){char ch;short k;int i;long int j;
float x;clrscr();ch='A';
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
24/192
94
printf("\n Caracterul %c are codul ASCII =%i",ch,ch);
/* Caracterul A are codul ASCII = 65 */
k=250;printf("\n k=%hu",k); /* k=250 */
i=4567;printf("\n i=%i",i); /* i=4567 */printf("\n i=%u",i); /* i=4567 */printf("\n -i=%i",-i); /* -i=-4567 */printf("\n i=%i",i); /* i=4567 */printf(" are valoarea hexazecimala %x",i);/* are valoarea hexazecimala 11d7 */printf(" sau echivalent, %X",i);/* sau echivalent, 11D7 */printf("\n i=%i",i); /* i=4567 */printf(" are valoarea octala %o",i);
/* are valoarea octala 10727 */j=123456;printf("\n j=%li",j); /* j=123456 */
x=76.5432;printf("\n x=%f",x); /* x=76.543198 */printf("\n x=%e",x); /* x=7.65320e+01 */printf("\n x=%E",x); /* x=7.65320E+01 */printf("\n x=%g",x); /* x=76.543200 */printf("\n x=%G",x); /* x=76.543200 */
x=-0.123456789;
printf("\n x=%f",x); /* x=-0.123457 */printf("\n x=%e",x); /* x=-1.234568e-01 */printf("\n x=%E",x); /* x=-1.234568E-01 */printf("\n x=%g",x); /* x=-0.123457 */printf("\n x=%G",x); /* x=-0.123457 */
printf("\n %s","testare");}
Dimensiunea c mpului de afi=are, precizia=i modul de alinierepot fi
stabilite prin simboluri plasate ]ntre semnul%=i specificatorul descriptorului de
format (i,d,u,fetc.).
Astfel, un ]ntreg pozitiv aflat ]ntre%=i specificatorul descriptorului de
format indic[ dimensiunea minim[ a c mpului de afi=are. Dac[ =irul sau
num[rul care se afi=eaz[ are mai multe caractere dec t dimensiunea minim[
precizat[, atunci afi=area va fi integral[, ]n caz contrar se completeaz[ cu spa\ii
p n[ la realizarea dimensiunii minime. Dac[ dorim ca aceast[ completare s[ fie
f[cut[ cu cifra0]n loc de spa\ii, atunci, ]nainte de ]ntregul care specific[dimensiunea de afi=are, se pune cifra0.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
25/192
95
De exemplu, descriptorul%7fsemnific[ afi=area unui num[r real pe
minim7coloane =i, completarea eventualelor coloane libere cu spa\ii, iar%07f
impune acela=i num[r minim de coloane pentru afi=are, ]ns[ completarea
coloanelor libere se va face cu cifra0.
Utilitatea preciz[rii dimensiunii minime de afi=are apare mai ales la
afi=area tablourilor ]n care alinierea se face pe coloane.
Programul urm[tor ilustreaz[ efectul preciz[rii dimensiunii c mpului de
afi=are:
Exemplul 12.5
Af i =area unor val or i f ol osi nd descr i pt or i de f orma t cu preci zarea di mensi uni ic` mpul ui de af i =are
#include "stdio.h"
void main(void){int i;float x;
i=4567;
printf("\n i=%4i",i); /* i=4567 */printf("\n i=%6i",i); /* i= 4567 */printf("\n i=%3i",i); /* i=4567 */printf("\n i=%06i",i); /* i=004567 */
x=76.123001;printf("\n x=%10f",x); /* x= 76.123001 */printf("\n x=%010f",x); /* x=076.123001 */
printf("\n %3s","testare"); /* testare */printf("\n %10s","testare"); /* testare */}
Precizia de afi=arese specific[ printr-un punct urmat de un ]ntreg
pozitiv. Specificatorul de precizie astfel ob\inut se plaseaz[ imediat dup[
dimensiunea c mpului de afi=are (c nd este precizat[). Interpretarea lui depinde
de tipul de date avut ]n vedere.
De exemplu, descriptorul%7.3findic[ afi=area unui num[r real pe
minim7coloane =i cu3cifre zecimale dup[ virgul[. Lucrurile se petrec
asem[n[tor dac[ ]n loc de%fse folose=te%esau%E. Dac[ se folose=te unul din
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
26/192
96
descriptorii %gsau%Gspecificatorul de precizie arat[ minimul de cifre
semnificative.
Aplicat unui ]ntreg, specificatorul de precizie arat[ num[rul minim de
cifre cu care va apare afi=at ]ntregul respectiv (dac[ ]ntregul nu are suficiente
cifre atunci se completeaz[ la ]nceput cu num[rul necesar de cifre0).Un descriptor de format prev[zut cu specificator de dimensiune =i
specificator de precizie poate fi aplicat unui =ir cu lungimea cuprins[ ]ntre
valoarea specificatorului de dimensiune =i cea a specificatorului de precizie.
Dac[ se dep[=e=te valoarea specificatorului de precizie, =irul se trunchiaz[.
Se poate impune alinierea la st nga a datelor plas nd semnul (minus)
imediat dup[ semnul %]n cadrul descriptorului.
Programul urm[tor ilustreaz[ toate cazurile prezentate:
Exemplul 12.6
Af i =area unor val ori f ol osi nd di verse faci l i t [ \i al e descr i pt ori l or prezent a \i
#include "stdio.h"
void main(void){int i;
double x;
i=4567;printf("\n i=%3.7i",i); /* i=0004567
*/printf("\n i=%7.3i",i); /* i= 4567
*/printf("\n i=%-7.3i",i); /* i=4567
*/x=76.123401;printf("\n x=%10.3f",x); /* x= 76.123
*/
printf("\n x=%-10.3f",x); /* x=76.123*/
printf("\n x=%3.7f",x); /* x=76.1234010*/
printf("\n x=%10.2e",x); /* x= 7.61e+01*/
printf("\n x=%-10.1E",x); /* x=7.6E+01*/
printf("\n x=%10.3g",x); /* x= 76.1*/
printf("\n x=%-10.4G",x); /* x=76.12*/
printf("\n %.4s","testare"); /* test*/
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
27/192
97
printf("\n %10.4s","testare"); /* test*/
printf("\n %-10.4s","testare");/* test*/
printf("\n %-1.10s","testare");/* testare*/
}
Func\ia de citirescanf()are forma general[:
int scanf(sir_format,lista_de_argumente);
unde:
sir_formatpoate con\ine descriptori de format, caractere de spa\iere
albe, alte caractere;
lista_de_argumenteeste de forma:&var1,&var2,...,&varn.
Prin&vse ]n\elege adresa variabileiv.
Func\ia ]ntoarce num[rul de argumente c[rora li s-a atribuit o valoare sau
constanta EOF (egal[ de obicei cu 1) ]n caz de insucces.
Preciz[ ri:
}n mar ea l or ma j ori t at e descri pt ori i de forma t fol osi\i l a f unc\i ascanf()sunt
i dent i ci cu cei de l a f unc\i aprintf(); pract i c, di n t abel ul prezent at ant er i or
ob\i nem o l i st [ val i d[ pent ruscanf(), ] ndep[ r t ` nd%E,%X,%G. Fol osi\i cuscanf(), descri ptori i %f,%e,%gsunt echi val en\i.
Li st a de argument e est e ci t i t [ de l a st `nga l a dreapt a =i asoci at [ ] n aceast [
ordi ne cu l i sta de descr i pt or i . Fi ecare descr i pt or arat [ f unc\iei scanf()t i pul
val or i i care se va ci t i : ]nt reg, real , =i r, poi nter etc. . S[ observ[ m c[ aceste val or i
sunt t ransf erat e vari abi l el or v1,v2,...vnpri n i nt ermedi ul adresel or
&v1,&v2,...&vn.
Est e de men\i onat f apt ul c[ ] n cazul ci t i r i i unui =i r , deoarece ] nsu=i numel e
=i rul ui reprezi nt [ o adres[ , operat orul de l uare a adresei &nu va ma i preceda
obl i gat or i u numel e =i rul ui . Un exempl u de progr am care ci t e=te =i ruri de
caractere este prezent at ] nCapitolul 14(vezi paragraf ul Func\ii pentru
prelucrarea =ir ur ilor de caractere).
Ca =i ] n cazul f unc\iei printf()descr i pt or i i de f orma t pot avea =i un
modi f i cat or de l ungi me max im[ a =i rul ui de caract ere care va f i ci t i t . De
exemp l u, apel ul :
scanf(%15s,sir);
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
28/192
98
are drept conseci n \[ ci t i rea a max imum15caractere di n =i rul de i nt rare =i
atri bui rea =i rul ui f orma t vari abi l ei sir. Dac[ =i rul de i nt rare are ma i mu l t de
15caractere, caract erel e ] n pl us se i gnor [ ; l a un nou apel al f unc\iei scanf()
expl orarea =i rul ui de i nt rare ] ncepe cu aceste caractere ant er i or i gnorat e.
Caract er el e al be de spa\iere ]n =i ruri l e de i nt rare pot f i blankurile
(spa\i i l e al be), taburile( spa\ii tab) , sau caracterul l i ni e nou[ ( t asta
enter). Acest e caract er e al be de spa\i ere sunt i gnorat e dac[ ] n =i rul forma t
avem corespunz[ t or ] nt re descr i pt or i cel pu\i n un spa\i u. De asemenea, or i ce al t
caract er poat e f i f ol osi t ca separat or ] n f l uxul de i nt rare, cu condi\i a ca el s[ f i e
pl asat corespunz[ t or =i ] nt re descr i pt or i i de f orma t di nsir_format. Dac[
aceast [ condi\i e nu e ] ndepl i ni t [ , l a pri ma neconcor dan\[ (de l a st `nga l a
dreapt a) ] nt re separat or i i di n f l uxul de i nt rare =i cei di nsir_formatexecu\i af unc\iei scanf()se ] nchei e. De exemp l u, apel ul f unc\iei scanf():
scanf(%d,%f,%s,&x,&y,sir);
real i zeaz[ o at r i bui re corect [ a dat el or de i nt rare dac[ el e sunt desp[ r\i t e pri n
vi rgul [ . Pent ru a at r i bui var i abi l ei xval oar ea32, l ui yval oar ea10.75=i
vari abi l ei sirval oar eaanI, ] n f l uxul de i nt rare t rebui e s[ avem
32,10.75,anI.
Exemplul 12.7
Ci t i rea numerel or r eal e x=i Xde l a t ast at ur [ , cal cul ul produsul ui x*X=i
af i =area l ui ]n forma t exponen\ial .
#include "stdio.h"
void main(void){float x,X;printf("\n Tastati doua numere separate
prin spatiu ");scanf("%f %f",&x,&X);X=X*x;printf("\n Produsul X*x este = %e", X);}
Observa\ii:
X =i xsunt vari abi l e di f eri t e;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
29/192
99
X=X*x;este o expresi e de at r i bui re care se poat e scr i e ma i scurt sub
forma X*=x;cu aj ut orul operat orul ui compus *=.
Func\iile scanf()=i printf()sunt func\ii de intrare/ie=ire standard cu
destina\ie general[. Din considerente de eficien\[ (cod mai mic, vitez[ de
execu\ie sporit[, comoditate ]n programare etc.) limbajul C pune la dispozi\iautilizatorului =i func\ii cu destina\ie special[.
12.4.2. FUNC| II SPECIALE PENTRU
CITIREA/SCRIEREA CARACTERELOR LA
NIVELUL CONSOLEI
Standardul ANSI C prevede dou[ func\ii simetrice pentru transferul
caracterelor la nivelul consolei: func\iilegetchar()=i putchar(). Ele ]=i au
prototipurile ]nstdio.h.
Func\ia pentru citiregetchar()are forma general[
int getchar(void);
=i ]ntoarce urm[torul caracter care va fi citit. Dac[ s-a atins sf[r=itul =irului sau seproduce o eroare se ]ntoarce EOF.
De=i nu apar\in standardului ANSI C, totu=i, func\iilegetch(), getche(),
putch()sunt incluse frecvent ]n biblioteca standard a compilatoarelor compatibile
DOS. Prototipurile acestor func\ii sunt ]n fi=ierul headerconio.h.
Func\iile getch()=i getche()sunt echivalente func\ional cu func\ia
getchar(). Forma general[ este:
int getch(void);int getche(void);
Spre deosebire de func\iagetchar()unde caracterul tastat este citit numai
dac[ se apas[ ]n continuare tastaEnter, func\iilegetch()=i getche()preiau
caracterul imediat dup[ ce a fost tastat (f[r[ a mai ap[saEnter). De asemenea,
func\ia getch()preia caracterul de la tastatur[ f[r[ a-l afi=a pe ecran, ]n timp ce
getche()afi=eaz[ pe ecran caracterul citit (citire cu ecou).
Func\ia pentru afi=areputchar()are forma general[
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
30/192
100
int putchar(int ch);
undecheste caracterul care se afi=eaz[.
Func\ia ]ntoarce ]n caz de succes caracterul scris, iar ]n caz contrar EOF.
Func\iaputch()este echivalent[ func\ional cuputchar()=i are forma
general[
int putch(int ch);
undecheste caracterul care se afi=eaz[.
Ea este de asemenea o func\ie nestandard (nu e definit[ de standardul
ANSI C) frecvent utilizat[.
Exemplul 12.8
Ci t i rea si af i =area unui caracter f ol osi nd f unc\i i l e speci al egetche() =i
putch()
#include "stdio.h"#include "conio.h"
void main(void){char x;
printf("\n Tastati o litera! ");x=getche();printf("\n Multumesc! Ati tastat litera ");putch(x);getch();}
12.4.3. FUNC| II SPECIALE PENTRUCITIREA/SCRIEREA +IRURILOR
DE CARACTERE LA NIVELUL CONSOLEI
Func\ii speciale pentru citirea/scrierea =irurilor de caractere la nivelul
consolei suntgets()=i puts(). Ambele func\ii ]=i au prototipurile ]n fi=ierul header
stdio.h. Aceste prototipuri sunt prezentate ]nCapitolul 18al lucr[rii.
Deoarece ]n construc\ia acestor prototipuri intervine no\iunea depointer,prezentat[ ]n detaliu ]nCapitolul 15, ne limit[m aici la a spune c[ prin apelul
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
31/192
101
gets(sir_destinatie);
se cite=te un =ir de la tastatur[ ]nsir_destinatie, iar apelul
puts(sir);
are ca efect afi=area =irului sirpe ecran.
D[m ca exemplu secven\a de program:. . . . . . .
gets(x);
. . . . . . .
printf(\n Sirul citit este =);
puts(x);
. . . . . . .
Un program complet care utilizeaz[ func\iilegets()=i puts()este
prezentat ]nCapitolul 14(vezi paragrafulFunc\ii pentru prelucrarea =irurilor
de caractere).
12.5. OPERATORI. CLASIFICARE
Operatoriisunt elemente de baz[ ale limbajului care arat[ ce opera\ii
trebuie executate asupra unoroperanzi. }n C, operanzi pot fi constantele, numelede variabile, numele de func\ii, expresiile.
Bogata familie de operatori confer[ limbajului C o tr[s[tur[ aparte.
Clasificarea operatorilor C se poate face dup[ mai multe criterii:
dup[ num[rul de operanzi prelucra\i (unari, binari, ternari);
dup[ prioritatea avut[ ]n evaluarea expresiilor (clase de preceden\[);
dup[ tipul operanzilor (aritmetici, rela\ionali, logici =i la nivel de
bit).
12.5.1. OPERATORI UNARI, BINARI, TERNARI
| in nd cont de num[rul de operanzi prelucra\i, ]n C exist[ operatori
unari, binari =iternari. Clasele rezultate nu sunt disjuncte, ]n sensul c[, de
exemplu, un operator unar poate fi =i binar. Astfel, ]n expresia-3operatorul-
(minus) este unar, iar ]n expresiaa-3, este binar.
Singurul operator ternar este operatorul condi\ional?:.Operanzii s[i
sunt plasa\i dup[ schemaoperand1 ? operand2 : operand 3.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
32/192
102
12.5.2. CLASE DE PRECEDEN| {
Priorit[\ile operatorilor impun ordinea de evaluare a expresiilor. Ca =i ]n
calculele algebrice obi=nuite ordinea de evaluare poate fi modificat[ cu ajutorul
parantezelor rotunde.
Operatorii care au priorit[\i egale, apar\in aceleia=i clase de preceden\[.
Lista operatorilor grupa\i dup[ clase de preceden\[ este dat[ ]n Tabelul 12.2.
Tabelu l 12.2 Cl ase de preceden\[
Clasa Operatori
1 (paranteze, op. de selec\ie) () [] -> .
2 (op.unari) ++ -- ! ~ - + &
*
sizeof cast
3 (op. multiplicativi) % / *
4 (op. aditivi) + -
5 (op. shift) >
6 (op. rela\ionali) < >=
7 (op. rela\ionali) == !=
8 (SI pe bit) &
9 (SAU exclusiv bit cu bit) ^
10 (SAU bit cu bit) |
11 (SI logic) &&
12 (SAU logic) ||
13 (operator condi\ional) ?:
14 (atribuire) = += -= *= etc.
15 (secven\iere) ,
Func\ioneaz[, de asemenea, reguli de asociere de la st nga la dreapta sau
de la dreapta la st nga. Singurii operatori care se asociaz[ de la dreapta la st nga
sunt operatorii unari =i operatorul ?:, restul se asociaz[ de la st nga la dreapta.
Operatorul de atribuire=ocup[ un loc aparte ]n familia operatorilor.
Cu ajutorul lui putem s[ atribuim unei variabile o anumit[ valoare. Forma sa
general[ este:
v=e;
undeveste un nume de variabil[, iareeste o expresie. }n C, membrul st ng =i
membrul drept al unei atribuiri se mai numesc valoare st ng[ (lvalue), respectiv
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
33/192
103
valoare dreapt[ (rvalue). Spre deosebire de alte limbaje (Fortran, Pascal etc.) ]n
C, operatorul de atribuire poate apare =i ]n interiorul unei expresii, fapt ce permite
o compactare a codului surs[. De exemplu, dou[ atribuiri succesive de genul:
A=pi*r*r;
V=A*h;pot fi scrise compact sub forma:
V=(A=pi*r*r)*h;
Practic, ce am scris mai sus este o instruc\iune expresie. Rezultatul
evalu[rii expresiei (A=pi*r*r)estepi*r*r; dup[ cum se vede, acest
rezultat se poate folosi mai departe ]n calcule. Atribuirea valorii pi*r*r
variabileiAapare ca un efect secundar al instruc\iunii expresie A=pi*r*r;.
Compilatorul C permite ca ]n expresii de genul
v=e;
v=i es[ aib[ tipuri diferite. }n aceast[ situa\ie au locconversii de tip. Regula de
conversie este urm[toarea: valoarea membrului drept (valoarea lui e) se
converte=te la tipul membrului st ng (tipul lui v). Deoarecesizeof(int)dec t float,
care este la r ndul s[u mai >slab>dec tdouble. Dac[ membrul st ng este de un
tip mai >slab>dec t tipul membrului drept pot avea loc pierderi de informa\ie
(prin trunchiere) sau dep[=irea posibilit[\ilor de reprezentare. De exemplu, ]n
secven\a:
int x,y;
float a,b;
.........
x=a;
b=y;
variabilaxva primi partea f[r[ frac\ie a valorii asau un rezultat imprevizibil
dac[ se dep[=esc posibilit[\ile de reprezentare, iar valoarea ]ntreag[ yva fi
convertit[ la o valoare reprezentat[ ]n virgul[ mobil[.
Considera\iile de mai sus referitore la conversia tipurilor sunt valabile =i
]n situa\ia ]n care cel pu\in unul dintre cei doi operanzi ai operatorului de
atribuire sunt variante ale tipului int(char, signed, unsigned, short,long) sau
ale tipuluidouble(longdouble).
}n C este posibil[ atribuirea multipl[, ca ]n exemplul de mai jos:x=y=z=s=0;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
34/192
104
Efectul este atribuirea valorii0variabilelorx,y,z,s.
De asemenea, ]n anumite situa\ii se pot folosi operatorii deatribuire
compus[. Practic, orice atribuire de genul:
variabila=variabila operator expresie;
undeoperatorpoate fi ales din lista de operatori *, /, %, +, -, >>,
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
35/192
105
. . . . .
int x=7,y=3,z,w;
. . . . .
z=(w=x
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
36/192
106
operatorul%aplicat unor operanzi ]ntregi furnizeaz[ restul ]mp[r\irii
acelor ]ntregi; de exemplu, secven\a:
. . .
int x,y
x=7;
y=x%2;
. . .
produce pentruyvaloareay=1, adic[ restul ]mp[r\irii lui7la2.
12.5.4. OPERATORI RELA| IONALI +I LOGICI
Operatorii rela\ionalidin limbajul C sunt:, =, ==,
!=. Semnifica\ia lor rezult[ din Tabelul 11.5. }n urma evalu[rii unei expresii ]n
care intervin operatori rela\ionali rezult[ valoarea0pentrufals=i 1pentru
adevarat. Programul de mai jos afi=eaz[ valorile anun\ate ]n comentariile
al[turate:
Exemplul 12.9
Af i =area val or i l or unor expresi i ] n care i nt ervi n operat or i rel a \i onal i
#include "stdio.h"#include "conio.h"
void main(void){float x=0, y=2.3;printf("\n x=y are valoarea %d",x>=y); /*0*/printf("\n x==y are valoarea %d",x==y); /*0*/printf("\n x!=y are valoarea %d",x!=y); /*1*/getch();}
Operatorii logicidin C sunt:
! NU logic
&& SI logic|| SAU logic
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
37/192
107
Modul de ac\iune al acestor operatori este prezentat ]n Tabelul 12.3.
Tabelu l 12.3 Tabl a val or i l or de adev[ r pent ru operat or i l ogi ci
a b a && b a || b !a
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
Observa\ii:
Di n Tabel ul 12.3 rezul t [ c[ operat or i i l ogi ci &&=i ||au o pr i or i t at e
ma i mi c[ dec` t operat or i i rel a \i onal i . D i n acest mo t i v:
expresi a ad e echi val ent [ cu(ad)
expresi a a>b&&cb)&&(c3vom scri e!(a>3)=i nu!a>3.
Expr esi a !(a>3)va ret urna corect val oar ea0sau1f unc\ie de m[ r i mea l ui
a, ]n timp ce expresi a!a>3ar e t ot deauna val oar ea0(datori t [ pri ori t [ \ii ma i
mar i a operat or ul ui !fa\[ de>se eval ueaz[ ma i ]nt`i !acare poat e f i 0sau1;
or i care ar f i val oarea l ui a, rezul t [ ] n f i nal val oarea0).
Dac [ ]ntr -o expresie forma t [ di n operanzi l ega\i pr i n operat orul ||, i ar
val oarea pr i mu l ui operand este1, val oarea expresi ei este1(vezi Tabel ul 12.3)
=i cei l al\i operanzi nu se ma i eval ueaz[ . Dac [ ]ntr -o expresi e f orma t [ di n
operanzi l ega\i pr i n operat orul &&, pri mu l operand i a val oar ea0, val oarea
expresi ei este0i ar cei l al\i operanzi nu se ma i eval ueaz[ .
Deoarece prezen\a parant ezel or nu reduce vi t eza de execu\i e a
expresi i l or, el e pot f i f ol osi t e, al [ t uri de spa\i i , l a cre=terea gradul ui de l i zi bi l i t ate
a unui progr am. I at [ dou[ expresi i echi val ent e:
a=c=c&&a
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
38/192
108
12.5.5. OPERATORI LA NIVEL DE BIT
Operatorii la nivel de bitdin C permit programatorului s[ manevreze
bi\ii apar\in nd unor valori de tipcharsauint(ei nu se aplic[ tipurilor de date
float, doublesaulongdouble). Aceasta este una din acele facilit[\i care apropie
limbajul C de nivelul limbajelor de asamblare.
Operatorii la nivel de bit sunt:
& SI pe bit
| SAU pe bit
^ SAU exclusiv pe bit
~ NU pe bit (complement fa\[ de1)
>> deplasare dreapta (shiftdreapta)
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
39/192
109
Observa\ii:
Oper atorul &reprezi nt [ o modal i tate de a el i mi na un bi t (de a -l f ace egal cu
0) sau de a re\i ne bi\i i care ne i nt ereseaz[ (opera\ie de mascare).
}n opera\i i l e de t ransmi t ere a dat el or, bi t ul superi or (cel ma i di n st`nga) al
unui octet este consi derat de cel e ma i mu l te ori bit de pari tate. Pri nt r -o oper a\i e
de set are l a1a acest ui bi t sau de anul are a sa, se poat e ob\i ne un num[ r par
sau i mpar de bi\i ] n oct et ul respect i v f unc\i e de conven\i a de par i t at e accept at [
(par i t at ea poat e f i par [ sau i mpar [ ) . Ut i l i zarea par i t [ \i i , permi t e veri f i carea
corect i t udi ni i oct et ul ui t ransmis. Ar [ t [ m ma i j os cum se poat e modi f i ca bi tul de
par i t at e:
Exemplu:
1. Anul area bi t ul ui de pari t at e al unui oct et .
1000 0101 &0111 11110000 0101
2. Set area l a val oar ea1a bi t ul ui de par i t at e a unui oct et .
0000 0101 |
1000 00001000 0101
Observ[ m c[ anul area bi t ul ui de par i t at e s-a f [ cut pr i n ] nmul \i r e cu
num[ r ul 127(0111 1111] n baza2) , i ar set area l a val oarea1a acel ui a=i
bi t pr i n adunar e cu num[ r ul 128(1000 0000] n baza2).
Dat ori t [ posi bi l i t [ \i i de a modi f i ca val or i l e bi\i l or, operat ori i pe bi t se
f ol osesc ma i al es ]n proi ect ar ea programel or de i nterf a \[ cu di spozi t i ve
peri f er i ce.
O a l t [ apl i ca\i e i nt eresant [ se ref er [ l a codi f i carea =i decodi f i carea unui
fi =ier. O modal i tate simp l [ est e f ol osi rea operat orul ui ~, porni nd de l a
obser va\i a c[ ~(~x)=x, pent rux]nt reg arbi t rar. Deci , dac[ exi st [ un
progr am de codi f i care, l a pri ma sa rul are t o \i bi\i i nul i devi n1, i ar to\i bi\i i de1
devi n nul i ( codificarea). La o nou[ rul are est e evi dent c[ se ob\i ne f i =i erul
i ni\i al (decodificarea).
O pos ibi l i tate ma i put erni c[ de codi f i care =i decodi f i care est e operat orul ^.
}n acest caz pent ru acest e opera\i i se f ol ose=t e o chei e.
Rel u` nd exemp l ul cu val ori l e
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
40/192
110
x=0000 0101 y=0010 0100
0000 01010010 0100
x^y=0010 0001
s[ pr esupunem c[ yest e chei a. Dac [ ] nt re codi f i carea ob\i nut [ (x^y)=i chei a
yef ect u[m d i n nou oper a\i a^se ob\i ne rezul t at ul i ni\i al x(decodi f i carea) .
0010 00010010 0100
(x^y)^y=0000 0101
Forma general[ aoperatorilor de deplasareeste:
variabila > numar intreg, pentru deplasare la dreapta.
Aici, numar_intregse refer[ la num[rul de pozi\ii cu care vor fi
deplasa\i spre st nga, respectiv spre dreapta bi\ii variabilelor.
Deplasarea bi\ilor spre un cap[t sau altul poate produce pierderea unui
num[r de bi\i de la respectiva extremitate. Cu ce se completeaz[ bi\ii r[ma=i
liberi?
Dac[ deplasarea este spre st nga, bi\ii liberi din dreapta se completeaz[
cu0.
Exemplu. S[ consider[m declara\ia
unsigned char x=7;
Num[rul 7este reprezentat ]n baza2ca0000 0111. Atunci, x
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
41/192
111
9 se reprezint[ prin 0000 1001
~9 este 1111 0110
~9+1 este 1111 0111
-9 se reprezint[ prin 1111 0111
}n consecin\[, \in nd cont de precizarea f[cut[ mai sus
x>>2 va produce 1111 1101
Observa\ii.Depl asar ea spre st ` nga cunpozi \i i echi val eaz[ cu o
]nmul \i re a var i abi l ei cu2n, i ar depl asarea spre dreapt a cu n pozi\i i echi val eaz[
cu ]mp[ r \i r e a var i abi l ei cu2n. Aceste depl as[ r i (opera\ii shift) sunt ma i r api de
dec` t opera\i i l e corespunz[ t oare de ] nmul \i re sau ]mp[ r \i re
cu2n
.
Exemplu:
Dac[x=7atunci:
x2va produce 1111 1110 adic[,-2=-8/22.
12.6. CONVERSII DE TIP IMPLICITE
Limbajul C ofer[ posibilitatea de a construi expresii cu date de tipuri
diferite. Din acest motiv exist[ un set de reguli de conversie a operanzilor la tipul
operandului cel mai >tare>. Aceste reguli sunt cunoscute sub numele de
avansare de tip(type promotion). Iat[ setul de reguli:
Variabile de tipchar=i shortse convertesc la tipul int.
Dac[un operand estelongdouble
At uncial doilea este convertit la longdouble;
Al tf eldac[un operand estedouble
At uncial doilea e convertit ladouble;
Al t fel dac[un operand estefloat
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
42/192
112
At uncial doilea e convertit la float;
Al tf eldac[un operand esteunsignedlong
At uncial doilea e convertit launsigned long;
Al t fel dac[un operand estelong
At uncial doilea e convertit la long;Al t fel dac[un operand esteunsigned
At uncial doilea este convertit launsigned.
12.7. CONVERSII DE TIP EXPLICITE
(OPERATORUL CAST)
Operatorul de conversie explicit[(cast) ac\ioneaz[ temporar, for\ nd
schimbarea tipului expresiei la care se refer[. Forma general[ a operatorului este:
(tip)expresie;
undetipeste tipul la care dorim s[ se fac[ conversia expresiei.
De exemplu, rezultatul evalu[rii expresiei
(float)i/2;
undeia fost definit prin
int i=3;
este1.5. Dac[ ]n acelea=i condi\ii se evalua expresiai/2; rezultatul ar fi fost
trunchiat la1(se ]mp[r\eau doi ]ntregi).
TESTE DE CONTROL
12.1}n C exist[ tipurile fundamentale de date:
a) char, int, float, double, void
b) char, integer, real, double, void
c) char, int, float, double, nul, boolean
d) character, string, real, void
12.2Modificatorii de semn
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
43/192
113
a) schimb[ semnul unei expresii
b) schimb[ semnul numai pentru valori ]ntregi
c) au ca efect interpretarea diferit[ din punct de vedere al semnului, a
informa\iei memorate ]ntr-o anumit[ zon[
12.3Declara\iilechar x;
=i
signed char x;
a) sunt echivalente
b) sunt gre=ite
c) sunt corecte
12.4Declara\iile
short int x;
=i
int x;
a) sunt echivalente
b) sunt gre=ite
c) sunt corecte
12.5Declara\ia
float x,y;
a) este echivalent[ cufloat x;float y;
b) este gre=it[
c) este echivalent[ cux,y:float;
d) este echivalent[ cureal x,y;
12.6Linia de programchar ch=A,Z;
are semnifica\ia:
a) variabilachia valori de laAlaZ
b) variabilacheste de tipchar=i este ini\ializat[ cu valoareaA, iar
variabilaZeste de tipchar
c) tipul de datecharia valori de laAlaZ
12.7.Liniile de programconst ore_zi=24;
int ore_zi=24;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
44/192
114
a) sunt echivalente
b) sunt corecte =i compatibile
c) sunt corecte =i incompatibile
12.8Secven\a de program
int x=10,y=20,z=5,w=7;printf(\n x=%i y=%i z=%d,x,y);
afi=eaz[:
a) x=10 y=20 z=5
b) date de ie=ire nedefinite
c) x=10 y=20
12.9Secven\a de program:
int x=10,y=20,z=5,w=7;
printf(\n x=%d y=%i,x,y,z);
a) afi=eaz[ x=10 y=20
b) afi=eaz[ x=10 y=20 z=5
c) este gre=it[
12.10Instruc\iuneaprintf()de mai jos
printf(\nuu!\taurul \n-are importanta!);
afi=eaz[
a)
\nuu!\taurul\n-are importanta!
b)taurul n-are importanta!
c)uu!aurul -are importanta!
d)uu! aurul
-are importanta!
12.11Secven\a de program
int i=10,j=20;
printf(\n i=%i,j=%i,j,i);afi=eaz[
a)i=10, j=20
b)i=20, j=10
c)i=10% j=20%
12.12Secven\a de program
int i=10,j=20;
printf(\n i=%i,j=%j,i,j);
a)afi=eaz[i=10,j=20
b) este gre=it[
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
45/192
115
c)afi=eaz[i=%10,j=%20
12.13Secven\a de program
char a=q;
printf(\n a=%d,a);
a)
este gre=it[ deoarece%deste descriptor pentru tipul int, nu pentrutipul char
b) este corect[ =i afi=eaz[ codul ASCII al caracterului q
c) este corect[ =i afi=eaz[ codul ASCII al caracterului a
d) este corect[ =i afi=eaz[ caracterul q
12.14Secven\a de program
float x=32.75;
printf(\n x=%e,x=%f,x,x);
a) este gre=it[ deoarece argumentul xse repet[
b) este corect[ =i va afi=ax=32.75,x=32.75
c) este corect[ =i va afi=a x=3.275000e+01,x=32.750000
12.15Secven\a de program
int x=439;
printf(\n %o,x);
afi=eaz[:
a) 439
b) num[rul 439scris ]n baza8
c) num[rul 439scris ]n baza16
12.16Secven\a de program
int x=1011;
printf(\n %x,x);
afi=eaz[:
a)
valoarea luix]n binar
b) valoarea luix]n hexazecimal
c) valoarea luix]n octal
12.17Secven\a de program
int x=12;
float y=31.42;
printf(\n x=%f y=%d,x,y);
a)
afi=eaz[ x=12 y=31.42b) afi=eaz[ x=12.0 y=31
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
46/192
116
c) este gre=it[
12.18Secven\a de program
float x=10.5;
printf(\n x=%-10.5f,x);
a)
afi=eaz[ x=-10.5b) afi=eaz[ x=10.50000
c) este gre=it[
12.19Secven\a de program
float x=10.5;
printf(\n x=%10.5,x);
a) afi=eaz[ x=10.5
b) afi=eaz[ x= 10.50000
c) afi=eaz[ x=10.50000
12.20Despre secven\ele de program
float x;
scanf(%f,x);
=i
float x;
scanf(%f,&x);
se poate afirma c[:
a) sunt corecte =i au acela=i efect
b) prima secven\[ este corect[ =i a doua incorect[
c) prima secven\[ este incorect[ =i a doua corect[
12.21Secven\a de program
printf(%.3s,abcde);
a) afi=eaz[ abc
b)
afi=eaz[ abcdec) este gre=it[
12.22Dac[ =irul care trebuie citit de la tastatur[ esteabcdefatunci secven\a
scanf(%3s,sir);
a) este gre=it[, deoarece variabilasirnu e precedat[ de operatorul &
b) este gre=it[, deoarece =irul de intrare are6caractere, iar descriptorul
%sprevede doar3caractere
c)
este corect[, dar se citesc doar caractereleabc12.23Secven\a de program
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
47/192
117
scanf(%d;%f;%s,&x,&y,sir);
a) este gre=it[, deoarece descriptorii de format sunt desp[r\i\i prin
semnul ;
b) este gre=it[, deoarece variabilasirnu e precedat[ de operatorul &
c)
este corect[ =i realizeaz[ corect citirea dac[ datele din fluxul deintrare sunt desp[r\ite prin semnul ;
12.24Operatorii ]n C pot fi:
a) unari, binari
b) unari, binari, ternari
c) unari, binali, termali
12.25Operatorii+=i -pot fi:
a) numai unari
b) numai binari
c) unari sau binari
12.26Secven\a de program:
float x;
int i;
x=34.21;
i=x;
a) este gre=it[ deoarece se atribuie valoarea real[ dinxvariabilei ]ntregi
i
b) este corect[
c) este corect[, iariva primi valoarea34
12.27Secven\a de programint i;
float x;
i=34;
x=i;
a) este gre=it[, deoarece se atribuie valoarea ]ntreag[ dinivariabilei
realex
b) este corect[
c) este corect[, iarxva primi valoarea34convertit[ ]n virgul[ mobil[.
12.28Linia de program
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
48/192
118
V=(A=B*b)*h;
a) este eronat[ deoarece con\ine operatorul de atribuire=de dou[ ori
b) este corect[
c) este corect[ =i este echivalent[ cu secven\a de program
A=B*b;V=A*h;
12.29Linia de program
a=b=c=1;
a) este corect[ =i e echivalent[ cu secven\a
a=1;
b=1;
c=1;
b) este corect[ =i e echivalent[ cu secven\a
1=a=b=c;
c) este gre=it[ deoarece operatorul de atribuire apare de mai multe ori
12.30Expresia
x+=1;
a) este gre=it[
b) este corect[ =i echivalent[ cux=x+1;
c)
este corect[ =i echivalent[ cux++;
d) este corect[ =i echivalent[ cu++x;
12.31Expresia
y=--x;
a) este gre=it[
b) este corect[ =i echivalent[ cu secven\a
x=x-1;
y=x;c) este corect[ =i echivalent[ cu secven\a
y=x;
y=x-1;
12.32Expresia
y=x--;
a) este gre=it[
b) este corect[ =i echivalent[ cu secven\a
x=x-1;
y=x;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
49/192
119
c) este corect[ =i echivalent[ cu secven\a
y=x;
x=x-1;
12.33}n urma execu\iei secven\ei de program:
int i,j;i=19;
j=i/4;
a) jia valoarea4
b) jia valoarea4.75
c) jia valoarea5
12.34}n urma execu\iei secven\ei de program:
int i,j;
i=19;
j=i%4;
a) jia valoarea3
b) jia valoarea4
c) jia valoarea4.75
12.35Dac[a,b,c,dsunt variabile numerice atunci expresia
(ad)se poate scrie:
a) ad
b) ad
c) c>d||ax)||(a
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
50/192
120
z=(x>y)&&(a
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
51/192
121
12.44Complementul fa\[ de2al num[rului ]ntregise ob\ine ca:
a)~i+1
b)~i-1
c) 2-i
12.45Opera\iax2echivaleaz[ cu:
a) o ]nmul\ire a luixcu2
b)
o ]mp[r\ire a lui xla2c) o ]nmul\ire a luixcu22
d)o imp[r\ire a luixcu22
12.47Secven\a de program
int i=7;
float x;
x=(float)i/4;
printf(\n x=%f,x);
. . . . .
a) este gre=it[
b) este corect[ =i afi=eaz[ x=1.750000
c) este corect[ =i afi=eaz[ x=1
R{ SPUNSURI
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
52/192
122
12.1-a 12.2-c 12.3-a, c 12.4-c 12.5-a
12.6-b 12.7-c 12.8-b 12.9-a 12.10-d
12.11-b 12.12-a 12.13-b 12.14-c 12.15-b
12.16-b 12.17-c 12.18-b 12.19-b 12.20-c
12.21-a 12.22-c 12.23-c 12.24-b 12.25-c12.26-b, c 12.27-b, c 12.28-b, c 12.29-a 12.30-b, c, d
12.31-b 12.32-c 12.33-a 12.34-a 12.35-a, c
12.36-b 12.37-b 12.38-a, b, c 12.39-b 12.40-a, b, c, d
12.41-a, b, c, d 12.42-c 12.43-a 12.44-a 12.45-c
12.46-d 12.47b
13. INSTRUC| IUNI DE CONTROL
ALE PROGRAMULUI
}n acest capitol se prezint[ instruc\iunile de control ale unui program C:
instruc\iunea expresie, instruc\iunile decizie (sau de selec\ie), instruc\iunile
iterative (repetitive sau de ciclare) =i instruc\iunile se salt. }n situa\ia ]n care
sintaxa limbajului impune utilizarea unei singure instruc\iuni, dar logica
programului cere folosirea unei secven\e de instruc\iuni, secven\a de instruc\iuni
se organizeaz[ ca o instruc\iune bloc (sau instruc\iune compus[).
O instruc\iune bloc ]ncepe cu{=i se termin[ cu}.
13.1. INSTRUC| IUNI EXPRESIE
Instruc\iuneaexpresieare forma general[:
expresie;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
53/192
123
undeexpresieare efect lateral (con\ine o atribuire sau reprezint[ un apel de
func\ie).
Secven\a de program urm[toare con\ine exemple de instruc\iuni
expresie:
. . . . . . .
x=(a+b)*c;
x+=2;
p++;
getch();
13.2. INSTRUC| IUNI DE DECIZIE13.2.1. INSTRUC| IUNEA IF
Forma general[ a instruc\iunii ifeste:
if(expresie)
instructiune_1;
else
instructiune_2;
Efectul instruc\iunii este urm[torul: dac[ expresieeste adev[rat[
(diferit[ de zero) se execut[ instructiune_1]n caz contrar (expresie
este egala cu zero) se execut[ instructiune_2. Figura 13.1 ilustreaz[
modul de execu\ie al instruc\iunii if.
Expresie
Instruc\iune_1Instruc\iune_2
Fals Adev[rat
F igura 13.1.Modul de execu\i e al i nst ruc\i uni iif
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
54/192
124
Exemplul 13.1
Pr ogr amu l cal cul eaz[ =i af i =eaz[ radi cal ul di nt r -un num[ r .
#include "stdio.h"#include "conio.h"#include "math.h"
void main(void){float x,y;printf("\n Introduceti x=");scanf("%f",&x);if (x
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
55/192
125
f orm[ cunoscut [ sub numel e de ifcu ramur[ vid[. I nst ruc\i unea
instructiunese execut [ numa i dac[ expresi a este adev[ rat [ , adi c[ se
execut [ condi\i onat . Modul de execu\i e al i nst ruc\i unii ifcu r amur [ vi d[ est e
i l ust rat ]n Fi gura 13. 2.
Exemplul 13.2.
Pr ogr amu l cal cul eaz[ max imu l di nt r e dou[ numere.
#include "stdio.h"#include "conio.h"
void main(void){float x,y,max;printf("\n x=");scanf("%f",&x);printf("\n y=");scanf("%f",&y);;max=x;if (max
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
56/192
126
if(expr1)
instr1;
else
if(expr2)
instr2;else
. . . . . .
if(exprn)
instrn;
else
instrn+1
Ef ectul execu\i ei unei i nst ruc\i uni ifimbr i cat e este urm[ t or ul : dac[ nu
exi st [ i, i=1,...,n ast f el ] nc`t expresi aexpris[ f i e adev[ rat [ , se
execut [ instrn+1, ] n caz cont rar se execut [ pr i ma i nst ruc\i une ( consi der ` nd
eval uarea de sus ]n j os), instripent r u careexpriest e adev[ rat [ , i ar rest ul
i nst ruc\i uni l or se i gnor [ .
Pent run>mar e>, f ol osi nd o al i ni ere st r i ct [ , se aj unge l a o st ruct ur[ cu
ad nci me mare (mul t depl asat [ spre dreapt a) . Di n acest mo t i v se fol ose=t e de
obi cei f orma:
if(expr1)
instructiune1;
else if(expr2)
instructiune2;
else if(expr3)
instructiune3;
. . . . . .
else
instructiunen+1;
numi t [ =i scaraif-else-if.
Exemplul 13.3
Pr ogr amu l ci t e=t e coordonat el e unui num[ r =i stabi l e=t e ] n ce cadran se af l [
acest a.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
57/192
127
#include "stdio.h"#include "conio.h"
void main(void){float x,y;printf("\n abscisa x=");
scanf("%f",&x);printf("\n ordonata y=");scanf("%f",&y);if (x>=0 && y>=0)printf("\n Numarul apartine cadranului I");else if (x=0)printf("\n Numarul apartine cadranului II");else if(x
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
58/192
128
printf(\n x nul);
Dac [ t ot u=i vrem s[ punem ]n pract i c[ pr i ma i nt en\i e putem fol osi una
di n f ormel e echi val ent e:
a) if(x)
{if(y)
printf(\n x si y nenuli);
}
else
printf(\n x nul);
b) if(x)
if(y)
printf(\n x si y nenuli);
else;
else
printf(\n x nul);
c) if(x&&y)
printf(\n x si y nenuli);
else
if(!x)
printf(\n x nul);
}n i deea creer i i unor programe >dense> se pot scr i e const r uc\i i de genul
if( (c=getch() ) == a)
putch(a);
else
printf(\n caracter diferit de a);
unde expresi a condi\i onal [ con\i ne o at r i bui re. Const ruc\i i le dense t rebui e f acut e ] ns[ cu gr i j [ , deoarece este posi bi l s[
avem surpr i ze nepl [ cut e. Secven\a de ma i j os
x=y=7;
a=5;b=6;
if((x=a)(y=b))
printf(\nx=%i si y=%i,x,y);
va producex=5,y=7=i nux=5, y=6cum ne-am f i a=teptat . Pent ru ca
expresi a
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
59/192
129
(x=a)(y=b)
s[ f i adev[ rat [ est e suf i ci ent ca numa i una di n expresi i l e (x=a) sau (y=b) s[ f i e
adev[ rat [ . Cu al t e cuvi nt e, se execut [ at r i bui reax=5, expresi a (x=5) ia
val oarea adev[ rat , val oarea expresi ei (y=b) nu ma i are i mpor t an\[ =i deci
at r i bui reay=6nu mai are l oc.
13.2.2. OPERATORUL CONDI| IONAL ? :
Operatorul condi\ional?:este un operator ternar, iar forma sa general[
este:
expr1?expr2:expr3;
Efectul execu\iei unei astfel de secven\e este echivalent cu efectul
execu\iei secven\ei:
if expr1
expr2;
else
expr3;
}n plus, expresiaexpr1?expr2:expr3va lua valoareaexpr2sau
expr3dup[ cumexpr1este adev[rat[ sau nu.
Exemplul 13.4
Pr ogr amu l af i =eaz[ max imu l di nt r e dou[ numerea=i bci t i t e de l a tast at ur[ .
#include "stdio.h"#include "conio.h"
void main(void){int a,b;
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
60/192
130
printf("\n a=");scanf("%i",&a);printf("\n b=");scanf("%i",&b);printf("\n Maximul dintre a=%i si b=%i este
%i",a,b,a=ip n[ la primul break]nt lnit sau p n[ la
sf r=itul instruc\iunii switch.
Dac[ pentru oricei=1,...,nconstantelecisunt diferite de expresia
selectoare se execut[ instructiunen+1, dac[ exist[ op\iuneadefaultsau se
iese direct dinswitch,dac[ aceasta lipse=te.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
61/192
131
Exemplul 13.5.
Pr ogramu l ci t e=te una di n l i t erel ea,A,m,M,p,Pde l a t ast at ur [ =i af i =eaz[ o
l i st [ de nume care ] ncep cu una di n acest e l i t ere, f [ r [ s[ \i n[ cont dac[ l i t era
este mar e sau mi c[ . Dac[ se t ast eaz[ al t caract er se af i =eaz[ un mesaj de
er oare.
#include "stdio.h"#include "conio.h"
void main(void){printf("\n Tastati una din literele:a,A,m,M,p,P
");
switch(getch()){
case 'a':case 'A':printf("\n Aurel,Ana,Andrei"); break;case 'm':case 'M':printf("\n Maria,Mihai,Marin"); break;case 'p':case 'P':printf("\n Paula,Petre,Pavel"); break;default :printf("\n Ati tastat gresit !");
}getch();}
Observa\ie.} n pr ogr amu l de ma i sus, i ndi f erent dac[ s-a tast at asauA
se af i =eaz[ aceea=i l i st [ de nume: Aurel, Ana, Andrei. Expl i ca\i a este
urm[ t oarea. Dac[ se t ast eaz[ ase >i nt r [ > ] nswitch, pri ncase 'a'.
Secven\a de prel ucr[ r i corespunz[ t oare f i i nd vi d[ =i ne nt ` l ni ndu-se ni ci o
i nstruc\i une breakse t rece =i se execut [ secven\a de prel ucr [ r i cor espunz[ t oar e
constant ei case 'A'(adi c[ af i =area l i st ei ). Deoar ece secven\a se ]nchei e cu
breakse >i ese> di nswitch. Anal og se ] nt `mp l [ =i cu grupuri l e de l i t erem,M=i
p,P.
13.3. INSTRUC| IUNI ITERATIVE
Instruc\iunile iterative(repetitivesau deciclare) permit ca una sau mai
multe instruc\iuni s[ fie repetate. Num[rul de itera\ii depinde de ]ndeplinirea unei
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
62/192
132
condi\ii. Dac[ testul asupra condi\iei se face ]naintea instruc\iunilor care se
repet[, se spune c[ itera\ia e cu test ini\ial; ]n caz contrar itera\ia e cu test final.
}n limbajul C exist[ dou[ instruc\iuni cu test ini\ial,while=i for=i o
instruc\iune cu test final,do- while.
13.3.1. INSTRUC| IUNEA WHILE
Forma general[ a instruc\iunii whileeste:
while(conditie)
instructiune;
unde:
conditiepoate fi orice expresie;
instructiunepoate fi o instruc\iune simpl[, vid[ sau o
instruc\iune compus[ (numit[ =i corpul ciclului).
Efectul instruc\iunii este urm[torul: se execut[ instructiunec t
timpconditiee adev[rat[ (diferit[ de zero). Atunci c ndconditiedevine
fals[ (egal[ cu zero), execu\ia programului continu[ cu instruc\iunea imediat
urm[toare. Organigrama de mai jos ilustreaz[ sugestiv modul de lucru al
instruc\iuniiwhile.
Observa\ii:
Dac[ di n star t condi\i a este fal s[ instructiunenu se execut [
ni ci odat [ .
I e=i rea di n ci cl u se poat e f ace norma l (ca ef ect al prel ucr[ r i l or di n
instructiune, dup[ un num[ r de pa=i , conditiedevi ne f al s[ ) , anorma l
(pri nt r -o i nst ruc\i une de sal t care t ransfer [ execu\ia pr ogr amu l ui di n i nteri orul
Fals
Instruc\iune
Adev[rat
Condi\ie
Figura 13.3.Modul de l ucru al i nst ruc\i uni i while
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
63/192
133
ci cl ul ui ] n af ara l ui ) sau >ni ci odat [ > (conditier [ m ne mereu adev[ r at [ -
se ob\i ne a=a zi sabucl[ etern[).
Pr ezent [ m ma i j os un exemp l u de progr am unde apar e f oar t e nat ural [
pr ezen\a test ul ui i ni\i al ] n bucl [ =i deci f ol osi rea i nst ruc\i uni i while.
Exemplul 13.6
Cal cul ul l ungi mi i unui =i r de caract ere ci t i t de l a tast at ur[ ; sf `r=i t ul =i rul ui este
mar cat de t ast aEnter(caract erul \r).
#include "stdio.h"#include "conio.h"
void main(void){int i=0;printf("\n Tastati un sir:\n");while (getche()!='\r')
i++;printf("\n Lungimea sirului =%d",i);getch();}
13.3.2. INSTRUC| IUNEA FOR
}n C, instruc\iunea forprezent[ =i ]n alte limbaje, are implementarea cea
mai flexibil[. Ea dep[=e=te cadrul tradi\ional ]n care este plasat[ de obicei:
instruc\iune cu contor(variabil[ de control) recomandat[ spre a fi folosit[ ori
de c te ori se cunoa=te num[rul de itera\ii.
Forma general[ a instruc\iunii foreste:
for(initializare;conditie;actualizare)
instructiune;Semnifica\ia tradi\ional[ a celor trei componente este urm[toarea:
initializareeste de regul[ o instruc\iune de atribuire folosit[ pentru
ini\ializarea contorului ciclului;
conditieeste o expresie care determin[ sf r=itul ciclului;
actualizarese refer[ la felul ]n care se modific[ variabila contor.
Instruc\iuneaforeste echivalent[ cu secven\a de instruc\iuni
initializare
while(conditie)
{
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
64/192
134
instructiune
actualizare
}
De aici rezult[ =i efectul execu\iei sale: se execut[ blocul instructiune
actualizarec t timpconditiaeste ]ndeplinit[.
Exemplul 13.7
Pr ogramu l real i zeaz[ suma a nnumere real e.
#include "stdio.h"#include "conio.h"
void main(void){float s=0,x;int i,n;printf("\n n=");scanf("%i",&n);for (i=0;i
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
65/192
135
Exemplul 13.8
Af i =area termeni l or =i rul ui l ui Fi bonacci ma i mar i ca1=i ma i mi ci ca un num[ r
dat m. +i rul are f orma 1, 1, 2, 3, 5, 8, , adi c[ pr i mi i doi termeni sunt egal i cu
1, i ar ori ce al t termen se ob\i ne ca sum[ a cel or doi t ermeni care-l pr eced.
#include "stdio.h"#include "conio.h"
void main(void){int a,b,c,m,i;printf("\n Limita de afisare =");scanf("%i",&m);printf("\n Termenii sirului Fibonacci < %i\n",m);
printf("\n 1 1 ");for (i=3,a=b=1,c=2;c
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
66/192
136
Oricare din componenteleinitializare,conditie,
actualizareale instruc\iunii forpoate s[ lipseasc[, ]ns[ delimitatorii ;
trebuie s[ fie prezen\i. Lipsa componentei conditieeste interpretat[ ca fiind
echivalent[ cu prezen\a unei expresii condi\ionale adev[rate. Din acest motiv,
secven\afor(;;);
creeaz[ un ciclu infinit sau o bucl[ etern[.
13.3.3. INSTRUC| IUNEA DO-WHILE
Este recomandabil s[ se foloseasc[ instruc\iuneado-whilec nd
instruc\iunea care reprezint[ corpul ciclului trebuie executat[ cel pu\in o dat[.
Forma general[ a acestei instruc\iuni este:
do
{
instructiuni
}
while(conditie);
C nd corpul ciclului este format dintr-o singur[ instructiuneacoladele pot s[ lipseasc[. Totu=i, este recomandabil s[ se p[streze chiar =i ]n
aceast[ situa\ie pentru a distinge mai u=or o instruc\iunewhilecare ]ncepe, de o
instruc\iunedo-whilecare se termin[.
Efectul instruc\iunii este urm[torul: se execut[ secven\a de
instructiunic t timp expresia condi\ional[ conditieeste adev[rat[.
Organigrama de mai jos ilustreaz[ cu claritate modul de execu\ie al ciclului do-
while.
-
7/24/2019 Partea II- IDD Programarea in Limbajul C
67/192
137
Observa\ii:
Dat or i t [ a=ez[ r i i t est ul ui de condi\i e dup[ corpul ci cl ul ui , este evi dent c[
gr upul deinstructiunise execut [ cel pu\i n o dat [ .
Dac [ ] n corpul ci cl ul ui nu se af l [ i nst ruc\i uni car e s[ conduc[ l a o condi\ie
f al s[ dup[ un num[ r f i ni t de ci cl [ r i ( i e=i re norma l [ di n ci cl u) sau i nst ruc\i uni de
sal t di n i nt eri orul ci cl ul ui ( i e=i re anorma l [ ) se ob\i ne un ci cl u i nf i ni t (bucl [
et ern[ ) .
Exemplul 13.9
Pr ogramu l ci t e=t e dou[ numere a=i bde l a t ast at ur [ =i af i =eaz[ suma l or.
Procesul cont i nu[