61
Konzepte imperativer Programmierung Klaus Becker 2008

Konzepte imperativer Programmierung Klaus Becker 2008

Embed Size (px)

Citation preview

Page 1: Konzepte imperativer Programmierung Klaus Becker 2008

Konzepte imperativer Programmierung

Klaus Becker

2008

Page 2: Konzepte imperativer Programmierung Klaus Becker 2008

2

... und ihre Implementierung in Python

# Eingabejung = int(raw_input("Anzahl der jungen Maeuse: "))erwachsen = int(raw_input("Anzahl der erwachsenen Maeuse: "))alt = int(raw_input("Anzahl der alten Maeuse: "))

# Verarbeitungschritt = 0while 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: ", schrittprint "Anzahl junger Maeuse: ", jungprint "Anzahl erwachsener Maeuse: ", erwachsenprint "Anzahl alter Maeuse: ", alt

Page 3: Konzepte imperativer Programmierung Klaus Becker 2008

3 Teil 1

Variablen

Page 4: Konzepte imperativer Programmierung Klaus Becker 2008

4 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.

Page 5: Konzepte imperativer Programmierung Klaus Becker 2008

5 Aufgabe

Schritt

0

1

2

3

4

5

...

Modellannahme: Zu Beginn besteht die Population aus 6 jungen, 9 erwachsenen und 12 alten Mäusen.

jung

6

60 = 4*9+2*12

erwachsen

9

3 = 6/2

alt

12

3 = 9/3

Berechnen Sie die jeweiligen Populationswerte.

Page 6: Konzepte imperativer Programmierung Klaus Becker 2008

6 Aufgabe

Probieren Sie das mal aus. Alles klar? Alles ok? Was nun?

>>> jung = 6>>> erwachsen = 9>>> alt = 12>>> jung6>>> erwachsen9>>> alt12>>> alt = erwachsen / 3>>> erwachsen = jung / 2>>> jung = erwachsen*4 + alt*2>>> jung18>>> erwachsen3>>> alt3>>>

Schritt

0

1

2

3

4

5

...

jung

6

60 = 4*9+2*12

erwachsen

9

3 = 6/2

alt

12

3 = 9/3

Python-Dialog

Page 7: Konzepte imperativer Programmierung Klaus Becker 2008

7 Variable

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.

{jung: 6; erwachsen: 9; alt: 12}

aktueller Variablenzustand

Name

Wert

Page 8: Konzepte imperativer Programmierung Klaus Becker 2008

8 Wertzuweisung

Eine Veränderung eines Variablenwerts bzw. des zugehörigen Speicherzelleninhalts kann mit Hilfe einer Wertzuweisung an die entsprechende Variable erfolgen.

Variablenzustand vorher

Wertzuweisung

Variablenzustand nachherAuswertung 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.

Variable

Term

Page 9: Konzepte imperativer Programmierung Klaus Becker 2008

9 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

Page 10: Konzepte imperativer Programmierung Klaus Becker 2008

10 Aufgaben

siehe www.inf-schule.de

Page 11: Konzepte imperativer Programmierung Klaus Becker 2008

11 Teil 2

Programme

Page 12: Konzepte imperativer Programmierung Klaus Becker 2008

12 Programmausführung

>>> jung = 6>>> erwachsen = 9>>> alt = 12>>> print jung, erwachsen, alt6 9 12>>> hilf = erwachsen*4 + alt*2>>> alt = erwachsen / 3>>> erwachsen = jung / 2>>> jung = hilf>>> print jung, erwachen, alt60

Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> print jung, erwachen, altNameError: name 'erwachen' is not defined>>>

# Anfangswertejung = 6erwachsen = 9alt = 12print jung, erwachsen, alt# Berechnung der neuen Wertehilf = erwachsen*4 + alt*2alt = erwachsen / 3erwachsen = jung / 2jung = hilfprint jung, erwachsen, alt

>>> 6 9 1260 3 3

interaktive Ausführung Programmausführung

Programm in Datei

Page 13: Konzepte imperativer Programmierung Klaus Becker 2008

13 Programm

# Anfangswertejung = 6erwachsen = 9alt = 12print jung, erwachsen, alt# Berechnung der neuen Wertehilf = erwachsen*4 + alt*2alt = erwachsen / 3erwachsen = jung / 2jung = hilfprint jung, erwachsen, alt

Quelltext

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.

Page 14: Konzepte imperativer Programmierung Klaus Becker 2008

