Algo Klausur Ende WS 01/02 vom 13.03.2002 Aufgabe 1: /15 = /5 + /5 + /5 Aufgabe 2: /25 = /10+ /5 + /5 + /5 Aufgabe 3: /25 = /10+ /5 + /5 + /5 Aufgabe 4: /35 = /5 + /10+ /20 ----------------------------------------------------------------------------------------------------------------Summe: /100 Aufgabe 1: (a) -= C =- Schreiben Sie ein kleines Hauptprogramm (!), in dem ein 2-dimensionales Array der Größe 4*4 angelegt wird. Das Array soll chars enthalten und alle Elemente des Arrays sollen mit ´+´ initialisiert werden. Antwort: (b) Gehen Sie davon aus, dass Ihr kleines Hauptprogramm aus Aufgabe (a) funktioniert. Erweitern Sie dieses um ein paar Zeilen, die das Array so ausgeben: ++++ ++++ ++++ ++++ Sie sollen keine zusätzliche Funktion oder Methode schreiben. Es geht hier nur um die Schleife! Antwort: (c) Ergänzen Sie das Programm noch um eine (einzige!) Schleife, die die beiden Diagonalen des Arrays mit ´*´versieht. Das Array soll so aussehen: *++* +**+ +**+ *++* Aufgabe 2: (a) -= C =- Schreiben Sie eine Funktion grossSchreiben, die als Parameter eine Zeichenkette s hat und alles Kleinbuchstaben der Zeichenkette in Großbuchstaben umwandelt, Großbuchstaben und andere Zeichen jedoch unverändert lässt. Es soll die Anzahl der umgewandelten Zeichen als Returnwert zurück gegeben werden. Hinweis: Benutzen sie die folgenden C – Bibliotheksfunktionen - int islower (char c) - char toupper (char c) liefert den Wert true falls c ein Kleinbuchstabe ist liefert den Großbuchstaben von c bzw. c selbst, wenn c bereits ein Großbuchstabe ist WICHTIG: Es soll ein Character Array benutzt werden! Antwort: #include <stdio.h> int gross(char array[]) { int i=0; int a=0; while(array[i]) { if(islower(array[i])) { array[i]=toupper(array[i]); a++; } i++; } return a; } int main(){ char array[160]; int a=0; printf(„Bitte geben Sie ihren string ein:“); scanf(„%s“,&array); printf(„Ihr String lautet: %s“,array); a=gross(array); printf(„Umgewandelter String: %s“,array); printf(„Anzahl der Umwandlungen:%i“,a); } (b) Im Hauptprogramm sei die Integervariable a und das Char-Array s definiert. Wie sieht dann der Aufruf der Funktion grossSchreiben aus? (c) Wie müsste die Deklaration der Funktion grossSchreiben aussehen, wenn man nicht nur die Anzahl der umgewandelten Zeichen sondern auch die Anzahl der nicht umgewandelten Zeichen zurückgeben möchte? (d) Schreiben Sie eine Funktion istEineGeradeZahl, die als Parameter einen int hat und als Rückgabewert true liefert wenn dieser eine gerade Zahl ist. Aufgabe 3: (a) -= JAVA =- Gegeben sind die folgenden Klassendeklarationen 1 2 03 04 05 06 07 08 09 10 11 public abstract class A { private int x; 12 13 14 15 public final class B extends A { public A (int x) { x=x; } public abstract int f1 (int public abstract int f2 (int public abstract static void public final int f4 (int a) a); a); f3 (); {…} } public B (int x) { A(x); 16 17 18 19 20 } public int f1 (int a) {…} //int f2 (int a) … public int f4 (int a) {…} } In einigen Zeilen befinden sich Fehler, geben Sie die Zeilennummer und jeweils eine kurze Begründung an. (Es sind mehr Punkte aufgeführt als es Fehler gibt) 1. 2. 3. 4. 5. 6. 7. 3 b-d: Gegeben sind die folgenden unvollständigen Klassendeklarationen: public abstract class Figur { //Gemeinsamkeiten verschiedener Figuren public Figur(double x, double y) {…} //Figur hat die Position x,y) public abstract double flaeche () ; ... } public final class Kreis extends Figur { public Kreis (double x, double y, double r) {…} //Kreis hat die Position x,y und den radius r public double flaeche () {…} //ermittelt die Fläche des Kreises ... } (b) Vervollständigen Sie die privaten Bereiche der Klassen „Figur“ und „Kreis“. Figur: Kreis: (c) Geben Sie den Konstruktor der Klasse Figur an. (d) Welche der folgenden Programmzeilen ist falsch? Geben Sie jeweils eine kurze Begründung! JAVA: 1 2 3 4 5 Kreis Figur Kreis Figur Figur k1 f1 k2 f2 [] = new Kreis (10.0); = new Figur (17.0, 20.2); = new Kreis (17.0, 20.2, 3.4); = new Kreis (17.0, 20.2, 3.4); feld = new Figur [10]; 1. 2. 3. 4. Aufgabe 4: -= JAVA =- Wir gehen davon aus, dass Objekte die die Schnittstelle „Comparable“ implementieren ein Funktion compareTo() besitzem, die einen Vergleich zweier Objekte erlaubt: Java: public interface comparable { /** *@return -1 wenn Empfängerobjekt < other, * +1 wenn > und 0 wenn = = ; */ public int compareTo (Object other); } Die folgende doppelt verkettete Liste sei so aufgebaut (Repräsentationsvariante), dass die Listenelemente stets aufsteigend sortiert sind. Die interessanten Teile der Klasse sehen wie folgt aus: Java: public class list { private static class Node { comparable value; Node previous; Node next; } private Node first; private Node last; //Knoten Klasse //Inhalt eines Knotens //Referenz auf Vorgänger //Referenz auf Nachfolger //Referenz auf ersten Kn //Referenz auf letzten Kn } (a) Schreiben Sie eine Methode, die feststellt, ob ein Objekt in der Liste enthalten ist und je nach dem true oder false zurückgibt. (b) Schreiben Sie eine Methode void insert (comparable x), die das Objekt x an der richtigen Stelle einfügt. (c) In Java verfügt jedes Objekt über eine Methode int hashCode (), die für das Objekt eine (relativ eindeutige) ganze Zahl zurück gibt. Geben Sie die Deklaration der Datenstruktur einer Hashtabelle an (Methode der dichten Verschiebung) und schreiben Sie den Konstruktor und die Methode zum Einfügen eines Objekts auf. Java: Void insert (Objekt key, Object value); Hinweis: null Objekte sollten als key nicht zugelassen sein. Erzeugen Sie in diesem Fall eine Null pointer Exception! Class Hashtable { //private Datenstruktur Hastable ( //Konstuktor ) Void insert ( //Einfügen )