http://www.adaconcept.com/programs/kartyacsomag_teszt.adb
--Rotter Gyorgy
--generikus/sablon csomag hasznalatat bemutato program
--(egy "absztrakt" rendezest tartalmazo kartyacsomag-rol lesz szo, amibol egy konkret franciakartya csomagot csinalunk majd, es tobbfelekeppen rendezzuk)



with Ada.Text_IO;

with kartyacsomag;                                 --az altalunk megirt generikus/sablon csomag
                                                   --nem lehet use-olni, hiszen ez nem egy konkret csomag, csak egy sablon, egy minta, ami alapjan elkeszitheto a konkret

use Ada.Text_IO;



procedure kartyacsomag_teszt is

    -----------------------------------------------[tipusok, deklaraciok, peldanyositasok...]-------------------------------------------------------------------------

   --FONTOS: diszkret tipusoknal a tipusertekek felsorolasi sorrendje adja a rendezest a tipusertek elemein!!!!!!!
   type franciakartyaszinek is (treff, karo, pikk, kor);                                                --a franciakartya lapjainak szinei
   type franciakartyaertekek is ( '2', '3', '4', '5', '6', '7', '8', '9', 't', 'J', 'D', 'K', 'A');     --a franciakartya lapjainak ertekei a 't' a tizesnek felel meg


   type franciakartyalap is record                                                                      --| ezek alapjan egy franciakartyalap egy szin-t, es ertek-et tartalmazo paros
                              szin:franciakartyaszinek;                                                 --|
                              ertek:franciakartyaertekek;                                               --|
                            end record;                                                                 --|

   function       ertekszerintrendezes(A,B:franciakartyalap) return boolean;        --ennel a fajta rendezesnel csak az ertekeket vesszuk figyelembe a szinekre valo tekintet nelkul
   function szinesertekszerintrendezes(A,B:franciakartyalap) return boolean;        --itt mar a szinek kozotti rendezest IS figyelembe vesszuk (az ertekeken felul)

   package franciakartyacsomag is new kartyacsomag(franciakartyalap,szinesertekszerintrendezes);  --peldanyositjuk a kartyacsomag-unkat, a mar definialt franciakartyalap es pl. ertekszerintrendezes tipusunkkal, es fv.-unkkel
   --use franciakartyacsomag;                                                                     --most mar akar use is lehet...

   --a kovetkezo konstans tartalmazza a franciakartyapakli-ban levo lapok szamat, azaz a tomb elemszamat (ezt a franciakartyaszinek es franciakartyaertekek diszkret tipusok "elemszama" alapjan hatarozza meg)
   francialapokszama:constant positive:=(franciakartyaszinek'pos(franciakartyaszinek'last)-franciakartyaszinek'pos(franciakartyaszinek'first)+1)*(franciakartyaertekek'pos(franciakartyaertekek'last)-franciakartyaertekek'pos(franciakartyaertekek'first)+1);


   franciakartyapakli:franciakartyacsomag.kartyapakli(1..francialapokszama);   --"letrehozzuk" a konkret csomagunk kartyapaklijat (tombjet) a megfelelo elemszammal

   procedure letrehoz;    --feltolti a franciakartyapakli tombot, ugy, hogy minden lap (szin es ertek par) pontosan egyszer szerepeljen benne
   procedure kiir;        --kiirja a franciakartyapakli tomb elemeit


   ------------------------------------------------------[A konkret fv.-ek megirasa]--------------------------------------------------------------------------

     function ertekszerintrendezes(A,B:franciakartyalap) return boolean is
       vissza:boolean;                                                              --a fv. visszateresi erteke, mert strukturaltan programozunk (erre torekszunk! :))
     begin
        if A.ertek<B.ertek then vissza:=true;                                       --csak a lapok ertek-eit hasonlitjuk ossze
                           else vissza:=false;
        end if;
       return vissza;
     end ertekszerintrendezes;


    function szinesertekszerintrendezes(A,B:franciakartyalap) return boolean is
      vissza:boolean;                                                               --a fv. visszateresi erteke, mert strukturaltan programozunk (erre torekszunk! :))
    begin
       vissza:=false;
       if    A.szin<B.szin then vissza:=true;                                       --| eloszor szin, majd azon belul ertek szerint rendezunk
       elsif A.szin>B.szin then vissza:=false;                                      --|
       else if A.ertek<B.ertek then vissza:=true;                                   --|
            end if;                                                                 --|
       end if;                                                                      --|
     return vissza;
   end szinesertekszerintrendezes;


   ---------------------------------------------------------------------------------



   procedure letrehoz is
     akt:positive;                                                                  --mutatja, hogy hanyadik lapnal tartunk, azert positive, mert tuti, hogy egy palkiban legalabb egy lap van barmilyen is... + a fenti indexeles miatt

   begin
      akt:=franciakartyapakli'first;                                                --az elso lap indexe
      for i in franciakartyaszinek loop                                             --|
         for j in franciakartyaertekek loop                                         --|  ilyeneket is lehet irni :)
            franciakartyapakli(akt):=(i,j);                                         --|
            akt:=akt+1;                                                             --noveljuk az indexet
         end loop;
      end loop;
   end;

   procedure kiir is
   begin
      for i in franciakartyapakli'range loop                                        --vegigmegyunk a franciakartyapakli-n es kiirjuk a lapjait, a megfelelo szelektorokkal hivatkozva a komponensekre (mezokre)...
         put(franciakartyaszinek'image(franciakartyapakli(i).szin) & "  " & franciakartyaertekek'image(franciakartyapakli(i).ertek) & "  ");
         new_line;
      end loop;
   end;


begin
   Ada.Text_IO.Put_Line("Program indul");

   put_line("A pakli " & positive'image(francialapokszama) & " lapos lesz.");

   letrehoz;                                                                        --letrehozzuk a franciakartyapakli-t!!!

   kiir;                                                                            --kiirjuk a franciakartyapakli-t!!!

   put_line("-------------------rendezes--------------------------");

   franciakartyacsomag.rendez(franciakartyapakli);                                  --berendezzuk a franciakartyapakli-t!!!

   kiir;                                                                            --es megint kiirjuk a franciakartyapakli-t!!!

   Ada.Text_IO.Put_Line("Program vege");
end kartyacsomag_teszt;


--es mar keszen is vagyunk :)