Hilfe bei meiner FOR IF Schleife

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.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: das sieht mir ziemlich viel nach Raten und ziemlich wenig nach Nachdenken aus. Du hast in den Zeilen davor schon öfter die =-Operation benutzt, also solltest Du auch wissen was "i = kzahl" und was "kzahl = i" macht.
Wenn Du nicht weißt, was in einer Schleife passiert, dann hilft es oft, sich bei jedem Schleifendurchgang die relevanten Größen ausgeben zu lassen:

Code: Alles auswählen

for i in range(0, Menge):
    print(i, kzahl, i <= kzahl)
    if i <= kzahl:
        kzahl = i
Damit sollte klar werden, wann und wie kzahl überschrieben wird.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

@Peter_77: Ist das die wörtliche Aufgabenstellung? Wenn ja, finde ich sie sehr bedenklich, da wie bereits geschrieben dafür in Python keine Zählschleife (also das iterieren über eine Zahlenliste, die du mit range erzeugst) notwendig ist und man direkt über die Elemente der Liste iterieren kann.

Code: Alles auswählen

for zahl in zahlen:
    print(zahl)
Ich würde die Aufgabe vielleicht mit beiden Varianten lösen (keine Ahnung wie stur dein Prof ist ;)) und darauf hinweisen, dass die Variante mit der Zählschleife in Python nicht sinnvoll/notwendig ist.

@Sirius3: Danke für den Hinweis mit den Tupeln, ich habe bisher fälschlicherweise angenommen, dass ("String") ein Tupel erzeugt, was für mich im Vergleich zu Listen, Dicts und Sets irgendwie intuitiv richtig war. Selbst wieder was gelernt... ;)
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Peter_77 hat geschrieben:

Code: Alles auswählen

# FOR Schleife für Variable kzahl (Kleinste Zahl)
for i in range(0, Menge):
    if i <= kzahl:
      i = kzahl
Eigentlich hätte ich erwartet, dass kzahl überschrieben wird von der FOR Schleife. Also habe ich i = kzahl geändert in kzahl = i.
Das hat aber nichts bewirkt.
Warum kann ich den Wert der Variablen nicht überschreiben?
Du solltest mal in Textform beschreiben was du hier eigentlich tun willst. Es passiert nämlich definitiv nicht das, was du erwartest. Wenn du schon anfängst mit "i = kzahl hat nicht funktioniert, da habe ich dann kzahl = i genommen", dann machst du etwas Grundsätzliches falsch. Programmieren funktioniert nicht indem man Algorithmen oder Befehle rät.

Lass dir doch in der Schleife einfach mal mit print die Werte ausgeben die du da hast.
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

Du solltest mal in Textform beschreiben was du hier eigentlich tun willst. Es passiert nämlich definitiv nicht das, was du erwartest.
Na, versuch ich mal:
Zahlen = [41, 25, 40, 97, 76, 40, 10, 43]
Ist 25 kleiner kzahl, wenn ja, definiere 25 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 40 kleiner kzahl, wenn ja, definiere 40 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 97 kleiner kzahl, wenn ja, definiere 97 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
usw.

Erklärt das, was ich erreichen will?

Peter
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: so kann man die kleinste Zahl finden. Und jetzt vergleich das mit dem, was Du programmiert hast.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Anstelle von ``kzahl`` (evtl. eine Abkürzung für "kleinste Zahl"?) würde ich das ja ``minimum`` nennen ;-)

Ich kapiere in Deiner Erklärung nicht, wieso Du mehrfach die Liste durchlaufen willst! Wenn man stets den *bisherigen* kleinsten Wert (aka ``kzahl``) mit dem aktuellen Element der Liste vergleicht und je nach Ergebnis des Vergleichs den Wert beibehält oder den des Listenelements als neues Minimum nimmt, reicht es doch, die Liste *einmal* zu durchlaufen:

Code: Alles auswählen

# Voraussetzung: Mindestens *ein* Element muss in der Liste enthalten sein.
minimum = values[0]
for value in values:
    # hier Vergleich durchführen und ggf. minimum *neu* zuweisen
# nach der Schleife hat man definitiv das Minimum!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Ich denke da steht nicht das die Liste mehrfach durchlaufen werden soll. Es wird nur bei jedem Schritt wieder das Abbruchkriterium für die Schleife genannt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah... so meinte der OP das :D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

Hyperion hat geschrieben:Anstelle von ``kzahl`` (evtl. eine Abkürzung für "kleinste Zahl"?) würde ich das ja ``minimum`` nennen ;-)

Ich kapiere in Deiner Erklärung nicht, wieso Du mehrfach die Liste durchlaufen willst! Wenn man stets den *bisherigen* kleinsten Wert (aka ``kzahl``) mit dem aktuellen Element der Liste vergleicht und je nach Ergebnis des Vergleichs den Wert beibehält oder den des Listenelements als neues Minimum nimmt, reicht es doch, die Liste *einmal* zu durchlaufen:

Code: Alles auswählen

# Voraussetzung: Mindestens *ein* Element muss in der Liste enthalten sein.
minimum = values[0]
for value in values:
    # hier Vergleich durchführen und ggf. minimum *neu* zuweisen
