Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Julian1
Neuling
Neuling
Beiträge: 5
Registriert: 20. Apr 2012 21:39

Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von Julian1 »

Hallo, ich habe ein Problem bei der Aufgabe ii), der Methode AssembleNumbers().
Für die Methode habe ich eine Hilfsmethode isNumber() geschrieben, die überprüft ob ein einelemetiger String eine Zahl ist und true zurückgibt falls dies der Fall ist.

Nun zur eigentlichen Methode, Kommentare stehen im Code:

Code: Alles auswählen

	public void assembleNumbers()
	{
		MathElement p = first;		
		while (true){
			if (p == null) {return;}  //falls leere Liste -> return
			if (p.hasNext() == false) {return;}  //falls es kein nächstes Element in der Liste gibt -> return
			if (isNumber(p.data()) && isNumber(p.next().data())) {  //Aktuelles und nächstes Element sind eine Zahl 
				p.setData(p.data() + p.next().data());  //überschreibe den Inhalt des aktuellen Elements (füge die Zahl des nächsten Elements ebenfalls hinzu)
                                p.setNext(p.next().next());  //Lösche das nächste Element, das damit überflüssig geworden ist
				p = (MathElement) p.next();  //Aktualisiere den Pointer

			}
			else {  //Falls entweder aktuelles oder nächstes Element keine Zahl -> aktualisiere nur den Pointer
				p = (MathElement) p.next();
			}
		}
	}
Ich sehe keinen Fehler in dieser Vorgehensweise, allerdings kommen für alle Expresions die folgenden beiden Fehler:
Expression 1 does not have the correct length after calling assembleNumbers().
Expression 1 does not maintain the correct elements after calling assembleNumbers().


Für einen Tipp, was ich falsch gemacht habe, wäre ich dankbar.

Thomas Huxhorn
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 172
Registriert: 6. Okt 2011 15:25

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von Thomas Huxhorn »

Vllt. musst du noch mehr Funktionen implementieren. Teste sie doch selbst alle einzeln. Geht ja recht schnell. Mit dem vorgegebenen Test bekommt man kein Hinweis was falsch ist, nur dass was noch nicht 100% richtig ist :/

fabian.wagner
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 152
Registriert: 19. Okt 2010 12:51

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von fabian.wagner »

Julian1 hat geschrieben:Hallo, ich habe ein Problem bei der Aufgabe ii), der Methode AssembleNumbers().
Für die Methode habe ich eine Hilfsmethode isNumber() geschrieben, die überprüft ob ein einelemetiger String eine Zahl ist und true zurückgibt falls dies der Fall ist.

Nun zur eigentlichen Methode, Kommentare stehen im Code:

Code: Alles auswählen

	public void assembleNumbers()
	{
		MathElement p = first;		
		while (true){
			if (p == null) {return;}  //falls leere Liste -> return
			if (p.hasNext() == false) {return;}  //falls es kein nächstes Element in der Liste gibt -> return
			if (isNumber(p.data()) && isNumber(p.next().data())) {  //Aktuelles und nächstes Element sind eine Zahl 
				p.setData(p.data() + p.next().data());  //überschreibe den Inhalt des aktuellen Elements (füge die Zahl des nächsten Elements ebenfalls hinzu)
                                p.setNext(p.next().next());  //Lösche das nächste Element, das damit überflüssig geworden ist
				p = (MathElement) p.next();  //Aktualisiere den Pointer

			}
			else {  //Falls entweder aktuelles oder nächstes Element keine Zahl -> aktualisiere nur den Pointer
				p = (MathElement) p.next();
			}
		}
	}
Ich sehe keinen Fehler in dieser Vorgehensweise, allerdings kommen für alle Expresions die folgenden beiden Fehler:
Expression 1 does not have the correct length after calling assembleNumbers().
Expression 1 does not maintain the correct elements after calling assembleNumbers().


Für einen Tipp, was ich falsch gemacht habe, wäre ich dankbar.
Lass dir vielleicht die Liste mit toString() in MathList ausgeben und schau mal was rauskommt...

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von JannikV »

