Objektorientierte Programmierung Aufgabe 1 (C0 - Schleifen) Was gibt das folgende Programm bei der Eingabe a = 24 und b = 5 aus? prog aufgabe1 { int a; int b; print("Bitte geben Sie a ein: \n"); read(a); print("Bitte geben Sie b ein: \n"); read(b); a = (a % b) == 0 ? 17 : 10; int i = 1; while ( i < a ) { print(b * i + a); print("-"); i = i + 1; a = a - 1; } } Ausgabe bei a=24, b=5: 1 2 Punkte Objektorientierte Programmierung Aufgabe 2 (Kontourmodell) 2 15 Punkte Gegeben ist das folgende Programm in der Sprache C1. Erstellen Sie zwei Kontourmodelle zu dem im Programm markierten Zeitpunkten. Gehen Sie davon aus, dass für a der Wert 5 und für b der Wert 2 eingegeben wird. prog aufgabe3 int d(int var1, int var2) { return e(var1 - 2, var2); } int e(int var1, int var2) { // 1. Kontourmodell zu diesem Zeitpunkt ausgeben return var1 * var2; } void f(int var1, { int var3; int var3 = var1 + var4 = var2 + g(var3,var4); } int var2) var4; 3; var1; void g(int var1, int var2) { int summe; summe = var1 + var2; // 2. Kontourmodell zu diesem Zeitpunkt ausgeben print("Summe = "); print(summe); print("\n"); } { int a; int b; int c; print("Bitte geben Sie a und b ein: \n"); read(a); read(b); c = d(a,b); f(c,b); } Objektorientierte Programmierung 3 Objektorientierte Programmierung Aufgabe 3 (C2 - globale Variablen) Was gibt dieses Programm aus? Begründen Sie Ihre Antwort! prog aufgabe3 int x; void f1(float y){ x = 10; y = 10;} int y; void f2(int x){ x = 20; y = 20;} int f3() { int y; y = 2; x = y; return x + 1; } int f4() { return f3() + x + y; } { x = 1; int y; y = 5; f1(x); f2(x); x = f3(); x = f4(); print(x);print(" --- "); print(y); } Ausgabe: Begründung (Kontourmodell reicht aus): 4 5 Punkte Objektorientierte Programmierung 5 Objektorientierte Programmierung Aufgabe 4 (C0 - Bedingungen) 6 3 Punkte Formen Sie die folgenden Formulierungen in logische Ausdrücke der Sprache C0 um. Gehen Sie davon aus, dass x, y, z Zahlen und u, v logische Ausdrücke sind. Der logische Ausdruck ist wahr, wenn 1. x größer als y ist und y größer oder gleich z ist Ausdruck: 2. die Summe von x und y kleiner dem Produkt von y und z ist oder die Differenz von z und x größer als 2 ist Ausdruck: 3. u wahr ist und v nicht wahr ist oder u und v nicht wahr sind Ausdruck: Objektorientierte Programmierung 7 Aufgabe 5 (C3 - Parameterübergabemechanismen) 10 Punkte Gegeben ist folgendes Programm in der Sprache C3 prog aufgabe4 int z; void g (______ int x, ______ int y) int v; v = x; v = v * y; x = v; y = z / 2; } { { int w; z = 7; w = 15; g(______ z, ______ w); print ("\nz= "); print(z); print ("\nw= "); print(w); } Die Ausgabe des Programms kann durch die verschiedenen Parameterübergabekonzepte beeinflusst werden. Tragen Sie in die folgende Tabelle für die verschiedenen Aufrufe von g die erzielten Ausgabewerte ein. Ein Werteaufruf wurde in der Tabelle mit − gekennzeichnet. Parametertyp z Parametertyp w Ausgabe des Programms ref ref z= w= inout inout z= w= − inout z= w= − − z= w= ref out z= w= Objektorientierte Programmierung Aufgabe 6 (C4 - Reihungen) 8 8 Punkte Gegeben ist das folgende Programm. In diesem sind von den beiden Unterprogrammen print array und reverse array nur die Funktionsköpfe vorgegeben. Implementieren Sie die fehlenden Funktionsrümpfe. prog aufgabe5 // Prozedur gibt die Zahlen der Reihung zeilenweise // (eine Zahl pro Zeile) in der Konsole aus void print_array(int [] zarray) { } // // // // // Funktion dreht die Zahlen aus der Reihung zarray um Beispiel: zarray = 4, 7, 9 ==> neue Reihung = 9, 7, 4 neue Reihung wird im Funktionswert zurueck gegeben zarray wird durch die Sortierung nicht veraendert, d.h. sie enthaelt nach der Sortierung die Elemente in urspruenglicher Reihenfolge int [] reverse_array(int [] zarray) { } { int [] zfeld; int [] sortfeld; zfeld = new int [10]; sortfeld = new int [10]; int i; i = 0; while (i < 10) { read(zfeld[i]); i = i + 1; } sortfeld = reverse_array(zfeld); print_array(sortfeld); } Objektorientierte Programmierung Aufgabe 7 (zusammengesetzte Datentypen) 9 2 Punkte Definieren Sie in C# einen Verbund mit dem Namen Buch. Dieser Verbund wird aus folgenden Komponenten zusammengesetzt: 1. Kennung, 2. Titel, 3. Autor, 4. Anzahl Seiten und 5. Kurzbeschreibung Die Kennung und die Anzahl der Seiten sind ganze Zahlen. Alle weiteren Einträge sollen als Strings abgelegt werden. Objektorientierte Programmierung Aufgabe 8 (Vererbung) 10 7 Punkte Was gibt dieses Programm aus? Begründen Sie Ihre Antwort! using System; namespace aufgabe { class Zahlenpaar { protected static double zahl1=5; protected double zahl2=2; public void setZahl1(double param) { zahl1 = param; } public void setZahl2(double param) { zahl2 = param; } public virtual void print() { Console.WriteLine("Zahl1 = " + zahl1 + " : Zahl2 = " + zahl2); } } class Taschenrechner : Zahlenpaar { double summe() { return zahl1 + zahl2; } public double differenz() { return zahl1 - zahl2; } public override void print() { base.print(); Console.WriteLine("Summe = " + summe()); Console.WriteLine("Differenz = " + differenz()); } } class Program { static void Main() { Zahlenpaar aundb = new Zahlenpaar(); Taschenrechner TR100 = new Taschenrechner(); aundb.setZahl1(7.0); aundb.setZahl2(3.0); TR100.print(); } } } Ausgabe: Begründung (z.B. Kontourmodell mit Objekten): Objektorientierte Programmierung 11 Objektorientierte Programmierung Aufgabe 9 (abstrakte Klassen) 12 10 Punkte Das folgende Programm enthält 5 Fehler. Bei diesen Fehlern handelt es sich um Syntaxfehler, fehlende bzw. falsch positionierte Schlüsselworte und Zugriffsschutzverletzungen. Geben Sie bitte die Zeilennummer an, in welcher der Fehler auftritt und erläutern Sie diesen kurz. 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: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: using System; namespace aufgabe8 { abstract class Ausgabe { public void print(); public virtual void print_reell() {} } class Bruch : Ausgabe { int zaehler; int nenner; public void SetzeNenner(int par) { nenner = par; } public void SetzeZaehler(int par) { zaehler = par; } void kuerzen() { int k = nenner; if (nenner > zaehler) k = zaehler; for (; k > 1; k--) { if (zaehler % k == 0) && (nenner %k == 0) break; } zaehler /= k; nenner /= k; } public override void print() { Console.WriteLine(zaehler + "/" + nenner); } public override void print_reell() { float hzaehler = zaehler; float hnenner = nenner; Console.WriteLine(hzaehler / hnenner) } } class Programm { static Main() { Bruch b = new Bruch(); b.SetzeNenner(14); b.SetzeZaehler(8); b.print(); b.kuerzen(); b.print(); b.print_reell(); } } } Objektorientierte Programmierung Fehler 1: Zeile: Begründung: Fehler 2: Zeile: Begründung: Fehler 3: Zeile: Begründung: Fehler 4: Zeile: Begründung: Fehler 5: Zeile: Begründung: 13 Objektorientierte Programmierung Aufgabe 10 (Verständnisfragen) 14 15 Punkte Zu den folgenden Fragen sind jeweils mehrere mögliche Antworten gegeben. Kreuzen Sie die richtigen Antworten an. Nur die korrekte Kombination ergibt einen Punkt. Begründen Sie kurz Ihre Antworten. 1. Programmstück: prog frage4 class Kl { int x; } void f(ref Kl fkl) { fkl.x = 4; } void g(Kl gkl) { gkl.x = 5; } { Kl objKl; objKl = new Kl(); objKl.x = 3; g(objKl); print(objKl.x); f(ref objKl); print(" - "); print(objKl.x); } Was gibt das Programm aus? Gehen Sie bei der Begründung auf die verwendeten Parameterübergabemechanismen ein. a) 3 - 4 b) 3 - 5 c) 5 - 4 Begründung: Objektorientierte Programmierung 2. Wie viele Zahlen kann das Feld zfeld aufnehmen? int [,,] zfeld = new [2,3,4]; a) 9 b) 14 c) 24 Begründung: 3. Programmstück: 1. 2. 3. 4. 5. 6. 7. 8. int [][] z; z = new int [4][]; for (i=0;i<4;i++) z[i] = new int [i+1]; z[0][0] = 5; z[1][0] = 6; z[0][1] = 7; z[1][1] = 8; Warum bricht das Programm ab ? a) NULLReferenceException in Zeile 7 b) ArrayIndexOutOfBoundException in Zeile 4 c) es läuft durch Begründung: 15 Objektorientierte Programmierung 16 4. Programmstück: 1. struct a { public int x; } 2. class b { public int x; } 3. ... 4. a obja = new a; 5. a objc; 6. b objb = new b; 7. b objd; 8. obja.x = 4; 9. objb.x = 5; 10.objc.x = 6; 11.objd.x = 7; Das Programmstück kann so nicht vom Compiler übersetzt werden? In welcher Zeile würde der Compiler einen Fehler melden? a) Zeile 4 - new kann nicht für Verbunde angewendet werden, da diese Wertetypen sind b) Zeile 10 - auf objc.x kann nicht zugegriffen werden, da in Zeile 4 kein Speicher für objc reserviert wurde c) Zeile 11 - auf objd.x kann nicht zugegriffen werden, da in Zeile 7 kein Speicher für objd reserviert wurde d) das Programmstück enthält keine Syntaxfehler Begründung: Objektorientierte Programmierung 17 5. Programmstück: interface b { void print (); } class a { public virtual void print() { Console.WriteLine("Hallo Deutschland!");} } class c : a, b { public override void print() { Console.WriteLine("Hallo Welt!");} void b.print() { Console.WriteLine("Hallo Europa!");} } class Program { static void Main(string[] args) { b objc = new c(); objc.print();} } Was gibt das Programm aus? a) Hallo Welt! b) Hallo Europa! c) Hallo Deutschland! Begründung: Objektorientierte Programmierung Aufgabe 11 (Programm) 18 15 Punkte Definieren Sie in C# eine Klasse Woerterbuch. Diese Klasse verwaltet eine Menge von Wörtern. Verwenden Sie für Ihre Klasse die gegebene Schnittstelle SWB interface SWB { // Einfuegen eines Wortes in das Woerterbuch void setWort(string wort); // gibt die Anzahl der Woerter im Woerterbuch zurueck int getAnzahl(); // zeilenweise Ausgabe aller Woerter im Woerterbuch void print(); } Die Klasse Woerterbuch benötigt weiterhin die privaten Attribute: • wmenge - eindimensionales Feld mit Elementen vom Typ string • anzahl - aktuelle Anzahl der Wörter im Wörterbuch Implementieren Sie die in der Schnittstelle vorgegebenen Methoden als public. Ergänzen Sie die Klasse um folgende Methode: • init() - es wird der Parameter ianzahl vom Typ int übergeben. Dieser gibt die maximale Anzahl von Wörtern im Wörterbuch an. Im Rumpf der Methode muss das Feld wmenge mit der entsprechenden Länge angelegt werden. Weiterhin sollen die einzelnen Feldelemente mit der Zeichenkette ”-” initialisiert werden. Auch die Initialisierung des Attributes anzahl gehört zu den Aufgaben dieser Methode. Bemühen Sie sich um Verständlichkeit und guten Programmierstil (anderenfalls gibt es Punktabzüge). Schreiben Sie die Klassendefinition vollständig und ohne Syntaxfehler. Objektorientierte Programmierung 19 Objektorientierte Programmierung 20 Aufgabe 12 (Programm) 8 Punkte Gegeben sind folgende 3 Klassen: class intbox{ int daten; void set(int d) { daten = d; } int get() { return daten; } } class stringbox{ string daten; void set(string d) { daten = d; } string get() { return daten; } } class boolbox{ bool daten; void set(bool d) { daten = d; } bool get() { return daten; } } a) Schreiben Sie eine generische Klasse blackbox, welche die gegebenen drei Klassen implementiert. Wie lautet die Definition der folgenden Instanzen von der Klasse blackbox • ibox - Elementtyp int, • sbox - Elementtyp string und • bbox - Elementtyp bool. b) Angenommen in Ihrer generischen Klasse blackbox gibt es die Methode public int f() { ... return daten * g();} Beantworten Sie folgende Fragen: • Der Compiler bringt die Fehlermeldung: Der Bezeichner g ist im aktuellen ” Kontext nicht vorhanden“ Warum? Korrigieren Sie den Fehler! • Warum können Sie jetzt die generische Klasse blackbox nicht mehr als int, string bzw. bool instanziieren?