Tipul SET (multime)
O multime (SET) (Borland) PASCAL este o implementare limitata a conceptului matematic de multime. In cele ce urmeaza noi vom încerca sa demonstram teoreme despre proprietatile multimilor si nu vom prezenta facilitatile pe care le ofera tipul SET în rezolvarea unor clase largi de probleme.
Urmatoarea sectiune TYPE contine patru declaratii de multimi:
Exemplu:
TYPE
...car=SET OF char;
...raspuns=SET OF boolean;
...cifra=0..9;
...cifre= SET OF cifra;
...luna=(ian, febr, mar, apr, mai,
...iun, iulie, aug, sept, oct, nov, dec);
...perioada=SET OF luna;
Ultimele doua declaratii pot fi combinate într-un singur enunt:
perioada=SET OF (ian, febr, mar, apr, mai, iun, iulie, aug, sept, oct, nov, dec);
Diagrama de sintaxa pentru tipuri de date multime sintetizeaza tot ceea ce urmeaza.
Diagrama de sintaxa a tipului SET

este fie numele unui tip ordinal declarat anterior sau un tip ordinal (nou) declarat la locul respectiv (ca în SET OF [0..9]).
(Borland) PASCAL 7.0 limiteaza numarul de elemente ale unei multimi la 256. Din acest motiv tipul de baza al unei multimi nu poate fi tipul integer, ci numai un subdomeniu al acestui tip, cu cardinal cel mult 256.
Dupa cum am mai precizat, tipul de baza al multimii este acel tip care stabileste domeniul în care elementele multime pot fi accesate.
Daca tipul de baza este enumerare si contine zilele saptamânii, putem forma multimi cum ar fi [luni, marti] si [miercuri, joi, vineri], dar nu [vineri, joi, miercuri, 20].
Remarca. O multime poate fi construita din elementele sale folosind constructorii de multimi: enumerarea elementelor inclusa între paranteze drepte. Notatia x..y într-o astfel de enumerare este echivalenta cu specificarea tuturor elementelor între x si y.
Astfel, [7, 8, 9] reprezinta multimea cu trei elemente de tip întreg, ['A'..'Z'] reprezinta multimea majusculelor cu tipul de baza char, iar [ ] reprezinta multimea vida.
Pentru variabilele si constantele de tip multime sunt definite toate operatiile întâlnite în teoria multimilor: reuniune, intersectie, diferenta (vezi Conversatia 3).
Matematica
PASCAL
c=aÈ b
c:=a+b
c=aÇ b
c:=a*b
c=a-b; d=b-a;
c:=a-b; d:=b-a
eÎ a {da sau nu}
e in a {true sau false}
Operatorul IN testeaza apartenenta unui element la o multime. In partea stânga a operatorului IN se poate gasi o variabila sau o expresie, iar în partea dreapta a sa trebuie sa existe o expresie de tip multime. Tipul membrului stâng trebuie sa fie tipul de baza al multimii din membrul drept.
In mod obisnuit, o variabila de tip SET este declarata mai întâi prin descrierea tipului de baza al acesteia, declarând apoi variabila de tip SET ca fiind de acel tip.
Exemple:
TYPE
...cifra=SET OF 0..9;
VAR
...s1,s2,s3,s4,s5:cifra;

TYPE
...litera=SET OF char;
VAR
...vocala:litera;

TYPE
...litera=SET OF char;
...cifra=SET OF 0..9;
...x=1..50;
VAR
...unu, doi:SET OF x;
...lit:litera;
...val:cifra;

TYPE
...i=1..100;
...b=SET OF i;
VAR
...c:b;

TYPE
...i=100..300;
...b=SET OF i;
TYPE
...i=200..300;
...b=SET OF i;
O variabila de tip SET contine valoari corespunzatoare tipului de baza. Puteti atribui o valoare unei variabile de tip SET prin listarea tuturor elementelor sale în interiorul parantezelor drepte ([ ]).
Pentru compararea multimilor se utilizeaza urmatorii operatori de relatie := (egalitatea multimilor); <> (inegalitatea multimilor); <= (incluziune - ); >= (incluziune - ).
Remarca. Atribuirea S4:=S4+[7] este corecta; folosirea lui 7 în locul lui [7] ar fi fost o eroare. Este incorecta declaratia:
VAR s:SET OF [0..255];
deoarece [0..255] este deja o multime.
Aplicatie. Scrieti un program care analizeaza daca toate cele 26 de litere ale alfabetului sunt prezente cel putin o data in mai multe propozitii scrise cu majuscule, câte una pe fiecare linie de input.
Programul tipareste lista cu literele care lipsesc (o propozitie care contine toate cele 26 de caractere alfabetice se numeste pangram).
PROGRAM pangram;
TYPE
...litere = 'A'.. 'Z';
...letset = SET OF litere;
VAR
...all, ourset: letset;
...ch:char;
PROCEDURE printset(s: letset);
VAR
...letter:char;
BEGIN
...FOR letter: = 'A' TO 'Z' DO
......IF letter in s THEN write (letter,' ');
...writeln
END {printset};

BEGIN {programul principal}
...all:= [ 'A'..'Z'];
...write('Propozitia');
...WHILE NOT eof DO
...BEGIN
......ourset:= [ ];
...WHILE NOT eoln DO
...BEGIN
......read(ch);
......IF ch in ['A'..'Z'] THEN ourset:= ourset+ [ch]
...END { line }
...readln;
...IF ourset= all THEN writeln ('Contine intregul alfabet')
...ELSE
...BEGIN
......write('Nu contine:');
......printset(all-ourset)
...END;
...write('Propozitia:')
...END {WHILE NOT eof}
END {pangram}.

Rezultatele executiei
0 Responses

Отправить комментарий