klausur SS 2005

jogo
Windoof-User
Windoof-User
Beiträge: 40
Registriert: 14. Aug 2009 16:51

klausur SS 2005

Beitrag von jogo »

hallo,
ich habe eine frage zur letzten aufgabe und da zur letzten teilaufgabe(klausur SS 2005). wäre die aufgabe 6.4. auch so korrekt gelöst???

public void printMietbar(Produkt[ ] produkte) {
for (Produkt current : produkte) {
if(current instanceof Mietbar ) {
System.out.println(current.getName());
}
current = current.next();
}
}

wär cool, finde diese form der iteration besser :)

danke und gruß...

Melkom
Mausschubser
Mausschubser
Beiträge: 89
Registriert: 21. Okt 2005 13:58
Wohnort: Frankfurt am Main

Re: klausur SS 2005

Beitrag von Melkom »

Gegen den Iterator ist prinzipiell nicht einzuwenden. Nur die Zeile

Code: Alles auswählen

current = current.next();
stimmt nicht. Produkt hat keine Methode next(). Das eigentliche Iterieren durch den Array macht die erweiterte for-Schleife schon von selbst. D.h. current verweist bei jedem Durchlauf auf ein neues Element.

jogo
Windoof-User
Windoof-User
Beiträge: 40
Registriert: 14. Aug 2009 16:51

Re: klausur SS 2005

Beitrag von jogo »

alles klar, hatte ich übersehen. danke!!!

jogo
Windoof-User
Windoof-User
Beiträge: 40
Registriert: 14. Aug 2009 16:51

Re: klausur SS 2005

Beitrag von jogo »

hallo,
diesmal hab ich einen frage zur aufgabe 5.3 dieser klausur.
das ist der lösungsvorschlag:

public Set generateLottozahlen( ) {

// ziehung leeren / initialisieren
ziehung.clear( )

// Lottozahlenmenge füllen bis sechs verschiedene Zahlen drin sind .
while (ziehung.size( ) < m) {
ziehung.add(new Integer(r.nextInt(n) + 1) ) ;
}
return ziehung ;
}

meine lösung:

public Set generateLottozahlen( ) {
Random r = new Random();
while(ziehung.size() < m) {
ziehung.add(r.nextInt(n) + 1);
}
return ziehung;
}
}

meine fragen:
- ist das "ziehung.clear( )" notwendig, die menge ist zu begin doch eh leer?
- ich habe das TreeSet ziehung als TreeSet<int> initialisiert, dann brauch ich das explizite "new Integer" nicht, richtig?
- der zufallsgenerator wird in einer vorigen aufgabe dereits im konstruktor initialisiert, da ihn nur diese methode hier verwendet, habe ich ihn erst hier initialisiert, geht das?
- sorgt das Set automatisch dafür, dass keine dopplungen vorkommen?

sehr spezifisch, aber eine antwort wäre super, dann wüsste meinereiner, dass er ein bisschen was kapiert hat ;)
gruß

Max Web
Neuling
Neuling
Beiträge: 9
Registriert: 9. Jun 2009 19:57

Re: klausur SS 2005

Beitrag von Max Web »

ist das "ziehung.clear( )" notwendig, die menge ist zu begin doch eh leer?
Am Anfang ist sie leer, das stimmt. Was passiert allerdings, wenn Du die Methode ein zweites Mal aufrufst und schon 6 (oder aus irgendeinem Grund sogar mehr...) Zahlen im Set vorhanden sind?
Richtig, dann wird das Set so retourniert wie es vor dem Aufruf der Methode war, da die Schleife so nicht durchlaufen wird. Deshalb würde ich sagen: notwendig!
ich habe das TreeSet ziehung als TreeSet<int> initialisiert, dann brauch ich das explizite "new Integer" nicht, richtig?
Primitive Typen als Typparameter für Generics sollten nicht gehen. Dass stattdessen die Wrapperklasse Integer verwendet wird ist richtig.
der zufallsgenerator wird in einer vorigen aufgabe dereits im konstruktor initialisiert, da ihn nur diese methode hier verwendet, habe ich ihn erst hier initialisiert, geht das?
Ich kenne die Aufgabe jetzt nicht so genau - funktionieren sollte beides. Ist also vermutlich eine reine Stilfrage.
sorgt das Set automatisch dafür, dass keine dopplungen vorkommen?
Beschreibung eines Sets in der Java-API:
A collection that contains no duplicate elements
Gruß,

Max

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: klausur SS 2005

Beitrag von elvire »

Hallo,

