and ge w An Info tik ik ithm rma or Alg te Informatik I Einführung in die Informatik und Programmierung (Vorlesung vom WS 2004/2005) Klausur Datum: 24.02.2005 Beginn: 10.00 Uhr s.t. Bearbeitungszeit: 120 Minuten Kandidat: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matr.-Nr.: . . . . . . . . . . . . . . . . . Studienrichtung (ankreuzen): 1. Prüfer: Angewandte IT Mathematik Wirtschafts- Sonstige: Naturwiss. Comput. Diplom mathematik . . . . . . . . . . . . . Aufgabe 1 max. 17 Punkte Aufgabe 2 max. 19 Punkte Aufgabe 3 Aufgabe 4 max. 14 Punkte max. 15 Punkte Aufgabe 5 max. 20 Punkte Aufgabe 6 Bonus max. 15 Punkte max. 20 Punkte Summe max. 120 Punkte ............................................ Datum, Unterschrift 2. Prüfer: Note ............................................ Datum, Unterschrift Note: Note Aufgabe 1 a) (3 Punkte) Geben Sie für die aussagenlogische Formel F ≡ ¬C → (A ∧ B) ∧ (¬B ∨ ¬A) eine Wahrheitstabelle an. Hinweis: Die Implikation X → Y hat die Wahrheitstabelle X F F T T Y F T F T X→Y T T F T b) (2 Punkte) Geben Sie mit Hilfe der Wahrheitstabelle eine disjunktive Normalform für F an. c) (3 Punkte) Geben Sie mit Hilfe eines Karnaugh–Veitch-(KV)-Diagramms eine möglichst kurze disjunktive Normalform für F an. d) (2 Punkte) Geben Sie ein Schaltbild mit ODER-Gattern e1 e2 > =1 a und UND-Gattern NICHT-Gattern e1 e2 & e , a 1 a zur Realisierung der Funktion F an. e) (3 Punkte) Welcher Dezimalzahl entspricht die 8-stellige Zweierkomplement-Darstellung 10011001 ? f ) (4 Punkte) Geben Sie eine aussagenlogische Formel F 0 in den Aussagevariablen Z2 , Z1 und Z0 an, die genau dann wahr“ liefert, wenn für die Binärzahl ” z = Z2 Z1 Z0 ∈ {0, 1, . . . , 7} gilt: z ≥ 3. Hinweis: Identifizieren Sie wie üblich die Binärziffer 0 mit dem Wahrheitswert falsch“ und die Ziffer 1 mit wahr“. ” ” Ende Aufgabe 1 (insgesamt 17 Punkte) 2 Aufgabe 2 a) (6 Punkte) Geben Sie für den folgenden als Pseudocode formulierten Algorithmus ein Flussdiagramm und ein Struktogramm an: wiederhole nächstes Parkhaus anfahren wenn dort freie Plätze angezeigt werden ins Parkhaus fahren solange noch kein freier Platz gefunden ist weiterfahren Auto auf dem freien Platz parken bis Auto geparkt ist — Fortsetzung der Aufgabe auf der nächsten Seite — 3 Fortsetzung zu Aufgabe 2 (Seite 2) b) (6 Punkte) Gegeben ist die Grammatik G = (N, T, P, S) mit den • Nichtterminal-Symbolen N = {A, B, C, D, E}, den • Terminal-Symbolen T = {c, o, `}, den • Produktionen (Regeln) P = { A → cBo, B → ooC, B → oC, C → oD, C → D, Do → oE, E→` } und dem • Startsymbol S = A. Geben Sie die von dieser Grammatik erzeugte Sprache L(G) an, d.h. alle aus dem Startsymbol S = A mittels der Regeln in P erzeugbaren Wörter in T ∗ . c) (2 Punkte) Ist die Grammatik aus Teilaufgabe b) kontextfrei (kurze Begründung) ? d) (5 Punkte) Geben Sie eine Grammatik G0 an, welche die Sprache L(G0 ) = {00, 010, 0110, 01110, . . .} = {01n 0 : n ∈ N0 } erzeugt, also alle 0-1-Folgen, die • am Anfang und am Ende eine 0 und • dazwischen beliebige viele (evtl. auch keine) 1en enthalten. Ein Beweis ist nicht gefordert. Ende Aufgabe 2 (insgesamt 19 Punkte) 4 Aufgabe 3 a) (4 Punkte) Formulieren Sie PROLOG-Fakten für die Tatsachen, dass • denver, los angeles, phoenix und san francisco Millionenstädte sind, • los angeles und san francisco am Meer liegen und • denver die Hauptstadt von colorado, phoenix die Hauptstadt von arizona und sacramento die Hauptstadt von kalifornien ist. Verwenden Sie million und am meer als Namen von einstelligen Prädikaten und hauptstadt als Name eines zweistelligen Prädikats. b) (2 Punkte) Welche Antworten (in der richtigen Reihenfolge) liefert die Anfrage ?- am meer( X ) . mit den von Ihnen angegebenen Fakten ? c) (2 Punkte) Geben Sie eine Anfrage an, welche die Hauptstadt von arizona bestimmt. d) (3 Punkte) Herr Reisegern findet eine Stadt interessant, wenn sie • am Meer liegt oder • eine Millionenstadt ist, die außerdem Hauptstadt ist. ist. Formulieren Sie ein entsprechendes Prädikat interessant mittels geeigneter PROLOG-Regeln. Hinweis: Alternativen ( oder“) können in PROLOG durch die Angabe mehrerer ” Klauseln für dasselbe Prädikat realisiert werden. e) (3 Punkte) Welche Antworten (in der richtigen Reihenfolge) liefert die Anfrage ?- interessant( X ) . mit den von Ihnen angegebenen Fakten und Regeln ? Ende Aufgabe 3 (insgesamt 14 Punkte) 5 Aufgabe 4 a) (3 Punkte) Welche der folgenden Wörter sind reservierte Wörter in C ? (a) double (d) int (g) long (j) type (b) feature (c) boolean (e) short (f) standard (h) return (i) stack (k) enum (l) array b) (12 Punkte) Welche Ausgabe erzeugt das folgende C-Programm ? Nehmen Sie hierzu an, dass eine double-Variable 8 Bytes, eine int-Variable 4 Bytes, eine char-Variable 1 Byte und ein Zeiger 4 Bytes belegt und dass kein Verschnitt“ (durch Auffüllen auf Vielfache der Wortgröße, z.B. 4 Bytes) auftritt. ” #include <stdio.h> void foo( int m, int n ) { printf( "m = %d, n = %d\n", m, n ) ; if ( m > n ) foo( m + 1, n + 2 ) ; } int main( void ) { double a[ 4 ] = { 0.0, 1.1, 2.2, 3.3 } ; double *pa ; double **ppa ; char b[] = "Informatik 1" ; struct { int ci ; double cd[ 3 ] ; } c ; union { int ui ; double ud[ 3 ] ; } d ; printf( printf( printf( printf( printf( printf( "sizeof( "sizeof( "sizeof( "sizeof( "sizeof( "sizeof( printf( "%f\n", pa = &a[ 3 ] ; printf( "%f\n", ppa = &pa ; printf( "%f\n", printf( "%f\n", printf( "%f\n", a ) = %d\n", sizeof( a ) ) pa ) = %d\n", sizeof( pa ) ppa ) = %d\n", sizeof( ppa b ) = %d\n", sizeof( b ) ) c ) = %d\n", sizeof( c ) ) d ) = %d\n", sizeof( d ) ) ; ) ; ) ) ; ; ; ; a[ 2 ] ) ; *pa ) ; **ppa ) ; *pa - 2 ) ; *( pa - 2 ) ) ; foo( 4, 1 ) ; return 0 ; } Ende Aufgabe 4 (insgesamt 15 Punkte) 6 Aufgabe 5 a) (12 Punkte) Schreiben Sie ein vollständiges C-Programm, welches solange • ein Wort x einliest und • prüft, ob das Wort x ein Palindrom ist, bis das eingelesene Wort x mit einem Punkt ’.’ beginnt. Ein Wort ist ein Palindrom, wenn es keinen Unterschied macht, ob man das Wort von vorne oder von hinten liest. Programmlauf sollte also folgendermaßen aussehen (Ausgaben des Programms sind kursiv, Eingaben fett gedruckt): Wort eingeben: anna anna ist ein Palindrom Wort eingeben: lagerregal lagerregal ist ein Palindrom Wort eingeben: beispiel beispiel ist kein Palindrom Wort eingeben: .ende .ende ist kein Palindrom Verwenden Sie keine String-Funktionen aus der C-Bibliothek (z.B. strlen). Hinweise: Sie dürfen annehmen, dass das zu untersuchende Wort höchstens 30 Zeichen enthält. Ein Wort kann mittels der Funktion scanf und der Formatspezifikation %s eingelesen werden. — Fortsetzung der Aufgabe auf der nächsten Seite — 7 Fortsetzung zu Aufgabe 5 (Seite 2) b) (8 Punkte) Für die Verwaltung der Fußball-Bundesligatabelle seien die folgenden Vereinbarungen gegeben: typedef struct { int punkte ; int tor_diff ; } Ergebnis ; /* Ergebnis eines Vereins */ /* Tordifferenz */ typedef struct { char name[ 20 ] ; Ergebnis erg ; } Verein ; /* Daten eines Vereins */ int main( void ) { Ergebnis e ; Verein v ; Verein *pv ; /* ... */ } Geben Sie C-Anweisungen an, mit denen • ein zusätzliches Feld t vereinbart wird, welches die Daten von 18 Vereinen aufnehmen kann, • die Variable e mit den Werten 44 (punkte) und +9 (tor diff) belegt wird, • die Variable v mit dem Namen “Schalke”, 44 Punkten und der Tordifferenz +9 belegt wird, • Platz für eine neue, über den Zeiger pv zugängliche Verein-Variable erzeugt und diese mit den Daten “Werder”, 40 Punkte, Tordifferenz +23 belegt wird, und • der Tabellenführer (erster Eintrag in t) mit den Daten “Bayern”, 44 Punkte, Tordifferenz +21 belegt wird. Hinweise: Sie müssen nur die zusätzlichen Anweisungen angeben; die obigen Vereinbarungen müssen nicht wiederholt werden. Eine Zeichenkette wird nicht mit dem Zuweisungsoperator =, sondern mit der Funktion strcpy aus der C-Standardbibliothek belegt. Ende Aufgabe 5 (insgesamt 20 Punkte) 8 Aufgabe 6 Hinweis: Die beiden Aufgabenteile a) und b) können mit einem gemeinsamen Programm bearbeitet werden. a) (6 Punkte) Schreiben Sie ein vollständiges C-Programm, das ganze Zahlen ki einliest und die Anzahlen n+ und n− der positiven bzw. negativen eingelesenen Zahlen ausgibt. Das Einlesen soll enden, wenn die Zahl ki = 0 eingegeben wurde. Die 0 wird weder bei den positiven noch bei den negativen Zahlen mitgezählt. Ein Programmlauf soll also folgendermaßen aussehen (Ausgaben des Programms sind kursiv, Eingaben fett gedruckt): Zahl eingeben (0 Zahl eingeben (0 Zahl eingeben (0 Zahl eingeben (0 Zahl eingeben (0 Zahl eingeben (0 Anzahl positiver Anzahl negativer fuer Ende) fuer Ende) fuer Ende) fuer Ende) fuer Ende) fuer Ende) Zahlen: 3 Zahlen: 2 : : : : : : 13 6 -5 21 -24 0 — Fortsetzung der Aufgabe auf der nächsten Seite — 9 Fortsetzung zu Aufgabe 6 (Seite 2) b) (9 Punkte) Ergänzen Sie Ihr Programm, so dass die positiven eingelesenen Zahlen in einer Liste gespeichert und nach dem Einlesen in umgekehrter Reihenfolge ausgeben werden. Ein Programmlauf soll also folgendermaßen aussehen (Ausgaben des Programms sind kursiv, Eingaben fett gedruckt): Zahl eingeben (0 fuer Ende) : Zahl eingeben (0 fuer Ende) : Zahl eingeben (0 fuer Ende) : Zahl eingeben (0 fuer Ende) : Zahl eingeben (0 fuer Ende) : Zahl eingeben (0 fuer Ende) : Anzahl positiver Zahlen: 3 Anzahl negativer Zahlen: 2 Positive Zahlen in umgekehrter 21 6 13 13 6 -5 21 -24 0 Reihenfolge : Verwenden Sie hierzu die folgenden Deklarationen, die Sie in Ihrem Programm nicht wiederholen müssen. #include <stdlib.h> #include <assert.h> /* Liste = Zeiger auf einen Knoten */ typedef struct Knot * Liste ; /* Knoten enthaelt eine eingelesene Zahl */ typedef struct Knot { int k ; /* gespeicherte Zahl */ Liste rest ; /* Rest der Liste */ } Knoten ; Liste list = NULL ; /* leere Liste */ Hinweise: Fügen Sie immer am Anfang der Liste ein. Nach den obigen Eingaben sollte die Liste folgendermaßen aussehen: list 21 6 13 NULL k rest Sie müssen den angeforderten Speicher nicht wieder freigeben. Ende Aufgabe 6 (insgesamt 15 Punkte) 10