Universität Bremen  
  Universität Bremen FB3 TZI BISS  
  AG BS > Lehre > SoSe 2003 > Deutsch
English
 

Praktische Informatik 2, SoSe 2003

 

Auf dieser Seite werden während des Semesters weiterführende Informationen sowie die jeweiligen Aufgabenblätter bereitgestellt.

Inhalt dieser Seite:


Termine

Vorlesung:

Mo. 10 - 12 Uhr
Raum 0070, Gebäude GW1 HS

Übungen:

Gruppe 1Mo. 13 - 15 UhrThorsten ScholzMZH 7220
Gruppe 2Mo. 13 - 15 UhrStefan BisanzMZH 7230
Gruppe 3Mo. 13 - 15 UhrUlrich HannemannMZH 7250
Gruppe 4Mo. 13 - 15 UhrJan BrederekeMZH 7260
Gruppe 5Di. 08 - 10 UhrStefan HansenMZH 6240
Gruppe 6Di. 08 - 10 UhrHendrik MangelsMZH 7210
Gruppe 7Di. 08 - 10 UhrDennis WalterMZH 7220
Gruppe 8Do. 15 - 17 UhrYang YiMZH 7230
Gruppe 9Do. 15 - 17 UhrUlrich HannemannMZH 7250
Gruppe 10Do. 15 - 17 UhrThomas VögeleMZH 7260

Aufgabenblätter

Die Lösungen zu den Aufgabenblättern müssen mit LaTeX gesetzt werden, dabei sollen die Vorgaben aus pi2-muster.tex und der Hilfsdatei defs.tex verwendet werden.
Für die Bewertung der Programmieraufgaben haben wir unsere Grundzüge aufgeschrieben, ebenso wie Hinweise zum Kommentieren und Testen der Programme.
Montag, 28. April: Die erste Aufgabenserie ist hier im postscript Format und hier als PDF zu finden. Die PDF-Version deckt sich JETZT mit der Postscript-Variante - die vorherige war unvollständig.
Montag, 12. Mai: Die zweite Aufgabenserie ist hier im postscript Format und hier als PDF zu finden. Für die zweite Aufgabe hier noch einmal der Link zur vollständige Java-Syntaxspezifikation in EBNF-Notation: SCJP-Grammatik.
Montag, 26. Mai: Die dritte Aufgabenserie ist hier im postscript Format und hier als PDF zu finden. Um Eingaben über die Kommandozeile zu verarbeiten, kann die Klasse Input.java benutzt werden. Da wegen Himmelfahrt und Pfingsten diverse Übungstermine ausgefallen sind, wird die Abgabe der Serie 3 auf 16. 06. - 19. 06. verschoben!
Mittwoch, 11.Juni: Wir veröffentlichen schon die vierte Aufgabenserie im postscript Format und als PDF . Bei der Lösung hilft neben der Vorlesung ganz konkret folgender Java-Schnipsel. Hier noch der Link zur Dokumentation von java.lang.reflect . Zum Testen Eures Forschers hat Jan Bredereke zwei marsianische Gäste aus dem vorigen Jahr zur Verfügung gestellt: einen minimalen Marsianer und einen recht komplexen Marsianer , der zudem auch noch von einem Supermarsianer erbt. Die Abgabe der Serie 4 ist bereits vom 23. 06 - 26. 06.!
Montag, 23. Juni: Die fünfte Aufgabenserie ist hier im postscript Format und hier als PDF zu finden. In der ersten Fassung hatten sich leider Fipptehler eingeschlichen, die Klasse Graph soll für den Suchalgorithmus eine Methode public void breitenSuche(IVertex v0, IProperty eigenschaft, IAction aktion) besitzen, d.h. die Parameter müssen den Interfaces entsprechen.


Das PI2-Team

Unermüdlich arbeiten für Euch:

Vorlesung

Prof. Dr. Jan Peleska, jp@informatik.uni-bremen.de

Übungen

Organisation:
Ulrich Hannemann, ulrichh@informatik.uni-bremen.de

Übungsgruppenleiter:

  • Stefan Bisanz, alien@tzi.de
  • Dr. Jan Bredereke, brederek@tzi.de
  • Ulrich Hannemann, ulrichh@tzi.de
  • Stefan Hansen, beeswax@tzi.de
  • Hendrik Mangels, mangels@tzi.de
  • Thorsten Scholz, scholz@tzi.de
  • Thomas Vögele, vogele@tzi.de
  • Dennis Walter, dw@tzi.de
  • Yang Yi, yangyi@tzi.de

Prüfungen

Scheinkriterien