14 EVA-Prinzip

# Eingabejung = input("Anzahl der jungen Maeuse: ")erwachsen = input("Anzahl der erwachsenen Maeuse: ")alt = input("Anzahl der alten Maeuse: ")# Verarbeitunghilf = erwachsen*4 + alt*2alt = erwachsen / 3erwachsen = jung / 2jung = hilf# Ausgabeprint "Neue Populationswerte:"print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsenprint "Anzahl alter Maeuse: ", alt

Eingabe

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.

Verarbeitung

Ausgabe

Page 15: Konzepte imperativer Programmierung Klaus Becker 2008

15 Aufgaben

# Eingabejung = input("Anzahl der jungen Maeuse: ")erwachsen = input("Anzahl der erwachsenen Maeuse: ")alt = input("Anzahl der alten Maeuse: ")# Verarbeitunghilf = erwachsen*4 + alt*2alt = erwachsen / 3erwachsen = jung / 2jung = hilf# Ausgabeprint "Neue Populationswerte:"print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsenprint "Anzahl alter Maeuse: ", alt

Eingabe

Verarbeitung

Ausgabe

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!

Page 16: Konzepte imperativer Programmierung Klaus Becker 2008

16 Aufgaben

siehe www.inf-schule.de

Page 17: Konzepte imperativer Programmierung Klaus Becker 2008

17 Teil 3

Datentypen

Page 18: Konzepte imperativer Programmierung Klaus Becker 2008

18 Halbe Mäuse?

# Eingabejung = input("Anzahl der jungen Maeuse: ")erwachsen = input("Anzahl der erwachsenen Maeuse: ")alt = input("Anzahl der alten Maeuse: ")# Verarbeitunghilf = erwachsen*4 + alt*2alt = erwachsen / 3erwachsen = jung / 2jung = hilf# Ausgabeprint "Neue Populationswerte:"print "Anzahl junger Maeuse: ", jung print "Anzahl erwachsener Maeuse: ", erwachsenprint "Anzahl alter Maeuse: ", alt

>>> Anzahl der jungen Maeuse: 5Anzahl der erwachsenen Maeuse: 7Anzahl der alten Maeuse: 2Neue Populationswerte:Anzahl junger Maeuse: 32Anzahl erwachsener Maeuse: 2Anzahl alter Maeuse: 2

>>> Anzahl der jungen Maeuse: 5.0Anzahl der erwachsenen Maeuse: 7.0Anzahl der alten Maeuse: 2.0Neue Populationswerte:Anzahl junger Maeuse: 32.0Anzahl erwachsener Maeuse: 2.5Anzahl alter Maeuse: 2.33333333333

Page 19: Konzepte imperativer Programmierung Klaus Becker 2008

19 Datentyp

>>> Anzahl der jungen Maeuse: 5Anzahl der erwachsenen Maeuse: 7Anzahl der alten Maeuse: 2Neue Populationswerte:Anzahl junger Maeuse: 32Anzahl erwachsener Maeuse: 2Anzahl alter Maeuse: 2

>>> Anzahl der jungen Maeuse: 5.0Anzahl der erwachsenen Maeuse: 7.0Anzahl der alten Maeuse: 2.0Neue Populationswerte:Anzahl junger Maeuse: 32.0Anzahl erwachsener Maeuse: 2.5Anzahl alter Maeuse: 2.33333333333

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

Page 20: Konzepte imperativer Programmierung Klaus Becker 2008

20 Datentypen

>>> 22

Datentyp: ganze Zahl int

>>> 2.02.0

>>> TrueTrue

>>> 'Hallo!''Hallo!'

>>> ('Hans', 'Meier', 34, 'Koblenz')('Hans', 'Meier', 34, 'Koblenz')

>>> [1, 2, 3, 4, 5][1, 2, 3, 4, 5]

Datentyp: Dezimalzahl

float

Datentyp: Wahrheitswert

bool

Datentyp: Zeichenkette

string

Datentyp: Tupel tuple

Datentyp: Liste list

... ...

Page 21: Konzepte imperativer Programmierung Klaus Becker 2008

21 Teil 4

Entscheidungen

Page 22: Konzepte imperativer Programmierung Klaus Becker 2008

22 Maximum bestimmen

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.

dominante Altersgruppe

Population: Anzahl junger Maeuse: 23Anzahl erwachsener Maeuse: 45Anzahl alter Maeuse: 12dominante Altergruppe: erwachsen

