structuri de date neomogene
DESCRIPTION
STRUCTURI DE DATE NEOMOGENE. Prof. Gabriela Conea Colegiul National, 16-05-2009. Structuri. - PowerPoint PPT PresentationTRANSCRIPT
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 structExistă 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{ char nume[20], prenume[20]; struct
{ int clasa; float note[20];} situatie_1,
situaţie_2; int varsta;};
struct elev1{ char nume[20], prenume[20]; struct
{ int clasa; float note[20];} situatie_1;
struct{ int clasa; float note[20];} situaţie_2;
int varsta;};
Cele două structuri sunt echivalente.
Înregistrări cu structură variabilă
# include <iostream.h>union test
{ int a; char b[10]; double c;};
main(){ test var; int i; cin>>var.c; cout<<var.c<<endl; cin>>var.b; cout<<var.b;}
# include <iostream.h>union test
{ int a; char b[10]; double c;};
main(){ test var; int i; cin>>var.c; cout<<var.c<<endl; cin>>var.b; cout<<var.b;}
Variabila var este de tipul union. Câmpurile subordonate ar trebui să ocupe 2,10 şi 8 octeţi dar toate variabilele ocupă numărul de octeţi necesari pentru memorarea câmpului cel mai lung.
La un moment dat se poate memora doar un singur câmp dintre cele subordonate.
Î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ăriimain()
{ 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ăriiswitch(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ăriicout<<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.