Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundlagen der Informatik 1 Thema 1: Grundelemente der Programmierung

Ähnliche Präsentationen


Präsentation zum Thema: "Grundlagen der Informatik 1 Thema 1: Grundelemente der Programmierung"—  Präsentation transkript:

1 Grundlagen der Informatik 1 Thema 1: Grundelemente der Programmierung
Bernt Schiele 3/28/2017 Grundlagen der Informatik 1 Thema 1: Grundelemente der Programmierung Prof. Dr. Max Mühlhäuser Dr. Guido Rößling

2 Was ist Programmierung?
Bernt Schiele 3/28/2017 Was ist Programmierung? Schauen wir mal, was einige der „großen Köpfe“ der Informatik dazu sagen: „To program is to understand“ Kristen Nygaard „Programming is a Good Medium for Expressing Poorly Understood and Sloppily Formulated Ideas“ Marvin Minsky, Gerald J. Sussman Kristen Nygaard - Norwerger - gilt als einer der ‚co-inventor‘ der Objekt-Orientierten Programmiersprachen (Simula - gilt als 1. OO Sprache) Marvin Minsky & Gerlard Jay Sussman - beide MIT - KI-forschung - Problemloesung ist einer der wichtigen KI-probleme (Sussman ist auch Koautor des Buches: Structure & Interpretation of Computer Programs)

3 Strukturierungsmechanismen einer Programmiersprache
Bernt Schiele 3/28/2017 Strukturierungsmechanismen einer Programmiersprache Eine mächtige Programmiersprache ist mehr als ein Hilfsmittel um einen Computer anzuweisen, Aufgaben durchzuführen. Sie dient auch als Rahmen, innerhalb dessen wir unsere Ideen über die Problemdomäne organisieren Message: - Programmiersprache mehr als nur eine Sprache, die der Computer versteht - Sondern Programmiersprache ist unser Werkzeug um Ideen ‚umzusetzen‘ Wenn wir eine Sprache beschreiben, sollten wir die Hilfsmittel beachten, die sie uns zum Kombinieren von einfachen Ideen anbietet, um komplexere Ideen zu bilden.

4 Strukturierungsmechanismen einer Programmiersprache
Bernt Schiele 3/28/2017 Strukturierungsmechanismen einer Programmiersprache Jede mächtige Programmiersprache hat drei Mechanismen, um Prozessideen zu strukturieren: Primitive Ausdrücke Repräsentieren die einfachsten Einheiten der Sprache. Kombinationsmittel Zusammengesetzte Elemente werden aus einfacheren Einheiten konstruiert. Abstraktionsmittel Zusammengesetzte Elemente können benannt und weiter als Einheiten manipuliert werden. 3 Struktierungsmechanismen - Primitive Ausdruecke = worte einer Sprache - Kombinationsmittel = Grammatik -> d.h. von Worten zu Saetze, Absaetzen, Kapitel - Abstraktionsmittel = Bennennung der Kapitel -> Einheiten

5 Strukturierungsmechanismen in der Elektronik
Bernt Schiele 3/28/2017 Strukturierungsmechanismen in der Elektronik Primitive Widerstände, Kondensatoren, Induktivitäten, Spannungsquellen, … Kombinationsmittel Richtlinien für das Verdrahten der Schaltkreise Standardschnittstellen (z.B. Spannungen, Strömungen) zwischen den Elementen Abstraktionsmittel “Black box” Abstraktion – denke über einen Unter-Schaltkreis als eine Einheit: z.B. Verstärker, Regler, Empfänger, Sender, …

6 Sprachelemente – Die Primitiven
Bernt Schiele 3/28/2017 Sprachelemente – Die Primitiven Zahlen Beispiele: 23, -36 Zahlen sind selbstauswertend: Die Werte der Ziffern sind die Zahlen, die sie bezeichnen. 23  23 -36  -36 Boolesche Werte true und false ebenfalls selbstauswertend Namen für eingebaute Prozeduren Beispiele: +, *, /, -, =, … Was ist der Wert von so einem Ausdruck? Der Wert von + ist eine Prozedur, die Zahlen addiert Das werden wir später als „Higher-Order Procedures“ kennenlernen Auswertung durch Nachschlagen des dem Namen zugewiesenen Wertes. Zaheln: Unterscheidung zwischen Syntax & Semantik Boolsche Werte: Aussagen koennen wahr oder falsch sein: 3 > 2, 3>4 Beim Programmieren haben wir es mit zwei Arten von Dingen zu tun: Daten -> Dinge, die wir bearbeiten wollen und Prozeduren -> beschreiben die Regeln der Verarbeitung … wir werden später sehen, dass diese Unterscheidung nicht strikt ist in Scheme. In dieser Vorlesung beschäftigen wir uns mit den einfachsten Datentypen, damit wir aus auf die Konstruktion der Prozeduren konzentrieren können. Wir werden sehen, dass die selben Regeln auf zusammengesetzte Daten angewandt werden können.

