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.pyCode: 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.pyCode: 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:
Diese füge ich meine minmax.py ein, welche nun wie folgt aussieht:
minmax.pyCode: 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!"