440 likes | 933 Views
STRUCTURI DE DATE NEOMOGENE. Prof. Gabriela Conea Colegiul National, 16-05-2009. Structuri.
E N D
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: • Scriind la sfârşit numele variabilelor: struct elev { char nume[20], prenume[20]; float nota_mate, nota_info; int varsta; } inr1,inr2; • 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 variabilede 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 Cele două structuri sunt echivalente. 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; }; struct elev1 { char nume[20], prenume[20]; struct { int clasa; float note[20]; } situatie_1, situaţie_2; int varsta; };
Înregistrări cu structură variabilă Variabila vareste 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. # 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; }
Î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.