7 Sprachelemente – Kombinationen
Bernt Schiele 3/28/2017 Sprachelemente – Kombinationen öffnende Klammer schließende Klammer (+ 2 3) Operator Operanden Präfixdarstellung Der Wert einer Kombination wird bestimmt durch die Ausführung der (durch den Operator) angegebenen Prozedur mit den Werten der Operanden. Beispiel Addition: - Schreibweise… (+ 2 3) - Praefix-Notation - Beispiel eines zusammengesetzen Elements Vorteile der Präfix Notation … - Gut geeignet für Operatoren mit beliebigen Anzahl von Operanden - Keine Mehrdeutigkeiten, da der Operator immer in der ersten Position nach der Klammer - Lässt sich einfach erweitern, um Kombinationen zu verschachteln -> Kombinationen aus anderen Kombinationen!

8 Sprachelemente – Kombinationen
Bernt Schiele 3/28/2017 Sprachelemente – Kombinationen Zusammengesetztes Element: Eine Sequenz von Ausdrücken, eingeschlossen in Klammern. Die Ausdrücke selbst sind primitiv oder wiederum zusammengesetzt Beispiel: Numerische Ausdrücke können mit Ausdrücken kombiniert werden, die primitive Prozeduren repräsentieren (+ oder *), um einen zusammengesetzten Ausdruck zu erstellen. stellt die Anwendung der Prozedur auf die Zahlen dar Vorteile der Präfix Notation … öffnende Klammer schließende Klammer (+ 2 3) Operator Operanden

9 Sprachelemente - Kombinationen
Bernt Schiele 3/28/2017 Sprachelemente - Kombinationen Kombinationen können verschachtelt werden – Regeln einfach rekursiv anwenden (+ 4 (* 2 3)) = (4 + (2 * 3)) = 10 (* (+ 3 4) (- 8 2)) = ((3 + 4) * (8 - 2)) = 42 Eine Kombination bedeutet immer eine Anwendung einer Prozedur Klammern können nicht eingefügt oder weggelassen werden, ohne die Bedeutung des Ausdrucks zu ändern.

10 Sprachelemente - Abstraktionen
Bernt Schiele 3/28/2017 Sprachelemente - Abstraktionen Erstelle eine komplexe Sache aus primitiveren Sachen, Benenne sie, Behandle sie als eine primitive Sache. Einfachstes Abstraktionsmittel: define Define - ist das einfachste Abstraktionsmittel unserer Sprache. - erlaubt uns, einfache Namen für zusammengesetzte Berechnungen (Ergebnisse zusammengesetzte Operationen) zu verwenden. - wichtig da Berechnungen (sehr) komplex sein können. Es wäre unpraktisch die Details solcher komplexeren Berechnungen jedes mal zu wiederholen, wenn man die Dinge verwendet! (define score (+ 27 3)) (define PI 3.14)

11 Sprachelemente - Abstraktionen
Bernt Schiele 3/28/2017 Sprachelemente - Abstraktionen Sonderformen: Geklammerte Ausdrücke, die mit einem der wenigen Scheme-Schlüsselwörter starten. Beispiel: define Mit define kann man einen Wert an einen Namen binden Beispiel: (define score (+ 27 3)) Die define Sonderform wertet den zweiten Ausdruck nicht aus (in dem Beispiel: score) Sie assoziiert diesen Namen mit dem Wert des dritten Ausdruckes in einer Umgebung. Der Rückgabewert einer Sonderform ist nicht spezifiziert. Message: define macht NUR Assoziation von Namen mit Wert

12 Namensgebung und Umgebung
Bernt Schiele 3/28/2017 Namensgebung und Umgebung Ein wichtiger Aspekt einer Programmiersprache ist die Möglichkeit, Objekte über Namen zu referenzieren. Ein Name identifiziert eine Variable, deren Wert ein Objekt ist. Umgebung: der Interpreter unterhält eine Art Speicher, um Name-Objekt Paare zu verwalten. Assoziiere die Werte mit den Symbolen Hole die Werte später über die Symbole Wichtiger Aspekt einer PL: - Verwalten solcher Assoziationen zwischen Namen & Werten - Allgemeiner reden wir von Namen & Objekten Umgebung: - verwaltet diese Namen-Objekt-Paare

13 Namensgebung und Umgebung
Bernt Schiele 3/28/2017 Namensgebung und Umgebung Um den Wert auszurechnen, der durch den Namen repräsentiert wird, reicht es, ihn in der Umgebung aufzulösen. Beispiel: Die Evaluierung von score ist 30 (define score (+ 27 3)) (define total ( )) (* 100 (/ score total)) Beachte: wir haben das (implizit) schon gemacht für die Symbole der arithmetischen Operatoren +, *, usw. (d.h. den Wert erhalten, der durch diese Namen referenziert wird) + * / 30 score Namen/Objekt Paare kennen wir quasi schon: - addition, multiplikation… - Define fuegt eine solche Assoziation/ein solches Paar hinzu 45 total

