Ошибка в ответах(Глава 16)

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Ошибка в ответах(Глава 16)

Сообщение ramainen » 02.05.2015 23:45:46

Привет.

Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
На входные данные:
x = 5, y = 6;
x = 1; y = 2;
x = 7; y = 8;
x = 8; y = 5;
Выдает: Черная клетка, а это соответственно белая.

Я решил вот так

PS. Может я и не прав, все не проверил. Если прав, то поправьте в следующем релизе.
PSS. Спасибо автору за бесценный труд.
ramainen
новенький
 
Сообщения: 28
Зарегистрирован: 24.07.2011 21:15:57

Re: Ошибка в ответах(Глава 16)

Сообщение Oleg_D » 03.05.2015 23:07:56

ramainen писал(а):Привет.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.

Уважаемый ramainen , спасибо за активное участие в нашем форуме!
Хотя ошибки у себя пока не обнаружил. По идее, если сумма номеров столбца и строки чётная, то клетка белая. Или не так?
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Ошибка в ответах(Глава 16)

Сообщение ramainen » 04.05.2015 02:35:09

По вашему коду - да, но это не правильно. Во входные данные я указывал белую клетку, на них программа выводит "black".
Белых клеток на четном вообще нет, имею в виду: четно-четное.

PS. Да что уж мне, Вам спасибо за труд.
PSS. Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
ramainen
новенький
 
Сообщения: 28
Зарегистрирован: 24.07.2011 21:15:57

Re: Ошибка в ответах(Глава 16)

Сообщение Oleg_D » 04.05.2015 09:43:03

ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.

А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Ошибка в ответах(Глава 16)

Сообщение ramainen » 04.05.2015 11:35:09

Oleg_D писал(а):
ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.

А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.

Не за что, а задачку проверьте. Спасибо Вам.
ramainen
новенький
 
Сообщения: 28
Зарегистрирован: 24.07.2011 21:15:57

Re: Ошибка в ответах(Глава 16)

Сообщение Oleg_D » 05.05.2015 01:37:50

ramainen писал(а):Не за что, а задачку проверьте. Спасибо Вам.


Вот ваш вариант:

Код: Выделить всё
var line, column: integer;
begin
        repeat
                write('Please enter line(1-8): '); readln(line);
                // Проверка на ноль строки
                if line = 0 then begin
                        writeln('Error, Line = 0!');
                        break;
                end;
                // Проверка в числовом диапозоне
                if (line >= 1) and (line <= 8) then begin
                        write('Please  enter column(1-8): '); readln(column);
                        // Проверка на ноль столбца
                        if column = 0 then begin
                                writeln('Error, Column = 0!');
                                break;
                        end;
                        // Проверка в числовом диапозоне
                        if (column >= 1) and (column <= 8) then begin
                                // Выясняем какого цвета клетка
                                if (line mod 2 = 0) and (column mod 2 = 1) then
                                        writeln('white')
                                else if (line mod 2 = 1) and (column mod 2 = 0) then
                                        writeln('white')
                                else
                                        writeln('Black');
                        end
                        else begin
                                writeln('Error, column = ', column, ', need 1-8');
                                break;
                        end;
                end
                else begin
                        writeln('Error, line = ', line, ', need 1-8');
                        break;
                end;   
        until FALSE
end.

Я не запускал её, но с виду верно. Только решение, как уже сказано, можно упростить:

Код: Выделить всё
// Выясняем цвет клетки
if (column + line) mod 2 = 0
  then  writeln('Black')
  else  writeln('white');
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Ошибка в ответах(Глава 16)

Сообщение ramainen » 05.05.2015 22:10:12

Ну да, спасибо Вам.
ramainen
новенький
 
Сообщения: 28
Зарегистрирован: 24.07.2011 21:15:57

Re: Ошибка в ответах(Глава 16)

Сообщение bormant » 06.05.2015 15:00:44

ramainen,
в общем случае условие
Код: Выделить всё
if (line mod 2 = 0) and (column mod 2 = 1) then writeln('white')
else if (line mod 2 = 1) and (column mod 2 = 0) then writeln('white')

по сути есть
Код: Выделить всё
if (line mod 2 = 0) and not (column mod 2 = 0)
or not (line mod 2 = 0) and (column mod 2 = 0) then writeln('white')

в котором теперь уже несложно узнать XOR:
Код: Выделить всё
if (line mod 2 = 0) xor (column mod 2 = 0) then writeln('white')
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Ошибка в ответах(Глава 16)

Сообщение ramainen » 06.05.2015 22:05:47

bormant писал(а):ramainen,
в общем случае условие
Код: Выделить всё
if (line mod 2 = 0) and (column mod 2 = 1) then writeln('white')
else if (line mod 2 = 1) and (column mod 2 = 0) then writeln('white')

по сути есть
Код: Выделить всё
if (line mod 2 = 0) and not (column mod 2 = 0)
or not (line mod 2 = 0) and (column mod 2 = 0) then writeln('white')

в котором теперь уже несложно узнать XOR:
Код: Выделить всё
if (line mod 2 = 0) xor (column mod 2 = 0) then writeln('white')


Оо, я еще не знаю, что за xor(исключающие или), вариант Олега проще читается, хотя может это из-за моего незнания. Спасибо, что поучаствовали.
ramainen
новенький
 
Сообщения: 28
Зарегистрирован: 24.07.2011 21:15:57

Re: Ошибка в ответах(Глава 16)

Сообщение Oleg_D » 07.05.2015 20:40:38

ramainen писал(а):Оо, я еще не знаю, что за xor(исключающие или)

Булевы операции OR, AND, NOT рассмотрены в 13-й главе. Кстати, некоторых читателей почему-то затрудняла эта 13-я «песня», номер тому виной, что ли? И это при том, что там сознательно не сказано об операции XOR. Во-первых, она не так часто употребляется в булевых выражениях, а во-вторых – не хотелось усложнять повествование. Но при обработке битовых массивов она весьма полезна, и потому в 48-й главе упомянута.
Пусть объявлены три булевых переменных:
Код: Выделить всё
Var A, B, C : Boolean;

Тогда выражение:
Код: Выделить всё
A:= B xor C;
Равносильно выражению:
Код: Выделить всё
A:= B <> C;
Иначе говоря, операция XOR даёт TRUE, если операнды не совпадают.
То же самое эквивалентно следующему громоздкому выражению (скобки тут необязательны):
Код: Выделить всё
A:= (B and not C) or (not B and C);

В этой связи для лучшего понимания темы предлагаю следующее упражнение. Написать эквивалентные выражения (и программу для проверки), пользуясь только операциями OR, AND, NOT для следующих выражений:
Код: Выделить всё
1) A:= B = C;
2) A:= B <> C;
3) A:= B > C;
4) A:= B >= C;
5) A:= B < C;
6) A:= B <= C;
Здесь все переменные булевы.
Тут надо учесть, что TRUE > FALSE.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36


Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru