Blatt Nummer: 1 Teil 1: Grundeigenschaften von Rechnern und Software [10P] Aufgabe 1.1 - Programmieren Lernen [5P] 0,5P pro richtigem Feld Klassifizieren Sie die folgenden Aussagen als richtig oder falsch Beim Programmieren lernen Richtig Falsch muss man nur Rezepte lernen, weil alle Programme ähnlich sind [ ] [X] sollte man viel selber probieren, und notfalls jemanden fragen [X] [ ] muss man langfristig lernen und nicht erst kurz vor der Klausur [X] [ ] braucht man möglichst viele Bücher und Unterlagen. Nur lesen bildet! [ ] [X] muss der Groschen nach 15min fallen, sonst fällt er gar nicht mehr [ ] [X] Aufgabe 1.2 - Programmierung in der Praxis [5P] 0,5P pro richtigem Feld Klassifizieren Sie die folgenden Aussagen als richtig oder falsch Beim Programmieren Richtig Falsch muss man zuerst wissen, was man will, und dann an den Rechner gehen [X] [ ] baut man neue Sachen zum ausprobieren gleich ins Hauptprogramm ein [ ] [X] kann man durch Testen alle Laufzeitfehler finden [ ] [X] kann man im Team genauso unbedarft arbeiten wie alleine [ ] [X] sind Debugger nur was für Anfänger. Profis machen keine Fehler [ ] [X]
Blatt Nummer: 2 Teil 2: Grundlagen der Kodierung von Informationen [10P] Aufgabe 2.1 - Zahlensysteme [5P] 1P pro Antwort mit Rechenweg, sonst -0,5P Rechnen Sie die folgenden Zahlen in das jeweils angegebene Zahlensystem um Hinweis: Der Rechenweg muss erkennbar sein! Dezimal: 497 --> Binär: 1 1111 0001 (Restwertalgorithmus oder "Basteln") 497 => 248 R1 => 124 R0 => 62 R0 => 31 R0 => 15 R1 => 7 R1 => 3 R1 => 1 R1 => 0 R1 Binär: 10010110 --> Oktal: 010 010 110 = 226 (oktal) (1 Oktalziffer = 3 Bit) Oktal: 3165 --> Hex: via Binär: 3165 = 011 001 110 101 = 0110 0111 0101 = 675 Hex: ABE --> Dezimal: 1010 1011 1110 = 2560 + 176 + 14 = 2750 x256 x16 x1 NICHT: A=10 + B=11 +E=14 => 35 %$ &! Dezimal -78 --> Binär (8 Bit): 78 = 80 2 = 5*16 2 = 0101 0000 10 = 0100 1110 2er-Komplement: 1011 0001 + 0000 0001 = 1011 0010 Aufgabe 2.2 Berechnungen in anderen Zahlensystemen [5P] Berechnen Sie im jeweiligen Zahlensystem: Dezimal: 3624 Binär: 10010010 +146 1P + 1753 1P + 01101011 +107 1000 00000100 010 5377 11111101 +253 Oktal: 617 399 Hex: B1A7 45479 1,5P + 063 + 51 1,5P + 6359 25433 110 110 0110 10110 702 450 (1)1500 70912
Blatt Nummer: 3 Teil 3: Elementare Programmbestandteile [40P] Aufgabe 3.1 - Datentypen [5P] je 1P Beantworten Sie die folgenden Fragen: Welche Eigenschaften (einer Variablen) charakterisiert ein Datentyp? Der Datentyp legt eine Menge der zulässigen Werte sowie die gültigen Operationen fest. Welcher Unterschied besteht zwischen primitiven Datentypen und Referenztypen? Bei primitiven Datentypen wird ein Wert gespeichert, bei Referenztypen ein Verweis auf ein Objekt Was passiert, wenn man den int-wert 4 und den String-Wert "tel" addiert? JA DAS GEHT WIRKLICH, VGL. ÜBUNG ZUM THEMA DATENTYPEN!!! Der int-wert wird in eine Zeichenkette umgewandelt und diese mit "tel" zu "4tel" verknüpft. Welcher primitive Datentyp wird in Java per Default für "Kommazahlen" verwendet? Der Datentyp double Welcher Referenztyp wird in Java für Zeichenketten verwendet? Der Datentyp String Aufgabe 3.2 - Literale [5P] Beantworten Sie die folgende Fragen: Was versteht man unter einem Literal? 1P Ein Literal ist ein Wert, den man direkt hinschreiben kann. Welche der folgenden Literale sind nicht korrekt (durchstreichen)? 8 x 0,5 = 4P 666 'falle' 0xB16L 17,5 23b 0.3f 0823 "\n" 666 'falle' 0xB16L 17,5 23b 0.3f 0823 "\n" char = nur ein Zeichen Kommazahlen Keine 8 in Oktal mit Punkt (sic!)
Blatt Nummer: 4 Aufgabe 3.3 - Variablen [5P] Beantworten Sie die folgenden Frage: Was ist der entscheidende Unterschied zwischen Variablen und Literalen (Stichwort XValue)? 1P Eine Variable bezeichnet einen Speicherplatz, der einen änderbaren Wert enthält (LValue). Ein Literal beschreibt einen unveränderlichen Wert (RValue). Welche Arten von Variablen gibt es in Java? 4 x 0,5P AUS WERTUNG GENOMMEN DA MISSVERSTÄNDLICH Klassenvariablen, Instanzvariablen, Parameter, lokale Variablen (alternativ noch: Konstanten) Skizzieren Sie die Struktur der folgenden Array-Variablen im Speicher 2P int[][] shapearray = { { 1, 0, {6, 8, 3, null, {5, 4; int[4][]shapearray --> int[] --> [1][0] int[] --> [6][8][3] int[] --> null int[] --> [5][4] 0,5P je Teilarray Aufgabe 3.4 - Ausdrücke [10P] 2 x 5 x 1 = 10P Beantworten Sie die folgenden Fragen Geben Sie den Datentyp der folgenden Ausdrücke an (mit i=int, d=double) i * 7 Antwort: int (Ganzzahl Multiplikation) 5f + 8L Antwort: float + long = float (Promotion) 15.5 % 3 Antwort: double (Rest aus Modulo Operator) i << 2 Antwort: int (Bit-Operation) i/2 == d Antwort: boolean (Vergleichsoperator) Berechnen Sie den Wert der folgenden Ausdrücke 17 % 4 Antwort: 1 0x0e 015 Antwort: 1110 & 1101 = 1111 = 15, Ansatz 0,5P 1/2 >= 0.33 Antwort: false, da 1/2 in int = 0 (9 & 1) == 0? 6 : 3 Antwort: 3 5 << 2 Antwort: 20 da 0101 << 2 = 10100
Blatt Nummer: 5 Aufgabe 3.5 - Kontrollstrukturen [10P] Geben Sie für folgende Aufgaben jeweils eine geeignetes Programmstück an und Benennen Sie die Art der Kontrollstruktur (Schleife, Verzweigung, Sequenz) a) Erzeugung der folgenden Bildschirmausgabe Sequenz, Folge von Anweisungen: (1P) ist das nicht zu leicht? System.out.println( "ist das"); System.out.println( "nicht zu"); System.out.println( "leicht?"); b) Ausgabe von "Ja" wenn bei einer gegebenen Variable z das Bit 4 gesetzt ist (Tipp: Bit 7 = 128). Falls dies nicht der Fall ist, soll das Bit gesetzt werden. Selektion mit if-else (2P = Verzweigung + Ausdrücke) IF-IST-KEINE-SCHLEIFE!!!!! if ( z&0x10!= 0) { System.out.println( "Ja"); else { z = 0x10; c) Berechnung der Summe der ersten 10 Glieder der folgenden Zahlenreihe 1 3 5 7 9 Schleife (vollständig), z.b. for-schleife (3P = Schleife + Schrittweite + Berechnung) int z = 1; // 0,5P int summe = 0; // 0,5P for ( int i=0; i<=10; ++i) { // 1P summe += z; // 0,5P z += 2; // 0,5P System.out.println( "Summe=" + summe); d) Berechnung und Ausgabe der Summe aller Zahlen in dem 2-dimensionalen int-array numbers. Geschachtelte Schleifen (neue for-schleife oder alte Schleifen mit i und j (4P = 2 Schleifen + Vars) int summe = 0; for ( int[] subnumbers : numbers) { // 1P Grundschleife for ( int number : subnumbers) { summe += number; System.out.println( "Summe=" + summe);
Blatt Nummer: 6 Aufgabe 3.6 - Funktionen [5P] + 2ZP Beantworten Sie die folgenden Fragen Verbinden Sie die folgenden Methoden mit den richtigen Aufrufen in der main()-methode. public class Klausur { int jahr = 0; public Klausur( int jahr) { (a) this.jahr = jahr; public void aufgabe( double d) { (b) // Aufgabe am Bildschirm anzeigen public void aufgabe( int i1, int i2) { (c) // Aufgabe am Bildschirm anzeigen public void aufgabe( int f) { (d) // Aufgabe am Bildschirm anzeigen public void aufgabe( String text) { (e) // Aufgabe am Bildschirm anzeigen (a) Klausur k = new Klausur( 2009); (c) k.aufgabe( 5,9); (d) k.aufgabe( '8'); (b) k.aufgabe( 08.15); (e) k.aufgabe( "foo"); je 1P pro richtiger Antwort Zusatzfrage: Geben Sie die Signatur einer öffentlichen Methode in der Klasse Person mit dem Namen getfullname an, welche die Instanzvariablen firstname und lastname der aufgerufenen Person verkettet und zurückliefert. public String getfullname() { // 2P, -0,5P pro Fehler return firstname + " " + lastname; // nicht verlangt
Blatt Nummer: 7 Teil 4: Objektorientierte Konzepte [10P] Aufgabe 4.1 - Kapselung [6P] je 1P pro Antwort inkl. Begründung, -1P für Fehler In Java gibt es verschiedene Möglichkeit, den Zugriff auf Variablen und Methoden zu verbieten. Erläutern Sie auf welche Elemente der Klasse Konto die Subklasse Girokonto im Paket bank.konten, die Klasse Institut aus dem Paket bank sowie die Klasse Dieb aus dem Paket unterwelt jeweils nicht zugreifen können. // Datei: Konto.java package bank; public class Konto { private double kontostand; protected Konto() { this.kontostand = 0; public double getkontostand() { return this.kontostand; void setkontostand( double kontostand) { this.kontostand = kontostand; Girokonto hat keinen Zugriff auf - kontostand ist private (andere Klasse) - setkontostand() ist default (anderes Paket) Institut hat keinen Zugriff auf - kontostand ist private (andere Klasse) Dieb hat keinen Zugriff auf - kontostand ist private (andere Klasse) - Konto() ist protected (anderes Paket, keine subklasse) - setkontostand() ist default (anderes Paket)
Blatt Nummer: 8 Aufgabe 4.2 - Vererbung [4P] + 1ZP 1P pro Stichwort / Begründung Beantworten Sie die folgenden Fragen Wieviele Subklassen kann eine Klasse in Java haben? (1P) beliebig viele In der folgenden Vererbungshierarchie wird die Vererbung falsch eingesetzt. Benennen Sie die fehlerhafte(n) Stelle(n) und machen Sie wenn möglich entsprechende Korrekturvorschläge. Person personalnr : int vorname : String nachname : String Professor besoldungsgruppe: String Student matrikelnr : int fachsemester: int urlaubssemester: int Arbeitnehmer gehalt : double Ingenieur fachrichtung :String Manager bonus : double Die personalnr gehört in die Klasse Arbeitnehmer, Professor und Ingenieur darunter. Zusatzfrage: Was bedeutet das Schlüsselwort final bei einer Klasse? (1P) finale Klassen können keine Subklassen haben
Blatt Nummer: 9 Teil 5: Angewandte Programmierung [30P] Aufgabe 5.1 [5P] je 1P pro richtiger Diagnose bzw. Korrektur Interpretieren Sie die folgenden Code-Beispiele sowie die zugehörigen Fehlermeldungen und machen Sie jeweils einen Korrekturvorschlag Quellcode public class Errors1 { int[] a = { 5, 1, 6, 3, 8, 6, 9, 3, 2; for ( int i=0; i<=a.length; ++i) { System.out.println(a[i]); Fehlermeldung Exception in thread "main" java.lang.arrayindexoutofboundsexception: 9 at Errors1.main(Errors1.java:6) Problem/Lösung Der Operator in der Schleife muss < statt <= sein. Quellcode public class Errors2 { public static void main( String args) { System.out.println( "Ich bin ein kurzer Prozess"); Fehlermeldung (zur Laufzeit) Exception in thread "main" java.lang.nosuchmethoderror: main Problem/Lösung Die Methode main() hat die falsche Signatur ( String statt String[]) Quellcode public class Errors3 { for ( int k=9; k>0; k--); System.out.println( 9); Fehlermeldung Keine, Programm druckt die Zahl 9 aus und endet dann Problem/Lösung Der Strichpunkt hinter der for-schleife beendet diese und muss weg. In der Klammer muss k stehen.
Blatt Nummer: 10 Quellcode public class Errors4 { int errorcode; public Errors4( int errorcode) { this.errorcode = errorcode; public int geterrorcode() { return errorcode; Errors4 e = new Errors4(0); System.out.println( geterrorcode()); Fehlermeldung Errors4.java:16: non-static method geterrorcode() cannot be referenced from a static context System.out.println( geterrorcode()); ^ 1 error Problem/Lösung geterrorcode() ist eine Instanzmethode, der Aufruf muss e.geterrorcode() lauten Quellcode public class Errors5 { for ( int d=0; d<360; ++d) { System.out.println( Math.sinus( d*2*math.pi/360)); Fehlermeldung Errors5.java:5: cannot find symbol symbol : method sinus(double) location: class java.lang.math System.out.println( Math.sinus( d*2*math.pi/360)); ^ 1 error Problem/Lösung Die Methode heisst Math.sin, nicht Math.sinus
Blatt Nummer: 11 Aufgabe 5.2 - Programme lesen [10P] Analysieren Sie das folgende Programm, beschreiben Sie die Bedeutung der einzelnen Variablen/Methoden und geben sie die Ausgabe des Programms an. public class Mystery { static boolean[] f = null; Array für Markierungen public static void s( int c, int z) { Markiert Vielfache von z bis c f = new boolean[c]; for ( int i=z; i<c; i+=z) { f[i] = true; public static void pp() { Gibt nicht markierte Zahlen aus for ( int i=0; i<f.length; ++i) { if (!f[i]) System.out.println( i); s(10, 3); Zuerst markieren pp(); Dann ausgeben Funktion: Eliminierung aller Vielfachen einer Zahl aus einem vorgegeben Zahlenbereich Ausgabe: 0 1 2 4 5 7 8
Blatt Nummer: 12 Aufgabe 5.3 - Programme schreiben [15P] Das folgende Programm dient zur Eingabe von Klausurnoten sowie zur Berechnung des Notendurchschnitts. Ergänzen Sie die fehlenden Stellen! Quellcode: import java.util.*; public class Notenliste { Map noten = new TreeMap(); CommandLine cl = new CommandLine(); public void noteeingeben() { String matrikelnr = cl.readstring( "Matrikelnummer? "); String note = cl.readstring( "Note? "); noten.put( matrikelnr, note); public void notenausgeben() { for ( Object matrikelnr : noten.keyset()) { String note = (String)noten.get( matrikelnr); System.out.println( matrikelnr + " : " + note); public void durchschnittberechnen() { int summe = 0; int anzahl = 0; for ( Object note : noten.values()) { try { int wert = Integer.parseInt( (String)note); summe = summe + wert; anzahl++; catch ( NumberFormatException ex) { System.out.println( "Ungültige Note: " + note); System.out.println( "Durchschnitt: " + (double)summe/anzahl);
Blatt Nummer: 13 public void showmenu() { System.out.println( "\nnotenliste"); System.out.println( "----------"); System.out.println( "(1) Note eingeben"); System.out.println( "(2) Noten ausgeben"); System.out.println( "(3) Durchschnitt berechnen"); System.out.println( "(4) Ende\n"); public void start() { int auswahl; do { showmenu(); auswahl = cl.readint( "Auswahl? "); switch ( auswahl) { case 1: noteeingeben(); break; case 2: notenausgeben(); break; case 3: durchschnittberechnen(); break; while ( auswahl!=4); new Notenliste().start();