Aufgabe Punkte

Klausur zur Vorlesung Informatik I Prof. Dr. Nikolaus Wulff M¨arz 2008 Diese Klausur besteht aus acht Aufgaben, von denen Sie f¨ unf bearbeiten und l...
Author: Norbert Junge
30 downloads 1 Views 107KB Size
Klausur zur Vorlesung Informatik I Prof. Dr. Nikolaus Wulff M¨arz 2008

Diese Klausur besteht aus acht Aufgaben, von denen Sie f¨ unf bearbeiten und l¨ osen m¨ ussen, d.h. maximal f¨ unf richtig gel¨oste Aufgaben entsprechen 100% der Gesamtpunktzahl. 1. Schauen Sie sich daher die Aufgaben zun¨achst in Ruhe an und w¨ahlen Sie dann die Aufgaben, die Ihnen am leichtesten erscheinen. 2. Sofern Sie mehr als f¨ unf Aufgaben abgeben, werden die f¨ unf schlechtesten Aufgaben bewertet. 3. Schreiben Sie auf jedes L¨osungsblatt Ihren Namen und zu welcher Aufgabe es geh¨ ort. Nummerieren Sie die L¨osungsbl¨atter durch. 4. Kommentieren Sie ihre Programmlistings, schreiben Sie leserlich, Hieroglyphen werden nicht gewertet. 5. F¨ ur diese Klausur sind als Hilfsmittel • ein Lineal f¨ ur saubere Zeichnungen oder zum eventuellen Durchstreichen, • sowie ein selbst beschriebener “Merkzettel“ DIN A4 zugelassen. 6. Sie haben zum Bearbeiten der Aufgaben 120 Minuten Zeit. Viel Erfolg!

Aufgabe 1 2 3 4 5 6 7 8 Punkte

1

1

Zeichenkette verdrehen

Implementieren Sie die Methode mangle, die eine u ¨bergebenen Zeichenkette ”verdreht” indem die Zeichenkette r¨ uckw¨arts ausgegeben wird und gleichzeitig jeder Buchstabe lexikografisch um eins erh¨oht wird. Hierbei wird zyklisch aus einem ’z’ ein ’a’ bzw. aus einem ’Z’ ein ’A’. 1 2 3 4 5 6

/∗∗ ∗ Verdrehe die Zeichenkette . ∗ @param str die orginale Zeichenkette , ∗ @return die verdrehte Zeichenkette ∗/ char∗ mangle(char ∗str);

Listing 1: Signatur der mangle-Methode Die Methode soll die eine Signatur wie im Listing 1 besitzen, es soll keine neue Zeichenkette alloziert werden, sondern eine Ersetzung innerhalb des u ¨ bergebenen Felds stattfinden. Ein Testdurchlauf mit der Eingabekette "zaBcddZ" liefert dann "AeedCba" als Ergebniss zur¨ uck. Tip Beachten Sie, dass die Methode mangle einen R¨ uckgabewert hat, es soll dennoch kein malloc Aufruf oder ¨ahnliches geschehen, auch soll keine Ausgabe per printf erfolgen. Um die Sonderf¨ alle kleines ’z’ und großes ’Z’ einheitlich zu behandeln, d¨ urfen sie die Funktion toupper verwenden und so erforderlich auch die Funktion strlen. Hierzu m¨ ussen die Funktionsprototypen aus und/oder inkludiert werden.

2

Zahlendarstellung Bin¨ ar

Oktal

Dezimal 21.2510

Hexadezimal 5D.416

37.28 Tabelle 1: Zahlendarstellung in unterschiedlichen Systemen Aufgabe Komplettieren Sie Tabelle (1), so dass alle Zahlen in ihrem jeweiligen Zahlensystem dargestellt werden. Geben Sie den Rechenweg an, es sind sonst (bei Folgefehlern) keine Teilpunkte m¨oglich. Beachten Sie den Dezimalpunkt.

2

3 1 2

Fehler u ¨ ber Fehler

#ifndef POINT 2D #define POINT 2D

3 4

typedef unsigned short pvalue;

5 6 7 8 9

typedef struct point struct { pvalue x; pvalue y; } Point;

10 11

#endif /∗ POINT 2D ∗/

Listing 2: Strukturdeklaration eines zweidimensionalen Punktes. Quelltext (2) zeigt die Definition eines zweidimentionalen Puntkes p ∈ N2 . F¨ ur einen solchen Punkt p soll eine Methode geschrieben werden, welche die Abbildung method: N2

→ N2

p ≡ (x, y) 7→ q := (x + y, xy)

(1)

realisiert. Im Listing (3) auf der n¨achsten Seite finden Sie verschiedene M¨oglichkeiten Formel (1) zu implementieren. Aufgabe Leider sind bei der Implementierung zahlreiche Fehler unterlaufen. Helfen Sie bei der Korrektur und beantworten Sie f¨ ur jede Methode die folgenden Fragen: 1. Finden und kommentieren Sie alle Fehler, die vorkommen. 2. Geben Sie eine m¨ ogliche Korrektur an. ¨ 3. Klassifizieren Sie die Fehler nach Ubersetzungsund Laufzeitfehlern. 4. Standardm¨ assig ist erw¨ unscht den Punkt des Aufrufenden unver¨andert zu lassen, welche Methoden leisten dies? Tip Es werden sowohl Zeiger- als auch Wertesymantik verwendet. Da Formel (1) keine Variante erzwingt oder bevorzugt, sind beide Formen prinzipiell m¨oglich, solange diese richtig und in sich konsistent verwendet werden.

