Возвращаемое логическое значение Pascal?

#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. @Хоангнгуен, действительно, у вас есть более одного варианта реализации сценария. Обнуляемый подход очень поможет, если вам нужен, скажем, целочисленный ввод или ввод строки, где пустая строка также является приемлемым ответом и т. Д.