Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmierung mit Funktionen Klaus Becker 2015. 2 Programmierung mit Funktionen.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmierung mit Funktionen Klaus Becker 2015. 2 Programmierung mit Funktionen."—  Präsentation transkript:

1 Programmierung mit Funktionen Klaus Becker 2015

2 2 Programmierung mit Funktionen

3 3 Teil 0 Vorbemerkungen zu Python

4 4 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.Guido van Rossum 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

5 5 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

6 6 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:

7 7 Interne Abläufe Compiler Interpreter 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. 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.

8 8 Gängige Python-Versionen

9 9 Entwicklungsumgebung Idle

10 10 Entwicklungsumgebung PyScripter

11 11 Literatur  Johannes Ernesti, Peter Kaiser: Python 3. Das umfassende Handbuch. Galileo Computing (Preis: 40 €)  Michael Weigend: Objektorientierte Programmierung mit Python. mitp (Preis: 40 €)  Michael Weigend: Python Ge-Packt. mitp (Preis: 16 €)  Thomas Theis: Einstieg in Python 3. Galileo Computing (Preis: 25 €)  Gregor Lingl: Python für Kids. bhv (Preis: 20 €)  P. Barry, D. Griffiths: Programmieren von Kopf bis Fuß. O´Reilly 2010 (Preis: 20 €) ...

12 12 Materialien Internet:  Python Official Website  Python-Tutorium von Guido van Rossum:  offenes eBook von von Peter Kaiser und Johannes Ernesti (Python 2.5):  PythonWiki:  Python-Kurs von W.Spiegel:  Python, Programmieren macht Spaß :  BICS:  Unterrichtsmaterialien von Klaus Merkert:  Unterrichtsmaterialien auf

13 13 Teil 1 Miniprojekt „Baumhaus“ Datenverarbeitung mit Funktionen

14 14 Baumhaus Zielsetzung: Wenn man ein Baumhaus bauen möchte, sollte man vorher genau planen und vieles bedenken. Wir konzentrieren uns hier auf die Materialbeschaffung. Ziel ist es, eine Verarbeitungseinheit zu entwickeln, mit der man den Materialbedarf an Holz für unterschiedlich große Baumhäuser automatisiert bestimmen kann.

15 15 Ein einfaches Baumhausmodell Ziel ist es, den Bedarf an Brettern abzuschätzen, den man für die Außenwände und für das Dach des Hauses benötigt. Da das Haus auf einen Unterbau aufgesetzt werden soll, bleibt die Unterseite "offen" und wird bei der Materialberechnung nicht berücksichtigt. Zur Vereinfachung der Berechnungen werden Fenster- und Türöffnungen ebenfalls nicht berücksichtigt.

16 16 Konkrete Berechnungen Wir betrachten ein Haus mit den in der Abbildung vorgegebenen Maßen. Die erforderlichen Berechnungen führen wir mit Python aus. Python kann man im Ausführfenster wie einen Taschenrechner benutzen. Man gibt einen Berechnungsausdruck ein und lässt sich von Python das Ergebnis ausrechnen. >>> 2.4 * >>> from math import sqrt >>> sqrt(0.9* *0.4) Aufgabe: Bestimme die Gesamtoberfläche des Hauses (ohne den Boden). Zur Kontrolle: Die Gesamtoberfläche beträgt etwa 18m 2. Entwickle eine Formel, mit der man die gesamte Oberfläche eines Hauses aus den gegebenen Größen berechnen kann. Python-Dialog flaecheHaus(laenge, breite, hoeheHaus, hoeheDach) = 2*laenge*hoeheHaus +...

17 17 Funktion als Verarbeitungseinheit Wenn man für viele unterschiedlich dimensionierte Baumhäuser den Materialbedarf berechnen möchte, ist es günstig, eine eigene Verarbeitungseinheit für diesen Zweck zu entwickeln. Das Verhalten der Verarbeitungseinheit lässt sich mit einem Black-Box-Diagramm verdeutlichen. Black-Box-Diagramm

18 18 Funktionsdefinition In Python lässt sich die konzipierte Verarbeitungseinheit als Funktion implementieren. Man öffnet ein neues Fenster und gibt den folgenden Quelltext dort ein. Achte auf die gezeigte Einrückung. from math import sqrt def flaecheHaus(laenge, breite, hoeheHaus, hoeheDach): return 2*laenge*hoeheHaus + 2*breite*hoeheHaus + … from math import sqrt def flaecheHaus(laenge, breite, hoeheHaus, hoeheDach): return 2*laenge*hoeheHaus + \ 2*breite*hoeheHaus + \ 2*(breite*hoeheDach/2) + \ 2*laenge*sqrt((breite/2)*(breite/2)+hoeheDach*hoeheDach) Funktionsdefinition Alles in eine Zeile Mit Zeilenumbrüchen

19 19 Funktionsaufrufe Das Programm (bzw. den Quelltext) muss man abspeichern und dann einmal ausführen, damit Python die neu definierte Funktion kennen lernt. Anschließend kann man die Funktion für Berechnungen im Ausführfenster verwenden. >>> flaecheHaus(2.4, 1.8, 1.5, 0.4) >>> flaecheHaus(2.8, 2.8, 2.0, 0.2) from math import sqrt def flaecheHaus(laenge, breite, hoeheHaus, hoeheDach): return 2*laenge*hoeheHaus + \ 2*breite*hoeheHaus + \ 2*(breite*hoeheDach/2) + \ 2*laenge*sqrt((breite/2)*(breite/2)+hoeheDach*hoeheDach) Programmfenster Funktionsaufrufe Ausführfenster Funktionsdefinition Aufgabe: Probiere das selbst aus. Bestimme analog die Oberfläche eines Hauses mit den folgenden Ausmaßen: Länge: 1.8m; Breite: 1.5m; Haushöhe: 1.2m; Dachhöhe: 0.3m.

20 20 Hilfsfunktionen Es ist oft schwierig, komplexe Berechnungsausdrücke zu entwickeln. Schwierig ist es zudem, komplexe Berechnungsausdrücke nachträglich zu durchschauen. In der Informatik nutzt man in solchen Situationen Strategien zur Reduzierung der Komplexität. Im vorliegenden Fall hilft es, Hilfsfunktionen einzuführen. def flaecheRechteck(a, b): return a*b Hilfsfunktionen

