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 :)