if/else-Anweisung vollständig durch while-Schleifen ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Marceline
User
Beiträge: 9
Registriert: Freitag 2. November 2018, 16:35

Mittwoch 14. November 2018, 23:50

Der folgende Code sei gegeben und die Variable mybool kann wahr oder falsch sein:[

Code: Alles auswählen

my_bool = True #or False, it work’s with both of them
if(my_bool): #if-branch
else:
  #else-branch
Zeige wie diese if-else-Abfragen mit Hilfe von while-Schleife(-n) ersetzt werden können. Wie oft werden die Schleifen höchstens durchlaufen und warum? (Hinweis: Nicht lauffähige Programme werden mit Null Punkten bewertet, dabei gilt als Maßstab nur die Ausführbarkeit in der Konsole!)

Das Programm ist ja nicht wirklich lauffähig, oder besser gesagt: Gar nicht. Uns wurde gesagt, wir sollen das Programm sinnvoll ergänzen. Meine Überlegung wäre eine Counter-Variable einzubauen, weil man angeben muss, wie oft die Schleife durchlaufen wird. Allerdings gibt mir der Interpreter dann eine Endlos-Schleife aus.

Code: Alles auswählen

x = my_bool = True #or False, it work’s with both of them
counter = 0
while (x == my_bool):
    counter = counter + 1
    print ('my bool True')
while (x != my_bool):
    counter = counter + 1
    print ('mY bool falSe')
    break
Sirius3
User
Beiträge: 8817
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 15. November 2018, 00:21

Da sich weder x noch my_bool innerhalb der Schleife ändert, hast Du eine Endlosschleife. Bei der Aufgabe muß man erkennen, dass sie keinen Sinn macht, sonst ist die Aufgabe sinnlos. Selbst die Klammern sind falsch, weil sie überflüssig sind.
Benutzeravatar
Marceline
User
Beiträge: 9
Registriert: Freitag 2. November 2018, 16:35

Donnerstag 15. November 2018, 00:30

Ok, aber ich muss doch diesen my_bool irgendeine Variable zuweisen. Sonst wäre my_bool ja immer True und genau das gilt es zu verhindern.
Mir fällt ehrlich gesagt keine andere Mögklichkeit ein die if/else - Anweisung zu umgehen, als diejenige, in der man 'if und else' als 'while == und while !=' umschreibt.
Benutzeravatar
sls
User
Beiträge: 287
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Tannhauser Gate

Donnerstag 15. November 2018, 00:43

my_bool ist doch schon eine Variable deren Inhalt halt eben True oder False sein kann. Es ändert trotzdem nichts an der Tatsache, dass sich der Zustand von my_bool innerhalb der While-Schleife nie ändert. Wenn my_bool True ist, wird die Schleife durch das break bspw. bei einem "if my_bool" beendet, ist my_bool False, eben im else-Block. Ob der Startwert von my_bool nun False oder True ist, ist scheißegal. Die Schleife wird dann immer nur mindestens 1 x durchlaufen.

Da muss doch noch mehr in der Aufgabenstellung enthalten sein, sonst könnte die Aufgabe unter die Top 10 der sinnlosesten Aufgaben hier im Forum landen.
With great processing power comes great responsibility.
Sirius3
User
Beiträge: 8817
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 15. November 2018, 00:43

@Marceline: Python kennt auch einen else-Block bei while. Dann muß man noch verhindern, dass die while-Schleife mehr als einmal durchlaufen wird, dafür gibt es break, was auch die Frage beantwortet, wie oft die while-Schleife durchlaufen wird, denn das muß genauso oft passieren, wie die if-Blöcke durchlaufen werden.
Benutzeravatar
Marceline
User
Beiträge: 9
Registriert: Freitag 2. November 2018, 16:35

Donnerstag 15. November 2018, 00:57

sls hat geschrieben:
Donnerstag 15. November 2018, 00:43
Da muss doch noch mehr in der Aufgabenstellung enthalten sein, sonst könnte die Aufgabe unter die Top 10 der sinnlosesten Aufgaben hier im Forum landen.
Hier die Aufgabe im Wortlaut:
Bild

Also ich verstehe das Problem selbst nicht, ehrlich gesagt.
Ich habe jetzt die Variable mybool, die entweder True ist oder False, und soll das mithilfe der while-Schleife modellieren. Wenn ich while = True mache, gibt der Interpreter für alle Ewigkeit den Wert mybool raus, es sei denn man fügt darunter halt 'break' ein. Aber was hab ich denn davon?

@Sirius: Aber muss ich nicht, wenn ich einen else-Block einfüge, nicht vorher auch noch eine if-Anweisung reinpacken. Und genau das wird ja verboten?

Code: Alles auswählen

x = my_bool = True #or False, it work’s with both of them
counter = 0

while my_bool :
    counter = counter + 1
    print ('my bool True')
    break
while not my_bool:
    counter = counter + 1
    print ('my bool false')
    break
Benutzeravatar
noisefloor
User
Beiträge: 2532
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 15. November 2018, 02:58

Hallo,

die Aufgabe macht IMHO in der Tat ein wenig strange. Bei einer if-elif-else Bedingung wird ja nur ein Teil der Abfrage durchlaufen, bei while geht man davon aus, dass die Schleife auch mehrfach durchlaufen werden könnte.
Aber muss ich nicht, wenn ich einen else-Block einfüge, nicht vorher auch noch eine if-Anweisung reinpacken. Und genau das wird ja verboten?
Nee, Python kennt `while... else` - das findet man aber eher selten, zumindest in Beispielen. Ist aber in der Python-Doku erklärt:

Code: Alles auswählen

>>> condition = True
>>> while condition:
...     print('do something')
...     break
... 
do something
>>> condition = False
>>> while condition:
...     print('do something')
...     break
... else:
...     print('do something else')
... 
do something else
>>>
Gruß, noisefloor
Sirius3
User
Beiträge: 8817
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 15. November 2018, 08:31

Marceline hat geschrieben:
Donnerstag 15. November 2018, 00:57
es sei denn man fügt darunter halt 'break' ein. Aber was hab ich denn davon?
Genau das ist das Problem mit der Aufgabenstellung. Soetwas würde nie jemand in einem Programm schreiben, und der Lernenden lern etwas, was Quatsch ist. Es ist wie wenn der Fahrlehrer sagt, "jetzt fahren wir mal falsch herum durch die Einbahnstraße, dass Du siehst, dass das auch geht".

Code: Alles auswählen

my_bool = True

loop_counter = 0
while my_bool and loop_counter == 0:
    print("do if part")
    loop_counter += 1 # ensure, that this loop is traversed only once and the next loop never

while loop_counter == 0: # this loop is only entered, if the previous loop is not
    print("do else part")
    loop_counter += 1 # ensure, that this loop is traversed only once
Die Kommentare hier sind zwingend, da sonst morgen niemand mehr versteht, warum man hier so ein kompliziertes Konstrukt gebaut hat.

Noch eine Anmerkung zur Variablenbenennung: immer wenn irgendwo die Vorsilbe my_ auftaucht, sollte aus auch ein your_xy oder my_sisters_xy geben, wobei man sich fragen muß, wie hier die Besitzverhältnisse zustande kommen.

Man merkt, dass der Dozent früher schlechtes Java gelehrt hat und jetzt auf schlechtes Python umgestiegen ist und ihm die Begeisterung für das Fach fehlt. So ist es nicht verwunderlich, dass wahrscheinlich viele den Kurs als reine Pflichtveranstaltung sehen und wenig mitnehmen. Marceline lass Dich nicht entmutigen, Du stellst kritische Fragen und das ist gut so. Gute Lehrer können einen für etwas begeistern, für was man sich nicht so sehr interessiert, aber schlechte Lehrer müssen einem nicht unbedingt demotivieren. Schau über den Tellerrand und lerne für Dich.
Benutzeravatar
snafu
User
Beiträge: 5647
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 15. November 2018, 09:08

Man könnte das als ersten Versuch so schreiben:

Code: Alles auswählen

while my_bool:
    print('if-branch')
while not my_bool:
    print('else-branch')
Durchlaufen wird immer eine Schleife gar nicht und die andere unendlich oft, je nach Wert von my_bool. Das möchte man nicht.

Also hier der zweite Versuche:

Code: Alles auswählen

while my_bool:
    print('if-branch')
    break
while not my_bool:
    print('else-branch')
    break
Hier wird eine Schleife gar nicht und die andere exakt einmal durchlaufen. Damit hat man das Verhalten auf while-Schleifen abgebildet.

Falls man im Code mitzählen möchte:

Code: Alles auswählen

count_if_branch = 0
count_else_branch = 0
while my_bool:
    count_if_branch = count_if_branch + 1
    break
while not my_bool:
    count_else_branch = count_else_branch + 1
    break
print('Anzahl if-branch:', count_if_branch)
print('Anzahl else-branch', count_else_branch)
shcol (Repo | Doc | PyPi)
Benutzeravatar
__blackjack__
User
Beiträge: 1599
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 15. November 2018, 11:52

Ich denke hier gehen einige von der falschen Vorstellung aus, dass es sich hier um einen Kurs handelt in dem eine Programmiersprache gelehrt werden soll. Die Aufgabe wäre Quatsch wenn man da Python lernen soll. Die konkrete Programmiersprache dürfte aber egal sein, denn diese Art von Aufgabe(n) wurde in meiner Schulzeit mit Pascal, in der Uni-Zeit mit Java, und momentan halt mit Python gestellt. Es geht darum zu zeigen/zu lernen/selbst auszuprobieren welche Kontrollstrukturen durch andere ersetzt werden können. Also das man nur mit ``while`` ohne ``for`` auskommt weil man jede ``for``-Schleife nach einem festen Schema durch eine ``while``-Schleife ersetzen kann, wie das kürzlich Thema hier war, oder eben hier das man, wenn man kein ``if`` hätte, grundsätzlich die gleichen Algorithmen mit ``while`` als Ersatz schreiben kann. Und zwar ebenfalls durch ein festes Übersetzungsschema von ``if``/``else`` nach ``while``.

Wenn man das doof findet kann man das nicht einem einzelnen Dozenten anlasten, denn das ist insgesamt üblicher Teil von Informatikvorlesungen, dass man sich Gedanken macht und auch praktisch in Übungen ausprobiert, ob eine Untermenge der vorhandenen Regeln genau so mächtig ist, wie die Gesamtmenge. Oder was äquivalent ist (Endrekursion/Schleifen, Closures/Objekte, AND,OR,NOT/NAND, …).

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
__deets__
User
Beiträge: 4028
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 15. November 2018, 12:03

Aehnlich wie die Modellierung beliebiger Logikschaltungen nur mittels nor/nand-Gattern.
Benutzeravatar
Marceline
User
Beiträge: 9
Registriert: Freitag 2. November 2018, 16:35

Freitag 16. November 2018, 16:54

Vielen lieben Dank für die ausführlichen Erklärungen, Leute.
Antworten