do while

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

erikafuchs
*****
Beiträge: 441
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

do while

Beitrag von erikafuchs » Di, 20.03.2018 19:23

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

Benutzeravatar
lorbass
********
Beiträge: 4113
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: do while

Beitrag von lorbass » Di, 20.03.2018 20:20

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

erikafuchs
*****
Beiträge: 441
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: do while

Beitrag von erikafuchs » Di, 20.03.2018 22:15

Na denn, ich dachte, ich hätte das mal anders zum Laufen gebracht.
Danke soweit.

Toxitom
********
Beiträge: 3479
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: do while

Beitrag von Toxitom » Do, 22.03.2018 17:21

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Hiker
****
Beiträge: 119
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: do while

Beitrag von Hiker » Fr, 23.03.2018 01:10

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
Libre Office 6.0.4.2 (Win8.1 Pro, Win 10 Pro) / Libre Office 4.2 (Win 7) / AOO (Win 7)

erikafuchs
*****
Beiträge: 441
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: do while

Beitrag von erikafuchs » Fr, 23.03.2018 10:15

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

Stephan
********
Beiträge: 10489
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: do while

Beitrag von Stephan » Fr, 23.03.2018 10:46

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

Antworten