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;