In der Vorlesung am 28.4.2003 wurden folgende Scheinkriterien vereinbart:

  • Es gibt n Übungszettel (ca. 14-tägig),
    davon sind n Zettel abzugeben.
  • 60% der Aufgaben dieser n Übungszettel müssen erfolgreich gelöst worden sein, um zum Schein-Fachgespräch zugelassen zu werden.
  • Das Fachgespräch findet mit je einer Abgabe-Gruppe statt und dauert ca. 15-20 min.
    • Jeder bekommt eine eigene Note.
    • Es ist (als Einzelprüfung) wiederholbar (ggf. auch für eine bessere Note), dann bei Jan Peleska.

Leistungsnachweise

Wer einen Leistungsnachweis erhalten möchte, muß ein vorausgefülltes Formular zum Fachgespräch mitbringen!

Falls Ihr aus irgendwelchen Grüunden zum vereinbarten Termin verhindert sein solltet, setzt Euch bitte mit dem jeweiligen Mitarbeiter in Verbindung. Meldet Euch für die Einzelnachprüfungstermin bitte direkt bei Jan Peleska, jp@informatik.uni-bremen.de, an!


Fachgespräche

Die Fachgespräche finden statt:
Dienstag, 22. Juli Ulrich HannemannMZH 7220
Dienstag, 22. JuliJan Bredereke MZH 7250
Mittwoch, 23. JuliStefan Bisanz MZH 8120
Donnerstag, 24. JuliThorsten ScholzTZI
Montag, 28. Juli Thomas VögeleMZH 7210
Dienstag, 29. JuliJan BrederekeMZH 7210
Dienstag, 29. JuliThomas VögeleMZH 7220
Dienstag, 29. Juli Ulrich HannemannMZH 7250
Mittwoch, 30. JuliStefan BisanzMZH 7210
Donnerstag, 31. JuliThorsten ScholzMZH 7220
Montag, 11. AugustStefan BisanzMZH 7210

Struktur der Veranstaltung

Die Veranstaltung wird dieses Semester in zwei Bereiche gegliedert:

  • In der Vorlesung werden die Themenbereiche der Praktischen Informatik im Überblick vorgestellt. Wir versuchen, Fragestellungen und ihre Lösungen zu motivieren, Schwerpunkte zu setzen, Zusammenhänge deutlich zu machen, wichtige Probleme zu verdeutlichen und ganz allgemein den Zuhörern Appetit auf weitere Vertiefung des Lehrstoffs zu machen.
  • In den Übungen wird der Stoff aus der Vorlesung noch einmal diskutiert, insbesondere indem auf die Inhalte der begleitenden Übungsblätter eingegangen wird. Weiterhin werden allgemeine Problem und gute Vorgehensweisen bei der Lösung der Übungsaufgaben (auch von Euch) vorgestellt. Natürlich sollte hier auch immer noch genug Zeit bleiben, um auf allgemeine Verständnisfragen aus der Vorlesung einzugehen.

Veranstaltungsinhalte im Detail

Die folgende Liste von Lerninhalten wird im Laufe des Semesters fortgeschrieben. Sie dient als Checkliste, mit welchen Themen und Begriffen die Veranstaltungsteilnehmer vertraut werden sollten. Eine "Session" entspricht einer zusammengehörigen Lerneinheit, sie muß nicht notwendig in genau einer Vorlesung abgehandelt werden.

Wiederholung: Beispielimplementierungen zu Hashing-Verfahren, welche in der Vorlesung PI 1 vorgestellt wurden, finden sich hier: MyHash.java sowie MyHashS.java.

