0% au considerat acest document util (0 voturi)
5 vizualizări45 pagini

Programarea Calculatoarelor Cursul 2: Tipuri de Date Expresii Instrucțiuni de Decizie

Documentul prezintă conceptele fundamentale ale programării calculatoarelor, inclusiv tipurile de date, expresiile și instrucțiunile de decizie. Se discută despre sistemele de numerație, conversia între baze, reprezentarea numerelor întregi și a celor cu virgulă flotantă. De asemenea, sunt explicate metodele de conversie a numerelor zecimale în binar și viceversa, precum și reprezentarea caracterelor folosind codul ASCII.

Încărcat de

Sergiu Agoston
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
5 vizualizări45 pagini

Programarea Calculatoarelor Cursul 2: Tipuri de Date Expresii Instrucțiuni de Decizie

Documentul prezintă conceptele fundamentale ale programării calculatoarelor, inclusiv tipurile de date, expresiile și instrucțiunile de decizie. Se discută despre sistemele de numerație, conversia între baze, reprezentarea numerelor întregi și a celor cu virgulă flotantă. De asemenea, sunt explicate metodele de conversie a numerelor zecimale în binar și viceversa, precum și reprezentarea caracterelor folosind codul ASCII.

Încărcat de

Sergiu Agoston
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Programarea

Calculatoarelor
Cursul 2
Tipuri de date
Expresii
Instrucțiuni de decizie
Obiective

● Cum stochează calculatorul datele necesare


○ un număr întreg? o literă? un număr real? un text?
● Cum putem să facem calcule folosind formule?
● Cum scriem cod care se ramifică?

2
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Sisteme de numerație

● Calculatorul folosește circuite cu 2 stări pentru a stoca


datele - se utilizează baza 2 (binară)
● Oamenii folosesc baza 10 (zecimală)
● Un bit este o cifră binară (binary digit)
● Un byte (sau un octet) este format din 8 bits
Unitate Denumire Număr bytes [10x] Număr bytes [2x]

1 KB kilobyte 1024 ~ 103 210

1 MB megabyte 10242 ~ 106 220

1 GB gigabyte 10243 ~ 109 230

1 TB terabyte 10244 ~ 1012 240

1 PB petabyte 10245 ~ 1015 250

3
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Conversie baza 10 - baza 2

● Se face prin împărțire repetată cu 2


○ se scrie câtul dedesubt și restul în dreapta
○ cifrele în binar sunt resturile în ordine inversă
● Exemple, 157(10) = 10011101(2), 64(10) = 26 = 1000000(2)
157 1 64 0

78 0 32 0

39 1 16 0

19 1 8 0

9 1 4 0

4 0 2 0

2 0 1 1

1 1 0

4
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Conversie baza 2 - baza 10

● Cifrele în binar au pondere egală cu puteri crescătoare ale


lui 2, începând cu 20, de la cel mai nesemnificativ bit
● Exemple,
10011101(2) = 1*27+0*26+0*25+1*24+1*23+1*22+0*21+1*20 = 157(10)
putere 7 6 5 4 3 2 1 0

cifrele 1 0 0 1 1 1 0 1

1000000(2)= 1*26 = 64(10)


putere 6 5 4 3 2 1 0

cifrele 1 0 0 0 0 0 0

5
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Reprezentare numere întregi pozitive

● Numerele pozitive sunt reprezentate folosind


reprezentarea lor binară
● Biții sunt grupați în bytes
○ numărul de biți divizibil cu 8 - se completează cu 0-uri
○ se păstrează în memorie prima data byte-ul cel mai puțin
semnificativ (little-endian)
● Cu n biți putem reprezenta 2n valori posibile
○ cel mai mic număr: 0 are reprezentarea 00...0 (n biți de 0)
○ cel mai mare număr: 2n-1 are reprezentarea 11...1 (n biți de 1)
● Operațiile de aritmetice (adunare, scădere, înmulțire) în
baza 2 se efectuează analog ca în baza 10
○ se adaugă transport, respectiv se împrumută când trecem peste 2
nu peste 10

