Sunteți pe pagina 1din 5

Tipul nregistrare

n practic apar situaii n care toate tipurile de date nvaate pn n prezent nu sunt suficiente. Considerm urmtorul exemplu: ntr-o problem trebuie s prelucrm date referitoare la mai muli elevi. Pentru fiecare elev se cunosc: Numele de tip char[25]; Media de tip float; Varsta de tip int; Adresa de tip char[50]; Se observ faptul c informaiile referitoare la un elev sunt eterogene. Pentru a putea rezolva problema cu ajutorul cunotinelor noastre de pn acum ar trebui s utilizm 4 vectori, cte unul pentru fiecare informaie.Aceasta ar necesita un volum mare de munc i foarte mult atenie n prelucrarea datelor. n C++ exist un tip de date care permite ca fiecare elev cu toate informaiile despre el sa fie tratat unitar sub forma unei asa-numite nregistrri. Forma general a acestui tip de date numit struct este: struct [nume structura] { [<tip> <nume variabila[,nume variabila,]>]; [<tip> <nume variabila[,nume variabila,]>]; }[lista de variabile]; Pentru exemplul dat structura numit elev este: struct elev { char nume[25], adresa[50]; int varsta; float media; }; Exist dou posibiliti de declarare a variabilelor de tip nregistrare(struct): 1.Imediat dup definirea structurii se scriu la sfrit numele variabilelor, astfel: struct elev { char nume[25], adresa[50]; int varsta; float media; }e1, e2, e3; 2.Dup definirea structurii variabilele se declar scriind n fa numele tipului struct definit, astfel: struct elev { char nume[25], adresa[50]; int varsta; float media; }; elev e1, e2, e3; Accesul la cmpurile unei variabile de tip struct se face prin intermediul operatorului de selectie directa, notat cu ., astfel: Fie variabila e1 de tipul elev. Atunci: -e1.nume reprezint irul de caractere care reine numele elevului; -e1.nume[0] reprezint primul caracter al irului nume; -e1.media reprezint cmpul media al variabilei e1. n programul urmtor se citete i se afieaz o variabil de tipul elev.

# include <iostream.h> void main() {struct elev { char nume[25],adresa[50]; int varsta; float media; }; elev e; cout<<"nume: ";cin.get(e.nume,25);cin.get(); cout<<"adresa: ";cin.get(e.adresa,50);cin.get(); cout<<"varsta: ";cin>>e.varsta; cout<<"media ";cin>>e.media; cout<<e.nume<<" "<<e.varsta<<" "<<e.media<<" "<<e.adresa; } Vectori de nregistrri Aa cum am vzut elementele unui vector pot fi de orice tip, deci pot fi i de tip struct. Adresarea cmpurilor se face prin numele vectorului, urmat de perechea de paranteze drepte ntre care este trecut indicele componentei, apoi selecia propriu-zis se face aa cum am nvat. Dac e este vetorul, iar nregistrarea este de tip elev, atunci numele se selecteaz prin e[i].nume, iar vrsta prin e[i].varsta. Exemplu: Se citesc datele despre elevii unei clase i anume: numele i situaia lor colara la obiectul geografie, reprezentat prin dou note, nota1 i nota2. S se ordoneze elevii n ordinea descresctoare a mediilor i s se afieze aceast situaie. # include <iostream.h> void main() {struct elev {int n1,n2; char nume[20]; float media;}; int n,i,j; elev e[30],x; cout<<"Nr. de elevi:";cin>>n; for(i=1;i<=n;i++) {cin.get();cout<<"Elevul "<<i<<endl; cout<<"nume: ";cin.get(e[i].nume,20);cin.get(); cout<<"n1: ";cin>>e[i].n1; cout<<"n2: ";cin>>e[i].n2;} for(i=1;i<=n;i++) e[i].media=(float)(e[i].n1+e[i].n2)/2; for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++) if(e[i].media<e[j].media) {x=e[i];e[i]=e[j];e[j]=x;} for(i=1;i<=n;i++) cout<<e[i].nume<<" "<<e[i].media<<endl; } nregistrri imbricate Exist situaii cnd o nregistrare poate conine cmpuri ale cror tip este la rndul lor tot nregistrare. S urmrim exemplul urmtor: Se citesc datele despre elevii unei clase i anume: numele i data naterii. S se ordoneze elevii n ordinea cresctoare dup data naterii i s se afieze aceast situaie.

# include <iostream.h> void main() {struct data { unsigned zi,luna,an; }; struct elev { char nume[20]; data datan; }; int n,i,j; elev e[30],x; cout<<"Nr. de elevi:";cin>>n; for(i=1;i<=n;i++) {cin.get();cout<<"Elevul "<<i<<endl; cout<<"nume: ";cin.get(e[i].nume,20);cin.get(); cout<<"zi: ";cin>>e[i].datan.zi; cout<<"luna: ";cin>>e[i].datan.luna; cout<<"an: ";cin>>e[i].datan.an;} for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++) if(e[i].datan.an>e[j].datan.an) {x=e[i];e[i]=e[j];e[j]=x;} else if(e[i].datan.an==e[j].datan.an) if(e[i].datan.luna>e[j].datan.luna) {x=e[i];e[i]=e[j];e[j]=x;} else if(e[i].datan.luna==e[j].datan.luna) if(e[i].datan.zi>e[j].datan.zi) {x=e[i];e[i]=e[j];e[j]=x;} for(i=1;i<=n;i++) cout<<e[i].nume<<" "<<e[i].datan.an<<" "<<e[i].datan.luna<<" "<<e[i].datan.zi<<endl; } Observm modul de adresare pentru cmpurile care formeaz data naterii e[i].datan.zi, e[i].datan.luna si e[i].datan.an.