Session 0: Syntax, Grammatik und Algorithmen für die Syntaxprüfung

  • Syntax: Die möglichen Zeichenfolgen einer gegebenen Sprache.
  • Semantik: Die Bedeutung der Sprachkonstrukte:
    • Statische Semantik: Die Bedeutung der verwendeten Daten- und Klassentypen sowie die logischen Abhängigkeiten untereinander.
    • Dynamische Semantik (Verhaltenssemantik): Die durch Programmausführung bewirkte Erzeugung/Vernichtung/Änderung von Variablen, Dateien (allgemeiner Objekten), sowie die an den Programmschnittstellen sichtbar werdenden Ein-/Ausgaben.
  • Semiotik: Die Lehre von den Symbolen und ihrer Bedeutung.
  • Grammatik: Spezifikation der erlaubten Zeichenfolgen einer Syntax.
  • Notation zum Beschreiben von Java-Grammatiken siehe [Balzert, pp.91-94]:
    • Java-spezifische Notation: Von Gosling eingeführte Spezialnotation für Java-Syntax, beschrieben in The Java Language Specification, http://java.sun.com/docs/books/jls/index.html, Abschnitten 2.4 und 18.1. Die dort enthaltene vollständige Spezifikation der Java-Syntax ist leider fehlerhaft. Nach unserer Einschätzung hat und wird sich die Java-spezifische Notationstechnik langfristig nicht duchsetzen; wir werden uns in der Vorlesung deshalb nur mit den folgenden 2 Techniken zur Syntaxdefinition befassen. Diese werden heutzutage für beliebige formale Sprachen angewandt.
    • Extended Backus-Naur Form: Eine textuelle Spezifikationsform für Grammatiken. Ist u.a. besonders attraktiv, weil verschiedene Werkzeuge existieren (z.B. yacc und bison), die aus EBNF-Spezifikationen automatisch Syntax Checker (Prüfprogramme für die Korrektheit eines Programmtextes in Bezug auf die Einhaltung der grammatischen Regeln) erzeugen.
    • Syntaxdiagramme: Alternativ zur EBNF-Notation können grammatikalische Regeln durch eine anschauliche Graph-Notation spezifiziert werden.
  • Alphabet: Menge der als logische Einheit zusammengehörigen Zeichenketten der Sprache. Die Elemente des Alphabets heissen Tokens oder gleichbedeutend Lexeme. Beispiel Java: Die reservierten Worte und Zeichen der Sprache (class, if, else, do, while, ';', '{', '}', ...) sind Lexeme aus dem Java-Alphabet. Zusätzlich können Nutzer noch eigene Tokens einführen (Namen für Klassen, Konstanten, Variablen, Methoden, Literale, ...). Das Java-Alphabet ist daher unbeschränkt.
  • Lexikalische Struktur von Java: Unicode, Eingabeelemente, Tokens, Bezeichner, Schlüsselworte, Literale, Separatoren, Operatoren
  • Lexikalische Grammatik: Spezifikation der zum Sprachalphabet gehörigen Tokens.
  • Syntaktische Grammatik: Spezifikation der in der Sprache erlaubten Folgen von Tokens.
  • Einführung in die syntaktische Struktur von Java: Übersetzungseinheit (Compilation Unit), Package Declarations, Import Declarations, Type Declarations. Klassen sind spezielle Typdeklarationen; daher sind Methoden, Variablendeklarationen usw. alle dem Bereich 'Typdeklarationen' zuzuordnen, denn diese müssen immer innerhalb einer Klassendeklaration erfolgen.
  • Scanner: Teil eines Compilers, der für die Erkennung der einzelnen Tokens in der das Programm repräsentierenden Zeichenkette zuständig ist.
  • Syntax Checker: Teil eines Compilers, der für das Prüfen des zu übersetzenden Programms gegen die syntaktische Grammatik zuständig ist.
  • Parser: Kombination des Syntax Checkers mit einer Einheit zum Aufbau des Parse Trees, auf dessen Basis dann die Transformation in Objektcode (Java: Bytecode) erfolgen kann.
  • EBNF (Extended Backus-Naur Form) Notation zur Spezifikation kontext-freier Grammatiken: Jede EBNF-Spezifikation besteht aus
    • Jede EBNF-Spezifikation besteht aus Produktionsregeln der Form
      <Name der Produktionsregel> ::= ... Spezifikation der Produktionsregel ...
    • Eine spezielle Produktionsregel - das Zielsymbol (Goal Symbol) wird markiert, bei der die Syntaxprüfung zu beginnen hat. Beispiel: In der Java-Grammatik heisst das Zielsymbol, mit dem alle Interpretationen beginnen, CompilationUnit.
    • Die Namen der Produktionsregeln heissen auch nicht-terminale Symbole.
    • In den rechten Seiten der Produktionsregeln können Tokens (hier dann terminale Symbole genannt) oder Verweise auf andere Produktionsregeln auftreten.
    • In den rechten Seiten der Produktionsregeln werden nicht-terminale oder terminale Symbole, die in der Sprache nacheinander aufzutreten haben, sequenziell aufgeführt. Alternativen zwischen mehreren nicht-terminalen oder terminalen Symbolen werden durch | gekennzeichet. Optionale nicht-terminale oder terminale Symbole werden in [...] eingeschlossen. Beliebig oft (keinmal oder mehrmals) auftretende nicht-terminale oder terminale Symbole werden in {...} eingeschlossen. Die Referenzen auf Produktionsregeln in Form von nicht-terminalen Symbolen dürfen rekursiv verwendet werden. Damit ist die Spezifikation von Sprachen mit unbeschränkt langen Sätzen (also z.B. Computerprogrammen) möglich.

Hintergrundinformationen zu Session 0

Einschub: Ausnahmebehandlung

CExceptionExample2 demonstriert die Verwendung von Ausnahmen und deren Behandlung.

Session 1: Merkmale objekt-orientierter Programmiersprachen

Hier findet Ihr "Die wichtigsten Stichworte und Fakten zum Thema Objekt-Orientierte Programmiersprachen und OO in Java."

