• Keine Ergebnisse gefunden

Fachbereich Informatik INF FernUniversität

N/A
N/A
Protected

Academic year: 2022

Aktie "Fachbereich Informatik INF FernUniversität"

Copied!
29
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

INF

FERNUNIVERSITÄT Gesamthochschule

D-58084 Hagen

Fachbereich Informatik

Kurs:

Korrektur: Datum:

©2000 FernUniversität - Gesamthochschule in Hagen

Hörerstatus:

( ) Vollzeitstudent ( ) Teilzeitstudent ( ) Zweithörer ( ) Gasthörer

Klausurort:

Postanschrift: FernUniversität D - 58084 Hagen Name, Vorname

Straße, Nr.

PLZ, Wohnort

1612 "Konzepte imperativer Programmierung"

Hauptklausur am 2. März 2002

( ) Berlin ( ) Bochum ( ) Frankfurt ( ) Hamburg ( ) Karlsruhe ( ) Kassel ( ) Köln ( ) München ( ) Bregenz ( ) Wien

( ) . . . .

Aufgabe 1 2 3 4 5 6 7 8 Summe

erreichbare Punktzahl 6 8 10 10 8 9 6 11 68

bearbeitet

erreichte Punktzahl

(2)

Wintersemester 2001/2002 Hinweise zur Bearbeitung der Klausur

zum Kurs 1612 “Konzepte imperativer Programmierung”

Wir begrüßen Sie zur Klausur "Konzepte imperativer Programmierung". Lesen Sie sich die- se Hinweise vollständig und aufmerksam durch, bevor Sie mit der Bearbeitung der Aufgaben beginnen:

1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst:

- 2 Deckblätter,

- 1 Formblatt für eine Bescheinigung für das Finanzamt, - diese Hinweise zur Bearbeitung,

- 8 Aufgaben (Seite 2 - Seite 22), - die Muß-Regeln des Programmierstils, - die Hoare-Regeln

- die Definition der Terminierungsfunktion.

2. Füllen Sie, bevor Sie mit der Bearbeitung der Aufgaben beginnen, folgende Seiten des Klausurexemplares aus:

a) BEIDE Deckblätter mit Namen, Anschrift sowie Matrikelnummer. Markieren Sie vor der Abgabe auf beiden Deckblättern die von Ihnen bearbeiteten Aufgaben.

b) Falls Sie eine Teilnahmebescheinigung für das Finanzamt wünschen, füllen Sie bitte das entsprechende Formblatt aus.

Nur wenn Sie beide Deckblätter vollständig ausgefüllt haben, können wir Ihre Klausur korrigieren!

3. Schreiben Sie Ihre Lösungen auf den freien Teil der Seite unterhalb der Aufgabe bzw.

auf die leeren Folgeseiten. Sollte dies nicht möglich sein, so vermerken Sie, auf welcher Seite die Lösung zu finden ist. Streichen Sie ungültige Lösungen deutlich durch.

4. Schreiben Sie auf jedem von Ihnen beschriebenen Blatt oben links Ihren Namen und oben rechts Ihre Matrikelnummer. Wenn Sie weitere eigene Blätter benutzt haben, heften Sie auch diese, mit Name und Matrikelnummer versehen, an Ihr Klausurexemplar. Nur dann werden auch Lösungen außerhalb Ihres Klausurexemplares gewertet!

5. Neben unbeschriebenem Konzeptpapier und Schreibzeug (Füller oder Kugelschreiber) sind keine weiteren Hilfsmittel zugelassen. Die Muß-Regeln des Programmierstils, die Tabelle mit den im Kurs verwendeten Hoare-Regeln und die Definition der Terminie- rungsfunktion finden Sie im Anschluß an die Aufgabenstellung.

6. Es sind maximal 68 Punkte erreichbar. Sie haben die Klausur sicher dann bestanden, wenn Sie mindestens 34 Punkte erreicht haben.

Wir wünschen Ihnen bei der Bearbeitung der Klausur viel Erfolg!

(3)

Aufgabe 1 (6 Punkte)

