Documente Academic
Documente Profesional
Documente Cultură
______________________________________________________________________________________________________________________________________________________
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)
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 :
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
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 :
CODUL 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"
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.
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
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
#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
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
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
- 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
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
*/
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
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
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
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
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
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)
22
Operatorul condiional
Acest operator ternar permite construirea unei expresii a crei valoare depinde de
valoarea unei condiii i el este simbolizat prin caracterele :
?:
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
TEMA 3
| 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
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
#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
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
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
LABORATORUL 4
INSTRUCIUNEA if I INSTRUCIUNI EXPRESIE
n++;
s += y ;
}
else
{
n-- ;
s -= y ;
}
instruciune_1
30
else instruciune_2
31
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
1
3x , x 0
f (x) 1 , x 0
x 12,5 , x 0
LABORATORUL 5
INSTRUCIUNILE CICLICE while I do - while
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;
TEMA 5
LABORATORUL 6
INSTRUCIUNEA for
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
TEMA 6
40