6
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Reprezentare numere întregi pozitive - exemplu

314 stocat ca short int = 16 biți = 2 bytes

314(10) = 100111010(2) = 0000 0001 0011 1010


byte 1 byte 0

În memorie se stochează în ordine byte 0, byte 1

0011 1010 0000 0001

7
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Baza octală și cea hexazecimală

● Metodele de conversie prezentate se pot aplica și pentru


conversii în alte baze
● Pentru baze de forma 2k există metode mai ușoare de
conversie din și în binar
● Deoarece reprezentarea binară este lungă este de multe
ori convenabil să schimbăm în baza octală (8) sau cea
hexazecimală (16)
○ câte 3 cifre binare corespund la o cifră octală
○ câte 4 cifre binare corespund la o cifră hexazecimală
○ un byte = 2 cifre hexazecimale
● Exemplu, 1001 1101(2) = 9D(16)= 10 011 101(2) = 235(8)

8
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Reprezentare caractere

● Fiecare caracter este


asociat cu un număr întreg
= Cod ASCII
● Ordinea caracterelor se
bazează pe acest cod
● Se pot efectua operații ca
pe numerele întregi
○ ‘a’-’A’ = 32
● 0-31 caractere speciale:
○ backspace 8
○ line nouă 10
○ escape 27

[Link]
9
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Numere întregi negative

● Pentru a reprezenta atât numerele negative cât și cele


pozitive un bit trebuie rezervat pentru semn
● Reprezentare cu bit de semn și magnitudine
○ primul bit arată semnul, restul biților formează numărul
○ NU se folosește
○ 0 are două reprezentări 00...0 și 10...0
○ se modifică regulile de adunare
● Reprezentare C2
○ cel mai semnificativ bit are pondere negativă egală cu -2n-1
○ se utilizează
○ 0 are o singură reprezentare
○ regulile de adunare rămân la fel
■ x + (-x) în această reprezentare rezultă în 0 (cu overflow)

10
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Numere întregi negative - Complement față de 2
● Reprezentare C2
○ Dacă se folosesc n biți
■ Numere pozitive de la
■ 000...0 = 0 până la 011...1 = 2n-1-1
■ Numere negative de la
■ 100...0 = -2n-1 până la 111...1 = -1
● Conversie rapidă număr negativ în
reprezentare C2
○ Se convertește valoarea în modul în binar
○ Se adaugă zerouri în față până la n biți
○ Se schimbă starea biților, 1 în 0 și 0 în 1
(complement față de 1)
○ Se adună 1 la rezultatul în binar
○ Exemplu, pe 4 biți
-6 = ~0110(2)+1(2) = 1001(2)+1(2) = 1010(2)
11
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Numere întregi negative - Complement față de 2

● Verificare pentru x = 6 pe 4 biți

6 = 0110
-6 = 1010
0 = 10000
● se iau în considerare doar ultimii 4 biți

● Pentru x general pe n biți


○ x + -x = x + (~x + 1) = (x + ~x) + 1 = 2n-1 + 1 = 2n = 1000...0

1 urmat de n biți de 0
○ se iau în considerare doar ultimii n biți atunci devine 0

12
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Reprezentare numere întregi negative - exemplu
-108,828 ca un int = 32 biți = 4 bytes

Convertim valoarea în modul în binar


108,828(10)= 1 1010 1001 0001 1100 (2) = 1A91C(16)

Completăm cu 0-uri până la 32 biți


0000 0000 0000 0001 1010 1001 0001 1100

Efectuăm complement față de 1


1111 1111 1111 1110 0101 0110 1110 0011

Adunăm 1 în binar
1111 1111 1111 1110 0101 0110 1110 0100

Reprezentarea în memorie (se începe de la byte-ul 0)


1110 0100 0101 0110 1111 1110 1111 1111
13
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Conversie baza 10 - baza 2 - numere subunitare

● Se face prin înmulțire repetată cu 2


