Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DD
Программа:

type поле=record верт:(a,b,c,d,e,f,g,h);
гориз: 1..8
end;
Описать логическую функцию ходферзя (n1,n2), проверяющая, может ли ферзь за один ход перейти с поля n1 шахматной доски на поле n2

код:

Код


Program laba4;

type pole=record vert:(a,b,c,d,e,f,g,h);
                gor: 1..8;
                end;

var
n1,n2 :pole;

function hodferzya(n1,n2:pole) : boolean;
begin

if ((n1.vert)=(n2.vert)) and (n1.gor=n2.gor)
then hodferzya:=true
else hodferzya:=false;
end;

begin
readln(n1,n2);
case n1 of
hodferzya(n1,n2);
end.



что не то? поправьте.. как всё же правильно описать условие проверки хода ферзя?
Дож

case n1 of
hodferzya(n1,n2);
end.


ЧТО ЭТО? blink.gif
  1. зачем тебе оператор Case?
  2. Если он тебе нужен, то несовметимый тип перечисляемой переменной.
  3. Для оператора Case должен быть end;
  4. readln(n1,n2); нельзя писать, т.к. он является типом recod.
и т.д.

Вот что наверно предполагалось:
Код

Program laba4;

type         pole=record
              vert: 1..8;
               gor: 1..8;
               end;

var
n1,n2 :pole;

function hodferzya(n1,n2:pole) : boolean;
begin

if ((n1.vert)=(n2.vert)) and (n1.gor=n2.gor)
then hodferzya:=true
else hodferzya:=false;
end;

begin
Writeln('Enter vert of Ferz position');
readln(n1.vert);
Writeln('Enter gor of Ferz position');
readln(n1.gor);
Writeln('Enter vert of ferz step');
readln(n2.vert);
Writeln('Enter gor of Ferz step');
readln(n1.gor);
If hodferzya(n1,n2) then writeln('Yes!') else writeln('No!!');
readln;
end.
volvo
Ребята, я конечно очень извиняюсь, но этой функции:
function hodferzya(n1,n2:pole) : boolean;
begin
if ((n1.vert)=(n2.vert)) and (n1.gor=n2.gor) then hodferzya:=true
else hodferzya:=false;
end;

недостаточно, ибо ферзь ходит не только по горизонтали и вертикали, а еще и по диагонали... Кстати, почему And между условиями?

Так что придется делать что-то типа:
function hodferzya(n1,n2:pole) : boolean;
begin
hodferzya := (n1.vert=n2.vert) or (n1.gor=n2.gor) or
(abs(n1.vert-n2.vert)=abs(n1.gor-n2.gor))
end;
Дож
Ах да!
Цитата
как всё же правильно описать условие проверки хода ферзя?

А я думал он просит разобраться с компиляцией проги. huh.gif
DD
Ну вот, вроде что-то сделал.. даже работает.. Кстати, суммировать правильно, но надо было ещё и вычитание делать.. так как ферзь может и по другой диагонали ходить...

Единственный вопрос остался, а вот горизонталь никак в (a,b,c,d,e,f,g,h) переделать нельзя?

Код


Program laba4;
Uses Crt;

type         pole=record
             vert: 1..8;
              gor: 1..8;
              end;

var
n1,n2 :pole;

function hodferzya(n1,n2:pole) : boolean;

begin
   If (n1.vert=n2.vert) or (n1.gor=n2.gor) or
   (abs(n1.vert-n1.gor)=abs(n2.vert-n2.gor)) or
   (abs(n1.vert+n1.gor)=abs(n2.vert+n2.gor))
   then hodferzya:=true
   else hodferzya:=false;
   If (n1.vert=n2.vert) and (n1.gor=n2.gor)
   then hodferzya:=false
end;

begin
clrscr;
Writeln ('Расположение Ферзя');
Writeln('Введите вертикальную координату (a,b,c,d,e,f,g,h)');
readln(n1.vert);
Writeln('Введите горизонтальную координату (1..8)');
readln(n1.gor);
writeln;
Writeln ('Куда переместить Ферзя?');
Writeln('Введите вертикальную координату (a,b,c,d,e,f,g,h)');
readln(n2.vert);
Writeln('Введите горизонтальную координату (1..8)');
readln(n2.gor);
writeln;
If hodferzya(n1,n2) then writeln('Возможный ход!') else writeln('Не возможный ход!');
readln;
end.

volvo
Цитата(DD @ 22.05.05 19:27)
Единственный вопрос остался, а вот горизонталь никак  в (a,b,c,d,e,f,g,h) переделать нельзя?

Что ты имеешь в виду? Наверное, все-таки вертикаль? Чтобы вводить координаты в виде "a 3" вместо "1 3" как сейчас?

Можно.
Просто при вводе делай так:
var Ch: char;
Writeln ('Расположение Ферзя');
Writeln('Введите вертикальную координату (a,b,c,d,e,f,g,h)');
readln(Ch); n1.vert := Ord(Ch) - Ord('a') + 1;

Ну, и для второй записи соответственно...

Если же ты хочешь именно изменить структуру на
type
pole=record
vert: (a, b, c, d, e, f, g, h);
gor: 1..8;
end;

то это будет чуть сложнее...

Кстати,
(abs(n1.vert+n1.gor)=abs(n2.vert+n2.gor))
не имеет смысла, сумма по определению не может быть отрицательной (если вводить корректные значения), так что оба Abs из суммы можешь убрать...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.