# nach der Schleife hat man definitiv das Minimum!
Vielen Dank!
Nun habe ich es hinbekommen.
Mit Print Befehlen für die einzelnen Schritte habe ich dann auch erkannt, dass mein Lösungssatz nach den Schleifen erstellt werden muß.

Nochmals Danke an Alle, die mir geholfen haben.

Gute Nacht
Peter
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Hallo Peter,

Programmieren ist die Kunst, ein großes Problem in mehrere Teilprobleme zu zerlegen, welche ihrerseits möglichst einfach und generell sind. Diese Teilprobleme sollen isoliert überprüfbar sein.

Unittests seien hier wohl der Königsweg, die interaktive Shell ist meiner Meinung nach (gerade zu Beginn) immer noch am zugänglichsten. Mit letzterer kann man Befehle aber auch Bibliotheken einfach ausprobieren.

Im Folgenden, schildere ich Dir nun meine Herangehensweise an Deine Problemstellung. Die Quelltexte sind für Python3.x, welche sich jedoch relativ einfach für Python2.7+ umschreiben lassen. Auf Klassen und die Standardbibliothek habe ich gemäß der Aufgabenstellung verzichtet, auch Funktionen jedoch nicht, da diese meiner Meinung nach die Verständlichkeit verbessern und man um diese auch kurzfristig nicht herum kommt.

Das Grundgerüst

minmax.py

Code: Alles auswählen

#!/usr/bin/env python3

def main():
    print("Hello, World!")

if __name__ == '__main__':
    main()

Quelltext auf Modulebene (sprich: Alles, was nicht in einer Funktion steckt) sollte man nach Möglichkeit verzichten. Ausnahmen sind hier zum Beispiel Konstanten. Hintergrund: Beim Importieren wird dieser ausgeführt. Beim Testen möchte ich jedoch nicht, dass irgendwas ausgeführt wird, auf was ich im Zweifel keine Kontrolle habe.

bad.py

Code: Alles auswählen

#!/usr/bin/env python3

print("A kitten was killed ...")

Code: Alles auswählen

Python 3.2.5 (default, May 15 2013, 23:06:03) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import minmax
>>> minmax.main()
Hello, World!
>>> import bad
A kitten was killed ...
>>>
Devide et impera
Zahlen = [41, 25, 40, 97, 76, 40, 10, 43]
Ist 25 kleiner kzahl, wenn ja, definiere 25 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 40 kleiner kzahl, wenn ja, definiere 40 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 97 kleiner kzahl, wenn ja, definiere 97 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
usw.
Hier erkenne ich zwei Teilprobleme:

1. Den kleinsten von zwei Werten ermitteln
2. Eine Liste von Werten durchlaufen (und erstes Teilproblem anwenden)

Das erste Teilproblem lässt sich kompakt in einer Funktion darstellen:

Code: Alles auswählen

def max_(x, y):
    if x > y: return x
    return y
Diese füge ich meine minmax.py ein, welche nun wie folgt aussieht:

minmax.py

Code: Alles auswählen

#!/usr/bin/env python3

def max_(x, y):
    if x > y: return x
    return y

def main():
    print("Hello, World!")

if __name__ == '__main__':
    main()
Der abschließende Unterstich der Funktion max_ ist dem Umstand geschuldet, dass es bereits eine max-Funktion gibt.

Nun kann die Funktion in der interaktiven Shell getestet werden:

Code: Alles auswählen

>>> import minmax
>>> minmax.max_(3, 4)
4
>>> minmax.max_(-2, 0)
0
Das zweite Teilproblem wurde oben schon angerissen (for-Schleife). Darum möchte ich das hier nur der Vollständigkeit halber aufführen und testen:

Code: Alles auswählen

def maximum(xs):
    if not xs: return None # Eine leere Liste hat kein Maximum.
    accu = xs[0] # Das erste Element der Liste als Zwischenergebnis oder
                 # Endergebnis
    for x in xs:
        accu = max_(accu, x)
        # Es hilft, den Schleifendurchlauf zum Verständnis auf Papier
        # nachzuvollziehen.
    return accu

Code: Alles auswählen

>>> from minmax import maximum
>>> maximum([1, 2, 3, 4])
4
>>> maximum([8, 9, 2, 0, -1])
9
Alles zusammen

Zu guter Letzt müssen noch die Werte aus der Aufgabenstellung, der Funktionsaufruf und die Ausgabe in die main-Funktion eingefügt werden. Die minmax.py sähe nun wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python3

def max_(x, y):
    if x > y: return x
    return y

def maximum(xs):
    if not xs: return None
    accu = xs[0]
    for x in xs:
        accu = max_(accu, x)
    return accu

def main():
    values = [41, 25, 40, 97, 76, 40, 10, 43]
    msg_max = 'Die größte Zahl ist {} (Soll 97).'
    
    greatest = maximum(values)
    
    print(msg_max.format(greatest))

if __name__ == '__main__':
    main()

Folgede Punkte sind für die Vollständigkeit und für ein besseres Verständnis noch abzuarbeiten:

1. Implementiere eine Funktion min_, welche den kleineren zweier Werte zurück gibt!
2. Implementiere eine Funktion minimum, welche den kleinsten Wert aus einer Liste zurück gibt!
3. Worin unterscheiden sich die Funktionen minimum und maximum? Was folgerst Du daraus?
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten