#pascal
Вопрос:
В настоящее время я работаю над тестированием логического значения на основе пользовательского ввода, как показано ниже:
function ReadBoolean(prompt: String): Boolean; var choice: String; exit: boolean; begin repeat begin WriteLn(prompt); ReadLn(choice); case choice of 'yes','y','t','true': exit := true; 'no','n','f','false': exit := false; else WriteLn('Not a boolean input. Enter again: '); end; end; until exit=true or exit=false; result := exit; end;
Ожидается, что он будет продолжать циклически запрашивать значение до тех пор, пока не получит входные данные из указанной строки, однако при моей первой попытке, когда я пытаюсь ввести «fred», логическая переменная автоматически присваивается как TRUE и выходит из функции.
Любая помощь была бы очень признательна.
Комментарии:
1.
until exit=true or exit=false;
разве это не означает, что цикл заканчивается, независимо от того,exit
естьtrue
илиfalse
нет ?2. да, действительно, есть ли в любом случае способ остановить выход цикла до того, как он встретится с указанными выше случаями, потому что лично я думаю, что логическому значению всегда присваивается значение по умолчанию…
3.
until choice='yes' or choice='y' or choice='t' or choice='true' or choice='no' or choice='n' or choice='f' or choice='false';
должно сработать, хотя это может быть слишком долго.4. В качестве альтернативы вы можете бесконечно повторять цикл (
while true
) и прерывать его при выполнении одного случая.5. спасибо, попробую 🙂
Ответ №1:
Насколько я понимаю, вы хотите, чтобы цикл заканчивался только тогда, когда пользователь вводит какие-то определенные строки.
Этого можно достичь, изменив until
условие следующим образом:
choice='yes' or choice='y' or choice='t' or choice='true' or choice='no' or choice='n' or choice='f' or choice='false'
Или, как вариант, создайте неопределенный цикл и разорвите его, когда пользователь введет ожидаемую строку:
while true do ... 'yes','y','t','true': begin exit := true; break; end; 'no','n','f','false': begin exit := false; break; end; ... end;
Комментарии:
1. использование while на самом деле лучше, я просто добавил некоторый «перерыв» для выхода из цикла после каждого случая, иначе он будет продолжать зацикливаться независимо от того, соответствует строка или нет, и теперь программа работает идеально, как и ожидалось. Большое вам спасибо 🙂
Ответ №2:
Ваш цикл завершается, когда exit=true or exit=false
. Поскольку exit
это может быть только одно из этих двух значений, оно всегда будет соответствовать этому условию, поэтому оно никогда не будет запускать ваш цикл.
Но также подумайте о том, чтобы явно задать значение exit := false
перед началом цикла.
Комментарии:
1. Лично я думаю, что логическому значению всегда присваивается значение по умолчанию, но в любом случае должен ли быть неназначенный выход до завершения цикла? Потому что то, что я хочу, чтобы он сделал здесь, это то, что он должен соответствовать приведенным выше случаям, иначе он должен продолжать петлять.
2. Переменные могут иметь значение по умолчанию, но только в том случае, если это указано компилятором. Я подозреваю, что ваш компилятор Pascal присвоит переменной значение false, но, честно говоря, я не понял вашего вопроса и просто давал общие советы.
Ответ №3:
То, о чем вы здесь спрашиваете, — это логическая вещь «с возможностью обнуления» (значение истинно, значение ложно, значение не указано). Насколько я знаю, это не реализовано ни на одном диалекте Паскаля. Таким образом, вы должны разделить свое указание на два отдельных флага: а) есть ли какой-либо правильно сформированный ввод, предоставленный пользователем; б) распознается ли ввод как истинный или ложный
function ReadBoolean(prompt: String): Boolean; var choice: String; exit: boolean; recognized: boolean; { this is our termination flag } begin recognized := false; { we place it to false initially as no user input recognized yet } repeat begin WriteLn(prompt); ReadLn(choice); case choice of 'yes','y','t','true': begin exit := true; recognized := true; end; { we mark it as recognized } 'no','n','f','false': begin exit := false; recognized := true; end; { we mark it as recognized } else WriteLn('Not a boolean input. Enter again: '); end; end; until not recognized; { we keep asking for user input until known input provided } result := exit; end;
Комментарии:
1. Я на самом деле решил проблему с приведенной выше рекомендацией, но я также попробую ваше решение, очень признателен 🙂
2. @Хоангнгуен, действительно, у вас есть более одного варианта реализации сценария. Обнуляемый подход очень поможет, если вам нужен, скажем, целочисленный ввод или ввод строки, где пустая строка также является приемлемым ответом и т. Д.