14 Auswertungsregel Selbst-auswertend (self-rule)  gib den Wert zurück
Bernt Schiele 3/28/2017 Auswertungsregel Selbst-auswertend (self-rule)  gib den Wert zurück Die Werte der Ziffern sind die Zahlen, die sie bezeichnen. Eingebauter Operator  gib die Sequenz der Maschineninstruktionen zurück, die die entsprechenden Operationen durchführen. Name (name-rule)  gib den Wert zurück, der in der Umgebung mit diesem Namen assoziiert wurde. Sonderform  mache was besonderes. Kombination  Rechne die Unterausdrücke (in beliebiger Reihenfolge) aus Wende die Prozedur, die der Wert des am weitesten links liegenden Unterausdruckes ist (der Operator), auf die Argumente an – die Werte der restlichen Unterausdrücke (Operanden). Beispiel einer Kombination: (+ 4 (* 2 3)) Folgende Auswertungeregeln kennen wir jetzt… - Die Regel 2 kann als spezialfall von 3 betrachtet werden Kommentare - Selbst komplexe Ausdrucke bearbeitet der Interpreter nach Grundzyklus - Interpreter muss nicht explizit angewiesen werden, den Wert des Ausdrucks auszugeben - Betone die Schlüsselrolle der Umgebung für die Auswertung - Hebe die Sonderformen hervor

15 Auswertungsregel Die Auswertungsregel ist rekursiv
Bernt Schiele 3/28/2017 Auswertungsregel Die Auswertungsregel ist rekursiv Bei einer Kombination ruft die Regel sich selbst auf Jedes Element muss ausgewertet werden, bevor die Gesamtauswertung einer Kombination abgeschlossen werden kann Die Auswertung der folgenden Kombination erfordert die Anwendung der Auswertungsregel auf vier unterschiedliche Kombinationen. ( * (+ 2 (* 4 6) ) ( ) )

16 Lesen-Auswerten-Ausgeben-Schleife
Bernt Schiele 3/28/2017 Lesen-Auswerten-Ausgeben-Schleife define-Regel: Werte nur den zweiten Operanden aus Der Name des ersten Operanden ist an den berechneten Wert gebunden Gesamtwert des Ausdrucks ist undefiniert print Unterschiede zwischen den Scheme Versionen (define PI 3.14) “PI --> 3.14" lesen-auswerten-print = read-eval-print-loop eval define-rule Sichtbare Welt Ausführungswelt Name Wert undefined PI 3.14

17 Lesen-Auswerten-Ausgeben-Schleife des Interpreters
Bernt Schiele 3/28/2017 Lesen-Auswerten-Ausgeben-Schleife des Interpreters Ausgedruckte Darstellung des Werts Ausdruck Ausdruck 23 23 PI 3.14 Sichtbare Welt print print eval self-rule eval name-rule Ausführungswelt 23 3.14 Wert Wert Namensregel: Schlage in der aktuellen Umgebung den Wert unter dem Namen nach

18 Finden gemeinsamer Muster
Bernt Schiele 3/28/2017 Finden gemeinsamer Muster Haben folgende Kombinationen etwas gemeinsam? (* 3.14 (* 5 5)) (* 3.14 (* )) (* 3.14 (* r r)) Wie generalisieren wir? Wie drücken wir die Idee von “Fläche eines Kreises” aus? Alle sind Beispiele einer Kreisflächenberechnung Das folgende ist an Kap. 3 aus HTDP angelehnt was haben die Kombinationen gemein: - sqr(zahl) - multiplilation mit PI

19 Definition neuer Prozeduren
Bernt Schiele 3/28/2017 Definition neuer Prozeduren Um wiederholende Muster festzuhalten, benutzen wir Prozeduren Analog zu einer Funktionsdefinition in der Mathematik Deshalb verwenden wir auch manchmal den Namen Funktion Die define Sonderform wird benutzt, um neue Prozeduren zu erstellen/definieren Name Parameter (define (area-of-disk r) (* 3.14 (* r r))) Prozedurrumpf

20 Definition neuer Prozeduren
Bernt Schiele 3/28/2017 Definition neuer Prozeduren Sobald eine Prozedur definiert wurde, kann sie wie eine primitive Prozedur (wie +, * etc.) benutzt werden Kreisfläche: (area-of-disk 5)  ergibt 78.5 Fläche eines Rings: (- (area-of-disk 5) (area-of-disk 3))  ergibt ( ) = 50.24 = -

21 Definition neuer Prozeduren
Bernt Schiele 3/28/2017 Definition neuer Prozeduren Bereits definierte Prozeduren können zu neuen, mächtigeren Prozeduren kombiniert werden Berechnen der Fläche eines Rings Anwendung der neuen Prozedur (area-of-ring 5 3) = (- (area-of-disk 5) (area-of-disk 3)) = (- (* 3.14 (* 5 5)) (* 3.14 (* 3 3))) = … = 50.24 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner)))

