Sunteți pe pagina 1din 40

Programarea n limbajul C - ndrumar de laborator

______________________________________________________________________________________________________________________________________________________

LABORATORUL 1
OPERAREA CU CONSTANTE CARACTER I CU IRURI DE CARACTERE
FUNCIILE DE BIBLIOTECA AFERENTE
Constante caracter
O constant caracter reprezint un caracter i are ca valoare codul ASCII al caracterului
respectiv.
O constant caracter grafic (codul cuprins n intervalul [32,126]) se poate scrie incluznd
caracterul respectiv intre caractere apostrof.
Cod ASCII
Exemple :
'A'
65
'b'
98
'*'
77
' ' (spaiu)
32
Anumite caractere negrafice (codul cuprins intre [0,31] sau de valoare 127) au notaii
speciale la scrierea crora se utilizeaz caracterul backslash (\). O astfel de constant caracter
se scrie incluznd notaia respectiva intre caractere apostrof. Se spune ca backslash introduce
o secven escape.
Cod ASCII
'\a'
7
'\b'
8
'\t'
9
'\n'
10
'\r'
13

Exemple :

activare sunet
revenire cu un spaiu
tabulator orizontal
rnd nou
retur de car (poziioneaz
cursorul n coloana 1 din rndul curent)

Secvena escape poate fi folosita pentru a reprezenta constantele caracter ghilimele,


apostrof i backslash.
Exemple :

ghilimele
apostrof
backslash

Cod ASCII
34
39
92

'\"'
'\''
'\\'

Secvena escape poate fi folosita pentru a defini constante caracter pentru orice caracter al
codului ASCII. Astfel construcia '\ooo', unde o este o cifra octala, reprezint constant
caracter corespunztoare codului ASCII egal cu valoarea ntregului octal ooo (numerele octale
nu trebuie precedate de zerouri nesemnificative).
Exemple :

'\a' = '\7' activare sunet


'\"' = '\42' ghilimele

Calculatoarele compatibile IBM PC utilizeaz codul ASCII extins, care conine 256 de
coduri, reprezentnd valori n intervalul [0,255]. Codurile din intervalul [0,127] corespund
1

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

caracterelor codului ASCII obinuit, iar cele din intervalul [128,255] corespund unor caractere
ce au o utilizare special.
Constantele caracter corespunztoare caracterelor aparinnd codului ASCII extins din
intervalul [128,255] se definesc prin secvene escape n care se indica codul acestora.
Exemple :

'\377' caracterul cu codul 255


'\344' caracterul cu codul 228 (litera greceasca sigma)
'\0' constant caracter NUL, marca a sfritului de sir de caractere

CODUL ASCII

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

CODUL ASCII EXTINS

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

SEMNIFICAIA CARACTERELOR DE CONTROL N COD ASCII

iruri de caractere
O succesiune de zero sau mai multe caractere formeaz o constant sir sau un sir de
caractere. Un sir de caractere se reprezint prin ncadrarea acestuia intre ghilimele.
Exemplu : "Acesta e un sir de caractere" reprezint irul de caractere Acesta e un sir
de caractere
Dac se dorete folosirea caracterelor negrafice n compunerea unui sir de caractere sau a
caracterelor backslash sau ghilimele se utilizeaz secvenele escape aferente.
Exemple : "1\"2"
"a\\b"
"O'Neil"

reprezint succesiunea 1"2


reprezint succesiunea a\b
reprezint succesiunea O'Neil

Un ir poate fi continuat pe rndul urmtor folosind caracterul backslash. Caracterul ce


precede pe backslash se va concatena cu primul caracter de pe rndul urmtor.
ATENTIE : Un sir de caractere se pstreaz n memorie ntr-o succesiune de octei al crui
numr este egal cu numrul caracterelor irului respectiv + 1, deoarece se memoreaz i
caracterul NUL (care marcheaz sfritul irului).
Funciile getch i getche
Aceste funcii sunt dependente de implementare.
Ambele funcii permit citirea direct de la tastatur a unui caracter.
Funciile getch i getche au prototipurile n fiierul conio.h, deci utilizarea lor implic
includerea acestor fiiere.
Funcia getch
- citete de la tastatur FAR ECOU, deci caracterul tastat la tastatur nu se
afieaz (automat) i pe ecranul consolei;

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

- permite citirea de la tastatur att a caracterelor corespunztoare codului


ASCII, cat i a celor corespunztoare unor funcii speciale (tastele funcionale F1, F2 etc sau
combinaii de taste speciale);
- la citirea unui caracter al codului ASCII, funcia returneaz codul ASCII al
caracterului respectiv;
- n cazul n care se acioneaz o tasta care nu corespunde codului ASCII,
funcia getch se apeleaz de doua ori : la primul apel funcia returneaz valoarea zero, iar la
cel de al doilea apel se returneaz o valoare specifica tastei acionate.
Funcia getche
- este analog cu funcia getch, cu singura diferen ca ea realizeaz citirea CU
ECOU a caracterului tastat. Aceasta nseamn ca se afieaz automat pe ecranul terminalului
caracterul tastat.
Ambele funcii nu au parametri i se pot apela ca operanzi n expresii. La apelarea lor se
vizualizeaz fereastr utilizator i se ateapt tastarea unui caracter. Programul continua dup
tastarea caracterului.
Un apel de forma : getch(); se utilizeaz n cazul n care dorim s vizualizam fereastr
utilizator i s suspendam programul pentru a analiza coninutul curent al ecranului. Pentru a
continua execuia programului se acioneaz o tasta corespunztoare unui caracter al codului
ASCII.
Funcia putch
Aceasta funcie afieaz un caracter pe ecranul terminalului standard. Ea are un parametru
ce determina imaginea (caracterul) afiat la terminal. Prototipul funciei putch se afla n
fiierul conio.h
Funcia putch poate fi apelata astfel :
putch(expresie)
Valoarea expresiei se interpreteaz ca fiind codul ASCII al caracterului care se afieaz.
Dac valoarea expresiei se afla n intervalul [32,126], atunci se afieaz un caracter grafic
al codului ASCII. Dac valoarea respectiva este n afar acestui interval, atunci se afieaz
corespunztor anumite imagini. Funcia putch returneaz codul imaginii afiate (valoarea
parametrului de apel).
Macrourile getchar i putchar
Aceste macrouri sunt definite n fiierul stdio.h. Ele se apeleaz la fel ca funciile.
Macroul getchar
- permite citirea cu ecou a caracterelor de la terminalul standard. Se pot citi
numai caractere ale codului ASCII, nu i caractere corespunztoare tastelor speciale.
- prin intermediul acestui macro, caracterele nu se citesc direct de la tastatura.
Caracterele tastate se introduc ntr-o zona tampon pn la acionarea tastei <Enter>. n acest
moment, n zona tampon se
introduce caracterul de rnd nou i se continua execuia lui getchar. Se revine din funcie
returnndu-se codul ASCII al caracterului curent din zona tampon. La un nou apel se revine
5

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

