Ошибка в ответах(Глава 16)
Модераторы: Oleg_D, Модераторы
Ошибка в ответах(Глава 16)
Привет.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
На входные данные:
x = 5, y = 6;
x = 1; y = 2;
x = 7; y = 8;
x = 8; y = 5;
Выдает: Черная клетка, а это соответственно белая.
Я решил вот так
PS. Может я и не прав, все не проверил. Если прав, то поправьте в следующем релизе.
PSS. Спасибо автору за бесценный труд.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
На входные данные:
x = 5, y = 6;
x = 1; y = 2;
x = 7; y = 8;
x = 8; y = 5;
Выдает: Черная клетка, а это соответственно белая.
Я решил вот так
PS. Может я и не прав, все не проверил. Если прав, то поправьте в следующем релизе.
PSS. Спасибо автору за бесценный труд.
ramainen писал(а):Привет.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
Уважаемый ramainen , спасибо за активное участие в нашем форуме!
Хотя ошибки у себя пока не обнаружил. По идее, если сумма номеров столбца и строки чётная, то клетка белая. Или не так?
По вашему коду - да, но это не правильно. Во входные данные я указывал белую клетку, на них программа выводит "black".
Белых клеток на четном вообще нет, имею в виду: четно-четное.
PS. Да что уж мне, Вам спасибо за труд.
PSS. Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
Белых клеток на четном вообще нет, имею в виду: четно-четное.
PS. Да что уж мне, Вам спасибо за труд.
PSS. Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.
Oleg_D писал(а):ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.
Не за что, а задачку проверьте. Спасибо Вам.
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');
Ну да, спасибо Вам.
ramainen,
в общем случае условие
по сути есть
в котором теперь уже несложно узнать XOR:
в общем случае условие
Код: Выделить всё
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 писал(а):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 писал(а):Оо, я еще не знаю, что за xor(исключающие или)
Булевы операции OR, AND, NOT рассмотрены в 13-й главе. Кстати, некоторых читателей почему-то затрудняла эта 13-я «песня», номер тому виной, что ли? И это при том, что там сознательно не сказано об операции XOR. Во-первых, она не так часто употребляется в булевых выражениях, а во-вторых – не хотелось усложнять повествование. Но при обработке битовых массивов она весьма полезна, и потому в 48-й главе упомянута.
Пусть объявлены три булевых переменных:
Код: Выделить всё
Var A, B, C : Boolean;
Тогда выражение:
Код: Выделить всё
A:= B xor C;
Код: Выделить всё
A:= B <> C;
То же самое эквивалентно следующему громоздкому выражению (скобки тут необязательны):
Код: Выделить всё
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.
