Algoritmi şi programare

2011 – 2012

Cristian Gaţu Mădălina Răschip www.infoiasi.ro/~ap

Organizare
• Lector dr. Cristian Gaţu
– e-mail: cgatu@info.uaic.ro – cabinet: C212 (corp C, parter); tel: 0232-201546 – url: www.infoiasi.ro/~cgatu – consultaţii: vineri, 10:00-12:00

• Asist. dr. Mădălina Răschip
– – – – e-mail: mionita@info.uaic.ro cabinet: C416 ; tel: 0232-202469 url: www.info.uaic.ro/~mionita consultaţii: luni, 10:00-12:00
2

Algoritmi şi programare

Pagina cursului
www.info.uaic.ro/~ap

Algoritmi şi programare

3

Obiective • Algoritmi – însuşirea unei gândiri algoritmice – dezvoltarea abilităţilor de proiectare de soluţii algoritmice – însuşirea tehnicilor de utilizare a principalelor structuri de date – evaluarea timpului de execuţie în cazul cel mai nefavorabil • Programare – iniţiere în utilizarea unui limbaj de programare – implementarea principalelor structuri de date – însuşirea tehnicilor de bază în proiectarea programelor Algoritmi şi programare 4 .

căutare – paradigme • Programare – prezentarea graduată a limbajului C (ISO Standard) cu accent pe implementarea structurilor de date şi a soluţiilor prezentate în partea de algoritmică Algoritmi şi programare 5 . structuri statice/înlănţuite – liste liniare – arbori binari. tablouri. union-find – grafuri (ca structuri de date) – sortare. heap-uri.Conţinutul disciplinei • Algoritmi – limbaj algoritmic.

8. participare la discuţii. soluţii originale (bonus!) – TS: • 2 teste scrise (săpt. fiecare test conţinând 8 întrebări de tip grilă şi o problemă Algoritmi şi programare 6 . TS >= 4 • forme: – AL • fiecare temă de laborator va fi punctată (note 1-10) • întrebări. 16).Evaluare • condiţii: – activitatea la laborator (AL) – testele scrise (TS) • criterii de promovare: – număr de teme de laborator: 5 – AL >= 6.

Evaluare • normele ECTS (European Credit Transfer System) • Punctaj Final (PF) = 50% AL +50% TS • Nota finală: – <= 4 dacă sunt îndeplinite condiţiile şi NU sunt îndeplinite criteriile de promovare. – = 10 dacă PF este în primii 5% din cei promovaţi (A) – = 9 următorii 10% din cei promovaţi (B) – = 8 următorii 20% din cei promovaţi (C) – = 7 următorii 30% din cei promovaţi (D) – = 6 următorii 25% din cei promovaţi (E) – = 5 ultimii 10% din cei promovaţi Algoritmi şi programare 7 .

C. Polirom. 1998. Addison Wesley. Prentice Hall.W. Georgescu: Sinteza si analiza algoritmilor. R. 4th edition. Livovschi. Stiintifica si enciclopedica. Pohl: A book on C: Programming in C. Leiserson. Rivest: Introducere in algoritmi. Teora. T. 1998 Algoritmi şi programare 8 . 2008. 1988 A.Bibliografie D.H. Craus: Proiectarea algoritmilor. 2nd edition. Ed. Cormen. 2000. Kernighan. I. B. H. Libris Agora.L. Kelley. Schildt: C Manual complet. L. 1986. D. H. Ritchie: The C Programming Language.E. Lucanu.M. M.

Curs 1 • limbaj algoritmic • modelarea memoriei • tipuri de date elementare (cu prezentarea elementelor de limbaj C corespunzătoare) Algoritmi şi programare 9 .

limbaj algoritmic • Problemă. • Exemplu: reţeta culinară • Algoritm calculator (“computer algorithm”) = un algoritm pentru care secvenţa de paşi este executată de un calculator • Limbaj Algoritmic = un limbaj folosit pentru descrierea algoritmilor Algoritmi şi programare 10 . produce o soluţie pentru o problemă dată. cu proprietatea că. Soluţie • Algoritm: o secvenţă finită de paşi aranjată într-o ordine logică specifică. atunci când este executată.Algoritmi.