cu codul ASCII al caracterului urmtor din zona tampon. La epuizarea tuturor caracterelor din
zona tampon, apelul lui getchar implic tastarea la terminal a unui nou set de caractere care se
rencarc n zona tampon.
- se apeleaz fr parametri :
getchar();
si de obicei este un operand al unei expresii.
OBSERVAIE : citirea caracterelor prin intermediul zonelor tampon are avantajul de a
permite corectarea erorilor la tastare (nainte de acionarea tastei <Enter>).
Macroul putchar
- afieaz un caracter al codului ASCII. El returneaz codul caracterului afiat
sau -1 la eroare. Se poate apela prin formatul :
putchar(expresie);
unde valoarea expresiei reprezint codul ASCII al caracterului care se afieaz.
OBSERVAII : apelul putch('\n') are ca efect trecerea cursorului n linia urmtoare;
: apelul putchar('\n') are ca efect trecerea cursorului n coloana 1 a liniei
urmtoare (practic se expandeaz '\n' la '\n' i '\r').
Funcia puts
- afieaz la terminalul standard un sir de caractere ale codului ASCII. Dup
afiarea irului respectiv cursorul trece automat n coloana nti de pe linia urmtoare (deci
caracterul NUL se nlocuiete cu newline).
- funcia are ca parametru adresa de nceput a zonei de memorie care conine
caracterele de afiat
- funcia are prototipul n fiierul stdio.h
Exemplu : Un apel de forma :
puts("\nPentru a termina programul actionati o tasta");
are ca efect afiarea pe un rnd nou a textului Pentru a termina programul actionati o tasta,
dup care cursorul se plaseaz la nceputul liniei urmtoare.

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 1
Problema 1.
a. Examinai corectitudinea construciei urmtoarelor constante caracter :
- 'ab'
- 'a
- '\'
- 3'
b. Examinai corectitudinea construciei urmtoarelor constante iruri de caractere :
- 'ab'
- """
- "a
- "ab\"
c. Precizai semnificaia urmtoarelor construcii :
- '\t'
- '\0'
- '\42'
- "a\1b"
- "a\13"
Problema 2.
1. Copiai n caiete textul programului de mai jos .
2. Copiai-l ntr-o fereastr noua, compilai-l, link-editai-l i lansai-l n execuie.
3. Explicai semnificaia enunului #define.
4. Explicai utilitatea apelului getch().
5. Modificai irul de caractere astfel nct execuia programului s afieze un mesaj de salut
care s vi se adreseze explicit (incluznd numele dumneavoastr).
#include <stdio.h>
#include <conio.h>
#define TEXT "Acesta este un sir de caractere ce va fi substituit lui TEXT"
int main(void)
{
puts(TEXT);
getch();
return 0;
}
7

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Problema 3.
1. Copiai ntr-o fereastr noua, compilai, link-editai i lansai n execuie programul de
mai jos (concentrai-va asupra execuiei; n program exista i instruciuni pe care le vei nva
n sptmnile urmtoare).
2. Deducei pentru fiecare caracter introdus i reprezentarea binara.
#include <stdio.h>
#include <conio.h>
int main(void)
{
unsigned char c;
while((c=getch())!=0)
{
putch(c);
printf(" -> cod ASCII = %d (zecimal) sau %x (hexa) sau %o (octal)\n",c,c,c);
}
return 0;
}
Problema 4.
Scriei un program care s afieze urmtoarele caractere:
A,\,",1,',c
i apoi s emit semnalul sonor.
Problema 5.
1. Copiai n caiete i apoi ntr-o fereastr nou textul programului de mai jos.
2. Compilai, link-editai i lansai n execuie programul.
3. Introducei ca date de intrare, pe rnd, diverse caractere corespunztoare codului ASCII.
Notai n caiete rezultatele obinute.
4. Acionai pentru introducerea datei de intrare o tasta ce nu corespunde codului ASCII.
5. Modificai programul astfel nct, dup afiarea caracterului, cursorul s avanseze la o
linie noua.
6. Modificai programul astfel nct nainte de a se termina execuia lui s se afieze fereastr
utilizator i s se atepte acionarea unei taste.
7. Explicai semnificaia construciei #include.
8. Substituii apelul putch(getch()) cu putch(getch() - 'a' + 'A'). Ce se ntmpla dac tastai o
litera mica? Explicai comportamentul programului.
8

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

#include <conio.h>
int main(void)
{
putch(getch());
return 0;
}
Problema 6.
1. s se scrie un program care citete un caracter folosind macro-ul getchar, l afieaz
folosind macro-ul putchar, trece cursorul n coloana 1 a liniei urmtoare i afieaz fereastr
utilizator pn la acionarea unei taste. ATENTIE la modul de introducere a datelor.
2. Modificai programul astfel nct s se afieze pe o linie nou mesajul :
Pentru a termina programul actionati o tasta

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

LABORATORUL 2
SCRIEREA i CITIREA CU FORMAT LA TERMINALUL STANDARD
FUNCIILE PRINTF i SCANF
Funcia printf afieaz date pe ecranul terminalului standard sub controlul unor formate.
Sintaxa apelului este :
printf(parametru_control, par1,par2,...,parn);
unde par1,par2,...,parn - sunt expresii ale cror valori se scriu conform specificatorilor de
format prezeni n parametrul de control
Parametrul control este un sir de caractere ce conine :
- succesiuni de caractere care se afieaz ca atare;
- specificatori de format care definesc conversiile valorilor parametrilor par1...parn din
format extern n format intern.
Un specificator de format ncepe cu caracterul % dup care urmeaz :
- opional : un caracter minus - implicit datele se cadreaz la dreapta cmpului n care
se scriu. n prezenta minusului, datele se cadreaz la stnga;
- opional : un sir de cifre zecimale - acesta definete numrul minim de poziii ale
cmpului n care se afieaz caracterele ce intra n compunerea formatului extern al datei. n
cazul n care afiarea datei necesita un cmp de lungime mai mare dect cel precizat, se face
automat extensia cmpului la numrul necesar de poziii. n cazul n care data necesita un
cmp mai mic, ea se va scrie n cmpul respectiv n stnga sau n dreapta, dup cum este
prezent sau nu semnul minus n specificatorul de format corespunztor ei. De asemenea, n
acest caz, cmpul se completeaz cu caractere nesemnificative; implicit, caracterele
nesemnificative sunt spaii. Caracterele nesemnificative vor fi zerouri dac numrul ce indica
dimensiunea minima a cmpului ncepe cu un zero nesemnificativ.
- opional : un punct urmat de un sir de cifre zecimale - irul de cifre zecimale
specifica precizia datei care se scrie sub controlul specificatorului respectiv. n cazul n care
data care se scrie este un numr real, precizia definete numrul de zecimale care se scriu. n
cazul n care data este un sir de caractere, precizia indica numrul de caractere care se scriu.
- una sau doua litere - acestea definesc tipul de conversie aplicat datei care se scrie.
Semnificaia ultimei litere a specificatorului de format la scriere :
Litera
d
o
x
X

Conversia realizat
- data se convertete din tipul int n zecimal i se scriu la ieire caracterele zecimale
ale ei, eventual precedate de semnul -, dac data este negativa ;
- data se convertete din tipul int n octal i se scriu la ieire caracterele ei octale;
- data se convertete din tipul int n hexazecimal i se scriu la ieire caracterele ei
hexazecimale;
- ca i n cazul literei x, dar n scrierea hexazecimala se folosesc literele mari (A - F);
10

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

u
c

- data se convertete din tipul unsigned n zecimal ntreg fr semn


- valoarea parametrului care ii corespunde se considera ca reprezint codul ASCII al
unui caracter i se scrie caracterul respectiv;
s
- parametrul care-i corespunde se scrie ca un sir de caractere; se considera ca irul se
termina la ntlnirea caracterului NUL ('\0');
f
- valoarea parametrului care-i corespunde se convertete din tipul float sau double n
formatul:
ddddd.....d.dddd...d
(d reprezint o cifra zecimala), unde numrul de cifre dup punctul zecimal este fie cel
indicat de precizia specificatorului de format, fie este egal cu 6. Partea ntreag este
precedata de semnul minus dac numrul este negativ;
e
- conversia se realizeaz din tipul float sau double n formatul :
d.ddd.....de+/-ddd
unde numrul cifrelor de dup punctul zecimal este dat de precizia specificatorului de
format sau este egal cu 6, dac aceasta este absenta. Partea ntreag este precedata de
semnul minus dac numrul este negativ. La exponent se va scrie una, doua sau trei
cifre, n funcie de valoarea numrului;
E
- ca i n cazul literei e, cu deosebirea ca litera e se schimba cu E :
d.ddd.....dE+/-ddd
La exponent se va scrie una, doua sau trei cifre, n funcie de valoarea numrului;
g
- se aplica una din conversiile definite de literele f sau e, alegndu-se cea care se
reprezint pe un numr minim de caractere;
G
- ca i g cu singura deosebire ca se utilizeaz E n loc de e.
Literele d,o,x i u pot fi precedate de litera l i n acest caz conversia se realizeaz din long n
loc de int.
Literele f,e,E,g i G pot fi precedate de litera L i n acest caz conversia se realizeaz din long
double n loc de float sau double.
Funcia scanf preia date tastate de la terminalul standard sub controlul unor formate. Sintaxa
apelului este :
scanf(control,par1,par2,...,parn);
- par1,par2,...,parn - sunt adresele zonelor n care se pstreaz datele citite dup ce au fost
convertite din formatele lor externe n formate interne corespunztoare. Adresa unei zone de
memorie se exprima adesea folosind operatorul unar &;
- parametrul de control este un sir de caractere care definete formatul datelor i al
eventualelor texte aflate la intrarea de la tastatura;
Caracterele albe din compunerea parametrului de control sunt neglijate. Restul caracterelor,
care nu fac parte dintr-un specificator de format, trebuie s existe la intrare n poziii
corespunztoare (acestea se folosesc n vederea efecturii de controale asupra datelor citite).
Specificatorii de format ncep cu caracterul % i se termina cu 1-2 litere.
Literele definesc tipul de conversie aplicat datei care se scrie.
11

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Intre procent i litere intr-un specificator de format se mai pot utiliza:


- opional : un caracter asterisc - caz n care data din cmpul respectiv va fi prezenta la
intrare, dar ea nu se atribuie nici unei variabile i deci nu-i va corespunde un parametru;
- opional : un sir de cifre care definete lungimea maxima a cmpului din care se
citete data sub controlul formatului respectiv;
Cmpul controlat de un specificator de format ncepe cu primul caracter care nu este alb i se
termina :
- fie la caracterul dup care urmeaz un caracter alb;
- fie la caracterul dup care urmeaz un caracter care nu corespunde specificatorul de
format care controleaz acel cmp;
- fie la caracterul prin care se ajunge la lungimea maxima a cmpului indicata n
specificatorul de format (doar dac n specificatorul de format este indicata lungimea
maxima).
Funcia scanf citete toate cmpurile care corespund specificatorilor de format, inclusiv
eventualele texte prezentate n parametrul control.
n cazul unei erori, citirea se ntrerupe n locul n care s-a ntlnit eroarea. Eroarea poate
proveni :
- din necorespondena textului curent n parametrul de control cu cel din fiierul de
intrare;
- din neconcordanta dintre data din cmp i specificatorul de format sub controlul
cruia se face citirea.
Apariia unei erori poate fi pusa uor n evidenta deoarece funcia scanf returneaz, la
revenirea din ea, numrul cmpurilor citite corect.
Funcia scanf citete date din zona tampon ataata tastaturii, la fel ca i getchar. De aceea,
datele se citesc efectiv dup ce s-a acionat tasta Enter.
Semnificaia ultimei litere a specificatorului de format la citire :
Litera
d
o
x
X
u
c

Conversia realizat
- data din cmpul de intrare este un sir de cifre zecimale, precedat eventual de un semn
i se convertete din zecimal n binar de tip int;
- ca i n cazul literei d, cu deosebirea ca irul de cifre este considerat ca formeaz un
numr octal;
- ca i n cazul literei d, cu deosebirea ca irul de cifre este considerat ca formeaz un
numr hexazecimal; se utilizeaz literele mici a-f sau mari A-F pentru a scrie cifrele
peste 9;
- ca i n cazul literei x;
- data de intrare este un sir de cifre zecimale care formeaz un numr ntreg fr semn
i se convertete n binar tipul unsigned;
- data de intrare se considera formata din caracterul curent de la intrare i parametrului
corespunztor i se atribuie codul ASCII
al acestui caracter; n acest caz nu se face
avans peste caracterele albe, ca n cazul celorlali specificatori;
12

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

- data se considera ca este un sir de caractere; irul ncepe, conform regulilor generale,
cu primul caracter care nu este alb i se termina la caracterul dup care urmeaz un
caracter alb sau cnd s-au citit attea caractere cte indica dimensiunea maxima din
specificatorul de format;
- data de intrare reprezint un numr flotant, eventual precedat de un semn; se
convertete n virgula flotanta simpla precizie;
data care se citete poate fi scrisa
att n formatul cu exponent, cat i n formatul fr exponent.

Literele d,o,x i X pot fi precedate de litera l i n acest caz conversia se realizeaz spre long
n loc de int sau de litera h i n acest caz conversia se realizeaz spre short .
Specificatorul terminat cu lu realizeaz conversia spre unsigned long.
Litera f va fi precedata de litera l pentru a face conversia spre formatul virgula flotanta dubla
precizie, deci spre tipul double.
Specificatorul terminat cu Lf permite conversia numerelor zecimale, att din format cu
exponent cat i fora, spre formatul virgula flotanta long double.

13

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 2
Problema 1.
1. Copiai n caiete textul programului de mai jos.
2. Copiai textul programului de mai jos ntr-o fereastr noua.
3. Compilai-l, link-editai-l i lansai-l n execuie.
4. Urmrii rezultatele execuiei pe ecranul utilizator i explicai forma de afiare.
5. Modificai "inteligent" specificatorii de format, urmrii i explicai rezultatele astfel
obinute.
#include <stdio.h>
#include <conio.h>
#define A "Bine ati venit n lumea programelor C"
int main(void)
/* programul ilustreaza afiarea caracterelor si a sirurilor de caractere cu diferiti specificatori
de format */
{
printf("%c\n",'A');
printf("|%5c|\n",'A');
printf("|%-5c|\n",'A');
puts(A);
printf("A=*%s*\n", A);
printf("A=*%38s*\n", A);
printf("A=*%40.23s*\n", A);
getch();
return 0;
}
Problema 2.
1. Copiai n caiete textul programului de mai jos.
2. Copiai textul programului de mai jos ntr-o fereastr noua.
3. Compilai-l, link-editai-l i lansai-l n execuie.
4. Urmrii rezultatele execuiei pe ecranul utilizator i explicai forma de afiare.
5. Modificai "inteligent" specificatorii de format, urmrii i explicai rezultatele astfel
obinute.
6. Modificai definiia constantei simbolice A astfel nct ea aib valoarea 32768. Explicai
comportamentul "ciudat" al programului. Facei modificrile necesare astfel nct programul
s afieze corect i aceasta valoare.
#include <stdio.h>
#define A 12345
int main(void)
14

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

/* programul ilustreaza afiarea numerelor ntregi cu diferiti specificatori de format */


{
printf("A=%d\n", A);
printf("A=*%7d*\n", A);
printf("A=*%-7d*\n", A);
printf("A=%o\n", A);
printf("A=%x\n", A);
printf("A=%X\n", A);
return 0;
}
Problema 3.
1. Copiai n caiete textul programului de mai jos.
2. Copiai textul programului de mai jos ntr-o fereastr noua.
3. Compilai-l, link-editai-l i lansai-l n execuie.
4. Urmrii rezultatele execuiei pe ecranul utilizator i explicai forma de afiare.
5. Modificai "inteligent" specificatorii de format, urmrii i explicai rezultatele astfel
obinute.
6. Modificai definiia constantei simbolice X astfel nct ea s aiba valoarea 1.8e308.
Explicai comportamentul "ciudat" al programului.
Facei modificrile necesare astfel nct programul s afieze corect i aceasta valoare.
#include <stdio.h>
#define A 47.389
#define X -123.5e20
int main(void)
/* programul ilustreaz afiarea numerelor nentregi cu diferiti specificatori de format
{
printf("A=%f\n", A);
printf("A=%.3f\n", A);
printf("A=%.2f\n", A);
printf("A=%.1f\n", A);
printf("A=%.0f\n", A);
printf("X=%e\n", X);
printf("X=%.4e\n", X);
printf("X=%.3e\n", X);
printf("X=%.2e\n", X);
printf("X=%.1e\n", X);
printf("%20f\n%20e\n%20g\n", 1.25,1.25,1.25);
printf("%20f\n%20e\n%20g\n", .25,.25,.25);
printf("%20f\n%20e\n%20g\n",123e-1,123e-1,123e-1);
printf("%20f\n%20e\n%20g\n", 12.3e4,12.3e4,12.3e4);
return 0;
}
15

*/

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Problema 4
Pe baza exemplelor de mai sus (dar mai ales a cunotinelor dobndite prin citirea i
nvarea cursului) scriei n caiete i apoi s rulai un program C care :
- s defineasc constantele simbolice: S - "Salut !"
A - 1996
X - 123456.789012345
- s afieze irul S n centrul ecranului (sunt 80 de poziii pe linie)
- s afieze A ca ntreg pe 9 poziii, cadrat la stnga zonei
- s afieze X n forma cu exponent cu 7 cifre la partea zecimala a acestui format.
Problema 5.
1. Copiai textul programului de mai jos ntr-o fereastr nou i lansai-l n execuie
(programul ilustreaz citirea datelor de tip caracter).
2. Introducei diverse valori pentru caracterul ce se citete.
3. Modificai programul astfel nct ecranul consolei s rmn blocat pe ecranul utilizator
pn la apsarea unei taste.
4. Modificai programul astfel nct s se citeasc doua date de tip caracter.
#include <stdio.h>
int main(void)
{
char ch;
printf("Introducei un caracter:");
scanf("%c",&ch);
printf("\nAti introdus caracterul %c\n", ch);
return 0;
}
Problema 6.
1. Copiai textul programului de mai jos ntr-o fereastr nou i lansai-l n execuie
(programul ilustreaz citirea datelor de tip ntreg).
2. Explicai semnificaia specificatorilor de format utilizai.
3. Introducei valori corecte pentru cele 5 numere ntregi care se citesc (separate prin
<Enter>).
4. Introducei 5 valori corecte de numere ntregi separate prin blank-uri. Explicai modul de
execuie al programului.
5. Introducei de exemplu secvena de caractere 5.<Enter>. Explicai rezultatele obinute.
#include <stdio.h>
#include <conio.h>
int main(void)
{
int n0,n1,n2,n3,n4,nr;
printf("Introducei un numar ntreg = ");
scanf("%d",&n0);
16

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

printf("%d",n0);
printf("Introducei 4 numere ntregi =");
nr=scanf("%d%d%d%d", &n1, &n2, &n3, &n4);
printf("n1 = %d n2 = %d n3 = %d n4 = %d\nnr=%d\n",n1,n2,n3,n4,nr);
getch();
return 0;
}
Problema 7.
1. Copiai textul programului de mai jos ntr-o fereastr nou i lansai-l n execuie
(programul ilustreaz citirea datelor de tip real).
2. Explicai semnificaia specificatorilor de format utilizai.
3. Introducei diverse valori pentru cele 3 numere reale (de exemplu : 1 3e5 0.1234567890)
i explicai rezultatele execuiei programului.
4. Modificai adecvat programul astfel nct introducerea datelor s fie nsoita de cte un
mesaj adecvat pentru fiecare data introdus (deci naintea introducerii valorii xi, i=1,2,3, s
apar pe ecran textul xi=). Atenie la modul de introducere a datelor, astfel nct programul s
fie exploatat adecvat.
#include <stdio.h>
#include <conio.h>
int main(void)
{
float x1,x2,x3;
int nr;
printf("Introduceti 3 nr. reale =");
nr=scanf("%f%f%f",&x1,&x2,&x3);
printf("x1 = %e\nx2 = %e\nx3 = %e\nnr=%d\n",x1,x2,x3,nr);
getch();
return 0;
}
Problema 8.
Pe baza exemplelor de mai sus (dar mai ales a cunotinelor dobndite prin citirea i
nvarea cursului) scriei n caiete i apoi rulai un program C care citete de la tastatur 3
valori reale dubl precizie i apoi le afieaz. Citirea i afiarea datelor vor fi nsoite de
mesaje adecvate. Se va afia totodat informaia asociat corectitudinii citirii datelor
introduse.

17

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

LABORATORUL 3
OPERATORI N LIMBAJUL C
Vom prezenta, pentru nceput, principalii operatori ai limbajului C, urmnd ca, pe
parcursul laboratoarelor urmtoare, s introducem i ceilali operatori
Operatorii ce apar ntr-o expresie pot fi operatori unari, ce se aplic unui singur
operand, operatori binari, ce leag doi operanzi, sau operatori ternari, ce leag trei operanzi.
Operatorii se pot clasifica n funcie de clasa de operaii pe care o implementeaz, sau
n funcie de prioritatea atribuit. La scrierea unei expresii se pot folosi operatori din aceeai
clas sau din clase diferite. La evaluarea unei expresii se ine seama de prioritile operatorilor
ce aparin unor clase diferite, de asociativitatea operatorilor de aceeai prioritate i de regula
conversiilor implicite.
Operatori parantez
Aceti operatori au prioritate maxim i sunt reprezentai prin simbolurile :
( ) - paranteze rotunde
[ ] - paranteze ptrate
Parantezele rotunde se folosesc pentru a modifica ordinea operaiilor efectuate n
vederea calculului unei expresii, fornd evaluarea cu prioritate a sub expresiei incluse n
paranteze. Ele se utilizeaz de asemenea i pentru a marca apelul unei funcii.
Parantezele ptrate includ expresii ce reprezint indici, fiind numite i operatori de
indexare.
Operatori aritmetici
Operatorii aritmetici, prezentai n ordine descresctoare a prioritilor, sunt :
- operatori unari :
+ (pozitivare)
- (negativare)
- operatori binari multiplicativi :
* (nmulire)
/ (mprire)
% (rest) - numai pentru operanzi ntregi !
- operatori binari aditivi :
+ (adunare)
- (scdere)
Toi operatorii unari au aceeai prioritate i se asociaz de la dreapta la stnga. Toi
operatorii multiplicativi au aceeai prioritate i se asociaz de la stnga la dreapta. n mod
similar, operatorii aditivi au aceeai prioritate i se asociaz de la stnga la dreapta.
n general, rezultatul calculelor este incorect dac se depete intervalul valorilor
reprezentabile pentru fiecare tip de dat n parte.
18

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

n evaluarea expresiilor se aplic regula conversiilor implicite. Aceasta se enun


astfel :
Dac operatorul curent se aplic unor operanzi de acelai tip, se execut operaia
respectiv, iar tipul rezultatului este tipul comun al operanzilor; dac operatorul curent se
aplic unor operanzi de tipuri diferite, operandul de tip aa-numit inferior se convertete
spre tipul aa-numit superior al celuilalt operand, se execut operaia i tipul rezultatului
este tipul superior.
Concret, n primul rnd se convertesc operanzii de tip char la tipul int.
Apoi, dac unul din operanzi este de tip long double atunci cellalt operand se
convertete la tipul long double i rezultatul operaiei este de tip long double. Dac unul din
operanzi este de tip double atunci cellalt operand se convertete la tipul double i rezultatul
operaiei este de tip double. Dac unul din operanzi este de tip float atunci cellalt operand se
convertete la tipul float i rezultatul operaiei este de tip float. Dac unul din operanzi este de
tip unsigned long atunci cellalt operand se convertete la tipul unsigned long i rezultatul
operaiei este de tip unsigned long. Dac unul din operanzi este de tip long int atunci cellalt
operand se convertete la tipul long int i rezultatul operaiei este de tip long int. Dac unul
din operanzi este de tip unsigned int atunci cellalt operand se convertete la tipul unsigned
int i rezultatul operaiei este de tip unsigned int.
Aplicnd regula de mai sus n procesul de evaluare a unei expresii pe rnd fiecrui
operator, se determin n final tipul i valoarea expresiei respective.
Exemplul 1.
a) Valoarea expresiei 9/2 este 4 deoarece, ambii operanzi fiind de tip ntreg, tipul
expresiei este de asemenea ntreg (operatorul / furnizeaz la aplicarea s asupra unor operanzi
de tip ntreg, ctul mpririi primului operand la cel de al doilea).
a
se scrie corect n limbajul C ca :
b) Dac a i b sunt variabile, expresia aritmetic
2b
a
a/2/b sau a/(2*b). Formularea a/2*b descrie expresia
b . Aceasta deoarece n cazul
2
operatorilor binari ce au aceeai prioritate, asocierea acestora se face de la stnga la dreapta.
Operatori de relaie
Operatorii de relaie sunt operatori binari, au cu toii aceeai prioritate i ei sunt :
<
(mai mic)
<= (mai mic sau egal)
>
(mai mare)
>= (mai mare sau egal).
19

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

O expresie de forma :
expresie_1 operator_relaie expresie_2 ,
unde expresie_1 i expresie_2 sunt expresii valide n C, iar operator_relaie este unul din
operatorii de relaie, se numete expresie de relaie i este de tip int. Valoarea unei astfel de
expresii este 1 dac valorile celor dou expresii expresie_1 i expresie_2 satisfac relaia
specificat de operatorul n cauz i 0 n caz contrar.
Operatori de egalitate
Operatorii de egalitate, operatori binari, ce au cu toii aceeai prioritate, sunt :
==
(egal)
!=
(diferit)
O expresie de forma :
expresie_1 operator_egalitate expresie_2 ,
unde expresie_1 i expresie_2 sunt expresii valide n C, iar operator_egalitate este unul din
operatorii de egalitate, se numete expresie de egalitate i este de tip int. Valoarea unei astfel
de expresii este 1 dac valorile celor dou expresii expresie_1 i expresie_2 satisfac relaia
specificat de operatorul n cauz i 0 n caz contrar.

Exemplul 2. Expresia care descrie corect testul asupra paritii unui numr ntreg x ( care
apare deci ntr-o declaraie de forma int x) se scrie n limbajul C ca :
x % 2 == 0
i ea are de exemplu valoarea 0 pentru x = 11 i 1 pentru x = 10.
Operatori logici
Facem pentru nceput observaia c n limbajul C nu exist definit tipul de date logic.
Se consider c valoarea de adevr fals este reprezentat de valoarea zero, iar orice valoare
diferit de zero este interpretat ca valoare de adevr adevrat.
Operatorii logici prezentai n ordine descresctoare a prioritilor sunt :
!
(negaia logic) - operator unar
&& (I logic) - operator binar
||
(SAU logic) - operator binar
Operatorul unar se asociaz de la dreapta la stnga, iar operatorii binari se asociaz de la
stnga la dreapta.
O expresie de forma :
expresie_1 operator_logic expresie_2 ,
unde expresie_1 i expresie_2 sunt expresii valide C, iar operator_logic este unul din
operatorii logici binari, se numete expresie logic i este de tip int. Valoarea unei astfel de

20

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

expresii este 1 dac valorile celor dou expresii E1 i E2 satisfac relaia specificat de
operatorul n cauz i 0 n caz contrar.
Exemplul 3. Dac an este o variabil de tip ntreg despre care se presupune c reprezint un an
calendaristic, expresia care exprim condiia ca an s fie bisect are forma (un an este bisect
dac el aparine intervalului [1600, 4900], este multiplu de 4 i nu este multiplu de 100, cu
excepia anilor multiplii de 400) :
an >= 1600 && an <= 4900 && (an % 4 == 0 && an % 100 != 0 || an % 400 ==0)
i ea are valoarea 1 pentru anii biseci ce aparin intervalului i 0 pentru anii nebiseci sau care
nu aparin intervalului menionat.
Operatori de atribuire
Operatorul de atribuire n limbajul C are simbolul :
=
(atribuire)
O expresie de forma:
v = (expresie)

unde v este o variabil simpl, elementul unui tablou sau al unei structuri, iar expresie este o
expresie valid C, se numete expresie de atribuire. Cum operatorul de atribuire este unul
dintre cei mai puin prioritari, parantezele pot lipsi n cele mai multe cazuri. Expresia de
atribuire se evalueaz astfel : se evalueaz nti expresie, iar rezultatul obinut se convertete
dac este cazul la tipul lui v, dup care i se atribuie lui v. Ea are ca tip, tipul membrului stng
i ca valoare, valoarea expresiei rezultat n urma conversiei.
O construcie de forma :
v = (v1 = (expresie))
este corect i reprezint tot o expresie de atribuire, lui v atribuindu-i-se valoarea lui v1,
eventual dup o conversie de tip dac este cazul. Deoarece operatorul de atribuire se asociaz
de la dreapta la stnga, expresia se poate scrie n general :
v = v1 = v2= ......= vn = (expresie)
n limbajul C, pentru a prescurta scrierea unei expresii de forma:
v = v operand (expresie)
unde operand este unul din operanzii : / % * - +, este permis scrierea echivalent :
v operand = expresie
Operatori de incrementare i de decrementare

21

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Operatorii de incrementare i de decrementare sunt operatori unari i au simbolurile :


++
(incrementare)
-(decrementare)
Aceti operatori pot fi folosii prefixnd operandul, caz n care se folosete valoarea
operandului la care s-a aplicat n prealabil operatorul respectiv, sau postfixnd operandul, caz
n care se folosete valoarea operandului dinaintea aplicrii operatorului respectiv.
Exemplul 4. Dac x este o variabil ce are la un moment dat valoarea 5 atunci :
a) Dup evaluarea expresiei de atribuire y = ++x, y = 6 i x = 6
b) Dup evaluarea expresiei de atribuire y = x++, y = 5 i x = 6
Operatorul de forare a tipului sau de conversie explicit
Acest operator este unar i se scrie sub forma :
(tip) operand

unde tip este numele unui tip predefinit sau definit de utilizator , iar efectul aplicrii unui
astfel de operator este conversia valorii operandului spre tipul tip.
Exemplul 5. Dac n este o variabil de tip ntreg, atunci expresia n/(n + 1), evaluat n C, are,
indiferent de valoarea lui n, valoarea 0. Pentru calculul numrului fracionar corespunztor, ea
se scrie fie ca n/(n+1.0), fie, folosind o conversie explicit de tip care s foreze tipul unuia
din cei doi operanzi ai mpririi la un tip real (de exemplu double) : (double)n/(n + 1).
Operatorul dimensiune
Acest operator este unar i are simbolul
sizeof (dimensiune)

El se poate folosi n una din formele de mai jos :


sizeof data
a)
unde data este numele unei variabile simple, al unei variabile tablou sau al unei structuri;
sizeof (tip)
b)
unde tip este numele unui tip de data, predefinit sau definit de utilizator.
Operatorul adres
Operatorul adres este un operator unar i are simbolul :
&
(adres)
El se aplic pentru a determina adresa de nceput a zonei de memorie alocate unei date.

22

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Operatorul condiional
Acest operator ternar permite construirea unei expresii a crei valoare depinde de
valoarea unei condiii i el este simbolizat prin caracterele :
?:

asociindu-se de la dreapta la stnga.


O expresie care folosete acest operator se numete expresie condiional i ea se
construiete astfel :
expresie_1? expresie_2 : expresie_3

unde expresie_1, expresie_2, expresie_3 sunt expresii valide n limbajul C.


O expresie condiional se evalueaz astfel :se calculeaz valoarea expresiei
expresie_1. Dac rezultatul obinut este diferit de zero, atunci tipul i valoarea expresiei
coincid cu tipul i valoarea expresiei expresie_2. n caz contrar, tipul i valoarea expresiei
coincid cu tipul i valoarea expresiei expresie_3.
Exemplul 6. Dac a i b sunt dou variabile, expresia a > b ? a : b furnizeaz maximul dintre
cele dou valori.
Operatorul virgul
Operatorul virgul este un operator binar cu simbolul :
,
(virgul)
i se folosete pentru a lega dou expresii ntr-una singur, printr-o construcie de forma :
expresie_1 , expresie_2

care reprezint din punct de vedere sintactic o singur expresie, ce are acelai tip i aceeai
valoare ca i expresia expresie_2.
Operatorul virgul se folosete n cazurile n care sintaxa limbajului impune folosirea
unei singure expresii, iar complexitatea calculelor necesit evaluarea mai multor expresii.

23

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 3

Copiai n caiete tabelul de mai jos :


Tabel cu prioritile operatorilor
(operatorii de pe aceeai linie au aceeai prioritate)
(
)
[
]
.
->
-(unar) +(unar) *(unar) &(unar) !
~
++ -- (tip) sizeof
*
/
%
+
<< >>
<
<= >= >
== !=
&(binar)
^
|
&&
||
?
:
=
=op (op poate fi *(binar) / % +(binar) -(binar) << >> & ^ |)
,
ATENTIE : Toi operatorii se asociaz de la stnga la dreapta,
condiionali i de atribuire care se asociaz de la dreapta la stnga .

exceptnd cei unari,

Notai n caiete tabelele de adevr pentru operatorii logici

| ADEVARAT
FALS
|-------------------------------------| FALS
ADEVARAT

&&
| ADEVARAT
FALS
-------------------------|---------------------------ADEVARAT
| ADEVARAT
FALS
FALS
| FALS
FALS
||
| ADEVARAT
FALS
-------------------------|---------------------------ADEVARAT
| ADEVARAT
ADEVARAT
FALS
| ADEVARAT
FALS

negaie logica

SI logic

SAU logic

Reamintim ca n C nu exista predefinit tipul de date logice (ce are drept componente
valorile logice ADEVARAT i FALS). O variabila se considera ca avnd valoarea logica
ADEVARAT dac ea este nenul, avnd valoarea FALS atunci cnd ea este nula.
24

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Problema 1. Analizai exemplele de mai jos rspunznd la ntrebrile puse. n cazul n care
considerai ca expresiile sunt scrise incorect, corectai-le.
Exemplul 1.
Pentru x variabila de tip real, este corecta expresia ?
99(x + 1,5)
Exemplul 2.
Pentru l1,l2,l3 variabile de tip logic, sunt corecte expresiile de mai jos ?
&& l1 l2
! l1 || l2
l2 && ! l1
Ce valoare au expresiile scrise corect pentru l1 != 0 i l2 = 0 ?
Dar pentru l1 = 0 i l2 != 0
Este expresia a doua echivalenta cu ! (l1 || l2) ?
Dar cea de a treia cu l2 && (! l1) ?
Exemplul 3.
Pentru x variabila de tip real este corecta expresia de mai jos care exprima condiia
ca x s fie mai mic dect 5 sau mai mare ca 10 ?
x < 5 && x > 10
Dar expresia de mai jos care exprima condiia ca x s fie egal cu zero :
x=0
Ce valoare au expresiile scrise corect pentru x=0, pentru x=5 i pentru
x=7 ?
Exemplul 4.
Pentru a,b variabile de tip real, sunt corecte expresiile de mai jos ?
a\b
a%b
Dar pentru a, b variabile de tip ntreg? Ce valori au expresiile pentru a=8 i b=3 n cele
doua cazuri ?
Problema 2 ilustreaza "beneficiile" utilizrii depanatorului (debugger-ului)!
Problema 2. S se copie programul de mai jos ntr-o fereastr nou i s se execute.
Dai valorile : ore=1, min=6, sec=8.
: ore=9, min=6, sec=8.
Explicai comportamentul sau "CIUDAT" i gsii remediul.
Executai programul pas cu pas, introducnd n fereastr Watch expresiile 3600*ore, 60*min,
sec.

25

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

#include <stdio.h>
int main(void)
{
short ore,min,sec,t;
printf("Introduceti timpul in ore, minute si secunde ");
if (scanf("%hd%hd%hd",&ore,&min,&sec)!=3)
printf("Date incorecte");
else
{
t=ore*3600+min*60+sec;
printf("%d ore %d minute %d secunde = %d secunde", ore,min,sec,t);
}
return 0;
}
Problemele 3 i 4 ilustreaz modul de utilizare a principalilor operatori din C i C++.
Copiai n caiete textele programelor aferente i apoi executai-le pe rnd. Identificai
semnificaia fiecrui operator n parte, prioritile acestora, tipul operanzilor i explicai
rezultatele obinute.
Problema 3.
#include <stdio.h>
#include <conio.h>
int main(void)
{
int an,bis;
int a,b,c,d;
double x,y,z,t;
char car;
clrscr();
a=10;
b=3;
x=10.;
c=a/b;
y=a/b;
t=x/b;
d=a%b;
z=a%b;
printf("a=%d\tb=%d\nc=%d\ty=%f\tt=%f\nd=%d\tz=%f\n",a,b,c,y,t,d,z);
printf("an = ");
scanf("%d",&an);
26

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

bis=an >= 1600 && an <= 4900 && (an%4 == 0 && an %100 != 0 || an %400 ==0);
printf("Anul %d este %s", \
an, bis? "bisect" : "nebisect");
printf("\na<b %d",a<b);
printf("\na>b %d\n",a>b);
printf("Tastati o litera minuscula ...");
printf("\nMajuscula corespunzatoare este %c\n",getche() - 'a' + 'A');
getch();
return 0;
}
Problema 4
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void)
{
int a,b,c,d;
long long l;
double x,y,z;
char car;
a=8;
b=a++;
c=--a;
printf("a = %d\tb = %d\tc = %d\n", a,b, c);
x=8;
printf("a= ");
scanf("%d",&a);
c=(a>x)+1;
printf("a = %d\tx = %g\tc (a>x)+1 = %d\n", a,x, c);
x+=1;
printf("x = %f\n", x);
printf("sizeof (char)\t\t =%2d\n",sizeof(char));
printf("sizeof (short)\t\t =%2d\n",sizeof(short));
printf("sizeof (int)\t\t =%2d\n",sizeof(int));
printf("sizeof (long)\t\t =%2d\n",sizeof (long ));
printf("sizeof (long long)\t =%2d\n",sizeof(long long));
printf("sizeof (float)\t\t =%2d\n",sizeof(float));
printf("sizeof (double)\t\t =%2d\n",sizeof(double));
printf("sizeof (long double)\t =%2d\n",sizeof(long double));
printf("b/(b+1) =%.14g\n", (double)b/(b+1)); //explicati rolul conversiei spre double
l=2147483648;
printf("Valoarea expresiei l==2147483647+1
= %d\n",l==2147483647+1);
//explicati rezultatul si faceti modificari pentru a obtine valoarea corecta
27

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

printf("x,y= ");
scanf("%lf%lf",&x,&y);
z=x<y?x:y;
printf("x = %g\ty = %g\tmin(x,y) = %g\n" ,x,y,z);
getch();
return 0;
}
Problema 5. S se scrie un program C care preia de la consola i afieaz doua numere reale
(float) x,y i 2 numere ntregi m i n.
a. s se calculeze memoreze i afieze separat expresiile t=x*y, z=x/y.
s se comenteze :
- rezultatul produsului x*y pentru x=1e20 y=1e20
- rezultatul mpririi x/y pentru x=1e+37 y=1e-2
x=1e-38 y=1e-8
b. s se calculeze memoreze i afieze:
- maximul dintre x i m
- restul mpririi lui m la 2n
c. s se afieze un mesaj din care s rezulte dac n este impar .

28

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

LABORATORUL 4
INSTRUCIUNEA if I INSTRUCIUNI EXPRESIE

Instruciunea if implementeaz structura de decizie din programarea structurat. Ea


permite selectarea pentru execuie a uneia dintre dou alternative, n urma testrii valorii unei
expresii ce implementeaz relaia de condiionare a deciziei.
Sintaxa instruciunii este:
if (expresie)
instruciune_1
else
instruciune_2

unde expresie este o expresie C valid, iar instruciune_1 i instruciune_2 reprezint


respectiv cte o instruciune a limbajului C. n cazul n care alternativele deciziei trebuie
descrise prin mai multe instruciuni, acestea se grupeaz ntr-o instruciune compus. Pentru
claritatea redactrii (lizibilitate) se recomand scrierea indentat care pune mai bine n
eviden cele dou alternative.
Modul de execuie al instruciunii este urmtorul : se evalueaz expresia expresie .
Dac aceasta are o valoare diferit de zero, se execut instruciunea instruciune_1 i nu se
execut instruciunea instruciune_2. Altfel, deci dac expresie are o valoare egal cu zero,
se execut instruciunea instruciune_2 i nu se execut instruciunea instruciune_1.
Sintaxa permite ca instruciunea instruciune_2 s fie vid, caz n care se omite i
cuvntul rezervat else.
Exemplul 1. Instruciunea if cu alternative exprimate prin cte o singur instruciune.
.............
int
nota ;
.............
if (nota >= 5)
printf(Felicitari ! Ati promovat!\n) ;
else
printf(Nu ati promovat !\n) ;
Exemplul 2. Instruciunea if cu alternative exprimate prin instruciuni compuse.
.............
double
s,y ;
int
n;
.............
if (n < 10)
29

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

n++;
s += y ;
}
else
{
n-- ;
s -= y ;
}

Exemplul 3. Semnalm printr-un exemplu necesitatea folosirii atente a separatorului


punct i virgul (;) :
.............
double s,x,y ;
..................
if (x != y) ;
/* ATENIE !!!!! */
{
x++ ;
s=x+y;
}
Scrierea neglijent a separatorului ; marcheaz sfritul instruciunii if (interpretat de
compilator ca fiind cu o singur alternativ, descris prin instruciunea vid). Compilatorul nu
va semnala eroare, instruciunea compus se va Execut necondiionat, incorect deci.
Exemplul 4. O form de scriere abuziv a deciziei este :
int
a, b, gasit ;
..................
if (a == b)
gasit = 1 ;
else
gasit = 0 ;
Soluia mai compact este dat de simpla atribuire:
gasit = a == b ;
Dac instruciune_1 este la rndul ei o decizie, o construcie de forma :
if (expresie_1) if (expresie_2)

instruciune_1

30

else instruciune_2

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

ar putea fi interpretat ambiguu, n dou moduri, i anume :


Varianta 1 :
if (expresie_1)
if (expresie_2)
instruciune_1
else
instruciune_2

caz n care instruciune_2 este alternativa celui de al doilea if.


Varianta 2 :
if (expresie_1)
if (expresie_2)
instruciune_1
else
instruciune_2

caz n care instruciune_2 este alternativa primului if.


Evident, datorit faptului c formatul de redactare a unui program n limbajul C este
liber, scrierea indentat nu face dect s sugereze cele dou posibile modaliti de interpretare,
ele fiind de fapt echivalente.
Compilatorul rezolv aceast ambiguitate, asociind construcia else ultimului if care o
precede n textul surs cruia nu i s-a asociat deja un else i nu se gsete n interiorul unei
instruciuni compuse. Ca urmare compilatorul va interpreta construcia prezentat n varianta
1, caz n care alternativa else se asociaz celui de al doilea if.
Pentru a implementa n C varianta a doua, scrierea corect este :
if (expresie_1)
{
if (expresie_2)
instruciune_1
}
else
instruciune_2
}

31

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 4
Copiai n caiete i RETINETI denumirile i prototipurile funciilor din tabelul de mai jos
Tabel cu cele mai uzuale funcii ce au prototipul n fiierul math.h
abs
calculeaz i returneaz valoarea absoluta a unui argument ntreg
- int abs(int x);
labs
calculeaz i returneaz valoarea absoluta a unui argument de tip long
long labs(long x);
fabs
calculeaz i returneaz valoarea absoluta a unui numar real
double fabs(double x);
acos
implementeaz funcia arccos - rezultatul exprimat n radiani
double acos(double x);
asin
implementeaz funcia arcsin - rezultatul exprimat n radiani
double asin(double x);
atan
implementeaz funcia arctg - rezultatul exprimat n radiani
double atan(double x);
atan2
calculeaz i returneaz valoarea funciei arctg evaluata pentru raportul
dintre primul argument i cel de al doilea;
double atan2(double y, double x); // arctg(y/x)
sin
implementeaz funcia sinus - argumentul exprimat n radiani
double sin(double x);
cos
implementeaz funcia cosinus - argumentul exprimat n radiani
double cos(double x);
tan
implementeaz funcia tangent - argumentul exprimat n radiani
double tan(double x);
sinh
implementeaz funcia sinus hiperbolic
double sinh(double x);
cosh
implementeaz funcia cosinus hiperbolic
double cosh(double x);
tanh
implementeaz funcia tangent hiperbolic
double tanh(double x);
exp
implementeaz funcia exponenial
double exp(double x);
log
calculeaz i returneaz logaritmul natural al argumentului
double log(double x);
log10
calculeaz i returneaz logaritmul zecimal al argumentului
double log10(double x);
pow
calculeaz i returneaz primul argument ridicat la o putere egala cu cel
de al doilea argument
double pow(double x, double y);
pow10 calculeaz i returneaz 10 la puterea cel de al doilea argument
double pow10(double x);
sqrt
calculeaz i returneaz rdcina ptrat a argumentului
double sqrt(double x);
ceil
rotunjete valoarea argumentului (numar real)- aproximare prin exces
double ceil(double x);
floor
trunchiaz valoarea argumentului (numar real)- aproximare prin lipsa
double floor(double x);
fmod
returneaz restul mpririi primului argument la cel de al doilea
double fmod(double x, double y);

32

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Problema 1. S se scrie un program C care s calculeze, s memoreze i s afieze, pentru


valori preluate de la consola, valorile funciei f definita astfel:

1
3x , x 0

f (x) 1 , x 0
x 12,5 , x 0

Problema 2. S se scrie un program C pentru rezolvarea ecuaiei de gradul 1(discuie


completa).
Problema 3. S se scrie un program C care :
- definete constant simbolica PI = 3.141;
- calculeaz i afieaz sinPI, cosPI, tgPI;
- se poate calcula tg(PI/2) ?
- calculeaz i afieaz sin de 45 de grade ;
- calculeaz i afieaz arcsin(sin(3*PI/2)).
Problema 4. S se scrie un program C care citete un ntreg din intervalul [1600,4900] ce
reprezint un an calendaristic i afieaz numrul de zile din anul respectiv.
Problema 5. S se scrie un program C care:
- preia de la consola i afieaz doua numere reale x,y, 2 caractere k1,k2 i 3 valori
ntregi m,n,p. Preluarea i afiarea datelor vor fi nsoite de mesaje adecvate;
- calculeaz, memoreaz i afieaz media aritmetica dintre m i n;
- calculeaz i afieaz cea mai mare valoare dintre m, n i p;
- calculeaz memoreaz i afieaz valorile incrementate cu o unitate ale lui m i x;
- calculeaz, memoreaz i afieaz expresiile :
e1=e la puterea x + |x| la puterea y;
e2=n/n+1;
e3=10 la puterea m;
e4=ln x;
- calculeaz i afieaz valoarea polinomului :
p= 3x^3 + 5x^2 -1
unde simbolul ^ reprezint ridicarea la putere;
- afieaz un mesaj din care s rezulte dac reprezentarea n cod ASCII a lui k1
precede n tabelul de coduri ASCII pe cea a lui k2.
Problema 6. s se scrie un program C pentru rezolvarea ecuaiei de gradul 2 (discuie
completa).
33

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

LABORATORUL 5
INSTRUCIUNILE CICLICE while I do - while

Raionamentul uman de tip iterativ i gsete corespondentul n limbajul C n


instruciunile ciclice (repetitive). Acestea permit execuia repetat a unei instruciuni, sau a
unei secvene de instruciuni nglobate ntr-o instruciune compus. Instruciunea sau secvena
de instruciuni ce se execut n mod repetat formeaz corpul ciclului.
n principiu, orice aciune repetitiv trebuie s se ncheie dup un numr finit de pai
(reluri/repetri), ca urmare a ndeplinirii unei condiii ce constituie aa-numita relaie de
condiionare a ciclului.
ntreaga construcie este considerat din punct de vedere sintactic ca o singur
instruciune i se poate utiliza n orice context n care este permis prezena unei instruciuni
n C.
n limbajul C exist trei tipuri de instruciuni ciclice :
- instruciunea while - ce implementeaz ciclul cu test iniial;
- instruciunea do - while - ce implementeaz ciclul cu test final;
- instruciunea for ce implementeaz ciclul cu contor.
7.5.1. Instruciunea while

Instruciunea implementeaz structura de ciclu cu test inial (condiionat anterior) din


programarea structurat i are sintaxa :
while (expresie)
instruciune;

unde expresie este orice expresie valid n limbajul C i implementeaz relaia de


condiionare a ciclului i instruciune este o singur instruciune C . Aceast cerin nu
reprezint o restricie major deoarece, n cazul n care corpul ciclului ar trebui descris prin
mai multe instruciuni, acestea se pot grupa ntr-o singur instruciune, construind o
instruciune compus.
Efectul execuiei acestei instruciuni este urmtorul : se evalueaz expresia expresie.
Atta timp ct valoarea acestei expresii este nenul se execut n mod repetat instruciunea
instruciune. Execuia ciclului se ncheie n momentul n care expresia are valoarea zero,
situaie n care se continu cu execuia instruciunii imediat urmtoare instruciunii while.
Observaii :
- corpul ciclului poate s nu se execute niciodat dac expresia are valoarea zero chiar
la intrarea n ciclu;
34

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

- evident contextul n care se execut instruciunea ce constituie corpul ciclului trebuie


s acioneze asupra expresiei, modificnd-o astfel nct, la un moment dat, aceasta s devin
nul, asigurnd astfel finitudine numrului de execuii ale corpului ciclului;
- instruciunea care constituie corpul ciclului poate s defineasc un alt mod de
execuie a instruciunii while dect cel indicat mai sus. Astfel ea poate realiza ncheierea
instruciunii while fr a se evalua expresia ce constituie relaia de condiionare, prin
intermediul unei aa numite ieiri forate din ciclu (de exemplu corpul ciclului poate conine
un apel al funciei exit).
Instruciunea do - while
Instruciunea implementeaz structura de ciclu cu test final (condiionat posterior) din
programarea structurat i are sintaxa :
do
instruciune;
while (expresie);

unde expresie este orice expresie valid n limbajul C i implementeaz relaia de


condiionare a ciclului, iar instruciune este o singur instruciune C (n cazul n care corpul
ciclului ar trebui descris prin mai multe instruciuni, acestea se grupeaz ntr-o instruciune
compus).
Efectul execuiei acestei instruciuni este urmtorul :
- 1- se execut instruciune (corpul ciclului).;
- 2- se evalueaz expresia expresie. n cazul n care expresia este nenul se
revine la pasul 1, n caz contrar execuia se ncheie, situaie n care se continu cu execuia
instruciunii imediat urmtoare instruciunii do - while.
Observaii :
- corpul ciclului se execut cel puin o dat, spre deosebire de cazul ciclului while;
- evident contextul n care se execut instruciunea ce constituie corpul ciclului trebuie
s acioneze asupra expresiei, modificnd-o astfel nct, la un moment dat, aceasta s devin
nul, asigurnd astfel finitudine numrului de execuii ale corpului ciclului;
- instruciunea care constituie corpul ciclului poate s defineasc un alt mod de
execuie a instruciunii do - while dect cel indicat mai sus. Astfel ea poate realiza ncheierea
instruciunii do - while fr a se evalua expresia ce constituie relaia de condiionare, prin
intermediul unei aa numite ieiri forate din ciclu (de exemplu corpul ciclului poate conine
un apel al funciei exit).
Avnd n vedere diferenele menionate n privina momentului evalurii condiiei,
nainte pentru while i respectiv dup execuia corpului ciclului, pentru do-while, pentru
35

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

aplicaiile n care corpul ciclului se execut cel puin odat, ciclul do-while se poate folosi cu
acelai corp n locul ciclului while i reciproc. Astfel se poate scrie generic :

do
instruciune;
while (expresie);

36

while (expresie)
instruciune;

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 5

Problema 1. S se calculeze, pentru o valoare n preluata de la consola, suma i produsul


primelor n numere naturale :
a. folosind instruciunea WHILE ;
b. folosind instruciunea DO WHILE.
Se va urmri pas cu pas evoluia variabilelor de interes (folosind fereastr Watch i comanda
de execuie pas cu pas a unui program).
Problema 2. Pentru un numar ntreg n preluat de la consola s se calculeze suma cifrelor sale.
Programul interogheaz repetat operatorul asupra continurii execuiei, aceasta ncheindu-se
atunci cnd la ntrebarea "Doriti s continuati ?" operatorul rspunde tastnd n sau N.
Problema 3. tiind ca dezvoltarea n serie pentru cos(x) este
cos(x)=1 - x*x/2! + x*x*x*x/4! - x*x*x*x*x*x/6! + ..... ,
sa se calculeze valoarea aproximativa pentru cos(x), pentru un x preluat de la consola, eroarea
de calcul fiind inferioara unui epsilon preluat de la consola .
INDICAIE: eroarea este inferioara lui epsilon cnd modulul termenului ce urmeaz a fi
adugat n suma este inferior lui epsilon. Se va afia pentru control i valoarea calculata cu
funcia de biblioteca cos.
Problema 4.
tiind ca dezvoltarea n serie ce poate aproxima numrul PI este:
PI=4*(1-1/3+1/5-1/7+..........),
sa se calculeze valoarea aproximativa a lui PI, cu o eroare mai mica dect un epsilon preluat
de la consola.
INDICAIE: eroarea este inferioara lui epsilon cnd modulul termenului ce urmeaz a fi
adugat n suma este inferior lui epsilon. Se vor folosi pentru epsilon valori de ordinul 1e-2,
1e-3, 1e-4.
Se va compara rezultatul obinut cu valoarea exact a lui PI=3.14159265358979 (constanta
simbolic M_PI din fiierul math.h).

Problema 5. S se scrie un program care, prelund un numr ntreg (<=10) de la consola,


afieaz transcrierea s n notaie romana (gndii o soluie care s poat fi uor generalizabila
pentru orice n).
37

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

LABORATORUL 6
INSTRUCIUNEA for

Instruciunea implementeaz o structura de ciclu cu test inial mai complex,


asemntoare structurii de ciclu cu contor din programarea structurat i are sintaxa :
for (expresie_1;expresie_2;expresie_3)
instruciune

unde expresie_1, expresie_2, expresie_3 reprezint expresii valide n limbajul C i


instruciune reprezint o singur instruciune C (n cazul n care corpul ciclului ar trebui
descris prin mai multe instruciuni, acestea se grupeaz ntr-o instruciune compus).
expresie_1 se numete expresie de iniializare a ciclului;
expresie_2 implementeaz relaia de condiionare a ciclului;
expresie_3 implementeaz partea de reiniializare a ciclului, sau de actualizare a
indexului.
Efectul execuiei acestei instruciuni este urmtorul :
- 1- se evalueaz expresie_1;
- 2- se evalueaz expresie_2. n cazul n care expresia expresie_2 este nenul
se continu execuia ciclului cu pasul 3, n caz contrar execuia se ncheie, situaie n care se
continu cu execuia instruciunii imediat urmtoare instruciunii for;
- 3- se execut instruciune (corpul ciclului);
- 4- se evalueaz expresie_3 i se continu execuia ciclului cu pasul 2.
Observaii :
- corpul ciclului poate s nu se execute niciodat dac expresia expresie_2 are valoarea
zero chiar la intrarea n ciclu;
- evident contextul n care se execut instruciunea ce constituie corpul ciclului trebuie
s acioneze asupra expresiei expresie_2, modificnd-o astfel nct, la un moment dat, aceasta
s devin nul, asigurnd astfel finitudine numrului de execuii ale corpului ciclului;
- instruciunea care constituie corpul ciclului poate s defineasc un alt mod de
execuie a instruciunii for dect cel indicat mai sus. Astfel ea poate realiza ncheierea
instruciunii for fr a se evalua expresia ce constituie relaia de condiionare, prin intermediul
unei aa numite ieiri forate din ciclu (de exemplu corpul ciclului poate conine un apel al
funciei exit).
Ciclurile while i for sunt echivalente, cu excepia situaiilor n care corpul ciclurilor
conine instruciunea continue.
38

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

Astfel instruciunea for poate fi scris folosind secvena :


for (expresie_1;expresie_2;expresie_3)
instruciune

expresie_1 ;
while (expresie_2)
{
instruciune
expresie_3 ;
}
i reciproc, orice instruciune while poate fi scris folosind instruciunea for :

while (expresie)
instruciune

for (; expresie ; )
instruciune

respectiv :
while (1)

instruciune

for (; ;)
instruciune

Evident n acest ultim caz, instruciune trebuie s prevad o modalitate de ieire forat
din ciclu.
n general se recomand utilizarea instruciunii for n ciclurile n care sunt prezente i
prile de iniializare i reiniializare ale ciclului, numite cicluri cu contor.

39

Programarea n limbajul C - ndrumar de laborator


______________________________________________________________________________________________________________________________________________________

TEMA 6

Problema 1. S se calculeze, pentru o valoare n preluata de la consola, suma i produsul primelor n


numere naturale folosind instruciunea FOR.
Se va urmri pas cu pas evoluia variabilelor de interes (folosind fereastr Watch i comanda de
execuie pas cu pas a unui program).
Problema 2. Pentru un a real i un p ntreg preluate de la consola s se calculeze a la puterea p prin
nmuliri repetate.
Urmrii pas cu pas evoluia contorului i a variabilelor de interes.
Pentru a=10 se vor pune n evidenta limitele domeniilor float, double i long double.
Problema 3. Se preia de la consola numrul termenilor ce urmeaz a fi prelucrai. Se cere s se
scrie un program care s calculeze suma termenilor i media aritmetica a termenilor pozitivi
(termenii NU se pstreaz n memorie, ci doar se prelucreaz).
Problema 4. S se scrie un program C care s afieze toate cele 256 caractere ale codului ASCII
extins: pe cte o linie nr. de ordine n tabelul ASCII i caracterul aferent. Afiarea trebuie s se
opreasc astfel nct s permit citirea tabelului ecran cu ecran, invitnd operatorul s acioneze
o tasta pentru a continua. Se va tine cont ca pe ecran se pot afia 25 de linii.
Problema 5. S se calculeze suma primelor k numere impare, unde k este un ntreg pozitiv ce se
preia de la consola.
Problema 6. Pentru toate perechile distincte de numere ntregi, inferioare unui n preluat de la
consola, s se afieze cmmdc al acestora.
Problema 7. S se scrie un program care s determine dac un ntreg pozitiv preluat de la consola
este prim sau nu.

40

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