21 21 Verwendung von Hilfsfunktionen Bereits definierte Funktionen kann man benutzen, um neue Funktionen zu definieren def flaecheGiebel(breite, hoeheHaus, hoeheDach): return flaecheRechteck(breite, hoeheHaus) + \ flaecheDreieck(breite, hoeheDach) Schachtelung von Funktionen

22 22 Verwendung von Hilfsfunktionen Aufgabe (a) Entwickle analog Black-Box-Modellierungen und Funktionsdefinitionen für die Funktionen flaecheDach (für die gesamte Dachfläche) und flaecheSeitenwaende (für die Vorder- und Rückseite des Hauses). (b) Entwickle anschließend eine Black-Box-Modellierung und eine Funktionsdefinition für die Funktion flaecheHaus (für die gesamte Oberfläche des Hauses). Benutze hier die neu entwickelten Hilfsfunktionen. Bestimme mit dieser Funktion den Materialbedarf für die im letzten Abschnitt angegebenen Maße.

23 23 Weitere Berechnungsprobleme Siehe inf-schule Materialbedarf für das Balkengerüst Variation des Hausmodells

24 24 Weitere Berechnungsprobleme Siehe inf-schule Variation des Hausmodells

25 25 Teil 2 Fachkonzept – Funktion

26 26 Fachkonzept - Funktion Als Beispiel betrachten wir eine Funktion, die aus den Daten eines Quaders (d.h. Länge, Breite und Höhe) die Mantelfläche bestimmt. Eine Funktion ist eine Verarbeitungseinheit, die übergebene Daten verarbeitet und den berechneten Funktionswert als Ergebnis zurückgibt.

27 27 Fachkonzept - Funktion Eine Funktion hat einen Funktionsnamen. Im Beispiel hat die Funktion den Namen mantelQuaderflaeche. Den Funktionsnamen sollte man so wählen, dass das berechnete Ergebnis damit möglichst gut beschrieben wird. Zu verarbeitende Daten werden an Funktionsvariablen (man sagt auch Parameter) übergeben. Im Beispiel werden die drei Parameter laenge, breite und hoehe benutzt. Eine Funktion gibt das Verarbeitungsergebnis als Funktionswert zurück.

28 28 Fachkonzept - Funktion Die Verarbeitung wird über eine Funktionsdefinition (man sagt oft auch Funktionsdeklaration) festgelegt. Aktiviert wird eine Verarbeitung durch einen Funktionsaufruf. def mantelflaecheQuader(laenge, breite, hoehe): return (2*laenge + 2*breite) * hoehe Funktionsaufruf Funktionsdefinition >>> mantelflaecheQuader(3.0, 2.5, 0.8) 8.8 >>> mantelflaecheQuader(7.5, 4.2, 0.2) 4.68 FunktionsnameFunktionsvariablen /Parameter Aktuelle Daten

29 29 Funktionsdefinition in Python def mantelflaecheQuader(laenge, breite, hoehe): return (2*laenge + 2*breite) * hoehe Doppelpunkt Einrückung SchlüsselwortFunktionsname(Parameter) Verarbeitungsvorschrift Funktionskopf Schlüsselwort Funktionsrumpf

30 30 Funktionsaufruf in Python >>> mantelflaecheQuader(3.0, 2.5, 0.8) 8.8 >>> mantelflaecheQuader(7.5, 4.2, 0.2) 4.68 Berechneter Funktionswert Funktionsname(aktuelle Parameter) Funktionsaufruf

31 31 Fachkonzept – teile und herrsche Als Beispiel betrachten wir die Berechnung der Oberfläche (ohne den Pyramidenboden) bei quadratischen Pyramiden. Problemzerlegung Berechnung der Oberfläche einer Pyramide Berechnung der Fläche eines Dreiecks Berechnung der Länge der Hypotenuse in einem rechtwinkligen Dreieck

32 32 Fachkonzept – teile und herrsche Problemzerlegung Berechnung der Oberfläche einer Pyramide Berechnung der Fläche eines Dreiecks Berechnung der Länge der Hypotenuse in einem rechtwinkligen Dreieck from math import sqrt def flaecheDreieck(g, h): return (g*h)/2 def laengeHypotenuse(a, b): return sqrt(a*a+b*b) def flaechePyramide(seite, hoehe): return 4*flaecheDreieck(seite, laengeHypotenuse(seite/2, hoehe)) Problemlösung mit Hilfsfunktionen

33 33 Fachkonzept – teile und herrsche Teile und herrsche ist eine Problemlösestrategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis diese such einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt. Problemzerlegung Berechnung der Oberfläche einer Pyramide Berechnung der Fläche eines Dreiecks Berechnung der Länge der Hypotenuse in einem rechtwinkligen Dreieck Zusammensetzen von Funktionen def laengeHypotenuse(a, b) def flaecheDreieck(g, h) def flaechePyramide(seite, hoehe)

34 34 Übungen Siehe inf-schule und

35 35 Teil 3 Miniprojekt „Räuber-Beute-Systeme“ Datenverwaltung mit Variablen

36 36 Räuber-Beute-Systeme Zielsetzung: Wir betrachten im Folgenden, wie sich eine Population aus Kaninchen und Füchse im Laufe der Zeit entwickelt. Es handelt sich hierbei um ein einfaches Räuber-Beute-System. Wir werden mit vereinfachenden Annahmen eine Modell für ein solches System entwickeln und hierauf basierend automatisierte Berechnungen zur Entwicklung eines sochen Systems erstellen.

37 37 Ein erstes Modell Wir betrachten zunächst den Fall, dass sich eine Population von Kaninchen und eine Population von Füchsen getrennt entwickeln. Wir gehen davon aus, dass die Kaninchen genügend Futter haben und sich daher - ohne bedrohende Feinde - ungehindert vermehren können. Bei der von der Kaninchenpopulation getrennt lebenden Fuchspopulation gehen wir davon aus, dass die Füchse nicht genügend Futter haben und dass sich die gesamte Population ständig verringert. Aufgabe: Wir gehen von einer Anfangspopulation von 1000 Kaninchen aus. In jedem Simulationsschritt soll die Population um 8% wachsen. Die Fuchspopulation soll zu Beginn aus 40 Füchsen bestehen. In jedem Simulationsschritt soll sich die Population um 20% des jeweiligen Bestands verringern. Ergänze die fehlenden Werte in der Tabelle. Akzeptiere Dezimalzahlen, auch wenn es in der Wirklichkeit keine Bruchteile von Kaninchen und Füchsen gibt.

