Java-SemesterTest ohne Lösung :(

ZH1896ZH

Mitglied
Moinsen zusammen!
Unser Dozent war so nett und gab uns die letztjährige Java-Prüfung (siehe pdf im Anhang) raus, leider ohne Lösungen.
Hätte jemand Zeit und Lust eine Musterlösung zu fertigen? Meine Studienkollegen und ich wären Dir sehr dankbar! 🙂
Gruss ZH
 

Anhänge

1a) f w f f

Aber wieso soll denn "so einfach" jemand eine Musterlösung dafür fertigen? 😕

Bzw. Ihr lernt am meisten dadurch, es selber zu probieren.
 
Vor allem bringt das selber lösen das Meiste: Ihr habt eine Kontrolle wo ihr evtl. noch Defizite habt, sprich: etwas nicht könnt, falsch macht oder zu lange braucht.

Daher würde ich auch bei der Existenz einer Musterlösung diese erst ganz am Ende betrachten, um meine Lösung zu prüfen. Hier ist aber wichtig: teilweise führen viele Wege zum Ziel. Eine Abweichung von der Musterlösung bedeutet nicht zwingend, dass etwas falsch ist.

Wenn Du eine Lösung erarbeitet hast, dann schaue ich auch gerne einmal drüber. Oder bei Fragen helfen wir gerne.
 
Ok, mein Satz extra für Dich erläutert:
Das Wort ‚teilweise‘ bedeutet nichts Anderes. Das ‚Meistens‘ kann man so nicht sagen, denn wir haben nur einen Aufgabenzettel gesehen.
Wenn man exakter sein möchte, dann könnte man es für das Aufgabenblatt spezifizieren:
- multiple choice Fragen haben eine Lösung. Also hier auf der ersten Seite: entweder etwas ist wahr oder etwas ist falsch.
- Ausgabe eines Codes: ist auch klar bestimmt. Blatt 2 wäre das...
- Aufgabe 3 sind die letzten beiden Punkte nicht genau spezifiziert. Daher sind hier mehrere Lösungen richtig. Aber auch die Punkte davor lassen ggf noch Freiheiten zu, die feinen Unterschieden führen können.
 
Wie kackedreist...ehrlich, wer so faul (vor allem denkfaul) ist sollte allein schon deshalb aus dem Studium ausgesiebt werden.

Man, wie geht mir das heutige Studentenpack auf die Eier...(während ich selber gerade an meiner Masterarbeit sitze). 😡
 
Eventuell bezüglich Musterlösung - meine Sicht auf die einzelnen Aufgaben:
1. Aufgabe: Dies ist multiple Choice. Bei Unsicherheiten sollte es ausreichen, in den eigenen Unterlagen nachzuschlagen. Sollte man dies nicht finden, dann reicht eine Google Suche. Desweiteren würde ich hier jedem empfehlen, da nicht nur wahr / falsch zu sagen, sondern immer eine klare Begründung mitzuliefern. Das kann beim der ersten Frage sein:

