http://www.adaconcept.com/programs/gyerekcsomagos/nyolc_kiralyno.adb
with Ada.Text_IO;
with Szamrendszerek.Vegyes_Alapu_Szamrendszer.Teszt; -- ez elerhetove teszi a "szolo-csomagjait" is
with Szamrendszerek.Vegyes_Alapu_Szamrendszer; -- az elozo with miatt ez a csomag is elerheto, de a kod olvashatosaganak noveleses erdekeben, mindig igyekezzunk with -elni azokat a csomagokat, amelyeket hasznalunk
procedure nyolc_kiralyno is
use Szamrendszerek; -- use -olni "lokalisan" is lehet
Kiralynok : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; -- := Vegyes_Alapu_Szamrendszer.Letrehoz((0..7 => 8)); -- Ada 2005 -tol egy limited tipusu valtozot igy is inicializalhatunk, "Konstruktor" hivas (letrehozunk egy (maximum) 8 szamjegybol allo 8 -as alapu szamrendszerben felirt szamot)
-- Figyeljuk meg, hogy a kodban szamos helyen a kiralyno helyett a vezer szot hasznaljuk (amikor egy nagyobb programot irunk mindig fontoljuk meg
-- milyen terminologiat hasznalunk, mert egy kelloen hozza nem erto ember szamara ez felrevezeto lehet)
-- Megjeleniti a "sakktablat" rajta a vezerekkel
procedure Kirajzol(Kiralynok : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus) is
Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(kiralynok);
begin
for i in reverse 0 .. 7 loop
for j in reverse Poziciok'Range loop
if Poziciok(j) = i then -- ahol van vezer
Ada.Text_IO.Put(" V ");
else -- ahol nincs vezer
Ada.Text_IO.Put(" - ");
end if;
end loop;
Ada.Text_IO.Put(Natural'Image(i + 1)); -- mindig legyunk kovetkezetesek abban, hogy a kiirast csusztatjuk el vagy az indexelest
Ada.Text_IO.New_Line;
end loop;
Ada.Text_IO.Put_Line(" a " & " b " & " c " & " d " & " e " & " f " & " g " & " h "); -- ez a sor egeszen meglepo :) (altalaban talblazatok "kirajzolasakor" latni ilyet...)
Ada.Text_IO.Put_Line("egy megoldas: ");
for i in Poziciok'Range loop
Ada.Text_IO.Put("[" & Character'Val(Character'Pos('a') + i ) & Natural'Image(Poziciok(Poziciok'Last - i) + 1 ) & "] ");
end loop;
Ada.Text_IO.New_Line;
end Kirajzol;
procedure Keres(Kiralynok_Pozicioi : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Akt_Oszlop : in out Natural; megvan : out Boolean) is
Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok_Pozicioi);
function Kiralynok_Utik_Egymast(Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus; o : Natural) return Boolean is
Vissza : Boolean := False;
i : integer;
begin
i := o;
while not Vissza and i < Poziciok'Last loop
if Poziciok(i + 1) = Poziciok(o)
or Poziciok(i + 1) = Poziciok(o) - ( i + 1 - o )
or Poziciok(i + 1) = Poziciok(o) + ( i + 1 - o ) then
Vissza := True;
end if;
i := i + 1;
end loop;
return Vissza;
end Kiralynok_Utik_Egymast;
begin
-- linearis kereses
Akt_Oszlop := Akt_Oszlop + 1;
Megvan := True;
while megvan and Akt_Oszlop /= 0 loop
megvan := not Kiralynok_Utik_Egymast(Poziciok, Akt_Oszlop - 1);
Akt_Oszlop := Akt_Oszlop - 1;
end loop;
end Keres;
-- Probaljuk az elnevezeseinket a konkret feladathoz igazitani
procedure Lep(Szam : in out Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Hanyadik_Indexu_Helyierteken : in out Natural; Mennyivel : Natural := 1) renames Vegyes_Alapu_Szamrendszer.Novel;
procedure Novel(Kiralynok : in out Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Melyik_Oszlopban : in out Natural) is
Vege : Boolean;
begin
Vege := True;
while Vege and Melyik_Oszlopban < Vegyes_Alapu_Szamrendszer.Legmagasabb_Helyiertek_Indexe(Kiralynok) loop
Lep(Kiralynok, Melyik_Oszlopban);
Vege := Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok);
end loop;
end Novel;
procedure Osszes_Lehetseges_Modon_Feltesz is
Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok);
Akt_Oszlop : Natural; -- az az oszlop, amelyikben eppen megtoljuk a kiralynot
Megvan : Boolean;
begin
Akt_Oszlop := Poziciok'Last;
Keres(Kiralynok, Akt_Oszlop, megvan);
while not Megvan and not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) loop
-- delay 0.5; --| szandekosan a kodban hagyott tesztelest segito komment
-- Kirajzol(Kiralynok); --|
Novel(Kiralynok, Akt_Oszlop);
if not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) then
Keres(Kiralynok, Akt_Oszlop, megvan);
end if;
end loop;
Kirajzol(Kiralynok);
end Osszes_Lehetseges_Modon_Feltesz;
procedure Osszes_Lehetseges_Megoldas_Megszamlalasa is
Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok);
Akt_Oszlop : Natural;
db : Natural;
Megvan : Boolean;
begin
Akt_Oszlop := Poziciok'Last;
db := 0; -- a kezdo-ertek-adast irjuk minel kozelebb a valtozo felhaszanlasi helyehez
while not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) loop
Keres(Kiralynok, Akt_Oszlop, megvan);
if megvan then
db :=db + 1;
end if;
Novel(Kiralynok, Akt_Oszlop);
end loop;
Ada.Text_IO.Put_Line("A lehetseges megoldasok szama:" & Natural'Image(db));
end Osszes_Lehetseges_Megoldas_Megszamlalasa;
begin
Ada.Text_IO.Put_Line("Program indul");
Szamrendszerek.Vegyes_Alapu_Szamrendszer.Teszt.Teszt; -- a csomag tesztelese
-- "Konstruktor" hivas (letrehozunk egy (maximum) 8 szamjegybol allo 8 -as alapu szamrendszerben felirt szamot)
Vegyes_Alapu_Szamrendszer.Letrehoz(kiralynok, (0..7 => 8));
Vegyes_Alapu_Szamrendszer.Beallit(kiralynok, (0,0,0,0,0,0,0,0)); -- a tomb 0 -atol indexelodik!!!
Osszes_Lehetseges_Modon_Feltesz; -- Visszalepeses kereses
Osszes_Lehetseges_Megoldas_Megszamlalasa; -- Visszalepeses szamlalas
Ada.Text_IO.Put_Line("Program vege");
end nyolc_kiralyno;