38 38 Ein erstes Modell neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen 1080 = * 1000 Aufgabe: Zur Verallgemeinerung der Berechnungen führen wir Variablen (als stellvertretende Namen für die zu verarbeitenden Daten) ein. Gib eine entsprechende Formel für die Entwicklung der Fuchspopulation an. Variable

39 39 Ein verbessertes Modell neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen - abnahmerateKaninchenFuchs*anzahlKaninchen*anzahlFuechse neueAnzahlFuechse = anzahlFuechse – abnahmerateFuechse*anzahlFuechse + zunahmerateFuchsKaninchen*anzahlFuechse*anzahlKaninchen Die Kaninchen und Füchse sollen jetzt gemeinsam in einem abgeschlossenen Areal leben. Für die Kaninchen bedeutet das, dass sie ab und zu auf Füchse treffen und dann (leider) gefressen werden. Wir berüchsichtigen dies, indem wir eine zusätzliche Abnahmerate vorsehen. Wir nehmen an, dass die Wahrscheinlichkeit, dass sich ein Kaninchen und ein Fuchs treffen, vom Produkt aus der Anzahl der Kaninchen und der Anzahl der Füchse abhängt. Die zusätzliche Abnahmerate beschreibt, in wieviel Prozent aller möglichen Treffen ein Kaninchen gefressen wird. Es ergibt sich folgende neue Berechnungsformel:

40 40 Ein verbessertes Modell neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen - abnahmerateKaninchenFuchs*anzahlKaninchen*anzahlFuechse neueAnzahlFuechse = anzahlFuechse – abnahmerateFuechse*anzahlFuechse + zunahmerateFuchsKaninchen*anzahlFuechse*anzahlKaninchen Aufgabe: Bestimme mit den angegebenen Berechnungsformeln die fehlenden Werte in der Tabelle. Benutze folgende Daten: anzahlKaninchen = 1000 anzahlFuechse = 40 zuwachsrateKaninchen = 0.08 abnahmerateFuechse = 0.2 abnahmerateKaninchenFuchs = zunahmerateFuchsKaninchen =

41 41 Automatisierte Berechnungen Aufgabe: Siehe inf-schule Aufgabe 1. neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen 1080 = * 1000

42 42 Automatisierte Berechnungen Aufgabe: Siehe inf-schule Aufgabe 2. Entwickle eine Funktion popKaFu5Schritte, mit der man die Entwicklung eines Kaninchen- Fuchs-Systems simulieren kann. Teste die Funktion mit geeigneten Funktionsaufrufen. neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen 1080 = * 1000 def popKa5Schritte(anzKa, zKa): anzKa0 = anzKa anzKa1 = anzKa0 + zKa*anzKa0 anzKa2 = anzKa1 + zKa*anzKa1 anzKa3 = anzKa2 + zKa*anzKa2 anzKa4 = anzKa3 + zKa*anzKa3 anzKa5 = anzKa4 + zKa*anzKa4 return anzKa5 >>> popKa5Schritte(1000, 0.08) >>> popKa5Schritte(500, 0.2) Einführung neuer Variablen

43 43 Automatisierte Berechnungen Aufgabe: Siehe inf-schule Aufgabe 1. neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen 1080 = * 1000

44 44 Automatisierte Berechnungen Aufgabe: Entwickle analog eine Funktion popKaFu5Schritte, mit der man die Entwicklung eines Kaninchen-Fuchs-Systems simulieren kann. Teste die Funktion mit geeigneten Funktionsaufrufen. neueAnzahlKaninchen = anzahlKaninchen + zuwachsrateKaninchen*anzahlKaninchen 1080 = * 1000 def popKa5Schritte(anzKa, zKa): neueAnzKa = anzKa neueAnzKa = neueAnzKa + zKa*neueAnzKa return neueAnzKa >>> popKa5Schritte(1000, 0.08) >>> popKa5Schritte(500, 0.2) Überschreiben von Variablenwerten

45 45 Wiederholung von Berechnungen def popKa5Schritte(anzKa, zKa): neueAnzKa = anzKa neueAnzKa = neueAnzKa + zKa*neueAnzKa return neueAnzKa def popKa5Schritte(anzKa, zKa): schritte = 5 zaehler = 0 neueAnzKa = anzKa while zaehler < schritte: neueAnzKa = neueAnzKa + zKa*neueAnzKa zaehler = zaehler + 1 return neueAnzKa Die wiederholte Berechnung von Populationswerte erfolgte bisher, indem die zentrale Berechnungsformel (als Anweisung dargestellt) wiederholt im Quelltext aufgeführt wurde. Viele identische Anweisungen Wiederholungsanweisung

46 46 Wiederholung von Berechnungen Aufgaben: siehe inf-schule

47 47 Teil 4 Fachkonzept – Variable

48 48 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. 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. listenpreis = 80.0 pMwSt = 19.0 mehrwertsteuer = (listenpreis / 100) * pMwSt endpreis = listenpreis + mehrwertsteuer Variablenzustand

49 49 Fachkonzept - Zuweisung Eine Zuweisung ist eine Anweisung, die eine Variable mit einem neu berechneten Datenobjekt verknüpft. {} listenpreis = 80.0 {listenpreis -> 80.0} pMwSt = 19.0 {listenpreis -> 80.0; pMwSt -> 19.0} preis = listenpreis {listenpreis -> 80.0; pMwSt -> 19.0; preis -> 80.0} preis = preis + (preis/100)*pMwSt {listenpreis -> 80.0; pMwSt -> 19.0; preis -> 95.2} bindende Zuweisung überschreibende Zuweisung Aufbau einer Zuweisung: Eine Zuweisung besteht aus einer Variablen (der ein Wert zugewiesen wird) and einem Term (der den zuzuweisenden Wert festlegt).

50 50 Fachkonzept - Zuweisung 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. preis -> preis = preis + (preis/100)*pMwSt Zustand - vorher {listenpreis -> 80.0; pMwSt -> 19.0; preis -> 80} 95.2 {listenpreis -> 80.0; pMwSt -> 19.0; preis -> 95.2} Zustand - nachher Auswertung Eine Zuweisung ist eine Anweisung, die eine Variable mit einem neu berechneten Datenobjekt verknüpft.

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

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

