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

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

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

 
 Ответить  Открыть новую тему 
> Записи, ... и только записи
DD
сообщение 21.05.2005 20:56
Сообщение #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.



что не то? поправьте.. как всё же правильно описать условие проверки хода ферзя?
 К началу страницы 
+ Ответить 
Дож
сообщение 21.05.2005 21:23
Сообщение #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.


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


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.05.2005 1:40
Сообщение #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;
 К началу страницы 
+ Ответить 
Дож
сообщение 22.05.2005 10:06
Сообщение #4


Бывалый
***

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

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


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

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


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DD
сообщение 22.05.2005 19:27
Сообщение #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.

 К началу страницы 
+ Ответить 
volvo
сообщение 22.05.2005 19:41
Сообщение #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

 



- Текстовая версия 18.06.2025 5:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"