IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Записи, ... и только записи
сообщение
Сообщение #1


Гость






Программа:

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.



что не то? поправьте.. как всё же правильно описать условие проверки хода ферзя?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +



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.


Сообщение отредактировано: Дож -


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Ребята, я конечно очень извиняюсь, но этой функции:
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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


Ах да!
Цитата
как всё же правильно описать условие проверки хода ферзя?

А я думал он просит разобраться с компиляцией проги. huh.gif


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

Единственный вопрос остался, а вот горизонталь никак в (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.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата(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 из суммы можешь убрать...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 19:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name