○ se separă partea fracționară de cea întreagă
○ partea fracționară se copiază dedesubt
○ se repetă până când partea fracționară devine 0, sau până la
numărul de cifre disponibile
○ cifrele după virgulă sunt formate din părțile întregi obținute pe
parcurs, în ordinea originală
● Exemplu, 0.3125(10)= 0.0101(2)
○ 0.3125 x 2 = 0 + 0.625
○ 0.625 x 2 = 1 + 0.25
○ 0.25 x 2 = 0 + 0.5
○ 0.5 x2=1+0

14
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Conversie baza 2 - baza 10 - numere subunitare

● Cifrele în binar din dreapta virgulei zecimale au pondere


egală cu puteri descrescătoare ale lui 2, începând cu 2-1
● Exemple,
0.0101(2) = 0*2-1+1*2-2+0*2-3+1*2-4 = 1/4 + 1/16 = 0.3125(10)
putere -1 -2 -3 -4

cifrele 0 1 0 1

0.11111(2) = 1*2-1+1*2-2+1*2-3+1*2-4+1*2-5 = 1-2-5 = 0.96875(10)


putere -1 -2 -3 -4 -5

cifrele 1 1 1 1 1

15
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Consecințe

● Numerele zecimale generale se convertesc prin aplicarea


primei metode pe partea întreagă și celei de a doua
metode pe partea fracționară
● Nu toate numerele zecimale din baza 10 au reprezentare
finită în baza 2
○ 3/10 = 0.3(10)=0.0(1001)(2) - reprezentare periodică infinită
○ doar numerele care se pot scrie ca a/b, unde b este 2k, au
reprezentare finită
● Numerele reale în general (radical(2), pi, e) au un număr
infinit de cifre
○ se aproximează cu cele mai importante cifre
● Nu se poate verifica egalitatea între două numere flotante
○ se verifică dacă diferența dintre ele este mică
16
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Numere cu virgulă flotantă

● Reprezentarea cu virgulă flotantă a unui număr x implică


aducerea lui la o formă standard:

x = ±[Link]… bazaputere

● Intuitiv, când lucrăm cu un număr ne interesează doar


semnul, cifrele cele mai semnificative, și cât de mare este
○ Exemplu, distanțe dintre 2 orașe 120 km = 1.2 × 105 m
○ Exemplu, sarcina unui electron = -1.60217662 × 10-19 Coulomb
● În procesul transformării mutăm virgula zecimală la poziția
corectă prin înmulțire cu baza la o putere

17
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Conversie număr zecimal în virgulă flotantă

● Tipurile pentru numere reale (float, double, long double)


folosesc reprezentarea cu virgulă flotantă în baza 2
● Este rezervat
○ 1 bit pentru semn,
○ a biți pentru exponent (putere) și
○ b biți pentru mantisă (cifrele cele mai importante)
● Pentru conversie numărul trebuie adus la forma

x = ±[Link]…

1. Conversie din baza 10 în baza 2


2. Mutare virgulă prin înmulțire cu 2k
a. k poate fi negativ, pozitiv sau 0
3. Se calculează exponentul prin adăugarea
deplasamentului la k și se convertește în binar
18
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Reprezentare număr zecimal în virgulă flotantă - exemplu

● 132.57 stocat ca float = 1 bit semn, 8 biți exponent, 23 biți


mantisă, deplasament 01111111(2) = 127(10)
132.57(10) = 10000100.1001000111101100…(2)

~ 10000100.1001000111101100(2)= k este 7

= 1.00001001001000111101100(2)×27 =

= 2134-127×1.00001001001000111101100(2)

= 210000110(2)-127×1.00001001001000111101100(2)
bit semn 0 pozitiv, 1 negativ; biți exponent; biți mantisă - se ignoră cifra de 1 din stânga

● Cei 4 bytes ai reprezentării (în memorie octeții se stochează invers):


○ 0100 0011 0000 0100 1001 0001 1110 1100
19
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Tipuri de date - întregi

