Sunteți pe pagina 1din 11

Tipul nregistrare

!
!
!
!
!

Capitolul

16

Declararea unui tip nregistrare


Operaii
Implementri sugerate
Probleme propuse
Soluiile problemelor

Articolul (nregistrarea) reprezint reuniunea unui numr fix (sau variabil) de componente numite cmpuri, (de regul avnd tipuri diferite) care constituie logic o unitate
de prelucrare. Tipurile diferite ale cmpurilor din componena sa dau articolului caracterul de structur neomogen. Dac Li este lungimea cmpului i (i = 1, 2, ..., n), atunci
valoarea adresei cmpului i este: ai = a1 + L1 + L2 +...+ Li-1.
Caracterul neomogen al articolului, precum i lipsa unei relaii liniare ntre numrul
de ordine al cmpului i adresa acestuia fac ca regsirea unui cmp s se realizeze cu
ajutorul unui identificator asociat cmpului respectiv la definirea articolului.

L1

a2

L2

cmpi

ai

Li

...

cmpn

a1

...

cmp2

{
{

cmp1

an

Ln

Tipul articol (nregistrare) este o structur static de date flexibil, datorit faptului
c, spre deosebire de tipul tablou, cuprinde un numr fix sau variabil de componente
care pot fi de tipuri diferite. Componentele nu se indexeaz printr-o expresie (ca n cazul tablourilor), ci se selecteaz prin intermediul identificatorilor de cmp care se definesc la declararea tipului.

16.1. Declararea unui tip articol n limbajul Pascal


Forma general a definiiei unui tip nregistrare fix este:
type identificator_tip=record
nume_cmp1:tip1;
nume_cmp2:tip2;
...

nume_cmpn:tipn

end;

16. Tipul nregistrare

321

Exemplu
type elev=record
nume:string;
medie:Real;
vrst:0..20
end;
var a:elev;

Tipul unui identificator de cmp poate fi la rndul lui tot articol.


Exemplu
type persoana=record
adresa:record
strada:string;
numar:Byte
end;
bi,tel:string
end;
var a:persoana;

Un identificator de cmp trebuie s fie unic n cadrul propriului tip nregistrare.


Dac se dorete includerea n structura articolului a unor informaii care depind de
o alt informaie deja prezent n structur se formeaz cea de-a doua categorie, i
anume date de tip nregistrare cu variante.
Declararea unui tip nregistrare cu variante n limbajul Pascal:
type identificator_tip=record

nume_cmp1:tip1;
nume_cmp2:tip2;

...

nume_cmpn:tipn
case cmp_selector: tip_selector of
const1:(cmpv1_1:tipv1_1; cmpv1_2:tip1_2; ...);
const2:(cmpv2_1:tipv2_1; cmpv2_2:tip2_2; ...);

...
end;

Exemplu
type studii=(elem,medii,sup);
personal=record
nume:string;

{ tip enumerare }

322

16. Tipul nregistrare

case preg:studii of
elem:(capac:Real);
medii:(bac:Real);
sup:(facu:string; media:Real)
end;
var a:personal;

16.2. Operaii
16.2.1. Atribuirea
Unei variabile de tip nregistrare i se atribuie valoarea unei alte variabile de acelai tip
nregistrare. Fiind date dou variabile de tip nregistrare a i b, care au acelai tip, se
poate realiza operaia de atribuire a b ceea ce nseamn c valorile cmpurilor lui a
se substituie cu valorile din b.

16.2.2. Selectarea unui cmp


La un cmp al unei variabile de tip nregistrare ne referim prin numele variabilei, urmat de punct, apoi numele cmpului.
Exemplu
a.bi, a.tel, a.adresa.numar
O astfel de scriere este greoaie i pentru evitarea specificrii identificatorului de tip
nregistrare n faa fiecrui cmp care intervine n prelucrare, n Pascal se poate folosi
instruciunea with, care simplific modul de scriere a selectrii componentelor.
Exemplu

with a do
Write(adresa.strada,' ',bi,' ',tel);

n cazul nregistrrilor cu variante, pentru declaraiile din exemplul prezentat se pot


face urmtoarele atribuiri de date pentru cmpurile variabilei a:
a.nume:='pop';
a.preg:=sup;
a.facu:='informatic';
a.media:=10.00;

sau
a.preg:=elem; a.capac:=9.80

La un moment dat este activ o singur variant.

16. Tipul nregistrare

323

16.3. Implementri sugerate


Pentru a v familiariza cu prelucrarea datelor de tip nregistrare se recomand efectuarea urmtoarelor exerciii:
1. crearea unui catalog pentru o clas;
2. afiarea n ordine descresctoare dup medie a elevilor admii i alfabetic a elevilor respini la un examen;
3. afiarea tuturor elevilor care au domiciliul ntr-un anumit ora;
4. ordonarea elevilor n funcie de nlime i, pentru nlimi egale, n ordinea greutii;
5. crearea unui fiier care s conin articole privind crile dintr-o bibliotec;
6. crearea unui fiier care s conin articole privind crile dintr-o bibliotec, astfel
nct n cazul manualelor s se specifice disciplina, clasa pentru care este valabil
manualul, autorii etc., iar pentru crile care nu sunt manuale, numrul autorilor,
autorii, titlul, editura etc. (se va lucra cu nregistrri cu variante)
7. crearea unui fiier cu articole privind rezultatele participanilor la olimpiada internaional de informatic.

16.4. Probleme propuse


16.4.1. Agend
Un elev a creat o agend de telefon n care a introdus numele i numrul de telefon ale
cunotinelor sale. De asemenea, elevul dorete s poat efectua asupra agendei sale
cteva operaii de forma:
consultarea agendei cu afiarea ntregului coninut;
introducerea unei noi persoane n agend;
tergerea unei persoane;
cutare dup nume;
cutare pe baza cunoaterii numrului de telefon.
Scriei un program care s realizeze operaiile cerute de elev.
Date de intrare
Fiierul de intrare AGENDA.IN conine pe fiecare linie datele unei cunotine n forma:
nume numr de telefon.
Actualizarea agendei se va face pe baza unor date introduse de la tastatur.
Date de ieire
Nu vom avea un fiier de ieire complet nou. Fiierul AGENDA.OUT va avea coninutul
fiierului de intrare i nregistrrile noi, conform actualizrilor efectuate.

324

16. Tipul nregistrare

Restricii i precizri
numrul de nregistrri este cel mult 100;
numele este format din cel mult 25 de litere printre care nu exist nici un spaiu;
fiecare numr de telefon ncepe cu cifra 0;
la fiecare actualizare se va substitui fiierul de intrare cu cel de ieire;
programul va conine un meniu din care utilizatorul va putea selecta operaia pe care dorete s-o efectueze;
persoanele sunt introduse n agend n ordine alfabetic, operaiile de introducere a
unei persoane noi i tergerea unei persoane nu trebuie s modifice ordonarea;
cutarea unei persoane trebuie s se poat realiza, la cerere, dup nume sau dup
numr de telefon;
dac numele unei persoane se gsete n agend n timpul operaiei de introducere,
se va oferi posibilitatea modificrii numrului de telefon; n caz c nu se dorete
modificarea, se va introduce numrul 0, altfel noul numr.
Exemplu meniu
1 - consultare agenda
2 - introducerea unei noi persoane
3 - stergerea unei persoane
4 - cautare dupa nume
5 - cautare dupa telefon
6 - iesire
Optiunea ta este:

16.4.2. Expoziie
Organizatorii unei expoziii de pictur doresc s aib o eviden a fiecrui tablou i a
artitilor care au creat aceste tablouri. Organizatorii au adunat datele despre tablouri i
le-au scris ntr-un fiier. Pentru fiecare tablou se cunoate numele artistului, titlul tabloului, anul n care a fost realizat, preul de vnzare, precum i premiile obinute la
expoziii locale, naionale i internaionale.
Expoziiile se codific prin caracterele L (locale), N (naionale) i E (europene).
Referitor la fiecare premiu exist informaii, dup cum urmeaz:
anul i premiul n cazul expoziiilor locale;
anul, premiul i localitatea n cazul expoziiilor naionale;
anul, premiul, oraul i ara n cazul expoziiilor internaionale.
Avnd la dispoziie aceste date, organizatorii i propun s realizeze un program
care s creeze urmtoarele liste:
1. lista lucrrilor premiate pe categorii n ordinea: locale, naionale i europene;
2. lista tablourilor n ordine cresctoare a preurilor de vnzare;
3. lista artitilor care au obinut premiul 1 la cel puin un concurs, indiferent de tipul acestuia.

16. Tipul nregistrare

325

Date de intrare
Fiierul de intrare EXPO.IN conine attea linii, cte tablouri s-au expus. Pe fiecare linie este descris cte un tablou. Referitor la un tablou, pe o linie n fiier, avem urmtoarele date, desprite prin cte un spaiu:
nume_artist
titlu_tablou
an
pre
nr_premii
tip_expoziie
an
premiu
Dac un tablou a fost premiat de mai multe ori, celelalte premii sunt descrise n
continuare pe aceeai linie.
Date de ieire
Se vor crea trei fiiere de ieire: LISTA1.OUT, LISTA2.OUT i LISTA3.OUT. n toate
cele trei fiiere o linie conine date referitoare la un singur tablou. n fiiere specificatorul tip_expoziie va fi notat cu L (Local), N (Naional) sau E (European).
Fiierul de ieire LISTA1.OUT conine lista lucrrilor premiate. Structura unei linii
este urmtoarea:
tip_expoziie : nume_artist titlu_tablou tip_expoziie caracteristici
unde caracteristici nseamn datele specifice fiecrui tip de expoziie descrise n
enun. Acestea vor fi separate printr-un spaiu.
Fiierul LISTA2.OUT conine tablourile n ordine cresctoare a preurilor. Fiecare
linie are forma:
nume_artist titlu_tablou pre
Fiierul LISTA3.OUT va conine date despre artiti i are forma:
nume_artist titlu_tablou tip_expoziie
n fiier artitii vor fi ordonai alfabetic.
Restricii i precizri
numrul de tablouri este cel mult 100;
datele de tip string au cel mult 20 de caractere.

326

16. Tipul nregistrare

Exemplu
EXPO.IN

pop iarna 1998 2000000 L 1999 1


popa ploaia 2002 5000000 E 2001 2 Verona Italia
rus copii 1999 1500000 N 2000 3 Brasov
popescu tu 2000 2500000 L 2000 1
LISTA1.OUT
Locala: pop iarna 1999 1
Locala: popescu tu 2000 1
Nationala: rus copii 2000 3 Brasov
Europeana: popa ploaia 2001 2 Verona Italia
LISTA2.OUT
rus copii 1500000
pop iarna 2000000
popescu tu 2500000
popa ploaia 5000000
LISTA3.OUT
pop iarna L
popescu tu L

16.5. Soluiile problemelor rezolvate


16.5.1. Agenda
Datele referitoare la persoane se pstreaz ntr-o structur de tip nregistrare de forma:
type cun=record
nume,tel:string
end;

La o rulare a programului datele se preiau din fiierul de intrare AGENDA.IN i se


depun n tabloul a de tipul: array[1..100] of cun. Toate prelucrrile cerute n
enun se vor realiza asupra tabloului a. La finalul execuiei programului se formeaz
un fiier temporar AGENDA.OUT care conine tabloul a dup actualizri. Fiierul de intrare AGENDA.IN se terge, iar fiierul AGENDA.OUT se redenumete n AGENDA.IN,
astfel nct la urmtoarea rulare a programului datele de intrare s se gseasc cu coninutul actualizat.
Numrul nregistrrilor din tabloul a este n.
Citirea datelor din fiierul de intrare i memorarea lor n tabloul a se face n modul
urmtor:
citim o linie din fiierul de intrare ntr-un ir de caractere s;
deoarece fiecare numr de telefon ncepe cu caracterul '0' cutm poziia acestuia
n irul de caractere;

16. Tipul nregistrare

327

copiem caracterele de la nceputul irului de caractere (fr spaiul despritor dintre nume i numrul de telefon) n cmpul nume al elementului curent din irul a;
tergem aceste caractere (inclusiv spaiul) din irul de caractere;
ceea ce a rmas n irul de caractere este numrul de telefon.
Prima aciune posibil de solicitat de elev este afiarea datelor din fiier (memorate
deja n tabloul a).
Introducerea unei persoane noi n agend se realizeaz astfel:
citim numele i numrul de telefon pe care dorim s le nregistrm n agend;
apelm subalgoritmul de cutare Cautnume(a,n,i,nume,ok) care va returna n
variabila ok o valoare de adevr;
dac valoarea lui ok este adevrat, nseamn c am gsit numele persoanei, adic
aceasta exist deja n agend; dup revenirea din apelul subprogramului Introd
afim un mesaj corespunztor i oferim posibilitatea modificrii numrului de telefon (acest lucru este posibil, deoarece n variabila i avem indicele elementului din
irul a, care conine datele persoanei respective).
Dac s-a introdus opiunea corespunztoare introducerii unei noi nregistrri, n
subprogramul Meniu(a,n,opiune) se va selecta secvena de program n care se
apeleaz subprogramul Introd(a,n,ok,i,nume):
...
scrie 'Numele: '
citete nume
Introd(a,n,ok,i,nume)
dac ok atunci
scrie 'Persoana ',nume,' exista deja in agenda.'
scrie 'Daca doriti sa schimbati numarul de telefon,
introduceti-l.'
scrie 'Daca nu, introduceti 0.'
scrie 'Numar: '
citete tel
dac tel '0' atunci
{ numerele de telefon sunt stringuri }
a[i].tel tel
sfrit dac
sfrit dac
...

Subalgoritmul Introd(a,n,ok,i,nume) ncepe cu apelarea altui subprogram


care va cuta numele persoanei introduse. Dac acest nume se gsete deja n agend,
se revine din subalgoritm cu valoarea variabilei ok egal cu adevrat. n caz contrar se

328

16. Tipul nregistrare

citete i numrul de telefon pentru a introduce persoana n agend. Deoarece agenda


conine numele persoanelor ordonate alfabetic, subalgoritmul Cautnume(a,n,i,
nume,ok) este astfel realizat nct va returna i valoarea variabilei i care n caz de cutare cu succes reprezint indicele elementului din irul a care conine datele cutate,
iar n caz contrar reprezint indicele elementului unde ar trebui s se afle persoana cu
numrul de telefon cutat. n concluzie, aceast persoan nou trebuie s ajung pe poziia i. Pentru a putea realiza acest scop, n prealabil mrim dimensiunea irului, apoi
translatm elementele avnd indicele egal sau mai mare cu i cu o poziie la dreapta.
Apoi, scriem datele n elementul de indice i.
Subalgoritm Introd(a,n,ok,i,nume):
Cautnume(a,n,i,nume,ok)
dac nu ok atunci
{ persoana nume nu exist n agend }
n n + 1
{ mrim dimensiunea irului }
pentru j=n,i+1 execut:
{ eliberm poziia i, translatnd restul }
a[j] a[j-1]
{ elementelor cu o poziie la dreapta }
sfrit pentru
scrie 'Numarul de telefon: '
citete tel
a[i].nume nume
{ datele respective se copiaz pe poziia i }
a[i].tel tel
sfrit dac
sfrit subalgoritm

Cutarea se realizeaz cu subalgoritmul cunoscut (vezi capitolul 6):


Subalgoritm Cautnume(a,n,i,nume,ok):
{ cutam nume n agend; dac ok=true l-am gsit pe poziia i }
{ dac ok=false nu l-am gsit, ar fi trebuit s fie pe poziia i }
i 1
ct timp (i n) i (a[i].nume < nume) execut:
i i + 1
dac a[i].nume=nume atunci
ok adevrat
altfel
ok fals
sfrit subalgoritm

tergerea unui element din agend se efectueaz, dac opiunea de actualizare specific codul pentru care se execut urmtoarea secven din subprogramul Meniu.
Apelarea subprogramului terg(a,n,ok,nume) se finalizeaz fie cu tergerea elementului corespunztor din ir, fie cu un mesaj pe baza valorii parametrului ok.

16. Tipul nregistrare

329

...
scrie 'Numele: '
citete nume
terg(a,n,ok,nume)
dac nu ok atunci
scrie 'Persoana ',nume,' nu exista in agenda.'
sfrit dac
...

Subalgoritmul terg(a,n,ok,nume) apeleaz la rndul su subalgoritmul


Cautnum(a,n,i,nume,ok) n mod similar cu subalgoritmul Introd(a,n,ok,i,
nume).
Subalgoritm terg(a,n,ok,nume):
Cautnume(a,n,i,nume,ok)
dac ok atunci
{ persoana nume exist n agend }
pentru j=i,n-1 execut:
{ eliminm elementul de pe poziia i, }
a[j] a[j+1]
{ translatnd restul elementelor cu o poziie la stnga }
sfrit pentru
{ micorm dimensiunea irului }
n n 1
sfrit dac
sfrit subalgoritm

Cutarea numrului de telefon este identic cu cea a numelui, difer doar cmpul
analizat din elementele irului.

16.5.2. Expoziie
Se creeaz structura:
type str20=string[20];
tablou=record
nume,titlu:str20;
an:Integer;
pret:str20;
case expo:(L,N,E) of
L:(anl:Integer; prl:Char);
N:(ann:Integer; prn:Char; loc:str20);
E:(ani:Integer; pri:Char; loci,tara:str20)
end;
sir=array[1..20] of tablou;

Datele le vom prelua din fiierul de intrare i vom completa fiecare nregistrare n
funcie de variantele sale. irul datelor (a) are m elemente.

330

16. Tipul nregistrare

Crearea primei liste cerute n problem se realizeaz dup valorile cmpului selector expo. Se parcurge tabloul a i se aleg doar acele elemente care au cmpul selector
egal cu L. Se procedeaz analog pentru celelalte dou tipuri, identificate cu N i E.
Crearea celui de-al doilea fiier de ieire presupune ordonarea cresctoare a nregistrrilor din tablou dup cmpul pre. Se poate folosi oricare algoritm de ordonare
cunoscut.
Pentru pstrarea ordinii alfabetice n cazul celei de-a treia cerine a problemei se realizeaz o ordonare cresctoare a nregistrrilor dup cmpul nume, apoi se completeaz cel de-al treilea fiier de ieire cu artitii care au obinut premiul 1, specificnd i tipul expoziiei.

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