Verschieden Klausur fragen

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Verschieden Klausur fragen
Hi

ich habe ein parre verschiedene fragen:

klausur 06.08.2009

UML Aufgabe 2
d- welch diagramm muss ich nehmen Interaktion oder Objektdiagramm

Rekursion: aufgabe 3
e- wie verwede ich di initFoo …wie ist den code

Radix :
beim c den erste code “sortPos” kann mir jemand den code schreiben wie er ist?

danke


UML Aufgabe 2 : Ich würde sagen Aktivitäts- oder Kommunikationsdiagramm.


Radix-Sort (sortPos):

int[] tmp = new int[to - from];
for(int i = from; i < to; i++) {
  tmp[i - from] = array[i];
}
int arrayPos = 0;
for(int i = 0; i < 10; i++) {
  for(int j = 0; j < tmp.length; j++) {
    if(getDigit(tmp[j], pos) == i) {
      array[arrayPos] = tmp[j];
      arrayPos++;
    }
  }
}

ich denke er tuts - habs nicht ausprobiert :wink:
der rest is dann ja nicht mehr so schwer…
anregungen und kritik erwünscht.


Rekursion: aufgabe 3
e- wie verwede ich di initFoo …wie ist den code


Sieht gut aus und funktioniert, aber ich denke es sollte int arrayPos = from; sein. Und falls to und from inklusive sind, muss es new int[to - from + 1]; und i <= to sein. Aber sonst super. Danke.


Aufgabe 3 sollte so gehen (Fehler bitte melden)

public static int foo(int n) {
    int ret;

    // dynamisch start
    if (fooTable[n] != UNKNOWN) {
        return fooTable[n];
    }
    // dynamisch ende

    if (n == 0) {
        ret = 3;
    } else if (n == 1) {
        ret = 1;
    } else {
        ret = foo(n - 1) + bar (n - 2);
    }

    // dynamisch start
    fooTable[n] = ret;
    // dynamisch stop

    return ret;
}

danke sieht gut aus


für die Laufzeit hab ich O(n) und für den Speicherplatz ebenfalls. kann das wer bestätigen?


Hi,

ich übe Rekursion :slight_smile:
Aber ich versteh nicht wie man auf das zeug mit dem fooTable kommt. Das in der Mitte ist klar und hatte ich auch genauso. Aber das andere versteh ich irgendwie nicht.

Hat dazu jemand eine Idee?


Mit Dynamischer Programmierung versucht man, mehrfache Berechnung von (Zwischen)-Ergebnissen zu vermeiden. Das geht zum Beispiel, indem man die Zwischenergebnisse in einer Tabelle ablegt und vor der eigentlichen Funktionsauswertung nachschaut, ob man die Funktion fuer die jeweiligen Argumente schon berechnet hat. Falls ja, liest man den Wert aus der Tabelle aus anstatt ihn erneut zu berechnen (das ist der Teil vor dem rekursiven Code). Falls nein, berechnet man den Wert (mit ganz normaler Rekursion) und speichert ihn vor der Rueckgabe in der Tabelle (damit man ihn beim naechsten Mal einfach auslesen kann; dies ist der Teil nach der Rekursion).
Dabei muss einem klar sein, dass Dynamische Programmierung immer ein Handel von Laufzeit zu Speicherplatz ist. Die Tabelle muss dabei soviele Dimensionen haben, wieviele Argumente die Funktion hat. Die Laenge in den einzelnen Dimensionen entspricht dem Wertebereich.


oh top!

Danke!
Sehr gute Erklärung!
Jetzt ist mir auch das UNKNOWN klar :wink:


ich hab mal bei der klausur gleichen klausur zur aufgabe 2 ne frage:
und zwar sind da die vererbungsstiche von einem interface zu einer anderen klasse gegeben. Sind die vererbungspfeile bei einem Interface automatisch dann so, dass ich in die klasse implements reinschreiben muss also z.B.:abstract EierLegend implements Haustier{} weil normalerweise sind ja die Pfeile bei implements so gestrichelt, oder kann man auch von einem interface nur erben also implements eigentlich doch nicht? und muss man dann z.b. bei der klasse schaf auch objekte von schlachtvieh und so reinschreiben oder nur von Wollegebend? und warum ist wenn wollegebend abstract ist in schaf die methode scheren nicht angegeben? oder muss ich die selbst hinzufügen?
Vllt kann mir auch jemand mal die lösung zum vergleichen schreiben :slight_smile:
THX


