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

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 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ă 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;
} inr1,inr2;
2. Declarând variabilele aşa cum suntem obişnuiţi:
elev inr1, inr2;
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

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ă câmpul
nota_mate al variabilei inr.
Tipul struct

Î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.
Înregistrările imbricate
 Putem avea un tip structurat ce conţine în
interiorul său un alt tip structurat.
struct elev
{ char nume[20], prenume[20];
struct
{ int clasa;
float note[20];
} situatie;
int varsta;
};
Înregistrările imbricate

Dacă inr este o variabilă de tipul elev.


Atunci accesarea elementelor situate în
interiorul structurii se face astfel:
 inr.situatie.clasa – se accesează câmpul
clasa al substructurii
 inr.situatie.note[0] – se accesează prima
notă a vectorului inclus în substructură
Înregistrările imbricate

Dacă avem
struct elev1
{ char nume[20], prenume[20];
struct
{ int clasa;
float note[20];
} situatie_1, situatie_2;
int varsta;
};
Înregistrările 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.
Înregistrările imbricate
struct elev1
Cele două structuri sunt echivalente.
{ char nume[20],
struct elev1 prenume[20];
struct
{ char nume[20],
prenume[20]; { int clasa;
float note[20];
struct
} situatie_1;
{ int clasa;
struct
float note[20]; { int clasa;
} situatie_1, float note[20];
situaţie_2; } situaţie_2;
int varsta; int varsta;
}; };
Înregistrări cu structură
variabilă Variabila var este de tipul union.
# include
# include<iostream.h>
<iostream.h> Câmpurile subordonate ar trebui să
union
uniontest test ocupe 2,10 şi 8 octeţi dar toate
{ int a; variabilele ocupă numărul de octeţi
{ int a; necesari pentru memorarea
char b[10];
char b[10];
double c; câmpului cel mai lung.
}; double c; La un moment dat se poate memora
doar un singur câmp dintre cele
};
main() subordonate.
{main()
test var; int i;
cin>>var.c; cout<<var.c<<endl;
{ test var; int i;
cin>>var.b; cout<<var.b;
} cin>>var.c; cout<<var.c<<endl;
cin>>var.b; cout<<var.b;
}
Înregistrări cu structură
variabilă
Forma generală a unei uniuni este:
union [<numele uniunii>]
{ <tip> <nume variabila>;

} [lista de variabile] ;
La un moment dat numai un câmp poate fi
ocupat. Înregistrările pot avea structură
variabilă.
Înregistrări cu structură
variabilă
Uniunile pot fi incluse în structuri.
Structurile pot fi incluse în uniuni.
Înregistrarea are structură variabilă dar
ocupă un număr fix de octeţi.
Citirea şi afişare înregistrării se face, de
fiecare dată , sub switch, în funcţie de
datele citite sau conţinute.
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;
};
Citirea părţii fixe a înregistrării
main()
{ persoana pers;
cout<<“Nume persoana ”; cin.get(pers.nume,30);
cout<<“Studii (f-fara, g-generala, l-liceu, s-
superioare)”;
cin>>pers.studii;
Citirea părţii variabile a
înregistrării
switch(pers.studii)
{ 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 înregistrării
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