STRUCTURI DE DATE NEOMOGENE

Download Report

Transcript STRUCTURI DE DATE NEOMOGENE

STRUCTURI DE
DATE NEOMOGENE
Prezentare adaptata
Structuri
 O structură este un ansamblu format din una sau mai




multe variabile grupate împreună sub un singur nume.
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 ( [ ] ).
Tipul struct
Exemplu: Dacă dorim să prelucrăm date
referitoare la mai mulţi elevi, pentru
fiecare elev trebuie să cunoaştem:
 Numele – char[20]
 Prenumele – char[20]
 Nota matematică - float
 Nota informatică - float
 Vârsta - int
Tipul struct
În C++ există un tip de date, numit struct,
care permite ca fiecărui elev să-i
corespundă o singură înregistrare.
Forma generală este:
struct [nume structura]
{
[<tip> <nume variabila [, nume variabila, ……]>];
[<tip> <nume variabila [, nume variabila, ……]>];
…
} [lista de variabile];
Tipul struct (C++)
Structura o denumim elev şi este:
struct elev
{ char nume[20], prenume[20];
float nota_mate, nota_info;
int varsta;
};
Tipul struct
Există două posibilităţi de declarare a variabilelor care
alcătuiesc structura:
1.
Scriind la sfârşit numele variabilelor:
struct elev
{ char nume[20], prenume[20];
float nota_mate, nota_info;
int varsta;
} e1,e2;
2.
Declarând variabilele aşa cum suntem obişnuiţi:
elev e1, e2;
Tipul struct
Definiţia structurii poate fi făcută:
 În cadrul funcţiei main()
 Înaintea funcţiei main()
(caz recomandat)
Pentru accesul la câmpurile unei variabile
de tip struct se foloseşte operatorul de
selecţie directă, notat cu ‘.’, operator cu
prioritate maximă.
Tipul struct
Fie e o variabilă de tipul elev. Atunci:
 e.nume – reprezintă şirul nume al
variabilei inr;
 e.nume[0] - reprezintă primul caracter al
şirului nume;
 e.nota_mate – reprezintă câmpul
nota_mate al variabilei inr.
Tipul struct
Între două variabile de acelaşi tip struct se
poate folosi atribuirea.
Dacă e1, e2 sunt două variabile de tip elev,
prin atribuirea e1=e2, variabila inr1 ia
aceeaşi valoare ca variabila inr2.
O astfel de atribuire se mai numeşte
copiere bit cu bit.
Exemplu
 Se considera tipul elev descris mai sus.
 Sa se citeasca 2 variabile de tip elev,
numite e1 si e2, folosind o functie de
citire cu tipul elev;
 Sa se afiseze variabiele folosind o
functie de afisare de tip void;
 Sa se ordoneze variabilele e1 si e2 in
functie de nume.
Functia de citire:
elev citire()
{elev e;
cout<<"nume=";cin>>e.nume;
cout<<"prenume=";cin>>e.prenume;
cout<<"nota mate=";cin>>e.nota_mate;
cout<<"nota info=";cin>>e.nota_info;
cout<<"varsta=";cin>>e.varsta;
return e;
}
Functia de afisare:
void afisare(elev e)
{cout<<e.nume<<" "<<e.prenume;
cout<<" are "<<e.nota_mate<<" la mate si ";
cout<<e.nota_info<<" la info "<<endl;
}
Functia main:
int main()
{elev e1,e2,aux;
e1=citire(); e2=citire();
system("cls");
cout<<"In ordinea citirii:";
afisare(e1); afisare(e2);
if(strcmp(e1.nume,e2.nume)>0)
aux=e1,e1=e2,e2=aux;
cout<<"\n\nIn ordine lexicografica:";
afisare(e1); afisare(e2);
}
Aplicatii
 In majoritatea aplicatiilor se folosesc vectori de
structuri (vectori cu tipul de baza struct);
 Acest lucru nu contravine caracteristicii
vectorului – variabila structurata omogena –
deoarece elementele sale au toate acelasi tip,
desi fiecare element este o variabila structurata
neomogena;
 Declararea unui vector de structuri:
<nume_struct> <nume_vector>[<dimensiune>]
Exemplu
 Sa se citeasca si sa se afiseze
informatiile considerate in exemplul
anterior pentru toti elevii unei clase.
Aceste informatii se retin intr-un vector
de structuri.
Declararea vectorului:
elev clasa[35];
Exemplu
 Citirea (folosind functia descrisa anterior):
void citire_clasa(elev clasa[35], int &n)
{int i;
cout<<"Numarul de elevi:";cin>>n;
for(i=0;i<n;i++)
clasa[i]=citire();
}
Exemplu
 Afisarea (folosind functia descrisa anterior):
void afisare_clasa(elev clasa[35], int n)
{int i;
cout<<"Elevii clasei:\n";
for(i=0;i<n;i++)
afisare(clasa[i]);
}
1. Agenda
 Se citesc din fisierul de intrare agenda.in un
numar natural (n<200), apoi numarul de telefon
si numele a n persoane. Programul va crea o
agenda telefonica in care va retine informatiile
citite in ordinea alfabetica a numelor
persoanelor. Dupa crearea agendei telefonice,
se va citi de la tastatura numele unei persoane.
Daca persoana e gasita atunci se va afisa in
fisierul de iesire agenda.out numarul sau de
telefon altfel mesaj de eroare.
2. Elevi
 Se considera o lista formata din date referitoare
la n elevi. Fiecarui elev i se cunoaste numele si
prenumele, media notelor de la oral la disciplina
Informatica si nota la teza. Realizati un program
care afiseaza pentru fiecare litera a alfabetului
numele si prenumle elevului care a obtinut cea
mai mare medie dintre cei a caror nume de
familie incepe cu acea litera. Datele de intrare
se citesc din fisierul elevi.in iar rezultatele se
scriu in fisierul elevi.out.
3. Intervale
 Se considera n intervale inchise [a,b], a
si b fiind numere intregi. Determinati
reuniunea acestora.
 Datele de intrare se citesc din fisierul
intervale.in iar rezultatul in fisierul
intervale.out.
4. Fractii
 Se considera un sir de n fractii identificate prin
numarator si numitor. Datele de inrare se citesc
din fisierul fractii.in.
 Sa se stearga din sir toate fractiile ireductibile.
 Fractiile reductibile vor fi afisate in fisierul
fractii.out in ordinea crescatoare a valorilor. In
fisierul in. txt se va citi de pe fiecare linie
perechea: numarator, numitor. Fractiile rezultate
vor fi afisate in acelasi format in fisierul text
out.txt.
5. Puncte
 Se considera un sir de n puncte in plan,
pentru fiecare cunoscindu-se
coordonatele intregi (x,y).
 Datele de inrare se citesc din fisierul
puncte.in.
 Realizati un program care determina si
afiseaza in fisierul de iesire puncte.out
numarul maxim de puncte coliniare
situate pe o dreapta paralela cu axa OX.