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.