Etimologie Muhammad ibn Musa al-Khwarizmi Algoritmi şi programare 11 .Algoritmi .

proprietăţi • intrare (input) – zero sau mai multe entităţi de date furnizate din exterior • ieşire (output) – algoritmul produce informaţie • terminare – pentru orice intrare.Algoritmi . Algoritmi şi programare 12 . Spunem că algoritmul rezolvă problema dată. algoritmul execută un număr finit de paşi • corectitudine – algoritmul se termină şi produce ieşirea corectă pentru orice intrare.

” (B. Stroustrup) Algoritmi şi programare 13 .Primul program C void main(){} “You don’t have to know every detail of C++ to write good programs.

printf(“Primul program C!”).Primul program C /* * first program in C */ #include <stdio. } Algoritmi şi programare 14 .h> int main(void) { printf(“Salut!\n”). return (0).

Primul program C /* * first program in C */ #include <stdio. } Algoritmi şi programare 15 . printf(“Primul program C!”). return (0).h> int main(void) { printf(“Salut!\n”).

Primul program C OUTPUT: Salut! Primul program C!Press any key to continue Algoritmi şi programare 16 .

Caracterele limbajului C Litere: A B C D … X Y Z a b c d … x y z Cifre: 0 1 2 3 4 5 6 7 8 9 Alte caractere: + .* / = ( ) { } [ ] < > ‘ “ ! # % & _ |^ ~ \ . newline. tab. . . Algoritmi şi programare 17 . : ? Caractere spaţiu: blank. etc.

Cuvintele cheie (rezervate) auto const double extern float inline register restrict sizeof typedef volatile break continue else for int return static union while case default do enum goto long short struct unsigned char if signed switch void Algoritmi şi programare 18 .

Limbaj algoritmic • modelarea memoriei • tipuri de date elementare • instrucţiuni • tipuri de date structurate de nivel jos • calcul • timp de execuţie Algoritmi şi programare 19 .

Variabilă • Nume • Adresă • Atribute (tip de date asociat valorilor memorate) x int adr • Instanţă a variabilei Algoritmi şi programare 20 .

Memoria • Structură liniară de celule – Variabile adr x – Pointeri int adr adr p int* *p Algoritmi şi programare int 21 .

Tip de date • Domeniul tipului (colecţia de obiecte) • Operaţiile tipului • Categorii de tipuri de date: – Tipuri de date elementare – Tipuri de date structurate de nivel jos • Operaţiile la nivel de componentă – Tipuri de date de nivel înalt • Operaţiile implementate de algoritmi utilizator Algoritmi şi programare 22 .

double şi long double. long int şi long long int. short int. – 5 tipuri întregi fără semn: desemnate de cuvântul unsigned (tipuri ce ocupă aceeaşi cantitate de memorie) • Tipuri reale flotante: float. int. Algoritmi şi programare 23 .Tipuri standard • Tipul char • Tipurile standard întregi: – 5 tipuri întregi cu semn: signed char.

Echivalenţe signed short int ≡ unsigned short int ≡ signed int unsigned int signed long int unsigned long int Algoritmi şi programare short unsigned short int unsigned long unsigned long 24 ≡ ≡ ≡ ≡ .

…. x3. double y. 25 Algoritmi şi programare . x2. char c. int i.Declaraţii • Forma unei declaraţii: tip variabila. var2. • Variabile globale: declararea lor se face în afara oricărei funcţii. long j. float x1. • Variabile locale: declararea se face în corpul funcţiei. tip variabila = expresie_constanta. int suma = 0. tip var1. varn. signed char sc. float pi = 3.14.

