Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 1 Gegeben sei die Prozedur BubbleSort: procedure BubbleSort(var ioFeld:tFeld); { } var hilf:integer; i:tIndex; j:tIndex; vertauscht:boolean; begin i:=1; repeat vertauscht := false; for j := 1 to N - i do begin if (ioFeld[j]>ioFeld[j+1]) then begin hilf:=ioFeld[j]; ioFeld[j]:=ioFeld[j+1]; ioFeld[j+1]:=hilf; vertauscht := true end; end; i := i + 1 until ((i=N) or (not vertauscht)) end a) Überlegen Sie sich, was das Programm leistet und wie es dabei vorgeht. Ergänzen Sie in der Prozedur einen erklärenden Kommentar an der grau eingefärbten Stelle. b) Was ist die Zeitkomplexität des BubbleSort? Bester Fall Komplexität: Durchschnittlicher Fall Komplexität: Schlechtester Fall Komplexität: 1 Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 2 Schreiben Sie eine Pascal-Prozedur transponiereMatrix, die als Parameter eine quadratische Matrix von integer-Werten erhält und diese Matrix transponiert, also die Zeilen und Spalten der Matrix vertauscht, wie im folgenden Beispiel gezeigt ist: Verwenden Sie dazu die folgenden Definitionen: const ZEILENSPALTENMAX = 5; type tZeileSpalte = 1..ZEILENSPALTENMAX; tMatrix = array [tZeileSpalte, tZeileSpalte] of integer; 2 Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 3 Gegeben seien die folgenden Typdefinitionen für Knoten eines binären Suchbaums und Elemente einer linearen Liste: type tRefBBKnoten = ^tBBKnoten; tBBKnoten = record info:integer; links, rechts:tRefBBKnoten end; tRefElement = ^tElement; tElement = record info:integer; next:tRefElement end; Schreiben Sie eine Pascal-Funktion Baumpfad, welche einen nicht leeren Suchbaum sowie einen Suchwert übergeben bekommt und dazu alle Werte auf dem Suchpfad von der Wurzel des Suchbaums zum ersten Vorkommen des Suchwerts (jeweils inklusive) in einer Liste ablegt und diese zurückgibt. Ist der gesuchte Wert nicht im Baum enthalten, so soll eine leere Liste (also ein Zeiger mit Wert nil) zurückgegeben werden. Durchlaufen Sie dazu in Ihrer Funktion den Suchbaum iterativ und fügen Sie während des Durchlaufs die gefundenen Werte hinten an eine (neu zu erstellende) Liste an. Wird der Suchwert nicht gefunden, ist die aufgebaute Liste wieder komplett zu löschen. 3 Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 4 Gegeben seien die folgenden Typdefinitionen für Knoten eines Binärbaums in Pascal: type tRefBBKnoten = ^tBBKnoten; tBBKnoten = record info:integer; links, rechts:tRefBBKnoten end; Gesucht ist eine rekursive Pascal-Prozedur, die einen übergebenen Binärbaum in „inorder“Reihenfolge durchläuft (Links-Mitte-Rechts) und dabei eine bestimmte Folge von Zahlen auf die Standardausgabe schreibt: Bei jedem Knotenbesuch ist das Maximum der Knotenwerte aller bis dahin durchlaufenen Baumknoten (einschließlich des gerade besuchten) auszugeben. Für den im Folgenden abgebildeten Baum ergibt sich z.B. die Ausgabe: -2 4 5 6 6 6. 4 Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 5 Eine Prozedur, die für eine natürliche Zahl bestimmt, ob diese durch 3 oder durch 9 teilbar ist, soll einem funktionsorientierten Test unterzogen werden. Bekannt seien die Typdefinitionen sowie der Prozedurkopf: type tNatZahl=1..maxint; procedure divDreiNeun(inZ:tNatZahl;var outDrei:boolean; var outNeun:boolean); {ermittelt, ob die Eingabe inZ durch die Zahlen 3 bzw. 9 teilbar ist.} Geben Sie eine für einen Black-Box-Test sinnvolle Zerlegung der Menge der zulässigen Eingabedaten in Äquivalenzklassen an. Geben Sie hierbei zu jeder Äquivalenzklasse jeweils ein Testdatum an. 5 Kurs 1613 „Einführung in die imperative Programmierung“ Aufgabe 6 Die Funktion aus Aufgabe 5 benutzt für die Tests auf Teilbarkeit die Quersumme der eingegebenen Zahl. Für die Berechnung der Quersumme bieten wir als Lösung folgendes Programm an: program QuersummeF (input, output); { soll die Quersumme einer nicht-negativen integer-Zahl berechnen } type tNatZahl = 0..maxint; var Quer, Rest : tNatZahl; begin readln (Rest); Quer := 0; while Rest > 0 do begin Quer := Rest mod 10; Rest := Rest div 10 end; writeln (Quer) end. { QuersummeF } a) Zeichnen Sie den kompakten Kontrollflussgraphen zum Programm QuersummeF. b) Geben Sie Pfade im Kontrollflussgraphen für einen Zweigüberdeckungstest an. Geben Sie je ein entsprechendes Testdatum an. c) Wie unterscheidet sich der boundary interior-Pfadtest (interior-Test mit n=2) für das Programm QuersummeF vom Zweigüberdeckungstest aus Teil b) dieser Aufgabe? Geben Sie falls nötig weitere Testdaten an. Ist es möglich, dass auch dieses Testverfahren den Fehler im Programm nicht aufdeckt? Begründen Sie Ihre Antwort. 6