Überblick
über die Lehrveranstaltung
"Einführung in die Informatik I"
im WS 1998/99; Dozent: Lagally
Begleitlektüre: Ludewig & Appelrath, "Skriptum Informatik", empfohlen
13.10.1998: Einführung: Organisatorisches
15.10.1998: einige Grundbegriffe
Ziel der Vorlesung: breiter Überblick
Informatik als Wissenschaft: Gliederung
Überblick über Programmiersprachen
Beispiel für
Objekte
und
Klassen
:
Ausgabefläche, potentiell unendlich (aus
Bibliothek
)
Attribut
: Schreibposition
Methoden
: Writeln, WriteString(s: String)
Zugriff über
Bibliotheksmodul
InOut
Ausblick auf OOP:
Vererbung
Hausaufgabe: Kapitel "Rechner" selbst durchlesen
20.10.1998: Information und Nachricht
Algorithmus: informell
erstes Programmbeispiel in MODULA: "Hello, World"
Information
und
Nachricht
;
Interpretation
äquivalente Repräsentationen; Codierungen
Sprache
:
Syntax
und
Semantik
Pragmatik
: soziale Übereinkunft
Abstraktion
: Unwesentliches weglassen
ein wenig naive
Mengenlehre
endliche Mengen, Grundoperationen
unendliche Mengen: Beispiel natürliche Zahlen
22.10.1998: Mengen
kartesisches Produkt: assoziativ
Rechenstruktur = "Algebra"
Einschub: was ist eine
Definition
:
Sprachregelung mit Gültigkeitsbereich
(dummes) Beispiel: "Quabbel"
Halbgruppe, Monoid
Zeichenvorrat
=
Alphabet
(synonym, hier ohne Anordnung)
Wörter
, Wortmengen,
freies Monoid
, leeres Wort
27.10.1998: Grammatiken
formale Sprache
= Wörtermenge (abzählbar)
Problem: endliche Beschreibung für unendliche Menge gesucht
Aufzählbarkeit, Entscheidbarkeit
Chomsky-Grammatiken
, Sprachklassen
Klassen 2 und 3: deute NT als
Wortmenge
Chomsky-Grammatiken als Erzeugungsverfahren,
Ableitung
Determinismus, Nichtdeterminismus
Entscheidungsverfahren: rate und verifiziere Ableitung
29.10.1998: Funktionen
Funktion
als statische Zuordnung zwischen Mengen
Definitionsbereich, Wertevorrat
totale und partielle Funktionen
Mengen von Funktionen:
M
-->
N
formale Parameter,
Bindung
, lokale Umbenennung
weitere Bindungsbeispiele:
Funktionen höherer Ordnung: Ableitung, Stammfunktion
03.11.1998: endliche Automaten
Funktionen mehrerer Veränderlicher
Beispiel Landkarte
Beispiel Höhenprofil: "Currying"
Funktionen auf Zeichenketten: Länge ist
Homomorphismus
endlicher Automat
am Beispiel Zigarettenautomat
Übergangsdiagramm
und
Übergangstafel
Ausgabe: hier nur kursorisch
Sprache der
zulässigen Eingaben
: regulär
Grammatik aus Tafel ablesbar und umgekehrt (Beispiel)
05.11.1998: Syntaxdiagramme
Übergangsdiagramm
, akzeptierte Wörter
duale Darstellung: vergiß Zustände, markiere Pfeile
Syntaxdiagramm
, beschreibt Wortmenge; vorerst nichtrekursiv
rekursives Einsetzen: --> Chomsky 2
Abarbeitung: Stapel von Kopien -->
Stack-Prinzip
Kellerautomat
Turing-Maschine
: einfach und allgemein; ineffizient
Marsfahrzeug "Pathfinder" als Modell für Turingmaschine
formale Definition der TM
10.11.1998: Turing-Maschine
Algorithmus
, Definition
Algorithmus realisieren durch geeignete
Maschine
Beispiel: Subtraktion in
Strichdarstellung
Übergangsfunktion
: hier als Matrix geschrieben (Currying)
weitere Beispiele
Universalität
(behauptet),
Church
-sche These
es gibt nicht berechenbare Funktionen!
Halteproblem, Äquivalenzproblem: allgemein unentscheidbar!
12.11.1998: Programmiersprache; Problemlösen
Übersetzen
von Programmiersprachen:
bedeutungsgleich
!
Analysephase
: lexikalisch, syntaktisch, semantisch
Einstieg in MODULA 2: lexikalische Ebene
Scanner:
reguläre Ausdrücke
, Syntaxdiagramme, endl. Automat
MODULA: Bezeichner, Zahlen, Zeichenketten
geschachtelte Kommentare: endlicher Automat genügt nicht!
Kellerautomat
; hier:
Zähler
reicht aus
Programmieren =
Problemlösen
Problem erkennen, analysieren
Lösungsweg suchen, formulieren, realisieren
Lösung berechnen
Problemlöse-Strategien
einfache, kleine Probleme: direkt lösen
strukturierte Probleme: zerlegen, Lösungen zusammensetzen
Rekursion
: Teilproblem ist Instanz der gleichen Problemklasse,
aber in wohldefiniertem Sinne
kleiner
: Terminierung ist klar!
17.11.1998: Sequentielle Programmierung, Datentypen, Klassen
Problemlöse-Strategien
einfache, kleine Probleme: direkt lösen
strukturierte Probleme: zerlegen, Lösungen zusammensetzen
Frage: Testaufwand versus Programmlänge? bestenfalls linear
Regel: keine zu frühe Festlegung von Einzelheiten!
Strukturierung sequentieller Programme
Struktogramme, einfache Ablaufstrukturen
Sequenz, Alternative, Mehrfachauswahl, Iteration
Vorschlag für bessere Notation (privat)
benötigt werden: Ausdrücke und Bedingungen
MODULA: oberste Ebene
"module", "import", "block"
Kontextbedingungen
einfaches Beispiel für komplettes Programm (2.1 aus L & A)
Datentyp
: Menge von Werten mit definierten Operationen
andere Sprechweise:
Klasse
:
Objekte
(Instanzen)
mit Attributen und Methoden
MODULA: Datentyp INTEGER mit definierten Operationen
MODULA: Datentyp BOOLEAN mit definierten Operationen
19.11.1998: maschinennahe Datentypen
maschineninterne Datentypen: BIT, WORD
technische Grundoperationen
Festpunktarithmetik: ohne Vorzeichen
Übertrag bei ADD, doppelt langes Resultat bei MUL
Festpunkt-Division: 2 Resultate, DIV und MOD in MODULA
MODULA: Datentyp
CARDINAL
negative Festpunktzahlen: Einerkomplement und Zweierkomplement
Ausblick auf Langzahl-Arithmetik
24.11.1998: Ablaufsteuerung
MODULA: benannte Konstanten, Gültigkeitsbereich!
MODULA: arithmetische Ausdrücke
MODULA: Fallunterscheidung mit "case"
MODULA: Relationen
MODULA: Fallunterscheidung mit "if", "then", "else", "elsif"
Struktogramme
26.11.1998: Rekursion; Terminierung
Funktionen
:
statischer
Zusammenhang vs. Algorithmus
berechenbar
: Algorithmus existiert (muß nicht sein!)
MODULA: Syntax Funktionsdeklaration
MODULA: Syntax Funktionsaufruf
Beispiel: Stellenwertdarstellung natürlicher Zahlen
Zifferndarstellung zur Basis 16:
HexDigit(n: cardinal): char
Vorbedingung
: 0 <= n < 16
Nachbedingung
: RESULT
in
{'0'..'9', 'A'..'F'}
definieren die
Korrektheit
; nicht notwendig abgeprüft!
Kontrakt
zwischen Anbieter und Aufrufer
Beispiel: bestimme die notwendige Stellenzahl
rekursiver Ansatz: Teilproblem ist kleiner!
Überlegung zur Korrektheit:
benutze den Satz: "jede nichtleere Menge natürlicher Zahlen hat ein kleinstes Element"
zeige, daß kein
"kleinster Verbrecher"
existiert, sonst gäbe es einen noch
echt
kleineren
das ist ein
versteckter Induktionsbeweis
!
das Beweisschema gilt für
alle
rekursiven Programme!
man muß nur jeweils eine geeignete
Problemgröße
definieren
Beispiel: Ausgabe einer Hexzahl in ein Feld gegebener Breite, führende Blanks
2 rekursive Aufrufe; nur einer mit
Zählschleife
(ad hoc)
Einpacken in Bibliotheksmodul:
Schnittstellenbeschreibung
Implementierung kommt erst später.
01.12.1998: Modul-Zerlegung, Variablenbegriff
Modul-Mechanismus
in MODULA: (mit Versions-Überprüfung)
"definition module", "implementation module",
Hauptprogramm zur Hex-Umrechnung
Variablen
für Eingabewerte;
ReadCard(x)
statische Variablen
im Hauptprogramm
lokale Variablen
in Prozedur
Wertzuweisung
Inkarnationen
, Laufzeitorganisation,
Aktivierungsblöcke
Gültigkeitsbereich
und
Lebensdauer
Referenzparameter
03.12.1997: Rekursion
Beispiel:
ggt(p, q)
rekursiv
suche kleinste Linearkombination
Terminierung?
Regel: bei rekursiven Prozeduren
niemals
den Aufrufbaum betrachten, sondern inneres Exemplar als
black box
!
Problemgröße
jeweils geeignet definieren (natürliche Zahl!)
hier Problemgröße:
max(p, q)
End-Rekursion entfernen (
nicht Prüfungsstoff!
)
Idee: Aktivierungsblock wiederverwenden
Wertparameter als lokale Hilfsgrößen
loop-
Konstrukt,
exit
08.12.1998: Skalare Typen; Attributierte Grammatiken
einige Mechanismen zur Erzeugung neuer Typen:
Aufzählungen
Boolean
als Aufzählungstyp
Unterbereiche
skalare Typen
allgemein
Schleife über skalaren Typ
Mengentypen
Beispiel: Türme von Hanoi
Modellierung durch rekursive Datenstruktur
Modellierung durch Attributierte Grammatik
Algorithmus analog zur Datenstruktur
Beispiel für Aufzählung und Bereichstyp
Gültigkeitsbereiche
10.12.1998: Syntax-Beschreibungsmechanismen; Zeit- und Speicheraufwand
Mechanismen zur Notation von Syntaxregeln: bisher bekannt:
Chomsky-Grammatiken
Syntaxdiagramme (einfach und auch rekursiv)
zusätzlich:
BNF
(ALGOL 60)
EBNF
: Beziehung zu Syntaxdiagrammen;
reguläre Ausdrücke
Aufwandsabschätzung
für Türme von Hanoi
Exkurs über
Differenzengleichungen
O(f(n))
-Notation (informell)
Beispiel: Fibonacci-Zahlen
rekursiver Ansatz:
Aufwand: exponentiell; abschätzen
(exakte Lösung unübersichtlich)
15.12.1998: dynamische Programmierung; Tabellen
Beispiel: Fibonacci-Zahlen (später in
vielen
Versionen!)
Fibonacci
:
Definitionsmodul
, exportiert
MaxArg = 24
Zusicherungen
in der Schnittstelle
Arten von Moduln (oder
Kapseln
):
Funktionsmodul (
keine
internen Objekte außer Konstanten)
Datenmodul: abstraktes Objekt
(interner Status)
Typenmodul: Menge von abstrakten Objekten
gleichen Typs
Implementierungsmodul
, rekursiv
bessere Lösung:
dynamic programming
(Terminus erklären)
Prinzip: berechne alle benötigten Teilprobleme in einer geeigneten Reihenfolge, jedes nur einmal;
hier gibt es für die zulässigen Eingabewerte nur endlich viele jemals benötigte Teilprobleme: vorweg berechnen und merken
MODULA:
"while"-Schleife
Fibonacci
: berechne Werte von unten nach oben, mit Umspeichern
MODULA: weitere Schleifenkonstrukte: "repeat", "loop", "exit"
Struktogrammdarstellung
ablegen in
Tabelle
: Array-Konzept
Regel: Grenzen bei Indizierung
immer
prüfen, falls man die Einhaltung nicht
statisch
zeigen kann!
MODULA: "array"-Syntax
Beispiele für Array: Verkehrsampel, Dreiervektoren
17.12.1998: Arrays, Schleifen abstrakte Datentypen
Fibonacci
: Ablage der Werte in Tabelle, vorbesetzen bei der
Initialisierung
des Moduls; bei Funktionsaufruf nachsehen:
O(1)
Fibonacci
: berechne Werte von unten nach oben, mit Hilfsfeld
Frage: woher kommt der Effizienzgewinn der iterativen Lösung? Die Erklärung im Buch (Verwendung von Variablen) stimmt nicht!
Idee: benachbarte Werte zusammenfassen
Konzept:
abstrakter Datentyp
:
Menge von Werten
Satz von Operationen
Regeln über das Verhalten
Realisierung braucht nicht bekannt zu sein!
Beispiel: ADT
Zahlenpaar
; Operationen:
Comb, First, Second
Term-Algebra
ist treues Modell
Fibonacci
: Annahme: Wert vom Typ
Paar
kann Funktionsresultat sein (stimmt leider nicht in MODULA!)
Rekursionsgleichung für benachbarte Paare ist
einstufig
rekursive Lösung hat linearen Aufwand!
Problem: Typ
Paar
soll Ergebnistyp sein; geht hier nicht
22.12.1998: Var-Parameter, mehrdimensionale Arrays, Prozedurtypen
Problem: Typ
Paar
soll Ergebnistyp sein; geht hier nicht
Ausweg in MODULA: Resultate als
var-Parameter
; Hilfsvariablen nötig, Eleganz der funktionalen Schreibweise geht verloren
intern wird das ohnehin so gemacht, aber dafür sind eigentlich Compiler da!
es ist immer noch derselbe Algorithmus, daher der lineare Aufwand!
mehrdimensionale Arrays
Matrix als Array von Zeilen;
Notation für
Mehrfach-Indizierung
Prozedurtypen
in MODULA
Beispiel: numerische Integration, Rechteckregel, Trapezregel
07.01.1999: Sets, Arrays, Strings
Komplexe Datentypen
in MODULA:
Sets
, BITSET, INCL, EXCL
Arrays
(schon teilweise besprochen)
Verwendung von
Zeichenreihenkonstanten
offene Array-Parameter
12.01.1999: Records
Komplexe Datentypen in MODULA:
Records
,
Selektoren
"with"-Statement
Varianten
Gültigkeitsbereiche
bei Records
Datentypen, Verbunde für Datum und Personendaten
Vergleichsoperationen
für Datum und Namen
Resultattyp:
VglTyp = (kl, gl, gr)
lexikographischer Vergleich
von Strings
14.01.1999: Pointers
Dynamische Speicherverwaltung
Zeigertypen
frei eingeführt
Halde
: ALLOCATE, DEALLOCATE, NEW, DISPOSE
Hinweis: Zeiger sind
keine festen Adressen
! Arithmetik unzulässig, nur Zuweisung, Vergleich und
Dereferenzierung
sind definiert
Begriff
Garbage-Collection
(keine Algorithmen)
19.01.1999: lineare Listen
ADT
Liste
funktionale Spezifikation
Term-Algebra als Modell
Definitionsmodul
opaker Typ
; motiviert mit festem Platzbedarf
Listen-Realisierung als
Geflecht
, rekursiv
21.01.1999: lineare Listen; Stacks
Listen-Realisierung als
Geflecht
, rekursiv
kopierende
Realisierung, flache und tiefe Kopie
iterative Realisierung,
Schleppzeigertechnik
Kopieren mit
Reißverschlußtechnik
Grundoperationen mit linearen Listen
welche Operationen mit verketteten Listen gehen mit
O(1)
?
eigene
Freilistenverwaltung
Standard-Typschema
Stack
(generisch!)
funktionale Spezifikation
Term-Algebra als Modell
Realisierung als
verkettete Liste
, funktional
dasselbe prozedural mit
Durchgangsparameter
26.01.1999: Schlangen
Standard-Typschema
Schlange
(generisch!)
funktionale Spezifikation
Term-Algebra als Modell
Realisierung als Geflecht, prozedural
28.01.1999: Schlangen
verkette Realisierung mit Kopfblock
verkette Realisierung als Ringliste
Sonderfall leere Schlange
Sonderfall einelementige Schlange
02.02.1999: endliche Schlangen; Binärbäume
Schlange endlicher Maximallänge
Realisierung als
Ringliste
im Array
mod
versus explizite Ende-Abfrage
Standard-Typschema
Binärbaum
(generisch!)
funktionale Spezifikation
Term-Algebra als Modell
Realisierung als Geflecht
Durchwanderung
: prefix, infix, postfix
Beispiele:
Strukturbaum
einer Formel
prefix gibt Funktions-Termdarstellung
infix gibt Infix-Notation
postfix gibt Operationenfolge für
UPN-Rechner
04.02.1999: allgemeine Bäume und Wälder; Suchbäume
Darstellung
allgemeiner Bäume
und
Wälder
äquivalenter Binärbaum
, Durchwanderungen analog
Standard-Typschema
Suchbaum
(generisch!)
Infix-Durchwanderung gibt sortierte Folge
Entartungsfall
:
Balancierung
nötig; keine Algorithmen
Realisierung als Geflecht
Eintragen
, rekursiv
Suchen
, rekursiv
09.02.1999: Suchen, allgemein
Suchen
in allgemeinen Datenstrukturen
(Zustandsmodell)
rekursiver Ansatz
iterativer Ansatz
Binäres Suchen
im Suchbaum
Binäres Suchen
in Tabelle
11.02.1999: Ergänzungen
Aushängen
aus einem Suchbaum
Grundidee der Streuspeicherverfahren (Hashing)
Gerichtete Graphen
; Darstellungen:
Liste von Knoten und Kanten
Adjazenzmatrix
Liste der Vorgänger bzw. Nachfolger je Knoten
binäre Relationen
als gerichtete Graphen
ungerichtete Graphen
als Sonderfall
Labyrinth-Algorithmus (als Anekdote)
Ende WS 1998/99
Klaus Lagally
, 11. Februar 1999, 18:32