Universitatea Bucuresti Dobrovat Anca - Madalina 30/10/2014 Programare procedurala - suport de curs - An universitar 2014 2015 Semestrul I Saptamana 5 2 Facultatea de Matematica si Informatica Universitatea Bucuresti Curs 5 - Cuprins 1. Aprofundare operatii pe biti 2. Tipuri de date structurate struct, union, campuri de biti, enum, typedef 3. Tablouri uni si multi- dimensionale 4. Discutii asupra testelor din cursul trecut. 3 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (1/18) Reprezentarea interna a numerelor intregi (cod complementar) Bitul de semn: - cel mai semnificativ bit (0 pentru numere pozitive; 1 pentru numere negative) Exemplificare reprezentare pe 1 octet ( [-128, 127] ) 7 6 5 4 3 2 1 0 bit de semn 1. Numere pozitive Transformare in baza 2 n = 47 Completare bit de semn Completare rest biti cu 0 0 0 1 0 1 1 1 1 4 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (2/18) Reprezentarea interna a numerelor intregi (cod complementar) 1. Numere negative n = - 47 Transformare in baza 2 a valorii absolute |47| Calculul complementului fata de 1 a reprezentarii obtinute la pasul anterior (bitul 1 devine 0, iar bitul 0 devine 1) se aduna 1 (adunarea se face in baza 2) la valoarea obinuta + 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 5 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (3/18) Operatori la nivel de bit 1. Negatia ~ (operator unar) - intoarce numarul intreg a carui reprezentare interna se obtine din reprezentarea interna a numarului initial, prin complementarea fata de 1 a fiecarui bit (1 0 si 0 1). Expl. ~ (- 47) - 47 Complementare fata de 1 46 0 0 1 0 1 1 1 0 1 1 0 1 0 0 0 1 6 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (4/18) Operatori la nivel de bit 2. Conjunctia & (operator binar) - intoarce numarul ntreg a carui reprezentare interna se obtine prin conjunctia bitilor care apar in reprezentarea interna a operanzilor. Conjunctia se face cu toate perechile de biti situati pe aceeasi pozitie. Expl. 47 & 28 = 12 47 28 12 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 Bit 1 Bit 2 Bit 1 & Bit 2 0 0 0 0 1 0 1 0 0 1 1 1 7 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (5/18) Operatori la nivel de bit 3. Disjunctia | (operator binar) - intoarce numarul ntreg a carui reprezentare interna se obtine prin disjunctia bitilor care apar in reprezentarea interna a operanzilor. Disjunctia se face cu toate perechile de biti situati pe aceeasi pozitie. Expl. 47 | 28 = 63 47 28 63 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 Bit 1 Bit 2 Bit 1 | Bit 2 0 0 0 0 1 1 1 0 1 1 1 1 8 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (6/18) Operatori la nivel de bit 4. Xor (sau exclusiv) ^ (operator binar) - intoarce numarul ntreg a carui reprezentare interna se obtine prin disjunctia bitilor care apar in reprezentarea interna a operanzilor. Disjunctia se face cu toate perechile de biti situati pe aceeasi pozitie. Expl. 47 ^ 28 = 51 47 28 51 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 Bit 1 Bit 2 Bit 1 ^ Bit 2 0 0 0 0 1 1 1 0 1 1 1 0 9 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (7/18) Operatori la nivel de bit 5. shl (shift left) << (operator binar) - intoarce numarul intreg a carui reprezentare interna se obtine din reprezentarea interna a primului operand prin deplasare la stanga cu un numar de biti egal cu al doilea operand. Expl. 10 << 3 = 80 ( 10 * 2 3 = 80) 10 80 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 10 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (8/18) Operatori la nivel de bit 6. shr (shift right) >> (operator binar) - intoarce numarul intreg a carui reprezentare interna se obtine din reprezentarea interna a primului operand prin deplasare la dreapta cu un numar de biti egal cu al doilea operand. Expl. 10 >> 3 = 1 (10 / 2 3 = 1) 10 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 11 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (9/18) Operatii la nivel de bit 1. Transformarea unui bit in 1 (X or (1 shl B)) - Cerinta: valorii X sa i se seteze la valoarea 1, bitul B (0 B 7). - Rezolvare: o masca logica M in care doar bitul B are valoarea 1. Valoarea mastii M e data de 1 shl B operatia OR intre X si M Expl. X = 37, B = 4 (bitului 4 i se va seta valoarea 1) 37 OR M Rezultat 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 12 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (10/18) Operatii la nivel de bit 2. Transformarea unui bit in 0 (X and (255 - (1 shl B))) - Cerinta: valorii X sa i se seteze la valoarea 0, bitul B (0 B 7). - Rezolvare: o masca logica M in care doar bitul B are valoarea 0. Valoarea mastii M e data de 255 (1 shl B) [sau 255 xor (1 shl B)] operatia AND intre X si M Expl. X = 37, B = 2 (bitului 2 i se va seta valoarea 1) 37 AND M Rezultat 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 13 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (11/18) Operatii la nivel de bit 3. Testarea valorii unui bit (X & (1 << B) != 0) - Cerinta: ce valori au bitii B1 si B2 ai valorii X? - Rezolvare: o masca logica M1 pentru bitul B1 si o masca logica M2 pentru bitul B2 cu valoarea 1 operatia AND intre X si M1 respectiv inte X si M2 Expl. X = 37, B1 = 2 37 AND M1 X & (1 << 2) = 1 R1 1 ! = 0 (adevarat) 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 14 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (12/18) Operatii la nivel de bit 3. Testarea valorii unui bit (X & (1 << B) != 0) - Cerinta: ce valori au bitii B1 si B2 ai valorii X? - Rezolvare: o masca logica M1 pentru bitul B1 si o masca logica M2 pentru bitul B2 cu valoarea 1 operatia AND intre X si M1 respectiv inte X si M2 Expl. X = 37, B2 = 4 37 AND M2 X & (1 << 4) = 0 R2 0 ! = 0 (fals) 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 15 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (13/18) Operatii la nivel de bit 4. Testarea valorii ultimilor biti (X & (1 << B - 1)) - Cerinta: ce valori au ultimii B biti (egal cu restul impartirii la 2 B ) ? - Rezolvare: o masca logica M pentru bitii 0, 1, B-1 cu valoarea 1 operatia AND intre X si M1 Expl. X = 37, B = 3 (ultimii 3 biti = restul impartirii la 8) 37 AND M 1 << B = 8 1 << B 1 = 7 Rez 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 16 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (14/18) Aplicatii 1. Testarea paritatii unui numar (X & 1) X = par cel mai din dreapta bit este 0 X = impar cel mai din dreapta bit este 1 X = 23 & X = 44 & 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 17 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (15/18) Aplicatii 2. Se considera un numar natural n. Sa se verifice daca n este sau nu o putere a lui 2. X = putere a lui 2 un singur bit nenul Rezolvare fara numararea bitilor ( X & (X - 1) = 0 X = 2 k ) X = 32 & X 1 = 31 X = 20 & X 1 = 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 18 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (16/18) Aplicatii 3. Se considera un numar natural nenul n. Sa se determine numarul de cifre de 1 din reprezentarea lui binara. Solutie 1: parcurgerea secventiala a bitilor int i, n_1=0; // n_1 contor pentru bitii de valoare 1 for ( i=0; i<32; i++) if (n & (1 << i)) n_1++; X = 27 32 x 2 operatii (n & (1<<i) ) 0 0 0 1 1 0 1 1 19 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (17/18) Aplicatii 3. Se considera un numar natural nenul n. Sa se determine numarul de cifre de 1 din reprezentarea lui binara. Solutie 2: folosirea n & (n - 1) Operatia anuleaza cel mai nesemnificativ bit de 1 a lui n. int n_1=0; // n_1 contor pentru bitii de valoare 1 do { n &= n-1; Obs: se executa un numar de pasi egali cu numarul n_1++; de cifre de 1 din reprezentare. }while (n); X = 27 & X 1 = 26 Rez 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 20 Facultatea de Matematica si Informatica Universitatea Bucuresti 1. Operatii pe biti (18/18) Aplicatii 4. Se consider dou numere naturale n i i (0 <= i < 16). S se marcheze cu 1 bitul i al lui n. Solutie: Setam valoarea 1 la bitul i, indiferent de valoarea memorat anterior (0 sau 1) n | (1 << i) X = 19 I i = 3 1<<3 = 8 Rez 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 21 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (1/18) Limbajul C crearea tipurilor uzuale in 5 moduri 1. Structura ( struct ) grupeaza mai multe variabile sub acelasi nume; // tip de data compozit 2. Campul de biti variatiune a structurii acces usor la bitii individuali 3. Uniunea ( union ) face posibil ca aceleasi zone de memorie sa fie definite ca doua sau mai multe tipuri diferite de variabile 4. Enumerarea ( enum ) lista de constante intregi cu nume 5. Tipuri definite de utilizator ( typedef ) defineste un nou nume pentru un tip existent 22 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (2/18) Structuri Grup de variabile unite sub acelasi nume Sintaxa struct <nume> { < tip 1 > <variabila 1>; < tip 2 > <variabila 2>; --------------------------------- < tip n > <variabila n>; } lista de identificatori de tip struct; Variabilele care fac parte din structura sunt denumite membri ai structurii (uzual numiti elemente sau campuri). 23 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (3/18) Structuri struct <nume> { < tip 1 > <variabila 1>; < tip 2 > <variabila 2>; --------------------------------- < tip n > <variabila n>; } lista de identificatori de tip struct; Obs: 1. Daca numele tipului lipseste, structura se numeste anonima. Daca lista identificatorilor declarati lipseste, s-a definit doar tipul structura. Cel putin una dintre aceste specificatii trebuie sa existe. 2. Daca <nume> este prezent se pot declara noi variabile de tip structura struct <nume> <lista noilor identificatori>; 3. Referirea unui membru al unei variabile de tip structura operatorul de selectie (.) intr-o expresie care precizeaza identificatorul variabilei si al campului. 24 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (4/18) Structuri Exemple struct adrese { char nume[30]; char strada[40]; char oras[20], jud[3]; int cod; }; Numele adrese identifica aceasta structura de date particulara. struct adrese A; Declara o variabila de tip adrese si ii aloca memorie Structura din memorie pentru variabila A de tip adrese nume 30 octeti strada 40 octeti oras 20 octeti jud 3 cod 4 25 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (5/18) Structuri Exemple struct adrese { char nume[30]; char strada[40]; char oras[20], jud[3]; int cod; } A, B, C; Defineste un tip de structura numit adrese si declara ca fiind de acest tip variabilele A, B, C struct { char nume[30]; char strada[40]; char oras[20], jud[3]; int cod; } A; Declara o variabila numita A definita de structura care o precede. 26 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (6/18) Structuri Exemple struct adrese { char nume[30]; char strada[40]; char oras[20], jud[3]; int cod; } A, B, C; Accesul la membrii structurii Se face prin folosirea operatorului punct. nume_variabila.nume_camp A.nume = Ionescu; B.Cod = 257; scanf(%d, &C.cod); Atribuirea la nivel de structura A.nume = Ionescu; A.strada=1 Mai; A.oras = Bucuresti; A.jud = B; A.cod = 1; B = A; 27 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (7/18) Campuri de biti Caracteristica intrinseca a limbajului C. Permite accesul la un singur bit. Utile: Memorie limitata stocarea mai multor variabile booleene intr-un singur octet. Anumite echipamente transmit prin octeti informatii codificate. Anumite rutine de criptare trebuie sa aiba acces la bitii dintr-un octet. 28 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (8/18) Campuri de biti struct nume_generic { tip nume_1 : lungime; tip nume_2 : lungime;
tip nume_n : lungime;
} lista_variabile; Poate adauga mai multa structurare (posibil si eficienta). Este efectiv un tip special de membru al unei structuri care defineste cat de lung trebuie sa fie campul, in biti. Forma generala Tipul campului de biti poate fi doar: int, unsigned sau signed. Campul de biti cu lungimea 1 unsigned (un singur bit nu poate avea semn). Unele compilatoare doar unsigned. Lungime nr de biti dintr-un camp 29 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (9/18) Campuri de biti Exemplu Utilizate frecvent pentru analizarea intrarii de la un echipament hard. Exemplu portul de stare al unui adaptor de comunicatie seriala poate sa returneze un octet de stare organizat astfel ( [1] ): [1] Herbert Schildt - C++ Manual complet (Partea I Baza limbajului C++. Limbajul C) 30 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (10/18) Campuri de biti Exemplu Exemplu portul de stare al unui adaptor de comunicatie seriala struct tip_stare { unsigned delta_cts: 1; unsigned delta_dsr: 1; unsigned tr_edge: 1; unsigned delta_rec: 1; unsigned cts: 1; unsigned dsr: 1; unsigned ring: 1; unsigned rec_line: 1; } stare; 31 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (11/18) Campuri de biti Exemplu Exemplu rutina pentru a determina cand un program sa primeasca sau sa transmita date. stare = preia_stare_port(); if (stare.cts) printf(Ok pt transmis); if (stare.dsr) printf(Date pregatite); Atribuirea unei valori unui camp de biti stare.ring = 0; Obs: Nu este necesar sa fie numiti fiecare camp de biti acces mai usor la bitul dorit, trecand peste cei neutilizati. struct tip_stare { unsigned: 4; unsigned cts: 1; unsigned dsr: 1; } stare; 32 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (12/18) Campuri de biti In aceeasi structura pot fi combinate campuri de biti si membri normali. struct angajat { struct adrese A; float plata; unsigned activ: 1; // activ sau intrerupt unsigned orar: 1; // plata cu ora unsigned impozit: 3; // impozit rezultat }; struct adrese { char nume[30]; char strada[40]; char oras[20], jud[3]; int cod; } ; Obs: Defineste o inregistrare despre salariat care foloseste doar un octet pentru a pastra 3 informatii: statutul, daca este angajat si impozitul. Fara campul de biti, aceste informatii ar fi ocupat 3 octeti. 33 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (13/18) Campuri de biti Restrictii: Nu se poate obtine adresa unui camp de biti. Nu pot fi introduse in matrice. Nu se stie daca vor fi rulate de la stanga la dreapta sau de la dreapta La stanga depinde de echipament. 34 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (14/18) Uniuni Def: Locatie de memorie impartita in momente diferite intre doua sau mai multe variabile diferite, in general de tipuri diferite. union nume_generic { tip nume_1 : lungime; tip nume_2 : lungime;
tip nume_n : lungime;
} variabile_uniuni; Forma generala Exemplu union tip_u { int i; char ch; }; union tip_u A; In variabila A i si ch impart aceeasi zona de memorie. Cand este declarata o variabila de tip union compilatorul aloca automat memorie suficienta pentru a pastra cel mai mare membru al acesteia. 35 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (15/18) Uniuni Utilizate: Cand sunt necesari specificatori speciali de conversie (exemplu: utilizare union pentru a manevra bitii care formeaza o data double, pentru a-I modifica precizia sau a face anumite rotunjiri. union tip_u { int i; char ch; }; union tip_u A; Octet 0 Octet 1 Octet 2 Octet 3 ch i 36 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (16/18) Enumerari Set de constante de tip intreg care specifica toate valorile permise pe care le poate avea o variabila de acel tip. enum nume_generic { lista enumerarilor } lista_variabile; Atat numele generic al enumerarii cat si lista de variabile sunt optionale. Constanta unui element al enumerarii este fie asociata implicit, fie explicit. Implicit, primul element are asociata valoarea 0, iar pentru restul este valoarea_precedenta+1. enum {a, b, c, d}; a = 0, b = 1, c = 2, d = 3 enum {a, b, c=7, d}; a = 0, b = 1, c = 7, d = 8 enum {a=4, b=-3, c=9, d=-8}; 37 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (17/18) Enumerari Declararea unei matrice de siruri si folosirea valorii enumerarii pe post de indice. enum monede { penny, nickel, dime, quarter, jumatate_dolar, dolar }; enum monede bani; char nume[][15] = {penny, nickel, dime, quarter, jumatate_dolar, dolar}; printf(%s, nume[bani]); Codul lucreaza corect doar daca nu este initializat nici un simbol, deoarece matricea de siruri trebuie sa aiba indici incepand cu 0. 38 Facultatea de Matematica si Informatica Universitatea Bucuresti 2. Tipuri de date structurate (18/18) Specificatorul typedef Definirea explicita a noi tipuri de date. Nu se declara o variabila sau o functie de un anumit tip, ci se asociaza un nume (sinonimul) tipului de date. Sintaxa typedef <definiie tip> <identificator>; Exemple: typedef unsigned int natural ; typedef long double tablou [100] ; tablou a, b, c; natural m,n,i; 39 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (1/8) Sintaxa tablouri unidimensionale tip nume_variabila [dimensiune]; double tab [100] ; 0 1 2 3 97 98 99 tab [3] = 5.7; int a[5]; 0 1 2 3 4 a [1] = 3; char b1 [34]; 0 1 2 3 b1 [1] = &; In C, primul element are indicele 0. 0.3 -1.2 10 5.7 ... 0.2 -1.5 1 3 -12 10 7 1 A & * + ... c M # 40 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (2/8) Cantitatea de memorie necesara pentru inregistrarea unui tablou este direct proportionala cu tipul si marimea sa. tip nume [dimensiune] sizeof(nume) = sizeof (tip) * dimensiune ; 41 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (3/8) Tablouri unidimensionale liste de informatii de acelasi tip, stocate in locatii de memorie contigue in ordinea indicilor. 42 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (4/8) Aplicatie Citirea si afisarea elementelor unui tablou unidimensional 43 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (5/8) Sintaxa tablouri bidimensionale tip nume_variabila [dimensiune1][dimensiune2]; int a[3][5]; 0 1 2 0 1 2 3 4 a [1][4] = 41; 3 -12 10 7 1 10 2 0 -7 41 -3 -2 0 0 2 44 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (6/8) Cantitatea de memorie necesara pentru inregistrarea unui tablou este direct proportionala cu tipul si marimea sa. tip nume [dimensiune1][dimensiune2] sizeof(nume) = sizeof (tip) * dimensiune1 * dimensiune2 ; 45 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (7/8) Aplicatie Citirea si afisarea elementelor unui tablou biidimensional 46 Facultatea de Matematica si Informatica Universitatea Bucuresti 3. Tablouri uni- si multi- dimensionale (8/8) Tablouri bidimensionale stocarea in locatii de memorie Linia 0: adrese 2686520 2696556 Linia 1: adrese 2686560 2696596 Linia 2: adrese 2686600 2696636 47 Facultatea de Matematica si Informatica Universitatea Bucuresti 4. Discutii asupra testelor 48 Facultatea de Matematica si Informatica Universitatea Bucuresti Concluzii 1. Aprofundare operatii pe biti 2. Tipuri de date structurate struct, union, campuri de biti, enum, typedef 3. Tablouri uni si multi- dimensionale 4. Discutii asupra testelor din cursul trecut. 49 Facultatea de Matematica si Informatica Universitatea Bucuresti Perspective Cursul 5: 1. Pointeri 2. Functii 3. Clase de memorare 4. Directive de preprocesare