Hallo lieber Community. Ich brauche bitte bitte eure Hilfe. Ich schreibe morgen meine erste Klausur und mache zur Vorbereitung gerade die Übungsklausur. Bis zur Aufgabe 5 bin ich gut durchgekommen. Aber jetzt scheiterst. Hier mal die Aufgabe:
public static SSLInt selectOdd(SSLInt list)
Die Klassenmethode soll eine neue Liste erzeugen, die der ubergebenen Liste list entspricht. Allerdings
sollen in der neuen Liste nur noch die ungeraden Zahlen aus der list enthalten sein. Die
ubergebene Liste list darf nicht verandert werden. Die Methode soll die neue Liste zuruckliefern.
Achten Sie darauf, dass sie keine unotigen Listenelemente anlegen.
public class SSLChar {
public char element;
public SSLChar next;
public SSLChar (int element, SSLChar next) {
this.element = element;
this.next = next;
}
}
Hier ist meine bisherige Lösung:
Code:
public class Aufgabe5 {
public static void main(String[] args) {
SSLInt r = new SSLInt(8);
SSLInt p = new SSLInt(4, r);
SSLInt o = new SSLInt(7, p);
SSLInt q = new SSLInt(5, o);
selectOdd(q);
}
public static SSLInt selectOdd(SSLInt list) {
SSLInt neu = list;
SSLInt temp = null;
while (neu != null) {
if (neu.element % 2 == 0) {
temp = neu;
}
neu = neu.next;
}
return neu;
}
}
Aus der übergebenen Liste liefert mein Code nur die 8 zurück. Aber soll ja 4 und 8 zurückgeben. Ich finde auf Teufel komm raus keinen Fehler und keine Lösung. Ich bitte bitte gnädigst um eure Hilfe.
Im Moment referenzieren die Listen neu und list dieselbe Liste. Da du die Liste neu zurückgeben willst, müsstest du also die überflüssigen Elemente daraus entfernen, wodurch du sie aber gleichzeitig unerwünschterweise auch aus list entfernen würdest.
Wenn du eine gerade Zahl findest, setzt du temp auf die aktuelle "Rest-Liste", so dass tempnun eine Liste referenziert, die alle Elemente, ab dieser geraden Zahl umfasst. Da du mit temp gar nichts machst, bleibt dieser Fehler aber ohne Konsequenz.
Deine Methode liefert eine Liste zurück, die lediglich das letzte Element der Ursprungsliste enthält (egal, ob gerade oder ungerade).
Du könntest einfach mit einer leeren Liste beginnen und bei jedem Treffer daraus eine neue Liste erzeugen, die den Treffer als zusätzliches Element enthält.
Wieso setzt duneuauflist? Das soll doch eine ganz neue Liste werden.neu = null;macht da mehr Sinn. Und in deiner while Schleife gehst du dann durchlistdurch anstatt durchneu.
Es sollte while (list != null) { sein.
Und nach der Zeile temp = new SSLInt(list.element); musst du das neu erzeugte SSLInt Objekt noch ans Ende der neuen Liste anfügen.
Alternativ könntest du die Liste auch erst einmal umdrehen. Dann vereinfacht sich der Rest des Codes.
Wahrschein sind wir Frauen zu blöd um das hier zu lernen. Es wäre bitte einfach nur sehr nett, wenn jemand hier meinen Fehler korrigieren würde damit ich auch sehe wie das geht.
Du hast oben zwar nur den ersten Konstruktor gepostet, deshalb kann man über die Funktionsweise des zweiten nur spekulieren, aber es ist ziemlich offensichtlich, dass der eine Liste erzeugt, die nur aus dem übergebenen Element besteht. Wenn du eine Liste mit mehr Elementen haben möchtest, musst du den ersten Konstruktor verwenden. In deiner main-Methode hast du das ja bereits gemacht.
Also ich danke euch für die Antworten. Und ich verstehe auch, dass ich einen falschen Konstruktor verwende. Ich komme nicht auf die Syntax. Ich programmiere das erste Mal. Programmieren haben wir nur die ersten beiden Semester. Danach kommt meine Vertiefungsrichtung der Elektrotechnik. Ich kämpfe hier nur mit diesem JAVA und ja ich bin zu blöd.
Meine BITTE: BITTE BITTE BITTE korrigiert meinen Code und postet die Korrektur. Ich versuche hier nicht zu schummeln oder die eierlegende Wollmichsau zu seien. Das ist die Aufgabe 5 aus der Probeklausur. Bis dahin habe ich niemanden hier oder sonst wo gefragt und alles selber gelöst. Ich bitte nur um diese Scheiß Aufgabe 5. Ich sitze heute seit knapp 13Uhr und komme nicht auf diese SCHEIß Lösung. Das ist bereits die pure Verzweiflung.
Und die Aufgabe 6 ist das selbe nur iterativ. Ich schreibe morgen diese Kack Klausur und ich bekomme ich es nicht diese drecks Aufgaben zu lösen. MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN!
Jedem, der noch keine Erfahrung hat, fallen solche Aufgaben erst einmal schwer. Das gibt sich aber im Laufe der Zeit, solange du nicht aufgibst. Und wenn man Elektrotechnik studiert, sollte man schon zumindest ein wenig programmieren können.
Hier mal zwei mögliche Lösungen. Die erste ist iterativ
Java:
publicstaticSSLIntselectOdd(SSLInt list){SSLInt neu =null;SSLInt temp =null;while(list !=null){if(list.element %2==1){SSLInt next =newSSLInt(list.element,null);if(neu ==null){
neu = next;
temp = next;}else{
temp.next = next;
temp = temp.next;}}
list = list.next;}return neu;}
Und die zweite rekursiv. Die rekursive Lösung ist deutlich kürzer, hat aber den Nachteil, dass sie für lange Listen von mehr als ein paar tausend Elementen nicht funktioniert (führt zu einem Stackoverflow Error).
Du kannst die toString Methode von der Listenklasse überschreiben, oder statt ein println in einer Schleife über die Listenelemente gehen und sie so ausgeben
Du könntest eine Methode schreiben um die Liste in einen String umzuwandeln.
z.B.
Java:
publicstaticStringtoString(SSLInt list){String s ="[";while(list !=null){
s = s + list.element;if(list.next !=null) s = s +", ";
list = list.next;}return s +"]";}
Was meint du damit? Eine Klasse hat keinen Rückgabetyp. Du kannst eine Liste ausgeben mit System.out.println(toString(list))
Oder aber du integrierst die toString Methode in die SSLInt Klasse.
Also so
Java:
publicclassSSLInt{...publicStringtoString(){SSLInt list =this;String s ="[";while(list !=null){
s = s + list.element;if(list.next !=null) s = s +", ";
list = list.next;}return s +"]";}}
In dem Fall kannst du einfach schreiben System.out.println(list)
Wieso ist "element" denn einmal char und einmal int?
Strings sollte man eigentlich nicht in einer Schleife verknüpfen.
Du kannst auch von außerhalb auf element (und next) zugreifen - sind ja (ausdrücklich) als public vorgegeben.
Gut, dass zw. Hamburg und Ulm nach maps google nur 700-800km liegen.