53 53 Funktionsvariablen Funktionsvariablen werden benutzt, um die Daten zu verwalten, die zur Verarbeitung an eine Funktion übergeben werden. Solche Funktionsvariablen werden auch Parameter genannt. def zahlungsbetrag(listenpreis, pMwSt): mehrwertsteuer = (listenpreis / 100) * pMwSt endpreis = listenpreis + mehrwertsteuer return endpreis Funktionsvariable (lokale) Hilfsvariable Hilfsvariablen werden benutzt, um bei den Berechnungen anfallende Daten zwischenzuspeichern. Solche Variablen nennt man manchmal auch Speichervariablen.

54 54 Übungen Siehe inf-schule

55 55 Teil 5 Miniprojekt „Verschlüsselung“ Verarbeitung von Zeichenketten

56 56 Veschlüsselung Zielsetzung: Ziel ist es, Textnachrichten automatisiert zu ver- und wieder entschlüsseln. Wir betrachten dabei einfache Verschlüsselungsverfahren wie das Verschiebeverfahren, das bereits von Caesar benutzt wurde. Verschiebeverfahren A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: SALVEASTERIX Geheimtext: VDOYHDVWHULA

57 57 Veschlüsselung Aufgabe: Entschlüssele die in der Abbildung gezeigte Antwort von Asterix. Verschlüssele analog eine selbst gewählte Nachricht. Benutze jetz den Schlüssel 'H' (die Verschiebung erfolgt hier so, dass 'A' durch 'H' ersetzt wird). A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: SALVEASTERIX Geheimtext: VDOYHDVWHULA

58 58 Veschlüsselungsalgorithmus ALGORITHMUS verschluesselterText: Übergabe: klartext, schluessel neuerText = '' für alle Zeichen c in klartext: ermittle mit dem schluessel das zu c verschobene Zeichen d füge d am Ende an die von neuerText verwaltete Zeichenkette an Rückgabe: neuerText A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: SALVEASTERIX Geheimtext: VDOYHDVWHULA

59 59 Zeichen und ihre A B C D E F G H I J a 74 K b 75 L c 76 M d 77 N e 78 O f 79 P Q R S T U V W X Y Z a 90 [ b 91 \ c 92 ] d 93 ^ e f 95 Quelle: Zeichen werden intern im Rechner durch Bitfolgen codiert. Da man die Bitmuster auch als Zahlen deuten kann, lässt sich jedem Zeichen (aus einem vorgegebenen Zeichenvorrat) eine natürliche Zahl (aus einem passenden Zahlenbereich) zuordnen und umgekehrt. Dem Zeichen 'A' lässt sich beispielsweise nach dem ASCII-Code die Zahl 65 zuordnen.

60 60 Zeichen und ihre Codierung Mit den (in Python) vordefinierten Funktionen ord und chr kann man Zeichen in Zahlen umwandeln und umgekehrt. >>> ord('A') 65 >>> chr(65) A B C D E F G H I J a 74 K b 75 L c 76 M d 77 N e 78 O f 79 P Q R S T U V W X Y Z a 90 [ b 91 \ c 92 ] d 93 ^ e f 95

61 61 Bestimmung der Verschiebezahl Günstig ist es, wenn man zu einem Schlüsselbuchstaben die zugehörige Verschiebezahl ermitteln kann. Wir konzipieren hierfür eine geeignete Funktion. >>> ord('H') 72 Aufgabe: Entwickle eine Funktionsdefinition für diese Funktion. Tipp: Benutze die vordefinierte Funktion ord.

62 62 Verschiebung von Buchstaben Ziel ist es, eine Funktion zum Verschlüsseln einzelner Zeichen (vorerst nur Großbuchstaben) mit einem vorgegebenen Schlüssel zu entwickeln. >>> zeichen = 'P' >>> schluessel = 'H' >>> verschiebung = verschiebezahl(schluessel) >>> verschiebung 7 >>> zahl = ord(zeichen) >>> zahl 80 >>> neueZahl = zahl + verschiebung >>> neueZahl 87 >>> neuesZeichen = chr(neueZahl) >>> neuesZeichen 'W' Aufgabe: Führe selbst einen solchen Dialog mit folgenden Ausgangsdaten: zeichen = 'M', schluessel = 'F'. Führe ebenfalls einen Dialog mit den Ausgangsdaten zeichen = 'U' und schluessel = 'M'. Welches Problem tritt hier auf? Wie könnte man es lösen?

63 63 Verschiebung von Buchstaben Ziel ist es, eine Funktion zum Verschlüsseln einzelner Zeichen (vorerst nur Großbuchstaben) mit einem vorgegebenen Schlüssel zu entwickeln. def verschluesseltesZeichen(zeichen, schluessel): verschiebung = verschiebezahl(schluessel) zahl = ord(zeichen) neueZahl = zahl + verschiebung if neueZahl > ord('Z'): neueZahl = neueZahl - 26 neuesZeichen = chr(neueZahl) return neuesZeichen Aufgabe: Teste diese Funktion. Beachte, dass du zusätzlich eine Implementierung der Funktion verschiebezahl benötigst. Am einfachsten speicherst du beide Funktionsdefinitionen in einer Datei ab.

64 64 Verschiebung von Buchstaben Aufgabe: Entwickle analog eine Funktion entschluesseltesZeichen. Erstelle erst ein Black-Box-Diagramm. Entwickle dann eine Funktionsdefinition.

65 65 Exkurs - Zeichenketten Eine Zeichenkette ist eine (evtl. leere) Folge von Zeichen (aus einer vorgegebenen Zeichenmenge), die zu einer Dateneinheit zusammengefasst ist. Der Datentyp Zeichenkette beschreibt die Menge der möglichen Zeichenkette zusammen mit den Operationen, die mit Zeichenketten vorgesehen sind. >>> z1 = 'Hallo' >>> z1 'Hallo' >>> z2 = "Hallo" >>> z2 'Hallo' >>> z = '' >>> z >>> text = """Dieser Text geht... über mehrere... Zeilen.""" >>> text 'Dieser\nText geht\nüber mehrere\nZeilen.' >>> print(text) Dieser Text geht über mehrere Zeilen. Darstellung von Zeichenketten

