Cześć. Jestem w klasie 1 TI i dostałem do napisania projekt w pascalu(chciałem w c++ ale nauczyciel mi nie pozwolił, bo jeszcze nie mieliśmy c++, mimo, że bardziej umiem c++ niż pascala). Nie znam się wgl na pascalu, tylko to co było na lekcjach, czyli niewiele. Napisałem już, ale nie działa mi to do końca. Co prawda kompiluje się bezbłędnie, ale: w fpc występuje problem 201 w trakcie działania, a w dev pascal nie ma problemu, ale też nie działa jak należy. Sądzę, że źle sformułowałem warunki, ale nie wiem jak w pascalu robi się inaczej.
Co do warunków to w głównej pętli, gdzie też są wykonywane zmiany na tablicy, jeden warunek się wypełnia, a następnie w fpc błąd 201, a w dev pascal wyrzuca z pętli. Więc na pewno coś źle z warunkami. A i jeszcze w pętli sprawdzania poprawnej wartości określającej długość tablicy w osi y to też warunek nie działa. Nawet gdy jest false to przechodzi do true. Warunek jest zbudowany z dwóch innych, połączony and. Gdy jest prosty warunek to działa.
Proszę o pomoc, a kod wygląda tak(dorzucam do załącznika również):
program hanoi;
uses crt;
var
x,y,i,j,t,z,k,l1,l2,l3,l4,l5:integer;
tab:array [1..3,1..100] of integer; // Deklaracja tablicy 3 x 100
// Objasnienie zmiennych
// x - dlugosc w osi x
// y - ilosc klockow(os y)
// z - wartosc poczatkowa(sprawdzanie poprawnosci wprowadzania ilosci klockow)
// t - prawidlowa wartosc
// i - podglad tablicy(drugi index)
// j - podglad tablicy(pierwszy index)
// k - komorka o indexie 2 na osi x(koncowa)
// l1 - licznik indexu osi x, wartosc komorki, ktory on opisuje jest kopiowana do l2
// l2 - licznik indexu osi x, wartosc komorki, ktory on opisuje jest zastapiona przez l1
// l3 - licznik indexu osi y (x-2)
// l4 - licznik indexu osi y (x-1)
// l5 - licznik indexu osi y (x-0)
// Start - procedura wyswietlania aktualnego stanu tablicy
procedure stan_tablicy;
begin
for i:=1 to y do
begin
for j:=1 to x do
begin
write(' ',tab[j][i]);
end;
writeln(' ');
end;
delay(1000);
clrscr();
end;
// Koniec - procedura wyswietlania aktualnego stanu tablicy
begin
x:=3;
writeln('Witaj w programie "Wieza Hanoi"');
writeln();
writeln('Wprowadz liczbe okreslajaca wysokosc wiezy(min 2,max 100)');
// Poczatek sprawdzania poprawnej wartosci
z:=32767;
t:=0;
repeat
readln(y);
if ((y<=1) and (y>=101)) then
begin
t:=t+1;
writeln('Nieprawidlowa wartosc, sprobuj jeszcze raz');
end
else
begin
t:=z;
end;
until (t=z);
// Koniec sprawdzania poprawnej wartosci
writeln();
// Poczatek inicjacji wartosci tablicy
for i:=1 to y do
begin
j:=1;
tab[j][i]:=i;
for j:=2 to x do
begin
tab[j][i]:=0;
end;
end;
// Koniec inicjacji wartosci tablicy
writeln('Wieza ma rozmiary: ',x,' x ',y,' i na poczatku wyglada nastepujaco:');
writeln();
// Poczatek podgladu tablicy
for i:=1 to y do
begin
for j:=1 to x do
begin
write(' ',tab[j][i]);
end;
writeln(' ');
end;
delay(3000);
clrscr();
// Koniec podgladu tablicy i czyszczenie stanu ekranu(nastepuje przejscie do wiezy)
stan_tablicy;
k:=x-1;
l1:=1;
l2:=x;
l3:=1;
l4:=y;
l5:=y;
repeat // Start przetwarzania wiezy
//
if ((tab[3][y]=0) and (tab[2][y]=0)) or ((tab[2][y]=0) and (tab[1][y]=0)) or ((tab[1][y]=0) and (tab[3][y]=0)) then // gdy na osi x w dwoch komorkach na dole jednoczesnie sa dwa 0
begin
if (tab[3][y]=0) then
begin
if ((l1=1) and (l2=3)) then
begin
if (tab[l1][l3]>=1) then
begin
tab[l2][l5]:=tab[l1][l3];
tab[l1][l3]:=0;
l3:=l3+1;
l1:=l1+1;
l2:=l2-2;
stan_tablicy;
end
else if (tab[l1][l3]=0) then
begin
l1:=l1+1;
end;
end;
if ((l1=2) and (l2=3)) then // taka sytuacja nie mozliwa, ale niech bedzie dla pelnosci algorytmu
begin
if (tab[l1][l4]>=1) then
begin
tab[l2][l5]:=tab[l1][l4];
tab[l1][l4]:=0;
l4:=l4-1;
stan_tablicy;
end;
l1:=l1-1;
end;
end
else
begin
l1:=l1+1;
l2:=l2-2;
end;
if (tab[2][y]=0) then
begin
if ((l1=3) and (l2=2)) then
begin
if (tab[l1][l5]>=1) then
begin
tab[l2][l4]:=tab[l1][l5];
tab[l1][l5]:=0;
l5:=l5+1;
l1:=l1-2;
l2:=l2+1;
stan_tablicy;
end
else if (tab[l1][l5]=0) then
begin
l1:=l1-2;
end;
end;
if ((l1=1) and (l2=2)) then
begin
if (tab[l1][l3]>=1) then
begin
tab[l2][l4]:=tab[l1][l3];
tab[l1][l3]:=0;
l3:=l3+1;
stan_tablicy;
end;
l1:=l1+2;
end;
end
else
begin
l1:=l1-2;
l2:=l2+1;
end;
if (tab[1][y]=0) then
begin
if ((l1=2) and (l2=1)) then
begin
if (tab[l1][l4]>=1) then
begin
tab[l2][l3]:=tab[l1][l4];
tab[l1][l4]:=0;
l4:=l4+1;
l1:=l1-1;
l2:=l2+1;
stan_tablicy;
end
else if (tab[l1][l4]=0) then
begin
l1:=l1+1;
end;
end;
if ((l1=3) and (l2=1)) then
begin
if (tab[l1][l5]>=1) then
begin
tab[l2][l3]:=tab[l1][l5];
tab[l1][l5]:=0;
l5:=l5+1;
stan_tablicy;
end;
l1:=l1-1;
end;
end
else
begin
l1:=l1-1;
l2:=l2+1;
end;
end;
//
// Start - zamiana
if ((tab[l1][l4]<tab[l2][l3]) and (tab[l1][l4]>=1)) then
begin
if (tab[l2][l3]>=1) then
begin
l3:=l3-1;
tab[l2][l3]:=tab[l1][l4];
tab[l1][l4]:=0;
if (tab[l1][l4]>1) then
begin
l4:=l4+1;
end;
l1:=l1+1;
l2:=l2+1;
stan_tablicy;
end
else if (tab[l2][l3]<1) then
begin
tab[l2][l3]:=tab[l1][l4];
tab[l1][l4]:=0;
if (tab[l1][l4]>1) then
begin
l4:=l4+1;
end;
l1:=l1+1;
l2:=l2+1;
stan_tablicy;
end;
end
else
begin
l1:=l1-1;
l2:=l2+2;
end;
if ((tab[l1][l5]<tab[l2][l4]) and (tab[l1][l5]>=1)) then
begin
if (tab[l2][l4]>=1) then
begin
l4:=l4-1;
tab[l2][l4]:=tab[l1][l5];
tab[l1][l5]:=0;
if (tab[l1][l5]>1) then
begin
l5:=l5+1;
end;
l1:=l1-2;
l2:=l2+2;
stan_tablicy;
end
else if (tab[l2][l4]<1) then
begin
tab[l2][l4]:=tab[l1][l5];
tab[l1][l5]:=0;
if (tab[l1][l5]>1) then
begin
l5:=l5+1;
end;
l1:=l1-2;
l2:=l2+2;
stan_tablicy;
end;
end
else
begin
l1:=l1-1;
l2:=l2-1;
end;
if ((tab[l1][l3]<tab[l2][l5]) and (tab[l1][l3]>=1)) then
begin
if (tab[l2][l5]>=1) then
begin
l5:=l5-1;
tab[l2][l5]:=tab[l1][l3];
tab[l1][l3]:=0;
if (tab[l1][l3]>1) then
begin
l3:=l3+1;
end;
l1:=l1+1;
l2:=l2-2;
stan_tablicy;
end
else if (tab[l2][l5]<1) then
begin
tab[l2][l5]:=tab[l1][l3];
tab[l1][l3]:=0;
if (tab[l1][l3]>1) then
begin
l3:=l3+1;
end;
l1:=l1+1;
l2:=l2-2;
stan_tablicy;
end;
end
else
begin
l1:=l1+2;
l2:=l2-1;
end;
// Koniec - zamiana
until (tab[k][1]=1); // Koniec przetwarzania wiezy
// Poczatek podgladu tablicy
for i:=1 to y do
begin
for j:=1 to x do
begin
write(' ',tab[j][i]);
end;
writeln(' ');
end;
// Koniec podgladu tablicy
writeln(' ');
writeln('Program skonczyl dzialanie, nacisnij dowolny klawisz...');
readkey();
end.
PS. Wieża hanoi zmienia wartość w kierunku na lewo, oraz dane są przetwarzane na tablicy dwu wymiarowej (takie utrudnienie od nauczyciela dostałem). Z góry dzięki za pomoc i pozdrawiam.