Klausur und die Musterlösung

Werbung
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Klausur zur Lehrveranstaltung
Technische Informatik für Ingenieure
WS 2006/07
22. Februar 2007
Musterlösung (in rot)
Aufgabe
mögliche Punkte
1
2
3
4
5
Summe
12
17
26
20
15
90
erreichte Punkte
Note:
Hinweise:
• Diese Klausur umfaßt 5 Aufgaben und 8 Seiten.
• Überprüfen Sie Ihre Klausur bitte auf Vollständigkeit!
• Schreiben Sie bitte Ihren Namen auf jede Seite dieser Klausur und ggf. auf
weitere von Ihnen benutzte Zusatzblätter!
• Es sind keine Hilfsmittel erlaubt.
• Nehmen Sie sich Zeit, die Klausuraufgaben vollständig durchzulesen.
• Sie können insgesamt 90 Punkte erreichen; zum Bestehen der Klausur
müssen sie mindestens 45 Punkte erreichen.
• Die Bearbeitungszeit beträgt 90 Minuten.
Viel Erfolg bei der Bearbeitung der Aufgaben!
-1-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 1 (Syntax):
(12 Punkte)
Das folgende Java Programm Bubblesort enthält insgesamt 15 Syntax- und Typisierungsfehler.
Markieren Sie davon mindestens 12 Fehler deutlich im Programmtext und korrigieren Sie diese
eindeutig ohne Hinzufügen neuer Anweisungen.
Tragen Sie die im Programmtext markierten Fehler in die Tabelle auf der Seite gegenüber ein und
geben Sie die jeweilige Zeilennummer und die Korrektur an.
Hinweis: Das Programm soll nicht auf seine Korrektheit hin überprüft werden; die Fehler sollen
lediglich syntaktisch korrigiert werden.
Bewertung:
• Für jeden korrekt markierten Fehler erhalten Sie 0,5 Punkte
• Für jeden fälschlich markierten Fehler werden 0,5 Punkte abgezogen
• Für jede richtige Korrektur erhalten Sie 0,5 Punkte
• Für jede falsche Korrektur werden 0,5 Punkte abgezogen
Maximal können sie in dieser Aufgabe 12 Punkte erreichen; eine negative Punktzahl für diese
Aufgabe insgesamt ist nicht möglich (im schlimmsten Fall erhalten Sie 0 Punkte).
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
public class Bubblesort {
public static void main(String[] args) (
sortiert boolean;
int() a = new int[] { 2, 4, 6, 1, 5, 3 };
do {
sortiert = true;
for (int i == 0; i < a.length - 1; i++) {
if (a[i] > a[i + 1]) {
int h = a[i];
a[i] = a[i + 1]
a[i + 1] = h;
sortiert := false;
}
}
} while (boolean sortiert == false);
Out.print(Das sortierte Array: );
For (int i = 0.0; i < a.length; i+) {
if (int < a.length - 1) {
Out.print(a(i) + ", ");
} Else {
Out.print(a[i]);
}
}}
}
}
-2-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 1 (Fortsetzung)
Tragen Sie die Fehler und die Korrekturen in die folgende Tabelle ein. Es reicht, wenn Sie 12 Fehler
angeben und korrigieren!
Nr.
Zeile
Fehler
Korrektur
1
3.
(
{
2
4.
sortiert boolean;
boolean sortiert;
3
5.
int() a
int[] a
4
9.
int i == 0
int i = 0
5
12.
a[i] = a[i + 1]
a[i] = a[i + 1];
6
15.
:=
=
7
18.
boolean sortiert
boolean löschen
8
20.
Out.print(Text);
Out.print("Text");
9
22.
For
for
10
22.
int i = 0.0;
int i = 0;
11
22.
i+
i++
12
23.
int < a.length
i < a.length
13
24.
a(i)
a[i]
14
25.
Else
else
15
28.
}}
}
Erläuterung der Fehler:
Nr.
Zeile
Fehler
Erläuterung
1
3.
(
Der Rumpf einer Klasse muss in {} eingeschlossen sein.
2
4.
sortiert
boolean;
3
5.
int() a
4
9.
int i == 0
5
12.
a[i] = a[i + 1]
6
15.
:=
Bei der Deklaration von Variablen muss der Typ vor dem
Namen der Variablen stehen.
Bei der Deklaration von Arrays wird ein Array durch []
gekennzeichnet.
Bei der Initialisierung muss eine Zuweisung erfolgen, ein
boolescher Ausdruck ist nicht zulässig.
Jede Anweisung muss mit einem Semikolon
abgeschlossen werden.
In Java erfolgt eine Zuweisung durch das
Gleichheitszeichen.
-3-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Variablen dürfen nur einmal deklariert werden. Die
Variable sortiert wird bereits in Zeile 4 deklariert.
Ein String-Literal muss von Gänsefüßchen ""
eingeschlossen sein.
7
18.
boolean sortiert
8
20.
Out.print(Text);
9
22.
For
Das Schlüsselwort for ist falsch geschrieben.
10
22.
int i = 0.0;
Der int-Variable i darf kein Double-Wert zugewiesen
werden.
11
22.
i+
i+ ist kein zulässiger Ausdruck.
12
23.
int < a.length
13
24.
a(i)
14
25.
Else
Das Schlüsselwort else ist falsch geschrieben.
15
28.
}}
Zu jeder öffnenden Klammer gehört genau eine
schließende Klammer und umgekehrt.
Bei einem booleschen Ausdruck müssen auf der linken
und rechten Seite gültige Ausdrücke stehen.
Der Zugriff auf das Element eines Arrays erfolgt durch
den Index in eckigen Klammern a[i].
-4-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 2 (Ausdrücke und Typisierung):
(17 Punkte)
(a) Welche dieser Zeichenketten sind gemäß der Definition der Programmiersprache Java korrekte
Ausdrücke? Geben Sie für jeden korrekten Ausdruck seinen Typ an!
Dabei sind a und b Variablen vom Typ int.
korrekt
Ja
Nein
korrekt
Typ
Ja
Typ
Nein
a)
-(a + b)
x
int
b)
a - - b == 5
c)
a++ * --b
x
int
d)
5 + ((b * 12.0D)
e)
(15.0 b) - a
x
f)
"ab" + 7 * 10
x
String
g)
b % a = 8
x
h)
a – (b) < - 3
x
boolean
x
boolean
x
(b) Geben Sie für die folgenden Ausdrücke den Syntaxbaum mit Auswertungsformular an und werten
Sie es für die Werte a = 1 und b = -10 aus. Beschriften Sie jedes Zwischenergebnis mit seinem
Typ!
Dabei sind a und b Variablen vom Typ int.
a) 10 - a * (20.0 + b)
b) "ab" + 7 / 10 + "14"
0.0
- double
"ab014"
+ String
10
10.0
* double
10
"ab0"
String
"14"
"14"
+
int
String
1
int
10.0
+ double
a
"ab"
String
20.0
double
20.0
0
/ int
“ab“
-10
b
10
int
7
int
7
(c) Was Erläutern Sie kurz den Begriff der Backus-Naur-Form (BNF)! Wozu dient sie?
Die Backus-Naur-Form (BNF) dient zur Definition der Syntax einer Sprache.
Oder: Die Backus-Naur-Form definiert die Regeln zum Formulieren korrekter Ausdrücke.
-5-
10
int
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 3 (Kontrollstrukturen):
(26 Punkte)
(a) Schreiben Sie ein Programm, welches das Verhalten des Einsiedlers ONE im Lippischen
Hochgebirge beschreibt. ONE lebt nach strengen Verhaltensregeln. Er verlässt seine Höhle nur
unter folgenden Bedingungen:
•
•
•
Wenn ONE dringend etwas zu essen braucht, geht er unabhängig von Uhrzeit und Wetter
immer raus (zum Jagen oder Fischen).
Nachts geht er raus, wenn der Strom ausgefallen ist (der Fernseher läuft nicht mehr).
Tagsüber geht er bei Temperaturen ab 20°C raus (er kann sich in der Sonne bräunen).
Nach dem Start des Programms soll der Benutzer die Werte für die Variablen esIstNacht,
stromIstAusgefallen, ichHabeHunger und temperatur eingeben. Die Temperatur wird in
Grad Celsius angegeben. Ihr Programm soll ausgeben, ob ONE bei den gegebenen Bedingungen
aus seiner Höhle geht oder nicht. Ergänzen Sie dazu den folgenden Programmtext auf geeignete
Weise:
public class Rausgehen {
public static void main(String[] args) {
Out.print("Ist es Nacht?");
boolean esIstNacht = In.readBoolean();
Out.print("Ist der Strom ausgefallen?");
boolean stromIstAusgefallen = In.readBoolean();
Out.print("Habe ich Hunger?");
boolean ichHabeHunger = In.readBoolean();
Out.print("Welche Temperatur ist draußen?");
int temperatur = In.readInt();
boolean ichGeheRaus = false;
if (ichHabeHunger) {
ichGeheRaus = true;
} else if (esIstNacht) {
if (stromIstAusgefallen) {
ichGeheRaus = true;
}
} else { // es ist Tag
if (temperatur >= 20) {
ichGeheRaus = true;
}
}
if (ichGeheRaus) {
Out.println("Ich gehe raus.");
} else {
Out.println("Ich bleibe in der Höhle.");
}
}
}
-6-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 3 (Fortsetzung – Kontrollstrukturen und Funktionen)
(b) Schreiben Sie ein Java-Programm, das eine vom Benutzer einzugebende Zahl n einliest und
anschließend die Summe aller Primzahlen zwischen 1 und n (1 und n eingeschlossen) berechnet
und ausgibt. Bevor die Summe ausgegeben wird, soll auch jede der aufsummierten Primzahlen
ausgegeben werden.
Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise. Die Funktion primzahl ist
gegeben und muss von Ihnen nicht implementiert werden. Verwenden Sie diese, um die Aufgabe
zu erfüllen. Die Funktion primzahl gibt true zurück, wenn die als Parameter übergebene Zahl
eine Primzahl ist, ansonsten false.
public class PrimzahlSumme {
public static boolean primzahl(int zahl) {
// Gibt true zurück, wenn zahl eine Primzahl ist, sonst false.
// Funktion primzahl muss von Ihnen NICHT implementiert werden!
...
}
public static void main(String[] args) {
Out.print("Bitte geben Sie die Zahl n ein:");
int n = In.readInt();
int summe = 0;
for (int i = 1; i <= n; i++) {
if (primzahl(i)) {
summe = summe + i;
Out.print(i + " ");
}
}
Out.println();
Out.println("Das Ergebnis ist " + summe + ".");
}
}
-7-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 4 (Arrays und Funktionen):
(20 Punkte)
Der Student Martin Mustermann hat für die Funktion f(x)=x3-2x2-19x+20 die folgenden Nullstellen
gefunden: -2, 0, 5. Diese Werte hat er in einem Array von ganzen Zahlen int[] nullstellen
gespeichert.
Formulieren Sie ein Programm, das für die oben genannte Funktion f überprüft, ob das Array
nullstellen wenigstens eine Nullstelle enthält. Ihr Programm soll dazu die erste Nullstelle im Array
bestimmen und diese am Bildschirm ausgeben: „Zahl xxx ist eine Nullstelle der betrachteten
Funktion“. Wenn das Array keine Nullstelle der Funktion enthält, soll Ihr Programm die folgende
Meldung ausgeben: „Keine Nullstelle gefunden“.
Ergänzen Sie dazu die unten angegebene Funktion f, die für das Argument x den Wert des Polynoms
berechnet, auf geeignete Weise. Ergänzen Sie auch das Hauptprogramm entsprechend. Formulieren
Sie Ihr Programm so allgemein, dass es für jedes Array von ganzen Zahlen funktioniert und nicht nur
für das unten angegebene Array.
Um Probleme mit Rundungsfehlern zu vermeiden, soll Ihr Programm nur mit ganzen Zahlen arbeiten.
Berücksichtigen Sie das insbesondere bei der Deklaration der Funktion f.
Hinweis: In Java gibt es keine Potenzoperation. Sie kann aber mit Hilfe der Multiplikation ausgedrückt
werden.
public class Nullstellenpruefer {
public static int f(int x){
return x*x*x-2*x*x-19*x+20;
}
public static void main(String[] args){
int[] nullstellen = {-2, 0, 5};
for(int i = 0; i < nullstellen.length; i++){
if(f(nullstellen[i]) == 0){
Out.println("Zahl " + nullstellen[i]+
" ist eine Nullstelle der betrachteten"+
" Funktion");
return;
}
}
Out.println("Keine Nullstelle wurde gefunden");
}
}
-8-
Name:
Vorname:
Matrikelnummer:
Stud.-Abschnitt:
Aufgabe 5 (Programmverständnis):
(15 Punkte)
Gegeben ist die folgende Funktion:
public static void s(int n) {
boolean[] a = new boolean [n+1];
for (int i = 2; i*i <= n; i = i + 1) {
if (!a[i]) {
int x = i * i;
while (x <= n) {
a[x] = true;
x = x + i;
}
}
}
for (int j = 2; j <= n; j++) {
if(!a[j]) {
Out.print(j + " ");
}
}
}
(a) Bestimmen sie welche Werte das Array a für n=16 beim Beenden der Funktion besitzt.
Welche Werte gibt diese Funktion auf die Konsole aus?
Tragen Sie für die erste der beiden for-Schleifen für jeden Schleifendurchlauf den Wert der
Laufvariablen i sowie den Inhalt des Arrays a am Ende des jeweiligen Schleifendurchlaufs in die
nachfolgende Tabelle ein! Kennzeichnen Sie die Elemente des Arrays a mit dem Wert true mit einem
großen T und die Elemente mit dem Wert false mit einem großen F! Es reicht, wenn Sie nur die
Elemente auf diese Weise kennzeichnen, die sich in dem Schleifendurchlauf verändert haben.
Schleifendurchlauf
i
Beginn
1
2
2
3
3
4
Array a
0
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16
F
F
F
F
F
F
F
F
F
F
F
T
T
T
F
T
T
4
5
6
7
8
Ausgabe auf dem Bildschirm:
2 3 5 7 11 13
(b) Beschreiben Sie kurz, welche Aufgabe die Funktion s erfüllt!
Die Funktion gibt die Primzahlen von 1 bis n auf dem Bildschirm aus.
-9-
F
T
T
F
F
F
T
F
T
T
Herunterladen