Mulțumim anticipat tuturor acelora care vor transmite critici/observații/sugestii ilincamircea@yahoo.com postat 16.11.2016 TEMA III.3 v1: EXPRESII ÎN C/C++ (sinteză) Relațiile de calcul dintr-un algoritm se codifică în C/C++ sub forma expresiilor. O expresie este alcătuită din operanzi între care trebuie să existe operatori. În funcție de tipul operatorilor se pot identifica următoarele tipuri de expresii: - expresii aritmetice; - expresii relaționale; - expresii logice; - expresii interpretate între biți; - forme particulare de alcătuire a expresiilor; - operatorii (cast) și sizeof(). Operațiile se pot efectua numai între operanzi/constante care au același tip de reprezentare sau, altfel spus, sunt de același tip. Atunci când o operație nu se poate efectua datorită tipului diferit al operanzilor, se realizează conversia valorii unuia dintre cei doi operanzi. Rezultatul operației păstrează tipul comun al operanzilor. IMPORTANT. Conversia tipului se realizează numai la nivelul ALU și nu poate modifica tipul declarat pentru respectiva variabilă. Evaluarea corectă a expresiilor este posibilă numai dacă operanzii sunt anterior cunoscuți. Obs1. Folosirea ca operand a unei variabile neinițializate determină o evaluare incorectă a expresiei dar fără ca eroarea să fie semnalizată de către SC. Evaluarea este posibilă deoarece SC interpretează conținutul locației din MO care a fost atribuită respectivei variabile în conformitate cu tipul acesteia. Obs.2. În expresii se pot folosi parantezele. Sunt admise numai parantezele rotunde: ( și ). Condiția este ca între paranteze și alți operanzi să existe întotdeauna și un operator. Ex. O expresie de forma: int x=10,y=-20,c; c = y(x+25); este considerată ca o eroare de sintaxă întrucât între y și () nu există un operator. O posibilă formă corectă este: c = y*(x+25); Obs.3. C/C++ tratează operanzii de tip char (codurile ASCII) ca reprezentând valori întregi. De aceea operanzii de tip char pot fi incluși în toate tipurile de expresii. Atenție. În exemplele următoare, pentru operanzi se va folosi formatul extern al reprezentării interne adică forma în baza 16 sau hexazecimală. Se reamintește că un octet/byte/8 biți se reprezintă prin intermediul a două cifre hexazecimale. În C/C++ o constată în baza 16 se reprezintă printr-o structură sintactică de forma: 0xc1c...ci..., unde c1..ci sunt cifre în baza 16: 0,...,9,A,B,C,D,E,F. III.3.1. EXPRESII ARITMETICE Operatorii aritmetici definiți în C/C++ corespund operațiilor aritmetice: + ; - ; * ; / și % (restul împărțirii între doi operanzi de tip char sau int). Folosirea unui operand de tip float împreună cu operatorul % este tratată ca eroare de sintaxă. Operanzii aritmetici pot fi: variabile de orice tip, constante și funcții (cel mai des întâlnite sunt funcțiile aritmetice predefinite din biblioteca math, care este prezentată în fișierul math.h).
Evaluarea expresiilor aritmetice Evaluarea corectă a unei expresii aritmetice se face succesiv, operație cu operație,de la stânga spre dreapta și respectând prioritățile aritmetice. Dacă expresia conține paranteze atunci subexpresia din paranteză se evaluează separat. Evident,dacă un operand este o funcție matematică atunci se determină întâi valoarea acesteia și apoi se efectuează respectiva operație. Principiile evaluării expresiilor aritmetice a) Conversia tipului unei constante În C/C++ constantele care se atribuie ca valori pentru variabile sunt reprezentate sub diferite forme, toate folosind cifrele bazei doi: 0 și 1. Acestea se deosebesc prin: numărul diferit de cifre/biți pe care îl conțin sau prin semnificațiile diferite ale acestora. Structura tip folosită pentru memorarea valorii atribuite unei variabile se fixează la declararea variabilei și nu se poate modifica în timpul interpretării programului. În același timp operațiile aritmetice se pot efectua numai între operanzi/constante care au aceeași structură. Ex 1. Fie secvența de instrucțiuni: 1) int a=231; 2) int a=231,c; short int b=675,c; short int b=675; c=a+b; c=a+b; Expresia care trebuie calculată este: a+b. Structura sintactică c=a+b reprezintă o instrucțiune de calcul. Reprezentările interne ale operanzilor sunt: - (231) 10 = 0x00 00 00 E7 reprezentare pe 4 octeți întrucât a este de tipul int; - (675) 10 = 0x02 A3 - reprezentare pe 2 octeți întrucât b este de tipul short int. Pentru efectuarea operației de adunare operanzii trebuie să aibă aceeași dimensiune, respectiv 4o. SC are posibilitatea de a efectua implicit/automat modificarea tipului/reprezentării unei constante. În cazul nostru constanta 675 de tipul short int este transformată în tipul int. Deci: 0x02A3 0x00 00 02 A3 Operația de adunare devine: 0x00 00 00 E7 + 0x00 00 02 A3 = 0x00 00 03 8A = (00 00 09 06 ) 10 Rezultatul păstrează tipul comun al operanzilor. În momentul memorării, rezultatul trebuie să aibă tipul declarat pentru varianta care se află în stânga semnului egal. În acest caz variabila c este de tipul short int pentru varianta 1 respectiv int pentru varianta 2. Deci, în MO se va înscrie constanta: 1) 0x09 06 - tipul short int ; 2) 0x00 00 09 06 - tipul int Modificarea tipului, atunci când operanzii respectă aceeași structură dar au număr de diferit de biți respectă regula: char short int int long int long long int Fig 1 Dacă operanzii sunt de tip unsigned int și int rezultatul operației este de tip int sau unsigned int atunci când valoarea calculată depășește domeniul de reprezentativitate pentru tipul int. Afișarea se realizează în conformitate cu specificatorul de format. Pentru operanzii de tip int/char și float regula conversiei implicite este: char int float double long double Fig.2
Nerespectarea regulii identității tipului celor doi operanzi poate duce la memorarea unor rezultate eronate și deci compromiterea programului. Ex.2 Fie secvența de instrucțiuni: 1) int a=7; 2) int a=7; float c; float c; c=a/3+10.5; c=a/3.+10.5 printf( \n c=%f,c); printf( \n c=%f,c); Să se determine valorile variabilei c și să se explice rezultatul. Programatorul are posibilitatea să impună într-o expresie modificarea tipului unui operand. (vezi pct.iii.3.6). Aceasta nu înseamnă însă cu programatorul poate modifica tipul declarat al unei variabile. b) Operanzi de tip char Ex.3 Fie secvența de instrucțiuni: char a=')'; int b; printf("\n COD ASCII a=%d a=%c",a,a); b=1000+a; printf("\n b=%c b=%d",b,b); a=b; printf("\n COD ASCII a=%d a=%c",a,a); Din fig. 3 se observă că este posibilă evaluarea expresiei b=1000 +a deși unul dintre operanzi este de tipul char. Să se explice semnificațiile tuturor valorilor afișate. Fig. 3 Folosirea expresiilor aritmetice Cel mai adesea expresiile aritmetice se folosesc în alcătuirea: - unei instrucțiuni de calul; - într-o listă de ieșire; - ca operand într-o expresie relațională. Instrucțiunea de calcul Structura tip a unei instrucțiuni de calcul este: {identificator}= expresie aritmetică; Interpretarea unei instrucțiuni de calcul constă în: - evaluarea expresiei aritmetice; - conversia valorii rezultatului la tipul declarant pentru variabila din stânga semnului egal respective la tipul variabilei a cărei valoare se calculează; - memorarea constantei astfel obținute în locația atribuită variabilei calculate. Lista de ieșire (vezi și Ex.4.) Deși nu se recomandă, în lista de ieșire poate figura o expresie aritmetică. Rezultatul se afișează conform tipul specificatorului de format folosit. De aceea pot exista situații în care afișarea rezultatului să fie incorectă.
Ex.4. Fie secvența de instrucțiuni: 1) int b=10; 2) int b=10; printf("\n s=%d",b+5); printf("\n s=%f",b+5); 3) int b=10; 4) int b=10; printf("\n s=%d",b+5.2); printf("\n s=%f",b+5.2); Să se include aceste instrucțiuni într-un program de calcul și să se explice modul de afișare a valorii expresiei aritmetice. III.3.2. EXPRESII RELAȚIONALE Operatorii relaționali definiți în C/C++ sunt: > ; >= ; = = [egalitate] ;!= [diferit] ; <= ; < Operanzii unei expresii relaționale sunt: constante, variabile sau expresii aritmetice. Obs.1 Operandul unei expresii aritmetice poate fi o constantă întreagă sau reală dar și o variabilă caracter. Expresiile relaționale se folosesc în instrucțiunile de ramificare/decizie. (vezi TEMA III.4). Evaluarea expresiilor relaționale În C/C++ nu este definit tipul de date logic sau boolean. Valorile logice sunt reprezentate prin constantele numerice 1 pentru valoarea logică ADEVĂRAT/TRUE și respectiv 0 pentru valoarea logică FALS/FALSE. Evaluarea concretă/fizică a unei expresii relaționale După cum s-a precizat în [1] într-un SC toate operațiile se execută în blocul de calcul-alu, care constituie elementul central al μp. În general aprecierea modului în care a fost finalizată o operație se analizează următoarele informații: semnul rezultatului, egalitatea cu zero, transportul în rangul superior (depășirea domeniului de reprezentativitate) ș.a.. Pentru aceasta ALU este conectat cu un registrul indicatorilor de condiții, care are 8 sau 16 biți, primii doi biți S și Z fiind cei mai utilizați. Semnificația lor este: 0, rezultatul operației efectuate în ALU este un număr pozitiv și respectiv S = { 1, rezultatul operației efectuate în ALU este un număr negativ 0 și S =, rezultatul operației efectuate în ALU este un număr nenul Z = { 1, rezultatul operației efectuate în ALU este zero Fie valorile lui x, y și expresia relațională: x=5 ; y =10 ; (x <= y). Pentru stabilirea valorii ADEVĂRAT sau FALS a expresiei relaționale (x<=y) se evaluează expresia (x-y). Apoi se analizează valorile S și Z poziționate/setate de valoarea rezultatului diferenței. Valoarea calculată (x-y) nu este transferată în MO. Pentru x=5 și y=10 rezultă x-y = 5-10= -5. Conform precizărilor anterioare S=1 iar Z este.în Tabelul 1 este prezentată legătura între operatorii relaționali și indicatorii S și Z. Expresia relațională x<y Tabelul 1 Valoarea logică Valoarea Valorile S și Z a expresiei calculată relaționale e=x-y<0 S=1 și Z= ADEVĂRAT e=x-y 0 S=0 și Z= sau S= și Z=1 FALS
x<=y x==y x!=y (x y) x>=y x>y e=x-y 0 S=1 și Z= sau S= și Z=1 ADEVĂRAT e=x-y>0 S=0 și Z= FALS e=x-y=0 S= și Z=1 ADEVĂRAT e=x-y 0 S= și Z=0 FALS e=x-y 0 S= și Z=0 ADEVĂRAT e=x-y=0 S= și Z=1 FALS e=x-y 0 S=0 și Z=ϕ sau S= și Z=1 ADEVĂRAT e=x-y<0 S=1 și Z=ϕ FALS e=x-y>0 S=0 și Z= ADEVĂRAT e=x-y 0 S=1 și Z= sau S= și Z=1 FALS Ex.4. Secvența următoare de instrucțiuni este corectă din punct de vedere al limbajului C/C++, deși nu poate fi atribuit un sens practic unei comparații dintre o literă ( x ) și o cifră ( 9 ). Comparația se realizează între codurile ASCII. char a= x ;b= 9 ; int c; c= a>=b; Ex.5. Fie secvența de instrucțiuni: 1) int a=3,c; 2) int a =6,c; 3) int a =6,c; 4) int a=6; float b=6.2; c=a= = 6; c=a=6; float c; c=a<=b, c=a!=7; Să se determine valorile variabilei c și se explice rezultatul. III.3.3. EXPRESII LOGICE Operatorii logici definiți în C/C++ sunt: -! NEGAREA LOGICĂ ; - && - ȘI sau PRODUSUL LOGIC sau INTERSECȚIA LOGICĂ ; - - SAU sau SUMA LOGICĂ sau REUNIUNEA LOGICĂ. Operatorii logici sau funcțiile logice sunt definite sub formă de tabel de adevăr. În Tabelul 2 sunt prezentate funcțiile logice de: negare, produs, sumă și sau exclusiv (modulo doi). Tabelul de adevăr al funcțiilor logice Tabelul 2 Variabile Funcția! x = x Funcția! y = y Funcția x&&y = x y Funcția x y = x y Funcția x y = xy x y independente X Y F/0 F/0 A/1 A/1 F/0 F/0 F/0 F/0 A/1 A/1 F/0 F/0 A/1 A/1 A/1 F/0 F/0 A/1 F/0 A/1 A/1 A/1 A/1 F/0 F/0 A/1 A/1 F/0 unde: - A / 1 - ADEVĂRAT; - F / 0 - FALS
Prioritățile operatorilor logici, în ordine descrescătoare, sunt: -! - negarea logică care este un operator unar deci se aplică unui singur operand; - && - ȘI sau PRODUSUL LOGIC; - - SAU sau SUMA LOGICĂ. Operanzii unei expresii logice sunt expresii relaționale sau logice. Evaluarea expresiilor logice Expresiile logice se evaluează de la stânga la dreapta cu respectarea regulilor de prioritate. Dacă un operand este o subexpresie,adică o expresie logică între paranteze, atunci aceasta se evaluează la început. Valoarea unei expresii logice se codifică la fel cu aceea a expresiilor relaționale: - 1 pentru valoarea logică ADEVĂRAT respectiv - 0 pentru valoarea logică FALS. Evaluarea concretă/fizică a expresiilor logice se realizează, ca și în cazul expresiilor relaționale, prin intermediul indicatorilor de condiții S și Z. Expresiile logice permit verificarea simultană a mai multor condiții. În instrucțiunile de decizie expresiile logice pot fi descompuse în expresii relaționale. Expresiile logice se folosesc în instrucțiunile de ramificare/decizie.(vezi TEMA III.4) Ex.6. Fie secvența de instrucțiuni: 1) int a=3,b; 2) int a=10; 3) int a=10; b= (a<= -1)&&(a>=1) float b; float b; b=!(a= =10); b=!(a=10); Să se determine valorile atribuite variabilei b. III.3.4. EXPRESII PE BIT Pentru tipurile de expresii prezentate (pct.iii.3.1-iii.3.3) operanzii se consideră prin interpretarea întregii locații atribuie respectivei variabile. Dar, pentru variabilele de tip int/char în C/C++ sunt definite și operații logice între cifrele/biții locațiilor din MO ale operanzilor. Aceste operații se numesc operații pe bit și se efectuează între toate cifrele binare ale operandului. Valoarea rezultatului se interpretează în funcție de tipul declarat pentru respectiva variabilă, cu considerarea tuturor biților, adică a întregii locații. Obs. În C/C++ sunt definite la nivel de bit numai operațiile logice. Operatorii logici pe bit sunt: - ~ negarea logică; - << ; >> deplasarea biților la stânga sau la dreapta. Deplasarea conținutului unei locații cu n poziții spre stânga/dreapta constă în înlocuirea conținutului primilor/ultimilor n biți. Prin deplasare conținutul celor n biți este pierdut. Altfel spus, deplasarea la stânga echivalează cu înmulțirea operandului cu 2 n iar deplasarea la dreapta echivalează cu împărțirea cu 2 n a acestuia. Deoarece prin înmulțirea cu 2 n se poate depăși domeniul de reprezentativitate, pentru verificarea rezultatului este necesar să se considere numai informația care poate fi înscrisă în locația din MO. ; - ^ - SAU EXCLUSIV sau SUMA MODULO DOI; - & - ȘI sau PRODUSUL LOGIC sau INTERSECȚIA LOGICĂ; - - SAU sau SUMA LOGICĂ sau REUNIUNEA LOGICĂ.. Operatorii logici sau funcțiile logice sunt definite în Tabelul 2. Prioritățile operatorilor logici, în ordine descrescătoare sunt: -! - negarea logică care este un operator unar și se aplică unui singur operand; - << ; >> - deplasarea conținutului locației MO; - && - ȘI sau PRODUSUL LOGIC; - - SAU sau SUMA LOGICĂ.
Operanzii unei expresii logice pe bit sunt biții/cifrele binare înscriși în locațiile din MO în care sunt memorate variabile de tip int sau char. Aplicarea operatorilor logici pentru variabile de tip real/float nu se efectuează iar în locația din MO se înscrie valoarea 0.000000, fără a se semnaliza această eroare. Evaluarea expresiilor logice pe bit Operațiile logice executate asupra ansamblului conținutului unei locații din MO implică interpretarea simultană a întregului conținut al locației. Rezultatul evaluării poate fi înscris într-o locație de tip int și poate fi: 1 pentru ADEVĂRAT respectiv 0 pentru FALS. În cazul operațiilor executate pe bit rezultatul poate fi 1/ADEVĂRAT și 0/FALS pentru fiecare bit calculat. Aceasta determină posibilitatea determinări valorii înscrise prin interpretarea ansamblului biților locației. Evident valorile biților sunt acelea determinate ca rezultat al operației logice pentru fiecare bit. În cele ce urmează se exemplifică modul de realizare al tuturor operațiilor pe bit. Operații asupra unui singur operand/operații unare Ex.7. a) Operația de deplasare Folosind exemplul prezentat să se indice și pentru secvențele de instrucțiuni 2) - 6) conținutul locațiilor din MO înainte și după executarea instrucțiunilor indicate. Să se verifice rezultatele folosind un program C. 1) short int x=1739,y; 2) short int x= -1739,y; y=x<<6; y=x>>6; printf( \n y=%d,y); printf( \n y=%d,y); 1) Forma externă a reprezentării interne a numărului 1546 este 0x06CB (în baza 16). Forma internă (în baza 2) este prezentată în fig.4.a. În fig 4.b este reprezentat conținutul locației MO după aplicarea deplasării la stânga cu 6 poziții binare. Valoarea înscrisă în aceeași locație a MO este numărul întreg negative -1639. a 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0x06CB b 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0xB2C0 Fig.4 3) short int x=1739; 4) short int x= 1739; short int y= -1739; short int y= -1739,z; y= ~ x; z= x & y; printf( \n y=%d,y); printf( \n y=%d,y); 5) short int x= 1739; 6) short int x= 1739 short int y= -1739,z; short int y= -1739,z z=x y; z=x ^ y; printf( \n y=%d,y); printf( \n y=%d,y); III.3.5. ALTE FORME ALE EXPRESIILOR C/C++ permite și alte forme, mai puțin folosite, pentru alcătuirea expresiilor. Expresia de incrementare Operatorul de incrementare ++ se aplică numai variabilelor de tip int / char și poate fi poziționat ca prefix al variabilei a cărei valoare urmează a se incrementa sau ca sufix al acesteia. Diferența constă în momentul incrementării valorii respectivei variabile. Ex.8. Folosind exemplul 8.1 să se precizeze efectul interpretării instrucțiunilor 2) și să se realizeze programe C cu care să se verifice rezultatele.
1) short int i=8,j; 2) short int i=8,j; j=++i; j=i++; printf( \n i=%d j=%d,i,j); printf( \n i=%d j=%d,i,j); Pentru ex. 8.1 succesiunea de prelucrări este: - i i+1 = 8+1= 9 - se incrementează valoarea variabilei i; - j 9 se înscrie în locația j valoarea determinată pentru expresia din stânga semnului egal; - se execută instrucțiunea de afișare.(fig. 5) Fig. 5 Expresia de decrementare Operatorul de decrementare - se aplică numai variabilelor de tip int / char și poate fi poziționat ca prefix al variabilei a cărei valoare se decrementează sau ca sufix al acesteia. Diferența constă în momentul decrementării valorii respectivei variabile. Ex.9. Fie secvențele de instrucțiuni 1) și 2). Folosind ex. 8.1 să se precizeze efectul interpretării instrucțiunilor 1) și 2) și să se realizeze programele C prin care se verifică rezultatele. 1) short int i=8,j; 2) short int i=8,j; j= -- i; j=i -- ; printf( \n i=%d j=%d,i,j); printf( \n i=%d j=%d,i,j); Expresia condițională Expresia condițională este de forma: exp1? exp2:exp3; (1) Operatorul condițional? : permite alegerea expresiei care se evaluează:n exp2 sau exp3 în funcție de valoarea ADEVĂRAT/FALS obținută prin evaluarea exp, care este o expresie relațională sau logică. Etapele evaluării expresiei condiționale 1 sunt următoarele: - se evaluează expresia exp1 ; - se evaluează exp2 dacă exp1 = ADEVĂRAT sau - se evaluează exp3 dacă exp1 = FALS. Ex.10. Pentru secvența de instrucțiuni de mai jos : int x=10; float y=15.; float z; z=x==y?x-y:x+y; printf( \n x=%d y=%f z=%f,x,y,z); Fig.6
a) Să se alcătuiască programul care verifică rezultatele prezentate în fig.6. b) Să se alcătuiască secvența de instrucțiuni care determină valoarea variabilei z astfel: z = x 2 dacă (x+y) >0 ȘI (x<=a) are valoarea ADEVRAT ; respectiv z= y 2 pentru valoarea FALS. Expresii compuse Expresia recursivă În matematică o ecuație de forma x=x+5 constituie o imposibilitate. Într-un algoritm/program o instrucțiune de calcul de forma x=x+5 este permisă și are ca efect: x x+5 ; C/C++ permite pentru o instrucțiune de calcul recursivă și o sintaxă de forma: x + = 5; Operatorul virgulă C/C++ permite și structuri sintactice de forma din Ex.11. Ex.11. Fie secvența de instrucțiuni de mai jos. Să se alcătuiască un program care include această secvenţă și să se verifice rezultatele cu valorile din fig.7. int a=7,b=10; int c,d; int x,y,z; d=( a++,--b, c=12,a+b+c); z=(x=a++,y=--b,x+y); printf("\n a=%d b=%d c=%d d=%d",a,b,c,d); printf("\n x=%d y=%d z=%d",x,y,z); Fig.7 III.3.6. ALȚI OPERATORI Operatorul (cast) După cum s-a menționat (pct. III.4.1) evaluarea unei expresii necesită aducerea operanzilor la aceeași structură a reprezentării interne, atât ca număr de biți (2o ; 4o ; 8o; 10o) cât și ca mod de codificare (număr întreg reprezentat în baza 2 sau număr real reprezentat sub formă exponențială echivalentă). La pct. III.4.1 s-au exemplificat modalitățile de schimbare implicită/automată a tipului operanzilor. C/C++ permite însă modificarea tipului unui operand prin intermediul operatorului (cast) : (int) ; (char) ; (float)... Folosirea operatorului cast() nu modifică tipul variabilei pe care o prefixează. Efectul operatorului (cast) este modificarea tipul reprezentării interne a operandului la nivelul ALU și nu al MO. ATENȚIE. Operatorul (cast) nu este o funcție, deci o sintaxă de forma cast() este o eroare de sintaxă.. Ex.12. Pentru secvența de mai jos să se precizeze valorile calculate. Să se explice rezultatele. Să se alcătuiască un program C care include aceste instrucțiuni. int a=10,b,c;
float c=3,d; b=a/c; c=(float)a/3; d=a/4; e=a/4; f=(float)a/4; Operatorul sizeof() Operatorul sizeof() se folosește pentru a introduce într-un program dimensiunea locației atribuite unei variabile. Acest operator este folosit în special pentru variabilele de tip utilizator: struct sau arie de date. O instrucțiune care utilizează operatorul sizeof() are sintaxa: b=sizeof(a); Ex.13. Fie secvența de instrucțiuni: short int a; int a1; long int a2;long long int a3; float b;double b1;long double b2; int c,c1,c2,c3; // DECLARAREA VARIABILELOR d,d1,d2 c=sizeof(a);c1=sizeof(a1);c2=sizeof(a2);c3=sizeof(a3); d=sizeof(b);d1=sizeof(b2);d2=sizeof(b2); a)să se alcătuiască un program care afișează valorile variabilelor c,c1,...d2. b) Să se comenteze rezultatele. III.3.7 EXRCIȚII PROPUSE 1.Să se verifice corectitudinea construcțiilor sintactice de mai jos. Să se alcătuiască un program C care include aceste expresii. Să se atribuie valori variabilelor folosite. 3 4 ;!a;!&v; 3.4%d; 12/34 ; 34%7; 2. Pentru x=20.0; y=15 ; z=1.5 să se afle valorile expresiilor: y/z ; y*z ; x-y/z ; x-x/2 Să se alcătuiască un program C și să se verifice rezultatele. 3.Se consideră expresiile: (a<b) c ; ((a<b)&&c) (a>=b) ; ((a<b)&c) (a>=b); ((a<b)&&c) (a>=b); ((a<b)&c) (a>=b); c&&(d>b); (a>b)!(d<a) ; (a>b) ~(d<a) ; (a==b)&&c Să se atribuie valori adecvate variabilelor a,b,c și d și să se determine valorile expresiilor. Să se alcătuiască un program C și să se verifice rezultatele. 4. Să se verifice și să se efectueze toate exercițiile prezentate în textul referatului: Ex1.-Ex.13. III.3.8. REFERINȚE BIBLIOGRAFICE 1. *** http://infopuc.ro/resurse/cursuri_ppt/l2_reprezentarea_inf_sc_suport_ teoretic_v2.pdf 2. *** http://infopuc.ro/resurse/cursuri_ppt/l4_tipuri_de_date_predefinite_suport_ teoretic_v1.pdf 3. *** http://imag.pub.ro/~bionescu/index_files/pc_bionescu_m4.pdf 4. *** http://andrei.clubcisco.ro/cursuri/1pc/co/curs02.pdf (pg 23-30) 5. Cerchez E; Șerban M.. http://cnvranceanu.ro/blog/wpcontent/uploads/2014/11/cerchez-verde-m.pdf (pg.31-40)