ich habe eine Frage zur 3. Aufgabe (Multiple Choice) dieser Klausur. Die 7. Aussage ist:
"Mehrere Exceptions verschiedenen Typs können mit einer einzigen catch-Klausel gefangen werden." Und die Antwort ist "wahr".

Ich dachte, mehrere Exceptions verschiedenen Typs können eher mit einer einzigen throws-Klausel gefangen werden. Oder irre ich mich?

Danke

Elvire

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: klausur SS 2005

Beitrag von Owyn »

elvire hat geschrieben:ich habe eine Frage zur 3. Aufgabe (Multiple Choice) dieser Klausur. Die 7. Aussage ist:
"Mehrere Exceptions verschiedenen Typs können mit einer einzigen catch-Klausel gefangen werden." Und die Antwort ist "wahr".

Ich dachte, mehrere Exceptions verschiedenen Typs können eher mit einer einzigen throws-Klausel gefangen werden. Oder irre ich mich?
Eine throws-Klausel fängt überhaupt nichts, sie sagt nur aus, dass eine Methode potenziell Exceptions werfen kann (die dann natürlich gefangen werden müssen).

Eine catch-Klausel kann tatsächlich verschiedene Exceptions fangen, im Extremfall sogar alle, in dem einfach die Überklasse gefangen wird: catch (Exception e) { ... }.

Gruß,
Christian Heinig
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Re: klausur SS 2005

Beitrag von elvire »

Alles klar. Danke!

mdesa
Erstie
Erstie
Beiträge: 20
Registriert: 1. Jul 2009 14:26

Re: klausur SS 2005

Beitrag von mdesa »

Frage Nr. 1:

Code: Alles auswählen

class Rec{
  static void x(int n){
    System.out.print("0");
    if(n > 0)
      x(n - 1);
  }

  static void z(int n){
    x(n);
    System.out.println();
  }

  static void y(int n){
    z(n);
    if(n > 0)
      y(n - 1);
    z(n+1);
  }
}
Wir sollen nachvollziehen welche Ausgabe angezeigt wird für y(5)
Dass Ergebnis ist

000000
00000
0000
000
00
0
00 <------
000
0000
00000
000000

Ich kann alles nachvollziehen bis zur Markierten stelle. n wird mit der Zeit 0 und darum wird z auf 1 gesezt z(1) => x(1) und daraus folgt die Ausgabe von zwei nullen.
Hört das Programm nach diesem Ausdruck denn nicht auf?? Ich verstehe nicht wie es von oben x(0) eine weitere Aktion geben kann.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Frage Nr. 2:

Das Zugriffsrecht protected vor einer Methode legt fest, dass
diese Methode nur von Methoden einer Unterklasse ¨uberschrieben
werden darf.

Diese Aussage ist falsch. Aber warum??
Auf Variablen so wie Methoden die eine Protected Signatur haben könne Alle unterklassen Zugreifen und somit könnte man sie auch überschreiben,oder nicht?!?

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Frage Nr. 3:

Code: Alles auswählen

public class Klaas{
  public static int x(int n){
    if(n > 0)
       return 2*x ( n−1) ;
    else
      return 1 ;
  }

  public static void y(int m, int n){
    if(m > 0){
      System.out.print( x(n - m) + ” ”);
      y(m − 1, n);
      System.out.print(” ” + x(n − m));
    }
    else{
      System.out.print(x(n));
    }
  }
}
Ich kann hier die Zahlenwerte nicht nachvollziehen. Dass bei x(0) eine 1 zurückgegeben wird verstehe ich.
aber wie soll ich darauf schliessen dass x(1)=2 und den rest. es wird halt nie eine konkrete Zahl returnt. Immer Ergebnise wie 2*x(4)......

Wuerde das Programm auch noch funktionieren, wenn man in Zeile 4 den
Aufruf x(n-1) durch this.x(n-1) ersetzen w¨urde? Begruendung?

Meine Antwort ist :
Mit this greift man aus der klasse raus und da dort kein x(n-1) existiert könnte man die Änderung nicht machen. Wäre das auch Richtig???
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Frage Nr. 4:

Bezieht sich auf die Aufgabe mit dem LottoSimulator.Dort wird ein Set ziehung nicht mit einem int wert sonder mit Integer gefüllt.
Könnt ihr mir bitte erklären wann es notwenig ist ein Set mit Integer zu füllen und wann mit int ?? Was sind die unterschiede.
Wäre gut für mein verständnis.

