Documente Academic
Documente Profesional
Documente Cultură
▪ Tablouri
▪ Structuri
___________________
▪ Campuri de biti
▪ Uniuni
▪ Enumerari
E permis accesul la mai putini biti decat are tipul de date => putem stoca mai
comprimat campurile unei structuri (dar mereu pe minim n octeti).
Sintaxa:
struct nume_tip_complex_date {
tip_camp_1 nume_camp_1:lungime_1;
tip_camp_2 nume_camp_2:lungime_2;
---------------------------------
tip_camp_n nume_camp_n:lungime_n;
} lista_variabile_de acest_tip;
struct nume_tip_complex_date {
tip_camp_1 nume_camp_1:lungime_1;
tip_camp_2 nume_camp_2:lungime_2;
---------------------------------
tip_camp_n nume_camp_n:lungime_n;
} lista_variabile_de acest_tip;
Observatii:
- tipul campului de biti poate fi doar: int, long int, short int , unsigned sau
signed.
- lungime_x → numarul de biti dintr-un camp.
- campul de biti cu lungimea =1 → unsigned (un singur bit nu poate avea semn)
- unele compilatoare permit campuri de biti→ doar unsigned.
Campuri de biti
Exemplu: O carte de joc poate sa fie caracterizata ca tip complex de date prin
valoare (2-14) si culoare (exista 4 culori)
struct CarteJoc {
unsigned short int valoare; //2 octeti = 2*8 biti
unsigned short int culoare; // 2 octeti = 2*8 biti
};
struct CarteJoc {
unsigned short int valoare : 4; // 4 biti
unsigned short int culoare : 2; // 2 biti
};
=>salvez spatiu
struct Angajat {
/*struct*/ Adresa adr;
float salariu;
unsigned short int ore_zi: 1; // part time sau full time
unsigned short int impozit: 7; // procent x% din salariu (0-100)
};
//in loc de 2x 2 = 4 octeti pentru cele 2 campuri short int = > ocupam doar 2 octeti
//Pot sa mai reduc dimensiunea?
Campuri de biti
Cum puteti reprezenta cat mai comprimat tipul de date piesa puzzle daca o piesa
are urmatoarele caracteristici:
- tip intre 0 si 2 : colt, muchie, interior;
- material: carton sau plastic
- id: intre 0 si nr_max piese care este 56
struct Piesa {
unsigned short int tip: 2;
unsigned short int material: 1;
unsigned short int id: 6;
};
//in loc de 3x 2 = 6 octeti pentru cele 3 capuri int = > ocupam doar 3 octeti
Campuri de biti
struct Piesa {
unsigned int tip: 2;
unsigned int material: 1;
unsigned int id: 6;
};
Valorile mai mari
decat domeniul
//main campului de biti sunt
reprezentate cu
Piesa p;
pierdere de informatie
p.material = 5; (restul impartirii la
1
cout<<p.material<<endl; 2^x) si conversie la
tipul precizat.
p.material = 7;
cout<<p.material<<endl; 1
p.material = 6;
cout<<p.material<<endl; 0
Uniuni
- tip special de structura ai carei membri/campuri folosesc, la momente
diferite de timp, aceeasi locatie in memorie.
- ocupa spatiu cat cel mai mare camp: max(sizeof(tip_camp_i)).
- campurile unei uniuni au, de obicei, tipuri diferite
Sintaxa:
union nume_uniune{
tip_camp_1 nume_camp_1;
tip_camp_2 nume_camp_2 ;
---------------------------------
tip_camp_n nume_camp_n:
} lista_variabile_tip_union;
Uniuni
raspuns_numeric
union raspuns_grila{
int raspuns_numeric; Octet 1 Octet 2 Octet 3 Octet 4
char raspuns_caracter;
};
raspuns_caracter
In C++ union poate sa lipseasca
union raspuns_grila r1,r2; din fata numelui uniunii atunci
r1.raspuns_numeric=4; cand ma refer la un tip de date
r2.raspuns_caracter=‘a’;
cout<<r1.raspuns_numeric << “ si “<< r2.raspuns_caracter<<endl; //4 si a
r1.raspuns_caracter=‘b’;
//la aceasta atribuire am pierdut informatia -4 – stocata in raspuns numeric
cout<<r1.raspuns_caracter; //b
cout<<r1.raspuns_numeric;// o valoare fara insemnatate, 4 a fost pierdut
O variabila de tip union ocupa memorie suficienta pentru a stoca cel mai mare
camp (in cazul de mai sus max(sizeof(char), sizeof(int)) ).
Uniuni
nume
union Tara{
char *nume; Octet 1 Octet 2 Octet 3 Octet 4
char cod[3];
};
cod
//main
Tara t;
t.nume=(char*)malloc(sizeof(char)*(strlen(“O tara”)+1));
strcpy(t.nume, “O tara”);
cout<<t.nume<<endl; Implementati o functie
//Cum se incarca memoria? care initializeaza valoarea
stocata intr-o variabila de
strcpy(t.cod,”OT”); tip tara cu date citite de
//Dar acum? Cum arata memoria? la tastatura.
//Avem vreo problema?
//Da - “memory leak”
➢ atat numele enumerarii cat si lista de variabile sunt optionale – dar nu simultan
➢ constanta intreaga asociata unui element al enumerarii e fie implicit, fie explicit
specificata
Sintaxa:
enum nume_tip {
lista constante (enumerare)
} lista variabile;
Enumerari
enum zile_sapt{
luni=1,marti,miercuri,joi,vineri,sambata,duminica
}azi, maine;
azi = joi; //o variabila de tip enumerare poate lua orice valoare enumerata.
cout<<azi<<endl; //4
maine=(zile_sapt)(azi+1); // maine=(zile_sapt)5;
cout<<maine<<endl; //5
cout<<duminica<<endl;//7
//fiind de tip int se pot folosi ca indici in tablouri
#include <iostream> int main(){
enum stare starea_vremii;
using namespace std;
//Presupunem ca lucram la Agentia Nationala de Meteorologie starea_vremii = canicula;
//Urmatoarele stari pot descrie diferite conditii atmosferice posibile. avertizari(starea_vremii);
Sintaxa:
typedef <definitie_tip> <nume_nou>;
Exemple:
typedef unsigned int nr_natural;
nr_natural m,n,i;
typedef struct {
double re, im;
} nr_complex; //special utila in C ca sa nu ma refer la structura prin struct complex
nr_complex nr;
nr.re=nr.im=1;
cout<<nr.re<<“ "<<nr.im;
C10: Tipuri structurate de date
Definiti tipul de date student. Un student are nume, CNP, grupa, note luate la
materiile de pe semestrul 1: Analiza, Algebra, Fizica, Programare, Engleza.
struct Student{
char *nume;
char CNP[14];
Grupa gr;
int note[5]; // putem folosi indici de tip Materie
};
void citesc(Student &s){
cout<<"Dati numele: "<<endl;
char aux[100];
cin>>aux;
int l = strlen(aux);
s.nume = (char*)malloc(sizeof(char) * (l+1));
strcpy( s.nume, aux);
int g;
cout<<"Dati grupa (intre 1 si 4): "<<endl; cin>>g;
s.gr = (Grupa) g;
strcpy(s.CNP, s1.CNP);
s.gr = s1.gr;
Student *vec_actualizat;
vec_actualizat =(Student*)malloc(sizeof(Student)*(n-nr_retrasi));
int cati_au_ramas=0;
for (int i=0; i<n; i++)
if (s_aRetras(vec[i], CNP_retrasi, nr_retrasi) == false ) {
initializeaza(vec_actualizat[cati_au_ramas],vec[i]);
cati_au_ramas++;
}