Sunteți pe pagina 1din 12

3

Capitolul
Tipul de date înregistrate

În acest capitol veþi învãþa despre:


• Datele eterogene, cum apar în realitate ºi modul lor de structurare
• Tipul de date înregistrare (articol) ºi proiectarea înregistrãrilor
• Declararea tipului ºi definirea variabilelor de acest tip
• Organizarea prelucrãrilor înregistrãrilor
• Tablouri de înregistrãri

3.1. Noþiunea de înregistrare


O metodã generalã de compunere a datelor într-o structurã unitarã o oferã regula de structurã numitã
înregistrare sau articol.
Acest tip de structurã apare necesar când utilizatorul doreºte prelucrarea informaþiilor care se referã la entitãþi
complexe ºi care sunt descrise prin elemente eterogene. Eterogenitatea provine din faptul cã elementele pot fi de
tipuri diferite de date.
Elementele structurii se numesc câmpuri.
Fie un lot de n candidaþi care se prezintã la o testare, fiecare pe rând înregistrându-ºi datele personale
formate din nume ºi data naºterii. Trebuie selectate ºi listate persoanele care au vârsta de cel puþin
21 de ani.
Prelucrarea cerutã mai sus are nevoie de o structurã nouã de date, numitã, de exemplu, persoana
în care sã se regãseascã datele unei persoane care este verificatã din punctul de vedere al vârstei.
Totodatã, informaþiile legate de datele calendaristice necesare în prelucrare (data curentã ºi data naºterii), sunt ºi
ele date compuse din elementele: zi, lunã, an.
Pentru datele referitoare la o persoanã, rezultã gruparea de informaþii prezentatã în tabelul din figura 3.1,
alcãtuitã din tipurile de date menþionate sub ultimul rând:

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.

Cod Titlu Autor Preþ An_apar Editura Nr_ex


6n 30 ch 20 ch 7.2 4n 15 ch 2n 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.

Proiectaþi ºi desenaþi pe caiet înregistrãrile necesare pentru urmãtoarele cazuri:


1. Fie entitatea vânzãri ale unor produse. Acest la fenomen se desfãºoarã pentru fiecare produs în parte
din stocul unui magazin, zilnic, în cantitãþi ºi preþuri date. Prelucrãrile vor fi: stabilirea valorii totale
a vânzãrilor zilnice ºi listarea produselor celor mai solicitate.
2. Fie entitatea numãr complex. Pentru aceastã noþiune abstractã, prelucrãrile vor fi: realizarea ope-
raþiilor de adunare, înmulþire ºi împãrþire a douã numere complexe.
3. Fie entitatea punct. Prelucrãrile vor fi: stabilirea tuturor distanþelor între mai multe puncte date ºi
care puncte sunt coliniare.
4. Fie entitatea strãzi din cadrul unui oraº. Prelucrãrile vor fi: listarea strãzilor cu sens unic ºi calcularea
totalului distanþelor în kilometri pentru strãzile cu dublu sens.
5. Fie entitatea filme care ruleazã în oraº. Prelucrãrile vor fi: listarea filmelor care încep la o orã datã
ºi listarea sãlilor care au cele mai multe reluãri ale filmului în zi.

TIPUL DE DATE ÎNREGISTRATE


51 51
3.2. Specificaþiile limbajului de programare pentru înregistrãri
Declararea machetei unei înregistrãri utilizeazã cuvântul rezervat al limbajului: struct.
Prin aceastã declarare programatorul creeazã un tip nou de datã faþã de cele standard, cunoscute de
compilator. Regula generalã de sintaxã cere ca declararea câmpurilor împreunã cu tipurile lor sã se scrie între
acolade. Ca orice declarare de date, formularea se încheie cu semnul punct ºi virgulã:
struct nume_structurã {tip1 listã câmpuri; tip2 listã câmpuri; … ; tipn listã câmpuri};
Noul tip de datã creat de programator este un tip structurat ºi are denumirea pe care acesta o dã în
nume_structura.
Pentru prelucrarea informaþiilor se definesc variabile de acest tip nou introdus, numite variabile_înregistrare.
Definirea variabilelor_înregistrare se poate face în douã moduri:
a) dupã declararea machetei, prin:
nume_structura nume_variabila;
b) odatã cu declararea machetei, prin:
struct nume_structura{tip1 camp1; tip2 camp2;…} nume_variabila1, nume_variabila2...;
Pentru forma b) a declarãrii variabilelor_înregistrare se poate scrie declararea machetei fãrã a mai
menþiona nume_structura. Este cazul definirii unei structuri anonime, importante fiind doar
declararea machetei ºi a variabilelor:
struct {tip1 camp1; tip2 camp2;…} nume_variabila1, nume_variabila2...;

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.