tip octeți* minim maxim

unsigned char 1 0 255 = 28-1

unsigned short int 2 0 65,535 = 216-1

unsigned int 4 0 4,294,967,295 = 232-1 ~ 4 x 109

unsigned long long int 8 0 18,446,744,073,709,551,615 = 264-1 ~ 1019

tip octeți* minim maxim

char 1 -128 = -27 127 = 27-1

short int 2 -32,768 = -215 32,767 = 215-1

int 4 -2,147,483,648 = -231 2,147,483,647 = 231-1 ~ 2 x 109

long long 8 -9,223,372,036,854,775,808 9,223,372,036,854,775,807


int = -263 = 263-1 ~ 9 x 1018

* dimensiunea în octeți se dă pentru Windows 64 biți, poate fi diferită pe alt sistem de operare
* long long int este introdus în standardul C99
20
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Tipuri de date - reale

tip octeți* exponent deplasament mantisă minim maxim precizie


normal normal (nr. cifre)

float 4 8 127 = 27-1 23 1.17 x 10-38 3.40 x 1038 6

double 8 11 1023 = 210-1 52 2.22 x 10-308 1.79 x 10308 15

long double 16 15 16383 = 214-1 64 3.7 x 10-4932 1.2 x 104932 18

● minim normal: exponentul = 1, toți biții din mantisă egali cu 0


○ ~ 2 - deplasament + 1
● maxim normal: exponentul = maxim – 1, toți biții din mantisă egali cu 1
○ ~ 2 deplasament + 1
● precizie = câte cifre este capabil să păstreze în mod corect
○ 10precizie ~ 2biți mantisă deci precizie = (biți mantisă) log102
● Dacă exponentul conține doar biți de 1 – rezervat pentru infinit și not-a-number
● Dacă exponentul conține doar biți de 0 – numere subnormale = mantisa începe cu bit 0

* dimensiunea în octeți se dă pentru Windows 64 biți, poate fi diferită pe alt sistem de operare
* long double este introdus în standardul C99
[Link] [Link]
21
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Depășirea limitei - Overflow

● Tipurile au un domeniu finit


● Dacă se depășește limita maximă se întâmplă overflow
● Pentru tipuri întregi fără semn pe n biți
○ se păstrează doar ultimii n biți din răspuns, se aruncă biții mai
mari
● Pentru tipuri întregi cu semn
○ la fel ca la cele fără semn dar răspunsul poate fi și negativ
conform reprezentării în complement față de 2 (C2)
● Pentru tipuri reale se obține infinit
● Se întâmplă analog ca la depășirea limitei inferioare
(underflow)

22
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Depășirea limitei - Overflow - exemple

//intregi fara semn ● a conține valoarea maximă pentru unsigned int


unsigned int a = 4294967295; ● a+1 ar fi 232 care are biții 31, 30, ..., 0 egali cu 0
a = a + 7; ● a+7 este 232 + 6 care are biții 31, 30, ..., 0 egali cu ...0110
printf("%u\n", a); ● 6 fiindcă se aruncă bitul 32

● b conține valoarea maximă pentru int -1


//intregi cu semn
● b = 0111 1111 1111 1111 1111 1111 1111 1110 (2)
int b = 2147483646;
● b = 1000 0000 0000 0000 0000 0000 0000 1000 (2)
b = b + 10;
● -2147483640 = -231 + 8 fiindcă se interpretează în C2
printf("%d\n", b);

● se inițializează c cu notație științifică


//reali ● c = 1020
float c = 1e20f; ● c = 1040 - nu se poate reprezenta ca float - overflow
c = c*c; ● inf
printf("%f\n", c);

23
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Expresii - introducere

● O expresie este
○ o variabilă sau o constantă x sau 14
○ un operator unar și o expresie -x sau +14
○ un operator binar și două expresii x+y sau x*14
○ un operator ternar și trei expresii x?0:1
● Practic, este o formulă care se evaluează la o valoare în
momentul execuției programului
● În general formulele matematice se transcriu aproape
identic ca expresii în C
● Exemplu, x + 3*y - 5*(z+4)