Im Übrigen ist es dann immer sehr hilfreich den Debugger von Eclipse anzuwerfen und sich anzusehen was genau passiert. Dazu muss man aber schon wissen wie es am Ende aussehen soll. Wenn das nicht klar ist gibts das größte Problem (aus diesem Grund hab ich die Methode mehrmals schreiben müssen ...)

Die Methode soll alle zusammenhängenden Ziffernfolgen in ein MathElement stecken. Vereinfacht gesagt.

Noch ein Tipp wegen deinem isNumber. Das ganze lässt sich auch recht gut mit der matches Methode von String in Kombination mit einem regulären Ausdruck lösen. Dann brauchts nicht extra ne Hilfsmethode.

VG

ur52tuwe
Neuling
Neuling
Beiträge: 7
Registriert: 14. Okt 2010 14:41

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von ur52tuwe »

Anhand deiner Beschreibung sehe ich 2 Fehler in deinem Algorithmus:
1. Fehler: isNumber(...)
- laut deiner aussage Prüft dies, ob es sich um eine einstellige dezimale Zahl handelt
- was passiert aber, wenn die liste eine n-stellige Zahl enthält? (n > 2)

Beispiel-Liste:
1 -> 2 -> 3
1. Iteration:
12 -> 3
2. Iteration:
isNumber() würde laut deiner Beschreibung bei der 12 nun ein false zurückgeben

2. Fehler:
Du schiebst deinen Pointer sofort weiter, nachdem du ein "Zahlenpärchen" gefunden hast.
Auch das ist an dieser Stelle nicht korrekt.

Beispiel-Liste:
1 -> 2 -> 3 -> 4
1. Iteration:
12 -> 3 -> 4
2. Iteration:
12 -> 34, da Pointer auf das Element 3 zeigt

Du darfst den Pointer also erst weiterschieben, wenn du dir 100% sicher bist, dass keine weitere Ziffer der Zahl in der Liste folgt.

Ich hoffe das hilft dir weiter.
Gruß D. W.

christophbued
Mausschubser
Mausschubser
Beiträge: 54
Registriert: 12. Mär 2012 13:43

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von christophbued »

müssen die funktionen unbedingt void sein oder darf ich das auch ändern..
Hab keine ahnung wie ich sonst machen soll

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von JannikV »

Wofür brauchst du da denn einen Rückgabewert? Wenn du das verrätst kann man dir bestimmt sagen wie es auch ohne geht.

Denn den Rückgabetyp von void auf etwas anderes zu ändern dürfte zwar nichts kaputt machen, aber grundsätzlich ist es ja nie so gut das Framework zu ändern.

Keine Ahnung was Fabian dazu sagt..

VG

christophbued
Mausschubser
Mausschubser
Beiträge: 54
Registriert: 12. Mär 2012 13:43

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von christophbued »

Eigentlich bin ich völlig überfordert mit der Aufgabe...

meine grund idee ist
eine while true schleife (wie der prof das in den Vorlesungen gezeigt hat) mit drei bedingungen

1. list leer algo fertig und abrechen hier also ein return statement

2. ist der nächste wert eine Integer

speicher ihn
kommt der algo nochmal zu diesem fall nächsten Integer anhängen //// wenn ich hier ein mal im operator fall war muss der String ja gelöscht werden bzw wieder auf "leer"setzten

3. nächster wert in der Liste kein Integer (also Operator oder ähnliches)
operator speichern

und dann direkt anhängen zwei operatoren werden ja nicht kommen


habe jetzt aber keine ahnung wie ich das implementieren soll

Wenn kann man noch ansprechen wenn man keine ahnung hat!! AUßER die Sprechstunde die ist immer ein bissel voll da komm ich auch nicht weiter...

bin ziemlich verzweifelt

genix
Windoof-User
Windoof-User
Beiträge: 39
Registriert: 16. Okt 2010 13:41

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von genix »

Hi,

also deine Überlegungen bis zum 2. Punkt sind eigentlich ganz gut.