Vielen Dank für alle Antworten :D :shock:
Zuletzt geändert von Daniel S. am 27. Aug 2009 16:23, insgesamt 1-mal geändert.
Grund: Code formatiert

Daniel S.
Mausschubser
Mausschubser
Beiträge: 87
Registriert: 25. Sep 2007 12:28
Wohnort: Mörfelden

Re: klausur SS 2005

Beitrag von Daniel S. »

Zu 1: Es wird am Ende sogar noch eine Zeile mit 7 Nullen ausgegeben. Die Methode y zählt ja erst nach unten durch die Ausgabe mittels z und dem rekursiven Aufruf von y, nach dem rekursiven Aufruf wird aber auch nochmal z aufgerufen. Das bewirkt, dass nachdem n irgendwann 0 war, nur eine Null von z(0) ausgegeben wird und der rekursive Aufruf nicht mehr stattfindet (da die Bedingung n > 0 nicht erfüllt wird). Dann kommt es zum Aufruf von z(0+1), was die beiden von dir markierten Nullen ausgibt. Danach wird die Ausführung nach dem letzten Reursiven Aufruf fortgesetzt, wo y mit dem Wert 0 aufgerufen wurde, darin hatte n noch den Wert 1, es wird also noch z(1+1) aufgerufen das ganze geht dann so weiter, bis an den Anfang, wo n den Wert 5 hatte und y mit dem Wert 4 aufgerufen wurde, danach wird z(5+1) aufgerufen, was 7 Nullen ausgiebt und dann ist das Programm beendet.

Zu 2: Protected gibt ja nicht an ob eine Methode überschrieben werden darf oder nicht, sondern ob sie sichtbar ist bzw. aufgerufen werden darf oder nicht. Deshalb ist die Aussage falsch.

Zu 3: Doch es wird irgendwann eine Konkrete Zahl zurückgegeben: return 1
x ruft sich ja selbst rekursiv auf, verkleinert den Wert des Parameters aber immer um 1 irgendwann kommt es dann zum return 1, wenn n den Wert 0 hat. Der zurückgegebene Wert wird dann unter Umständen noch mehrmals mit 2 multipliziert, z.B. wird x(3) zu 2*x(2), das wird dann zu 2*2*x(1), und das wird zu 2*2*2*x(0). x(0) ist ja 1, also ist das Ergebnis von x(3)=2*2*2*1=8.

this.x(n-1) verursacht einen Fehler, da eine statische Methode keine Instanz der Klasse besitzt. Mit this greift man immer explizit auf die aktuelle Instanz der Klasse zu, nicht aus der Klasse raus.

Zu 4: Das wurde oben schon von Max Web beantwortet. Vielleicht noch der Grund warum das nicht geht: Als Typparameter wird eine Superklasse von Object erwartet. In Java erben alle Klassen, für die keine Superklasse mit extends angebene wird, automatisch von der Klasse Object. Die primitiven Datentypen int, float, char (und die anderen, die auch klein geschrieben werden) sind jedoch keine Klassen und erben deshalb nicht von Object und können daher nicht als Typparameter verwendet werden. Damit man trotzdem primitive Datentypen in Sets speichern kann, gibt es im Package java.lang die Wrapper-Klassen Integer, Float, etc. diese verpacken den int, float, etc. -Wert in einer Klasse und stellen auch verschiedene weitere nützliche Methoden bereit. Die Klassen sind auch speziell, da sie sich wie die primitiven Datentypen verhalten und z.B. sowas möglich ist: int i = new Integer(42);
Mit freundlichen Grüßen
Daniel

jogo
Windoof-User
Windoof-User
Beiträge: 40
Registriert: 14. Aug 2009 16:51

Re: klausur SS 2005

Beitrag von jogo »