Referirea câmpurilor dintr-o înregistrare – operatorul • (punct)


Accesul la oricare dintre câmpurile structurii din cadrul variabilei declarate ca înregistrare se face utili-
zându-se operatorul • (punct). Operatorul • se numeºte operator de referinþã a unui câmp din cadrul variabilei
ºi se scrie între variabila_înregistrare ºi numele câmpului referit:
variabila_inregistrare•nume_camp
O datã referit astfel un cîmp, el intrã în prelucrãri la fel ca orice variabilã simplã.
Pentru exemplul tipului de datã elev, luat mai sus, se poate testa media elevului e1 dacã este mai mare
decât media elevului e2 prin:
if(e1.medie>e2.medie) ...
Exemplificarea folosirii tipului înregistrare în programe
Exerciþiile se vor pune în evidenþã ca teme de laborator.
1. Se considerã e1 ºi e2, douã variabile de tip înregistrare în care sunt citite datele a doi elevi conform
machetei elev descrisã mai sus. Se doreºte afiºarea numelor celor doi elevi în ordinea descrescãtoare
a mediilor lor.

TIPUL DE DATE ÎNREGISTRATE


53 53
Rezolvare. Macheta înregistrãrilor e1 ºi e2 este descrisã de structura elev. Programul de mai jos prezintã
modul de utilizare a acesteia.
#include<iostream.h> cin>>e1.medie;
#include<conio.h> cout<<”Dati numele elevului urmator ”;
void main() cin>>e2.nume;
{ cout<<”Dati media lui ”;
struct elev {char nume[25]; cin>>e2.medie;
float medie;}; if(e1.medie>e2.medie)
elev e1,e2; cout<<e1.nume<<” ”<<e2.nume;
clrscr(); else
cout<<”Dati numele primului elev ”; cout<<e2.nume<<” ”<<e1.nume;
cin>>e1.nume; getch();
cout<<”Dati media primuui elev ”; }
2. În programul urmãtor sunt puse în evidenþã elementele noi, discutate mai sus, care sunt necesare definirii
ºi utilizãrii noului tip de structurã. Programul rezolvã problema enunþatã pentru persoanele care se înscriu la testare
ºi care trebuie sã aibã vârsta de minimum 21 de ani.
Referinþa pentru luna din data naºterii unei persoane apare sub forma persoana.datan.luna , utilizându-se
de douã ori operatorul de referinþã, deoarece câmpul luna este dublu subordonat: direct câmpului datan (care este
o structurã) ºi indirect structurii persoana.
#include<iostream.h> cin>>p.datan.luna;
#include<conio.h> cin>>p.datan.an;
void main() cout<<”Dati data curenta ”;
{int n, varsta,z,l,a; cin>>azi.zi>>azi.luna>>azi.an;
struct data{unsigned zi,luna,an;};
struct persoana varsta=azi.an-p.datan.an;
{char nume[25]; if(azi.luna>p.datan.luna)varsta++;
data datan;}; else if(azi.luna==p.datan.luna
persoana p;data azi; && azi.zi>p.datan.zi)
//variabila p este de tipul persoana varsta++;
cout<<” Dati numarul de persoane ” ; if(varsta>=21)
cin>>n ;for(int i=1;i<=n;i++) cout<<p.nume<<”varsta=”<<varsta<<endl;
{cout<<”Dati numele persoanei ”; }
cin>>p.nume; getch();
cout<<”Dati data nasterii ”; }
cin>>p.datan.zi;

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.

Caracteristicile tipului înregistrare

I. Înregistrarea este o structurã neomogenã, putând compune date de tipuri diferite.


II. Componentele înregistrãrii se numesc câmpuri.
III. O înregistrare poate conþine drept câmp o datã structuratã (tablou, ºir de caractere, structurã etc.).
IV. Alocarea zonei de memorie pentru o variabilã de tip struct se face în octeþi succesivi, conform lungimii
fiecãrui câmp.

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.

3.3. Prelucrãri de bazã asupra variabilelor_ înregistrare


