Sunteți pe pagina 1din 4

Laborator 9 – Structuri / Campuri de biti

Câmpuri de biți

Limbajul C oferă posibilitatea de accesare a datelor la nivel de bit sau grupuri de biți.
Este posibilă specificarea lungimii câmpurilor care aparțin structurilor sau uniunilor de biți.
Câmpurile de biți sunt de tip întreg , cu sau fără semn și pot fi accesate individual.
Declarațiile câmpurilor de biți ce pot să apară numai în interiorul structurilor și
uniunilor
tip numeopt : lungime
tip – orice tip întreg cu sau fără semn, care specifică tipul câmpului de biți
nume - identificator ce prezintă numele câmpului de biți. Acest element este
opțional. Acestea sunt reprezentate în memorie, însă nu pot fi accesate. Cu ajutorul lor se
pot rezerva biții nefolosiți dintr-o unitate de alocare.
lungime – expresie constantă de tip întreg ce specifică lungimea câmpului de biți

Să considerăm următoarea structură:


struct data{
int zi;
int luna;
int an;
};
printf("\n size:%d", sizeof(struct data));

În această formă structura ocupă în memorie 12 octeți 3x4=12 octeți.


Observăm că fiecare din cele trei câmpuri ar putea fi memorate pe mai puțin de 4 octeți.
Câmpul zi va lua valori între 1 și 31, deci ar putea fi memorat pe 5 biți 25 = 32.
Câmpul luna va lua valori între 1 și 12, ar putea fi memorat pe 4 biți 24 = 16;
Câmpul an va lua valori între 0 și 9999 deci ar putea fi reprezentat pe 14 biți 214 =16384 . dacă
vrem să adăugăm și valori negative atunci mai punem un bit de sem rezultă total 15 biți
Cele trei câmpuri necesită 5+4+15 = 24 biți, adică 3 octeți. Se observă ca inițial folosim un
spațiu de memorie de patru ori mai mare decât necesar.
struct data{
unsigned int zi:5;
unsigned int luna:4;
int an:15;
};
printf("\n size:%d", sizeof(struct data));

Dacă urmărim dimensiunea ocupată de structura redefinită ne așteptăm ca ea să fie


de 3 octeți. În practică ea este de 4 octeți. Acest lucru se întâmplă din motive de aliniere a
variabilelor în memorie. Deoarece tipul de bază al câmpurilor este int, care înseamnă 4 octeți,
structura este extinsă la multiplu de 4 octeți.
Într-o structură pot alterna câmpurile definite pe biți cu cele definite clasic.
Atenție la modificatorul unsigned. Un câmp definit pe doi biți cu modificatorul unsigned va
reține valori de la 0 la 3. Dacă nu apare modificatorul unsigned, atunci câmpul este cu semn
și va reține valori de la -2 la 1.

Inițializarea structurilor
Câmpurile structurilor statice și ale celor externe sunt inițializate implicit cu o valoare
ce depinde de tipul lor. Pentru tipurile aritmetice valoarea implicită este 0, iar pentru
pointeri este NULL.
struct student{
char nume[20];
int an_studiu, varsta;
float bursa;
}
static struct student s1;
struct student s2 = {"Victor", 3, 21};
struct student s3 = {"Marius", 4, 25, 300};
struct student s4 = {"Andrei", 4, 26, 400, 3}; //err

static struct student s1 = {NULL, 0, 0, 0, 0};


struct student s2 = {"Victor", 3, 21,0};
struct student s3 = {"Marius", 4, 25, 300};
Structuri imbricare
struct data{
int zi;
int luna;
int an;
};

struct student{
char nume[20];
int an_studiu, varsta;
float bursa;
struct data data_nasterii;
}

printf(„an:%d”, student.data_nasterii.an);

Probleme:
1. Să se optimizeze următoarea structură:
Structură care conține datele privind produsele de panificație: tip, greutate,
nr compozitie cereale (maxim 7), perioada valabilitate (maxim 3 luni), data
fabricatiei (zi, luna, an)

2. Să se modeleze reprezentarea unui număr complex și să se realizeze funcții


pentru operațiile de bază cu numere complexe (adunare, scădere, înmulțire,
conjugare, modul).
3. Se consideră că studentul Vlad este coleg cu studentul Vasile, studentul Vasile
este coleg cu studentul Adrian, studentul Adrian este coleg cu studenta Maria,
studenta Maria este colega cu studenta Bianca. Să se memoreze și să se afișeze
relațiile dintre studenți. Să se afișeze relațiile dintre studenți folosind o
instrucțiune repetitivă

4. Se citește un șir de numere întregi din fișier


Fișierul conține:
– pe primul rând numărul n de elemente ale șirului
– apoi pe al doilea rând elementele șirului separate prin spatii.
Să se afișeze elementele pare din șir.

5. Se citește următorul fișier care conține 100 de valori separate prin virgulă (CSV –
Comma Separated Values). Valorile sunt după cum urmează:
Id, nume, salar, monedă. Să se citească aceste valori într-o structură și să se
ordoneze descrescător după salar și monedă.
Obs. Pentru citirea numelui se folosește următorul specificator de format:
%99[^,] unde 99 este lungimea șirului de caractere +1.
Link fișier:
http://cti.ubm.ro/pc/files/import.csv

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