Ist String ein primitiver Datentyp?
==> primitive Datentypen in Java sind: boolean, byte, short, int, long, float, double und char. (Ausschluss durch Aufzählung)
==> String ist eine Klasse (java.lang.String) und Klassen sind Referenz-Typen und keine primitiven Typen. (Wissen über String)
==> Evtl. aufstellen einer kleinen Merkregel: primitive Datentypen werden klein geschrieben, Referenztypen groß geschrieben. (Dies ist evtl. wichtig, da es zu den primitiven Typen auch Klassen gibt, die auch gleich heißen können - bis auf die Gross-/Kleinschreibung, z.B. Long, Short, Boolean, ...

2. Aufgabe: Hier macht eine Musterlösung keinen Sinn. Einfach den Code in ein Programm packen und ausprobieren. Einfach und schnell. Wenn hier etwas nicht so ist, wie erwartet: Einfach noch etwas rumprobieren. Was funktioniert wie?

3. Aufgabe: Hier kann eine Musterlösung interessant sein. Aber hier gilt dann die Anmerkung: Es ist nicht alles spezifiziert, so dass es z.B. gewisse Freiheitsgrade gibt. Das führt zu unterschiedlichen Lösungen, die alle als korrekt anzusehen sein dürften.
 
was passiert, wenn in der Musterlösung (un)absichtlich falsche oder zumindest streitbare Lösungen angegeben werden
Naja ich gehe davon aus dass eine richtige Musterlösung angegeben wird. Dann kann man sich auch an dieser orientieren. Aber der Lerneffekt ist dennoch um Vielfaches höher wenn Ihr das selber macht, wie bereits richtig von @JustNobody und anderen angemerkt. Hoffen wir einfach dass nicht jemand einfach so eine Musterlösung anfertigen wird....

By the way... Durch den Dozierenden eine "Probeklausur" bereitzustellen, ist ein Service, kein Muss.
 
ich werde die Prüfung erstmal selber lösen

Sehr löblich.
Übrigens - nur so nebenher: Es gibt nach meiner Beobachtung eine starke Korrelation zwischen Ausgesiebtwerden und Musterlösungsabgeber/lerner: Letztere werden häufig deutlicher aus dem Studium geworfen. (Oder taugen später im Beruf zu nichts.)

Übungsaufgaben/Laborarbeiten sind ähnlich wie Training in der Muckibude: Du kriegst keine dicken Oberame, wenn wer anders die Hanteln für dich hebt. Gute Noten hin oder her.
 
Ok, noch ein schlechtes Wortspiel: Ich habe dafür in die Trick 17 Kiste der mittel bis weniger guten Wortspiele gegriffen. 😀
 
Letztere werden häufig deutlicher aus dem Studium geworfen. (Oder taugen später im Beruf zu nichts.)
Wenn es in einem Studiengang auf die Noten ankommt kann man sich wohl ausrechnen wo die Prioritäten liegen. Und ob das "Training" (auch beruflich) was taugt steht unabhängig davon auf einem anderen Blatt.
 
12784

kann mir jemand sagen wie ich die API-Klassen in mein Eclipse laden kann, damit ich diese einsehen kann? dass anstatt "unknown source" ein link zur klasse Scanner steht.
 
Fehlt dir vielleicht
Java:
import java.util.scanner.*;
?

Nachschlag:
Ich arbeite nicht mit Eclipse, sondern mit Netbeans. In NB erscheint links neben der Zeile ein gelbroter Punkt, und wenn man den anklickt, schlägt Netbeans einem ein oder mehrere Lösungen für das Problem vor. Unter anderem auch fehlende Imports automatisch zu ergänzen.
Ich wäre sehr enttäuscht, wenn Eclipse das nicht tun würde.
 
also...ich werde die Prüfung erstmal selber lösen und dann meine Lösung hier ins Forum posten. Haltet die Ohren steif liebe Freunde.
yoyo liebe Leute,
Ich habe nun endlich mal Zeit gefunden die Prüfung zuerst selbst einmal zu lösen...war gar nicht mal so schwierig wie gedacht 🙂
Trotzdem habe ich noch ein paar Unsicherheiten entdeckt:

Aufgabe 1:
a4 --> Es sei String s = "2 * 3 = " + 2*3; dann zeigt s auf die Zeichenkette "2 * 3 = 2 * 3". Wieso macht der Compiler aus diesem String 2*3=6 ? Verstehe nicht ganz was hier läuft.
d3 --> Wird generell immer zum nächst-tieferen Int-Wert abgerundet?
b1 --> Kann mir jemand ein Beispiel für eine Mehrfachverebung in Java geben?

Aufgabe 2:
3. Wieso ist die Ausgabe BC und nicht B?
7. Meine Lösung ist: 1 2 2. Korrekt wäre aber:
1
2
1
1
2
3
Wieso all diese Zeilenumbrüche wenn da kein println steht?
Verstehe auch nicht wieso es mehr als 3 Ausgaben gibt, da ein Array ja nicht vergrössert werden kann...

Aufgabe 8:
Mit 3./4./5./6. hatte ich Probleme. Besonders wusste ich nicht wie die Methode setOwner() auszusehen hat.
Auch wie es möglich ist zwei Objekte anhand der Variable amount in einer ArrayList zu sortieren.
Das wäre mein Lösungsansatz.
Java:
package Aufgabe8;

import java.text.DecimalFormat;

public class Account implements Comparable<Account> {
    private static int counter = 0;
    private String acctNumber;
    private Customer[] owners;
    private double amount;

    public Account(double amount) {
        this.amount = amount; //steht nicht in der Aufgabenstellung
        counter++;
        DecimalFormat fmt = new DecimalFormat("0000");
        this.acctNumber = fmt.format(counter);
    }

    public boolean setOwner(Customer... customers) { //kein Plan, was machen..
        return false;
    }

    @Override
    public int compareTo(Account o) {
        int a = (int) this.amount - (int) o.amount; // wieso reicht hier eine Cast-Klammer nicht aus??
        return a;
    }

    public String toString() { //steht nicht in der Aufgabenstellung
        return this.amount + "  " + this.acctNumber;
    }

}

Wäre echt froh um ein paar Feedbacks.
 
Also schauen wir uns einmal die Punkte der Reihe nach an:
String s = "2 * 3 = " + 2 * 3;
==> https://introcs.cs.princeton.edu/java/11precedence/

Bei d3: Bei dem Cast zu einer Ganzzahl werden die Nachkommastellen abgeschnitten.

b1: Nein, Java kennt keine Mehrfachvererbung, daher gibt es da auch kein Beispiel für.

Dann ist die Ausgabe "BC" und nicht nur "B", weil da kein break; steht. Dadurch "fällt er durch".

Bezüglich der 7. Aufgabe kann ich Dir nicht folgen. Die Ausgabe ist einfach 1 2 3 - also keine Zeilenumbrüche und auch nur genau diese drei Zahlen. Mehr Zahlen kann es da auch nicht geben, denn Du hast ein Array aus 3 Elementen. Nun werden diese Elemente verändert: Das 2. Element bekommt das erste dazu addiert: 1+1 = 2. Dann bekommt das 3. element (1) das zweite Element (2) dazu => 3. Somit hat man das Array { 1, 2, 3 } und da wird dann ausgegeben.

Aufgabe 8 muss ich mir selbst erst ansehen um dazu etwas näheres sagen zu können....
 
Das mit den Ownern setzen ist doch genau beschrieben:
"Schreiben Sie eine Methode setOwner, welche beliebig viele Objekte vom Typ Customer als Parameter entgegennehmen kann (die Details der Klasse Customer müssen Sie hierzu nicht kennen). Falls die Instanzvariable owners noch undefiniert ist (d.h., wenn diese null ist), sollen die übergebenen Customer Objekte im Array owners gespeichert werden und es wird true zurückgegeben. Andernfalls wird owners nicht geändert und es soll false zurückgegeben werden."

Also wir prüfen owners. Wenn owner null ist, dann geben wir false zurück. Ansonsten sollen die Owners gespeichert werden.
Wie speicherst Du denn Elemente in einem Array? Das ist ja eigentlich unkompliziert. Woran scheitert es? Was dürfen wir näher erläutern?
 
Ach das ist der Grund dafür dass es keine Mehrfachvererbung in Java gibt. Man lernt doch nie aus (auch wenn ich mich grad frage warum das damals in der Ausbildung nie dran kam). Macht aber auf jedem Fall Sinn.
 
Der (oder ein?) Grund ist dieser hier

Das ist der Hauptgrund. Aber es sollte einleuchtend sein, dass ich bei Multiple Inheritance nicht erst eine gemeinsame Basisklasse (So dass diese Raute, die dann für den Namen Diamant sorgte) notwendig ist, um in eine Problemsituation zu geraten.

Es reicht ja schon aus, wenn man zwei Basis-Klassen hat, die dann eine von der Signatur her identische Funktion definiert.

Das Diamond-Problem ist somit lediglich die "auf die Spitze" getriebene Problematik, die dann als Grund herangezogen wird eben gegen Multiple Inheritance. Aber in dem Moment, wo man in C++ entwickelt, sollte man sich das generell gut überlegen, was man macht. Auch wenn man eben gemeinsame Basisklassen bei abgeleiteten Klassen vermeidet (=> Also kein Diamond-Problem), kann man in Probleme kommen und es kann schnell unschöner Code entstehen / notwendig sein.

Beim Design sollte man daher generell immer gut überlegen, wie man die Klassenhirarchie aufbaut. Aber das ist in Java ja auch nicht anders - da ist Inheritance ja auch nicht immer erste Wahl (siehe z.B. "Composition over Inheritance"). Und es gibt auch Möglichkeiten, Funktionalität unabhängig zu gestalten (Strategy Muster).

Wenn man hier dann z.B. C++ Tutorials betrachtet, dann findet man das ähnlich beschrieben, z.B.:
https://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/
 
Also schauen wir uns einmal die Punkte der Reihe nach an:
String s = "2 * 3 = " + 2 * 3;
==> https://introcs.cs.princeton.edu/java/11precedence/

Bei d3: Bei dem Cast zu einer Ganzzahl werden die Nachkommastellen abgeschnitten.

b1: Nein, Java kennt keine Mehrfachvererbung, daher gibt es da auch kein Beispiel für.

Dann ist die Ausgabe "BC" und nicht nur "B", weil da kein break; steht. Dadurch "fällt er durch".

Bezüglich der 7. Aufgabe kann ich Dir nicht folgen. Die Ausgabe ist einfach 1 2 3 - also keine Zeilenumbrüche und auch nur genau diese drei Zahlen. Mehr Zahlen kann es da auch nicht geben, denn Du hast ein Array aus 3 Elementen. Nun werden diese Elemente verändert: Das 2. Element bekommt das erste dazu addiert: 1+1 = 2. Dann bekommt das 3. element (1) das zweite Element (2) dazu => 3. Somit hat man das Array { 1, 2, 3 } und da wird dann ausgegeben.

Aufgabe 8 muss ich mir selbst erst ansehen um dazu etwas näheres sagen zu können....

Alles klar danke für Deine Erklärungen. Ich weiss jetzt, was mein Fehler war...ich habe die zwei for-Schleifen miteinander verschachtelt und println statt print drin gehabt. Darum den nicht-nachvollziehbaren Output.
 
Das mit den Ownern setzen ist doch genau beschrieben:
"Schreiben Sie eine Methode setOwner, welche beliebig viele Objekte vom Typ Customer als Parameter entgegennehmen kann (die Details der Klasse Customer müssen Sie hierzu nicht kennen). Falls die Instanzvariable owners noch undefiniert ist (d.h., wenn diese null ist), sollen die übergebenen Customer Objekte im Array owners gespeichert werden und es wird true zurückgegeben. Andernfalls wird owners nicht geändert und es soll false zurückgegeben werden."

Also wir prüfen owners. Wenn owner null ist, dann geben wir false zurück. Ansonsten sollen die Owners gespeichert werden.
Wie speicherst Du denn Elemente in einem Array? Das ist ja eigentlich unkompliziert. Woran scheitert es? Was dürfen wir näher erläutern?

Habe es so gelöst, ist dies in deinen Augen korrekt?

Java:
    public boolean setOwner(Customer... owners) { // langsam hab ich einen Plan...
        if (this.owners == null) {
            for (int i = 0; i < owners.length; i++) {
                this.owners[i] = owners[i];
            }
            return true;
        } else
            return false;
    }
 
Kann mir noch jemand sagen, wie ich bei Aufgabe 8.6. in einer ArrayList zwei Objekte gemäss der Variablen accounts sortieren kann? Ich hab keinen Plan, wie ich das anstellen soll...

12808

12809
 
Habe es so gelöst, ist dies in deinen Augen korrekt?

Java:
    public boolean setOwner(Customer... owners) { // langsam hab ich einen Plan...
        if (this.owners == null) {
            for (int i = 0; i < owners.length; i++) {
                this.owners[i] = owners[i];
            }
            return true;
        } else
            return false;
    }
Wenn this.owners null ist, wird ein Zugriff auf owners nicht gehen. Somit würde da noch eine Sache fehlen.

Edit: da zwei owners in der Methode sind, noch das this. hinzu gefügt.
 
Bedenke auch, dass du nach "amount" sortieren sollst. Ich hab mir nicht alles durchgelesen, aber kontrollier mal, ob da auch so ist.
Bedenke auch, dass du nach "amount" sortieren sollst. Ich hab mir nicht alles durchgelesen, aber kontrollier mal, ob da auch so ist.
Hab es getestet..es wird nach der Variable amount sortiert. Wenn ich jetzt ein String ownerName in den Konstruktor reinnehme sortiert die Methode nach ownerName, wieso das so ist weiss ich nicht. Gibt es eine Möglichkeit, wie man das "steuern" kann.
 
Gibt es eine Möglichkeit, wie man das "steuern" kann
Collections.sort(listToSort, Comparator)
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

edit: das Thema kommt immer wieder, einiges ist über die Suche auffindbar
https://www.java-forum.org/thema/rangliste-erstellen.185525/post-1192780

Java:
public class SortetByShoot implements Comparator<Team>
{
     @Override
    public int compare(Team o1, Team o2)
    {
        /** Anstelle von ... */
        return o1.getShoot()- o2.getShoot();
        /** ... wuerde auch return  Integer.compare(o1.getShoot(), o2.getShoot()) gehen */
        /** Warum das so ist, hat was mit Wraperklassen zu tun, aber ich will dir dein Aha-Effekt nicht nehmen */
    }
}
 
Zuletzt bearbeitet:
Gibt es eine Möglichkeit, wie man das "steuern" kann.

Zum einen die Methode, die du verwendet hast:
public static <T extends Comparable<? super T>> void sort(List<T> list)
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface.

Das bedeutet, dass Collections.sort() zum Vergleichen die Methode compareTo() des Comparable interfaces verwendet. Diese könntest du in deiner Klasse (der Elemente, die verglichen werden sollen, also "Account") überschreiben, um das Verhalten zu ändern.

Außerdem gibt es noch eine zweite Methode zum Sortieren in Collections:
public static <T> void sort(List<T> list, Comparator<? super T> c)
Sorts the specified list according to the order induced by the specified comparator.

Hier kannst du einen Comparator zusätzlich übergeben, mit dem du steuern kannst, wie sortiert werden soll.
 
Zum einen die Methode, die du verwendet hast:
public static <T extends Comparable<? super T>> void sort(List<T> list)


Das bedeutet, dass Collections.sort() zum Vergleichen die Methode compareTo() des Comparable interfaces verwendet. Diese könntest du in deiner Klasse (der Elemente, die verglichen werden sollen, also "Account") überschreiben, um das Verhalten zu ändern.

Außerdem gibt es noch eine zweite Methode zum Sortieren in Collections:
public static <T> void sort(List<T> list, Comparator<? super T> c)


Hier kannst du einen Comparator zusätzlich übergeben, mit dem du steuern kannst, wie sortiert werden soll.

Danke für die "Übersetzung", denn für mich ist es manchmal schwierig die "Hieroglyphen" auf diesen API-docs zu verstehen ;-)
 