a) Atribuirea de valori
Câmpurile unei variabile_înregistrare pot primi valoare prin:
# atribuirea valorii unei expresii, de acelaºi tip ca tipul câmpului;
# atribuirea globalã, prin atribuirea unei variabile_înregistrare altei variabile_înregistrare de acelaºi tip;
# iniþializare prin constante sau prin constantã simbolicã;
# citirea, la nivel elementar, a valorilor, câmp cu câmp, de la tastaturã sau dintr-un fiºier text al utilizatorului.
În programele date ca exemple, valorile câmpurilor s-au citit din fiºierul standard de intrare.
Exerciþiile se vor pune în execuþie ca teme de laborator.
1. Se considerã tipul de date complx ºi trei variabile de acest tip: z1,z2 ºi z3. În z3 se va reþine
suma z1+z2. Secvenþa urmãtoare de program atribuie valori câmpurilor variabilelor astfel: iniþializare
prin constante, pentru z1 ºi z2 ºi expresii de calcul pentru a se obþine în z3 suma dintre z1 ºi z2.
... z3.re=z1.re+z2.re;
struct complx{ float re,im;}; z3.im=z1.im+z2.im;
complx z1={2,5},z2={1,-6},z3; ...

1. Din exemplul luat va rezulta z3=3-i.


2. Fie tipul de date elev. Se considerã elevii e1 ºi e2 ºi se doreºte sã se interschimbe datele lor pentru a
obþine în e1 datele elevului cu media generalã mai mare. Se va face o atribuire globalã între variabilele aux, e1
ºi e2.
void main() {aux=e1;
{struct elev{char nume[20];float e1=e2;
mg;}; e2=aux;
elev e1,e2,aux; }
cin>>e1.nume>>e1.mg; cout<<e1.nume<<” ”<<e2.nume;
cin>>e2.nume>>e2.mg; }
if(e1.mg<e2.mg)

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.

TIPUL DE DATE ÎNREGISTRATE


55 55
Câte douã puncte pentru exerciþiile 1, 2, 3, câte un punct pentru exerciþiile 4 ºi 5, douã puncte din oficiu.
1. ªtiind cã variabila p este folositã pentru a memora ºi utiliza în calcule coordonatele reale ale unui
punct în plan, stabiliþi care dintre urmãtoarele declarãri corespunde scopului propus:
a) struct p{float x,y;}; b) struct {float x;float y;}p;
c) p struct{float x;float y}; d) struct {float x,y;}p;
2. Variabila n este utilizatã pentru a memora numele ºi prenumele unui elev. Precizaþi care dintre
declarãrile urmãtoare nu este corectã:
a) struct {char nume[15],prenume[15];}n; b) char n[50];
c) char n[15[15]; d)char n[2][15];
3. Folosind tipul de structurã complx, definit mai sus, precizaþi ce se realizeazã în secvenþa de mai jos:
struct polar {float mod, arg;);
polar w; cmplx z;
w.mod=sqrt(z.re*z.re+z.im*z.im);
w.arg=atan2(z.im,z.re);
cout<<w.mod<<” ”<<w.arg;
a) se calculeazã modulul lui z; b) se converteºte z în coordonate polare; c) se converteºte w din
coordonare polare în exprimare de numãr complex.
4. Fiind definite structurile de date punct ºi cerc ºi variabilele p ºi c, sã se precizeze ce afiºeazã
secvenþa de mai jos, în care funcþia pow(a,b), din biblioteca math, realizeazã calculul ab:
struct punct {float x, float y;}p;
struct cerc {punct centru; float raza;}; a) distanþa dintre un punct p ºi centrul
cerc c; cercului;
float dist; b) distanþa dintre douã puncte;
dist=sqrt(pow(p.x–c.centru.x,2)+pow(p.y- c) puterea punctului p faþã de cercul c;
c.centru.y,2)); d) aria cercului c.
cout<<dist-pow(c.raza,2);
5. Fie definirea unui punct material în spaþiu ºi trei astfel de puncte: p, q ºi w. Sã se determine ce
se afiºeazã prin secvenþa de mai jos:
struct punct_m{float x,y,z,masa;} p,q,w;
w.masa=p.masa+q.masa;
a) ponderea distanþei între puncte;
w.x=(p.x*p.masa+q.x*q.masa)/w.masa;
b) masa punctului w;
w.y=(p.y*p.masa+q.y*q.masa)/w.masa;
c) centrul de greutate al celor douã
w.x=(p.z*p.masa+q.z*q.masa)/w.masa;
puncte.
cout<<w.x<<” ”<<w.y<<” ”<<w.z;
cout<<w.masa;

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]

Nume Prenume Purtare MG


Figura 3.7
15 ch 20 ch unsigned float

Declararea structurii elev ºi apoi definirea variabilei clasa se scriu astfel:


