1.54k likes | 1.92k Views
Imperative Programmierung - mit Python. Klaus Becker 2012. Imperative Programmierung. Teil 0. Vorbemerkungen zu Python. Entwicklungsgeschichte.
E N D
Imperative Programmierung -mit Python Klaus Becker 2012
Teil 0 Vorbemerkungen zu Python
Entwicklungsgeschichte Die Sprache wurde Anfang der 1990er Jahre von Guido van Rossum am Centrum voor Wiskunde en Informatica (Zentrum für Mathematik und Informatik) in Amsterdam als Nachfolger für die Programmier-Lehrsprache ABC entwickelt, ursprünglich für das verteilte Betriebssystem Amoeba. Alle bisherigen Implementierungen der Sprache übersetzen den Text eines Python-Programms transparent in einen Zwischencode, der dann von einem Interpreter ausgeführt wird. Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung Pythons zurück, sondern bezog sich ursprünglich auf die englische Komikertruppe Monty Python. In der Dokumentation finden sich daher auch einige Anspielungen auf Sketche aus dem Flying Circus. Trotzdem etablierte sich die Assoziation zur Schlange, was sich u. a. in der Programmiersprache Cobra sowie dem Python Toolkit „Boa“ äußert. Quelle: Wikipedia
Python - Ziele Python wurde mit dem Ziel entworfen, möglichst einfach und übersichtlich zu sein. Dies soll durch zwei Maßnahmen erreicht werden: Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus, zum anderen ist die Syntax reduziert und auf Übersichtlichkeit optimiert. Dies führt dazu, dass Python eine Sprache ist, in der man schnell, einfach und leicht programmieren kann. Sie ist daher besonders dort geeignet, wo Übersichtlichkeit und Lesbarkeit des Codes eine herausragende Rolle spielen – z. B. in der Teamarbeit, bei Beschäftigung mit dem Quelltext nach längeren Pausen oder bei Programmieranfängern. Durch die Möglichkeit, auch Programme anderer Sprachen als Modul einzubetten, werden viele Nischen in der Programmierung abgedeckt. Bei Bedarf lassen sich so beispielsweise zeitkritische Teile durch maschinennah in C programmierte Routinen ersetzen, oder Python kann als Skriptsprache eines anderen Programms dienen (Beispiele: OpenOffice.org, Blender, Maya, PyMOL, SPSS und GIMP). Quelle: Wikipedia
Python - Ziele Python ist eine Multiparadigmensprache. Das heißt, es zwingt den Programmierer nicht zu einem einzigen bestimmten Programmierparadigma, sondern erlaubt es, das für die jeweilige Aufgabe am besten geeignete Paradigma zu wählen. Objektorientierte und strukturierte Programmierung werden vollständig unterstützt, weiterhin gibt es Spracheigenschaften für funktionale und aspektorientierte Programmierung. Quelle: Wikipedia Quelle: http://kamelopedia.mormo.org/index.php/Eierlegende_Wollmilchsau
Interne Abläufe Der Quelltext eines Python Programms wird mit einem Texteditor geschrieben (z.B. Idle oder PyScripter). Der Python-Compiler erzeugt einen (maschinenunabhängigen) Byte-Code. Der Compiler entscheidet selbst, ob der Byte-Code nur als Zwischenprodukt im Arbeitsspeicher erzeugt wird, oder ob er auch als .pyc-Datei gespeichert wird. Compiler Der Python-Interpreter führt den vom Compiler erzeugten Byte-Code aus. Derselbe Byte-Code kann auf verschiedenen Plattformen ausgeführt werden, sofern diese einen Python-Interpreter zur Verfügung stellen. Interpreter
Gängige Python-Versionen http://www.python.org/download/ http://portablepython.com/releases/
Literatur • Johannes Ernesti, Peter Kaiser: Python 3. Das umfassende Handbuch. Galileo Computing 2009. (Preis: 40 €) • Michael Weigend: Objektorientierte Programmierung mit Python. mitp 2008. (Preis: 40 €) • Michael Weigend: Python Ge-Packt. mitp 2006. (Preis: 16 €) • Thomas Theis: Einstieg in Python 3. Galileo Computing 2009. (Preis: 25 €) • Gregor Lingl: Python für Kids. bhv 2008. (Preis: 20 €) • P. Barry, D. Griffiths: Programmieren von Kopf bis Fuß. O´Reilly 2010 (Preis: 20 €) • ...
Materialien • Internet: • Python Official Websitehttp://www.python.org/ • Python-Tutorium von Guido van Rossum: http://starship.python.net/crew/gherman/publications/tut-de/tut-de-21.pdfhttp://starship.python.net/crew/gherman/publications/tut-de/online/tut/ • offenes eBook von von Peter Kaiser und Johannes Ernesti (Python 2.5):http://openbook.galileocomputing.de/python/?GalileoSession=10541258A3Vg6VBUX8A • PythonWiki: http://wiki.python.de/ • Python-Kurs von W.Spiegel: http://www.wspiegel.de/pykurs/pykurs.htm • Python, Programmieren macht Spaß : http://www.thomas-guettler.de/vortraege/python/einfuehrung.html • BICS: http://schule.de/bics/inf2/programmiersprachen/python/ • Unterrichtsmaterialien von Klaus Merkert:http://www.hsg-kl.de/faecher/inf/python/index.php • Unterrichtsmaterialien aufwww.inf-schule.de
Teil 1 Populationsentwicklung - Datenverwaltung mit Variablen
Populationsentwicklung Zielsetzung: Im Folgenden soll die Entwicklung dieser Mäusepopulation simuliert werden. Ziel ist es, sich mit Hilfe automastisierter Berechnungen einen Überblick über die Größe und Zusammensetzung einer sich fortpflanzenden Mäusepopulation zu verschaffen. • 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.
Populationsentwicklung Aufgabe: Berechne die Populationswerte (ohne Python). Zur Kontrolle: Nach 5 Schritten besteht die gesamte Population aus knapp 300 Mäusen. 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 als Taschenrechner >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> alt = erwachsen // 3 >>> erwachsen = jung // 2 >>> jung = erwachsen*4 + alt*2 ... Aufgabe: (a) Probiere das selbst aus. Versuche auch zu verstehen, wie die ausgegebenen Zahlenwerte zustande kommen. (b) Irgend etwas stimmt aber nicht. Eigentlich sollten es nach einem Simulationsschritt 60 junge Mäuse sein. Woran liegt es, dass hier ein falsches Ergebnis herauskommt? (c) Benutze Hilfsvariablen, um noch benötigte Zahlenwerte zwischenzuspeichern. (d) Kann man die Berechnungen auch mit Hilfe einer einzigen Hilfsvariablen durchführen?
Python als Taschenrechner >>> schritt = 0 >>> schritt ??? >>> schritt = schritt + 1 >>> schritt ??? >>> schritt = schritt + 1 >>> schritt ??? >>> schritt = schritt + 1 >>> schritt ??? Aufgabe: (a) Die Gesamtanzahl der Mäuse soll auch verwaltet werden. Führe hierzu eine geeignete Variable und geeignete Berechnungen ein. (b) Zusätzlich soll auch noch der jeweilige Schrittzahl verwaltet werden. Teste den oben gezeigten Python-Dialog. Kannst du die Ergebnisse erklären, die anstelle der Fragezeichen auftreten?
Python als Taschenrechner >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 ??? >>> jung 60 >>> erwachsen 3 >>> alt 3 >>> Aufgabe: Bei der Berechnung des nächsten Populationszustands haben wir ein etwas merkwürdig aussehendes Divisionszeichen // benutzt. Teste, wie es sich auswirkt, wenn man anstatt des Divisionszeichens // das geläufigere Zeichen / benutzt. Was stellst du fest? Aufgabe: Führe auch Python-Dialoge wie den unten gezeigten aus. Inwiefern tragen die hier erzielten Ergebnisse zur Erklärung des unterschiedlichen Verhaltens der beiden Divisionsoperatoren // und / bei? >>> jung = 11 >>> type(jung) <class 'int'> >>> erwachsen = jung // 2 >>> type(erwachsen) <class 'int'> Python-Dialog
Fachkonzept - Variable Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. Variable Wert jung 6 erwachsen 9 alt 12 Variablenzustand Als Wert einer Variablen wird das Datenobjekt angesehen, das von der Variablen verwaltet wird. Ein Variablenzustand beschreibt die aktuell vorliegenden Variablen mit den verwalteten Daten.
Fachkonzept - Zuweisung Mit einer Zuweisung kann man eine Variable mit einem neuen Datenobjekt verknüpfen. Zustand - vorher Zuweisungszeichen {jung -> 6; erwachsen -> 9; alt -> 12} alt = erwachsen // 3 alt = erwachsen // 3 Auswertung alt -> 3 Variable Term {jung -> 6; erwachsen -> 9; alt -> 3} Zustand - nachher Auswertung einer Zuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen. Aufbau einer Zuweisung: Eine Zuweisung besteht aus einer Variablen (der ein Wert zugewiesen wird) and einem Term (der den zuzuweisenden Wert festlegt).
Trace-Tabelle Eine Trace-Tabelle protokolliert die Veränderungen von Variablenzuständen, wenn mehrere Zuweisungen (bzw. sonstige Anweisungen) ausgeführt werden. Das folgende Beispiel zeigt eine solche Trace-Tabelle. Zuweisung schritt jung erwachsen 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
Variablenbezeichner Bei der Wahl der Variablenbezeichner (d.h. der Namen, die man den Variablen gibt) ist man recht flexibel: Verwendung von Buchstaben, Ziffern und dem Unterstrich; Unterscheidung zwischen Groß- und Kleinschreibung; keine Ziffern am Anfang; Umlaute sind erlaubt, machen aber gelegentlich Schwierigkeiten. Bei der Wahl der Variablenbezeichner sollte man sprechende Namen benutzen. Das sind Namen, die möglichst gut erklären, welche Daten mit den Variablen verwaltet werden. >>> a = 20 >>> b = 12 >>> c = a + b >>> d = a >>> a = a // 2 + 4 * b >>> b = d // 2 + b // 2 >>> c = a + b >>> d = a >>> a = a // 2 + 4 * b >>> b = d // 2 + b // 2 >>> c = a + b Aufgabe: Die Folge von Zuweisungen soll die Entwicklung einer Population beschreiben. Beurteile die Wahl der Variablenbezeichner?
Exkurs: Was ist eine Variable? Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der mit einer Speicherzelle verknüpft ist. Mit der Variable kann man auf den in der zugehörigen Speicherzelle abgelegten Datenwert zugreifen. "Behältersemantik" Speicherzelle mit Datenwert Name Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. "Zeigersemantik" Name Zeiger Datenobjekt Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Wert verknüpft ist. "Wertsemantik" {jung -> 6; erwachsen -> 9; alt -> 12} Datenwert Name
Exkurs: Variablen in Python Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. "Zeigersemantik" Name Zeiger Datenobjekt Jedes Datenobjekt in Python hat eine Identitätsnummer, einen Typ und einen Wert. Die Identitätsnummer ist die Adresse des Objekts im Speicher. Sie ist also eine Zahl, mit der man ein Datenobjekt eindeutig identifizieren kann. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. Die Verknüpfung wird durch einen Verweis (Referenz) auf die Speicheradresse des Datenobjekts hergestellt. >>> id(2) 505300136 >>> zahl = 2 >>> id(zahl) 505300136 >>> type(zahl) <class 'int'> >>> zahl 2 >>> id(2) 505300136 >>> type(2) <class 'int'> >>> 2 2
Exkurs: Zuweisungen in Python Eine Veränderung eines Variablenwerts kann mit Hilfe einer Zuweisung erfolgen. Erst wird der Wert des Terms (auf der rechten Seite der Zuweisung) mit Hilfe des aktuellen Variablenzustands ermittelt. Dann wird ein Datenobjekt mit diesem Wert an die Variable (auf der linken Seite der Zuweisung) gebunden. Dieses Datenobjekt kann ein bereits existierendes Datenobjekt sein oder ein neu erzeugtes. Python entscheidet nach internen Strategien, welche Version günstiger ist. Je nach Programmablaufsituation können gleiche Zuweisungen durchaus zu unterschiedlichen Datenobjektkonstellationen führen. Entscheidend ist nur, dass der Variablen ein Datenobjekt zugeordnet wird, das den gewünschten Datenwert hat. [variable] = [term] Struktur Auswertung >>> a = "Test" >>> b = "Test" >>> id(a) 27764768 >>> id(b) 27757280 Beachte: Auch wenn zwei Variablen denselben Wert haben, müssen sie nicht auf dasselbe Datenobjekt verweisen. >>> a = 2 >>> id(a) 505300136 >>> b = a >>> id(b) 505300136
Exkurs: Mehrfachzuweisungen in Python Python erlaubt Zuweisungen der Gestalt [variablentupel] = [termtupel]. >>> (jung, erwachsen, alt) = (6, 9, 12) >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> (jung, erwachsen, alt) = (erwachsen*4+alt*2, jung//2, erwachsen//3) >>> (jung, erwachsen, alt) (60, 3, 3) Variablentupel Termtupel
Ein erstes Programm Wenn man sich bei einem Dialog im Ausführfenster vertippt, muss man neu anfangen. >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> hilf = erwachen*4 + alt*2 ... hilf = erwachen*4 + alt*2 NameError: name 'erwachen' is not defined Tippfehler Ausführfenster Programmfenster >>> >>> jung 60 >>> erwachsen 3 >>> alt 3 jung = 6 erwachsen = 9 alt = 12 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf Aufgabe: Öffne ein Programmfenster und gib die Anweisungen zur Berechnung der Entwicklung der Mäusepopulation hier ein. Speichere die Anweisungen in einer Datei ab. Mit einen Run-Befehl kann man jetzt die Anweisungen von Python ausführen lassen. Anschließend kann man sich im Ausführfenster die aktuell von den Variablen verwalteten Werte anzeigen lassen.
Benutzerfreundliche Programme Die bisher betrachteten Programme waren nicht benutzerfreundlich angelegt. Die Ausgangspopulation konnte nicht vom Benutzer vorgegeben werden, sondern war stets im Programm fest vorgegeben. Die erreichte Endpopulation musste vom Benutzer im Ausführfenster Schritt für Schritt abgefragt werden. Ziel ist es, Programme etwas benutzerfreundlicher anzulegen. Benutzereingaben Ausgaben
Ausgabe von Daten Aufgabe: Ändere das bisher entwickelte Programm zur Mäusepopulation so ab, dass folgende Ausgabe im Ausführfenster erscheint: Ausführfenster >>> Die berechneten Populationswerte sind: Anzahl junger Maeuse: 60 Anzahl erwachsener Maeuse: 3 Anzahl alter Maeuse: 3 Bearbeite hierzu die Aufgaben auf inf-schule 1.6.1.1.7.
Eingabe von Daten Aufgabe: Ergänze das bisher entwickelte Programm zur Mäusepopulation so, dass der Benutzer selbst die Ausgangspopulation eingeben kann. Im Ausführfenster soll z.B. folgender Ein-/Ausgabe-Dialog erscheinen. Ausführfenster >>> Gib die Werte der Ausgangspopulation ein: Anzahl junger Maeuse: 20 Anzahl erwachsener Maeuse: 18 Anzahl alter Maeuse: 4 Die berechneten Populationswerte sind: Anzahl junger Maeuse: 80 Anzahl erwachsener Maeuse: 10 Anzahl alter Maeuse: 6 Bearbeite hierzu die Aufgaben auf inf-schule 1.6.1.1.8.
Fachkonzept - Programm Ein (Python-) Programm ist eine Folge von (Python-) Anweisungen und Kommentaren. Der Programmtext wird auch Quelltext genannt. # -*- coding: utf8 -*- # Eingabe print('Gib die Werte der Ausgangspopulation ein:') jung = int(input('Anzahl junger Maeuse: ')) erwachsen = int(input('Anzahl erwachsener Maeuse: ')) alt = int(input('Anzahl alter Maeuse: ')) # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe: print('') print('Die berechneten Populationswerte sind:') print('Anzahl junger Maeuse: ', jung) print('Anzahl erwachsener Maeuse: ', erwachsen) print('Anzahl alter Maeuse: ', alt) • Jede Anweisung wird im Quell-text 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 bearbei-ten. Bei der Ausführung von Programmen werden sie ignoriert. Quelltext
Fachkonzept - 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 = int(input("Anzahl junger Maeuse: ")) ... # Verarbeitung schritt = 0 ... # Ausgabe ...print('Anzahl junger Maeuse: ', jung) ... Eingabe Verarbeitung Ausgabe Eingaben in Python: Der input-Operator gibt zunächst den Aufforderungstext aus, wartet dann, bis der Benutzer seine Eingabe mit der Return-Taste abgeschlossen hat und liefert diese Eingabe als Zeichenkette vom Typ str zurück. Ausgaben in Pythen: Die print-Anweisung gibt alle übergebenen Werte der Reihe nach (in einer Zeile) auf dem Bildschirm aus.
Fehler in Programmen Jeder macht Fehler! Aufgabe: Teste, wie sich das Programm verhält. Findest du die Fehler? Worin unterscheiden sie sich? # Eingabe print('Gib die Werte der Ausgangspopulation ein:') jung = input('Anzahl junger Maeuse: ') erwachsen = input('Anzahl erwachsener Maeuse: ') alt = input('Anzahl alter Maeuse: ' # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachen = jung // 2 jung = hilf # Ausgabe: print('') print('Die berechneten Populationswerte sind:') print('Anzahl junger Maeuse: ', jung) print('Anzahl erwachsener Maeuse: ', erwachsen) print('Anzahl alter Maeuse: ', alt) Programm mit Fehlern
Fehler in Programmen Bei einem Syntaxfehler hat man eine Regel der gewählten Programmiersprache nicht beachtet. Programmfenster Aufgabe: Welcher Syntaxfehler wird hier angezeigt?
Fehler in Programmen Laufzeitfehler treten während der Abarbeitung des Programms (zur Laufzeit) auf. # Eingabe print('Gib die Werte der Ausgangspopulation ein:') jung = input('Anzahl junger Maeuse: ') erwachsen = input('Anzahl erwachsener Maeuse: ') alt = input('Anzahl alter Maeuse: ') # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachen = jung // 2 jung = hilf # Ausgabe: print('') print('Die berechneten Populationswerte sind:') print('Anzahl junger Maeuse: ', jung) print('Anzahl erwachsener Maeuse: ', erwachsen) print('Anzahl alter Maeuse: ', alt) Aufgabe: Warum kommt es hier zu einem Laufzeitfehler? Ausführfenster >>> Gib die Werte der Ausgangspopulation ein: Anzahl junger Maeuse: 6 Anzahl erwachsener Maeuse: 9 Anzahl alter Maeuse: 12 Traceback (most recent call last): File ... alt = erwachsen // 3 TypeError: unsupported operand type(s) for //: 'str' and 'int' Programmfenster
Fehler in Programmen Logische Fehler liegen vor, wenn das System nicht die beabsichtigten Ausgaben erzeugt. # Eingabe print('Gib die Werte der Ausgangspopulation ein:') jung = int(input('Anzahl junger Maeuse: ')) erwachsen = int(input('Anzahl erwachsener Maeuse: ')) alt = int(input('Anzahl alter Maeuse: ')) # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachen = jung // 2 jung = hilf # Ausgabe: print('') print('Die berechneten Populationswerte sind:') print('Anzahl junger Maeuse: ', jung) print('Anzahl erwachsener Maeuse: ', erwachsen) print('Anzahl alter Maeuse: ', alt) Aufgabe: Welcher logische Fehler liegt hier vor? Ausführfenster >>> Gib die Werte der Ausgangspopulation ein: Anzahl junger Maeuse: 6 Anzahl erwachsener Maeuse: 9 Anzahl alter Maeuse: 12 Die berechneten Populationswerte sind: Anzahl junger Maeuse: 60 Anzahl erwachsener Maeuse: 9 Anzahl alter Maeuse: 3 >>> globals() {..., 'erwachsen': 9, 'jung': 60, ..., 'erwachen': 3, ..., 'alt': 3, ..., 'hilf': 60} Programmfenster
Datentypen 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. Aufgaben: (a) Im Testprogramm werden auch die Datentypen der von den Variablen verwalteten Daten ausgegeben. Führe das Programm aus. Erkläre die vom Programm gemachten Ausgaben, wenn du eine Zahl eingibst. (b) Welche Rolle spielen hier der int-Operator und der str-Operator? # Eingabe eingabe = input('Anzahl junger Maeuse: ') print(type(eingabe)) jung = int(eingabe) print(type(jung)) # Verarbeitung erwachsen = jung // 2 print(type(erwachsen)) # Ausgabe: ausgabe = 'Anzahl erwachsener Maeuse: ' + str(erwachsen) print(type(ausgabe)) print(ausgabe) Programm mit Ausgabe von Datentypen
Fachkonzept - Datentyp Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben und mit denen die gleichen Operationen ausgeführt werden können. # Eingabe eingabe = input('Anzahl junger Maeuse: ') print(type(eingabe)) jung = int(eingabe) print(type(jung)) # Verarbeitung erwachsen = jung // 2 print(type(erwachsen)) # Ausgabe: ausgabe = 'Anzahl erwachsener Maeuse: ' + str(erwachsen) print(type(ausgabe)) print(ausgabe) >>> jung = 6 >>> jung 6 >>> type(jung) <class 'int'> >>> erwachsen = jung // 2 >>> erwachsen 3 >>> type(erwachsen) <class 'int'> >>> erwachsen = jung / 2 >>> erwachsen 3.0 >>> type(erwachsen) <class 'float'> >>> Anzahl junger Maeuse: 6 <class 'str'> <class 'int'> <class 'int'> <class 'str'> Anzahl erwachsener Maeuse: 3
Exkurs: Datentypen in Python >>> 2 2 Datentyp: ganze Zahl int >>> 2.0 2.0 Datentyp: Dezimalzahl float Datentyp: Wahrheitswert bool >>> True True >>> "Hallo!" 'Hallo!' Datentyp: Zeichenkette string >>> 'Hallo!' 'Hallo!' >>> ('Hans', 'Meier', 34, 'Koblenz') ('Hans', 'Meier', 34, 'Koblenz') Datentyp: Tupel tuple Datentyp: Liste list >>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] ... ...
Exkurs: Typumwandlungen in Python Häufig benötigt man Operatoren, mit denen man aus einem Datenobjekt ein entsprechendes mit einem anderen Datentyp erzeugen kann. Der folgende Python-Dialog zeigt einige Möglichkeiten auf. >>> int("3") 3 >>> float("3") 3.0 >>> int(3.0) 3 >>> int(3.5) 3 >>> float(3) 3.0 >>> str(3) '3' >>> list("[1, 2, 3]") ['[', '1', ',', ' ', '2', ',', ' ', '3', ']'] >>> eval("[1, 2, 3]") [1, 2, 3]
Wiederholte Berechnungen # Eingabe ... # Verarbeitung schritt = 0 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 ... # Ausgabe: ... Zur Simulation der Entwicklung der Mäusepopulation haben wir bisher ein Programm entwickelt, das die Berechnungen für einen einzigen Simulationsschritt durchführt. Interessanter wird es, wenn die Simulation über mehrere Schritte laufen soll. Aufgabe: Wie müsste man das Programm ergänzen, wenn genau 10 (bzw. 100) Simulationsschritte durchgeführt werden sollen? Warum ist der gezeigte Lösungsansatz nicht sonderlich praktisch? Programm mit einer Folge von Zuweisungen
Wiederholte Berechnungen # Eingabe jung = int(input("Anzahl der jungen Maeuse: ")) erwachsen = int(input("Anzahl der erwachsenen Maeuse: ")) alt = int(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) Aufgaben: (a) Erkläre, warum der Si-mulationsschritt hier genau 10 mal durchgeführt wird. (b) Ändere das gezeigte Programm so ab, dass folgende Aufgaben erledigt werden können: - In jedem Berechnungs-schritt 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. Ausgabe: Schritte Programm mit Wiederholungsanweisung
Fachkonzept - Wiederholung Eine Solange-Wiederholung besteht aus einer Bedingung und einer Anweisungssequenz. Solange die Bedingung erfüllt ist, wird die Anweisungssequenz ausgeführt. Aufbau SOLANGE [Bedingung]: [Anweisungssequenz] Struktogramm Python-Syntax Schlüsselwort Doppelpunkt while [Bedingung]: [Anweisungssequenz] Flussdiagramm Einrückung
Übung zur Vernetzung Der Body-Mass-Index wird mit der folgenden Formel berechnet. (a) Teste das folgende Programm zur automatisierten Berechnung des BMI. Welche Nachteile hat das Programm? a = 100 b = 1.8 c = a / (b*b) print(a, b, c) (b) Erstelle selbst ein benutzer- und entwicklerfreudliches Programm zur automatisierten BMI-Berechnung.
Teil 2 Zufallsexperimente - Ablaufmodellierung mit Kontrollstrukturen
Craps Craps ist ein in den USA beliebtes Glücksspiel, das mit 2 Würfeln gespielt wird. Die beiden Würfel werden geworfen. Wenn die Augensumme 7 oder 11 beträgt, hat man gewonnen. Wenn die Augensumme 2, 3 oder 12 beträgt, hat man verloren. Ansonsten wird weitergewürfelt, bis eine Entscheidung gefallen ist. Bei jedem weiteren Wurf der beiden Würfel hat man verloren, wenn eine 7 fällt, und gewonnen, wenn die neue Augensumme gleich der Augensumme im ersten Wurf ist. Hier stellt sich die Frage, ob das Spiel fair ist, oder ob der Spieler bzw. der Spielanbieter auf lange Sicht im Vorteil ist. Orientierung: Um zu beurteilen, ob das Spiel fair ist, muss man das Spiel sehr oft ausführen (z.B. 1000 mal). Ziel ist es, ein Programm zu entwickeln, mit dem man das Spiel wiederholt ausführen kann.
Erzeugung von Zufallszahlen Programmiersprachen stellen in der Regel einen Baustein zur Erzeugung von (Pseudo-) Zufallszahlen zur Verfügung. In Python heißt dieser Baustein random und kann wie folgt benutzt werden. Erzeugung von Zufallszahlen >>> from random import randint >>> randint(1, 6) 2 >>> randint(1, 6) 5 >>> randint(2, 5) 5 >>> augen = randint(1, 6) >>> augen 6
Simulation eines Münzwurfs Aufgabe: Welche Ausgaben werden nach dem Flussdiagramm erzeugt, wenn der Benutzer als Tipp ein 'K' eingibt und die Zufallszahl 1 erzeugt wird? Welche Abläufe und Ausgaben sind hier denkbar. Begründe mit den Fallunterscheidungen im Flussdiagramm.
Simulation eines Münzwurfs from random import randint # Eingabe tipp = input('Kopf (K) oder Zahl (Z): ') # Verarbeitung mit Ausgabe zufallszahl = randint(0, 1) if zufallszahl == 0: print('Kopf ist gefallen.') seite = 'K' else: print('Zahl ist gefallen.') seite = 'Z' # Ausgabe # ... Aufgabe: (a) Teste zunächst das gezeigte Programm. Welcher Teil des Struktogramms wird hier implementiert? (b) Ergänze den noch fehlenden Teil. Achte ganz genau auf Doppelpunkte und die Einrückungen (um 4 Einheiten).
Simulation eines Münzwurfs Aufgabe: Das folgende Programm enthält weitere Fallunterscheidungen. Kannst du das Flussdiagramm so erweitern, dass es zum erweiterten Programm passt. Beschreibe anhand von Fallbeispielen, wie sich das erweiterte Programm verhält. from random import randint # Eingabe tipp = input('Kopf (K) oder Zahl (Z): ') if tipp == 'k': tipp = 'K' if tipp == 'z': tipp = 'Z' # Verarbeitung mit Ausgabe zahl = randint(0, 1) if zahl == 0: print('Kopf ist gefallen.') seite = 'K' else: print('Zahl ist gefallen.') seite = 'Z' # Ausgabe # ...