http://www.adaconcept.com/programs/sorsologep.adb
with Ada.Text_IO;
with Ada.Numerics.Discrete_Random; --KELL a diszkret ertekek veletlen generalasahoz
use Ada.Text_IO;
package body sorsologep is
procedure sorsolasimodbekeres is
package sorsolasimod_io is new enumeration_io(sorsolasimodok); --|generikus csomag peldanyositas beagyazva
--| type sorsolasimodok is (kezi, gepi); a specifikacios fajlban
--| ha a sajat felsorolasi tipusunkhoz szeretnenk io csomagot, pl. azert, hogy
--| a billentyuzetrol bekerjuk a tipusertekeit, akkor peldanyositanunk kell egy
--| enumeration_io generikus csomagot...
--| ez egy szoveg bekerest+konvertalast vegez automatikusan
be:sorsolasimodok; --ebbe a valtozoba kerunk be a billentyuzetrol
begin
put_line("Kerem adja meg a sorsolas modjat! (gepi/kezi)");
sorsolasimod_io.get(be); --itt kerunk be a be-valtozoba
sorsolasimod:=be; --|ha sikerult az automatkus konvertalas, azaz nem volt kivetel, akkor ertekuladjuk a
--|"globalis adatmezonek" a be erteket;
exception
when data_error => put_line("nem 'gepi'-t vagy 'kezi'-t adott meg!");
raise;
end sorsolasimodbekeres;
procedure golyokletrehozasa is
begin
for i in golyok'range loop --vegigmegyunk a ("globalis") golyok tombon, melynek elemei golyotipus -tipusuak
golyok(i):=(nincs_kihuzva,otoslottoszamtipus(i)); --rekordnak igy is lehet erteket adni. Fontos, hogy a diszkriminans is kapjon erteket!
end loop;
Put_line("Golyok letrehozva");
end golyokletrehozasa;
procedure kisorsoltgolyokkiirasa is
begin
for i in golyok'range loop --szinten a golyok tombon megyunk vegig
if golyok(i).allapot=kihuzva then --feltetel a diszkriminansra!!!
put_line("("& otoslottoszamtipus'image(golyok(i).szam) & " ) --"& sorszam'image(golyok(i).hanyadiknak_huztak)); --sajat tipusaink attributumait is ugyanugy hasznalhatjuk, mint a beepitett tipusoket
end if;
end loop;
end kisorsoltgolyokkiirasa;
procedure sorsolas is
package szamgeneralo is new Ada.Numerics.Discrete_Random(otoslottoszamtipus); --|ha veletlenszamot szeretnenk az otoslottoszamtipus tipusertekhalmazabol
--|Ada.Numerics.Discrete_Random generikus csomagnak kell megadni a tipusunkat
--|es ebbol kell new -al letrehozni a csomagunkat...
--|igy kell egy tetsz. diszkret tipust generalni...
--use szamgeneralo; --akar hasznalhatunk use-t is a "letrehozott" csomagunkra
szg:szamgeneralo.generator; --ez lesz a generatorunk, (ez "adja majd" a veletlenszamokat)
generaltszam:otoslottoszamtipus; --ennek a valtozonak adjuk majd ertekul a generalt szamot
jo:boolean; --logikai valtozo (, hogy ketszer ne tudjuk ugyanazt a szamot generalni)
begin
szamgeneralo.reset(szg); --KELL: felkeszulunk a generalasra!!!
for i in 1..5 loop --5 szamot generalunk
jo:=false;
loop --"hatultesztelos ciklus" (addig genralunk szamokat, mig 5 kulonbozo nem lesz)
generaltszam:=szamgeneralo.random(szg); --igy generaljuk a szamot
if golyok(positive(generaltszam)).allapot=nincs_kihuzva then jo:=true; end if; --mivel a golyok positive-vel vannak indexelve konvertalni kell. Erre figyeljunk!
exit when jo=true; --|a "hatultesztelos ciklus" kilepesi feltetele...
end loop; --|...ha ezt a golyot meg nem huztuk ki akkor jo
golyok(positive(generaltszam)):=(allapot=>kihuzva,szam=>golyok(positive(generaltszam)).szam,hanyadiknak_huztak=>sorszam(i)); --ld. köv sor komment...
--|a golyok tomb indexelesehez konvertalni kell, az indextipus (positive) es az otoslottoszamtipus kozott.
--| mert type otoslottoszamtipus is new positive range 1..90; -kent hataroztuk meg, azaz az otoslottoszamtipus egy teljesen uj tipus, es igy kezeli a fordito is
--|az ertekadasnak az egesz rekordra kell vonatkoznia! diszkriminanssal egyutt!!! az egyes mezoknek pedig igy is erteket adhatunk...
end loop;
end sorsolas;
end sorsologep;