Hulgad [Sets]

Hulgad on igapäevaelus tavalised. Hulgad on viis tavaliste tüüpide määratlemisel gruppidesse. Pascalis mõistetakse hulkade all mingit väärtuste piirkonda algväärusest lõppväärtuseni

Vaatleme järgmist täisarvude hulka:

                1, 2, 3, 4, 5, 6, 7, 8, 9, 10

See on arvude (täisarvud) hulk või komplekt, mille väärtuste vahemik on 1 kuni 10. Sellise hulga tüübi määratlemiseks Pascalis kasutatakse järgmist süntaksit:

program hulk1(output);

type numberset = set of 1..10;

var minuarvud: numberset;

begin

end.

Korraldus:    type numberset = set of 1..10;

deklareerib uue tüübi nimega numberset, mis esindab täisarvude hulka vähima väärtuisega 1 ja suurima väärtusega 10. Väärtused 1..10 tähendavad arve 1 kuni 10 kaasaarvatud. seda nimetatkse ka alus- või baashulgaks, so. väärtuste hulka, milliste hulgast komplekt on võetud.

Alushulk on mingi piiratud väärtuste hulk. Me võime näiteks rääkida sümbolite hulgast (set of char), kuid mitte täisarvude hulgast (set of integers), sest täisarvude hulk omab liiga palju võimalikke väärtusi, samas on sümbolite hulk piiratud mingte kindlate väärtustega.

Korraldus:    var minuarvud: numberset;

 loob meie programmis töömuutuja, mis kannab nime minuarvud, mis on hulk ja mis võib omada väärusi vahemikus, mis on defineeriud (määratletud) numberset'iga.

HULGAOPERATSIOONID

Tüüpilised hulkadega seotud operatsioonid on:

Väärtuste omistamine hulgale: UNION

Hulga ühendus ehk ühendhulk (Union) on hulkade lisamine, millised samuti on algväärtustatud väärtuste omistamisega hulgale.

Vaatleme järgmist määratlust, millega omistatakse hulgale väärtused:

program hulk2(output);

type numberset = set of 1..10;

var minuarvud: numberset;

begin

            minuarvud :=[ ];

            minuarvud :=[2..6]

end.

Korraldus: minuarvud :=[ ];

omistab tühja hulga minuarvud-ele

Korraldus: minuarvud :=[2..6];

omistab väärtuste alamhulga (arvud 2 kuni 6 kaasa arvatud) numberset tüübiga määratletud arvude hulgast. Tasub teada, et väärtuste omistamine väljaspoolt numberset tüübiga määratletud arvude hulka põhjustab veateate, seega korraldus:

minuarvud :=[6..26];

on mittelubatud, kuna minuarvud on tuletatud alustüübist numberset, mis on täisarvude hulk väärtustega 1-st 10-ni. Igat väärtust väljaspool neid piire käsitletakse mittelubatutena.

Kuidas kontrollida, kas väärtus kuulub hulka?

Laiendame ülaltoodud programmi näidet ja näitame, kuidas kontrollida, kas väärtus kuulub hulka. Koostame programmi, milline loeb klaviatuurilt sistatud arvu ja kontrollib selle kuulunist hulka:

program hulk3(input, output);

type numberset = set of 1..10;

var minuarvud : numberset;

        v22rtus : integer;

begin

        minuarvud :=[2..6];

        v22rtus :=1;

        while( v22rtus <>0) do

        begin

                writeln('Sisetage klaviatuurilt täisarv, (l6petamiseks 0)');

                readln( v22rtus );

                if v22rtus <> 0 then

                begin

                    if v22rtus IN minuarvud then

                        writeln(' See arv kuulub hulka' )

                    else

                        writeln(' See arv ei kuulu hulka' )

                end

        end

end.

 

ühendhulgad ja hulkade kombineerimine

 

Vaatame, kuidas hulgale teist lisada. Vaatame näitena programmi, mis loob kaks hulka ja seejärel moodustab nendest liithulga (Union).

 

program liithulk( input, output );

type numberset = set of 1..40;

var minuarvud, muudarvud, liitarvud : numberset;

        v22rtus : integer;

begin

    minuarvud := [2..6];

    muudarvud :=[4..10];

    liitarvud := minuarvud + muudarvud + [14..20];

    v22rtus :=1;

    while( v22rtus <>0 ) do

    begin

        writeln('Sisetage klaviatuurilt täisarv, (l6petamiseks 0)');

        readln( v22rtus );

        if v22rtus <> 0 then

        begin

             if v22rtus IN liitarvud then

                        writeln(' See arv kuulub hulka' )

             else

                        writeln(' See arv ei kuulu hulka' )

         end

    end

end.

 

Korraldus var minuarvud, muudarvud, liitarvud : numberset;

 

määratleb 3 numberset tüüpi hulka,

 

korraldus  minuarvud := [2..6]; omistab numberset tüüpi alamhulgale minuarvud  väärtuste hulga 2-6 (piirid kaasa arvatud) ja 

 

korraldus muudarvud :=[4..10]; omistab numberset tüüpi alamhulgale muudarvud  väärtuste hulga 4-10 (piirid kaasa arvatud),

 

korraldus liitarvud := minuarvud + muudarvud + [14..20]; omistab hulgale liitarvud väärtuste hulgad minuarvud  ja muudarvud  ning väärtuste hulga 14-20.

 

