Sunteți pe pagina 1din 14

Tipul

Inregistrare
Prof. Daniela Stratulat

1. Notiuni Introductive
In practica, apar situatii in care toate tipurile de date
invatate pana in prezent nu ne sunt de mare folos. Pentru a
intelege aceasta vom porni de la un exemplu. Presupunem ca
dorim sa prelucram date referitoare la mai multi elevi. Pentru
fiecare elev cunoastem:

1.
2.
3.
4.
5.

Numele- char[20] ;
Prenume- char[20] ;
Nota matematica- float ;
Nota informatica- float ;
Varsta- int ;

Observati faptul ca informatiile referitoare la un elev sunt


eterogene, siruri de caractere, reale, intregi. Cum am putea
rezolva problema prin utilizarea cunostintelor de care dispunem?

Ar fi necesari 5 vectori, cate unul pentru fiecare informatie.


Astfel am avea 2 vectori cu elemente de baza, siruri de caractere
pentru nume si prenume, 2 vectori cu elemente de baza de tip float,
pentru note si unul cu elemente de baza de tip int pentru varsta. Fiecarui
elev i, i corespund componentele i ale fiecarui vector. O astfel de abordere
este greoaie, nenaturala. Ar fi cu mult mai bine daca limbajul ar dispune
de un mecanism prin care fiecarui elev sa-i corespunda o singura
inregistrare.
In C++ exista un tip de date, numit struct care permite aceasta.
Forma generala este:
struct [nume structura]
{
[<tip> <nume variabila[, nume variabila, ]>];
[<tip> <nume variabila[, nume variabila, ]>];

} [lista de variabile];
Pentru exemplul dat, structura este:

struct elev
{char nume[20], prenume[20];
float nota_mate,nota_info;
int varsta ;
};
si se numeste elev.

Exista 2 posibilitati de declarare a variabilelor care


alcatuiesc structura.
1. Asa cum rezulta din forma generala, scriind la
variabilelor.
struct elev
{char nume[20], prenume[20];
float nota_mate, nota_info;
int varsta;
}inr1,inr2;
Aici, inr1, inr2, sunt 2 variabile de tipul elev.

sfarsit numele

2. Clasic, declarand variabilele asa cum suntem obisnuiti:


elev inr1, inr 2;
Intre 2 variabile de acelasi tip struct se poate folosi atribuirea. Astfel,
daca inr1, inr2 sunt 2 variabile de tip elev, prin atribuirea inr1=inr2
variabila inr1 ia aceasi valoare ca inr2. In C++ o astfel de atribuire se mai
numeste copiere bit cu bit.
Accesul la campurile structurii se face cu operatorul de selectie directa,
notat .
Exemplu:
inr.nume - reprezinta sirul nume al variabilei inr;
inr.nume[0] - reprezinta primul caracter al sirului nume;
inr.nota_mate - reprezinta campul nota_mate al variabilei inr.

Programul urmator citeste si tipareste o variabila de tipul elev


#include<iostream>
using namespace std;
struct elev
{ char nume[20], prenume[20];
float notamate, notainfo;
int varsta;
};
int main()
{ elev a[30];
int i,n;
cout<<"introduceti numarul de elevi"; cin>>n;
for(i=1; i<=n; i++)
{ cout<<"nume "; cin>>a[i].nume;
cout<<"prenume "; cin>>a[i].prenume;
cout<<"nota la matematica "; cin>>a[i].notamate;
cout<<"nota la informatica "; cin>>a[i].notainfo;
cout<<"varsta "; cin>>a[i].varsta;
}
cout<<"am citit:"<<endl;
for(i=1; i<=n; i++)
cout<<a[i].nume<<" "<<a[i].prenume <<endl
<<a[i].notamate<<" "<<a[i].notainfo<<endl
<<a[i].varsta<<endl;

Aplicatie:
Referitor la fiecare elev din clasa XI I se cunosc
numele si nota obtinuta la testul de informatica.
Scrieti un program care sa citeasca de la tastatura
numarul n de elevi din clasa XI I impreuna cu
informatiile referitoare la acestia si sa se afiseze:

a) media generala obtinuta la test;


b) nota maxima precum si numele elevilor care
au obtinut nota maxima;
c) notele elevilor in ordine descrescatoare;
d) numele elevilor in ordine alfabetica, care au
obtinut la test o nota mai mica decat 5; se
afiseaza si notele;

Tema
Pentru fiecare produs dintr-un depozit
se cunosc numele, cantitatea disponibila si
pretul de vanzare. Scrieti un program care
sa citeasca de la tastatura numarul n<100
de produse disponibile, impreuna cu
informatiile referitoare la acestea si un alt
numar natural k<n. Sa se afiseze numele
si pretul pentru primele k produse, in
ordinea crescatoare a pretului. (pentru 2
produse cu acelasi pret vor fi ordonate
crescator dupa nume)