66 66 Exkurs - Zeichenketten Eine Zeichenkette ist ein sequentielles Datenobjekt, das aus einer Folge einzelner Zeichen besteht. Die Elemente eines solchen sequentiellen Datenobjekts sind der Reihe nach durchnummeriert. Die Nummerierung beginnt dabei mit 0. Die Nummer eines sequentiellen Datenobjekts wird auch Index genannt. lesender Zugriff auf einzelne Zeichen >>> klartext = 'HALLO' >>> klartext[0] 'H' >>> klartext[1] 'A' >>> klartext[4] 'O' >>> klartext[5] Traceback (most recent call last):... klartext[5] IndexError: string index out of range >>> len(klartext) 5 >>> klartext[len(klartext)-1] 'O' Länge einer Zeichenkette beachte den Indexbereich

67 67 Exkurs - Zeichenketten Zeichenketten kann man über den Indexbereich, oder direkt über die einzelnen Zeichen durchlaufen. # klartext =... i = 0 while i < len(klartext): # verarbeite klartext[i] i = i + 1 Schleife über den Indexbereich # klartext =... for zeichen in klartext: # verarbeite zeichen for-Schleife für sequentielle Datenobjekte

68 68 Exkurs - Zeichenketten Eine Zeichenkette ist in Python ein nicht-veränderbares Datenobjekt. In Python ist nur ein lesender Zugriff auf einzelne Zeichen einer Zeichenkette möglich ist. Abändern kann man einzelne Zeichen einer Zeichenkette mit Hilfe von Zuweisungen nicht. Eine veränderte Zeichenkette erhält man nur, indem man eine neue Zeichenkette - z.B. mit dem Konkatenationsoperator - aufbaut. >>> klartext = 'HALLO' >>> klartext[1] 'A' >>> klartext[1] = 'E' TypeError: 'str' object does not support item assignment kein schreibender Zugriff erlaubt >>> klartext = 'HALLO' >>> klartextNeu = '' >>> klartextNeu = klartextNeu + klartext[0] >>> klartextNeu = klartextNeu + 'E' >>> klartextNeu 'HE' Zusammenfügen von Zeichenketten

69 69 Verschiebung von Zeichenketten Ziel ist es, eine Funktion zum Verschlüsseln von Texten nach dem Verschiebeverfahren zu implementieren. ALGORITHMUS verschluesselterText: Übergabe: klartext, schluessel neuerText = '' für alle Zeichen c in klartext: ermittle mit dem schluessel das zu c verschobene Zeichen d füge d am Ende an die von neuerText verwaltete Zeichenkette an Rückgabe: neuerText Aufgabe: Benutze die Informationen zu zeichenketten und die bereits implementierte Funktion verschluesseltesZeichen, um die Funktion verschluesselterText zu definieren.

70 70 Verschiebung von Zeichenketten Aufgabe: Entwickle analog eine Funktion zum Entschlüsseln von Texten, die mit dem Verschiebeverfahren verschlüsselt wurden. Aufgabe: Wir sind bisher davon ausgegangen, dass ein vorgegebener Text nur aus Großbuchstaben besteht. Einen beliebigen Text müsste man erst einmal in einen Text aus Großbuchstaben umwandeln, um das Verschlüsselungsverfahren anwenden zu können. Wir gehen dabei nach folgendem Verfahren vor: Alle Kleinbuchstaben werden in entsprechende Großbuchstaben umgewandelt. Alle Umlaute und das ß werden durch Kleinbuchstaben ersetzt. (z.B.: ä -> ae; ß -> ss). Alle Leerzeichen und alle Sonderzeichen werden weggelassen. Entwickle eine Funktion, die das leistet. Beschreibe zunächst das Verhalten mit einem Black- Box-Diagramm. Entwickle und teste dann eine Funktionsdefinition.

71 71 Das Vigenère-Verfahren A B C D E F G H I J K L M N O P Q R S T U V W X Y Z K L M N O P Q R S T U V W X Y Z A B C D E F G H I J Schlüssel: KUH Quelltext: VIG ENE RE Geheimtext: FCN OHL BY K A B C D E F G H I J K L M N O P Q R S T U V W X Y Z U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U A B C D E F G H I J K L M N O P Q R S T U V W X Y Z H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H

72 72 Das Vigenère-Verfahren V I G E N E R E Schlüssel, Klartext K U H K U H K U F C N O H L B Y Geheimtext ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z B C D E F G H I J K L M N O P Q R S T U V W X Y Z A C D E F G H I J K L M N O P Q R S T U V W X Y Z A B D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F G H I J K L M N O P Q R S T U V W X Y Z A B C D E G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I J K L M N O P Q R S T U V W X Y Z A B C D E F G H J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L M N O P Q R S T U V W X Y Z A B C D E F G H I J K M N O P Q R S T U V W X Y Z A B C D E F G H I J K L N O P Q R S T U V W X Y Z A B C D E F G H I J K L M O P Q R S T U V W X Y Z A B C D E F G H I J K L M N P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R S T U V W X Y Z A B C D E F G H I J K L M N O P Q S T U V W X Y Z A B C D E F G H I J K L M N O P Q R T U V W X Y Z A B C D E F G H I J K L M N O P Q R S U V W X Y Z A B C D E F G H I J K L M N O P Q R S T V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X Y Z A B C D E F G H I J K L M N O P Q R S T U V W Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Schlüsselbuchstabe Klartextbuchstabe

73 73 Automatisierung d. Vigenère-Verfahrens Ziel ist es, eine Funktion zur Automatisierung des Vigenère-Verfahrens zu entwickeln. >>> verschluesseltesZeichen('G', 'H') 'N' >>> verschluesseltesZeichen('E', 'U') 'Y' >>> verschluesseltesZeichen('H', 'N') 'U' >>> verschluesseltesZeichen('E', 'D') 'H' >>> verschluesseltesZeichen('I', 'H') 'P'... Es ist günstig, dabei die bereits implementierte Funktion verschluesseltesZeichen zu verwenden.

74 74 Automatisierung d. Vigenère-Verfahrens Ziel ist es, eine Funktion zur Automatisierung des Vigenère-Verfahrens zu entwickeln. >>> schluessel = 'HUND' >>> verschluesseltesZeichen('G', schluessel[0]) 'N' >>> verschluesseltesZeichen('E', schluessel[1]) 'Y' >>> verschluesseltesZeichen('H', schluessel[2]) 'U' >>> verschluesseltesZeichen('E', schluessel[3]) 'H' >>> verschluesseltesZeichen('I', schluessel[0]) 'P' Aufgabe: Entwickle eine Funktionsdefinition für die Funktion verschluesseltesZeichenVigenere. Teste ausführlich.

75 75 Teil 6 Fachkonzept – Datentyp