24
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Clasificare operatori
● Aritmetici
○ +-/*%
○ rezultatul operației este un număr
○ % este restul împărțirii = modulo
○ nu există ridicare la putere
● Relaționali
○ > >= < <= == !=
○ rezultatul operației este adevărat 1 sau fals 0
○ == verifică egalitate, = este pentru atribuire, != diferit
● Logici
○ ! && ||
○ ! - not, negare logică, && - și logic, || - sau logic
○ rezultatul operației este adevărat 1 sau fals 0
● Incrementare, decrementare (post și pre)
○ ++ --
25
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Evaluarea expresiilor
● Dacă expresia este o constantă sau o variabilă valoarea
ei este egală cu valoarea constantei/variabilei și se
păstrează tipul
● Dacă expresia este formată din mai mulți operanzi de
același tip atunci rezultatul va fi tot de acest tip
● Dacă expresia este formată din mai mulți operanzi de
tipuri diferite atunci tipurile cu domeniu mai mic sunt
automat (implicit) convertite în tipuri cu domeniu mai mare
și rezultatul va fi de acest tip = conversie implicită
○ ordinea tipurilor de la domeniu mic la domeniu mare:

char -> unsigned char -> short -> unsigned short -> int ->
unsigned int -> long long -> unsigned long long -> float ->
double -> long double
26
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Evaluarea expresiilor

● În cazul în care toți operanzii sunt întregi se efectuează


promovarea întregilor
● Tipurile de date cu rang mai mic decât int, cum sunt
tipurile de date char și short, sunt promovate la int
● În cazul variantei fără semn (unsigned) acestea sunt
promovate la unsigned int

char x = 120;
char y = 110;
int z = x + y;
printf("%d\n", z); // 230

27
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Evaluarea expresiilor

● Putem schimba tipul unei expresii în mod forțat prin


conversie explicită folosind operatorul de cast
● Se precedă expresia cu (tip), unde tip este orice tip de
date
● Exemplu, float x = 1 / (float) 2;
○ fără conversie explicită x avea valoarea 0
● Exemplu, float x = (float) 5;
○ în acest caz și dacă omitem operatorul de cast conversia se
întâmpla automat prin conversie implicită
● Exemplu, int x = (float) 1;
○ se convertește 1 în float în mod explicit, apoi se convertește în int
în mod implicit

28
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori aritmetici

//operatori unari
-a ● dacă a este 1, -a este -1; dacă a este -2, -a este 2; 0 neafectat
+-6 ● este tot -6, operatorul unar + este doar cosmetic

//operatori binari
int x = 6-7; ● -1, două constante de tip int, rezultatul tot de tip int
int y = 1/2; ● 0, se calculează câtul împărțirii dacă ambii operanzi sunt int
float z = 1/2; ● 0.f, rezultatul împărțirii este tot int, care apoi este convertit la float
float u = 1.f/2; ● 0.5f, operandul 2 de tip int este convertit implicit la float
float v = 1/2.f; ● 0.5f, operandul 1 de tip int este convertit implicit la float
float w = 1/2.0; ● 0.5f, rezultatul 0.5 de tip double este convertit implicit la float
float q = (float)1/2; ● 0.5f, operandul 1 de tip int este convertit explicit la float

● 0, se calculează câtul împărțirii


int a = -1/2;
● -1, rezultatul -1.75 este trunchiat, se aruncă partea fracționară
int b = -7/4.0;
● 2, returnează restul împărțirii - ambii operanzi trebuie să fie întregi
int c = 5%3;
● -2, pentru numere negative -a%b = -(a%b), deși -5 mod 3 = 1
int d = -5%3;

29
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori aritmetici - împărțire la 0

//operanzi intregi
int a = 5; ● nu este eroare de compilare
int b = a/0; ● eroare la rularea programului, nu se poate calcula pentru întregi

//operanzi reali
float x = 5.0f; ● se poate face împărțire cu 0 pe tipuri reale
float y = x/0; ● inf, valoare specială rezervată pentru numere peste limita maximă
float z = -x/0.f; ● -inf, valoare specială pentru numere sub limita minimă

● valoare specială pentru o operație al cărui rezultat nu se poate


//not a number
evalua
● nan, caz nedeterminat
float t = y+z;
● -inf, se poate calcula
float w = y*z;
● nan, caz nedeterminat
float s = y/z;

30
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori aritmetici - incrementare și asignare

● Limbajul C definește operatori unari pentru creșterea și


descreșterea cu 1 a unei variabile
○ x++ post-incrementare, crește valoarea lui x cu 1 dar
expresia este evaluată la valoarea originală lui x
○ ++x pre-incrementare, crește valoarea lui x cu 1 și expresia
este evaluată la valoarea nouă lui x
○ x--, --x post- și pre-decrementare, analog
● O expresie cu operatorul de asignare (atribuire) se evaluează
la valoarea asignată (asociativ de la dreapta la stânga)
○ putem scrie x = y = z = 1 echivalent cu x = (y = (z = 1))
● Asignare compusă
○ este de forma operator aritmetic =
○ de exemplu, x += 1 este echivalent cu x = x + 1
31
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori aritmetici - prioritate și asociativitate

● Într-o expresie compusă operațiile se evaluează după


prioritatea lor
● Dacă operațiile au aceeași prioritate atunci se evaluează
conform asociativității
● Pentru a schimba ordinea operațiilor se folosesc
paranteze ()

32
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori aritmetici - prioritate și asociativitate - tabel

Prioritate Nume Operator Asociativitate

1 post-increment .++
post-decrement .--

2 pre-increment ++.
pre-decrement --.
plus unar +.
minus unar -.
3 multiplicative */%