Danach würde ich aber folgendermaßen fortfahren:

3. Ist aktuelle Wert ein Integer, dann verändere den next-pointer deines gespeicherten Wert, auf den aktuellen Wert, und setzte den gespeicherten pointer zurück

Es hilf auch oft sich das ganze mal aufzumalen:

Beispiel:

1 -> 2 -> + -> 3 -> 4 -> (null)

Sei C ein Pointer zum aktuellen Wert und S ein Pointer zum gespeicherten Wert, S wird mit 'null' initialisiert und C mit dem ersten Element (first).

1. C ist '1' also eine Zahl, und S ist 'null'. Setze S = C und C = C.next.
2. C ist '2' also eine Zahl, und S ist nicht 'null'. Hänge den Inhalt von C an S. Setze C = C.next.
3. C ist '+' also keine Zahl, und S ist nicht 'null'. Setze S.next = C, S = null und C = C.next.
4. C ist '3' also eine Zahl, und S ist 'null'. Setze S = C und C = C.next.
5. C ist '4' also eine Zahl, und S ist nicht 'null'. Hänge den Inhalt von C an S. Setze C = C.next.
6. C ist 'null', und S ist nicht 'null'. Setze S.next = null und brich die Schleife ab.

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von JannikV »

Ok, dann überlegen wir uns mal was:

Fassen wir zuerst das Ziel der AssembleNumbers Methode kurz zusammen: Alle aufeinanderfolgenden Zahlen sollen zusammen in ein MathElement gesteckt werden.

Nehmen wir uns erstmal einen Hilfspointer den wir benutzen um über die Liste zu iterieren. Womit der initialisiert wirst darfst du dir jetzt schnell überlegen, sollte aber klar sein (wenn wir vorne anfangen ;) ).

Überlegen wir uns als nächstes was wir sonst noch so brauchen. Angenommen wir finden irgendwann mal den Anfang einer Zahlenfolge, dann sollten wir uns die Position merken (Pointer!). Denn dort soll ja später die ganze Zahl abgelegt werden.
Eine Variable in der wir stückchenweise den Zahlenstring zusammenbauen wäre wohl auch nicht schlecht.

Und dann gehts in einer Schleife los (jedenfalls solange die Liste nicht zu ende ist (woran erkennen wir das? -> Hinweis auf die Abbruchbedingung)).
Wie erkennen wir erstmal Zahlen? Da könnte man sich eigene Methoden schreiben, sich irgendwas kompliziertes ausdenken oder das ganze mit einem regulären Ausdruck lösen (Methode matches von String). Denk dir was aus.

Jetzt sagen wir mal wir iterieren in der Schleife über die Liste. Was tun wenn wir eine Zahl gefunden haben? Kommt wohl drauf an ob es der Anfang einer Zahl ist oder nicht. Das unterscheiden wir beispielsweise am Zustand der schon erwähnten zahl-anfangs-positions-merk-variablen. ^^
Und müssen dann an unsere Komplettzahl anhängen.

Und wenn dann irgendwann mal keine Zahl mehr kommt haben wir eine zusammen. Dann muss die an entsprechender Position abgelegt werden und der next-Pointer umgebogen werden so dass wir die bereits zusammengesammelten Teilzahlen auslassen.

Details bleiben dir jetzt überlassen.
Ist halt kompliziert, die Veranstalter würden wahrscheinlich sagen ich verrate zu viel, du wirst wahrscheinlich sagen ich soll detaillierter werden.

Versuchs mal.

VG

EDIT: naaaah, da hat ja schon wer geantwortet :P ich lass meins trotzdem mal stehen..

christophbued
Mausschubser
Mausschubser
Beiträge: 54
Registriert: 12. Mär 2012 13:43

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von christophbued »

Hier ihr ich muss noch mal nerven
Ich bin zwar mit eure hilfe schon was weiter gekommen aber so recht passt es immer noch nicht.
mein assembleNumbers ist so weit das er aus einer 1 2 3 4 liste eine liste mit einem element macht das so aussieht 1234 wie gefordert
sobald aber jetzt ein operator in der list auf taucht bekomme ich eine NullPointerException (habe ich in meine code markiert)
danke schon mal für die viele hilfe

