Grundlagen der Informatik I (Studiengang Medieninformatik) Thema: 3. Datentypen, Datenstrukturen und imperative Programme Prof. Dr. S. Kühn Fachbereich Informatik/Mathematik Email: [email protected] Beispiele für Algorithmen Algorithmus zur Division von zwei Zahlen. (Ein robuster Algorithmus muss den Fall der Division durch Null berücksichtigen). Verfahren zur Bestimmung des größten gemeinsamen Teilers (ggT) zweier natürlicher Zahlen. Verfahren zur Auswertung des geklammerten Ausdrucks (a+b)*c. Hier kann man einen nicht-deterministischen Algorithmus konstruieren, der bei gleichen Eingabewerten a, b und c unterschiedlich abläuft, aber dennoch immer das gleiche Ergebnis liefert. Hinweis: (a+b)*c=a*c+b*c. 05.10.2015 GDI - 3. imperative Programme 2 Beispiele für Algorithmen (2) Ein Algorithmus zur Bestimmung der Lösungsmenge der quadratischen Gleichung ax2 +bx+c=0 muss für alle reellwertigen Parameter a,b und c korrekt arbeiten, also auch den Fall von nicht-reellen Lösungen berücksichtigen. Ein Algorithmus zur Berechnung von π kann nicht dynamisch finit sein, die produzierte Darstellung von π besitzt ja unendlich viele Stellen. 05.10.2015 GDI - 3. imperative Programme 3 Vom Problem zur Berechnung einer Lösung Problemformulierung Problem Problemanalyse,-abstraktion Problemspezifikation Algorithmenentwurf Algorithmus Verifikation, Komplexitätsanalyse Algorithmus Programmkonstruktion Programm (z.B. C) Eingabe Compiler (Übersetzer) Assembler/ Maschinenprogramm 05.10.2015 Ablauf des Maschinenprogramm GDI - 3. imperative Programme 4 Algorithmus Ein Algorithmus ist unabhängig von der Umsetzung im Rechner ! Beispiele Man formuliere einen Algorithmus zum Durchlaufen des Studiums Ein Algorithmus zum Erstellen eines Apfelkuchens heißt Backrezept Partitur Spielanleitung Umwandlung von Dezimal- in Dualzahlen 05.10.2015 GDI - 3. imperative Programme 5 3.2 Algorithmus – Darstellung (I) Abstraktion und Algorithmenbeschreibungssprachen Vom Maschinenprogramm zum Assemblerprogramm (logische Bezeichner für Operationscode, logische Adressen) Abstraktion in höheren Programmiersprachen durch Verzicht auf Sprungbefehle und Sprungziele Einführung von Kontrollstrukturen wie Iteration, Alternative und Sequenz Durch Abstraktion gelangt man zu höheren Programmiersprachen und graphischen Sprachen als Algorithmenbeschreibungssprachen! Darstellung eines Algorithmus natürlichsprachlich (detailliert und explizit) graphisch: Flußdiagramme, Struktogramme, ... Pseudo-Code Formale Sprache 05.10.2015 GDI - 3. imperative Programme 6 Algorithmus – Darstellung (II) Natürlichsprachlich 1 // Berechne den ggT von a und b 2 Weise x den Wert von a zu 3 Weise y den Wert von b zu 4 Ist x ungleich y, weiter bei 5, sonst gehe zu 10 5 Ist x größer oder gleich y, weiter bei 6, sonst gehe zu 8 6 Weise x den Wert von (x – y) zu 7 Gehe zu 9 8 Weise y den Wert von (y – x) zu 9 Gehe zu 4 10 Weise ggT den Wert von x zu 05.10.2015 GDI - 3. imperative Programme 7 Algorithmus – Darstellung (III) Flußdiagramm DIN 66001 Vereinfachung Elemente Weise a den Wert von b zu a := b Aktion ja Bedingung Eingabe nein Ausgabe Anfang Ende 05.10.2015 GDI - 3. imperative Programme 8 Algorithmus – Darstellung (IV) Struktogramme / Nassi-Shneider-Diagramme 05.10.2015 GDI - 3. imperative Programme 9 Algorithmus – Darstellung (V) { Anweisung_1 Anweisung_2 ... Anweisung_n Pseudo-Code Sequenz } Iteration Verzweigung 05.10.2015 while Bedingung { Anweisung_1 ... Anweisung_n } if Bedingung { Anweisung_1 ... Anweisung_n } else { Anweisung_m ... Anweisung_k } GDI - 3. imperative Programme 10 Algorithmus - Beispiel Euklidischer Algorithmus für ggT in C Finde den größten gemeinsamen Teiler der beiden natürlichen Zahlen a und b Euklid { x = a; y = b; while x != y { if x > y { x = x – y; } else { y = y – x; } } return x; } 05.10.2015 GDI - 3. imperative Programme 11 Algorithmus Imperative Algorithmen Berechnung geschieht durch die Veränderung des Speichers Variablen (Container/Speicher mit Datentyp) sind Abstraktion des Speichers Veränderung von Variablen Auswertung eines Ausdrucks Speichern des Ergebnisses Zuweisung des Wertes des Ausdrucks an eine Variable Verwendung von Kontrollstrukturen S.a. Pseudo-Code Sequenz Alternative Iteration 05.10.2015 GDI - 3. imperative Programme 12 3.3 Variablen, Anweisungen und Ausdrücke 05.10.2015 GDI - 3. imperative Programme 13 Variablen Variablen - - Eine Variable dient zum Speichern von Informationen Sie wird durch einen einzigartigen Namen gekennzeichnet Darf nicht mit einer Ziffer beginnen Darf kein Leerzeichen enthalten Kann aus Buchstaben, Ziffern und Underscore (_) bestehen Jede Variable ist von einem bestimmten Typ (Datentyp: Text, ganze Zahl etc.) Jede Variable wird am Anfang des Programms (Procedure) deklariert Beispiele Modula 2 vs. C: int temp; float x; 05.10.2015 GDI - 3. imperative Programme 14 Ausdruck Ausdruck Zusammenfassung von mehreren Operationen, Variablen oder Elementen eines Datentyps Def.: Ausdruck Ist v eine Variable vom Typ D, so ist v auch ein Ausdruck vom Typ D Ist k eine Konstante vom Typ D, so ist k auch ein Ausdruck vom Typ D Sind t1, ..., tn Ausdrücke der Typen D1, ...,Dn und ist f:D1x...xDn D, so ist auch f(t1,...,tn) ein Ausdruck vom Typ D Wert eines Ausdrucks Evaluierung 05.10.2015 GDI - 3. imperative Programme 15 Zuweisungen Aufbau einer Zuweisung (Assignement) Basisform in EBNF: Assignment ::= Ident “=“ Expr Linke Seite enthält Ziel der Zuweisung - eine Variable (Identifier; Bezeichner). Rechte Seite enthält Wert der Zuweisung (Expression; Ausdruck). Zuweisungssymbol in C ist “=“. Beispiel: sum = sum + zähler Lies nicht „sum ist …“ sondern „sum wird zu …“ oder „sum ergibt sich aus …“. Regel: Typen müssen zuweisungskompatibel sein Linker Typ und rechter Typ sind gleich (z.B. Integer – bzw. int) oder Linker Typ schließt rechten Typ ein (Typhierarchie), z.B. long int int. 05.10.2015 GDI - 3. imperative Programme 16 Beispiel Vertauschen der Werte zweier Variablen 05.10.2015 GDI - 3. imperative Programme 17