22 Informelle Beschreibungen
Bernt Schiele 3/28/2017 Informelle Beschreibungen Typische Programmspezifikation Üblicherweise nicht in Form mathematischer Ausdrücke, die in Programme umzuwandeln sind Sondern informelle Problembeschreibungen Enthalten irrelevante oder mehrdeutige Informationen Beispiel: “Die Firma XYZ bezahlt ihren Angestellten 12 € pro Stunde. Ein Angestellter arbeitet zwischen 20 und 65 Stunden pro Woche. Entwickeln Sie ein Programm, welches den Lohn eines Angestellten aus der Anzahl der Arbeitsstunden berechnet” … aber: die Aufgabenstellung ist oft nicht in Form einer mathematischen Formel typischer sind informelle Beschreibungen… Beispiel: tatsaechlich NUR Berechnung des Lohnes (aufgrund von Stunde * Stundenlohn) Problemanalyse (define (lohn stundenanzahl) (* 12 stundenanzahl))

23 Fehler Ihre Programme werden Fehler enthalten Mögliche Fehler:
Bernt Schiele 3/28/2017 Fehler Ihre Programme werden Fehler enthalten Das ist nichts Schlimmes Lassen Sie sich durch Fehler nicht verwirren/entmutigen Mögliche Fehler: Keine korrekte Klammerung, z.B. (* 3 (5) Operator eines Prozeduraufrufs ist keine Prozedur, z.B. (10) ( ) Typfehler, andere Laufzeitfehler, z.B. (+ 3 true) (/ 3 0) Probieren Sie aus, was bei fehlerhaften Eingaben passiert und versuchen Sie die Fehlermeldungen zu verstehen!

24 Design von Programmen Das Design von Programmen ist nicht trivial
Bernt Schiele 3/28/2017 Design von Programmen Das Design von Programmen ist nicht trivial Folgendes Rezept soll Ihnen helfen, Ihre ersten Programme zu schreiben Schritt-für-Schritt Beschreibung, was zu tun ist Später wird dieses Rezept verfeinert Jede Programmentwicklung besteht aus wenigstens vier Aktivitäten: Verstehen, was der Zweck des Programms ist Programmbeispiele ausdenken Den Programmkörper implementieren Testen

25 “If you can't write it down in English, you can't code it.“
Bernt Schiele 3/28/2017 Design von Programmen “If you can't write it down in English, you can't code it.“ Peter Halpern Verstehen, was der Zweck des Programms ist Berechnung der Fläche eines Rings: Berechnung der Fläche eines Ringes mit einem äußeren Radius ‘outer’ und einem inneren Radius ‘inner’ Berechnen kann man das durch die Fläche des Kreises mit Radius ‘outer’ minus die Fläche des Kreises mit Radius ‘inner’

26 Design von Programmen 1. Verstehen, was der Zweck des Programms ist
Bernt Schiele 3/28/2017 Design von Programmen 1. Verstehen, was der Zweck des Programms ist Vergabe eines sinnvollen Namens Definition eines Vertrags Welche Daten werden konsumiert und produziert? Formulierung einer kurzen Beschreibung des Sinns des Programms Hinzufügen des Programmkopfes Beispiel: ;; area-of-ring :: number number -> number ;; Berechnet die Flaeche eines Rings ;; mit Radius "outer", dessen ;; Loch den Radius "inner" hat (define (area-of-ring outer inner) … )

27 Design von Programmen 2. Programmbeispiele ausdenken
Bernt Schiele 3/28/2017 Design von Programmen 2. Programmbeispiele ausdenken Hilft die Ein-/Ausgaberelation zu charakterisieren Es ist oft einfacher, Abstraktes anhand von Beispielen zu verstehen Beispiele helfen, den Berechnungsprozess eines Programms zu verstehen und logische Fehler zu entdecken In unserem Beispiel: ;; area-of-ring :: number number -> number ;; Berechnet die Flaeche eines Rings… ;; dessen Loch den Radius "inner" hat ;; Beispiel: (area-of-ring 5 2) ergibt 65.94 (define (area-of-ring outer inner) … ) Beispiele sollten insbesondere auch Spezialfaelle / Grenzfaelle abdecken

28 Design von Programmen 3. Den Programmkörper implementieren
Bernt Schiele 3/28/2017 Design von Programmen 3. Den Programmkörper implementieren Ersetzung des “…” Platzhalters mit einem Ausdruck Ist die Eingabe-Ausgabe Relation eine mathematische Formel, können wir diese meist direkt übersetzen Bei einer informellen Beschreibung müssen wir uns den Berechnungsprozess klarmachen Die Beispiele aus Schritt 2 können helfen In unserem Beispiel: ;; area-of-ring :: number number -> number ;; Berechnet die Flaeche eines Rings… ;; dessen Loch den Radius "inner" hat ;; Beispiel: (area-of-ring 5 2) ergibt 65.94 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) Leider nicht das gleiche Erscheinungsbild wie die Folie -> Viel Info