Kui mingi väärtus on rohkem, kui ühes hulgas (meie näites 4, 5 ja 6, millised on esindatud nii minuarvud , kui ka  muudarvud  hulgas), siis teist dubleerivat väärtust lihtsalt ignoreeritakse, st. uude hulka kopeeritakse ainult üks väärtuse esindaja. Seega hulk liitarvud sisaldab järgmisi väärtusi (vt. allolevat pilti!):

 

Hulkade vahe, erinevus (lahutamine)(Difference)

 

Selle operatsiooni puhul sisaldab uus hulk väärtusi esimesest hulgast, milliseid POLE ka teises hulgas

 

program hulkadeerinevus(input, output);

type numberset = set of 1..40;

var minuarvud, muudarvud, yhendarvud : numberset;

        v22rtus : integer;

begin

        minuarvud := [2..6];

        muudarvud := [4..10];

        yhendarvud := minuarvud - muudarvud;

        v22rtus :=1;

        while (v22rtus <>0) do

        begin

                writeln('Sisetage klaviatuurilt täisarv, (l6petamiseks 0)');

                readln( v22rtus );

                if v22rtus <> 0 then

                begin

                   if v22rtus IN yhendarvud then

                         writeln(' See arv kuulub hulka' )

                     else

              writeln(' See arv ei kuulu hulka' )

       end

end

end.

 

yhendarvud sisaldavad väärtusi:    

 

Hulkade korrutis, ühisosa (ka tavalisus - otsetõlkes) (Intersection)

 

Selle tehte puhul uus hulk sisaldab väärtusi, mis on tavalised määratletud hulkades (on nende liikmed)

 

program hulkadekorrutis (input, output);

type numberset = set of 1..40;

var minuarvud, muudarvud, yhisarvud : numberset;

v22rtus : integer;

begin

minuarvud := [2..6];

muudarvud := [4..10];

yhisarvud := minuarvud * muudarvud * [5..7];

v22rtus :=1;

while (v22rtus <> 0) do

begin

writeln ('Sisestage täisarvuline väärtus, (väljumiseks 0) ');

readln (v22rtus);

if v22rtus <>0 then

begin

if v22rtus IN yhisarvud then

writeln ('See väärtus on hulga liige')

else

writeln ('See väärtus ei kuulu hulka')

end

end

end.

yhisarvud sisaldab väärtusi:

üks hulkade kasutusnäide :

type

hulk = set of integer;

var

A, B, C: hulk;

begin

A := [1, 2, 3];

B := [2, 3, 4];

C := A + B; { C = [1, 2, 3, 4] }

C := A * B; { C = [2, 3] }

C := A - B; { C = [1] }

end.

Hulki saab võrrelda järgmiste võrdlusoperaatorite abil :

= võrdub

<> ei võrdu

<= sisaldub

>= sisaldab

in kuulub 

Viimases näites väärtustatud muutujate A ja B korral kehtivad seega järgmised väited :

A <> B

A - [1] <= B

1 in A

not (1 in B) 

Olgu näiteks vaja kontrollida, kas sisestatav tekst koosneb ainult etteantud tähestikku kuuluvatest sümbolitest. Koostame programmi:

program symbolid;

const Tahed: set of char = ['A'..'Z', 'a'..'z', 'õ','ä','ö','ü', 'õ','ä','ö','ü'];

function KasTaht(aC: char): Boolean; (* Kontrollitakse, kas sümbol on täht *)

begin

KasOnTaht := aC in Tahed;

end;

 

var

c: char;

Taht: Boolean;

begin

Taht := True;

while not Eoln do (* sisestatakse sümbolhaaval tekst ja ... *)

begin

read(c); (* ... kontrollitakse, kas sümbol kuulub tähestikku *)

Taht := Taht and KasOnTaht(c);

end;

if Taht then (* kontrolli tulemuse väljastus *)

writeln('Tekst sisaldas vaid tähti')

else

writeln('Tekst sisaldas peale tähtede ka muid sümboleid');

end.

Vaatame, kuidas näeks programmi variant, mis lubab kasutajal tähestiku ette anda. 

program symbolid2;

var Tahed: set of char;

function KasOnTaht(aC: char): Boolean; (* Kontrollitakse, kas sümbol on täht *)

begin

KasOnTaht := aC in Tahed;

end;

 

var

c: char;

Taht: Boolean;

begin (* tähestiku sisestamine *)

writeln('Sisestage tähestik');

while not Eoln do

begin

read(c);

Tahed := Tahed + [c];

end;

Taht := True; (* sisestatakse sümbolhaaval tekst ja ... *)

while not Eoln do

begin

read(c); (* ... kontrollitakse, kas sümbol kuulub tähestikku *)

Taht := Taht and KasOnTaht(c);

end;

if Taht then (* kontrolli tulemuse väljastus *)

writeln('Tekst sisaldas vaid tähti')

else

writeln('Tekst sisaldas peale tähtede ka muid sümboleid');

end.

 

PROOVIGE ISE:

1. Looge mingite arvutikomponentide hulk, näiteks kompon=(kettad, adapterid, emaplaadid, protsessorid, m2lud); arvutikomponendid : Set of kompon; 

 

2. Looge alamhulki nagu kettad=(FDD, HDD, Zip, CDROM, DVDROM), adapterid=(video, heli, I/O, lan, scsi, ide)

 

3. Proovige ülalkirjeldatud tehteid hulkadega 

Kodutööde ja arvestusülesannete väljatrükk peab sisaldama kommentaaripäist programmi tegevuse eesmärgiga ning autori nime ja rühma.

N: program Silinder:
(* programm leiab silindri pindala ja ruumala *)
(* Autor: Aadu Kadakas AV-11 *)