…. 32767} • long int sau long sizeof(long)=4 {-2 147 483 648. {-32768. signed long int Algoritmi şi programare 26 .Tipul întreg • int sizeof(int) = 2 sau 4 octeţi • short int sau short sizeof(short)=2. …. 2 147 483 647} • signed int. signed short int.

…. unde n este numărul de biţi Algoritmi şi programare 27 . 65535} • unsigned long int • Nu există overflow (depăşire) – calculul se efectuează modulo 2n.Întregi fără semn • unsigned int • unsigned short int {0.

127} • sizeof(char) = 1 Algoritmi şi programare 28 . …. în funcţie de maşină. domeniul de valori: {-128. 255} • signed char {-128. …. 255} • unsigned char {0. 127} sau {0.Întregi “foarte scurţi”: char • Tipul char este o submulţime a tipului int • char reprezintă. …. ….

Constante întregi în <limits.h> 16 biţi INT_MAX INT_MIN LONG_MAX LONG_MIN 215 − 1 32 biţi 231 − 1 − 215 231 − 1 − 231 − 231 263 − 1 − 263 Atenţie la reprezentarea circulară! •INT_MAX + 1 == INT_MIN •INT_MIN – 1 == INT_MAX •LONG_MAX + 1 == LONG_MIN •LONG_MIN – 1 == LONG_MAX Algoritmi şi programare 29 .

‘\”’ Algoritmi şi programare 30 . ‘\x2A’ • Notaţii pentru caractere speciale: ‘\n’. 42 • Caractere în octal: ’\101’. ‘+’. ‘\a’. ‘\52’ • Caractere în hexazecimal: ‘\x41’. ‘\0’.‘\’’.Constante întregi • Octale: au prefixul 0 (zero) 032 = 26 077 = 63 • Hexazecimale: au prefixul 0x sau 0X 0x32 = 50 0x3F = 63 • Întregi “long”: au sufixul l sau L 2147483647L 0xaf9Fl = 44959 • Întregi “unsigned” au sufixul u sau U 345u 0xffffu = 65535 • Caractere între apostrof: ‘A’. ‘\t’. ‘\r’. ‘n’ • Caractere în zecimal: 65. ‘\\’.

int a = 10. afişări •citirea unui int •afişarea unui int •citirea unui char •afişarea unui char printf(“a: ”). &a). char a = ‘a’. scanf(“%d”. scanf(“%c”. Algoritmi şi programare 31 . printf(“a: ”). printf(“a = %c”.Citiri. &a). a). a). printf(“a = %d”.

return 0. a. printf("%c %c %c %c\n".exemplu /* Exemple de constante caracter */ #include <stdio. b. d. a. } A A A A A 65 101 41 Algoritmi şi programare 32 . printf("%c %d %o %x\n". a = 'A'.h> int main(){ char a. d). b.Constante . c. a). b = 65. d = '\x41'. a. a. c = '\101'. c.

c <= 127.c).c). } return 0. c<=‘z’. c++) */ Algoritmi şi programare 33 . for(c = 0.h> int main (void){ short c.Codurile ASCII #include <stdio. c++){ printf("cod ASCII: %d". } /* for(c=‘a’. printf(" caracter: %c\n".

while ((c=getchar()) != EOF) {putchar(c). } Sirul de intrare: 123456abcd va produce sirul: 112233445566aabbccdd Algoritmi şi programare 34 .h> • Citire caracter de la tastatură • Scriere caracter pe ecran #include <stdio.Macrourile getchar() şi putchar() • Sunt definite în <stdio. putchar(c).} return 0.h> int main (void){ char c.

islower. isgraph. isupper. toupper.Operaţii. isdigit. Funcţii în biblioteci • Operaţii pentru tipurile întregi: + . isalpha. isprint.h>: tolower. iscntrl. isxdigit. isalnum.* / >= ++ -• Funcţii: % == != < <= > – cele de la tipul flotant – cele din biblioteca <ctype. ispunct. isspace Algoritmi şi programare 35 .

Operatorii ++ şi -• Se aplică doar unei expresii ce desemnează un obiect din memorie (“L-value”): Expresie Valoare ++i i++ --i i-i+1 i i-1 i i după evaluare i+1 i+1 i-1 i-1 ++5 --(k+1) ++i++ nu au sens Algoritmi şi programare 36 .

Exemplu ++ (temă)
#include <stdio.h> int* f(int* a){ int b = 2; (*a) += b; return a; } int main (void){ int a = 5; (*f(&a))++; printf("%d \n", a); return 0; }
Algoritmi şi programare 37

Tipul flotant (real)
• float
– Numere reale în simplă precizie – sizeof(float) = 4 –10 − 37 ≤ abs( f ) ≤ 1038 – 6 cifre semnificative

• double
– Numere reale în dublă precizie – sizeof(double) = 8 –10 − 307 ≤ abs( f ) ≤ 10308 – 15 cifre semnificative
Algoritmi şi programare 38

Tipul flotant (real)
• long double

– Numere reale în “extra” dublă precizie – sizeof(long double) = 12 – 10 − 4931 ≤ abs( f ) ≤ 10 4932 – 18 cifre semnificative
• Limitele se găsesc în <float.h> • Operaţii: + * / == != < <= > >=
39

Algoritmi şi programare

45e+6 13.435 1. .12E2 123E-2 .56 • Pentru a fi float trebuie sa aibă sufixul f sau F .56f 23e4f 45.456e78L Algoritmi şi programare 40 .Constante reale • Constantele reale sunt implicit double 125.54E-1F • Pentru long double trebuie sa aibă sufixul l sau L 123.

14L. scanf(“%lf”. double pi = 3. scanf(“%f”. pi). afişare •citirea unui float •afişarea unui float •citirea unui double •afişarea unui double printf(“x: ”). printf(“x: ”). printf(“pi = %f”.Citire. pi).14. float pi = 3. Algoritmi şi programare 41 . &x). printf(“pi = %lf”. &x).

h>) sin acos tanh pow fabs fmod cos atan exp sqrt ldexp tan sinh log ceil frexp asin cosh log10 floor modf Algoritmi şi programare 42 .Funcţii (în biblioteca <math.

\n”. c).specificator de conversie • Caracterele ce nu fac parte din specificatorii de conversie sunt scrise în stream-ul de ieşire printf(“a = %d.).. a. .Funcţia printf int printf(const char *format. • Funcţiile sprintf. fprintf Algoritmi şi programare 43 . b. b = %f.. • Apelul returnează numărul de conversii realizate cu succes • În şirul format apar specificatorii de conversie introduşi prin caracterul % • La apel. corespondenţa argument --. c = %s.

precizie}opt caracter_de_conversie caracter_de_conversie ::= c|d|i|u|o|x|X|e|E|f|g|G|s|p|n|% modificator ::= h|l|L|-|+|#|0 marime_camp ::= numar_intreg_fara_semn precizie ::= numar_intreg_fara_semn Algoritmi şi programare 44 .Funcţia printf specificator_de_conversie ::= %{modificator}opt {marime_camp}opt {.

a). %lg.568000 */ 2. %LE float pa = 2./* Algoritmi şi programare a a a = = = 2.Funcţia printf Tip char int unsigned int long int unsigned long float double long double Specificator %c.568. %g.57 */ 45 . a). %Lg. %le.568 */ 2. %Le. /* printf(“a = %6g\n”.2f\n”. %e. /* printf(“a = %10. a). %d %d %u %ld %lu %f. printf(“a = %10f\n”. %E %lf. %lE %Lf.

m.*f\n”. n. Algoritmi şi programare 46 . x).Funcţia printf • Câmpul „mărime” sau/şi „precizie” poate fi înlocuit prin * : valoarea va fi luată dintr-un argument: printf(“x= %*.

corespondenţa argument --.). Argumentele trebuie sa fie pointeri sau adrese • Caracterele ce nu fac parte din specificatorii de conversie trebuie să apară în stream-ul de intrare • Funcţiile sscanf... respectiv EOF dacă stream-ul de intrare este vid • În şirul format apar specificatorii de conversie introduşi prin caracterul % • La apel. • Apelul returnează numărul de conversii realizate cu succes. .Funcţia scanf int scanf(const char *format. fscanf Algoritmi şi programare 47 .specificator de conversie.

%s”. iar în sir[14] se pune ‘\0’ Algoritmi şi programare 48 .Funcţia scanf int i. iar în sir[6] se pune ‘\0’ – citit** se memorează în sir[7]. sir.sir[6]. se potriveste cu . %*s %% %c %7s &i..sir[13]. sir_ce_se_ignora % A string_citit** – 45 se memorează în i – . • Dacă stream-ul de intrare este: 45 . char c. &c. &sir[7]). scanf(“%d . char sir[15].. din format – Este ignorat sirul sir_ce_se_ignora – % se potriveste cu % din format – A se memoreaza în c – string_ se memorează în sir[0].

Tipul void • Conversia în tip void a unei expresii semnifică faptul că valoarea sa este ignorată • Utilizat pentru tipul pointer. nu se face controlul tipului la un pointer de tip void • Utilizat pentru funcţii fără valoare returnată sau pentru funcţii fără parametri • Este un tip incomplet ce nu poate fi completat Algoritmi şi programare 49 .

typedef unsigned long size_t. Identificatorul respectiv se poate utiliza pentru a declara variabile sau funcţii: litera_mare u. size_t dim. Algoritmi şi programare 50 . v2. typedef short varsta. v=‘a’. varsta v1.Utilizare typedef Mecanism prin care se asociază un tip unui identificator: typedef char litera_mare.

y. true = 1} bool. Algoritmi şi programare 51 . true} false = 0 true = 1 dar şi orice întreg nenul Operaţii: ! && || == != Declaraţii posibile: typedef enum {false = 0.Date booleene (logice) • • • • • • Nu există un tip special pentru date logice Domeniul de valori: {false. bool x.

Expresii logice expresie_relationala ::= expr < expr | expr > expr | expr <= expr | expr >= expr | expr == expr | expr != expr expresie_logica ::= ! expr | expr || expr | expr && expr Algoritmi şi programare 52 .

Valoarea expresiilor relaţionale a-b a<b a>b 1 0 0 a<=b 0 1 1 a>=b 1 1 0 a==b a!=b 0 1 0 1 0 1 positiv 0 zero 0 negativ 1 Algoritmi şi programare 53 .

Valoarea expresiilor logice || exp1 <> 0 = 0 exp2 nu se evaluează se evaluează exp1 || exp2 1 1 dacă exp2 <> 0 0 dacă exp2 = 0 Algoritmi şi programare 54 .

Valoarea expresiilor logice && exp1 = 0 <> 0 exp2 nu se evaluează se evaluează exp1 && exp2 0 1 dacă exp2 <> 0 0 dacă exp2 = 0 Algoritmi şi programare 55 .

Exemple • O condiţie de forma a ≤ x ≤ b se scrie în limbajul C: (x >= a) && (x <= b) (a <= x) && (x <= b) • O condiţie de forma a > x sau x > b se scrie în limbajul C: (x < a) || (x > b) Algoritmi şi programare !(x >= a && x <= b) 56 .

exp2 nu se evaluează • Operatorul ?: este drept asociativ Algoritmi şi programare 57 . exp3 nu se evaluează • Dacă exp1 are valoare false (nulă) atunci valoarea expresiei este valoarea lui exp3.Operatorul condiţional ?: exp1 ? exp2 : exp3 • Se evaluează exp1 • Dacă exp1 are valoare true (nenulă) atunci valoarea expresiei este valoarea lui exp2.

z. x = a?b:c?a:b. int x. x. z = %d\n". y.Operatorul condiţional ?: Exemple x x x >= 0 ? x : y > y ? x : y > y ? x > z ? x : z : y > z ? y : z #include <stdio. z = 2 Algoritmi şi programare asociere stanga */ asociere dreapta */ %d. */ 58 . /* printf("x = %d. y. c=3. b=2. z). y = (a?b:c)?a:b.h> int main(void){ int a=1. /* z = a?b:(c?a:b). y = 1. y = } /* x = 2.

eventual convertită • Aşadar. variabilă tablou cu indici. operatorul = modifică valoarea operandului stang • Valoarea expresiei este valoarea lui exp1 după evaluare • Operatorul = este drept asociativ Algoritmi şi programare 59 .) • Tipul expresiei este tipul lui exp1 • Se evaluează exp2. etc. apoi exp1 capată valoarea lui exp2.Operatorul = (Expresia de atribuire) exp1 = exp2 • exp1 este o “L-value” (obiect din memorie: variabilă.

else printf(“nenul”). /* nenul */ Algoritmi şi programare 60 . a = ( b = 2 ) + ( c = 3 ). while((c = getchar()) != EOF) putchar(c). a = b = c = 0. /* nul */ if ( a = 0) printf(“nul”). Nu confundaţi e1 = e2 cu e1 == e2 ! a = 0.Operatorul = (Exemple) x = sqrt(9). else printf(“nenul”). if ( a == 0 ) printf(“nul”). /* echivalenta cu */ a = (b = (c = 0)).