76 76 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 >>> >>> type(40.3) >>> round(40.3) 40 >>> type(40) >>> str(40.3) + ' °C' '40.3 °C' >>> type('40.3 °C') >>> (40.3, '°C') (40.3, '°C') >>> type((40.3, '°C')) >>> 40.3 > 40 True >>> type(True)

77 77 Datentypen in Python >>> 2 2 Datentyp: ganze Zahlint >>> >>> True True >>> 'Hallo!' 'Hallo!' >>> ('Hans', 'Meier', 34) ('Hans', 'Meier', 34) >>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Datentyp: Dezimalzahlfloat Datentyp: Wahrheitswertbool Datentyp: Zeichenkettestring Datentyp: Tupeltuple Datentyp: Listelist... >>> "Hallo!" 'Hallo!'

78 78 Typumwandlungen in Python >>> int('3') 3 >>> float('3.0') 3.0 >>> int(3.0) 3 >>> int(3.5) 3 >>> float(3) 3.0 >>> str(3) '3' 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. >>> list('[1, 2, 3]') ['[', '1', ',', ' ', '2', ',', ' ', '3', ']'] >>> eval('[1, 2, 3]') [1, 2, 3]

79 79 Teil 7 Exkurs – Benutzerfreundliche Programme

80 80 Dialog im Ausführfenster Bisher wurden konkrete Berechnungen durch Funktionsaufrufe im Ausführfenster realisiert. Diese Vorgehensweise ist wenig benutzerfreundlich. Um Berechnungen durchzuführen muss der Benutzer den Namen der Funktion kennen (und richtig eintippen) und die Reihenfolge der zu bearbeitenden Daten kennen (und genau beachten). def verschiebezahl(zeichen): … def verschluesseltesZeichen(zeichen, schluessel): … def verschluesselterText(klartext, schluessel): … >>> verschluesselterText('HALLO', 'G') 'NGRRU' >>> verschluesselterText('CAESAR', 'T') 'VTXLTK' Programmfenster Ausführfenster

81 81 Ein interaktives Programm # Unterprogramme def verschiebezahl(zeichen): … def verschluesseltesZeichen(zeichen, schluessel): … def verschluesselterText(klartext, schluessel): … # Hauptprogramm # Eingabe print('Verwende nur die Großbuchstaben ABC...XYZ.') aktuellerSchluessel = input('Schlüssel: ') aktuellerKlartext = input('Klartext: ') # Verarbeitung aktuellerGeheimtext = verschluesselterText(aktuellerKlartext, aktuellerSchluessel) # Ausgabe print('Geheimtext:', aktuellerGeheimtext) Programmfenster

82 82 Ein interaktives Programm >>> Verwende nur die Großbuchstaben ABC...XYZ. Schlüssel: D Klartext: SALVESAESAR Geheimtext: VDOYHVDHVDU Aufgabe: Speichere das Programm ab und führe es mit [Run][Run Module] aus. Im Ausführfenster wirst du zur Mitarbeit aufgefordert. Probiere das mehrmals mit verschiedenen Daten aus. Du musst das Programm hierzu jeweils wieder neu ausführen. Ausführfenster

83 83 Fachkonzept - Programm Ein (Python-) Programm ist eine Folge von (Python-) Anweisungen und Kommentaren. Der Programmtext wird auch Quelltext genannt.  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. # Unterprogramme def verschiebezahl(zeichen): … def verschluesseltesZeichen(zeichen,…): … def verschluesselterText(klartext, …): … # Hauptprogramm # Eingabe print('Verwende nur …') aktuellerSchluessel = input('Schlüssel: ') aktuellerKlartext = input('Klartext: ') # Verarbeitung aktuellerGeheimtext = … # Ausgabe print('Geheimtext:', aktuellerGeheimtext)

84 84 Fachkonzept - EVA-Prinzip # Eingabe... … = input(…) # Verarbeitung... … # Ausgabe print(…)... 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 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.

85 85 Laden und Speichern # Unterprogramme … def geladenerText(dateiname): datei = open(dateiname, 'r', encoding='iso ') text = datei.read() datei.close() return text def textSpeichern(dateiname, text): datei = open(dateiname, 'w', encoding='iso ') datei.write(text) datei.close() # Hauptprogramm # Eingabe print('Verwende nur die Großbuchstaben ABC...XYZ.') aktuellerSchluessel = input('Schlüssel: ') aktuellerDateinameLaden = input('Dateiname/Laden: ') aktuellerDateinamespeichern = input('Dateiname/Speichern: ') aktuellerKlartext = geladenerText(aktuellerDateinameLaden) # Verarbeitung aktuellerGeheimtext = verschluesselterText(aktuellerKlartext, aktuellerSchluessel) # Ausgabe textSpeichern(aktuellerDateinamespeichern, aktuellerGeheimtext)

86 86 Laden und Speichern >>> Verwende nur die Großbuchstaben ABC...XYZ. Schlüssel: D Dateiname/Laden: klartext.txt Dateiname/Speichern: geheimtext.txt Aufgabe: Teste das Programm. Beachte, dass sich die Datei, aus der der zu verschlüsselnde Text geladen werden soll, im selben Verzeichnis wie das Python-Programm befindet.

87 87 Fehlerbehandlung # Unterprogramme … # Hauptprogramm # Eingabe print('Verwende nur die Großbuchstaben ABC...XYZ.') aktuellerSchluessel = input('Schlüssel: ') aktuellerDateinameLaden = input('Dateiname/Laden: ') aktuellerDateinamespeichern = input('Dateiname/Speichern: ') # Funktionen benutzen try: aktuellerKlartext = geladenerText(aktuellerDateinameLaden) aktuellerGeheimtext = verschluesselterText(aktuellerKlartext, aktuellerSchluessel) textSpeichern(aktuellerDateinamespeichern, aktuellerGeheimtext) except: print('zu verarbeitende Datei nicht gefunden') Aufgabe: Erkundige dich, wie man mit einer try-except-Anweisung einen Laufzeitfehler verhindern kann, wenn die Datei zum Laden nicht gefunden wird.

88 88 Grafische Benutzeroberflächen Benutzerdialoge werden heutzutage über eine grafische Benutzeroberfläche geführt. Die Erstellung solcher Benutzeroberflächen ist etwas komplizierter und wird ausführlich erst in einer der nächsten Veranstaltungen behandelt..

