2016-10-10 10 views
0

、以下に提示されていると私は現在、ユーザーの入力からブール値をテストするための運動に取り組んでいます:しかしで、それが指定した文字列からの入力を受け取るまで値を求めてループを維持することが期待されてパスカルブール戻り値?

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

'exit = trueまたはexit = false;' exitは 'true'または' false'であればループ終了を意味しません。 ? –

+0

ええ、確かに、上記のケースを満たす前にループが終了するのを避けるためにとにかく、私はブール値は常にデフォルトの割り当て値を持つと考えています... –

+0

'choice = 'yes'または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

実際にはより良いですが、私はちょうどそれぞれのケースの後にループを終了するためにいくつかの 'break'を追加しました。そうでなければ、文字列がマッチしているかどうかにかかわらずループし続けます。本当にありがとうございます:) –

0

ループはexit=true or exit=falseのときに終了します。 exitはこれらの2つの値のうちの1つにしかならないため、常にその条件を満たすため、ループを実行することはありません。

また、ループを開始する前に明示的に値exit := falseを設定することを検討してください。

+0

個人的に私はブール値は常にデフォルト値を割り当てていると思いますが、ループが終了する前に終了を割り当てられていないとにかくありますか?私がここでやりたいことは、上のケースを満たさなければならないということです。さもなければ、それはループを続けるべきです。 –

+0

変数はデフォルト値を持つことができますが、コンパイラがそのことを示す場合に限ります。私はあなたのパスカルコンパイラが変数にfalseを割り当てると思うが、正直言ってあなたの質問を理解できず、一般的なアドバイスを提供していただけだ。 – LordWilmore

0

何」ここで尋ねるのは "nullable"ブール値です(値はtrue、値はfalse、値は提供されません)。私が知る限り、どのパスカル方言にも実装されていません。したがって、あなたはあなたの指示を2つの別々のフラグに分割しなければならない:a)ユーザーによって提供された適切な入力があるか。 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、実際にシナリオを実装するための複数のオプションがあります。あなたが必要とするならば、ヌル可能なアプローチは、整数入力、あるいは空文字列が受け入れ可能な文字列入力など、あまりにも役に立ちます。 –