/* echivalentă cu: */ exp1 = exp1 op (exp2) j *= k = m + 5. j = j * (k + 3). j *= k + 3. Algoritmi şi programare 61 . /* echivalentă cu: */ j = (j * (k = (m + 5))).Operatori de atribuire compusă O expresie de atribuire compusă are forma: unde op= este unul din: exp1 op= exp2 %= &= |= += -= *= /= ^= >>= <<= Expresia este echivalentă cu cu precizarea că exp1 se evaluează o singură dată.

Operatorul virgulă . j = 2. Algoritmi şi programare 62 . a = 1. i = 1. ++k + 1. ++x * 2. • Operatorul virgulă are cea mai mică precedenţă. i = 1. b = 2. k != 1. ++i). i <= n. expresie • Se evaluează prima expresie apoi cea de-a doua. suma += i. for(suma = 0.0 + 1. • Valoarea şi tipul întregii expresii este valoarea şi tipul operandului drept. expresia_virgula ::= expresie.

Operatorul sizeof() • Operator unar ce permite găsirea numărului de octeţi pe care se reprezintă un obiect (tip. sizeof(b*b-4*a*c).expresie) sizeof(int). sizeof(i). sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long) sizeof(signed) = sizeof(unsigned) = sizeof(int) sizeof(float)<=sizeof(double)<=sizeof(long double) Algoritmi şi programare 63 . sizeof(double).

