Technische Universität München Fakultät für Informatik Prof. Dr. M. Broy SS 2002 Übungsblatt 1 17. April 2002 Übungen zu Einführung in die Informatik II Aufgabe 1 Funktionale Programmierung Hinweis: Die in dieser Aufgabe zu formulierenden Rechenvorschriften können in Gofer oder in Vorlesungsnotation angegeben werden! Die Rechenstruktur SEQ sei wie in der Vorlesung definiert! a) Es bezeichne ls eine Sequenz von Sequenzen der Sorte m, d.h. ls ist von der Sorte seq seq m. Die Funktion addFirst fügt ein Element x der Sorte m am Anfang jedes Elements von ls an. Formulieren Sie unter Verwendung applikativer Programmiertechniken eine Rechenvorschrift, die die Funktion addFirst implementiert! Gegeben sei eine Sequenz xs von paarweise verschiedenen Elementen der Sorte m. Gesucht ist eine Sequenz der Sorte seq seq m, die alle Untersequenzen von xs enthält (Bemerkung: Eine Untersequenz entsteht aus einer Sequenz xs durch Streichen beliebig vieler Elemente). b) Formulieren Sie kurz die Grundidee Ihres Algorithmus! c) Geben Sie unter Verwendung applikativer Programmiertechniken eine Rechenvorschrift an, die die Sequenz aller Untersequenzen von xs berechnet! (Hinweis: Der Einsatz der Funktion addFirst aus Teilaufgabe a) ist bei der Lösung dieser Aufgabe hilfreich!) Aufgabe 2 Zuweisungsorientierte Programmierung Jede natürliche Zahl n 2 ist entweder selbst eine Primzahl oder lässt sich als Produkt von Primzahlen schreiben; d. h. in Primfaktoren zerlegen, z. B. 120 2 2 2 3 5. In dieser Aufgabe ist ein zuweisungsorientiertes Programm (Vorlesungsnotation oder Pascal) proc primfak = (nat n) zu entwickeln, das eine natürliche Zahl n 2 in Primfaktoren zerlegt und das Ergebnis auf dem Bildschirm ausgibt; z. B. primfak(120) soll die Ausgabe 2 2 2 3 5 liefern. Hinweis: Sie können folgende Hilfsfunktionen und -prozeduren verwenden: fct mod = (nat n, nat k) nat Rest der ganzzahligen Division n durch k fct div = (nat n, nat k) nat ganzzahlige Division n durch k proc writeNat = (nat n) Ausgabe einer Zahl auf dem Bildschirm a) Implementieren Sie zuweisungsorientiert eine Prozedur test, die mit zwei natürlichen Zah: i n j aufruft. len i j 2 parametrisiert ist und primfak für alle n –2– b) Implementieren Sie eine Funktion fct kleinsterTeiler = (nat n) nat, die für eine natürliche Zahl n die kleinste natürliche Zahl d 1 ermittelt, die n ohne Rest teilt. c) Implementieren Sie die Prozedur primfak. Aufgabe 3 Zusicherungskalkül für Schleifen Gegeben sei die Pascal-Funktion summe(n : Integer):Integer, zur Berechnung der Summe der ersten n natürlichen Zahlen. procedure summe (n : Integer):Integer; var i, s :Integer; begin {n >= 0} i := 0; s := 0; while i<n do begin i := i + 1; s := s + i; end; summe := s; end; {summe = n*(n+1)/2} Das Programm ist bereits teilweise annotiert. Fügen Sie die fehlenden Annotationen korrekt ein. Aufgabe 4 (P) Enumerierte Sorten und Tupelsorten a) Definieren Sie jeweils in Pascal: Eine Sorte für die Monate und Tage eines Kalenderjahres Eine Tupelsorte für das Datum Eine Tupelsorte die den Vornamen, den Nachnamen und das Geburtsdatum einer Person enthält Ein Feld, in das 100 Personen eingetragen werden können b) Geben Sie ein Pascalprogramm zur Eingabe und Ausgabe der Personendaten an!