Sehe grad, du überschreibst ja compareTo():
Java:
    @Override
    public int compareTo(Account o) {
        int a = (int) this.amount - (int) o.amount; // wieso reicht hier eine Cast-Klammer nicht aus??
        return a;
    }

Und die Antwort zu deiner Frage:

Mit dem ersten Cast wird this.amount nach int gecastet, anschließend würde (ohne weiteren Cast) ein double abgezogen, was wieder ein double ergibt.

Du musst einfach Klammern setzen: return (int) (this.amount - o.amount); dann wird erst subtrahiert und anschließend nach int gecastet.
 
eine andere Frage:

Java:
package aexamples;

public class Testen {

    public static void main(String[] args) {

        int a, b;
        a = 1;
        b = a++;
        System.out.println(b);
    }

}
Wieso diese Ausgabe 1 ist, ergibt für mich keinen Sinn. Bei der Rangfolge der Operatoren ist ja der Zuweisungsoperator (=) an letzter Stelle (und Post-Inkrement an erster Stelle). Das heisst für mich, dass zuerst a um 1 inkrementiert wird und dann der Variablen b zugewiesen...also müsste b=2 sein????
 
Wieso diese Ausgabe 1 ist, ergibt für mich keinen Sinn. Bei der Rangfolge der Operatoren ist ja der Zuweisungsoperator (=) an letzter Stelle (und Post-Inkrement an erster Stelle). Das heisst für mich, dass zuerst a um 1 inkrementiert wird und dann der Variablen b zugewiesen...also müsste b=2 sein????

Zuerst wird der Inhalt von "a" an "b" zugewiesen und anschließend "a" inkrementiert.

Bei "++a" würde zuerst inkrementiert werden und dann die Zuweisung erfolgen.
 
Diese Post- und Pre Inkrement Anweisungen beziehen sich immer auf die Rangfolge bezüglich des ganzen Ausdrucks. Das Increment wird entweder vorher oder komplett nachher gemacht.

Das sollte man wissen und verstehen, aber generell gilt: in der Praxis läßt man es schön, so einen Code zu schreiben. Da kommt der Inkrement schön separat davor oder danach und schon hat man etwas besser lesbaren Code.
 

Neue Themen


Zurück
Oben