Page 23: Konzepte imperativer Programmierung Klaus Becker 2008

23 Wenn-Anweisung

wenn [Bedingung]: [Anweisungssequenz]sonst: [Anweisungssequenz]

Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.

if [Bedingung]: [Anweisungssequenz]else: [Anweisungssequenz]

if konto < 0: print "Der Kontostand ist negativ!" print "Bitte die Schulden begleichen!"else: print "Alles ok!"

Bedingung

Anweisungssequenz

Anweisungssequenz

Page 24: Konzepte imperativer Programmierung Klaus Becker 2008

24 Einseitige Wenn-Anweisung

wenn [Bedingung]: [Anweisungssequenz]

Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.

if [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!"

Page 25: Konzepte imperativer Programmierung Klaus Becker 2008

25 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!" else: 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!"

Page 26: Konzepte imperativer Programmierung Klaus Becker 2008

26 Aufgaben

siehe www.inf-schule.de

Page 27: Konzepte imperativer Programmierung Klaus Becker 2008

27 Teil 5

Wiederholungen

Page 28: Konzepte imperativer Programmierung Klaus Becker 2008

28 Ein Blick in die Zukunft

# Eingabejung = ...erwachsen = ...alt = ...

# Verarbeitunggesamt = jung + erwachsen + altschritt = 0while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf gesamt = jung + erwachsen + alt schritt = schritt + 1 # Ausgabe:print "Neue Populationswerte:"print "Anzahl der Schritte: ", schrittprint "Anzahl junger Maeuse: ", jungprint "Anzahl erwachsener Maeuse: ", erwachsenprint "Anzahl alter Maeuse: ", altprint "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.

Page 29: Konzepte imperativer Programmierung Klaus Becker 2008

29 Solange-Anweisung

solange [Bedingung]: [Anweisungssequenz]

Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut.

# Eingabe...

# Verarbeitunggesamt = jung + erwachsen + altschritt = 0while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf gesamt = jung + erwachsen + alt schritt = schritt + 1 # Ausgabe:...

Bedingung

Anweisungssequenz

while [Bedingung]: [Anweisungssequenz]

Page 30: Konzepte imperativer Programmierung Klaus Becker 2008

30 Solange-Anweisung

# Initialisierungjung = 6erwachsen = 9alt = 12

# Verarbeitunggesamt = jung + erwachsen + altschritt = 0while gesamt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf gesamt = jung + erwachsen + alt schritt = schritt + 1 # Ausgabe:...

kein Schleifendurchlauf

# Initialisierungjung = 6erwachsen = 9alt = 12

# Verarbeitunggesamt = jung + erwachsen + altschritt = 0while gesamt <> 25: hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf gesamt = jung + erwachsen + alt schritt = schritt + 1 # Ausgabe:...

unendlich viele Schleifendurchläufe

Endlosschleife

Page 31: Konzepte imperativer Programmierung Klaus Becker 2008

31 Exkurs: Iteration in Python

# Initialisierungjung = 6erwachsen = 9alt = 12

# Verarbeitunggesamt = jung + erwachsen + altfor 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 gesamt = jung + erwachsen + alt # Ausgabe:...

Kollektion

# Initialisierungjung = 6erwachsen = 9alt = 12min = 0max = 10

# Verarbeitunggesamt = jung + erwachsen + altfor schritt in range(min, max, 1): hilf = erwachsen*4 + alt*2 alt = erwachsen / 3 erwachsen = jung / 2 jung = hilf gesamt = jung + erwachsen + alt # Ausgabe:...

for [Element] in [Kollektion]: [Anweisungssequenz]

Page 32: Konzepte imperativer Programmierung Klaus Becker 2008

32 Aufgaben

siehe www.inf-schule.de

Page 33: Konzepte imperativer Programmierung Klaus Becker 2008

33 Teil 6

Bedingungen

Page 34: Konzepte imperativer Programmierung Klaus Becker 2008

34 Ein interessantes Phänomen

>>> Anzahl der jungen Maeuse: 30Anzahl der erwachsenen Maeuse: 300Anzahl der alten Maeuse: 500Anzahl der Simulationsschritte: 20Schritt 0 : 30 300 500Schritt 1 : 1900 7 150Schritt 2 : 321 475 3Schritt 3 : 1431 80 237Schritt 4 : 714 357 40Schritt 5 : 1151 178 178...Schritt 10 : 972 249 119Schritt 11 : 985 243 124Schritt 12 : 977 246 121Schritt 13 : 980 244 123Schritt 14 : 978 245 122Schritt 15 : 979 244 122Schritt 16 : 976 244 122Schritt 17 : 976 244 122Schritt 18 : 976 244 122Schritt 19 : 976 244 122Schritt 20 : 976 244 122

Aufgaben:Versuchen Sie, das bisher entwickelte Programm so abzuändern, dass bei einer stabilen Population nicht mehr weitergerechnet wird.

geänderte Sterbe- und Geburtenraten

stabile Population

while (schritt < schritte) and (stabil == False): ...

Page 35: Konzepte imperativer Programmierung Klaus Becker 2008

35 Komplexe Bedingungen

Eine Bedingung wird aus elementaren Bedingungen und logischen Operatoren aufgebaut.

el. Bedingung

while (schritt < schritte) and (stabil == False): ...

el. Bedingung

logischer Operator

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

Operator Bedeutung Bsp. Ergebnisnot nicht not True Falseand und True and False Falseor oder True or False True

logische Operatoren

Vergleichsoperatoren

Page 36: Konzepte imperativer Programmierung Klaus Becker 2008

36 Aufgaben

siehe www.inf-schule.de

Page 37: Konzepte imperativer Programmierung Klaus Becker 2008

37 Teil 7

Prozeduren

Page 38: Konzepte imperativer Programmierung Klaus Becker 2008

38 Teile und herrsche

def population_eingeben(): ...

def neue_population_berechnen(): ...

def population_ausgeben(): ... # Hauptprogramm

population_eingeben()population_ausgeben()while schritt < schritte: neue_population_berechnen() population_ausgeben()

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.

def population_eingeben(): global jung, erwachsen, alt, gesamt, ... jung = input("Anzahl junger Maeuse: ") erwachsen = ... alt = ... schritte = input("Anzahl der Schritte: ") schritt = 0Aufgaben: 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?

Page 39: Konzepte imperativer Programmierung Klaus Becker 2008

39 Prozeduren

Prozeduren sind Unterprogramme zur Lösung von Teilproblemen.

def population_eingeben(): ...

def neue_population_berechnen(): ...

def population_ausgeben(): ... # Hauptprogramm

population_eingeben()population_ausgeben()while schritt < schritte: neue_population_berechnen() population_ausgeben()

Prozeduraufruf

Prozedurdeklaration

Problem: Simulation einer MäusepopulationTeilprobleme: Population eingeben, neue Population berechnen, Population ausgeben

Page 40: Konzepte imperativer Programmierung Klaus Becker 2008

40 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() population_ausgeben()

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

globale Variable

lokale Variable

Achtung beim Umgang mit Variablen!

Page 41: Konzepte imperativer Programmierung Klaus Becker 2008

41 Datenmodell

# Datenmodelljung = Noneerwachsen = Nonealt = Noneschritte = Noneschritt = None

# Unterprogrammedef population_eingeben(): ...

def neue_population_berechnen(): ...

def population_ausgeben(): ... # Hauptprogrammpopulation_eingeben()population_ausgeben()while schritt < schritte: neue_population_berechnen() population_ausgeben()

globale Variablen

Datenmodell

Achtung beim Umgang mit Variablen!

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.

Page 42: Konzepte imperativer Programmierung Klaus Becker 2008

42 Aufgaben

siehe www.inf-schule.de

Page 43: Konzepte imperativer Programmierung Klaus Becker 2008

43 Teil 8

Parameter

Page 44: Konzepte imperativer Programmierung Klaus Becker 2008

44 Grafische Aufbereitung

>>> Anzahl der jungen Maeuse: 6Anzahl der erwachsenen Maeuse: 9Anzahl der alten Maeuse: 12Anzahl der Simulationsschritte: 15Schritt 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.

Page 45: Konzepte imperativer Programmierung Klaus Becker 2008

45 Parameter

Parameter sind Platzhalter, mit deren Hilfe man Daten zur Laufzeit an Unterprogramme übergeben kann.

Prozeduraufruf

def balken_zeichnen(laenge, zeichen): balken = "" for i in range(laenge): balken = balken + zeichen print balken

>>> balken_zeichnen(6, "O")OOOOOO>>> balken_zeichnen(12, "#")############>>> balken_zeichnen(jung+erwachsen+alt, "M")MMMMMMMMMMMMMMMMMMMM

Prozedurdeklaration

formale Parameter

aktuelle Parameter

Page 46: Konzepte imperativer Programmierung Klaus Becker 2008

46 Aufgaben

siehe www.inf-schule.de

Page 47: Konzepte imperativer Programmierung Klaus Becker 2008

47 Teil 9

Funktionen

Page 48: Konzepte imperativer Programmierung Klaus Becker 2008

48 Modifizierte grafische Aufbereitung

>>> Anzahl der jungen Maeuse: 6Anzahl der erwachsenen Maeuse: 9Anzahl der alten Maeuse: 12Anzahl der Simulationsschritte: 10Veranschaulichung der relativen Haeufigkeiten (O entspricht 2%):Schritt 0 : 6 9 12OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSchritt 1 : 60 2 4OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSchritt 2 : 16 20 1OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOSchritt 3 : 82 5 10OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...

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

Page 49: Konzepte imperativer Programmierung Klaus Becker 2008

49 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

Page 50: Konzepte imperativer Programmierung Klaus Becker 2008

50 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

Rückgabe-Anweisung

Funktionsdeklaration

>>> anteil(6, 6+9+12)0.22222222222222221>>> absolut(0.222, 50)11.1

FunktionsaufrufFunktionswert als Berechnungsergebnis

Page 51: Konzepte imperativer Programmierung Klaus Becker 2008

51 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 balkendef demo2(): jung = 6 gesamt = 6 + 9 + 12 balken_zeichnen(int(absolut(anteil(jung, gesamt), 50)), "O")

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")

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.

Prozeduraufruf als Anweisung

Funktionsaufruf als Term / Bestandteil eines Terms

Page 52: Konzepte imperativer Programmierung Klaus Becker 2008

52 Aufgaben

siehe www.inf-schule.de

Page 53: Konzepte imperativer Programmierung Klaus Becker 2008

53 Teil 10

Schnittstellen

Page 54: Konzepte imperativer Programmierung Klaus Becker 2008

54

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.

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()OOOOOOOOOOOOOOOOOOOOOOOOOOO>>> neue_population_berechnen()>>> population_ausgeben()OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Unterprogramm-Beschreibungen

Verwendung, ohne die Details der Deklarationen zu

kennen

Page 55: Konzepte imperativer Programmierung Klaus Becker 2008

55 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?

balken_zeichnen(laenge, zeichen) # laenge: natürliche Zahl# zeichen: Zeichen(kette)

>>> balken_zeichnen(30, "!")!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Die Prozedur balken_zeichnen gibt eine Zeichenkette aus, deren Länge dem Wert von laenge entspricht und deren Zeichen dem Wert von zeichen entspricht.

anteil(bestand, gesamtheit) # bestand: Zahl# gesamtheit: Zahl# Rückgabewert: Dezimalzahl

>>> anteil(6, 27)0.22222222222222221

Die Funktion anteil liefert eine Dezimalzahl, die den Anteil des Werts von bestand am Wert von gesamtheit angibt.

Informationen, die man wissen muss

Signatur einer Prozedur

Signatur einer Funktion

Verhaltens-beschreibung

Page 56: Konzepte imperativer Programmierung Klaus Becker 2008

56

Exkurs: Verwaltung v. Daten mit Listen

def population_eingeben(): global population population = input("Population als dreielementige Liste: ")

def neue_population_berechnen(): global population 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(): global population balkendiagramm(population)

Page 57: Konzepte imperativer Programmierung Klaus Becker 2008

57 Teil 11

Miniprojekt

Page 58: Konzepte imperativer Programmierung Klaus Becker 2008

58 Problem / Auftrag

Problem: Sterben die Deutschen langsam aus? Überaltert unsere Gesellschaft zunehmend?

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.

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

Page 59: Konzepte imperativer Programmierung Klaus Becker 2008

59 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. ...

Page 60: Konzepte imperativer Programmierung Klaus Becker 2008

60 Algorithmen / Programm

Aufgabe: Ändern Sie die Algorithmen zur Entwicklung der Mäusepopulation geeignet ab.Entwickeln Sie ein gut strukturiertes und hinreichend dokumentiertes Programm.

Page 61: Konzepte imperativer Programmierung Klaus Becker 2008

61 Getestetes Produkt

Aufgabe: Testen Sie das entwickelte Programm. Dokumentieren Sie die Testergebnisse.