4 aditive +-

5 asignare = *= /= %= += -=

33
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Operatori relaționali și logici

● În C nu există tip pentru valoare booleană


● Orice valoare nenulă este echivalentă cu adevărat
● 0 de orice tip este echivalent cu fals
● Operatorii relaționali și cei logici produc rezultat 0 sau 1
● Operatorii || și && implementează scurt-circuitare
○ e1 || e2 || 1 || e3 … - expresiile e3 și cele care urmează nu sunt
evaluate fiindcă rezultatul este sigur 1
○ e1 && e2 && 0 && e3 … - expresiile e3 și cele care urmează nu
sunt evaluate fiindcă rezultatul este sigur 0

34
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Expresii - greșeli des întâlnite

float x = 1/2; ● x va fi 0, împărțire de numere întregi


● cea mai frecventă greșeală la expresii

int a = 2; ● y va fi 1, operatorul / are aceeași


float y = 1 / 2.0 * a; prioritate ca *
● se efectuează împărțirea apoi
înmulțirea cu a

int a = 5, b; ● să evităm expresiile care au efecte


int c = (b = a + 2) - (a = 1); secundare, adică modifică valorile altor
variabile
● expresia are valoare nedeterminată
fiindcă depinde de ordinea în care se
evaluează subexpresiile

35
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă if
● Ramifică fluxul de control pe una din maxim două
alternative în funcţie de valoarea de adevăr a expresiei
evaluate
if ( expresie )
instructiune_1;
else
instructiune_2;
● Expresia trebuie obligatoriu inclusă între paranteze
rotunde
● Dacă expresie este adevărată (nenulă) atunci se
execută instructiune_1 altfel se execută
instructiune_2
● Ramura else poate să lipsească
36
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă if - exemplu simplu

#include <stdio.h> ● determină dacă numărul x


citit este par sau impar
int main() {
int x;
scanf("%d", &x);
if (x%2) ● x % 2 este 1, deci adevărat,
printf("numar impar"); doar dacă x este impar
else
printf("numar par");
return 0;
}

37
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă if - exemplu complex

#include <stdio.h> ● citește x și îl înjumătățește