struct elev { char nume[15],prenume[20]; unsigned purtare;float MG;};
elev clasa[32];
Referirea la fiecare elev din clasa pentru citirea numelui, prenumelui, a mediei la purtare ºi a mediei sale
generale se face sub forma indexãrii cunoscute de la tabloul unidimensional: clasa[i].
În procesul ordonãrii, valoarea câmpului MG al elevului de ordin i se va compara cu valoarea din câmpul
MG al elevului de ordin i+1 astfel:
if(clasa[i].MG<clasa[i+1].MG)...//interschimbul inregistrarilor clasa[i]
//cu clasa[i+1]
Pentru realizarea programului, datele de intrare se citesc din fiºietul text clasa.in, iar rezultatul ordonãrii
se transferã în fiºierul text clasa.out.
//program situatie scolara; {ok=1;
#include<fstream.h> for(i=0;i<n-1;i++)
void main() if(clasa[i].MG<clasa[i+1].MG)
{ {aux=clasa[i];
struct elev{char nume[15],prenume[20]; clasa[i]=clasa[i+1];
unsigned purtare; float MG;}; clasa[i+1]=aux;
elev clasa[32], aux; ok=0;
unsigned n,I,ok; }
ifstream in(”clasa.in”); }while(!ok);
ofstream out(”clasa.out”); //transferare in fisierul out
in>>n; for(i=0;i<n;i++)
for(i=0;i<n;i++) {out<<clasa[i].nume<<” ”;
{in>>clasa[i].nume; out<<clasa[i].prenume<<” ”;
in>>clasa[i].prenume>>clasa[i].purtare; out<<clasa[i].purtare;
in>>clasa[i].MG; out<<clasa[i].MG<<endl;
} }
//ordonarea descrescatoare }
do

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

TIPUL DE DATE ÎNREGISTRATE


57 57
grad coeficient de date înregistrare monom care are macheta din figura 3.8. Pentru a memora
întregul polinom se va declara o variabilã de tip vector de monoame, poli.
unsigned float
struct monom{unsigned grad; float coeficient;};
Figura 3.8
monom poli[21];
Calculul numãrului de elemente de tip monom din cadrul vectorului poli trebuie sã þinã 3
cont de faptul cã, pentru un polinom de gradul n sunt prezente maximum n+1 monoame. Datele 2 1
se vor citi din fiºierul poli.in, pe prima linie fiind numãrul de monoame, m, iar pe urmãtoarele 1 -2
m linii, câte o pereche de numere pentru gradul ºi coeficientul monomului curent. Datele din 0 1
fiºier trebuie sã fie ordonate descrescãtor în funcþie de gradul monomului. De exemplu, pentru
Figura 3.9
conþinutul fiºierului poli.in dat în figura 3.9, polinomul este P(X) = X2 – 2X + 1.
//program evaluare polinom for(i=0;i<m;i++)
#include<fstream.h> {in>>poli[i].grad;
#include<math.h> in>>poli[i].coeficient;
void main() }
{struct monom{unsigned grad; cout<<”Dati punctul de evaluare ”;
float coeficient;}; cin>>x0;
monom poli[21]; //evaluare
unsigned m,i; for(i=0;i<m;i++)
//m=numarul de monoame existente P=P+pow(x0,poli[i].grad)*
float x0,P=0;//x0=punctul de evaluare poli[i].coeficient;
ifstream in(”poli.in”); cout<<”Valoarea=”<<P;
in>>m; }

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 }

4. Dându-se un numãr de n zile ale unei perioade, pentru fiecare zi înre-