29 Design von Programmen 4. Testen: Nutzen Sie die Funktion von Scheme!
Bernt Schiele 3/28/2017 Design von Programmen 4. Testen: Nutzen Sie die Funktion von Scheme! (check-expect actual expected) Vergleicht den "actual"-Wert exakt mit dem "expected"-Wert. Für Gleitkommazahlen problematisch, da Ergebnis nicht unbedingt exakt ist (markiert durch „#i“ vor dem Wert) Beispiel: (check-expect (* 2 2) 4) (check-within test expected delta) Prüfung, ob der Testwert (meist Gleitkommazahl) korrekt ist mit Abweichung delta, etwa delta = Beispiel: (check-within (area-of-ring 5 2) ) (check-error test message) Prüft, ob der Aufruf die erwartete Fehlermeldung liefert Fehler in Funktion func durch (error 'function "message") auslösen Fehlgeschlagene Tests werden in einem separaten Fenster angezeigt. Scheme erlaubt TestCases direkt in den Programcode einzufuegen !

30 “Testing can show the presence of bugs, but not their absence.”
Bernt Schiele 3/28/2017 “Testing can show the presence of bugs, but not their absence.” Edsger W. Dijkstra “Beware of bugs in the above code; I have only proved it correct, not tried it“ Donald E. Knuth Edsger W. Dijkstra - (Hollaender) - hat den turing award erhalten (Nobelpreis der Informatiker) PL-spezialist, Algorithmen (shortest path) Donald E. Knuth - (ehemals Stanford) - hat auch den Turing Award bekommen - Algorithmiker mehrbaendige Informatiker-bibel : the art of computer programming ‘urvater’ von tex… (1. version 1977)

31 Hilfsprozeduren Wann/wofür sollte man Hilfsprozeduren verwenden?
Bernt Schiele 3/28/2017 Hilfsprozeduren Wann/wofür sollte man Hilfsprozeduren verwenden? Beispiel: Schreiben Sie ein Programm, das den Profit eines Kinobesitzers in Abhängigkeit vom Ticketpreis berechnet. Bei 5€ pro Ticket kommen 120 Leute. Pro 0,10€ Rabatt kommen 15 Leute mehr. Jede Aufführung kostet 180€. Jeder Teilnehmer kostet 0,04€.

32 Hilfsprozeduren: Schlechtes Design
Bernt Schiele 3/28/2017 Hilfsprozeduren: Schlechtes Design ;; How NOT to design a program (define (profit price) (- (* (+ 120 (* (/ ) ( price))) price) (+ 180 (* .04 (+ 120 ( price))))))) Offensichtilich: schlechtes Programm - aber Warum - unuebersichtlich !!

33 Hilfsprozeduren: Gutes Design
Bernt Schiele 3/28/2017 Hilfsprozeduren: Gutes Design ;; How to design a program (define (profit ticket-price) (- (revenue ticket-price) (cost ticket-price))) (define (revenue ticket-price) (* (attendees ticket-price) ticket-price)) (define (cost ticket-price) (+ 180 (* .04 (attendees ticket-price)))) (define (attendees ticket-price) (+ 120 (* (/ ) ( ticket-price))))

34 Daumenregel für Hilfsprozeduren
Bernt Schiele 3/28/2017 Daumenregel für Hilfsprozeduren Definieren Sie Hilfsprozeduren für jede Abhängigkeit zwischen Quantitäten der Problembeschreibung oder Quantitäten, die bei den Beispielberechnungen entdeckt wurden.

35 Prozeduren als Black-Box-Abstraktionen
Bernt Schiele 3/28/2017 Prozeduren als Black-Box-Abstraktionen Abstraktion dient dazu, Komplexität zu verstecken Details werden versteckt, die nicht zum Verständnis des Sachverhalts beitragen (abhängig vom Betrachter…) graphik mag zwar lustig sein - lenkt mir aber zu sehr von der message ab… - vielleicht lieber ein physiker und ein sportler?…

36 Prozeduren als Black-Box-Abstraktionen
Bernt Schiele 3/28/2017 Prozeduren als Black-Box-Abstraktionen In der Vorlesung werden wir mehrere fundamentale Arten der Abstraktion kennen lernen Eine prozedurale Abstraktion ist eine davon: area-of-ring berechnet die Fläche eines Rings Der Benutzer muss sich nicht um die Details von area-of-ring kümmern Schwarze Kiste (black-box) Abstraktion Eingaben Ausgabe Wir wissen, was es tut, aber nicht, wie es etwas tut

37 Prozeduren als Black-Box-Abstraktionen
Bernt Schiele 3/28/2017 Prozeduren als Black-Box-Abstraktionen Ein Berechnungsproblem wird oft in natürliche, kleinere Teilprobleme aufgeteilt. Beispiel: Ringfläche  Zweifache Berechnung einer Kreisfläche Für Teilprobleme werden Prozeduren geschrieben area-of-disk,… primitive Prozeduren … Betonnung auf klar umrissene Aufgabe und nicht irgendeine Zerlegung des Codes

38 Prozeduren als Black-Box-Abstraktionen
Bernt Schiele 3/28/2017 Prozeduren als Black-Box-Abstraktionen Die Prozedur attendees kann als eine ‚black-box‘ betrachtet werden. Sie soll die Anzahl der Teilnehmer berechnen. Wir sind nicht interessiert zu wissen, wie sie die Berechnung durchführt. Diese Details können vernachlässigt werden. attendees ist eine prozedurale Abstraktion für revenue/cost. profit revenue cost attendees

