Professional Documents
Culture Documents
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 }
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 ob•inut• scriind
T[i][j]. Mention•m c• se accept• o prescurtare a declara•iei de mai sus sub forma
:
T : Array [1..10, 1..6] Of Real ;
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 { Nr.zile în luna l }
2 : 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; Writeln
End; Readln
End;
End.
51
Un exerci•iu pe care îl propunem este urm•torul :
52
Exemplu :
b) rela•ionali :
- = pentru egalitatea a doua multimi ( = ), If A=B Then ...
- <> pentru neegalitate ( ≠ ), While A<>B Do ...
- >= pentru incluziunea nestricta “include” ( ⊇ ) , Repeat ... Until A>=B ;
- <= pentru incluziunea nestricta “inclus in” ( ⊆ ) , Inclus := A<=B ;
- In pentru apartenen•• (∈). Case e în A Of ... End;
53
Exemplu :
Vocale := [‘A’,’E’,’I’,’O’,’U’];
Consoane := [‘A’..’Z’] − Vocale;
Readln (N); Numere := [1..N]; { N este o variabil• de tip Integer }
Ciur={2,...,n}; Prime=∅;
Repet•
elementul minim din Ciur va fi mutat în mul•imea Prime,
iar din Ciur se elimin• to•i multiplii acestuia
Pân•_când Ciur-ul devine vid; { Ciur=∅ }
Rezultate Prime.
54
Program Ciurul_lui_Eratostene; (* Numerele prime < n *)
Var 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.
Pot fi a •i b mai mari dacât 255 ? Cum poate fi modificat acest program
pentru a rezolva aceast• problem• ? În mul•imi vom re•ine doar indici din •irul
tuturor divizorilor. În felul acesta mul•imile pot con•ine elemente de orice tip,
dar cardinalul maxim al mul•imilor va fi doar 255.
55
7.3. Tipul •ir_caractere (String).
Exemplu :
Type Linie = String [80]; { Siruri de maxim 80 de caractere }
SirCar = String; { Siruri de maxim 255 de caractere }
Var Mesaj : String;
Rand : Line;
S : String [20];
X : Array [0..20] Of Char;
Exemplu :
′Str. Lalelelor, Nr.2′ ,
′ Domnu′′ Trandafir ′ ( reprezint• •irul Domnu′ Trandafir ).
56
Opera•ia de concatenare a dou• •iruri este notat• cu + . De exemplu
′Algoritmica,′ + ′ Programare ′ are valoarea ′Algoritmica, Programare′.
Operatorii rela•ionali permit compararea a dou• •iruri utilizând ordinea
lexicografic• (utilizat• în dic•ionare, c•r•i 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...’.
57
- Str (e,S) depune în variabila S, •irul cifrelor corespunz•toare valorii
(numerice) expresiei e , care poate avea ata•at 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 con•ine caractere ce reprezint•
un numar scris corect atunci se va depune în v valoarea acelui num•r iar în Cr
valoarea 0. Dac• •irul S con•ine caractere nepermise, atunci în v se depune
valoarea 0 iar în variabila Cr (de tip întreg) pozi•ia 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 pozi•ia 3 se afl• ‘d’).
58
expresie) pân• când se va introduce expresia vid• (•irul vid) adic• se tasteaz•
doar Enter în momentul citirii expresiei.
Programul Pascal este urm•torul:
59
Un alt exerci•iu pe care îl propunem ca tem• este urm•torul:
“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 , utilizând caracterul ‘^’ pentru a marca puterea.
Pentru a rezolva aceast• problem•, se poate extrage din •irul dat, pe rând
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), urmând s• calcul•m
valoarea polinomului ob•inut.
60
înregistrare are o parte fix• format• din mai multe câmpuri 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 8 9 F.B. Admis 9.00
12295 Barbulescu Ioan 9 7 9 B. Admis 8.33
... ... ... ... ... ... ... ...
18944 Zaharascu Paula 9 10 8 F.B. Respins -
Declararea tipului inregistare const• într-o o parte fix• (în care se declar•
câmpurile împreun• cu tipurile lor) •i eventual o parte variabil• (Case ... , în
care câmpurile difer• în func•ie valoarea unor câmpuri din partea fix•) astfel :
Record
<list•_câmpuri> : <tip_câmp> { ;
<list•_câmpuri> : <tip_câmp> }
[ Case [ <id> : ] <tip_sel> Of
<const> : (<list•_câmpuri> : <tip_câmp> { ;
<list•_câmpuri> : <tip_câmp> } ) { ;
<const> : (<list•_câmpuri> : <tip_câmp> { ;
<list•_câmpuri> : <tip_câmp> } ) } ]
End;
61
notele ob•inute la scris •i practic, iar dac• valoarea depus• a fost B sau FB
atunci în partea variabil• se va re•ine doar nota final• obtinut•.
În cazul în care referim mai multe câmpuri din cadrul unei înregistr•ri se
poate evita precizarea multipl• a acelea•i înregistr•ri prin instruc•iunea With.
Aceasta are urm•toarea sintax• :
De exemplu, în loc de
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.
64
doar elementele •irului O, deci oi ↔ oi+1) iar în final se vor tip•ri studen•ii în
ordinea dorit•, adic• se va tip•ri St[oi], i=1,...,n.
65