gistrându-se data ºi temperatura, sã se afiºeze ziua în care s-a înregistrat tempe- 5
ratura maximã. Datele se citesc dintr-un fiºier text grade_zi.txt În fiºier, pe 12 4 2006 8
prima linie este memorat numãrul de zile, nz, iar pe urmãtoarele nz linii sunt 15 4 2006 12.5
înregistrate data ºi temperatura zilei respective. De exemplu, pentru conþinutul 16 4 2006 10
fiºierului dat în figura 3.11, se citesc datele a 5 zile, afiºându-se valoarea 19.5. 20 4 2006 19.5
Rezolvare. S-a definit un tip generic de înregistrare, data, pentru data 22 4 2006 18
calendaristicã. Datele fiecãrei zile înregistrate sunt citite pe rând în variabila_în- Figura 3.11
registrare t, pentru care s-a definit structura de date termica_zilei. Variabila
data_max este o datã structuratã de tip data în care se reþine data în care s-a înregistrat temperatura maximã.
Pentru început, în aceastã variabilã se transferã data primei zile din fiºier. Variabila t_max reþine temperatura
maximã care se va determina. Variabila se iniþializeazã cu temperatura primei zile din fiºier.
#include<fstream.h> T>>t_max;
#include<conio.h> for(i=2;i<=nz;i++)
void main() {
{ T>>t.zi_lu.zi>>t.zi_lu.luna;
clrscr(); T>>t.zi_lu.an;
typedef struct data T>>t.temp;
{unsigned zi,luna,an;}; if(t_max<t.temp)
struct termica_zilei {t_max=t.temp;
{data zi_lu; data_max=t.zi_lu;
float temp;}; }
float t_max; }
data data_max; cout<<”Data cu temperatura maxima: ”;
termica_zilei t; cout<<”Zi=”<<data_max.zi;
unsigned este,nz,i,an; cout<<” Luna=”<<data_max.luna;
t_max=0; cout.width(5);cout.precision(2);
ifstream T(”grade_zi.txt”); cout<<”\nTemperatura maxima=”;
T>>nz; cout<<t_max<<” grade”;
T>>data_max.zi>>data_max.luna; getch();
T>>data_max.an; }

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

TIPUL DE DATE ÎNREGISTRATE


59 59
6 contorizarea rãspunsurilor corecte. Pentru cele 6 hidrocarburi din fiºierul dat ca exemplu în
8 18 figura 3.12, rãspunsurile sunt: octan, metan, butenã, pentenã, hexinã, etinã.
1 4 Rezolvare. În programarea acestui test a fost nevoie sã se utilizeze douã tipuri de structuri
4 8 de date: ºiruri de caractere ºi înregistrãri. ªirurile de caractere au fost folosite pentru a crea
5 10 constantele de tip rãdacina ºi sufixul denumirii hidrocarburii, rad ºi sufixe ºi variabila nume
6 10 în care se compune denumirea substanþei prin concatenarea radãcinii cu sufixul corespunzãtor.
2 2 De asemenea, în variabila rasp se citeºte textul introdus de elev ca rãspuns pentru a se com-
para apoi cu nume. Pentru formula hidrocarburii este proiectat tipul de date formula ca
Figura 3.12
structurã cu douã câmpuri: carbon ºi hidrogen. Variabila HC de tip formula va reþine, pe
rând, câte o pereche de numere naturale corespunzãtoare unei formule atomice citite din fiºier. Pentru o anume
formulã atomicã din HC se copiazã în nume rãdãcina denumirii corespunzãtoare numãrului de atomi de
carbon -1 (deoarece indicii în vectorul rad încep cu valoarea 0). Apoi se stabileºte grupa de hidrocarburi dupã
relaþia cu numãrul de atomi de hidrogen: CnH2n+2 pentru alcani, CnH2n pentru alchene ºi CnH2n-2 pentru alchine. În
funcþie de grupa stabilitã se adaugã, prin concatenare, sufixul corespunzãtor în variabila nume. Dupã citirea
rãspunsului în variabila rasp, se transformã toate caracterele în litere mici pentru a evita situaþiile în care elevul
tasteazã ºi majuscule.
#include<fstream.h> if(HC.hidrogen==2*HC.carbon+2)
#include<conio.h> strcat(nume,sufixe[0]);
#include<string.h> else
void main() if(HC.hidrogen==2*HC.carbon)
{ clrscr(); strcat(nume,sufixe[1]);
else
const char rad[10][6]={”met”,”et”, strcat(nume,sufixe[2]);
”prop”,”but”,”pent”,”hex”, cout<<”Carbon=”<<HC.carbon;
”hept”,”oct”,”non”,”dec”}; cout<<” Hidrogen=”<<HC.hidrogen;
const char cout<<”\nNumele hidrocarburii=”;
sufixe[3][4]={”an”,”ena”,”ina”}; cin>>rasp;cout<<endl;
struct formula //transf.raspunsul in litere mici
{unsigned carbon,hidrogen;}; strlwr(rasp);
unsigned p=0,ni,i; //comparare raspuns si contorizare
ifstream T(”HC_test.txt”); if(strcmp(nume,rasp)==0)p++;
char nume[10],rasp[10]; }
formula HC; cout<<”Ati raspuns corect la ”;
T>>ni;//numarul de intrebari cout<<p<<” intrebari”;
for(i=1;i<=ni;i++) cout<<”din cele ”<<ni;
{ getch();
T>>HC.carbon>>HC.hidrogen; }
strcpy(nume,rad[HC.carbon-1]);

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.

TIPUL DE DATE ÎNREGISTRATE


61 61

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