Seite 1 von 1

do while

Verfasst: Di, 20.03.2018 19:23
von erikafuchs
Ihr Lieben,
mal was einfaches:
welche Schleife wird sofort verlassen wenn die Bedingung stimmt?
Ich dachte, das würde funktionieren und bei Eingabe von "55" kommt die Ausgabe "jawohl!"- geht aber nicht. Muss ich wirklich einn "exit" einbauen oder ein "elseif"?

Code: Alles auswählen

Sub Main
	zahl%=55
	do while zahl% <> rate%
		rate% = inputbox ("Rate die Zahl!")	
		if zahl% < rate% then
			print "Die Zahl ist zu groß!"
		else
			print "Die Zahl ist zu klein!"		
		end if				
	loop
		print "Jawohl!"	
End Sub
Pit

Re: do while

Verfasst: Di, 20.03.2018 20:20
von lorbass
Bei Ausführung einer do loop wird die Abbruchbedingung entweder vor Ausführung des Befehlsblocks geprüft, oder nach Ausführung des Befehlsblocks. Wenn du, wie in deinem Beispiel, die Abbruchbedingung innerhalb des Befehlsblocks prüfen und ggf. aus der loop aussteigen willst, musst du das mit den üblichen Methoden wie z.B. if … then … elseif … else… end if und dem „allseits beliebten Veteranen“ ;-) goto oder (besser) exit do machen.

Gruß
lorbass

Re: do while

Verfasst: Di, 20.03.2018 22:15
von erikafuchs
Na denn, ich dachte, ich hätte das mal anders zum Laufen gebracht.
Danke soweit.

Re: do while

Verfasst: Do, 22.03.2018 17:21
von Toxitom
Hei Erika,

also, dein Programm ist technisch schon ok... hat aber einen logischen Fehler drin.

Unabhängig davon, dass sicher der Stil und die Art "ungünstig" gewählt wurde und die Ausführungen von Lorbass unbedingt beachtet werden sollten, ist das Programm an sich korrekt lauffähig.

Der logische Fehler liegt in Deiner inneren Abfrage:

Code: Alles auswählen

if zahl% < rate% then
  print "Die Zahl ist zu groß!"
else
  print "Die Zahl ist zu klein!"		
end if		
Die eingegebene Zahl (rate%) wird zwar überprüft, ob sie größer ist als die Vorgabe (zahl%), aber eben dann auch nicht weiter konkretisiert. D.h. auch wenn die Zahl korrekt ist (also die Bedingung zahl% = rate% korrekt ist), wird die else-Schleife zunächst ausgeführt (mit der logisch falschen Aussage).

Anschließend aber beendet sich korrekterweise die Do-While Schleife und das Ergebnis wird dargestellt.

VG Tom

Re: do while

Verfasst: Fr, 23.03.2018 01:10
von Hiker
Hallo,
erikafuchs hat geschrieben: Di, 20.03.2018 19:23 welche Schleife wird sofort verlassen wenn die Bedingung stimmt?
damit eine abweisende Schleife sofort abweisen kann muß Sie etwas zu prüfen haben,
also würde ich die erste Eingabe vor der Schleife machen. Damit muß dann die nächste Abfrage hinter das IF/ELSE wandern:

Code: Alles auswählen

Sub Main
	zahl%=55
	rate% = inputbox ("Rate die Zahl!")
	do while zahl% <> rate%

		if zahl% < rate% then
			print "Die Zahl ist zu groß!"
		else
			print "Die Zahl ist zu klein!"		
		end if	
		rate% = inputbox ("Rate die Zahl!")				
	loop
	print "Jawohl!"	
End Sub
Da ich mit Pascal "groß" geworden bin, wäre das für mich eher REPEAT UNTIL als WHILE....

Alternativ muß man wie schon ausgeführt realisieren, daß es 3 Unterscheidungen gibt:
Die Zahl kann kleiner, größer oder gleich 55 sein.

Code: Alles auswählen

Sub Main
	zahl%=55
	rate%=0
	do while zahl% <> rate%
		rate% = inputbox ("Rate die Zahl!")	
		if zahl% < rate% then
			print "Die Zahl ist zu groß!"
		elsif zahl% > rate% then
			print "Die Zahl ist zu klein!"
		else
			REM wir tun nichts - Schleife wird beendet und danach kommt das "Jawohl"		
		end if				
	loop
	print "Jawohl!"	
End Sub
Hier habe ich noch eine 0-Initialisierung für den Ratewert eingesetzt - ich kannte "damals" auch BASIC-Interpreter,
die die Werte vom letzten Durchlauf noch im System hatten... Der zweite Durchlauf wäre dann sofort fertig.

MfG, Jörn

Re: do while

Verfasst: Fr, 23.03.2018 10:15
von erikafuchs
Vielen dank für eure Mühe,
alles klar jetzt. ich dachte, es gäbe eine Schleife, die sofort verlassen wird, wenn eine Bedingung erfüllt wird.
VG

Re: do while

Verfasst: Fr, 23.03.2018 10:46
von Stephan
ich dachte, es gäbe eine Schleife, die sofort verlassen wird, wenn eine Bedingung erfüllt wird.
und genau die gibt es, was Dir spätestens nach den Antworten im Thread eigentlich klar sein muss.

Du kannst hingegen nicht erwarten das eine Schleife verlassen wird wenn die dazu nötige Bedingungen nicht erfüllt ist und das ist bei Deinem ursprünglichen Code aus zwei Gründen der Fall:

1. zum Zeitpunkt wo die folgende Zeile abgearbeitet wird, ist "rate%" noch ohne wert:

Code: Alles auswählen

do while zahl% <> rate%
2. Die folgende Bedingung beinhaltet den Gleichheitsfall innerhalb des Else:

Code: Alles auswählen

if zahl% < rate% then
			print "Die Zahl ist zu groß!"
		else
			print "Die Zahl ist zu klein!"		
		end if

Stephan