hallo,
meine frage zu A5:
in der lösung steht:
public String to String() {
return ”Hörsaal: ” + building + ”/” + room + ” (” + seats + ” Plaetze)”;
das ist jetzt schon öfter in lösungen zu übungen und auch wärend des propro aufgetaucht. meiner meinung nach braucht man ja keine get-methoden, wenn man letzten endes eh direkt auf die variablen zugreift. wieso funktioniert das überhaupt trotz "private"?!?
ich dachte das sollte so aussehen:
public String to String() {
return ”Hörsaal: ” + getBuilding() + ”/” + getRoom() + ” (” + getSeats() + ” Plaetze)”;
danke

Daniel S.
Mausschubser
Mausschubser
Beiträge: 87
Registriert: 25. Sep 2007 12:28
Wohnort: Mörfelden

Re: klausur SS 2005

Beitrag von Daniel S. »

jogo hat geschrieben:hallo,
meine frage zu A5:
in der lösung steht:
public String to String() {
return ”Hörsaal: ” + building + ”/” + room + ” (” + seats + ” Plaetze)”;
das ist jetzt schon öfter in lösungen zu übungen und auch wärend des propro aufgetaucht. meiner meinung nach braucht man ja keine get-methoden, wenn man letzten endes eh direkt auf die variablen zugreift. wieso funktioniert das überhaupt trotz "private"?!?
ich dachte das sollte so aussehen:
public String to String() {
return ”Hörsaal: ” + getBuilding() + ”/” + getRoom() + ” (” + getSeats() + ” Plaetze)”;
danke
Mit public/protected/private schränkt man nur die Sichtbarkeit von außen ein. Wenn ein Attribut a in einer Klasse A private ist, kann man z.B. nicht
A a = new A(); a.a = ...;
schreiben. Um trotzdem von außen auf a zugreifen zu können gibt es die Getter/Setter:
A a = new A(); a.setA(...);

Innerhalb der Klasse A kann man natürlich noch direkt auf a zugreifen, anderfalls könnte man in der getA-Methode ja auch nicht das a zurückgeben.

Das heißt innerhalb der Klasse ist es egal ob man mit den Getter-/Setter-Methoden oder direkt auf die Attribute zugreift.
Mit freundlichen Grüßen
Daniel

jogo
Windoof-User
Windoof-User
Beiträge: 40
Registriert: 14. Aug 2009 16:51

Re: klausur SS 2005

Beitrag von jogo »

hallo,
nochmal eine frage zur aufgabe 4:
warum wird bei der iterativen methode nicht wie bei der rekursiven methode mit dem mitglied-objekt direkt gearbeitet, sondern "item" verwendet?

Code: Alles auswählen

public static void printIterativ(FitsnessStudioMitglied mitglied) {
    FitsnessStudioMitglied item = mitglied;
    while(item != null) {
        if(berechneBMI(item)>25) {
            System.out.println(item.name);
        }
        item = item.next;
    }
}

Code: Alles auswählen

public static void printRekursiv(FitsnessStudioMitglied mitglied) {
    if(mitglied != null) {
        if(berechneBMI(mitglied)>25) {
            System.out.println(mitglied.name);
        }
        printRekursiv(mitglied.next);
    }
}
danke

Daniel S.
Mausschubser
Mausschubser
Beiträge: 87
Registriert: 25. Sep 2007 12:28
Wohnort: Mörfelden

Re: klausur SS 2005

Beitrag von Daniel S. »

Das hätte man machen können, indem die Definition von item weggelassen wird und jedes Vorkommen von item durch mitglied ersitzt wird. Es wird dann aber durch mitglied = mitglied.next; der Wert des Parameters geändert, das ist zwar nur innerhalb der Methode gültig und ändert hier auch nichts am Ergebnis, aber sowas wird normalerweise nicht gemacht, da es sonst zu Fehlern kommen könnte. Wenn jemand zum Beispiel am Ende nochmal das erste Mitglied ausgeben möchte und schnell eine Zeile ergänzt:

Code: Alles auswählen

public static void printIterativ(FitsnessStudioMitglied mitglied) {
    while(mitglied != null) {
        if(berechneBMI(mitglied)>25) {
            System.out.println(mitglied.name);
        }
        mitglied = mitglied.next;
    }
   System.out.println("Erster war: " + mitglied.name);
}
Dann gibt das erstmal eine NullPointerException. Das Beispiel macht natürlich nicht viel Sinn und der Fehler wäre auch schnell gefunden, aber für eine gute Wartbarkeit des Codes lässt man die Parameter eigentlich immer unverändert. Es gibt auch ein Schlüsselwort um die Veränderung des Parameters explizit zu verhindern, aber ich will jetzt niemanden verwirren, das kam glaube ich in der Vorlesung nicht dran.
Mit freundlichen Grüßen
Daniel

elvire
Erstie
Erstie
Beiträge: 21
Registriert: 19. Okt 2008 07:15

Klausur SS 2007

Beitrag von elvire »

Hallo,
ich hätte eine Frage zur 4. Übung dieser Klausur und zwar zur Methode reverse(). Wie kann ich diese Methode implementieren? Stimmt das so weit?

public void reverse(){

if( prev == this){

return;
}

while( prev != this; ){

System.out.print (prev + ",");
prev= prev.prev;

}

System.out.println();
}

Vielen Dank :o

Elvire

Antworten

Zurück zu „Archiv“