Eine natürliche Zahl n heißt perfekt, wenn n als Summe aller natürlicher Zahlen i (1≤i≤ ), durch die n ohne Rest teilbar ist, dargestellt werden kann. Die Zahl 28 ist beispielsweise eine perfekte Zahl. Es ist 28=1+2+4+7+14 und 1, 2, 4, 7 und 14 sind genau alle Zahlen, durch die 28 ohne Rest teilbar ist. Schreiben Sie ein Programm perfekteZahl, das alle perfekten Zahlen zwi- schen 1 und 1000 auf dem Bildschirm ausgibt.

n 2---

(4)
(5)

Aufgabe 2 (8 Punkte)

Ein Handlungsreisender mussMAXORTSZAHLStädte besuchen (MAXORTSZAHL > 1) und möchte da- für eine Reise planen, bei der jede Stadt genau einmal besucht wird. Aus Sparsamkeits- und Umwelt- schutzgründen sollte die Reise möglichst kurz sein.

Es soll eine PASCAL-ProzedurReiseentwickelt werden, die eine Reise ermittelt und die Ortsnum- mern in der Reihenfolge der Reise sowie die insgesamt zu fahrenden Kilometer ausgibt. Dazu wird der Prozedur eine Entfernungsmatrix übergeben, in der das Element in der i-ten Zeile und j-ten Spalte die Entfernung zwischen der Stadt i und der Stadt j angibt. Die Entfernungen zwischen den Städten und die Länge der Reise sind immer positiveinteger-Zahlen kleiner alsmaxint.

Zur Bestimmung einer kurzen Reise wird folgendes Verfahren benutzt: Ausgehend von Stadt 1 wird die- jenige Stadt bestimmt, welche die kürzeste Entfernung von Stadt 1 besitzt. Von dieser Stadt aus wird wiederum die nächstgelegene Stadt ermittelt und von der aus wieder die nächstgelegene usw., bis alle Städte besucht worden sind. Die Information, welche Städte schon besucht sind, wird in einem boole- schen Feld abgelegt.

Als Beispiel fürMAXORTSZAHL = 3geben wir die folgende Entfernungsmatrix und die resultierende Prozedurausgabe an:

Ihre Aufgabe besteht darin, unter Benutzung der Konstantendefinition und Typdefinitionen const

MAXORTSZAHL = 10;

type

tOrtsIndex = 1..MAXORTSZAHL;

tEntfernung = 0..maxint;

tEntfMatrix = array [tOrtsIndex, tOrtsIndex] of tEntfernung;

untenstehende Prozedur so zu ergänzen, dass sie obiges Verfahren implementiert.

1 2 3

0 7 4 7 0 6 4 6 0 1 2 3

Reise:

1 3 2 10 km Entfernungsmatrix:

Prozedurausgabe:

(6)

procedure Reise (var inMat : tEntfMatrix);

{ berechnet eine kurze Reise aus der Entfernungsmatrix inMat }

type

tBoolFeld = array [tOrtsIndex] of boolean;

{ zur Markierung bereits besuchter Staedte } var

besucht : tBoolFeld;

Gesamtstrecke : tEntfernung;

hier, { gibt die aktuelle Stadt an }

naechste, { gibt die naechste zu besuchende Stadt an } i : tOrtsIndex;

{ ...setzen Sie hier evtl. weitere Deklarationen ein } begin { procedure }

for i := 1 to MAXORTSZAHL do besucht [i] := false;

{ initialisiert das Feld besuchter Staedte } Gesamtstrecke := 0;

hier := 1;

besucht [hier] := true;

writeln ('Reise: ');

writeln (hier);

{ es sind noch MAXORTSZAHL - 1 Staedte zu besuchen } for i := 1 to MAXORTSZAHL - 1 do

begin

Komplettieren Sie den Schleifenrumpf von Reise, indem Sie die hier erforderlichen Anweisungen nach dem

untenstehenden Buchstaben A angeben.

end;

writeln (Gesamtstrecke, ' km') end; { Reise }

(7)

A:

(8)
(9)

Aufgabe 3 (5 + 5 Punkte)

