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" программа работает некорректно, как это исправить?
Другие языки программирования и технологии
Почему программа работает некорректно при вводе цифры "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)
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)
Олег Паньшев
Огромное спасибо, все предельно ясно и понятно!
{разрешено вводить только "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.
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.
Похожие вопросы
- С++.Почему программа зацикливается после ввода Х
- программа автоматического распознавания и ввода капчи ?
- найти все семизначные числа, которые делятся на 15 и записываются только цифрами 0 и 1. Составить программу на паскале
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- пишу на с++ программу-тест, выбор правильно ответа цифрой, но если я нажимаю символ, то программа сразу вылетает
- Почему не работает программа?
- Почему программа не работает? помогите пожалуйста(Си)
- Здравствуйте, кто нибудь, сможет создать программу через паскаль, вычисляющую произведение цифр 10-х значных чисел?
- Помогите написать программу в Assembler НАЙТИ СУММУ ЦИФР 3-ЗНАЧНОГО ЧИСЛА И ПРОИЗВЕДЕНИЕ 4-ЗНАЧНОГО ЧИСЛА
- Почему программа Php Devel Studio,содержит вирус?