2. Inregistrari imbricate
Exista situatii cand un tip structurat contine in interiorul sau
un alt tip structurat. Priviti tipul urmator:
struct elev
{char nume[20], prenume[20];
struct
{int clasa ;
float note[20];
}situatie;
int varsta;
};
Structura de baza este elev. In interiorul sau se gaseste o alta
structura, de aceasta data fara nume, dar pentru care exista declarata
o variabila numita situatie.In realitate nu este vorba de o variabila, ci
de un nume prin intermediul caruia poate fi accesat un element al
structurii. Am vazut ca, in general, elementele structurii se acceseaza
prin numele variabilei de tipul structurii respective.

Exemplu:
Fie inr o inregistrare de tipul elev. In
aceste conditii accesarea elementelor situate
in interiorul substructurii se face ca mai jos:
inr.situatie.clasa se acceseaza campul
clasa al substructurii;
inr.situatie.note[0] - se acceseaza prima
nota a vectorului inclus in substructura.

3. Inregistrari cu structura
variabila
Pentru inceput, vom studia un tip aparte de
structurata, numit union. Analizati programul urmator:
#include<iostream>
using namespace std;
union test
{
int a;
char b[10];
double c;
};
int main()
{
test var;
cin >>var.c; cout<<var.c<<endl;
cin >>var.b; cout<<var.b;
return 0;
}

data

Variabila var este de tipul union. Ea contine un intreg,


un vector de caractere si o variabila reala. Cele 3
campuri subordonate ocupa respectiv 2 octeti, 10
octeti, si 8 octeti. In realitate, pentru toate variabilele
s-au retinut 10 octeti -adica octetii necesari pentru a
memora campul cel mai lung. Aceasta inseamna ca, la
un moment dat, se poate memora doar un singur camp
din cele subordonate. In exemplu, am utilizat la inceput
variabila intreaga, apoi sirul de caractere.
Iata forma generala a unei uniuni:
union [<numele uniunii>]
{
<tip> <nume variabila> ;

}[lista de variabile] ;
Cu exceptia faptului ca numai un camp poate fi ocupat la un
moment dat, toate celelalte reguli sunt identice cu cele de la
structuri. Bine, veti intreba, dar la ce folosesc uniunile?
Sunt situatii in care inregistrarile nu au format fix, ci
variabil.

Exemplu:

Ne intereseaza o situatie referitoare la studiile unei persoane. O astfel


de inregistrare are o parte fixa (campuri care retin numele, varsta si
tipul de studii). O persoana poate sa nu aiba studii, caz in care nu e
necesar sa retinem alte informatii, poate avea cateva clase de scoala
generala (putem retine nr. de clase), poate sa fi terminat liceul (retinem
anul absolvirii si orasul), poate avea studii superioare (retinem numele
facultatii, nr. de ani de studiu). In concluzie, in functie de tipul de studii,
inregistrarea arata altfel.

Observatie : uniunea poate figura oriunde in


interiorul structurii nu este obligatoriu ca
aceasta sa fie scrisa la sfarsitul structurii.
In exemplul nostru inregistrarea are o parte fixa care este alcatuita din
numele persoanei si o variabila de tip char numita studii care retine
tipul de studii: f nu are studii
g cateva clase de scoala generala
l liceu
s studii superioare
Partea variabila este o uniune. Aceasta contine o variabila nr_clase
pentru cazul in care studii retine g , o structura pentru cazul in care
studii retine l , s.a.m.d.
Inregistrarea are deci structura variabile , dar ocupa un numar
fix de octeti.

#include<iostream>
using namespace std;
struct persoana
{char nume[30], studii;
union { int nr_clase;
struct { int an_t;
char oras[20];
} liceu;
struct { char nume_f[30];
int nr_ani;
} facultate;
} std;
};
Int main()
{ persoana pers;
cout<<nume persoana ; cin.get(pers.nume,30);
cout<<Studii (f-fara studii, g-generala, l-liceu, s-superioare) ;
cin>>pers.studii;
switch (pers.studii)
{
case g: cout<<nr. clase;
cin>>pers.std.nr_clase;
break;

case l: cout <<anul terminarii liceului ;


cin>>pers.std.liceu.an_t;
cout<<orasul ;
cin>>pers.std.liceu.oras;
break;
case s: cout<<numele facultatii ; cin.get();
cin.get(pers.std.facultate.nume_f,30);
cout<<nr ani de studiu;
cin>>pers.std.facultate.nr_ani;

// afisez inregistrarea
cout<<pers.nume<<endl;
switch (pers.studii)
{ case f: cout<<n-are saracu studii; break;
case g: cout<<nr clase<<pers.std.nr_clase; break;
case l: cout<<a terminat liceul in <<pers.std.liceu.an_t<<
<<in orasul <<pers.std.liceu.oras; break;
case s: cout<<numele facultatii <<pers.std.facultate.nume_f<<
<<nr ani de studiu <<pers.std.facultate.nr_ani;
}
return 0;
}

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