Zwei MengenM1undM2mit ganzen Zahlen seien durch einfach-verkettete lineare Listen realisiert. Die Zahlen innerhalb der Liste sind nicht sortiert. Die ProzedurMinus(M1, M2)entfernt alle Zahlen aus der ListeM1, die ebenfalls in der ListeM2enthalten sind. Das Entfernen dieser Zahlen aus der ListeM1 soll ausschließlich durch Ändern der Verkettung geschehen.

Implementieren Sie die ProzedurMinus, indem Sie die Teilaufgaben a) und b) bearbeiten. Gehen Sie dabei von den angegebenen Typen und Prozedurköpfen aus.

type

tRefListe = ^tListe;

tListe = record

info : integer;

next : tRefListe end;

a) Implementieren Sie eine Funktionfinden, die einen Suchwert in einer Liste finden soll. Der zu suchende Wert wird in dem ParameterinWertund die zu durchsuchende Liste in dem Parameter inRefListean die Funktion übergeben. Wird der Suchwert in der Liste gefunden, so soll die Funktion einen Zeiger auf dieses Element zurückliefern, ansonsten gibt die Funktion den Wert nil zurück.

function finden (

inWert : integer;

inRefListe : tRefListe) : tRefListe;

{ sucht den Wert inWert in der Liste, auf deren Anfang inRefListe zeigt. Wird der Wert gefunden, liefert die Funktion einen Zeiger auf dieses Element zurueck, ansonsten nil }

b) Implementieren Sie die ProzedurMinusunter Benutzung der Funktionfinden. Vervollständi- gen Sie dazu untenstehende Prozedur, indem Sie für die Platzhalter (1) bis (5) in der Prozedur einen Ausdruck, eine Bedingung, eine Anweisung oder eine Anweisungsfolge einsetzen.

procedure Minus (

var ioRefM1 : tRefListe;

inRefM2 : tRefListe);

{ entfernt nur durch Aendern der Verkettung alle Elemente aus M1, deren Werte auch in M2 vorkommen. }

var

RefLauf1,

RefLauf2: tRefListe;

(10)

begin

RefLauf2 := inRefM2;

while RefLauf2 <> nil do begin

RefWert := finden((1), (2));

if RefWert <> nil then { Suchwert in ioRefM1 gefunden? } begin

if (3) then begin

{ Sonderfall: Suchwert ist erstes Element in ioRefM1 } (4)

end

else { Normalfall } begin

(5) end

end; { if RefWert <> nil } RefLauf2 := RefLauf2^.next;

end { while } end; { Minus }

Platzhalter Ausdruck, Bedingung, Anweisung oder Anweisungsfolge (1)

(2) (3) (4)

(5)

(11)

Aufgabe 4 (10 Punkte)

Gegeben sei ein (nicht sortierter) binärer Baum und ein ZeigerRefZ auf einen Knoten, der im Baum enthalten ist. Ihre Aufgabe ist es, eine ProzedurTrennenzu implementieren, die den Teilbaum, auf dessen WurzelRefZzeigt, vom Baum abtrennt. ZeigtRefZauf die Wurzel des Baumes, dann ist nichts zu tun. Die folgende Abbildung veranschaulicht das Prinzip.

Gehen Sie von den folgenden Typdefinitionen und dem angegebenen Prozedurkopf aus.

type

tRefBinBaum = ^tBinBaum;

tBinBaum = record

info : char;

links,

rechts : tRefBinBaum end;

procedure Trennen (

inRefWurzel,

inRefZ : tRefBinBaum);

{ trennt den Teilbaum, auf dessen Wurzel inRefZ zeigt, vom Baum ab, auf dessen Wurzel inRefWurzel zeigt; zeigen inRefWurzel und inRefZ auf denselben Knoten, geschieht nichts }

G A

S R

F

M K

RefWurzel

RefZ

G

A

S R

F

M K

RefWurzel

RefZ

(12)
(13)

Aufgabe 5 (2 + 6 Punkte)