Moin,

normal sind die Pfeile gestrichelt, das ist hier unglücklich, die Semantik ist dennoch die gleiche.

Also

public abstract class EierLegend implements Haustier {
.
.
.
}

Einzige Ausnahme: wenn ein Interface von einem Interface erbt, wie hier MilchErzeugend von Haustier, dann würdest du schreiben

interface Haustier extends Milcherzeugend {
}

Ein Interface kann ein anderes nämlich nicht implementieren.

Für die Klasse Schaf musst du die Methoden aus den Interfaces, die Schaf implementiert übernehmen. Also schlachten() und melken(), die stehen ja schon drin :wink:

Wieso Sachen von WolleGebend reinschreiben? Scheren wurde schon in WolleGebend ausprogrammiert und taucht demnach in Schaf nicht mehr auf (wäre die Methode abstract, dann wär sie kursiv geschrieben)

Eine abstrakte Klasse KANN eine Methode ausprogrammieren, oder sie leer lassen. Nur wenn sie leer ist (und abstract) muss die Unterklasse sie implementieren.


Ah danke stimmt :slight_smile:
Nur wär das dann nicht eigentlich anders rum nämlich
interface Milcherzeugend extends Haustier {
}
und warum kann es die EIerlegendewollmichsau nicht geben?
liegt das daran, dass diese klasse von mehreren Unterklassen von Haustiere erbt?
und dann noch zu dieser aufgabe ist das wahr oder falsch :
„In Java gibt es generische Klassen, die bei der Instanziierung durch einen generischen
Klassenparameter konkretisiert werden. Als Klassenparameter können dabei sowohl
Klassen als auch Interfaces ¨ubergeben werden.“
ich hätte gesagt es ist falsch, da keine Objekte von Interfaces gebildet werden können
andererseits steht in den folien, dass der Typ einer Objektvariablen von einer Schnittstelle sein kann… mm aber eine Objektvariable ist ja wieder was anderes…


Ja muss andersrum.

interface Milcherzeugend extends Haustier {

}

Das mit den Unterklassen von Haustier ist egal. Das Problem ist aber, dass die EierlegendeWollMilchSau von mehreren Klassen erbt. Das ist in Java nicht möglich.

Du kannst von generischen Typen in einer Klasse generell keine Objekte bilden.
Schau dir eure Klasse Pair<T0, T1> an und versuch mal ein Objekt von T0 innerhalb von Pair zu erzeugen. Das wird nicht funktionieren, schließlich weiß man nicht welche Konstruktoren diese Klasse besitzt (wenn Sie überhaupt welche hat). Diese generischen Typen können auch Interfaces sein und somit ist die Aussage richtig


also wäre meine antwort jetzt richtig, wenn ich falsch ankreuzen würde?
Ah okay aber mehrere interfaces darf eine klasse implementieren oder?


Eine Klassen kann mehrere Interfaces implementieren, aber nicht von mehreren Klassen erben, richtig :slight_smile:


So jetzt wollte ich mal anfrgaen, nachdem in dem Prüfungs-wiki dazu keine Lösung vorhanden ist, ob jamand mir von den Ankreuzaufgaben(Klausur 24.2.11 , erste Aufgabe) Lust hat mir mal die Lösungen davon zu verraten…
Ich habs gemacht aber bei manchem weiß ich so gar nicht weiter:
meine Lösungen wären(teilweise eher eine Tendenz was ich nicht wüsste ob ich zu den Sachen dann überhaupt was angekreutzt hätte)
a)falsch
b)richtig
c)richtig
d) f: O(log(n))
g: O(nlog(n))

e) richtig (würd ich etz mal sagen, nach dem es doch für eine einfachverkettete so ist oder)
f) falsch (ich weiß nur, dass es besser als O(n) ist aber wie gut es genau ist wurde uns in der Übung gesagt kann man so nicht sagen)
g)
h) falsch ( es ist ja nur einfachvererbung in Java möglich aber im UML diagramm darf es stehen denk ich mal)
i) mm da ist meine Tendenz eher zu richtig aber ka


Schau mal WS2010, steht irrtümlicherweise da, wenn ich das richtig sehe