39 Prozeduren als Black-Box-Abstraktionen
Bernt Schiele 3/28/2017 Prozeduren als Black-Box-Abstraktionen Eine benutzerdefinierte Prozedur wird über den Namen aufgerufen, genauso wie die primitiven Prozeduren. Wie die Prozedur arbeitet, bleibt versteckt. area-of-ring area-of-circle square Auf diesem Abstraktionsniveau ist jede Prozedur, die Quadrate berechnet, so gut wie jede andere. message: Prozedur (hier square) kann beliebig implementiert werden… Ein Detail der unwichtig für den Benutzer sein dürfte, ist der Name der Parameter. Ich kann x nach y umbennen. Die Definition von von good-enough bleibt unberührt. (define (square x) (* x x)) (define (square x) (* (* x 10) (/ x 10)))

40 Konstantendefinitionen
Bernt Schiele 3/28/2017 Konstantendefinitionen Richtlinie für Variablendefinitionen: Bessere Lesbarkeit Bessere Wartbarkeit Bei Änderungen muss nur an einer Stelle etwas geändert werden In unserem Beispiel: (define PI 3.14) Benötigt man eine bessere Approximation, ist nur eine Änderung erforderlich (define PI ) Taucht eine Konstante häufig in einem Programm auf, sollten wir ihr einen Namen geben.

41 Bernt Schiele 3/28/2017 Bedingte Ausdrücke Zwei Formen: 1) (if <test> <then-expr> <else-expr>) nicht optional in Scheme Beispiel: (define (absolute x) (if (< x 0) (- x) x))

42 Bernt Schiele 3/28/2017 Bedingte Ausdrücke Zwei Formen: 2) (cond [<test1> <expr1>] [<test2> <expr2>] [else <last-expr>]) optional Beispiel: (define (absolute x) (cond [(> x 0) x] [(= x 0) 0] [else (- x)])) Eigentlich habe ich gelogen. Der <else-expr> Ausdruck in if Anweisung und in dem else Zweig in cond Anweisungen sind optional, aber der Rückgabewert ist nicht spezifiziert, also lassen Sie es besser nicht aus. - wenn Sie der Meinung sind, sie haben alle Faelle abgedeckt schreiben sie zumindest eine fehlermeldung hin

43 Bernt Schiele 3/28/2017 Boolesche Funktionen (and <expr_1> <expr_2> <expr_N>) <expr_i> (i = 1..N) werden in dieser Reihenfolge ausgewertet Es wird false zurück gegeben, falls irgendein Ausdruck als false ausgewertet wird, sonst wird true zurückgegeben. Wenn einer der Ausdrücke nicht true oder false ergibt, gibt es einen Fehler. Durch Shortcut-Regel werden manche Ausdrücke nicht ausgewertet. (and (= 4 4) (< 5 3))  false (and true (+ 3 5))  Fehler: and: question result is not true or false: 8 (and false (+ 3 5))  Shortcut-Regel: false

44 Bernt Schiele 3/28/2017 Boolesche Funktionen (or <expr1_> <expr_2> <expr_N>) <expr_i> (i = 1..N) werden in dieser Reihenfolge ausgewertet. Es wird true nach dem ersten Wert zurückgegeben, der zu true ausgewertet wird. Es wird false zurückgegeben, falls alle Ausdrücke als false ausgewertet werden. Wird ein Wert ausgewertet und ergibt nicht true oder false, gibt es einen Fehler Füge Tabellen hier

45 Boolesche Funktionen (boolean=? <expr1> <expr2>)
Bernt Schiele 3/28/2017 Boolesche Funktionen (boolean=? <expr1> <expr2>) expr1, expr2 werden in dieser Reihenfolge ausgewertet. Es wird true zurückgegeben, falls expr1 und expr2 beide true ergeben oder beide false ergeben Es wird false zurückgegeben, falls die Operanden einen unterschiedlichen booleschen Wert haben Wird ein Operand ausgewertet und ergibt nicht true oder false, gibt es einen Fehler (not <expr>) Gibt true zurück, wenn <expr> false Gibt false zurück, wenn <expr> true Füge Tabellen hier

46 Design konditionaler Prozeduren
Bernt Schiele 3/28/2017 Design konditionaler Prozeduren Wie ändert sich unser Designprozess? Neue Phase: Datenanalyse Welche unterschiedlichen Situationen gibt es? Beispiele Mindestens ein Beispiel für jede Situation Implementierung des Programmkörpers Erst Skelett der cond/if Ausdrücke definieren, dann die einzelnen Fälle implementieren Testen Tests sollten alle Situationen abdecken Jede Programmentwicklung besteht aus wenigstens vier Aktivitäten Verstehen, was der Zweck des Programms ist Programmbeispiele ausdenken Den Programmkörper implementieren Testen

47 Bernt Schiele 3/28/2017 Symbole Bis jetzt hatten wir Zahlen und Booleans als primitive Werte kennengelernt Oft wollen wir symbolische Informationen speichern Namen, Wörter, Richtungen,… Ein Symbol in Scheme ist eine Sequenz von Zeichen, angeführt von einem einfachen Anführungszeichen: ‘the ‘dog ‘ate ‘a ‘cat! ‘two^3 ‘and%so%on? Nicht alle Zeichen sind erlaubt (z.B. keine Leerzeichen) Nur eine Operation auf diesem Datentyp: symbol=? (symbol=? ‘Hallo ‘Hallo)  true (symbol=? ‘Hallo ‘ABC)  false (symbol=? 1 2)  Fehler Symbole sind atomar (wie auch Zahlen, Booleans) Symbole können nicht zerlegt werden