Die Funktion Hoch berechnet dien-te Potenz einerinteger-Zahl, die größer 0 ist. Beispielsweise ist die 4-te Potenz von 6 gleich 6 * 6 * 6 * 6 = 1296; alsoHoch(6,4) = 1296. Sie können annehmen, dass Zahl > 0 und n>=0 gilt.

Gehen Sie dabei von folgender Typdefinition aus:

type

tNatZahl = 0..maxint;

tNatZahlPlus = 1..maxint;

function Hoch (Zahl : tNatZahlPlus;

n : tNatZahl): tNatZahlPlus;

{berechnet fuer n >= 0 die n-te Potenz von Zahl > 0}

var Temp1,

Temp2 : tNatZahlPlus;

Temp3 : tNatZahl;

begin

1 Temp1 := 1;

2 Temp2 := Zahl;

3 Temp3 := n;

4 while Temp3 > 0 do 5 begin

6 if odd(Temp3) then

7 Temp1 := Temp1 * Temp2;

8 Temp2 := sqr(Temp2);

9 Temp3 := Temp3 div 2 10 end;

11 Hoch := Temp1 end; {Hoch}

(14)

Wir geben zusätzlich den kompaktifizierten Kontrollflußgraphen zuHoch an:

nstart

nif

nthen

ndo ninit

nwhile Zeilen 1-3

Zeile 4

Zeilen 5-6

Zeile 7

Zeilen 8-10

ntail

nfinal Zeile 11

Kompaktifizierter Kontrollflußgraph vonHoch

(15)

a) Geben Sie eine Knotenfolge an, die eine vollständige Anweisungsüberdeckung für die Funktion Hoch bildet. Wie lautet ein Testdatum zu dieser Knotenfolge?

b) Es soll ein boundary-interior Test der Funktion durchgeführt werden. Geben Sie für jede der drei Testklassen einen passenden Pfad und die dazugehörigen assoziativen Testfälle an. Wählen Sie für die interior-Klasse n=2, d.h. betrachten Sie Testdaten, die die Schleife genau zweimal durchlaufen.

(16)
(17)

Aufgabe 6 (6 + 3 Punkte)

Das folgende ProgrammAufgabe6 bestimmt die Summe aller geraden Zahlen von 2 bis X.

Sie sollen zeigen, dass das ProgrammAufgabe6 bezüglich der Spezifikation

{ P ≡ X ≥ 0 ∧ X gerade} Aufgabe6 { Q ≡ SUM = (X*X + 2*X)/4} partiell korrekt ist.

program Aufgabe6;

const

X = ?; { X gerade } var

sum,

z : integer;

begin

sum := 0;

z := 2;

while z < (X+2) do begin

sum := sum + z;

z := z + 2 end

end.

a) Zeigen Sie zunächst, dass

INV≡sum = (z*z - 2*z)/4 ∧(z ≤ X+2)

eine Invariante der while-Schleife des ProgrammsAufgabe6ist. Geben Sie beim Nachweis die verwendeten Hoare-Regeln explizit an.

b) Benutzen Sie die Invariante INV zum Nachweis der partiellen Korrektheit des Programms Aufgabe6. Geben Sie auch hier die verwendeten Hoare-Regeln explizit an.

(18)
(19)
(20)
(21)

Aufgabe 7 (6 Punkte)

Zeigen Sie, dass das ProgrammAufgabe6terminiert, indem Sie eine Funktionτangeben und bewei- sen, dassτ eine Terminierungsfunktion der while-Schleife ist.

(22)
(23)

Aufgabe 8 (5 + 6 Punkte)

a) Welche der folgenden Aussagen sind richtig, welche falsch? Tragen Sie den jeweiligen Buchstaben in die Tabelle ein.

- A. Ist die Terminierung eines Programmes bewiesen, deckt ein boundary interior Test keinen Fehler mehr auf.

- B. Ist die Terminierung einer while-Schleife mit Hilfe einer Invarianten INV nachgewiesen, so terminiert diese Schleife in allen Programmen, in denen INV vor der Schleife erfüllt ist.

- C. Ist eine Programmformel{P}S{Q} für ein ProgrammS gültig, dann terminiertS.

