Другие языки программирования и технологии

Почему программа работает некорректно при вводе цифры "0"?

var a : integer;
begin
while a <> 0 or 1 do
begin
writeln('Введите 0 или 1');
readln(a);
if a = 1 then writeln('a = 1');
if a = 0 then writeln('a = 0');
if a <> 0 or 1 then writeln ('Input 1 or 0');
end;
end.
Программа должна дать пользователю ввести 0 или 1 и вывести соответственно значение 0 или 1, если пользователь ввел иную цифру, то программа должна попросить его ввести 0 или 1. Почему-то при вводе числа "0" программа работает некорректно, как это исправить?
var a : integer;
begin
a:=10;
while (a <> 0) and (a <> 1) do
begin
writeln('Введите 0 или 1');
readln(a);
if a = 1 then writeln('a = 1');
if a = 0 then writeln('a = 0');
if (a <> 0) and (a <> 1) then writeln ('Input 1 or 0');
end;
readln;
end.

Во-первых, в строках:
while (a <> 0) and (a <> 1) do и if (a <> 0) and (a <> 1) then writeln ('Input 1 or 0');
допущена неоднозначность действий. В некоторых случаях, машина не сможет понять что значит "a <> 0 or 1". "переменная "а" не равна нулю или один" или "переменная "а" не равна нулю или одному". С человеческой точки зрения все понятно, но машине не мешало бы разъяснить что переменная а не должна быть равна 0 И одному

Во-вторых, ты проверяешь в условии на то, чтобы число было 0 или 1. То есть, когда введено НЕ НОЛЬ И НЕ ОДИН, программа должна запрашивать повторный ввод. Отсюда, в условиях ввода и цикле while стоит AND между значениями проверки.

В-третьих, чтобы он сразу не выходил из цикла, нужно использовать цикл с постусловием (например, repeat-until), либо задать переменной а значение, которое изначально сразу не проскочит это условие

В-четвертых, чтобы программа сразу не закрывалась, ставим readln (можно использовать функцию readkey или keypressed модуля CRT)
Геннадий Петрович
Геннадий Петрович
17 771
Лучший ответ
Олег Паньшев Огромное спасибо, все предельно ясно и понятно!
{разрешено вводить только "0" или "1", выход на "Escape"}
uses crt;
var a : char;
begin
writeln('Введите 0 или 1 : ');
a:=#48;
while (a <> #27) do {выход на Escape}
begin
a:=readkey;
if (a = #48) or (a = #49) then writeln ('a = ', a);
end;
end.
Ан
Анатолий
20 124