2016-10-10 2 views
0

я в настоящее время работает над осуществлением тестирования логическое значение из пользовательского ввода, так как будет представлен ниже:Pascal Boolean возвращаемое значение?

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

'до выхода = true или exit = false;' это не означает конец цикла, независимо от того, является ли 'exit'' истинным' или 'false' ? –

+0

Да, действительно, есть все равно, чтобы остановить цикл от выхода до того, как он встретит эти случаи выше, потому что лично я считаю, что логическое значение всегда имеет назначенное по умолчанию значение ... –

+0

'до выбора = 'да' или choice = 'y' или выбор = 't' или choice = 'true' или choice = 'no' или choice = 'n' или choice = 'f' или choice = 'false'; 'должен работать, хотя он может быть слишком длинным. –

ответ

0

Как я понимаю, вы хотите, чтобы цикл заканчивался, когда пользователь вводил определенные строки.

Это может быть достигнуто путем изменения 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; 
+0

, используя while, на самом деле лучше, я только что добавил некоторый «break», чтобы выйти из цикла после каждого случая, иначе он будет продолжать цикл, независимо от того, соответствует ли строка или нет, и теперь программа работает отлично, как ожидалось. Большое спасибо :) –

0

Ваша петля прекращается, когда exit=true or exit=false. Поскольку exit может быть только одним из этих двух значений, он всегда будет соответствовать этому условию, поэтому он никогда не запустит ваш цикл.

Но также, прежде чем начинать цикл, необходимо явно указать значение exit := false.

+0

Лично я думаю, что логическое значение всегда присваивало значение по умолчанию, но есть ли вообще-то выход, не назначенный до окончания цикла? Потому что вещь, которую я хочу здесь сделать, должна соответствовать этим случаям выше, иначе она должна продолжать цикл. –

+0

Переменные могут иметь значение по умолчанию, но только если компилятор заявляет об этом. Я подозреваю, что ваш компилятор Pascal присваивает значение переменной false, но, честно говоря, я не понял ваш вопрос и просто предлагал общие советы. – LordWilmore

0

Что вы» re ask here «nullable» boolean thing (значение true, значение false, значение не предоставляется). Насколько я знаю, это не реализовано ни на одном диалекте Паскаля. Таким образом, вам нужно разделить показание на два отдельных флага: а) есть ли какой-либо хорошо сформированный ввод, предоставленный пользователем; b) вход считается признанным как истинный или ложный

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; 
+0

На самом деле я решил проблему с приведенной выше рекомендацией, но я тоже попробую ваше решение, очень ценю :) –

+0

@HoangNguyen, действительно, у вас есть несколько вариантов реализации сценария. Неверный подход мог бы помочь, если вам нужно, допустим, целочисленный ввод или ввод строки, где пустая строка также является приемлемым ответом и т. Д. –