- D.{false} x := x + 1 {x=5} ist eine gültige Programmformel.

- E. Zwei Schleifen mit derselben Invariante haben stets dieselbe Semantik.

b) Begründen Sie Ihre Entscheidungen in Aufgabenteil a) bez. der Aussagen A, D und E.

wahr falsch

(24)
(25)
(26)
(27)

1. Selbstdefinierte Konstantenbezeichner bestehen nur aus Großbuchstaben. Bezeichner von Standard- konstanten wie z.B.maxint sind also ausgenommen

2. Typbezeichnern wird eintvorangestellt. Bezeichner von Zeigertypen beginnen mittRef. Bezeich- ner formaler Parameter beginnen mitin,io oderout.

3. Jede Anweisung beginnt in einer neuen Zeile; begin undend stehen jeweils in einer eigenen Zeile

4. Anweisungsfolgen werden zwischenbegin undend um eine konstante Anzahl von 2 - 4 Stellen eingerückt.begin undend stehen linksbündig unter der zugehörigen Kontrollanweisung, sie wer- den nicht weiter eingerückt.

5. Anweisungsteile von Kontrollanweisungen werden genauso eingerückt.

6. Im Programmkopf wird die Aufgabe beschrieben, die das Programm löst.

7. Jeder Funktions- und Prozedurkopf enthält eine knappe Aufgabenbeschreibung als Kommentar.

Ggf. werden zusätzlich die Parameter kommentiert.

8. Die Parameter werden sortiert nach der Übergabeart: Eingangs-, Änderungs- und Ausgangsparame- ter.

9. Die Übergabeart jedes Parameters wird durch Voranstellen vonin,io oderout vor den Parame- ternamen gekennzeichnet.

10. Das Layout von Funktionen und Prozeduren entspricht dem von Programmen.

11. Jede von einer Funktion oder Prozedur benutzte bzw. manipulierte Variable wird als Parameter über- geben. Es werden keine globalen Variablen manipuliert. Einzige Ausnahme sind Modul-lokale Variablen, die in den Parameterlisten der exportierten Prozeduren und Funktionen des Moduls nicht auftauchen, selbst wenn sie von diesen geändert werden.

12. Jeder nicht von der Prozedur veränderte Parameter wird als Wertparameter übergeben. Lediglich Felder können auch anstatt als Wertparameter als Referenzparameter übergeben werden, um den Speicherplatz für die Kopie und den Kopiervorgang zu sparen. Der Feldbezeichner beginnt aber stets mit dem Präfixin, wenn das Feld nicht verändert wird.

13. Funktionsprozeduren werden wie Funktionen im mathematischen Sinne benutzt, d.h. sie besitzen nur Wertparameter. Wie bei Prozeduren ist eine Ausnahme nur bei Feldern erlaubt, um zusätzlichen Speicherplatz und Kopieraufwand zu vermeiden.

14. Wertparameter werden nicht als lokale Variable mißbraucht.

15. Die Schlüsselworteunit,interface undimplementation werden ebenso wiebegin und end des Initialisierungsteils linksbündig positioniert. Nach dem Schlüsselwortunit folgt ein Kommentar, der die Aufgabe beschreibt, welche die Unit löst.

16. Für die Schnittstelle gelten dieselben Programmierstilregeln wie für ein Programm. Dies betrifft Layout und Kommentare. Nach dem Schlüsselwortinterface folgt im Normalfall kein Kom- mentar.

17. Für den Implementationsteil gelten dieselben Programmierstilregeln wie für ein Programm. Nach dem Schlüsselwortimplementation folgt nur dann ein Kommentar, wenn die Realisierung einer Erläuterung bedarf (z.B. wegen komplizierter Datenstrukturen und/oder Algorithmen).

18. In Programmen oder Moduln, die andere Moduln importieren („benutzen“), wird das Schlüsselwort uses auf dieselbe Position eingerückt wie die Schlüsselworteconst,type,var usw.

19. Die Laufvariable wird innerhalb einerfor-Anweisung nicht manipuliert.

