Konzepte imperativer Programmierung Klaus Becker 2008
... und ihre Implementierung in Python # Eingabe jung = int(raw_input("Anzahl der jungen Maeuse: ")) erwachsen = int(raw_input("Anzahl der erwachsenen Maeuse: ")) alt = int(raw_input("Anzahl der alten Maeuse: ")) # Verarbeitung schritt = 0 while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 # Ausgabe: print "Neue Populationswerte:" print "Anzahl der Schritte: ", schritt print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsen print "Anzahl alter Maeuse: ", alt
Teil 1 Variablen
Mäusepopulation Modellannahmen: Unterteilung in drei Alterklassen: junge Mäuse, erwachsene Mäuse und alte Mäuse. In jedem Schritt erfolgt ein Wechsel der Altersklasse: Junge Mäuse werden erwachsen, erwachsene werden alt (und alte Mäuse leider nicht mehr jung). Nur ein bestimmter Anteil (siehe Diagramm) erreicht die nächste Altersstufe. Im Diagramm sind zusätzlich die Geburtenraten eingetragen. Wir gehen davon aus, dass jede erwachsene Maus (im Durchschnitt) vier junge Mäuse erzeugt und dass jede alte Maus (im Durchschnitt) zwei junge Mäuse erzeugt.
Aufgabe Modellannahme: Zu Beginn besteht die Population aus 6 jungen, 9 erwachsenen und 12 alten Mäusen. Schritt 1 2 3 4 5 ... jung 6 60 = 4*9+2*12 erwachsen 9 3 = 6/2 alt 12 3 = 9/3 Berechnen Sie die jeweiligen Populationswerte.
Aufgabe >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> alt = erwachsen / 3 >>> erwachsen = jung / 2 >>> jung = erwachsen*4 + alt*2 18 3 >>> Schritt 1 2 3 4 5 ... jung 6 60 = 4*9+2*12 erwachsen 9 3 = 6/2 alt 12 3 = 9/3 Python-Dialog Probieren Sie das mal aus. Alles klar? Alles ok? Was nun?
aktueller Variablenzustand Variablen dienen in der Informatik dazu, Daten zu verwalten, die in Speicherzellen abgelegt sind. Jede Variable hat einen Namen, mit dem man auf den in der zugehörigen Speicherzelle abgelegten Datenwert (den sog. Variablenwert) zugreifen kann. Wert Name {jung: 6; erwachsen: 9; alt: 12} aktueller Variablenzustand
Wertzuweisung Eine Veränderung eines Variablenwerts bzw. des zugehörigen Speicherzelleninhalts kann mit Hilfe einer Wertzuweisung an die entsprechende Variable erfolgen. Variablenzustand vorher Wertzuweisung Variable Term Variablenzustand nachher Auswertung einer Wertzuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen.
Trace-Tabelle Eine Trace-Tabelle protokolliert die Veränderungen von Variablenzuständen, wenn mehrere Wertzuweisungen (bzw. sonstige Anweisungen) ausgeführt werden. Wertzuweisung schritt jung erw. alt hilf schritt = 0 0 jung = 6 0 6 erwachsen = 9 0 6 9 alt = 12 0 6 9 12 schritt = schritt + 1 1 6 9 12 hilf = erwachsen*4 + alt*2 1 6 9 12 60 alt = erwachsen / 3 1 6 9 3 60 erwachsen = jung / 2 1 6 3 3 60 jung = hilf 1 60 3 3 60
Aufgaben siehe www.inf-schule.de
Teil 2 Programme
interaktive Ausführung Programmausführung >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> print jung, erwachsen, alt 6 9 12 >>> hilf = erwachsen*4 + alt*2 >>> alt = erwachsen / 3 >>> erwachsen = jung / 2 >>> jung = hilf >>> print jung, erwachen, alt 60 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> print jung, erwachen, alt NameError: name 'erwachen' is not defined >>> # Anfangswerte jung = 6 erwachsen = 9 alt = 12 print jung, erwachsen, alt # Berechnung der neuen Werte hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf Programm in Datei >>> 6 9 12 60 3 3 interaktive Ausführung Programmausführung
Programm Ein (Python-) Programm ist eine Folge von (Python-) Anweisungen und Kommentaren. Der Programmtext wird auch Quelltext genannt. Gestaltung von Programmen: Jede Anweisung wird (in der Regel) im Quelltext in eine neue Zeile geschrieben. Die Verständlichkeit eines Programms wird durch sogenannte sprechende Bezeichner deutlich erhöht. Ein sprechende Bezeichner ist ein Name (z. B. für eine Variable), der die Bedeutung des bezeichneten Gegenstands möglichst gut wiedergibt. Kommentare dienen dazu, die Bedeutung von Programmteilen zu erläutern. Kommentare werden eigentlich nur für die Menschen ergänzt, die den Quelltext bearbeiten. Bei der Ausführung von Programmen werden sie ignoriert. # Anfangswerte jung = 6 erwachsen = 9 alt = 12 print jung, erwachsen, alt # Berechnung der neuen Werte hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf Quelltext
EVA-Prinzip Viele Programme lassen sich wie im folgenden Beispiel nach dem EVA-Prinzip strukturieren. EVA steht hier für Eingabe - Verarbeitung - Ausgabe. Auf einen Eingabeteil folgt ein Verarbeitungsteil und schließlich ein Ausgabeteil. # Eingabe jung = input("Anzahl der jungen Maeuse: ") erwachsen = input("Anzahl der erwachsenen Maeuse: ") alt = input("Anzahl der alten Maeuse: ") # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf # Ausgabe print "Neue Populationswerte:" print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsen print "Anzahl alter Maeuse: ", alt Eingabe Verarbeitung Ausgabe
Aufgaben Testen Sie das folgende Programm. Kopieren Sie die Anweisungen in den Python-Editor und speichern Sie sie unter einem geeigneten Dateinamen ab (z. B. "maeusepopulation2.py"). Mit [Run] [Run Module] kann man jetzt die Anweisungen von Python ausführen lassen. Achtung: Das Programm fordert Sie zur Mitarbeit auf! # Eingabe jung = input("Anzahl der jungen Maeuse: ") erwachsen = input("Anzahl der erwachsenen Maeuse: ") alt = input("Anzahl der alten Maeuse: ") # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf # Ausgabe print "Neue Populationswerte:" print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsen print "Anzahl alter Maeuse: ", alt Eingabe Verarbeitung Ausgabe
Aufgaben siehe www.inf-schule.de
Teil 3 Datentypen
Halbe Mäuse? # Eingabe jung = input("Anzahl der jungen Maeuse: ") erwachsen = input("Anzahl der erwachsenen Maeuse: ") alt = input("Anzahl der alten Maeuse: ") # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf # Ausgabe print "Neue Populationswerte:" print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsen print "Anzahl alter Maeuse: ", alt >>> Anzahl der jungen Maeuse: 5 Anzahl der erwachsenen Maeuse: 7 Anzahl der alten Maeuse: 2 Neue Populationswerte: Anzahl junger Maeuse: 32 Anzahl erwachsener Maeuse: 2 Anzahl alter Maeuse: 2 >>> Anzahl der jungen Maeuse: 5.0 Anzahl der erwachsenen Maeuse: 7.0 Anzahl der alten Maeuse: 2.0 Neue Populationswerte: Anzahl junger Maeuse: 32.0 Anzahl erwachsener Maeuse: 2.5 Anzahl alter Maeuse: 2.33333333333
Datentyp Zu verarbeitende Daten können von ganz unterschiedlichem Typ sein, z. B. Zahlen, mit denen man rechnen kann, oder Zeichenketten, die man hintereinanderhängen kann. Mit dem Begriff Datentyp erfasst man in der Informatik diese unterschiedlichen Typen von Daten. Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben und mit denen die gleichen Operationen ausgeführt werden können. Datentyp: ganze Zahl Datentyp: Dezimalzahl >>> Anzahl der jungen Maeuse: 5 Anzahl der erwachsenen Maeuse: 7 Anzahl der alten Maeuse: 2 Neue Populationswerte: Anzahl junger Maeuse: 32 Anzahl erwachsener Maeuse: 2 Anzahl alter Maeuse: 2 >>> Anzahl der jungen Maeuse: 5.0 Anzahl der erwachsenen Maeuse: 7.0 Anzahl der alten Maeuse: 2.0 Neue Populationswerte: Anzahl junger Maeuse: 32.0 Anzahl erwachsener Maeuse: 2.5 Anzahl alter Maeuse: 2.33333333333
Datentypen >>> 2 2 Datentyp: ganze Zahl int >>> 2.0 Datentyp: Dezimalzahl float >>> True True Datentyp: Wahrheitswert bool >>> 'Hallo!' 'Hallo!' Datentyp: Zeichenkette string >>> ('Hans', 'Meier', 34, 'Koblenz') ('Hans', 'Meier', 34, 'Koblenz') Datentyp: Tupel tuple >>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Datentyp: Liste list ... ...
Teil 4 Entscheidungen
dominante Altersgruppe Maximum bestimmen Population: Anzahl junger Maeuse: 23 Anzahl erwachsener Maeuse: 45 Anzahl alter Maeuse: 12 dominante Altergruppe: erwachsen dominante Altersgruppe Aufgaben: Ergänzen Sie das Flussdiagramm und klären Sie, welche Altergruppe jeweils ausgegeben wird, wenn zwei bzw. alle drei gleich groß sind. Die Populationswerte der einzelnen Altersgruppen sollen hier der Größe nach geordnet ausgegeben werden. Entwickeln Sie ein geeignetes Struktogramm oder Flussdiagramm.
Wenn-Anweisung Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben. if [Bedingung]: [Anweisungssequenz] else: wenn [Bedingung]: [Anweisungssequenz] sonst: Bedingung if konto < 0: print "Der Kontostand ist negativ!" print "Bitte die Schulden begleichen!" else: print "Alles ok!" Anweisungssequenz Anweisungssequenz
Einseitige Wenn-Anweisung Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben. if [Bedingung]: [Anweisungssequenz] wenn [Bedingung]: [Anweisungssequenz] if konto < 0: print "Der Kontostand ist negativ!" print "Du hast Schulden!" if konto > 0: print "Der Kontostand ist positiv!" print "Eine Auszahlung ist möglich!"
Exkurs: Mehrfachauswahl in Python Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben. if konto > 0: print "Der Kontostand ist positiv!" else: if konto < 0: print "Der Kontostand ist negativ!" print "Der Kontostand ist gleich Null!" if zahl > 0: print "Die Zahl ist positiv!" elif zahl < 0: print "Die Zahl ist negativ!" else: print "Die Zahl ist gleich Null!"
Aufgaben siehe www.inf-schule.de
Teil 5 Wiederholungen
Ein Blick in die Zukunft # Eingabe jung = ... erwachsen = ... alt = ... # Verarbeitung gesamt = jung + erwachsen + alt schritt = 0 while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 # Ausgabe: print "Neue Populationswerte:" print "Anzahl der Schritte: ", schritt print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsen print "Anzahl alter Maeuse: ", alt print "Gesamtanzahl der Maeuse: ", gesamt Schritt jung erw. alt 0 6 9 12 1 60 3 3 ... 10 ? ? ? Aufgaben: Ändere Sie das Programm so ab, dass folgende Aufgaben erledigt werden: In jedem Berechnungsschritt sollen die aktuellen Populationswerte ausgegeben werden. Der Benutzer kann selbst eingeben, wie viele Schritte simuliert werden sollen. Der Benutzer kann eine bestimmte Gesamtanzahl von Mäusen eingeben, bis zu der die Simulation durchgeführt werden soll. Ausgegeben werden soll, wie viele Schritte benötigt werden.
Solange-Anweisung Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut. # Eingabe ... # Verarbeitung gesamt = jung + erwachsen + alt schritt = 0 while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 # Ausgabe: solange [Bedingung]: [Anweisungssequenz] Bedingung Anweisungssequenz while [Bedingung]: [Anweisungssequenz]
Solange-Anweisung # Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung gesamt = jung + erwachsen + alt schritt = 0 while gesamt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 # Ausgabe: ... # Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung gesamt = jung + erwachsen + alt schritt = 0 while gesamt <> 25: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 # Ausgabe: ... Endlosschleife unendlich viele Schleifendurchläufe kein Schleifendurchlauf
Exkurs: Iteration in Python # Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung gesamt = jung + erwachsen + alt for schritt in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf # Ausgabe: ... # Initialisierung jung = 6 erwachsen = 9 alt = 12 min = 0 max = 10 # Verarbeitung gesamt = jung + erwachsen + alt for schritt in range(min, max, 1): hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf # Ausgabe: ... Kollektion for [Element] in [Kollektion]: [Anweisungssequenz]
Aufgaben siehe www.inf-schule.de
Teil 6 Bedingungen
Ein interessantes Phänomen >>> Anzahl der jungen Maeuse: 30 Anzahl der erwachsenen Maeuse: 300 Anzahl der alten Maeuse: 500 Anzahl der Simulationsschritte: 20 Schritt 0 : 30 300 500 Schritt 1 : 1900 7 150 Schritt 2 : 321 475 3 Schritt 3 : 1431 80 237 Schritt 4 : 714 357 40 Schritt 5 : 1151 178 178 ... Schritt 10 : 972 249 119 Schritt 11 : 985 243 124 Schritt 12 : 977 246 121 Schritt 13 : 980 244 123 Schritt 14 : 978 245 122 Schritt 15 : 979 244 122 Schritt 16 : 976 244 122 Schritt 17 : 976 244 122 Schritt 18 : 976 244 122 Schritt 19 : 976 244 122 Schritt 20 : 976 244 122 geänderte Sterbe- und Geburtenraten Aufgaben: Versuchen Sie, das bisher entwickelte Programm so abzuändern, dass bei einer stabilen Population nicht mehr weitergerechnet wird. stabile Population while (schritt < schritte) and (stabil == False): ...
Vergleichsoperatoren Komplexe Bedingungen Eine Bedingung wird aus elementaren Bedingungen und logischen Operatoren aufgebaut. while (schritt < schritte) and (stabil == False): ... logischer Operator el. Bedingung el. Bedingung Operator Bedeutung Bsp. Ergebnis < kleiner 2 < 1 False > größer 4 > 2 True <= kleiner oder gleich 3 <= 3 True >= größer oder gleich 3 >= 4 False == gleich 4 == 3 False <> ungleich 2 <> 3 True != ungleich 2 != 3 True Vergleichsoperatoren Operator Bedeutung Bsp. Ergebnis not nicht not True False and und True and False False or oder True or False True logische Operatoren
Aufgaben siehe www.inf-schule.de
Teil 7 Prozeduren
Teile und herrsche def population_eingeben(): ... def neue_population_berechnen(): def population_ausgeben(): # Hauptprogramm population_eingeben() population_ausgeben() while schritt < schritte: neue_population_berechnen() def population_eingeben(): global jung, erwachsen, alt, gesamt, ... jung = input("Anzahl junger Maeuse: ") erwachsen = ... alt = ... schritte = input("Anzahl der Schritte: ") schritt = 0 Aufgaben: Versuchen Sie, analog die beiden anderen Unterprogramme zu implementieren. Testen Sie auch, was geschieht, wenn man die Zeile "global ..." weglässt. Welchen Sinn könnte die Zeile "global ..." haben? Teile und herrsche ist eine Problemlöse-strategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis sich diese einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt.
Prozeduren Prozeduren sind Unterprogramme zur Lösung von Teilproblemen. Problem: Simulation einer Mäusepopulation Teilprobleme: Population eingeben, neue Population berechnen, Population ausgeben def population_eingeben(): ... def neue_population_berechnen(): def population_ausgeben(): # Hauptprogramm population_eingeben() population_ausgeben() while schritt < schritte: neue_population_berechnen() Prozedurdeklaration Prozeduraufruf
lokale / globale Variable Eine lokale Variable ist nur innerhalb der Prozedur zugreifbar, in der sie eingeführt wird. Eine globale Variable ist (vereinfacht gesagt) eine Variable, die im Hauptprogramm eingeführt wird und in allen Prozeduren benutzt werden kann, in denen nicht eine gleichlautende lokale Variable eingeführt ist. Verändert man innerhalb einer Prozedur den Wert einer globalen Variablen, so spricht man auch von einem Seiteneffekt. def population_eingeben(): ... def neue_population_berechnen(): def population_ausgeben(): # Hauptprogramm population_eingeben() population_ausgeben() while schritt < schritte: neue_population_berechnen() def neue_population_berechnen(): global jung, erwachsen, alt, schritt hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf schritt = schritt + 1 lokale Variable globale Variable Achtung beim Umgang mit Variablen!
Achtung beim Umgang mit Variablen! Datenmodell # Datenmodell jung = None erwachsen = None alt = None schritte = None schritt = None # Unterprogramme def population_eingeben(): ... def neue_population_berechnen(): def population_ausgeben(): # Hauptprogramm population_eingeben() population_ausgeben() while schritt < schritte: neue_population_berechnen() Das Zusammenspiel von lokalen und globalen Variablen ist nicht einfach. Es ist daher wichtig, über Strategien zur Vermeidung von Fehlern zu verfügen. Eine Strategie besteht darin, ein Datenmodell zu entwickeln und explizit im Quelltext darzustellen. Das Datenmodell besteht hier aus den Variablen, mit deren Hilfe die entscheidenden Größen des Problembereichs erfasst werden. Diese werden zu Beginn des Programms aufgelistet. Nicht aufgeführt werden Hilfsvariablen und natürlich lokale Variablen von Unterprogrammen. Eine solche Variablendeklaration zu Beginn des Programms ist in Python nicht erforderlich. Sie trägt aber sehr zur Klarheit und Verständlichkeit des Programms bei. Datenmodell globale Variablen Achtung beim Umgang mit Variablen!
Aufgaben siehe www.inf-schule.de
Teil 8 Parameter
Grafische Aufbereitung >>> Anzahl der jungen Maeuse: 6 Anzahl der erwachsenen Maeuse: 9 Anzahl der alten Maeuse: 12 Anzahl der Simulationsschritte: 15 Schritt 0 : ****** ********* ************ Schritt 1 : *************************************************** * **** Schritt 2 : *********** Schritt 3 : ************************************ ** Schritt 4 : ... def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken Aufgaben: Testen Sie zunächst interaktiv die Prozedur "balken_zeichnen" durch Aufrufe wie balken_zeichen(7, "o"). Ändern Sie das bisher entwickelte Programm so ab, dass die Ausgabe mit Hilfe von Balkendiagrammen erfolgt.
Parameter Parameter sind Platzhalter, mit deren Hilfe man Daten zur Laufzeit an Unterprogramme übergeben kann. formale Parameter def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken Prozedurdeklaration aktuelle Parameter >>> balken_zeichnen(6, "O") OOOOOO >>> balken_zeichnen(12, "#") ############ >>> balken_zeichnen(jung+erwachsen+alt, "M") MMMMMMMMMMMMMMMMMMMM Prozeduraufruf
Aufgaben siehe www.inf-schule.de
Teil 9 Funktionen
Modifizierte grafische Aufbereitung >>> Anzahl der jungen Maeuse: 6 Anzahl der erwachsenen Maeuse: 9 Anzahl der alten Maeuse: 12 Anzahl der Simulationsschritte: 10 Veranschaulichung der relativen Haeufigkeiten (O entspricht 2%): Schritt 0 : 6 9 12 OOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOO Schritt 1 : 60 2 4 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O OOO Schritt 2 : 16 20 1 OOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOO Schritt 3 : 82 5 10 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OO OOOOO ... Anforderungen: Die Balken sollen die Anteile der Populationsgruppen grafisch anzeigen. Die Gesamtlänge (100%) soll 50 betragen. Anteil: 6/27 22% Länge: 50*0.22 11
Modifizierte grafische Aufbereitung def anteil(bestand, gesamtheit): if gesamtheit > 0: a = float(bestand) / float(gesamtheit) else: a = 0.0 return a def absolut(anteil, gesamtheit): return anteil * gesamtheit def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken Aufgaben: Testen Sie die gezeigten Unterprogramme. Was bewirkt die return-Anweisung? Modifizieren Sie das bisher entwickelte Programm. Anteil: 6/27 22% Länge: 50*0.22 11 >>> anteil(6, 6+9+12) 0.22222222222222221 >>> absolut(0.222, 50) 11.1 >>> balkenlaenge_jung = int(absolut(anteil(6, 6+9+12), 50)) >>> balken_zeichnen(balkenlaenge_jung, "O") OOOOOOOOOOO
Funktionen Eine Funktion ist ein Unterprogramm, das einen Rückgabewert als Ergebnis liefert. def anteil(bestand, gesamtheit): if gesamtheit > 0: a = float(bestand) / float(gesamtheit) else: a = 0.0 return a def absolut(anteil, gesamtheit): return anteil * gesamtheit Funktionsdeklaration Rückgabe-Anweisung >>> anteil(6, 6+9+12) 0.22222222222222221 >>> absolut(0.222, 50) 11.1 Funktionswert als Berechnungsergebnis Funktionsaufruf
Unterschied: Funktion - Prozedur def anteil(bestand, gesamtheit): if gesamtheit > 0: a = float(bestand) / float(gesamtheit) else: a = 0.0 return a def absolut(anteil, gesamtheit): return anteil * gesamtheit def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken Im Unterschied zu einer Prozedur stellt ein Funktionsaufruf keine eigenständige Anweisung dar. Innerhalb eines Programms muss bei einem Funktionsaufruf immer die weitere Verarbeitung des Rückgabewerts festgelegt werden. def demo1(): jung = 6 gesamt = 6 + 9 + 12 anteil_jung = anteil(jung, gesamt) laenge_jung = int(absolut(anteil_jung, 50)) balken_zeichnen(laenge_jung, "O") def demo2(): jung = 6 gesamt = 6 + 9 + 12 balken_zeichnen(int(absolut(anteil(jung, gesamt), 50)), "O") Prozeduraufruf als Anweisung Funktionsaufruf als Term / Bestandteil eines Terms
Aufgaben siehe www.inf-schule.de
Teil 10 Schnittstellen
Verwendung von Unterprogrammen population_eingeben() # Man wird aufgefordert, eine Liste mit drei (natürlichen) Zahlen einzugeben. # Die Prozedur speichert diese Liste in der globalen Variablen population ab. neue_population_berechnen() # Die Prozedur berechnet die neuen Populationswerte # und speichert sie als Liste in der globalen Variablen population ab. Unterprogramm-Beschreibungen population_ausgeben() # Die Prozedur gibt die aktuellen Populationswerte mit einem Balkendiagramm aus. # Jedes Zeichen entspricht einem Individuum der Population. >>> population_eingeben() Population als dreielementige Liste: [6, 9, 12] >>> population_ausgeben() OOOOOO OOOOOOOOO OOOOOOOOOOOO >>> neue_population_berechnen() OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O OOOO Verwendung, ohne die Details der Deklarationen zu kennen
Schnittstellen Die Schnittstelle eines Unterprogramms (Prozedur / Funktion) legt sämtliche Informationen fest, die man wissen muss, um das Unterprogramm benutzen zu können. Welchen Namen hat die Prozedur / Funktion? Wie viele Parameter gibt es? Welche Werte darf man für sie einsetzen? In welcher Reihenfolge treten sie auf? Wofür stehen sie? Wie verhält sich die Prozedur / Funktion? Informationen, die man wissen muss Signatur einer Prozedur Signatur einer Funktion balken_zeichnen(laenge, zeichen) # laenge: natürliche Zahl # zeichen: Zeichen(kette) anteil(bestand, gesamtheit) # bestand: Zahl # gesamtheit: Zahl # Rückgabewert: Dezimalzahl Die Prozedur balken_zeichnen gibt eine Zeichenkette aus, deren Länge dem Wert von laenge entspricht und deren Zeichen dem Wert von zeichen entspricht. Die Funktion anteil liefert eine Dezimalzahl, die den Anteil des Werts von bestand am Wert von gesamtheit angibt. Verhaltens- beschreibung >>> balken_zeichnen(30, "!") !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! >>> anteil(6, 27) 0.22222222222222221
Exkurs: Verwaltung v. Daten mit Listen def population_eingeben(): global population population = input("Population als dreielementige Liste: ") def neue_population_berechnen(): population = [population[1]*3+population[2]*2, population[0]/4, population[1]/2] def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken def balkendiagramm(liste): for i in range(len(liste)): balken_zeichnen(liste[i], "O") def population_ausgeben(): balkendiagramm(population)
Teil 11 Miniprojekt
Problem / Auftrag Problem: Sterben die Deutschen langsam aus? Überaltert unsere Gesellschaft zunehmend? Startwerte (jeweils in Millionen) für das Jahr 2005: 0-14-Jährige: 12.3; 15-49-Jährige: 39.1; 50-64-Jährige: 15.5; über-65-Jährige: 16.3 Auftrag: Entwickeln Sie ein Simulationsprogramm mit dem die weitere Entwicklung der Bevölkerung in Deutschland simuliert werden kann. Benutzen Sie das oben gezeigte (durchaus realistische) Populationsmodell.
Pflichtenheft Aufgabe: Formulieren Sie zunächst möglichst genau, was das zu entwickelnde Programm leisten soll. Pflichtenheft: Der Benutzer kann den Zeitraum vorgeben, in dem die Bevölkerungsentwicklung simuliert wird. Die berechneten Daten werden als Zahlen und mit einem Balkendiagramm ausgegeben. ...
Algorithmen / Programm Aufgabe: Ändern Sie die Algorithmen zur Entwicklung der Mäusepopulation geeignet ab. Entwickeln Sie ein gut strukturiertes und hinreichend dokumentiertes Programm.
Getestetes Produkt Aufgabe: Testen Sie das entwickelte Programm. Dokumentieren Sie die Testergebnisse.