2016-05-08 18 views
-1

私はプログラムを作成しており、これは次のようになっているはずです。プログラムは、登録する人の名前と年齢を取得する必要があります。年齢が13歳未満の場合は、子供としてカウントし、13歳以上の場合は大人としてカウントします。名前はメモに表示され、子供と大人の人数が表示されます(私は編集ボックスに表示されます)。ループに条件が満たされてもループが実行されるのはなぜですか?

問題は、私がwhileループを使用していることです。たとえば、私の条件は、大文字の名前が 'EXIT'の場合、プログラムは終了するはずですが、これは起こっていません。代わりに、プログラムは年齢を聞くために続き、その後終了します。

は、ここに私のコードです:

name:= inputbox('dialog','Enter your name', ''); 
    edit1.Text:=name; 
    adults:=0; 
    children:=0; 

    while uppercase(name) <> 'EXIT' do 
    begin 
    name:= inputbox('dialog','Enter your name', ''); 
    memo1.Lines.Add(''+name); 
    age := strtoint(inputbox('age', 'Enter your age', '')); 
    if age<13 then 
    begin 
     children:=children+1; 
     edit3.Text:=inttostr(children) 
    end 
    else if age>=13 then 
    begin 
     adults:=adults+1; 
     edit2.Text:=inttostr(adults); 
    end ; 
    showmessage('Hello '+name+', Welcome to our funday'); 
    end; // while 
+0

Delphiプログラマではありませんが、他の言語と同じですが、while条件はサイクルの開始時にのみテストされます。サイクル内のコードブロック中に –

+0

コードをステップ実行したときにデバッガからどのようなことが伝えられますか? –

+0

「名前を入力」を求めた後に「名前」変数が設定されているため、この現象が発生しています。したがって、その振る舞いは設計通りです。 –

答えて

4

あなたのコードは、あなたが書いたのとまったく同じ方法で実行されます。名前を入力した後にテストをして、続行して年齢を聞かなければならないかどうかを確認する必要があります。 (それは簡単TForm.Nameと混同だので、私は以下のコードでANameにそれを変更したとしてnameは、貧しい変数名です。)

begin 
    Adults := 0; 
    Children := 0; 

    while True do 
    begin 
    AName:= InputBox('dialog','Enter your name', ''); 
    if UpperCase(AName) = 'EXIT' then 
     Break; 
    Memo1.Lines.Add(AName); 
    Age := StrToInt(InputBox('Age', 'Enter your age', '')); 
    if Age < 13 then 
    begin 
     Children := Children + 1; 
     Edit3.Text := IntToStr(Children) 
    end 
    else if Age >= 13 then 
    begin 
     Adults := Adults + 1; 
     Edit2.Text := IntToStr(Adults); 
    end; 
    ShowMessage('Hello ' + AName + ', Welcome to our funday'); 
    end; 
end; 

あなたは、あなたのユーザインターフェイスを再検討することをお勧めします。編集コントロールは、ユーザーがコンテンツを変更できるときに使用するように設計されています。ユーザーが編集できない値を表示するのには本当に適切ではありません。代わりにTLabelを使用することをお勧めします。実際には、このようなものを使ってただ1つだけで得ることができます:

Label1.Caption := Format('%d adults, %d children', [Adults, Children]); 
+0

ありがとうございます。私は構造をループするのが初めてで、あなたのガイドは多くの助けになりました。あなたはGUIについて正しくありました。私はGUIを変更しました。プログラムは正しく動作します。私は、より良い変数名を使うべきであることも学びました。 – 1337x

2

あなたは、あなたが無条件に年齢を尋ね、ループが両者の間で終了していないことは驚きべきではない、名前を尋ねます。ループを終了するには、名前を聞いた後で、年齢を聞く前にチェックが必要です。

adults := 0; 
children := 0; 

while true do 
begin 
    name := inputbox('dialog', 'Enter your name (or "exit" to exit)', ''); 
    if uppercase(name) = 'EXIT' then 
     break; 

    memo1.Lines.Add(''+name); 

    age := strtoint(inputbox('age', 'Enter your age', '')); 
    if age < 13 then 
     children := children + 1; 
    else 
     adults := adults + 1; 

    showmessage('Hello '+name+', Welcome to our funday'); 
end; 

edit2.Text := inttostr(adults); 
edit3.Text := inttostr(children); 

私はデルファイを知らないので、いかなる誤りも許しません。

+0

私はこれがOPのコードと同じ結果を持っていると思います。コードはより良いですが、今でも同じです。 –

+0

あなたはそれをなぜ思いますか?それは明らかにOPのようなものではない。それは、後でなく年代を求める前にループから抜け出す。 – ikegami

+0

まず、あなたのコードは機能しません。変数 'name'はフォームの名前とみなされるため、年齢を入力すると失敗します。 –

関連する問題