20. Die Grundsätze der strukturierten Programmierung sind strikt zu befolgen.

(28)

1. Konsequenzregel 1

2. Nullaxiom

4. Sequenzregel

6. Bedingungsregel 1 3. Zuweisungaxiom

7.while-Regel

{P}S {R}, R ⇒ Q {P}S {Q}

P⇒ R, {R}S {Q}

{P}S {Q}

{P} {P}

{P<x←expr>}x:=expr {P}

{P}S1 {R}, {R}S2 {Q}

{P} S1; S2 {Q}

{P∧ B}S1 {Q}, {P∧ ¬B}S2 {Q}

{P}if B then S1

{P∧ B}S {Q}, (P∧ ¬B) ⇒ Q {P}if B then S {Q}

{P∧ B}S {P}

{P} while B do S {P∧ ¬B}

{P}S {Q}, (Q∧ ¬B)⇒ P {P} repeat S until B {Q∧ B}

else S2 {Q}

5. Zusammensetzungsregel {P}S {Q}

{P} begin S end {Q}

8.repeat-Regel Konsequenzregel 2

Bedingungsregel 2

(29)

Definition

Eine Abbildung τ heißt Terminierungsfunktion der while-Schleife while B do S, wenn sie die Bedingungen w1) bis w3) erfüllt:

w1) Seienv1, ..., vrdie in B undSvorkommenden Variablen und Kon- stanten. Dann istτ:ZZr →ZZ mitτ(v1, ...,vr)

ZZ.

w2) Ist vor einem Schleifendurchlaufτ(v1, ...,vr)=t erfüllt, dann ist nach dem Schleifendurchlaufτ(v1, ...,vr)<t erfüllt.

w3) Es existiert ein Wert t*∈ZZ, so daß vor jedem Schleifendurchlauf τ(v1, ...,vr)≥t* gilt.

Bemerkung

i) Beachten Sie, daß Snur dann ausgeführt wird, wenn INV∧B erfüllt ist. Diese Voraussetzung muß man gewöhnlich ausnutzen, um die Ei- genschaften w2) und w3) einer Terminierungsfunktion beweisen zu können.

i) Eine Invariante INV, mit der sich die Terminierung einer Schleife be- weisen läßt, ist (leider) oft nicht identisch mit einer geeigneten Invarian- ten, mit der sich die partielle Korrektheit zeigen läßt.

Haben wir eine solche Invariante INV gefunden und bewiesen, daß die Schleife unter dieser Invarianten terminiert, müssen wir außerdem noch zeigen, daß INV auch tatsächlich erfüllt ist, wenn die Programmabarbei- tung die Schleife erreicht

Referenzen

ÄHNLICHE DOKUMENTE

Dass die Fotos und die dazugehörigen Beschreibun- gen je nach Format unterschiedlich quer oder längs angeordnet sind, wird bei der Vielfalt der Kar- ten für kaum einen

baum, wobei drei Arten hei- misch sind: Die Stieleiche (Quercus robur L.), die Trau- beneiche (Quercus petraea) und die Flaumeiche (Quercus pu- bescens).. Alle drei Arten liefern

Wenn Früchte von Vögeln oder anderen Tieren gefressen werden, können sich an ande- rer Stelle aus den ausgeschiedenen Samen neue Bäume entwickeln.. Eichhörnchen vergraben Früchte

Birke..

Verdecke den Kasten, zähle bis fünf und schreibe auf, was du dir

könnte deine Schwester, Frau N., wenn sie nun doch auf diesem Stück Erde mit ihrem Manne wohnen will, ungestraft das alte Haus niederreissen und ein neues bauen; denn dies neue

Bäumchen – nun ein stattlicher schöner Baum – sehr viel Kraft, den anderen Trost zuzusprechen, so dass sie, dadurch gestärkt, innerlich stark wurden, was auch sie zum

Die Schüler sollen aus dem dunkelbraunen Tonpapier einen Stamm und viele Äste reißen und auf den Hintergrund kleben. Anschließend werden aus dem bunten Seidenpapier kleine