Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ шахматы

Автор: Виликан 21.04.2011 0:56

Поле шахматной доски определяется парой натуральных чи-сел, каждое из которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа k, l, m, n, каждое из которых не превосходит восьми. Требуется:
a) Выяснить, являются ли поля (k, l) и (m, n) полями одного цвета;
b) На поле (k, l) расположен ферзь. Угрожает ли он полю (m, n)?
c) Аналогично b), но ферзь заменяется на коня.
d) Выяснить, можно ли с поля (k, l) одним ходом ладьи попасть на поле (m, n). Если нет, то выяснить, как это можно сделать за два хода (указать поле, на которое приводит первый ход).
e) Аналогично d), но ладья заменяется на ферзя.
f) Аналогично d), но ладья заменяется на слона.
Предполагается, что указанные поля имеют один и тот же цвет.

попрошу всю задачу не решать, а только помогать по мере поступления вопросов... извините, если что не так, я тут новенький unsure.gif !

 
Program Z165;
uses crt;
var k, l, m, n:integer;
Begin
clrscr;
writeln ('Vvedite znachenie pervogo polja');
readln (k, l);
writeln ( 'Vvedite znachenie vtorogo polja');
readln (n, m);
begin
if (k mod 2=0 and l mod 2=0 and m mod 2=0 and n mod 2=0 or k mod 2=1 and l mod 2=1 and m mod 2=1 and n mod 2=1) then

writeln ( 'a) polja odnogo cveta')
else
writeln ( 'a) polja raznogo cveta');
end;
readkey;

End.
.
паскаль выдает ошибку №89 в поле с if хотя скобки вроде две)) что не так?
если есть другой способ решения пункта а интересно послушать! rolleyes.gif

Автор: vlads 21.04.2011 2:37

Цитата
хотя скобки вроде две)) что не так?
Вот то, что их только 2 и не так. Каждое условие оберни скобками - будет компилироваться.

if (k mod 2=0) and (l mod 2=0) and (m mod 2=0) and (n mod 2=0) or
(k mod 2=1) and (l mod 2=1) and (m mod 2=1) and (n mod 2=1) then
Иначе компилятор неправильно разберет выражение. Попробуй самостоятельно расставить в выражении
if (k mod 2 = 0 and l mod 2 = 0) then скобки согласно приоритетам операций - увидишь в чем ошибка.

Кстати, именно из-за того,что приоритет у and выше чем у or, нет необходимости оборачивать скобками еще и оба условия с разных сторон от or

Автор: sheka 21.04.2011 2:41

Прочитай, пожалуйста, про приоритет операций - сразу же поймешь.

Цитата
другой способ решения пункта а

if (k+l+m+n)mod 2 =0 then

Автор: -TarasBer- 21.04.2011 17:31

Если пытаться приделать логичность, то тогда так:

if odd(k xor l) = odd(m xor n) then...

А сумма может сделать плохо, если координаты заданы типом-диапазоном.

Автор: Виликан 21.04.2011 22:42

Всем большое спасибо... все советы полезны cool.gif

Автор: Виликан 22.04.2011 3:34


begin
if (k=m) or (l=n) or (k+l=m+n) then
writeln ('b) ferz` ygrogaet!')
else
writeln ('b) ferz` ne ygrogaet, rasslabtes`')
end;
begin
if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then
writeln ('c) kon` ygrogaet!')
else
writeln( 'c) kon` ne ygrogaet, rasslabtes`')
end;


Вот так я расправился с b, а вот насчет с вопрос:" Можно ли писать +- и если да, то почему не работает?"
Помогите кто чем может yes2.gif

Автор: Lapp 22.04.2011 3:52

Цитата(Виликан @ 22.04.2011 0:34) *

begin
if (k=m) or (l=n) or (k+l=m+n) then
writeln ('b) ferz` ygrogaet!')
else
writeln ('b) ferz` ne ygrogaet, rasslabtes`')
end;
begin
if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then
writeln ('c) kon` ygrogaet!')
else
writeln( 'c) kon` ne ygrogaet, rasslabtes`')
end;


Вот так я расправился с b, а вот насчет с вопрос:" Можно ли писать +- и если да, то почему не работает?"
Помогите кто чем может yes2.gif

В "b" нужно добавить еще проверку равнства разностей.

Нет, писать "+-" нельзя. Можешь использовать конструкцию с модулем:
if Abs(k-m)=1 then ..


исправил описку

Автор: TarasBer 22.04.2011 12:57

> if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then

if sqr(k-m) + sqr(l-n) = 5 then

Автор: Lapp 22.04.2011 14:03

Цитата(TarasBer @ 22.04.2011 9:57) *

if sqr(k-m) + sqr(l-n) = 5 then

Это хорошо тем, что имеет ясную графическую интерпретацию: цетры битых полей лежат на окружности с радиусом Sqrt(5). Достаточно посмотреть на доску, чтоб в этом убедиться.

Но вот интересно, что эта мысль приходит после выписывания уравнения, а не при первом взгляде на доску.. ))

Автор: Polinka 10.05.2011 15:26

попробуй так (((k mod 2=0) and (l mod 2=0) and (m mod 2=0) and (n mod 2=0)) or ((k mod 2=1) and (l mod 2=1) and (m mod 2=1) and (n mod 2=1)))

Автор: TarasBer 10.05.2011 15:46

Неправильно.
Не работает для
k=1
l=2
m=2
n=1

Автор: Гость 3.01.2012 19:29

mega_chok.gif mega_chok.gif mega_chok.gif как в этом можно что то понять blink.gif unsure.gif