89 89 Teil 8 Miniprojekt „Primzahlen“ Ablaufmodellierung mit Kontrollstrukturen

90 90 Primzahlen Zielsetzung: Primzahlen sind besondere Zahlen mit vielen interessanten Eigenschaften. Primzahlen sind auch sehr wichtig, da sie heutzutage bei der Sicherheit von Datenübertragungen im Internet eine zentrale Rolle spielen. In diesem Abschnitt sollen Bausteine zur Experimentieren mit Primzahlen entwickelt werden. Dabei spielt die Modellierung von komplexeren Berechnungsabläufen eine wichtige Rolle. Primzahlen sind natürliche Zahlen, die nur durch 1 und sich selbst ohne Rest teilbar sind. Beispiele: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,

91 91 Primzahltest falls n eine Primzahl ist True False istPrimzahl n natürliche Zahl falls n keine Primzahl ist Das Primzahltestproblem besteht darin, bei einer vorgegebenen natürlichen Zahl zu überprüfen, ob sie eine Primzahl ist.

92 92 Primzahltest Problem (Beispiel): Ist 551 eine Primzahl? Verfahren (Beispiel): Teile 551 der Reihe nach (von 2 bis ???) durch alle Zahlen und schaue jeweils, ob ein Rest bei der Division entsteht. Wenn das immer der Fall ist, dann handelt es sich um eine Primzahl. Python als Taschenrechner >>> 551 % 2 1 >>> 551 % 3 2 … Aufgabe: Führe den Primzahltest für n = 551 durch. Warum reicht es, wenn man bei dem skizzierten Verfahren der Reihe nach durch alle Zahlen von 2 bis √n teilt?

93 93 Ein einfacher Primzahltestalgorithmus ALGORITHMUS istPrimzahl: Übergabe: n prim = True k = 2 SOLANGE k < n: WENN n % k == 0: prim = False k = k+1 Rückgabe: prim Aufgabe: Beschreibe den Verarbeitungsablauf mit einem Flussdiagramm. Welche Rolle spielt die Variable prim im gezeigten Algorithmus? Erkläre anhand eines Beispiels.

94 94 Implementierung des Algorithmus ALGORITHMUS istPrimzahl: Übergabe: n prim = True k = 2 SOLANGE k < n: WENN n % k == 0: prim = False k = k+1 Rückgabe: prim Rückgabe: Wahrheitswert Fallunterscheidung Wiederholung Ablaufbeschreibung mit Wahrheitswerten Aufgabe: Informiere dich auf inf-schule , wie man die oben kommentierten Bausteine zur Ablaufmodellierung in Python implementiert. Entwickle mit diesem Wissen eine Funktionsdefinition für die Funktion istPrimzahl.

95 95 Verbesserte Primzahltestalgorithmen ALGORITHMUS istPrimzahl: Übergabe: n prim = True k = 2 SOLANGE … : WENN n % k == 0: prim = False k = k+1 Rückgabe: prim Aufgabe: Wann kann man die Durchführung der Divisionen beenden? Wie könnte man das im Algorithmus berücksichtigen?

96 96 Verbesserte Primzahltestalgorithmen Die Funktion istPrimzahl verarbeitet eine Zahl vom Typ int (d.h. eine ganze Zahl) und liefert als Ergebnis einen Wert vom Typ bool (d.h. einen der beiden Wahrheitswerte True oder False) zurück. def istPrimzahl(n): prim = True k = 2 while k*k <= n and prim: if n % k == 0: prim = False k = k+1 return prim Aufgabe: Erläutere die gezeigte Funktionsdefinition. Teste die Funktion. Liefert sie immer korrekte Ergebnisse?

97 97 Teil 9 Fachkonzept - Kontrollstrukturen

98 98 Kontrollstrukturen Kontrollstrukturen sind Ablaufbausteine, die dazu dienen, die Reihenfolge der Abarbeitung von Anweisungen (eines Algorithmus / eines Programms) festzulegen.

99 99 Fachkonzept - Fallunterscheidung Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben. zweiseitige Fallunterscheidung einseitige Fallunterscheidung WENN [Bedingung]: [Anweisungssequenz] SONST: [Anweisungssequenz] WENN [Bedingung]: [Anweisungssequenz]

100 100 Fachkonzept - Fallunterscheidung Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben. if [Bedingung]: [Anweisungssequenz] else: [Anweisungssequenz] if [Bedingung]: [Anweisungssequenz] Doppelpunkt if x >= y: maximum = x minimum = y else: maximum = y minimum = x maximum = x minimum = y if maximum < minimum: hilf = maximum maximum = minimum minimum = hilf Einrückung Schlüsselwort zweiseitige Fallunterscheidung einseitige Fallunterscheidung

101 101 Fachkonzept - Wiederholung Eine Solange-Wiederholung besteht aus einer Bedingung und einer Anweisungssequenz. Solange die Bedingung erfüllt ist, wird die Anweisungssequenz ausgeführt. SOLANGE [Bedingung]: [Anweisungssequenz] Flussdiagramm while [Bedingung]: [Anweisungssequenz] Doppelpunkt Einrückung Schlüsselwort Struktogramm Python-Syntax Aufbau

102 102 Fachkonzept - Wahrheitswerte Wahrheitswerte (wahr and falsch bzw. True and False) treten bei der Auswertung von Bedingungen auf. Man benutzt sie oft auch zur Ablaufmodellierung. def istPrimzahl(n): prim = True k = 2 while k*k <= n and prim: if n % k == 0: prim = False k = k+1 return prim zusammengesetzte Bedingung logische Variable Mehr über Wahrheitswerte und ihre Verarbeitung erfährst du auf inf-schule

103 103 Teil 10 Miniprojekt „Primzahlen“ Funktion als autonomer Baustein

104 104 Eine Funktion für Primzahltests Die Funktion istPrimzahl verarbeitet eine Zahl vom Typ int (d.h. eine ganze Zahl) und liefert als Ergebnis einen Wert vom Typ bool (d.h. einen der beiden Wahrheitswerte True oder False) zurück. def istPrimzahl(n): prim = True k = 2 while k*k <= n and prim: if n % k == 0: prim = False k = k+1 return prim

105 105 Eine Funktion für Primzahltests def istPrimzahl(n): prim = True k = 2 while k*k <= n and prim: if n % k == 0: prim = False k = k+1 return prim >>> istPrimzahl(13) True >>> istPrimzahl(15)... >>> istPrimzahl(7)... >>> istPrimzahl(551)... >>> istPrimzahl(2)... >>> istPrimzahl(1)... >>> istPrimzahl(0)... Funktionsdefinition Test mit Funktionsaufrufen