3

1 2 3 4 5 6

Point∗ method1(Point p) { Point q; q.x = p.x + p.y; q.y = p.x ∗ p.y; return &q; }

Point method2(Point∗ p) { Point q; q.x = p−>x + p−>y; q.y = p−>x ∗ p−>y; return q; }

Point∗ method3(Point p) { int x = p.x; int y = p.y; p.x = x + y; p.y = x ∗ y; return &p; }

Point∗ method4(Point∗ p) { int x = p−>x; int y = p−>y; p−>x = x + y; p−>y = x ∗ y; return p; }

Point method5(Point p) { int x = p.x; int y = p.y; p.x = x + y; p.y = x ∗ y; return p; }

Point method6(Point∗ p) { Point ∗q = malloc(sizeof(Point)); q−>x = p−>x + p−>y; q−>y = p−>x ∗ p−>y; free (q); return ∗q; }

Point∗ method7(Point∗ p) { Point q; q.x = p−>x + p−>y; q.y = p−>x ∗ p−>y; return &q; }

Point∗ method8(Point p) { Point ∗q = malloc(sizeof(Point)); q−>x = p.x + p.y; q−>y = p.x ∗ p.y; return q; }

Point∗ method9(Point∗ p) { Point q; q−>x = p−>x + p−>y; q−>y = p−>x ∗ p−>y; return q; }

Point∗ method10(Point∗ p) { Point ∗q; q−>x = p−>x + p−>y; q−>y = p−>x ∗ p−>y; return q; }

Point method11(Point p) { p.x = p.x + p.y; p.y = p.x ∗ p.y; return p; }

Point method12(Point p) { Point ∗q = malloc(sizeof(Point∗)); q−>x = p.x + p.y; q−>y = p.x ∗ p.y; return ∗q; }

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Listing 3: Viele m¨ ogliche (und falsche) Implementierungen.

4

4

Bin¨ are Schaltungen

Gegeben seinen die Funktionen x, y, z : B3 → B – entweder explizit oder implizit per Wertetabelle – mit der Menge B = {0, 1} und der darauf definierten zugeh¨ origen Booleschen Algebra. x(a, b, c) =

(a ∧ c) ∨ [¬a ∧ (b ∧ c ∨ ¬b ∧ ¬c)]

y(a, b, c) =

¬b ∧ (¬a ∧ c ∨ ¬c ∧ a) ∨ (¬a ∧ b)

Wertetabelle der Funktion z : B3 → B: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

z 0 1 0 0 1 0 1 0

Aufgabe 1. Erstellen Sie eine Wahrheitstabelle f¨ ur die Funktionen x und y. 2. Bestimmen Sie die Funktionsgleichung der Funktion z. 3. Zeichnen Sie die drei Schaltbilder mit entsprechenden Gattern.

5

5 1 2 3 4 5 6 7

Textanalyse

typedef char∗ String; /∗∗ ∗ Ermittlung des haeuffigsten Buchstaben im Text. ∗ @param text der Text ∗ @return den am haeufigsten vorkommenden Buchstaben ∗/ char haeufigster(String text) ;

Listing 4: Prototyp der Textanalyse. Aufgabe Sie wollen in einem Text den am h¨aufigsten vorkommenden Buchstaben – unabh¨ angig von der Groß- oder Kleinschreibung – ermitteln und zur¨ uckgeben. Implementieren Sie die Funktion haeufigster passend zum Listing 4. Diese Methode soll nur einen Schleifendurchlauf u uhren, um den ¨ ber den Text durchf¨ h¨ aufigsten Buchstaben zu bestimmen. Hat der Text keine Elemente, so wird ’\0’ zur¨ uckgegeben. Tip Es gibt verschiedene L¨ osungsm¨oglichkeiten, eine verwendet eine vorhergehende Sortierung. Hierzu d¨ urfen Sie den Sortieralgorithmus aus Listing 5 verwenden ohne ihn implementieren zu m¨ ussen. Ob es sich um einen Buchstaben handelt finden sie mit isalpha heraus und mit Hilfe von toupper oder tolower brauchen Sie sich nur noch um Großoder Kleinbuchstaben zu k¨ ummern. Hierzu ben¨otigen Sie bzw. die Deklarationen aus Listing 5. Alternativ k¨onnen Sie nat¨ urlich auch mit if-else oder switch-case Konstrukten arbeiten. Wie schon gesagt es gibt viele richtige (und noch viel mehr falsche) L¨osungsm¨oglichkeiten... :-) 1 2 3 4 5 6 7 8 9 10

extern int isalpha(char); extern char toupper(char); extern char tolower(char); extern int strlen (char∗); /∗∗ ∗ Generische Sortierung eines Feldes. ∗ @param ptr Zeiger auf das Feld ∗ @param len Anzahl an Feldelementen ∗/ extern void sort(char∗ ptr, int len);

Listing 5: Prototypen einiger n¨ utzlicher Hilfsroutinen.

6

6

Statistische Analyse Begin a = b = i = 0; No

n≥2

Fehler (stderr): “n < 2“

Yes No

i