Probleme rezolvate 1. ntr-un vector cu nregistrri se pstreaz atributele a n dreptunghiuri: lungimea , limea, aria i perimetrul. Numrul n i dimensiunile laturilor dreptunghiurilor se introduce de la tastatur. S se afieze dreptunghiul cu suprafaa cea mai mare i dreptunghiul cu perimetrul cel mai mic.
# include <iostream.h> void main() {struct drept { int lung,lat,per,aria; }; int n,i,j,k,amax,pmin; drept d[20]; cout<<"Nr. de dreptunghiuri:";cin>>n; for(i=1;i<=n;i++) {cout<<"lungimea: ";cin>>d[i].lung; cout<<"latimea: ";cin>>d[i].lat;} for(i=1;i<=n;i++) {d[i].per=2*(d[i].lung+d[i].lat); d[i].aria=d[i].lung*d[i].lat;}

amax=d[1].aria;j=1; pmin=d[1].per;k=1; for(i=2;i<=n;i++) {if (d[i].aria>amax) {amax=d[i].aria;j=i;} if (d[i].per<pmin) {pmin=d[i].per;k=i; } } cout<<"dreptunghiul cu aria maxima este "<<j<<" si are "<<d[j].lung<<"si latimea "<<d[j].lat; cout<<"dreptunghiul cu perimetrul minim este "<<k<<" si are "<<d[k].lung<<"si latimea "<<d[k].lat; }

lungimea lungimea

2. ntr-un vector de nregistrri se pstreaz atributele a n puncte. Atributele punctului sunt coordonatele i cadranul n care se gsete. Numrul n i coordonatele punctelor se introduce de la tastatur. S se afieze punctele grupate dup cadran. # include <iostream.h> void main() {struct punct { float x,y; int cadran; }; int n,i,j; punct p[20]; cout<<"Nr. de puncte:";cin>>n; for(i=1;i<=n;i++) {cout<<"abscisa: ";cin>>p[i].x; cout<<"ordonata: ";cin>>p[i].y; if(p[i].x>=0 && p[i].y>=0) p[i].cadran=1; else if(p[i].x<=0 && p[i].y>=0) p[i].cadran=2; else if(p[i].x<=0 && p[i].y<=0) p[i].cadran=3; else if(p[i].x>=0 && p[i].y<=0) p[i].cadran=4;} for(j=1;j<=4;j++) {cout<<endl<<"cadranul "<<j<<endl; for(i=1;i<=n;i++) if(p[i].cadran==j) cout<<p[i].x<<" "<<p[i].y<<endl;} }

Probleme propuse
1) Elevii dintr-o coal vor s fac un top al celor mai bune 10 melodii pentru fiecare sptmn. Ajutai-i s realizeze
un program prin care se introduc n date de forma titlu melodie, interpret, numr puncte acumulate, numr puncte primite i care afieaz primele 10 titluri, n ordinea descresctoare a punctelor.

2)

S se realizeze un program care citete de la tastatur n nregistrri, pentru elevii unei clase, cu structura: nume, prenume, medie. S se afieze elevii n ordine alfabetic i s se calculeze media general a clasei.

3) Dintr-un lot de n persoane care s-au nregistrat cu nume i data naterii, trebuie selectate acele persoane care au
mplinit 18 ani la 1 ianuarie 2006. Datele de intrare cuprind valoarea lui n i cele n perechi de date de forma nume yy mm dd i sunt coninute de fiierul date.int, iar datele de ieire conin numele cerute afiate pe vertical pe ecran. 4) La o staie meteo se trec datele n fiierul temp.int sub forma data temperatura. S se prelucreze aceste date afindu-se zilele n care temperatura a fost maxim. 5) ntr-o clas de maxim 25 de elevi, fiecare a primit cte unul din calificativele suficient, bine i foarte bine la fiecare din cele 10 materii. Datele se introduc n calculator sub forma: nume elev numr de calificative suficient numr de calificative bine numr de calificative foarte bine. S se afieze n ordine descresctoare statistica notrii (numrul de suficient, de bine i foarte bine) i numele elevului cu cele mai multe calificative fb.

6)

Pentru evidena medicamentelor dintr-un depozit, sunt necesare urmtoarele informaii: codul medicamentului, denumirea i preul medicamentului. Presupunnd c n depozit exist n medicamente i c datele acestora sunt

cunoscute, se cere: s se testeze dac medicamentul cu denumirea dat d exist n depozit afindu-se un mesaj corespunztor, apoi s se mreasc cu p% preurile tuturor medicamentelor, tiprindu-se medicamentele cu noile preuri. Procentul p este: - 5, dac produsul are codul mai mic dect 1000; - 10, n caz contrar. 7) Rezultatele obinute de elevii de liceu la Bacalaureat se gsesc n fiierul "bac.in", care conine pe primul rnd numrul n de elevi, apoi, pe fiecare din urmtoarele n rnduri, media la bacalaureat i numele unui elev, n aceast ordine separate printr-un spaiu. Creai fiierul "bac.out" care conine elevii din fiierul "bac.in" n ordinea descresctoare a mediilor (n acelai format ca i cel din fiierul de intrare), apoi tiprii pe ecran: numrul elevilor cu media sub 5, numrul elevilor cu media ntre 5 i 7, i numrul elevilor cu media peste 7.

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