Structuri+neomogene

Lectia 1
**Studiu de caz**: fie o linie dintr-un tabel Cum se stocheaza in memoria unui calculator o linie a unui tabel? R: folosind o //**structura de date**//, ce poate stoca date diferite
 * ~ Nume ||~ Prenume  ||~ Clasa ||~ telefon ||~ adresa ||~ varsta ||
 * Ionescu || Maria || 4 || 0747321234 || florilor 3 || 10 ||
 * Popescu || Ana || 5 || 0797323234 || florilor 4 || 12 ||
 * > Vasilescu ||> Maria ||> 9 ||> 0748321234 ||> florilor 5 ||> 14 ||

Aceasta structura poarta numele de //**inregistrare**//

Dupa cum se poate observa, o inregistrare //**are mai multe componente**//, componente ce poarta numele de **//campuri//,** fiecare componenta fiind de alt tip,

O //**inregistrare**// poate primi un nume care sa defineasca intreaga inregistrare. In exemplul nostru, am putea alege numele “elev” deoarece toate campurile definesc in totalitatea lor “proprietatile” unui elev. ** Definitie :** //**O structură este un ansamblu format din una sau mai multe** **__date__ de tipuri diferite** **grupate împreună sub un singur nume.**// **__Datele__** pot fi: //-Date elementare//: numerice, caracter(int, long, float, char, double) Ex: varsta unui elev poate fi un numar intreg, inatimea, un numar real; //-Structuri de date:// vectorii numerici, siruri de caractere (structuri omogene), si inregistrarile (structuri neomogene) Ex: numele unui elev este un sir de caractere, notele unui elev pot fi stocate intr-un vector numeric, __//Structurile se deosebesc de tablouri//__ prin următoarele aspecte: (i) elementele unei structuri pot avea tipuri diferite, (ii) structurile pot fi atribuite, (iii)funcţiile pot returna structuri, (iv) elementele unui structuri nu sunt variabile anonime ci au câte un nume, (v) referirea unui element al unei structuri se realizează cu operatorul de selecţie ( . ) şi nu cu operatorul de indexare ( [ ] ). ** Forma generala a unei structuri ** struct[numestructura] { [ ]; [ ]; … } [lista de variabile];

__//FORMA 1 DE DECLARARE//__ definirea structurii este separata de declararea variabilelor separat definite //struct elev{ // // char nume[20], prenume[20]; // // float nota_mate,nota_info; // // int varsta; // // }; // // elev x,y; //
 * Definitia structurii **

__//FORMA 2 DE DECLARARE//__ struct elev{  char nume[20], prenume[20];  float nota_mate, nota_info;  intvarsta;  } x, y;

__//FORMA 3 DE DECLARARE//__ structura nu are definit un nume, nu veti putea defini ulterior o alta variabila de memorie cu acest tip; singurele variabile definite sunt x si y. struct {  char nume[20], prenume[20]; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> float nota_mate, nota_info; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> intvarsta; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> } x, y;

** Accesarea campurilor ** Fiind data o structura elev definita astfel: <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;">struct elev{ <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> char nume [20], prenume[20]; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> float nota_mate,nota_info; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> int varsta; <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> } popescu;

Vom accesa elementele inregistrarii, folosind operatorul de acesare directa “.”; Astfel vom avea: __**Observatii:**__
 * **popescu.nume** reprezinta campul nume al variabilei popescu
 * **popescu.nume[0]** reprezinta primul caracter din nume
 * **popescu.nota_mate** reprezinta nota la mate a lui popescu
 * Între două variabile de acelaşi tip struct se poate folosi atribuirea.
 * Dacă inr1, inr2 sunt două variabile de tip elev, prin atribuirea inr1=inr2, variabila inr1 ia aceeaşi valoare ca variabila inr2.
 * O astfel de atribuire se mai numeşte copiere bit cu bit.

