Sunteți pe pagina 1din 17

7.

Tipuri de date structurate n Pascal: tablou (Array ),


mulime (Set ), ir_caractere (String), nregistrare (Record )
n aceast lecie se prezint cteva modaliti de reprezentare a datelor,
utiliznd tipuri de date (caracterizate prin mulimea valorilor sau domeniul tipului
respectiv i mulimea operaiilor caracteristice acelui tip) structurate (date ale
cror elemente componente sunt grupate).

7.1. Tipul tablou (Array ).


Structura tablou const ntr-o succesiune (ir) de elemente (aflate ntr-o
anumit ordine) avnd toate acelai tip (tipul_elementelor). Elementele pot fi
identificate prin indici, acetia fiind dintr-un subdomeniu al unui tip ordinal sau
chiar un tip ordinal. Aceasta nseamn c n definirea unui tablou va trebui s
precizm att domeniul_indicilor (tipul de indexare) ct i tipul_elementelor
componente. Sintaxa specificarii n limbajul Pascal a unei structuri tablou este :
<tablou> ::= Array [ <domeniul_indicilor> ] Of <tipul_elementelor>;
Exemple :
Type Sir_intregi = Array [1..9] Of Integer;

{ tipul sir de maxim 9 intregi }

Var Matrice : Array [1..25] Of Sir_intregi;{ tipul elementelor poate fi array }


Un element al tabloului se refer prin scrierea numelui tabloului urmat de
indicele elementului scris ntre paranteze drepte ( nume_tablou[indice] ).
Elementele unui tablou pot fi la rndul lor tablouri. Astfel, elementele
unui tablou de tipul :
Array [1..6] Of Array [1..7] Of Real ;
sunt vectori avnd 7 elemente reale. Dac T este un tablou de acest tip atunci T
are 6 componente, fiecare component fiind un vector cu 7 elemente. De fapt
este vorba de o matrice cu 6 linii i 7 coloane.

49

Componenta T[i] a acestui tablou va fi un vector cu 7 elemente reale.


Selectarea elementului cu indicele j al tabloului T[i] poate fi obinut scriind
T[i][j]. Mentionm c se accept o prescurtare a declaraiei de mai sus sub forma
:
T : Array [1..10, 1..6] Of Real ;
iar elementele matricei, Tij vor fi referite prin T[ i , j ].
Ca exemplu, am ales un program care tiprete calendarul pe anii rmai
din secolul nostru. Pentru aceasta, se va construi pentru fiecare lun (din anul
pentru care se dorete calendarul) un tablou cu sptmnile lunii respective (cel
mult 6). O sptmn conine pentru fiecare zi ncepand de luni pn duminic,
ziua din luna corespunztoare. De exemplu, dac n anul 1997, 29 decembrie va
fi n a cincea sptmn, luni, atunci Luna[5,Luni]=29. Pentru zilele care lipsesc
dintr-o lun se va completa tabloul cu 0. tiind c n 1997, 1 ianuarie a fost
miercuri, se poate calcula pentru urmtorii ani, n ce zi va ncepe anul (pentru care
se dorete calendarul).
Program Calendar_pe_199_;

{ Exemplu Array }

Type Zi_Sapt = (Luni,Marti,Mercuri,Joi,Vineri,Sambata,Duminica);


Sir_Zile = Array [Zi_Sapt] Of Byte;
Saptamana = Array [1..6] Of Sir_Zile;
Const
Var

Nume_Zi : Array [Zi_Sapt] Of Char = (L,M,M,J,V,S,D);


Luna : Saptamana;
Anul,a : Word;

Zi,Zl,l,s : Byte; z,ziua : Zi_Sapt;

Begin
Write ( Calendarul pe anul 199); Readln (Anul);
Anul:=1990+Anul; Zi:=2

{ Calc. ziua de inceput a anului (0..6) }

For a:=1998 To Anul Do Begin


Zi:=Succ(Zi);
If (a1) Mod 4 = 0 Then Zi:=Succ(Zi);
End;
Zi:=Zi Mod 7;
z:=Luni; While Ord(z)<Zi Do z:=Succ(z);