doar dacă aparține
int main() { intervalului [0, 10]
float x;
int r = scanf("%f", &x); ● salvăm valoarea returnată
if (r == 0) de scanf
printf("format incorect"); ● dacă r este 0, nu am citit
else if (x < 0 || x > 10) ● expresie logică
printf("in afara intervalului");
else{
x = x / 2; ● dacă avem mai multe
printf("%f\n", x); instrucțiuni trebuie să
} formăm un bloc cu acolade
return 0;
}

38
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă if - erori frecvente

int a = 2; ● operatorul de atribuire = este confundat cu


if (a = 10) operatorul de comparație ==
printf("a este 10"); ● expresia a = 10 schimbă a în 10 și este
evaluată ca 10 (adevărat)
● mesajul va fi afișat întotdeauna

int a = 2; ● după expresia din if nu e corect să punem ;


if (a == 10); ● printf-ul nu este influențat de if și mesajul va
printf("a este 10"); fi afișat întotdeauna

int a = 2; ● varianta corectă


if (a == 10)
printf("a este 10");

39
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă switch

● Ramifică fluxul de control pe una sau mai multe


alternative în funcţie de valoarea numerică a unei expresii
întregi
switch(expr){
case c1: instr1;
case c2: instr2;
...
case cn: instrn;
default: instr;
}
● Se evaluează expresia și se execută instrucțiunile
începând de la prima etichetă cu care se potrivește
rezultatul
40
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă switch

● expresia poate fi doar de tip întreg (caracter inclus)


● ramura default este pentru valori care nu se potrivesc
cu nici un caz de mai sus - este opțională
○ recomandat sa fie ultima etichetă
● dacă dorim să se execute doar instrucțiunile de pe o
singură ramură se adaugă instrucțiunea break

41
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Instrucţiunea alternativă switch - exemplu

#include <stdio.h> ● citește caracterul c (o literă mică)


și determină dacă este consoană
int main() { sau vocală
char c;
scanf("%c", &c); ● switch cu expresie de tip caracter
switch(c){ ● etichete pentru cazurile de vocală
case 'a': ● se execută instrucțiunile după
case 'e': ramura cu care se potrivește, până
case 'i': la break
case 'o':
case 'u': puts("vocala"); break;
default: puts("consoana");
}
return 0; ● pentru toate celelalte cazuri se
} intră pe ramura default

42
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Discuție problemă - Intersecția a două intervale

● Să se determine lungimea intersecției a două intervale de


pe axa reală
● Notăm intervalele cu [A, B] și [C, D]

● Trebuie să determinăm lungimea intervalului care este în


comun
○ răspunsul există întotdeauna
○ poate fi 0 dacă intervalele nu se intersectează
○ sunt multe cazuri diferite

43
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Discuție problemă - Intersecția a două intervale

● Capătul din stânga al intersecției trebuie să fie punctul A


sau punctul C
○ se ia cel care are coordonată maximă
● Capătul din dreapta al intersecției trebuie să fie punctul B
sau punctul D
○ se ia cel care are coordonată minimă
● Dacă punctul ales pentru capătul din stânga este la
stânga celuilalt punct atunci intersecția este diferența
coordonatelor
○ altfel este 0
● Exprimat succint:

lungime = max(0, min(B, D) - max(A, C))


44
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga
Discuție problemă - Intersecția a două intervale

#include <stdio.h>

int main() {
float A, B, C, D;
scanf("%f%f", &A, &B);
scanf("%f%f", &C, &D);
● calculăm în L maximul dintre A și C
float L = A;
if (C > L)
L = C;
● calculăm în R minimul dintre B și D
float R = B;
if (D < R)
R = D;
● se intersectează
if (R > L)
● atunci lungimea este diferența
printf("%f\n", R-L);
else
● altfel lungimea este 0
printf("0");
return 0;
}

45
PC Curs 2 - Tipuri de date; Expresii; Instrucțiuni de decizie - R. Varga

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