<span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;">#include using namespace std; struct elev{ char nume [20], prenume[20]; float nota_mate,nota_info; int varsta; }; main{ elev inr; cout<“Nume “;cin.get(inr.nume,20**);** **cin.get;** <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;"> cout<<“prenume “;cin.get(inr.prenume,20); cout<<“nota mate”;cin>>inr.nota_mate; cout<<“nota info”;cin>>inr.nota_info; cout<<“varsta”;cin>>inr.varsta; cout<<“Am citit:”<<endl<< inr.nume<< “ ”<<inr.prenume<<endl<< inr.nota_mate<<endl; cout<< inr.nota_info<<endl<< inr.varsta; }
 * Exemplul1**: Se citeste si se afiseaza o variabila de tip elev

**Tema** Cititi o variabila cu urmatoarea structura:
 * Nume_elev: 30 caractere
 * Zi: intreg;
 * Luna : intreg
 * An: intreg
 * Nota mate real
 * Nota info real
 * Nota engleza real
 * Media real
 * OBS!!!!: Media se calculeaza nu se citeste**

Lectia 2
In unele cazuri, unul dintre campurile inregistrarii poate fi si el, la randul lui de tip inregistrare. **Exemplu- Sa consideram o inregistrare care trebuie sa contina urmatoarele campuri:nume, pren, data_n si salariu, unde data_n este tot de tip inregistrare.** __//**Varianta 1:**//__ struct **data**{ int zi,luna,an;} struct **persoana**{ char nume[30],prenume[30]; data data_n;} struct **persoana**{ char nume[30],prenume[30]; //struct{int zi,an,luna} data_n;// }; Exemplu de accesarea campurilor: persoana p; //se declara variabila p de tip persoana p.nume - campul nume din structura persoana p.data_n.an - campul an din data nasterii p.data_n.luna - campul luna din data nasterii p.data_n.zi - campul zi din data nasterii
 * //__Varianta 2:__//**
 * Problema**: Se citesc de la tastatura coordonatele a doua segmente care reprezinta laturile unui dreptunghi(latimea,lungimea). Sa i se calculeze diagonala.

Lectia 3
**Problema 1:** Fie urmatoarea structura: Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine a alfabetica a numelui, fiecare inregistrare pe cate o linie: Ex: n=2 Ionescu 1.62 70 Antonescu 1.72 80 Se vorafisa: Antonescu 1.72 80 Ionescu 1.62 70 __Rezolvare__ <span style="font-family: 'Comic Sans MS',cursive; vertical-align: baseline;">#include using namespace std; structelev{ char nume[31]; float h; int g;} v[10],aux; int main{ intn,i,j,x; ifstream fin("date.in"); ofstreamfout("date.out"); fin>>n; for(i=0; i<n; i++){ fin>>v[i].nume; fin>>v[i].h; fin>>v[i].g; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++){ x=strcmp(v[i].nume,v[j].nume); if(x>0) { aux=v[i]; v[i]=v[j]; v[j]=aux; } } for(i=0;i<n;i++){ fout<<v[i].nume<<" "<<v[i].h<<" "<<v[i].g<<endl; } return 0; } **Problema 2:** Fie urmatoarea structura: Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul inaltime, fiecare inregistrare pe cate o linie: Ex: n=2 IonescuVlad 1.62 70 AntonescuCiprian 1.72 80 Se vorafisa: AntonescuCiprian 1.72 80 IonescuVlad 1.62 70 **Problema 3:** Fie urmatoarea structura: Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul medie, fiecare inregistrare pe cate o linie: Ex: n=2 AntonescuCiprian 8.50 8 9 IonescuVlad 9.50 10 9
 * Vectori de inregistrari**
 * Nume: 30 caractere
 * Inaltime: numar real
 * Greutate: numar intreg
 * 1) include<string.h>//cstring
 * Nume: 30 caractere
 * Prenume: 30 caractere
 * Inaltime: numar real
 * Greutate: numar intreg
 * Nume: 30 caractere
 * Prenume: 30 caractere
 * medie: numar real
 * Nota1,nota2: numere intregi

Se vorafisa: IonescuVlad 9.50 10 9 AntonescuCiprian 8.50 8 9

MATERIALE: -Structuri