For-Schleife wird nicht ausgeführt, warum?
Guten Tag, ich lerne gerade so ein bisschen Programme zu schreiben und hab hier so ne kleine Übung. Schwer ist sie eig. nicht, doch aus irgendeinem Grund werden meine For-Schleifen die ganze Zeit übersprungen. Wenn ich die zahl1 und zahl2 nicht sortiere klappen die schleifen ganz gut, aber dann kommt es auf die Person an, die die Zahlen eingibt.
Was machen die For-Schleifen?
A: Sie geben eine Multiplikationstabelle aus.
Frage: Warum werden diese nun einfach vom Programm übersprungen?
Sprache/Umgebung: Python 3.8/Thonny
Code:
import sys
zahl1= 4 #int(sys.argv[1])
zahl2=14 #int(sys.argv[2])
if zahl1 < zahl2:
fill= zahl1
print(zahl1,"\t",zahl2,"\t",fill)
zahl1 = zahl2
print(zahl1,"\t",zahl2,"\t",fill)
zahl2= fill
print(zahl1,"\t",zahl2,"\t",fill)
print(zahl1,zahl2)
for l in range(zahl1,zahl2+1):
if(l==zahl1):
print("\t",end=" ")
print(l,"\t",end=" ")
if(l==zahl2):
print("\n")
for j in range(zahl1,zahl2+1):
for i in range(zahl1,zahl2+1):
if(i==zahl1):
print(j,"\t",j*j,"\t",end=" ")
else:
print(j*i,"\t",end=" ")
if(i==zahl2):
print("\n")
3 Antworten
Erstmal formatieren:
import sys
zahl1= 4 #int(sys.argv[1])
zahl2=14 #int(sys.argv[2])
if zahl1 < zahl2:
fill= zahl1
print(zahl1,"\t",zahl2,"\t",fill)
zahl1 = zahl2
print(zahl1,"\t",zahl2,"\t",fill)
zahl2= fill
print(zahl1,"\t",zahl2,"\t",fill)
print(zahl1,zahl2)
for l in range(zahl1,zahl2+1):
if(l==zahl1):
print("\t",end=" ")
print(l,"\t",end=" ")
if(l==zahl2):
print("\n")
for j in range(zahl1,zahl2+1):
for i in range(zahl1,zahl2+1):
if(i==zahl1):
print(j,"\t",j*j,"\t",end=" ")
else:
print(j*i,"\t",end=" ")
if(i==zahl2):
print("\n")
So, fangen wir vorab mal mit eienr Kleinigkeit an:
if zahl1 < zahl2:
zahl1,zahl2=zahl2,zahl1 # vereinfachter swap
Warum auch immer Du das swappen willst....
Okay, Du sagst, wenn zahl1 kleiner zahl2, so machst DU ein swap, nun ist zahl1 größer zahl 2.
Bei eienr range muß die kleinere Zahl allerdings zuerst genannt werden, wenn Du ein positives Stepping hast, also wäre wenn:
if zahl1 > zahl2:
zahl1,zahl2=zahl2,zahl1
Sinnvoll
Passiert. Frag mal wie lange Du bei C vor einem a=b (Zuweisung, Wahrheitswert ergibt sich aus zugewiesenem Wert) statt a==b (Vergleich) sitzen kannst.
Du machst Dir nebenbei bemerkt auch teils das leben unnötig schwer, die Ausgabe des Tabellenheader kannste auch einfacher haben, wenn Du sowas machst:
>>> print("\t".join(str(x) for x in range(3,12)))
3 4 5 6 7 8 9 10 11
oh... das sieht sehr viel übersichtlicher aus.
Danke, wusste nicht wie das hier geht, hab einfach Copy-Paste.
Swappen will ich das, da die eingabe eig. vom Nutzer abhängen soll (siehe kommentar zu zahl1 und zahl2)
Sollte dieser nun zuerst eine kleine Zahl eingeben, so kann sich die For schleife gar nicht auflösen. Daher der if zahl1 kleiner als Zahl2.
Die Prints waren zur "Fehlerkontrolle" da. Dachte vllt lief da was falsch, aber bis kurz vor for l in range [..] läuft alles ohne probleme.
Wie gesagt, dreh mal den Vergleichsoperator um, DU wirst staunen.
Übrigens, hier eine andere Formulierung, die für Dein Problem nutzbar wäre:
low,high=min(zahl1,zahl2),max(zahl1,zahl2)
Das ist bei 2 Zahlen vielleicht ein wenig drüber, soll aber eine weitere Option zeigen, wen Du es mal mit größeren iterables zu tun hast.
Nutz doch in Zukunft bitte den Code-Tag hier in Gutefrage. Gerade bei Python ist die Einrückung sehr wichtig und der Code-Tag macht das weiaus besser lesbar
Dann - ohne die Logik vom Programm selbst angeschaut zu haben:
if zahl1 < zahl2:
fill= zahl1
print(zahl1,"\t",zahl2,"\t",fill)
zahl1 = zahl2
print(zahl1,"\t",zahl2,"\t",fill)
zahl2= fill
print(zahl1,"\t",zahl2,"\t",fill)
print(zahl1,zahl2)
Sorgt dafür, dass zahl1 größer (oder gleich) ist wie zahl2, indem diese getauscht werden, wenn zahl1 kleiner ist als zahl2. Sicher, dass du es nicht andersrum wolltest?
Kleiner Hinweis hier: Das lässt sich auch als Einzeiler schreiben, du brauchst keine temporäre Variable in Python
if zahl1 < zahl2:
zahl1, zahl2 = zahl2, zahl1
Dann:
for l in range(zahl1,zahl2+1):
Macht rein gar nichts, da du hier von der Startzahl 14 immer um eins erhöhst, bis diese kleiner als 5 ist. Offensichtlich ist das nie wahr und wird nie ausgeführt.
Der einzige Fall, in dem das eine einzige Iteration macht, ist, wenn zahl1 = zahl2
Wenn du in Python herunterzählen willst, musst du noch die Schrittweite angeben:
for l in range(start, stop, step):
Bei dir wäre es also:
for l in range(14, 4, -1):
Das würde jetzt alle Zahlen von 14 bis (inklusive) 5 ablaufen.
Oh man.... das stimmt... kann nicht glauben das ich das die letzte Stunde übersehen habe.....
Danke!
Hallo,
ja, das kann so nicht klappen range liefert ja true oder false zurück
so wie du das machst müsstest du entweder While benutzen und l in der schleife immer l=l+1 machen oder eben for mit einem numerischen Anfangswert und Endwert versehen und einem increment (++1) oder was auch immer
LG
Harry
Auch dir danke.... ich fühl mich so dumm, wie ich das wohl ne Stunde lang übersehen habe. Vielen Dank !