Informatik I Einführung in die Informatik und Programmierung

Werbung
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
Herunterladen