Sunteți pe pagina 1din 28

STRUCTURI DE DATE NEOMOGENE

Prof. Gabriela Conea Colegiul National, 16-05-2009

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 urmtoarele aspecte: (i) elementele unei structuri pot avea tipuri diferite, (ii) structurile pot fi atribuite, (iii) funciile pot returna structuri, (iv) elementele unui structuri nu sunt variabile anonime ci au cte un nume, (v) referirea unui element al unei structuri se realizeaz cu operatorul de selecie ( . ) i nu cu operatorul de indexare ( [ ] ).

Tipul struct
Dac dorim s prelucrm date referitoare la mai muli elevi, pentru fiecare elev trebuie s cunoatem: Numele char[20] Prenumele char[20] Nota matematic - float Nota informatic - float Vrsta - int

Tipul struct
n C++ exist un tip de date, numit struct, care permite ca fiecrui 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 inregistrare-record (Pascal)


Structura o denumim elev i este: Type elev=record Begin nume, prenume: string[20]; nota_mate, nota_info: real; varsta: integer; End;

Tipul struct
Exist dou posibiliti de declarare a variabilelor care alctuiesc structura: 1. Scriind la sfrit numele variabilelor:

struct elev { char nume[20], prenume[20]; float nota_mate, nota_info; int varsta; } inr1,inr2;
2.

Declarnd variabilele aa cum suntem obinuii: elev inr1, inr2;

Tipul struct
Definiia structurii poate fi fcut: n cadrul funciei main() naintea funciei main() (caz recomandat)
Pentru accesul la cmpurile unei variabile de tip struct se folosete operatorul de selecie direct, notat cu ., operator cu prioritate maxim.

Tipul struct
Dac inr este o variabil de tipul elev. Atunci: inr.nume reprezint irul nume al variabilei inr; inr.nume[0] - reprezint primul caracter al irului nume; inr.nota_mate reprezint cmpul nota_mate al variabilei inr.

Tipul struct
ntre dou variabile de acelai tip struct se poate folosi atribuirea. Dac inr1, inr2 sunt dou variabile de tip elev, prin atribuirea inr1=inr2, variabila inr1 ia aceeai valoare ca variabila inr2. O astfel de atribuire se mai numete copiere bit cu bit.

nregistrrile imbricate
Putem avea un tip structurat ce conine n

interiorul su un alt tip structurat. struct elev { char nume[20], prenume[20]; struct { int clasa; float note[20]; } situatie; int varsta; };

nregistrrile imbricate
Dac inr este o variabil de tipul elev. Atunci accesarea elementelor situate n interiorul structurii se face astfel: inr.situatie.clasa se acceseaz cmpul clasa al substructurii inr.situatie.note[0] se acceseaz prima not a vectorului inclus n substructur

nregistrrile imbricate
Dac avem struct elev1 { char nume[20], prenume[20]; struct { int clasa; float note[20]; } situatie_1, situatie_2; int varsta; };

nregistrrile imbricate
Tipul structurat elev1, subordoneaz structurile situatie_1 i situatie_2. Dac una sau mai multe structuri sunt incluse una n alta, acestea se numesc structuri imbricate.

Cele dou structuri sunt echivalente.

nregistrrile imbricate struct elev1


struct elev1 { char nume[20], prenume[20]; struct { int clasa; float note[20]; } situatie_1, situaie_2; int varsta; };
{ char nume[20], prenume[20]; struct { int clasa; float note[20]; } situatie_1; struct { int clasa; float note[20]; } situaie_2; int varsta; };

# <iostream.h> # include include <iostream.h> Cmpurile subordonate ar trebui s union ocupe 2,10 i 8 octei dar toate uniontest test { int a; variabilele ocup numrul de octei { int a; necesari pentru memorarea char b[10]; cmpului cel mai lung. char b[10]; double c; La un moment dat se poate memora }; double c; doar un singur cmp dintre cele main() }; subordonate. { test var; int i; main() cin>>var.c; cout<<var.c<<endl; { test var; int i; cin>>var.b; cout<<var.b; } cin>>var.c; cout<<var.c<<endl;

nregistrri cu structur variabil Variabila var este de tipul union.

cin>>var.b; cout<<var.b;
}

nregistrri cu structur variabil


Forma general a unei uniuni este: union [<numele uniunii>] { <tip> <nume variabila>; } [lista de variabile] ; La un moment dat numai un cmp poate fi ocupat. nregistrrile pot avea structur variabil.

nregistrri cu structur variabil


Uniunile pot fi incluse n structuri. Structurile pot fi incluse n uniuni. nregistrarea are structur variabil dar ocup un numr fix de octei. Citirea i afiare nregistrrii se face, de fiecare dat , sub switch, n funcie de datele citite sau coninute.

Definirea structurilor i uniunii #include<iostream.h>


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; };

main() { persoana pers; cout<<Nume persoana ; cin.get(pers.nume,30); cout<<Studii (f-fara, g-generala, l-liceu, ssuperioare); cin>>pers.studii;

Citirea prii fixe a nregistrrii

Citirea prii variabile a switch(pers.studii) nregistrrii


{ case g: cout<< numar 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; }

Afi area nregistrrii cout<<pers.nume<<endl;


switch(pers.studii) {case f: cout<<n-are saracu studii ; break; case g: cout<<numar 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<< A terminat facultatea <<pers.std.facultate.nume_f<< de <<pers.std.facultate.nr_ani<< ani ; }

Aplicatii
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. Cabinetul de informatica
In cabinetul de info din CN se afla n calculatoare

(numerotate de la 1 la n). Pentru fiecare se cunosc tipul procesorului (486, Pentium I, II, III, IV, Duron, etc), frecventa procesorului (exprimata in MHz), memoria RAM (exprimata in Mb) si capacitatea harddiscului (exprimata in MB). Realizati un program care afiseaza calculatoarele ce pot fi conectate intr-o retea sub un sistem de operare (frecventa cel putin x Mhz, memoria cel putin y Mb si capacitatea harddiscului cel putin z Mb). Ca server va fi ales un calculator cu cele mai bune performante in ordinea: frecventa, memorie, RAM. Datele se citesc din fisierul cabinet.in iar rezultatele se vor scrie in fisierul cabinet.out.

3. 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.

4. 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.

5. 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.

6. 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.

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