printf("sizeof(int) = %2u\n". printf("sizeof(long) = %2u\n".Operatorul sizeof() #include <stdio. long z = 0.sizeof(float)).sizeof(char)).sizeof(x+y+z)). printf("sizeof(double) = %2u\n".h> int main(void){ int x = 1.sizeof(long)).sizeof(long double)). } Algoritmi şi programare 64 .sizeof(short)). double y = 9. printf("sizeof(x +y + z) = %2u\n". printf("Operatorul sizeof()\n\n\n"). printf("sizeof(char) = %2u\n".sizeof(int)). printf("sizeof(float) = %2u\n". return 0.sizeof(double)). printf("sizeof(long double) = %2u\n". printf("sizeof(short) = %2u\n".

Operatorul sizeof() Rezultatul executiei Visual C++: sizeof(char) = sizeof(int) = sizeof(short) = sizeof(long) = sizeof(float) = sizeof(double) = sizeof(long double) sizeof(x + y + z) 1 4 2 4 4 8 = 8 = 8 Algoritmi şi programare 65 .

(unari) sizeof() * + < == && || ?: = += -= *= /= %= stânga 66 .(postfix) ++ -. (operatorul virgula) Algoritmi şi programare / <= != > >= % stânga stânga stânga stânga stânga stânga dreapta dreapta Asociere stânga dreapta .Precedenţa operatorilor Operatori () ++ -.(prefix) ! & (adresa) * (deref) + .

reale) sunt compatibile între ele. compilatorul admite orice combinaţie de obiecte de diverse tipuri într-o expresie • La evaluarea unei expresii în care apar tipuri diferite compilatorul face conversii implicite Algoritmi şi programare 67 . întregi.Compatibilitatea tipurilor predefinite • Toate tipurile aritmetice (caractere.

long int.Reguli pentru conversia implicită • În absenţa unui unsigned obiectele se convertesc la tipul cel mai “înalt” în ordinea (descrescatoare): long double. • Conversia la unsigned se face doar în caz de necesitate (de ex. float. double. Algoritmi şi programare 68 . int • Regulile pentru operanzii unsigned depind de implementare. valoarea din unsigned nu “încape” în celălat operand).

deci char şi short sunt “promovaţi” la int. • La o asignare (v = exp) tipul membrului drept se converteşte la tipul membrului stâng (care este şi tipul rezultatului). – ATENŢIE: se pot produce • Pierderea preciziei (double → float → long int) • Pierderea unor biţi semnificativi (long → char) • Nedeterminări Algoritmi şi programare 69 .Reguli pentru conversia implicită • Regula “integer promotion” : operaţiile se fac cel puţin în int.

float → double nu aduce precizie sau acurateţe (doar se schimbă forma în care valoarea este reprezentată). Algoritmi şi programare 70 . rezultat negativ 8 biţi semnificativi 24 biţi semnificativi 16 biţi semnificativi nimic partea fracţionară (şi posibil mai mult) precizia (rotunjire) precizia (rotunjire) • double → int: double → float. float → int • conversia int → float.Conversii la asignare Tipul rezultatului signed char char char short int int (32 biti) int float double Tipul expresiei char short int int (32 biţi) / long int int (32 biţi) long int float double long double Posibile pierderi daca valoarea > 127.

Exemplu #include <stdio. /* s2=10000000 00000001 short s3 = -1. c3. c2. s1). = %d. s1 = %d\n". return 0. printf("c3 = %d. printf("c2 c3 = s3. s2). s4). s4. c1. c2. s2 = %d\n".h> int main(void){ char c1 = -126. s3 = %d\n". s4 = %d\n". 71 . c4. */ */ */ */ Algoritmi şi programare } s4 = c4. s2 = -32767. /* c4 = 111111111 short s1. /* c1 = 10000010 unsigned char c3. s3). c2 = s2. printf("c4 = %d. /* s3 = 11111111 11111111 s1 = c1. printf("c1 = %d. c4 = 255.

c3 = s3. s2 = -32767 s3 = 11111111 11111111 c3 = 255. s1 = -126 s2=10000000 00000001 c2 = 1. s4 = 255 Algoritmi şi programare s1 = c1. s4 = c4. 72 .Exemplu (rezultatul execuţiei) c1 = 10000010 c1 = -126. c2 = s2. s3 = -1 c4 = 111111111 c4 = 255.

i = 2.9. f = d. long l. float f. /* 30000 + 10000. i i l l = = = = /* f=65. i = l. 30000u + 10000.in int. l=40000 */ .45e+6. i=30099 */ /* 'depasire'. /* pierderea preciziei */ /* 2. /* pierdere biti semnificativi. double d = char c = 'c'. f = 'A'.0 (codul ASCII) */ calcul expr .Exemplu int i.9 convertit implicit la int. i. i=2 */ 30000 + c . i=-25536 */ /* -25536 convertit la long */ /* rezultat corect. i=-25536 */ Algoritmi şi programare 73 .

Forţarea tipului .cast • Conversia explicită la tipul numetip: (numetip) expresie • Exemple: (long)(‘A’ + 1.0) (int)(b*b-4*a*c) (double)(x+y)/z (float)x*y/z x / (float)2 Algoritmi şi programare 74 .

z = (double)5/2. printf(“%d.Exemplu cast #include <stdio. i. double x. t = 5. 2. %g\n”. 2. j. x. x = 5/2. %d. 2. z. } /* 2. %g. y.5 */ Algoritmi şi programare 75 .h> int main(void){ int i./2. y = (double)(5/2). z. t. j. 2. %g. return 0. j = (double)5/2. i = 5/2. y. 2. t). %g.5.

conţine funcţii de conversie: – Şir de caractere în int: atoi(const char*) – Şir de caractere în float:atof(const char*) Algoritmi şi programare 76 . INT_MAX – Numărul de biţi pe caracter CHAR_BIT – Etc. • <float.h> .Fişiere în bibliotecă relative la tipuri • <limits. etc. • <stdlib.pentru tipurile întregi – Întregul min/max: INT_MIN.h> .pentru tipurile flotante: – Exponentul maxim – Precizia zecimală.h> .

Sign up to vote on this title
UsefulNot useful