Documente Academic
Documente Profesional
Documente Cultură
!
!
!
!
!
Capitolul
16
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.
nume_cmpn:tipn
end;
321
Exemplu
type elev=record
nume:string;
medie:Real;
vrst:0..20
end;
var a:elev;
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
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.
with a do
Write(adresa.strada,' ',bi,' ',tel);
sau
a.preg:=elem; a.capac:=9.80
323
324
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.
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
Exemplu
EXPO.IN
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
...
328
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.
329
...
scrie 'Numele: '
citete nume
terg(a,n,ok,nume)
dac nu ok atunci
scrie 'Persoana ',nume,' nu exista in agenda.'
sfrit dac
...
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
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.