{ Ziua n care incepe anul }


{ (Luni..Duminica) }
50

For l:=1 To 12 Do Begin

{ Calendarul pe luna l }

For s:=1 To 6 Do
For ziua:=Luni To Duminica Do
Luna[s,ziua]:=0;
Case l Of
2

{ Nr.zile n luna l }
: If Anul Mod 4 = 0 Then Zl:=29
Else Zl:=28;

4,6,9,11 : Zl:=30
Else

Zl:=31

End;
s:=1;

{ saptamana s = 1,... cel mult 6}

For Zi:=1 To Zl Do Begin


Luna[s,z]:=Zi;
If z=Duminica Then Begin z:=Luni; s:=s+1 End
Else z:=Succ(z)
End;
Case l Of
1 : Writeln (' Ianuarie ');

2 : Writeln (' Februarie ');

3 : Writeln (' Martie

4 : Writeln (' Aprilie ');

');

5 : Writeln (' Mai

');

6 : Writeln (' Iunie

7 : Writeln (' Iulie

');

8 : Writeln (' August

');
');

9 : Writeln (' Septembrie'); 10 : Writeln (' Octombrie ');


11 : Writeln (' Noiembrie '); 12 : Writeln (' Decembrie ')
End;

Writeln;

For ziua:=Luni To Duminica Do Begin

{pentru fiecare zi din saptamana}

Write (' ',Nume_Zi[ziua],' ');


For s:=1 To 6 Do Begin

{ pentru fiecare saptamana s }

If Luna[s][ziua]>0 Then Write (Luna[s,ziua]:3)


Else Write (' ');
End;
End;

Writeln
Readln

End;
End.

51

Un exerciiu pe care l propunem este urmtorul :


Fiind dat o matrice A cu elemente reale, avnd m linii i n coloane, se cere s se
transforme aceast matrice prin interschimbri de linii, astfel nct pe coloana k
(dat), elementele s fie n ordine cresctoare, apoi s se tipreasc matricea n
forma final.
Pentru aceasta putem s declarm aceast matrice astfel :
Type Linie = Array [1..10] Of Real;
Matrice = Array [1..10] Of Linie;
Var

A : Matrice;
X : Linie;

Interschimbarea liniilor ( i cu i+1, dac este cazul ) n vederea ordonrii pe


coloana k va fi :
For i:=1 To m1 Do
If A[i,k] >A[i+1,k] Then Begin
X:=A[i]; A[i]:=A[i+1]; A[i+1]:=X; o:=False
End;

7.2. Tipul mulime (Set ).


Tipul mulime se poate utiliza n aplicaiile care folosesc noiunea de
mulime din matematic.
Acest tip se declar astfel : Set Of <tipul_elementelor>. Elementele
pot fi numere naturale mai mici dect 256, caractere sau elemente ale unui tip
enumerare, iar cardinalul mulimilor poate fi maxim 256.
52

Exemplu :
Type Multime_Nr = Set Of 0..255;

{ sau Multime_nr = Byte }

Multime_Car = Set Of Char;


Multime_LitM = Set Of A..Z;
Zile = (Luni,Marti,Miercuri,Joi,Vineri,Sambata,Duminica);
Var

Multime_cif : Set Of 0..9;


M_Zile : Set Of Zile;
M_Zile_Lucratoare : Set Of Luni..Vineri;
Vocale, Consoane : Multime_LitM;
Numere : Multime_Nr;
Operatorii utilizati pentru date de acest tip sunt :

a) pentru operaii cu mulimi :


-

reuniunea ( ) se noteaz cu +

intersectia (

diferenta ( \ ) se noteaz cu

) se noteaz cu

(A B vom scrie A + B ) ,
(A

B vom scrie A B ) ,

( A \ B vom scrie A B ) ;

b) relaionali :
-

= pentru egalitatea a doua multimi ( = ),

If A=B Then ...

<> pentru neegalitate ( ),

>= pentru incluziunea nestricta include ( ) , Repeat ... Until A>=B ;

<= pentru incluziunea nestricta inclus in ( ) ,

In pentru apartenen ().

While A<>B Do ...

Inclus := A<=B ;
Case e n A Of ... End;

Observaie : e A se va scrie : Not (e n A).


Constructorii de mulimi se definesc astfel:
<constructor>::=[<lista_elemente>] ,
unde lista_elemente poate fi o sucesiune de elemente sau subdomenii de forma
elem1..elem2.

De exemplu, mulimea {1,10,100,101,...,199,200} se scrie

[1,10,100..200], iar mulimea vid se scrie [ ] .

53

Exemplu :
Vocale := [A,E,I,O,U];
Consoane := [A..Z] Vocale;
Readln (N); Numere := [1..N];

{ N este o variabil de tip Integer }

Observaie. O variabil de tip mulime nu se poate citi, iar o expresie de tip


mulime nu se poate tipri (att citirea ct i tiprirea nu se pot realiza dect
dect element cu element). De exemplu, instruciunea Write(Consoane) nu este
permis.
Dac se dorete citirea unei mulimi, atunci aceasta se va citi element cu
element i se vor aduga succesiv la mulimea respectiv (care a fost iniializat
cu mulimea vid) astfel :
M:=[ ]; Repeat Read(e); M:=M+[e] Until Terminat_Citirea; .
Tiprirea unei mulimi se va face verificnd fiecare pentru element
posibil dac aparine mulimii, caz n care se va tipri acel element astfel:
For e:=Min To Max Do

If e n M Then Write(e); .

Exemplul urmtor i propune rezolvarea urmtoarei probleme :


S se determine numerele prime mai mici sau egale dect un numr n dat .
Pentru c vom utiliza tipul mulime (Set), n va fi cel mult 255.
Vom rezolva aceast problem n felul urmtor :
Ciur={2,...,n}; Prime=;
Repet
elementul minim din Ciur va fi mutat n mulimea Prime,
iar din Ciur se elimin toi multiplii acestuia
Pn_cnd Ciur-ul devine vid;

{ Ciur= }

Rezultate Prime.

54

Program Ciurul_lui_Eratostene;
Var

(* Numerele prime < n *)

Ciur, Prime, Mp : Set Of 2..255;


p, n : Byte; m : Integer;

Begin
Write ( Dati n : ); Readln (n);
Ciur:=[2..n]; Prime:=[ ]; p:=2;
Repeat
If p n Ciur Then Begin
Prime:=Prime+[p];

(* Prime:=Prime U {p} *)

Mp:=[]; m:=p;
Repeat
Mp:=Mp+[m]; m:=m+p
Until m>n;
Ciur :=Ciur Mp

(* Ciur := Ciur \ Mp *)

End; {If}
p:=p+1
Until Ciur = [ ];
Write(' Prime = {');

(* Tipar. mult. Prime *)

For p:=1 To 255 Do


If p n Prime Then Write (p,',');
Write (Chr(8)+'}');
Readln
End.
Un exerciiu cu mulimi pe care l propunem ca tem este urmtorul :
Sa se calculeze C.m.m.d.c. (a,b) astfel :
- se determin mulimile Da i Db a divizorilor lui a respectiv b,
- se calculeaza mulimea Dc a divizorilor comuni ( Dc:=Da

Db )

- Cmmdc (a,b) = Maxim ( Dc ).


Pot fi a i b mai mari dact 255 ? Cum poate fi modificat acest program
pentru a rezolva aceast problem ? n mulimi vom reine doar indici din irul
tuturor divizorilor. n felul acesta mulimile pot conine elemente de orice tip,
dar cardinalul maxim al mulimilor va fi doar 255.

55

7.3. Tipul ir_caractere (String).


Tipul String a fost conceput pentru a prelucra iruri de caractere. Pentru
c o dat de tip Array Of Char nu permite operaii specifice irurilor de
caractere (concatenare, citire, tiprire i altele), tipul string reuete astfel de
operaii.
Acest tip se declar astfel : String [m]

sau simplu String.

reprezint numrul maxim de caractere pe care poate s-l conin o variabil de


acest tip.

Dac nu se specific aceast limit m (varianta a doua), atunci

lungimea maxim este 255 (valoarea implicit pentru m).

Exemplu :
Type

Linie

= String [80];

SirCar = String;
Var

{ Siruri de maxim 80 de caractere }


{ Siruri de maxim 255 de caractere }

Mesaj : String;
Rand : Line;
S

: String [20];

: Array [0..20] Of Char;

Exist o compatibilitate ntre variabilele de tip String i cele de tip Array


Of Char (S i X, n exemplul de mai sus). Memoria ocupat n ambele cazuri
fiind de 21 de octeti ( S[0] conine numrul de caractere ale irului S, care
poate fi cel mult m) iar S[i] reprezint caracterul i din sirul S ( ca i X[i] , 1
i m ).

Observaie : 0 Ord(S[0]) m, pentru c S[0] este de tip Char.

Descrierea constantelor de tip String se realizeaz utiliznd caracterul


apostrof () astfel : sir_caractere . Dac dorim ca irul de caractere descris
s conin acest caracter, atunci caracterul apostrof va fi dublat.
Exemplu :
Str. Lalelelor, Nr.2 ,
Domnu Trandafir

( reprezint irul Domnu Trandafir ).

56

Operaia de concatenare a dou iruri este notat cu + . De exemplu


Algoritmica, + Programare are valoarea

Algoritmica, Programare.

Operatorii relaionali permit compararea a dou iruri utiliznd ordinea


lexicografic (utilizat n dicionare, cri de telefon, etc.) :

= i <> pentru egalitatea respectiv neegalitatea a dou iruri ,

<, >, <=, >= pentru compararea lexicografic.

Exemple :
Alb < Albastru;
Ionescu < Popescu ; 0... < 9... < A... < Z... < a... < z....
Tipul String are ( n plus fa de tipul Array Of Char ) implementate
urmtoarele faciliti :
a) valorile variabilelor i expresiilor de tip String pot fi citite respectiv tiprite,
de exemplu :
Mesaj:=Numele autorului; Write (Dati +Mesaj+ : ); Readln (s);
b)

se pot utiliza urmtoarele patru funcii i patru proceduri specifice tipului

string :
- Length (S) (=Ord(S[0]) ) returneaz lungimea irului S (Length(mare)=4),
- Copy (S,p,l) returneaz subirul (lui S) de lungime l ncepnd din pozitia p
( Copy(Marinescu,2,4)=arin ),
- Concat (S1,S2,...,Sn) (=S1+S2+...+Sn) d ca rezultat irul obinut prin
concatenarea irurilor i , 1i QQ 2

( Concat(Con,Cat)=ConCat),

- Pos (x,S) determin poziia subirului x n irul S sau 0 dac irul S nu


conine ca subir pe x ( Pos(in,Marinescu)=4 iar Pos(pop,Popescu)=0 ),
- Delete (s,p,l) terge din irului s ncepnd din poziia p , l caractere. De
exemplu secventa :
s:=Ionescu; Delete (s,4,4); Write (s); va tipari Ion;
- Insert (x,S,p) insereaz irul x n irul S la poziia p.

De exemplu :

s:=Alg.Progr.; Insert( i ,s,5); Write (s); va tipari Alg. i Progr.;

57

- Str (e,S) depune n variabila S, irul cifrelor corespunztoare valorii


(numerice) expresiei e , care poate avea ataat un format (:n:m ca i Write) .
Exemplu :

v:=5/2;

Str (v:5:2,S); va depune n S irul 2.50.

- Val (S,v,Cr) examineaz irul S. Dac acesta conine caractere ce reprezint


un numar scris corect atunci se va depune n v valoarea acelui numr iar n Cr
valoarea 0. Dac irul S conine caractere nepermise, atunci n v se depune
valoarea 0 iar n variabila Cr (de tip ntreg) poziia primului caracter nepermis.
Val (1997,v,Cr); are ca efect : v=1234 i Cr=0 , iar
Val (19d7,v,Cr); are ca efect : v=0 i Cr=3 ( pe poziia 3 se afl d).
Problema pe care o vom rezolva utiliznd tipul string este urmtoarea :
S se calculeze valoarea unei expresii aritmetice de forma : n1n2[=] unde :
n1,2 sunt dou numere reale, este un operator aritmetic (+, , *, , / sau : ) iar
semnul egal la sfritul expresiei poate lipsi. Expresia (simpl, cu un singur
operator i fr paranteze) este dat sub forma unui ir de caractere, iar rezultatul
se va afia cu dou zecimale.
De exemplu pentru 123+45 rezultatul este 168,00 , iar pentru
123.3:3= rezultatul este 41,10 .
Problema o vom rezolva astfel :
e - reprezint expresia sub forma unui ir de caractere, iar r este rezultatul
(valoarea expresiei) dat tot sub forma unui ir de caractere n care se va nlocui
marca zecimal . cu , . Dac expresia nu se termina cu caracterul =, acesta
va fi adaugat irului introdus.
Se determin poziia operatorului (p). Inseamn c o=e[p] va fi
caracterul ce va desemna operaia ce urmeaz a fi facut. n1 este scris cu
caracterele e1...ep-1 , deci poate fi obtinut cu procedura Val, iar apoi se sterg
primele p caractere, ceea ce nseamn c n expresia e mai ramane n2=. n
continuare, se procedeaz analog, extragnd pe n2, din irul rmas , mai puin
ultimul caracter. Dup tiprirea rezultatului (a irului r ) se va citi alt ir (alt

58

expresie) pn cnd se va introduce expresia vid (irul vid) adic se tasteaz


doar Enter n momentul citirii expresiei.
Programul Pascal este urmtorul:
Program Valoarea_Expresiei;
Var e,r : String
o : Char;

(* 123+22= *)
(* n1 o n2 = ? *)
(* o {+,-,x,:,*,/} *)

n1, n2 : Real;
p , er : Integer;
Begin
Repeat
Write ( Dati expresia (n1 o n2 =) : ); Readln (e);
If e> Then Begin
If Pos (=,e)=0 Then e:=e+=;
Val (e,n1,p);
Val (Copy(e,1,p-1),n1,er);

{ p:=Poz(o) }
{n1:=...}

o:=e[p];
Delete (e,1,p);
Val (Copy(e,1,Length(e)-1),n2,er);
Case o Of
+ : Str (n1+n2:8:2,r);
- : Str (n1-n2:8:2,r);
x,* : Str (n1*n2:8:2,r);
:,/ : Str (n1/n2:8:2,r)
Else r:= Operator necunoscut.+o
End;
p:=Pos(.,r); If p>0 Then r[p]:=,;
Writeln (r)
End
Until e=
End.
59

Un alt exerciiu pe care l propunem ca tem este urmtorul:


S se calculeze valoarea unui polinom P (dat ca ir de caractere), ntr-un punct
x dat.
Polinomul P(X) = a0Xn + a1Xn-1 + ... + an-1X + an se d sub forma:
a0X^n+a1X^n-1+...+an-1X+an.
De exemplu, polinomul P(X) = 3X5-7X2+12X-9 se poate scrie astfel :
3X^5-7X^2+12X-9 , utiliznd caracterul ^ pentru a marca puterea.
Pentru a rezolva aceast problem, se poate extrage din irul dat, pe rnd
fiecare monom (acestea fiind separate de caracterul + sau -), iar din fiecare
monom se va extrage coeficientul i puterea.

n acest fel putem memora

polinomul ca un ir de perechi de forma (coeficient, grad), urmnd s calculm


valoarea polinomului obinut.

7.4. Tipul nregistrare (Record ).


Tipul Record permite gruparea datelor de tipuri diferite. O astfel de
dat numtit nregistrare putem spune c este alcatuit din mai multe cmpuri,
nu neaprat de acelai tip. Un cmp poate la rndul su s fie alctuit din mai
multe subcmpuri i aa mai departe. De exemplu, pentru a memora date
referitoare la studenii unei faculti ca n tabelul urmtor, avem nevoie de o
structur n care elementele (Nr. matricol, Nume, Rezultate i Medie) au tipuri
diferite ( ntreg, sir de caractere, 1..10 sau (FB,B,S,NS) sau (Admis,Respins),
real). Sunt i situaii n care nu toate nregistrrile conin aceleai informaii,
ceea ce nseamn c avem nevoie de o structur variabil (diferite cmpuri) n
funcie de anumite valori ale unor cmpuri fixe. n acest sens putem spune c o

60

nregistrare are o parte fix format din mai multe cmpuri de diverse tipuri,
urmat eventual de o parte variabil.
Nr.

Numele i

Rezultate (Note i calificative)

Media

matricol

prenumele

Algebr Analiz Geometrie Informatic Sport

general

12292

Avram Valentin

10

F.B.

Admis

9.00

12295

Barbulescu Ioan

B.

Admis

8.33

...

...

...

...

...

...

...

...

18944

Zaharascu Paula

10

F.B.

Respins

Declararea tipului inregistare const ntr-o o parte fix (n care se declar


cmpurile mpreun cu tipurile lor) i eventual o parte variabil (Case ... , n
care cmpurile difer n funcie valoarea unor cmpuri din partea fix) astfel :
Record
<list_cmpuri> : <tip_cmp> { ;
<list_cmpuri> : <tip_cmp> }
[ Case [ <id> : ] <tip_sel> Of
<const> : (<list_cmpuri> : <tip_cmp> { ;
<list_cmpuri> : <tip_cmp> } ) { ;
<const> : (<list_cmpuri> : <tip_cmp> { ;
<list_cmpuri> : <tip_cmp> } ) } ]
End;
Prin <list_cmpuri> nelegem o list de identificatori de cmpuri, iar
<tip_cmp> este tipul cmpurilor care pot fi chiar Record.
Referirea unui cmp al unei variabile de tip inregistrare se face astfel :
<var_record> . <id_cmp>
De exemplu n programul urmtor, Un_Student.Media_Gen reprezint
cmpul Media_Gen al variabilei Un_Student, iar Un_Student.Rezultate.Informatic
reprezint calificativul la Informatic din cmpul Rezultate. Dac n cmpul
Informatic a fost depus valoarea NS sau S, nregistrarea are n partea variabil

61

notele obinute la scris i practic, iar dac valoarea depus a fost B sau FB
atunci n partea variabil se va reine doar nota final obtinut.
n cazul n care referim mai multe cmpuri din cadrul unei nregistrri se
poate evita precizarea multipl a aceleai nregistrri prin instruciunea With.
Aceasta are urmtoarea sintax :
With <var_record> { , <id_cmp> } Do <instruciune> ,
ceea ce permite omiterea scrierii n <instruciune> a selectorilor precizai o
singur dat (<var_record> ,<id_cmp> ).
De exemplu, n loc de
Writeln (Un_Student.Nume, Un_Student.Media_Gen);
se poate scrie mai simplu :
With Un_Student Do Writeln (Nume, Media_Gen);
n cazul n care un cmp este de tip record, se poate omite i acest
selector din instruciune, dac acesta a fost precizat ca <id_cmp> n
instruciunea With.

De exemplu, n loc de

Readln (Un_Student.Rezultate.Algebra, Un_Student.Rezultate.Analiza, ...)


se poate scrie mai simplu :
With Un_Student, Rezultate Do Readln (Algebra, Analiza, ...) .

Un exemplu de program care utilizeaz structurile menionate mai sus


este redat n continuare. Se citesc informaiile fiecrui student (mai putin
media, care se calculeaz, dac este promovat la toate disciplinele), apoi se
ordoneaz descresctor dup medii, iar n final se listeaz studenii n ordinea
mediilor.

62

Program Inregistrari;
Type
Calificativ = (NS,S,B,FB);
Student = Record
Nr_Matricol : Word;
Nume_Prenume : String[20];
Rezultate : Record
Algebra, Analiza, Geometrie : 1..10;
Informatica : Calificativ;
Sport : (Respins, Admis);
Case Inf : Calificativ Of
Ns : (Scris,Practic : Integer);
S,B,FB : (Nota : Integer)
End;
Media_Gen : Real;
End;
Var Studenti : Array [1..25] Of Student;
Un_Student : Student;
i, n, k : Byte;
Ordonati : (Da, Nu);
Rasp : String[10];
Begin
n:=0;
{Citeste datele fiecarui student}
With Un_Student, Rezultate Do
Begin
Repeat
Write ( Nume student : ); Readln (Nume_Prenume);
If Nume_Prenume<> Then
Begin
Write ( Numar matricol : ); Readln (Nr_Matricol);
Write ( Algebra (1..10) : ); Readln (Algebra);
Write ( Analiza (1..10) : ); Readln (Analiza);
Write ( Geometrie (1..10) : ); Readln (Geometrie);
Write ( Informatica (NS..FB) : ); Readln(Rasp);
Case Rasp[1] Of
N : Informatica:=NS; S : Informatica:=S;
B : Informatica:=B;
F : Informatica:=FB
End;
If Informatica = Ns Then Begin Write ( Scris, Practic : );
Readln ( Scris, Practic)
End
Else Begin Write ( Nota : );
Readln ( Nota)
End;
Write ( Sport(Adm,Resp) : ); Readln(Rasp);
Case Rasp[1] Of
63

A : Sport:=Admis;
R : Sport:=Respins
End;
If (Informatica in [FB,B,S]) And (Sport = Admis) And
(Algebra>4) And (Analiza>4) And (Geometrie>4) Then
Media_Gen:=(Algebra+Analiza+Geometrie+Nota)/4 Else
Media_Gen:=0;
n:=n+1; Studenti[n]:=Un_Student
End {If}
Until Nume_Prenume=
End; {With}
k:=0;
{ Ordoneaza descrescator dupa medii }
Repeat Ordonati:=Da; k:=k+1;
For i:=1 To n-k Do
If Studenti[i].Media_Gen < Studenti[i+1].Media_Gen Then Begin
Un_Student:=Studenti[i]; Studenti[i]:=Studenti[i+1];
Studenti[i+1]:=Un_Student;
Ordonati:=Nu End
Until Ordonati=Da;
{ Tipareste studentii n ordinea rezultata }
For i:=1 To n Do With Studenti[i] , Rezultate Do
Begin
Write (Nr_Matricol:7,Nume_Prenume:20,
Algebra:3,Analiza:3,Geometrie:3);
Case Informatica Of
NS : Write (' Nesatisfacator ',Scris:3,Practic:3);
S : Write (' Satisfacator
',Nota:6);
B : Write (' Bine
',Nota:6);
FB : Write (' Foarte Bine
',Nota:6)
End;
Case Sport Of
Admis : Write (' Admis '); Respins : Write (' Respins ')
End;
Writeln (Media_Gen:6:2)
End;{With}
Readln
End.
Ca tem propunem modificarea acestui program astfel nct s se poat
obine lista studenilor n ordinea descrescatoare a notelor la fiecare disciplin
far a interschimba lista studenilor introdus de la tastatur. Pentru aceasta se
va construi de fiecare dat un vector de ordine O (oi, i=1,...,n ) unde oi
reprezint numrul de ordine al studentului (din lista iniial) care se afla pe
locul i n lista ordonat. Aceasta nseamn c iniial irul O va conine valorile
(1,...,n), apoi se va schimba aceast ordine, dac este cazul, (se interschimb

64

doar elementele irului O, deci oi oi+1) iar n final se vor tipri studenii n
ordinea dorit, adic se va tipri St[oi], i=1,...,n.

65

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