Code: Alles auswählen

public void assembleNumbers() {
		IListElement s = null; 
		IListElement p = first; // lauf variable
		String speicher = "";
		String operator = "";

		while (true) {

			if (p == null) {

				

				s.setNext(null);
				return ;
			}
			if (isInteger(p.data()) && s == null) {

				s = p;

				speicher += p.data();
				p = p.next();

			}
			if (isInteger(p.data()) && s != null) {

				speicher += p.data();
				s.setData(speicher);			
                p = p.next();
			
			}
			if (!isInteger(p.data()) && s != null) { //HIER IST DIE NullPointerException
				operator += p.data();
				s.setNext(p);
				s = null;
				p = p.next();

			}

		}

	}


// das ist meine Liste
MathElement m1 = new MathElement("1");
	MathElement m2 = new MathElement ("2");
	MathElement m3 = new MathElement ("+");
	MathElement m4 = new MathElement ("4");
	MathElement m5 = new MathElement ("5");
	MathList test = new MathList();
	
	
test.addElement(m1);
test.addElement(m2);
test.addElement(m3);
test.addElement(m4);
test.addElement(m4);
test.addElement(m5);




genix
Windoof-User
Windoof-User
Beiträge: 39
Registriert: 16. Okt 2010 13:41

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von genix »

Hi,

ich sehe spontan folgende Probleme:

1. Überprüf mal folgenden Code:

Code: Alles auswählen

if (p == null) {
            s.setNext(null);
            return ;
}
Was passiert hier, wenn s=null ist?

2. Du leerst die variable 'speicher' an keiner Stelle.
3. Es ist nicht nötig die strings 'operator' und 'speicher' zwischenzuspeichern, dafür hast du die Pointer auf die jeweiligen Elemente und die Funtionen 'data()' und 'setData()'.

christophbued
Mausschubser
Mausschubser
Beiträge: 54
Registriert: 12. Mär 2012 13:43

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von christophbued »

Tut mir leid aber es geht immer noch nicht

in der abfrage ob es sich um einen Operator handelt bekomme ich einen NULLPointerException auch wenn in der Liste sich überhaupt kein operator befindet...
Dann darf der doch die abfrage nie mals erreichen....

hier noch mal der code....finde den fehler leider nicht

Code: Alles auswählen

public void assembletest() {

		IListElement s = null;
		IListElement p = first;

		while (true) {

			if (p == null) {

				s.setNext(null);
				return;
			}

			// Zahlreihen erkennen
			if (isInteger(p.data()) && s == null) {

				s = p;
				s.setData(p.data());
				p = p.next();
			}
			// nächstes wieder Zahl
			if (isInteger(p.data()) && s != null) {

				s.setData(s.data().concat(p.data()));
				p = p.next();

			}
			// nächstes zeicher operator
			if (isOperator(p.data()) && s != null) { // hier in der If abfrage bekomme ich die NullPointerException

				s.setData(p.data());
				s.setNext(p);
				s = null;
				p = p.next();

			}

		}

	}




genix
Windoof-User
Windoof-User
Beiträge: 39
Registriert: 16. Okt 2010 13:41

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von genix »

Hallo,

überprüf nochmal Punkt 1 in meinem vorherigen Beitrag (Es ist die erste Bedingung in deinem code). Was passiert dort, wenn s=null ist.

Dieser Fall wird nämlich auftreten.

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Frage zu Praktikum 1, Aufgabe 1 ii) AssembleNumbers()

Beitrag von JannikV »

Warum überprüfst du überhaupt soetwas wie isOperator?

Wichtig ist doch eigentlich nur ob es eine Zahl ist oder nicht. Wenn es keine Zahl ist ist es eigentlich ziemlich egal ob da jetzt ein Operator, eine Klammer oder was auch immer steht.

VG

Antworten

Zurück zu „Archiv“