Documente Academic
Documente Profesional
Documente Cultură
Capitolul
Tipul de date înregistrate
DATA NAªTERII
NUME
ZI LUNA AN Figura 3.1
ºir de caractere nr. natural nr. natural nr. natural
Aceastã schemã de structurã este numitã macheta înregistrãrii (sau ºablonul de structurã).
În cadrul machetei înregistrãrii sunt puse în evidenþã:
– câmpurile (elementele) înregistrãrii;
– tipul de date asociat fiecãrui câmp;
– modul de grupare ºi succesiune a câmpurilor.
Odatã configuratã macheta înregistrãrii, se pot desemna identificatori pentru câmpuri.
În exemplul de mai sus, pentru DATA NAªTERII se poate crea identificatorul datan. În rest, celelalte denumiri
pot deveni identificatori, eventual scriºi cu litere mici.
Proiectarea unei înregistrãri
a) În faza iniþialã, se fixeazã entitatea care va fi descrisã prin informaþiile viitoarei înregistrãri. În mod concret,
entitatea poate fi un obiect fizic, o fiinþã, un fenomen, un concept etc.
b) Se stabileºte prelucrarea în care va fi folositã acea entitate.
c) Se stabileºte apoi lista de aspecte, atribute ale entitãþii, care trebuie luate în considerare pentru prelucrarea fixatã.
d) Se configureazã macheta înregistrãrii, pentru fiecare câmp stabilindu-se tipul – mulþimea de valori.
e) Se atribuie identificatori câmpurilor.
50 CAPITOLUL 3
1. Fie entitatea elev. Aceastã entitate poate fi descrisã cu foarte multe atribute: nume, prenume, data
naºterii, clasa, adresa, telefonul, numele ºi prenumele pãrinþilor, locul de muncã al fiecãrui pãrinte,
boli avute, înãlþime, greutate, rezistenþã la efort, rezultate la concursuri, medie generalã pe semes-
tre sau an etc. Se observã astfel cã este foarte important sã se stabileascã mai întâi prelucrarea în
care va intra entitatea elev ºi apoi alegerea atributelor corespunzãtoare.
Dacã se alege prelucrarea statisticã a rezultatelor lui ºcolare la finele semestrului I, atunci vor fi necesare
atributele: nume, prenume, mediile la obiectele de studiu, media la purtare ºi media generalã. Prelucrarea va consta
în determinarea calitãþii de promovat al semestrului ºi calculul mediei semestriale sau de nepromovat, fãrã a se
mai calcula media semestrialã.
Macheta proiectatã pentru prelucrarea statisticã va fi cea din figura 3.2:
Medie
Nume Prenume M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 M13 M14 M15 M16
generalã
15 ch 15 ch 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 5.2
Figura 3.2
În rândul al doilea al tabelului din figura 3.2 s-au trecut, prescurtat, tipul valorilor corspunzãtoare fiecãrui
câmp: ch pentru ºir de caractere, 2n pentru numãr natural de 2 cifre, 5.2 pentru numãr real cu douã zecimale ºi
douã cifre la partea întreagã (5 reprezintã lungimea numãrului real: doi întregi, virgula, douã zecimale).
Dupã stabilirea identificatorilor, macheta va fi cea din figura 3.3.
N P M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 M13 M14 M15 M16 MG
15 15
2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 2n 5.2
ch ch
Figura 3.3
Se observã cã grupul omogen al mediilor pe obiecte poate deveni un vector de 16 elemente naturale.
2. Fie entitatea carte. Obiectul carte poate fi descris prin atributele: titlu, autor, preþ, an apariþie, editurã.
Dacã se stabileºte, însã, ca prelucrare, evidenþa stocului de carte dintr-o bibliotecã ºcolarã, atunci mai apar
necesare atributele: cod carte ºi numãr de exemplare. Macheta, în forma finalã, dupã stabilirea identificatorilor,
va fi cea din figura 3.4.
Astfel, vor putea fi fãcute calcule privind: valoarea cãrþilor din tot stocul de carte (prin însumarea produselor
Pret x Nr_ex pentru toate cãrþile existente), clasificarea cãrþilor dupã anul de apariþie, ordonarea cãrþilor dupã
autor etc.
Calculul lungimii în octeþi a zonei ocupate de o variabilã de tipul structurii declarate se face însumând
numãrul de octeþi corespunzãtori tipurilor câmpurilor.
1. Fie o grupare de informaþii care descriu situaþia ºcolarã a unui elev dupã Nume Medie
macheta din figura 3.5.
25 ch float
Declararea structurii va fi:
struct elev{char nume[25]; float medie;}; Figura 3.5
Structura conþine un cîmp, nume, care, la rândul sãu, este o structurã de
date, vector de caractere.
Pentru structura elev se pot lua variabilele e1 ºi e2, de exemplu, declarate ca fiind de tipul elev:
elev e1, e2;
Calculul de lungime aratã cã atât pentru e1, cât ºi pentru e2, sunt repartizaþi câte 25+4 =29 octeþi.
2. Pentru exemplul dat mai sus, privind persoana care se prezintã la o testare, structura va cuprinde douã
câmpuri: nume (pentru numele ºi prenumele persoanei) ºi datan (pentru informaþia data naºterii).
Pentru cã informaþia datan este, la rândul ei, o datã compusã din trei elemente, ea va fi declaratã ca structurã
data, având câmpurile: zi, luna, an. Declararea machetei pentru informaþiile unei persoane va fi scrisã prin
douã declarãri de tip struct, declararea structurii data fiind necesar a fi fãcutã înainte de structura persoana:
struct data {unsigned zi,luna,an;};
struct persoana{char nume[30]; data datan;};
Pentru aceastã descriere se poate declara variabila_înregistrare p care este de tipul persoana:
persoana p;
Calculul lungimii ocupate de p este: 30 +3 x 2=36 octeþi (câte un octet pentru cele 30 de caractere ºi câte
doi octeþi pentru tipul de date unsigned).
Conform observaþiei de mai sus, este valabilã ºi urmãtoarea descriere a structurii persoana:
struct persoana{char nume[30]; struct{unsigned zi,luna,an;} datan;};
În aceastã situaþie se pierde definirea noului tip de datã pentru datele calendaristice, necesar poate ºi pentru
alte informaþii, de exemplu, pentru data curentã.
Acest exemplu prezintã cazul în care un câmp al structurii este el însuºi o structurã de date-înregistrare la
rândul sãu (data calendaristicã).
52 CAPITOLUL 3
3. Pentru exemplul care foloseºte entitatea elev aºa cum apare înregistrarea din catalog, descrierea în
limbajul de programare se modificã în:
struct elev_c{char N[15],P[15]; unsigned M[16]; float MG;};
În acest exemplu unele elemente ale structurii sunt, la rândul lor, structuri omogene de date (ºirurile de
caractere ale numelui ºi prenumelui, vectorul mediilor). Tipul de date elev_c ocupã 66 de octeþi.
4. Pentru entitatea carte descrierea tipului de date va ocupa 77 de octeþi ºi va fi fãcutã astfel:
struct carte {long cod; char titlu[30], autor[20]; float pret; unsigned an_apar;
char editura[15]; unsigned nr_ex;};
5. Pentru entitatea vânzari descrierea tipului de date va ocupa 18 octeþi ºi va fi fãcutã astfel:
struct vanzare{long cod_prod, cant; float pret; data data_v;};
6. Pentru entitatea numar complex descrierea tipului de date va ocupa 8 octeþi ºi va fi fãcutã astfel;
struct complx{ float re,im;);
7. Pentru entitatea punct descrierea tipului de date va ocupa 8 octeþi ºi va fi fãcutã astfel:
struct punct{ float x,y;);
8. Pentru entitatea strazi descrierea tipului de date va ocupa 25 de octeþi ºi va fi fãcutã astfel:
struct strazi {char denumire[20];float lungime; char sens;};
unde sens va avea valorile ‘U’ sau ‘D’.
9. Pentru entitatea filme descrierea tipului de date va ocupa 56 de octeþi ºi va fi fãcutã astfel:
struct filme {char titlu[30] ; float ora _inceperii[6] ; unsigned rep;};
1. Utilizaþi modelele de mai sus pentru a defini un tip de date elev_p în care sã fie structurate
informaþiile personale ale unui elev, aºa cum sunt acestea trecute în catalog.
2. Utilizaþi modelele de mai sus pentru a defini un tip de date autor în care sã fie structurate infor-
maþiile referitoare la autori, necesare într-o bibliotecã.
3. Utilizaþi tipul de date punct pentru a defini tipul de date segment.
4. Pe baza modelului vanzari definiþi un tip de date produs pentru informaþiile referitoare la
produsele dintr-un magazin.
5. Definiþi un tip de date dreapta pentru coeficienþii unei drepte, pornind de la expresia standard a
unei drepte (ax + by + c).
6. Definiþi un tip de date dreptunghi folosind tipul de date punct.
7. Definiþi un tip de date triunghi pentru care se dau coordonatele din plan ale vârfurilor, folosind
tipul de date punct ºi tipul de date segment.
Clasificare
Din punctul de vedere al numãrului câmpurilor necesare descrierii unei entitãþi definite de cãtre programator,
structura înregistrare are douã forme:
– forma fixã, în care se utilizeazã acelaºi numãr de câmpuri pentru descrierea oricãrui exemplar din entitatea
definitã de utilizator (de ex. persoana din programul de mai sus);
– forma cu variante, în care definirea câmpurilor, ca numãr ºi tip, depinde de specificul exemplarelor entitãþii
definite de utilizatorul programului.
54 CAPITOLUL 3
V. Declararea unui tip de datã înregistrare se face în sintaxa urmãtoare:
struct denumire{tip1 câmp1; tip2 câmp2;… ; tipn câmpn; }.
VI. Dacã mai multe câmpuri succesive sunt de acelaºi tip, se poate practica scrierea tipului respectiv
pentru toatã lista acelor câmpuri.
VII. Datoritã eterogenitãþii, localizarea unui câmp nu se poate face printr-un indice. Din acest motiv apare
necesar un operator nou ºi anume operatorul de referinþã_câmp desemnat prin caracterul punct (•).
Referinþa va respecta sintaxa
nume înregistrare . nume câmp
VIII. Cu componentele unei variabile de tip înregistrare se pot realiza toate operaþiile permise tipului
acelor componente.
IX. Un câmp poate avea aceeaºi denumire ca o altã variabilã din program sau ca un câmp din altã
înregistrare fãrã a se crea confuzii, deoarece numele câmpului este legat ºi precedat în scriere de
numele înregistrãrii din care face parte.
b) Afiºarea
Conþinutul unei înregistrãri se afiºeazã la nivel elementar, câmp cu câmp. Aceastã modalitate a fost exem-
plificatã în programele de mai sus.
c) Tablouri de înregistrãri
Foarte frecvent este nevoie sã se reþinã în memoria internã, pe parcursul programului, toate valorile pe care le
ia o variabilã_înregistrare. Acest lucru apare când aceste valori participã în prelucrãri în care unele depind de altele.
1. Fie situaþia ºcolarã a elevilor unei clase pentru care se doreºte obþinerea unei liste în care aceºtia
sã fie ordonaþi descrescãtor, dupã media generalã. Lista va fi folositã în scopul premierii elevilor.
Rezolvare. Dupã cum se ºtie, premierea este condiþionatã ºi de media 10 la purtare, nu numai de
media generalã (MG) a elevului. Pentru acest scop este necesarã întâi organizarea unei machete care
sã descrie un elev (fig. 3.6).
Este nevoie ca datele din catalog sã fie introduse în memoria internã, unde se va forma un tabel al elevilor
clasei. Apoi, acest tabel va fi ordonat descrescãtor dupã datele din
coloana MG. Rezultã un grup de înregistrãri de acelaºi tip, elev,
Nume Prenume Purtare MG
grup care va alcãtui clasa din care fac parte elevii. Fiind un grup 15 ch 20 ch unsigned float
omogen, se poate proiecta un vector clasa: Figura 3.6
56 CAPITOLUL 3
clasa[0] clasa[1] … clasa[i] … clasa[32]
1. Sã se adauge în program secvenþa necesarã afiºãrii elevilor care vor fi premiaþi (media generalã ≥ 8.50
ºi media 10 la purtare).
2. Sã se reproiecteze programul de mai sus, astfel încât pentru fiecare elev sã fie introduse din fiºier
datele primare din catalog: numele, prenumele, media anualã pentru fiecare obiect, media la purtare,
iar programul sã calculeze media generalã a fiecãrui elev, sã ordoneze elevii descrescãtor dupã
aceastã medie, sã treacã datele complete în fiºierul de ieºire ºi sã afiºeze lista elevilor selectaþi pentru
premiere.
2. Se cere realizarea unui program care sã poatã afiºa valoarea unui polinom, într-o nedeterminatã realã,
cu coeficienþi reali, pentru un numãr real citit de la tastaturã ºi sã se specifice dacã numãrul citit este rãdãcinã a
ecuaþiei polinomiale corespunzãtoare.
Rezolvare. Polinomul P(X)=anXn+an-1Xn-1+…+a1X+a0 este furnizat programului prin gradul ºi coeficientul
fiecãrui monom. Deoarece un polinom dat programului de cãtre utilizator poate sã nu conþinã toate monoamele,
atunci este convenabilã numai memorarea datelor pentru monoamele prezente. Pentru aceasta se va defini tipul
Adãugaþi în programul de mai sus secvenþa prin care se determinã dacã valoarea x0 este sau nu
rãdãcina ecuaþiei polinomiale.
3. Se cere realizarea unui program care sã poatã afiºa valoarea sumei a douã polinoame,
3
P(X) ºi Q(X), fiecare polinom fiind într-o nedeterminatã realã, cu coeficienþi reali,
2 1
Rezolvare. Se vor folosi declarãrile ºi definirile de variabile ca în programul anterior. De
1 -2
asemenea, se va folosi fiºierul poli.in în care, dupã liniile cu datele primului polinom vor 0 1
urma liniile cu datele celui de-al doilea. Spre exemplu, pentru a aduna P(X)=X2 – 2X + 1 cu 2
Q(X) = 2X3 + 4X, fiºierul poli.in are conþinutul tabelului din figura 3.10. Fiºierul trebuie sã 3 2
conþinã datele fiecãrui polinom ordonate descrescãtor dupã gradul monomului. Adunarea în 1 4
sine constã în realizarea polinomului S(X), prin interclasarea vectorilor monoamelor celor douã
polinoame date, în caz de grade egale însumându-se coeficienþii. Figura 3.10
Pentru exemplul luat, S(X) = 2X3 + X2 + (4 – 2)X1 + 2X0.
//program suma 2 polinoame in>>P[i].coeficient;
#include<fstream.h> }
#include<math.h> in>>n;
void main() for(i=0;i<n;i++)
{struct monom{unsigned grad; {in>>Q[i].grad;
float coeficient;}; in>>Q[i].coeficient;
monom P[21],Q[21],S[21]; }
int m,n,i,j,k; i=0;j=0;k=-1;
//m=numarul de monoame existente in P while(i<m && j<n)
//n=numarul de monoame existente in Q if(P[i].grad>Q[j].grad)
ifstream in(”poli.in”); S[++k]=P[i++];
in>>m; else
for(i=0;i<m;i++) if(P[i].grad<Q[j].grad)
{in>>P[i].grad; S[++k]=Q[j++];
58 CAPITOLUL 3
else while(i<m)S[++k]=P[i++];
{S[++k].coeficient= //afisarea suma
P[i++].coeficient+Q[j++].coeficient; cout<<”\nPolinomul suma=”<<endl;
S[k].grad=P[i-1].grad; for(i=0;i<=k;i++)
} {cout<<S[i].coeficient<<”X^”;
if(i==m) cout<<S[i].grad<<”+”;}
while(j<n) S[++k]=Q[j++]; cout<<”\b ”;//sterge ultimul +
else }
1. Transformaþi programul de mai sus, astfel încât el sã poatã afiºa toate zilele din fiºier în care s-a
înregistrat temperatura maximã.
2. Transformaþi programul de mai sus pentru a afiºa temperatura maximã înregistratã în fiecare lunã
din care fac parte zilele din fiºier, dacã perioada urmãritã cuprinde zile din luni diferite.
5. Se doreºte crearea unui program prin care elevii dintr-o clasã mai micã sã fie verificaþi la chimie din
capitolul Hidrocarburi. Datele testului sunt înregistrate în fiºierul HC_test.txt, în modul urmãtor: pe prima linie
se gãseºte numãrul de întrebãri, ni, iar pe urmãtoarele ni linii sunt perechi de numere naturale în care primul
reprezintã numãrul de atomi de carbon ºi al doilea numãrul de atomi de hidrogen. Pe ecran vor apãrea cele douã
numere, iar elevul va trebui sã tasteze numele hidrocarburii care are formula afiºatã. Punctajul se obþine prin
1. Transformaþi programul de mai sus pentru a afiºa, la sfârºitul evaluãrii, rezolvarea testului. Pentru
aceasta programul va prezenta pe ecran, grupate pe tipuri, hidrocarburile la care se referã testul:
formula ºi denumirea.
2. Construiþi un program asemãnãtor pentru testarea reciprocã: se citesc din fiºier ºi se afiºeazã pe ecran
9 denumiri de hidrocarburi; la sfârºitul afiºãrii, elevul va trebui sã introducã numãrul de atomi de
carbon ºi numãrul de atomi de hidrogen corespunzãtori fiecãrei substanþe.
PROBLEME PROPUSE
1) Sã se realizeze programul pentru prelucrãrile de tip situaþie statisticã la sfârºitul semestrului necesare
pentru o clasã de maximum 32 de elevi, fiecare elev fiind descris prin structura datã în exemplul 1 din
paragraful 3.1.
60 CAPITOLUL 3
2) Un fiºier personal.txt conþine date pentru un numãr de maximum 800 de subiecþi. Descrierea fiecãrei
persoane conþine date despre: nume, data naºterii (în format numeric) ºi profesie dintre variantele
{constructor, inginer, profesor, mecanic, pilot}. Se doreºte crearea unui fiºier vârste.out în care se trec
numele persoanelor înregistrate grupate pe categorii de vârste astfel: între 18 ºi 25 de ani, între 26 ºi 40
de ani, între 41 ºi 57 de ani, peste 58 de ani. Apoi, se va crea fiºierul profesii.out în care se vor
trece numele persoanelor ºi profesiile, grupate pe profesii.
3) Asupra unui lot de maximum 100 de subiecþi se aplicã o serie de teste (maximum 20) care au ca vari-
ante de rãspuns ‘DA’, ‘NU’ ºi ‘INDIFERENT’. Fiecare subiect este înregistrat cu numele ºi numãrul de
rãspunsuri date la fiecare variantã pentru toate testele. De exemplu, Popescu – 5 de DA, 6 de NU
ºi 2 de INDIFERENT. Sã se afiºeze în ordine descrescãtoare statistica rãspunsurilor (numãrul de DA, de
NU ºi de INDIFERENT) pe tot lotul de subiecþi ºi persoana care deþine numãrul maxim de DA.
4) Un set de n cuburi, n ≤ 200, descrise prin laturã ºi culoare, se aflã înregistrate în fiºierul cuburi.in.
Se doreºte trecerea lor în fiºierul cuburi.out în ordinea în care, dacã ar fi aºezate unul peste altul, s-
ar crea un turn stabil. Pe ecran se va afiºa numãrul de cuburi vecine în turn care au aceeaºi culoare.
5) Pentru un campionat internaþional de tenis s-a creat un fiºier tenis.in cu urmãtoarele date despre
concurenþi: þara, numele, vârsta. Sã se afiºeze o listã a þãrilor participante în ordine alfabeticã ºi numele
ºi þara celui mai tânãr concurent.
6) Se considerã douã dreptunghiuri în plan, paralele cu axele de coordonate. Datele despre dreptunghiuri
se referã la coordonatele colþurilor stînga-sus ºi dreapta-jos. Sã se afiºeze un mesaj corespunzãtor privind
relaþia dintre ele.
7) Sã se construiascã un program care testeazã un elev la limba modernã I astfel: dintr-un fiºier
cuvinte.txt se citesc cuvinte ale limbii respective împreunã cu semnificaþia lor în limba românã. Pe
ecran se afiºeazã numai cuvîntul în limba strãinã, aºteptându-se ca elevul sã tasteze traducerea. La sfârºit
se comunicã punctajul ºi rezolvarea testului.