106 106 Verhaltensbeschreibung Black-Box-Diagramm >>> istPrimzahl(1) False >>> istPrimzahl(2) True >>> istPrimzahl(3) True >>> istPrimzahl(4) False >>> istPrimzahl(113) True >>> istPrimzahl(551) False Testfälle Es gibt verschiedene Möglichkeiten, das Verhalten einer Funktion (als Programmeinheit) zu beschreiben. Zum einem lässt sich das infomell mit einem Beschreibungstext tun. Daneben gibt es formalere Varianten, die bestimmte Formalismen zur exakten Beschreibung nutzen. Hierzu zählen u.a. das Black-Box-Diagramm und eine Beschreibung in Form von Testfällen.

107 107 Docstring in Python def istPrimzahl(n): """ Verhalten: Übergabe: natürliche Zahl n Rückgabe: True, falls n … False, sonst Testfälle: >>> istPrimzahl(13) True >>> istPrimzahl(15) False >>> istPrimzahl(551) False >>> istPrimzahl(2) True >>> istPrimzahl(1) False >>> istPrimzahl(0) False """ … prim = True k = 2 while k*k <= n and prim: if n % k == 0: prim = False k = k+1 return prim if __name__ == "__main__": from doctest import testmod testmod(verbose=True) Docstring mit Testfällen Automatisierte Überprüfung von Testfällen

108 108 Docstring in Python >>> Trying: istPrimzahl(13) Expecting: True ok Trying: istPrimzahl(15) Expecting: False ok Trying: istPrimzahl(551) Expecting: False ok Trying: istPrimzahl(2) Expecting: True ok … Trying: istPrimzahl(1) Expecting: False ******************************** File "...", line 19, in … Failed example: istPrimzahl(1) Expected: False Got: True Trying: istPrimzahl(0) … 1 items had failures: 2 of 7 in __main__.istPrimzahl 7 tests in 2 items. 5 passed and 2 failed. ***Test Failed*** 2 failures.

109 109 Docstring in Python Aufgabe: Probiere das selbst aus. Wie sind die Rückmeldungen von Python zu deuten? Verbessere die Funktionsdefinition so, dass alle Testfälle den Test bestehen. Tipp: Du musst zu Beginn eine zusätzliche Fallunterscheidung vorsehen.

110 110 Funktion als Baustein Baustein from primzahltest import istPrimzahl def istPrimzahlzwilling(n): if istPrimzahl(n): if istPrimzahl(n+2): ergebnis = True else: ergebnis = False else: ergebnis = False return ergebnis Verwendung des Bausteins Eine gut getestete Funktionsdefinition kann man bei weiterführenden Problemlösungen als Baustein verwenden. Hier ein Beispiel, bei dem überprüft werden soll, ob ein Primzahlzwilling vorliegt.

111 111 Funktion als Baustein Baustein Aufgabe: Entwickle eine Funktionsdefinition für eine Funktion naechstePrimzahl. Benutze die Funktion istPrimzahl als Baustein.

112 112 Der Primzahlsatz Die Anzahl der Primzahlen in einem Zahlenbereich lässt sich relativ genau abschätzen. Man verwendet hierzu den sogenannten Primzahlsatz. roter Graph: n -> Anzahl der Primzahlen kleiner oder gleich n grüner Graph: n -> n/ln(n)

113 113 Der Primzahlsatz Aufgabe: Entwickle eine Funktion, mit der man die Anzahl der Primzahlen ermitteln kann, die kleiner oder gleich einer übergebenen Zahl sind. Bestimme mit der entwickelten Funktion weitere Anzahlen und vergleiche mit der Abschätzung. >> from math import log >>> 100/log(100) Manchmal hört man den Vorschlag, Primzahlen in einer Primzahldatenbank zu sammeln. In diese Datenbank sollten dann natürlich auch die Primzahlen kommen, die heutzutage beim Aufbau von Kryptosystemen benutzt werden. Moderne Kryptosysteme benutzen Primzahlen mit mehr als 300 Stellen. Schätze mit dem Primzahlsatz ab, wie viele Primzahlen es in diesem Bereich gibt. Betrachte hierzu den Bereich zwischen und Beurteile mit dem gewonnenen Ergebnis den oben gemachten Vorschlag. Zur Information: Die Anzahl der Atome im Universum liegt Schätzung zufolge im Bereich zwischen und

114 114 Goldbachs Vermutung Im Jahr 1742 teilte der Mathematiker Christian Goldbach seinem Kollegen Leonhard Euler eine interessante Beobachtung mit: Jede gerade Zahl, die größer als 2 ist, lässt sich als Summe von zwei Primzahlen darstellen. Viele Mathematiker haben seither versucht, Goldbachs Vermutung zu beweisen. Gelungen ist es bisher keinem. 4 = = = = = = = = = = …

115 115 Goldbachs Vermutung Aufgabe: Entwickle eine Funktion, mit der man die Anzahl der Zerlegungen einer geraden Zahl als Summe von zwei Primzahlen ermitteln kann. Bestimme mit der entwickelten Funktion weitere Anzahlen und beobachte, wie diese Anzahlen mit wachsendem n ebenfalls wachsen. Vergleiche auch mit den Ergebnissen in der folgenden Abbildung.

116 116 Primfaktorzerlegung Das Faktorisierungsproblem (kurz FACTORIZE) besteht darin, eine vorgegebene natürliche Zahl in ein Produkt aus Primfaktoren zu zerlegen. Liste der Primfaktoren von n L primfaktoren n natürliche Zahl [2, 2, 5, 13] primfaktoren 260

117 117 Primfaktorzerlegung Aufgabe: Entwickle eine Funktion, mit der man die Primfaktoren einer natürlichen Zahl (größer 1) bestimmen kann. ALGORITHMUS primfaktoren: Übergabe: n faktoren = [] z = n SOLANGE z > 1: bestimme den kleinsten Primfaktor p von z faktoren = faktoren + [p] # füge p in die Liste faktoren ein z = z // p Rückgabe: faktoren


Herunterladen ppt "Programmierung mit Funktionen Klaus Becker 2015. 2 Programmierung mit Funktionen."

Ähnliche Präsentationen


Google-Anzeigen