48 Symbole: Beispiel (define (reply s) (cond
Bernt Schiele 3/28/2017 Symbole: Beispiel (define (reply s) (cond [(symbol=? s 'GoodMorning) 'Hi] [(symbol=? s 'HowAreYou?) 'Fine] [(symbol=? s 'GoodAfternoon) 'INeedANap] [(symbol=? s 'GoodEvening) 'BoyAmITired] [else 'Error_in_reply:unknown_case] )) was fehlt: - else-fall…

49 Bernt Schiele 3/28/2017 Symbole vs. Strings Viele von Ihnen kennen vielleicht den Datentyp String Symbole sind zu unterscheiden von Strings Symbole: Werden benutzt für symbolische Namen Atomar Keine Manipulation Sehr effizienter Vergleich Gewisse Einschränkungen, welche Zeichen dargestellt werden können Strings: Werden benutzt für Textdaten Manipulation möglich (z.B. suchen, zusammensetzen etc.) Vergleiche sind teuer Beliebige Zeichen(ketten) darstellbar Strings sind auch in Scheme verfügbar Mit doppelten Anführungszeichen zu erzeugen Mit string=? zu vergleichen Wir werden Strings zunächst ignorieren

50 Erinnerung: Die Auswertungsregel
Bernt Schiele 3/28/2017 Erinnerung: Die Auswertungsregel Bisher hatten wir nur eingebaute Operatoren als Prozeduren. Wie werden Prozeduren ausgewertet, die vom Programmierer definiert sind? selbst-auswertend  … eingebauter Operator  … Name  … Sonderform  … Kombination  Rechne die Unterausdrücke (in beliebiger Reihenfolge) aus Wende die Prozedur, die der Wert des am weitesten links liegenden Unterausdruckes ist (der Operator), auf die Argumente an – die Werte der restlichen Unterausdrücke (Operanden). auswertungsregel - angewendet auf Benutzter-definierte Prozeduren…

51 Auswertungsregel erweitert
Bernt Schiele 3/28/2017 Auswertungsregel erweitert Auswertungsregel für Prozeduren Die Prozedur ist eine primitive Prozedur Führe die entsprechenden Maschineninstruktionen aus. Die Prozedur ist eine zusammengesetzte Prozedur Werte den Rumpf der Prozedur aus Ersetze dabei jeden formalen Parameter mit dem entsprechenden aktuellen Parameterwert, der bei der Anwendung angegeben wird. Der weiße Kasten ist im Original schon nicht ganz verständlich gesetzt, deshalb ziehe ich ihn um die ganze Prozedur (define (f x ) (* x x)) (f 5 )

52 Das Substitutionsmodell
Bernt Schiele 3/28/2017 Das Substitutionsmodell Fiktive Namen (formale Parameter/Variablen): Erlauben die Definition von allgemeinen Prozeduren, die in unterschiedlichen Situationen wiederverwendet werden können. Um die Prozedur auszuwerten, müssen effektive Werte an die fiktiven Namen gebunden werden. Auch bekannt von arithmetischen Formeln: f(a, b) = a2 + b2 fiktive Namen == Variablen… Deklaration der formalen Parameter Definition der Funktion mit Hilfe von formalen Parametern Benutzung der allgemeinen Funktion, um ein Spezialproblem zu lösen. f (3, 2)

53 Das Substitutionsmodell
Bernt Schiele 3/28/2017 Das Substitutionsmodell Substitution der fiktiven Variablen mit effektiven Werten während der Ausführung (define (f a b) (+ (* a a) (* b b))) a b (define b 2) ... (f 3 2) ... ... (f b 2) ... ... a * a b * b + Aufrufumgebung Prozedurumgebung für f

54 Das Substitutionsmodell
Bernt Schiele 3/28/2017 Das Substitutionsmodell Substitution der fiktiven Variablen mit effektiven Werten während der Ausführung (define (f a b) (+ (* a a) (* b b))) a 3 b 2 (define b 2) ... (f 3 2) ... ... (f b 2) ... ... 3 * 3 a * a b * b 2 * 2 + 13 Aufrufumgebung Prozedurumgebung für f

55 Das Substitutionsmodell
Bernt Schiele 3/28/2017 Das Substitutionsmodell Substitution der fiktiven Variablen mit effektiven Werten während der Ausführung a 2 2 b (define b 2) ... (f 3 2) ... ... (f b 2) ... ... 2 * 2 a * a b * b 2 * 2 + 8 Aufrufumgebung Prozedurumgebung für f

56 Das Substitutionsmodell
Bernt Schiele 3/28/2017 Das Substitutionsmodell Das Substitutionsmodell soll Ihnen helfen, über die Bedeutung (Semantik) eines Programms nachzudenken Es gibt keine Auskunft darüber, wie der Interpreter tatsächlich arbeitet. Typischerweise wertet ein Interpreter nicht den Prozeduraufruf durch textuelle Manipulation des Rumpfs aus. Einfaches Modell, um formal über den Auswertungsprozess nachzudenken. Es erlaubt Ihnen, Programme auf einem Stück Papier auszuführen Detailliertere Modelle folgen später das Modell ist zwar nicht absolut korrerkt (und vollstaendig) - aber es hilft besser zu programmieren Autofahren - Leute mit einem mentalen Modell des Autos fahren typischerweise besser…

57 Details des Substitutionsmodells: Applikative Reihenfolge
Bernt Schiele 3/28/2017 Details des Substitutionsmodells: Applikative Reihenfolge (define (square x) (* x x))) (define (average x y) (/ (+ x y) 2)) (average 5 (square 3)) (average 5 (* 3 3)) (average 5 9) Werte zuerst die Operanden aus, führe dann die Ersetzung durch (applikative Reihenfolge) (/ (+ 5 9) 2) (/ 14 2) Falls der Operator eine einfache Prozedur ist, ersetze diesen 7 mit dem Resultat der Operation applikative Reihenfolge - auswerten der Operanden (und des Operators) - quasi - immer soviel wie moeglich auswerten (wenn ich nicht mehr reduzieren kann - ersetzen)

58 Details des Substitutionsmodells: Normale Reihenfolge
Bernt Schiele 3/28/2017 Details des Substitutionsmodells: Normale Reihenfolge (define (square x) (* x x)) (define (average x y) (/ (+ x y) 2)) (average 5 (square 3)) (/ (+ 5 (square 3)) 2) (/ (+ 5 (* 3 3)) 2) (/ (+ 5 9) 2) (/ 14 2) 7 erst Operator/Prozedur auswerten - die (unsausgewerteten Operanden substituieren) - quasi immer soviel wie moeglich ersetzen - und erst dann auswerten, wenn ich nichts mehr ersetzen kann (wenn quasi nur noch primitive Operatoren uebrigbleiben) Normale Reihenfolge

59 Applikative vs. normale Auswertungsreihenfolge
Bernt Schiele 3/28/2017 Applikative vs. normale Auswertungsreihenfolge Applikativ: Erst Operator und alle Operanden auswerten, dann substituieren Normal: Operator auswerten, dann die (unausgewerteten) Operanden für die formalen Argumente des Operators substituieren Wichtige, nicht-triviale Eigenschaft: Das Ergebnis hängt nicht von der Auswertungsreihenfolge ab (Konfluenz) Allerdings kann es sein, dass bei ungeschickter Auswertungsreihenfolge die Auswertung nie terminiert Wir werden später Sprachfeatures (Zuweisungen, Ein-/Ausgabe) betrachten, die diese Eigenschaft zerstören Die beiden Strategien können sich erheblich in der Anzahl der benötigten Schritte unterscheiden Argument wird nicht benötigt  normale Reihenfolge besser Argument wird mehrfach benötigt  applikative Reihenfolge besser applikativ - soviel auswerten wie moeglich - dann ersetzen/substituieren normal - soviel ersetzen wie moeglich - dann auswerten beispiel: normale reihenfolge besser bei: (define (area-of-disk r d) (* 3.14 r r)) call: (area-of-disk 5 (* 5 2)) b. applikative reihenfolge besser (define (square x) (* x x)) call: (square (+ 3 4))

60 Rückblick: Die Sprache Scheme
Bernt Schiele 3/28/2017 Rückblick: Die Sprache Scheme Dinge, die ein Scheme Programm ausmachen: selbst auswertende 23, true, false Namen +, PI, pi Kombinationen (+ 2 3) (* pi 4) Sonderformen (define PI 3.14) Syntax Kombination: (oper-expression other-expressions …) Sonderform: Ein besonderes Schlüsselwort als erster Unterausdruck Semantik Kombinationen: Werte Unterausdrücke in beliebiger Reihenfolge aus. Wende den Operator auf die Operanden an Substitution bei benutzerdefinierten Prozeduren Sonderformen: Jede hat eine eigene Semantik

61 Zusammenfassung Wir haben kennengelernt:
Bernt Schiele 3/28/2017 Zusammenfassung Wir haben kennengelernt: Die einfachsten Elemente (Daten/Prozeduren) von Scheme Kombination als ein Mittel der Zusammensetzung von einfacheren Elementen in komplexeren Elementen Benennen von Kombinationen, um sie weiter als Elemente in andere Kombinationen einzusetzen Eigene Prozeduren definieren – Prozessschablone – und sie als elementare Elemente von Kombinationen einsetzen _______________________ Scheme _______________________ Probleme in kleinere klar umrissene Aufgaben zerlegen Prozeduren als Black-Box Abstraktionen Semantik eines Prozeduraufrufs als Substitutionsprozess


Herunterladen ppt "Grundlagen der Informatik 1 Thema 1: Grundelemente der Programmierung"

Ähnliche Präsentationen


Google-Anzeigen