Das Beispiel mit der Datum-Klasse von Stefan Bisanz demonstriert zum einen das Geheimnisprinzip, und außerdem zeigt es, wie man gute Dokumentation mit Javadoc schreiben kann.

Zum Thema Reflektion sind hier einige Ergänzungen zu den Fragmenten aus der Vorlesung vom 16. Juni. Man erfährt zudem noch etwas über Interfaces, Exceptions, Vererbung, Modifier, Overloading und die Implementierung eines endlichen Stacks. Ein Interface: MyComparable.java, eine Klasse, die von Exception erbt: MyFiniteStackException.java, eine Sammlung von endlichen Stacks: MyFiniteStack.java, und schließlich MyMain.java, in welchem die Aufrufe aus dem Reflektionspaket verwendet werden.

Session 3: Algorithmen und Datenstrukturen

Transitionssysteme

  • Definition Transitionssystem:

    Als ein allgemeiner abstrakter Datentyp wurden in der Vorlesung Transitionssysteme eingeführt:

    Definition: Ein Transitionssystem (englisch Labelled Transition System) ist ein Quadrupel LTS = (S,S0,A,T) mit folgenden Eigenschaften:

    • S ist eine endliche Menge, deren Elemente die Zustände von LTS genannt werden.
    • S0 ist eine Teilmenge von S, deren Elemente die Anfangszustände von LTS genannt werden.
    • A ist eine endliche Menge, genannt das Alphabet von LTS. Die Elemente von A heissen Markierungen oder Label von LTS.
    • T ist eine Teilmenge von S × A × S (also eine dreistellige Relation), die Menge der Transitionen von LTS.

    Ein Transitionssystem heisst deterministisch, wenn folgende Bedingungen beide erfüllt sind:

    • S0 enthält genau ein Element
    • Wenn (z0,a,z1) eine Transition aus T ist, dann folgt für alle (w0,b,w1) aus T mit w0 = z0 und b = a auch w1 = z1.

    Eine Ausführung (englisch Execution) eines Transitionssystems LTS = (S,S0,A,T) ist eine Folge (z0,a0,z1,a1,z2,a2, ... ), so dass folgende Bedingungen erfüllt sind:

    • z0 ist ein Element von S0
    • Für alle i = 0,1,2,... gilt: (zi,ai,zi+1) ist eine Transition aus T.

Breitensuche auf (gerichteten) Graphen

Gegeben ist ein Graph (V,E) dessen Knoten vi jeweils eine Adjazenzliste adjlist(vi) verwalten. Zusätzlich wird eine Distanzliste d eingerichtet, die den Abstand zum Initialknoten abspeichern wird.

   Für alle  v   aus  V : d[v] = -1  
   u0 = v0 ;
   q = <  u0 > ; 
   d[u0] = 0 ;
   WHILE q != < > DO
                u0 = head(q) ; q = tail(q) ;
                d0 = d[u0] ;
                IF (hasProperty(u0,...) )
                       THEN process(u0,...) ;
                FOR v in adjlist(u0) DO                               
                      IF d[v] < 0 THEN     
                           q = append(q , < v >) ;
                           d[v] = d0 + 1 ;

Binäre Bäume:

Den Umgang mit binären Bäumen erlätern die Programme
BinaryTree.java, BtMain.java

Session4 : Formale Verifikation sequentieller Programme

Beweisregeln für sequentielle Programme:
Axiom für die leere Anweisung
{PRE} ; {PRE}
Zuweisungsaxiom
{p[x:=expr]} x = expr; {p}
Konsequenzregel 1
Wenn {p} S {q} und q => r gelten,
dann gilt auch {p} S {r}.
Konsequenzregel 2
Wenn o => p und {p} S {q} gelten,
dann gilt auch {o} S {q}.
Sequenzregel
Wenn {p} S1 {r} und {r} S2 {q} gelten,
dann gilt auch {p} S1; S2 {q}.
Bedingungsregel
Wenn {p AND B} S1 {q} und {p AND NOT B} S2 {q} gelten,
dann gilt auch {p} if (B) S1 else S2 {q}.
Schleifenregel
Wenn {p AND B} S {p} gilt,
dann gilt auch {p} while (B) S {p AND NOT B}
Ein Verifikationsbeispiel findet man hier . Aktualisierte Fassung vom 11.07.2003.

Session 5: Grafik in Java

Der Stoff dieser Session ist für das Fachgespräch nicht relevant.


empfohlene Literatur und Online-Dokumentation


Hintergrundinformationen

 
   
Autor: jp
 
  AG Betriebssysteme, Verteilte Systeme 
Zuletzt geändert am: 2. November 2022   Impressum