2016-05-08 4 views
-1

Ich erstelle ein Programm und es soll so sein: Es gibt eine unbekannte Anzahl von Leuten, die zu einer Veranstaltung kommen. Das Programm sollte die Namen und das Alter der Personen erhalten, die sich anmelden, und wenn das Alter unter 13 liegt, sollte dies als ein Kind gezählt werden und wenn das Alter 13 oder größer ist, sollten sie als Erwachsener gezählt werden. Die Namen werden auf einem Memo angezeigt und die Anzahl der anwesenden Kinder und Erwachsenen sollte ebenfalls angezeigt werden (ich wurde in einem Edit-Feld angezeigt).Warum läuft meine Schleife weiter, obwohl sie die Bedingung erfüllt?

Das Problem, das ich habe, ist, dass ich eine while-Schleife verwendet habe. Zum Beispiel ist meine Bedingung, wenn der Name in Großbuchstaben "EXIT" ist, sollte das Programm beendet werden, aber das passiert nicht. Stattdessen fragt das Programm nach dem Alter und endet dann.

Hier ist mein Code:

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

keine Delphi-Programmierer, aber ich denke, dass das gleiche wie andere Sprachen ist, erhält der während Zustand nur zu Beginn des Zyklus getestet, nicht während des Codeblocks innerhalb des Zyklus –

+0

Was sagt Ihnen der Debugger, wenn Sie den Code durchlaufen? –

+0

Dieses Verhalten tritt auf, weil die Variable 'name' gesetzt ist, nachdem Sie nach 'Geben Sie Ihren Namen' gefragt haben. Also, das Verhalten ist wie vorgesehen. –

Antwort

4

Ihr Code wird weiterhin ausgeführt, weil es genau so ist, wie Sie es geschrieben haben. Sie müssen testen, nachdem der Name eingegeben wurde, um zu sehen, ob Sie fortfahren und das Alter fragen sollten. (name ist ein schlechter Variablennamen, da es leicht mit TForm.Name verwirrt ist, also habe ich es zu AName in dem folgenden Code geändert.)

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; 

Vielleicht möchten Sie Ihre Benutzeroberfläche zu überdenken. Bearbeitungssteuerelemente sind so konzipiert, dass sie verwendet werden können, wenn der Benutzer den Inhalt ändern kann. Die Verwendung von Steuerelementen zum Anzeigen von Werten, die der Benutzer nicht bearbeiten kann, ist nicht wirklich angemessen. Ich würde vorschlagen, stattdessen TLabel zu verwenden; in der Tat könnte man mit nur einer mit so etwas wie diesen erhält von:

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

Vielen Dank dafür. Ich war neu in Looping-Strukturen und Ihr Guide hat mir sehr geholfen. Sie hatten Recht mit der GUI, ich habe meine GUI geändert. Das Programm funktioniert jetzt richtig.Ich habe auch gelernt, dass ich bessere Variablennamen verwenden sollte. – 1337x

2

Sie fragen nach dem Namen, dann fragen Sie für das Alter bedingungslos, so sollte es nicht überraschen, dass die Schleife nicht zwischen den beiden nicht verlassen in. Der Check zum Verlassen der Schleife sollte passieren, nachdem Sie nach dem Namen gefragt haben, aber bevor Sie nach dem Alter fragen.

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); 

Ich weiß nicht, Delphi, so entschuldigen Sie irgendwelche Fehler.

+0

Ich denke, das hat das gleiche Ergebnis wie der OP-Code .. Code ist besser, imo, aber immer noch die gleichen .. –

+0

Warum würden Sie das denken ???? Es ist eindeutig nichts wie die OP's. Es verlässt die Schleife, bevor man nach dem Alter fragt statt danach. – ikegami

+0

erstens, Ihr Code funktioniert nicht einmal. Der Name Ihrer Variablen wird als Name des Formulars angenommen, daher schlägt die Eingabe eines Alters fehl. –