Rechnerübung 1 - Korrektur

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.

Rechnerübung 1 - Korrektur
Hallo, die erste Rechnerübung ist jetzt korrigiert. Eure Ergebnisse könnt ihr in der aktuellen Punkteliste sehen: http://www9.informatik.uni-erlangen.de/get/1124

Die Rechnerübungen wurden mit einem automatischen Testscript korrigiert. Ihr könnt dieses unter
http://www9.informatik.uni-erlangen.de/get/1125
herunterladen und eure Lösung damit testen. So seht ihr auch, wo euch Punkte verloren gegangen sind.

Weitere Punkte wurden abgezogen wegen

  • Segfaults (19 mal)!!!
  • kompiliert nicht (vergessen function.h abzugeben, ‘strlen’ verwendet ohne den (veralteten) C-Header einzubinden) etc.
  • Vergessen, die mexHat*.eps einzuchecken

Wer meint, ungerecht behandelt worden zu sein kann per Mail einen Termin mit mir ausmachen und mir zeigen warum er mehr Punkte verdient hätte.

Gruss, Jochen

Edith sagt: Überprüft auch mal eure Punkte für die Papierübungen. Es kann immer passieren, dass wir euch mal eine falsche Punktezahl eintragen!


Hi, also ich schreib auch noch eine Mail, aber ich denke es ist von allgemeinem Interesse wenn ich erstmal hier frage.
Ich habe auch weniger Punkte aufgrund eines segfaults.

1.Frage: Weshalb passiert hier überhaupt ein segfault?

void AlgoKS::Polynomial::cleanUp() {
	std::vector<AlgoKS::Monomial>::iterator iter;

	for(iter = this->m_monomials.begin(); iter != this->m_monomials.end(); iter++) {
		std::cerr << "schleife aussen" << std::endl;
		if(fabs((*iter).getCoefficient()) < 1e-7) {
			std::cerr << "schleife innen" << std::endl;
			iter = this->m_monomials.erase(iter);
		}
	}

	std::sort(this->m_monomials.begin(), this->m_monomials.end());
}

.
.
.
int main...
	Monomial m1(0, 0);
	Polynomial p1(m1);
	p1.cleanUp();

Hab cleanUp natürlich public gemacht damit das so geht. (und ja ich weiß dass das ineffizient ist was ich da mache :wink: )
Ausgabe:
schleife aussen
schleife innen
schleife aussen
schleife innen
Segmentation fault (valgrind sagt der segfault passiert in erase)
Kann der Iterator so schlecht sein oder benutze ich ihn falsch? Und wieso funktioniert das if auch das zweite mal?

Dafür habe ich 3 Punkte Abzug bekommen, weil der restliche Testcase nicht mehr weiter gelaufen ist. Allerdings funktioniert bei mir sonst alles, was mich zu meiner 2.Frage führt:

Wäre der Testcase so gelaufen, dass ich am Anfang einen segfault bekommen hätte, hätte ich dann 0 Punkte bekommen?
Wie kann es denn gerechtfertigt sein das viele meiner Punkte (oder alle) von der Struktur des Testcases abhängen und nicht davon wie viel bei mir richtig oder falsch ist?

3.Frage: Wie kommen die Punkte zu stande?
Der Testcase sagt im Erfolgsfall, dass man 23 Punkte hat, dazu kommen sicher noch Punkte für maxhat usw, wie viele gabs da? Und wie wurde das ganze runtergerechnet?

Vielen Dank schonmal dafür, dass ihr das alles lest und für die zahlreichen und detaillierten Antworten.

Schöne Grüße


Nachtrag: Hab meinen Fehler gefunden, hab != statt <= in der Schleife benutzt… mist ^^
Aber die restlichen Fragen bleiben.


War das wirklich der Fehler? Iteratoren verwende ich in C++ seit eh und je so. Ich hätte eher vermutet dass du dir mit dem erase ins Knie schießt.


Ich halte auch das erase für das Problem. Du löscht erst das Element, das am Iterator steht und machst dann

iter++;

Ich vermute, dass das nicht geht.

Ja, aber dann hätte ich in deinen Code geschaut. Wenn du nicht mit deiner Bepunktung einverstanden bist, komm bitte bei mir in Tennenlohe vorbei. Ausserdem sollte ich doch erwarten können, dass du mindestens so viel Zeit in das Testen deines Codes investierst wie ich in das debugen. Ich denke zudem, dass dein Code immer ‚segfaulted‘, wenn du das letzte Element löscht.

Du kannst das addieren getrost dem Script überlassen. D.h. es gibt 8 Punkte für alles richtig + 2 Punkte für die mexHats

Gruss, Jochen


Um das Ganze mal zu begründen:

d.h. wenn du danach noch ein iter++ machst überspringt er ein Element komplett. Falls das gelöschte Element dann auch noch das letzte im Vector war krachts, weil die Bedingung „iter != this->m_monomials.end()“ ja nie mehr gelten wird :wink: Die for-schleife läuft also so lange, bis „*iter“ zu einem Segfault führt.
Mit einer while-schleife und einem „else-Fall“ für iter++ würde es gehen :slight_smile:

Fehler im Testscript
Hallo Jochen,

sorry aber find das ganze hier grad ziemlich komisch.

Erstmal dass wir uns selber die Fehler suchen dürfen und nicht mal ne vernünftige Korrektur für die Aufgaben bekommen. Glaub mir ich hab bestimmt viel Zeit ins Testen von meinem Code gesteckt und jetzt bekomme ich von diesem tollen Testcase nur 4 Punkte und weiß noch nicht mal was eigentlich falsch ist.

Vor allem: Angenommen, ich hab in meiner addMonomial Methode einen Fehler dann ist ja bei diesen Testcase automatisch so gut wie alles falsch, auch wenn der Rest richtig sein mag!

Desweiteren, was ich mal deutlich als FEHLER IM TESTCASE bezeichne:

 Polynomial p7 = p2 + p3;
 Polynomial p8 = p7 * p5;
if (withInPrecision(p8.eval(0.5f), 0.0265869f)) { //mult korrekt
punkteCounter += 1.0f;
}

Ihr überprüft in Zeile 127 ja die Polynommultiplikation. Soweit sogut, aber die Polynome mit denen ihr überprüft, berechnet ihr ja über Addition… Somit wenn ich die Addition sowieso schon falsch habe (warum auch immer) ist automatisch auch die Multiplikation falsch und somit nochmal -1 Punkt!

Auch dass wir dann nach Tennenlohe kommen sollen, wenn wir nicht einverstanden sind, muss echt nicht sein. Wie wärs einen Termin hier am Campus einzurichten? Ich denk ist auch ökologischer…

So, ich mach jetzt mal weiter! Ich würde mich auch freuen, wenn mal ne Stellungnahme zu den Fehlern im vorgegebenen Code (Aufgabe R02) kommen würde; die haben mich auch mehr als ne Stunde gekostet!

Viele Grüße

Seffe


Ich denke es ist euch zuzumuten, in eurem Code eure Fehler selber zu suchen. Es ist schlichtweg (zeitlich) nicht machbar, dass ich mich durch den Code von 80 Studenten arbeite und deren Programme debuge.

Ja, das könnte sein. Schlimmer noch wäre es, wenn du in eval() einen Fehler hättest. Falls dem so wäre, wärest du herzlich eingeladen, bei mir in Tennenlohe vorbeizukommen und mir zu zeigen, was an deiner Lösung falsch ist.

Hier liegt eure Abgabe. Auf die Abgabe im CIP habe ich keinen Zugriff. D.h. nur hier könnt ihr mir zeigen, wie ihr eure ‚Addition‘ reparieren könnt damit ihr die volle Punktzahl bekommt.

Ich glaube ausserdem nicht, dass ihr mit den Testscripten schlecht fahrt. Immerhin habt ihr bei der Aufgabe im Schnitt 82.2% richtig. Dass es für den Einzelfall manchmal ungerecht ist will ich ja gar nicht bestreiten. Es ist nur leider zeitlich nicht anderst zu machen.

Gruss, Jochen


Dann sollte man vielleicht an genau diesem Punkt etwas verbessern.


Dafuer, dass ich den Code verbockt hab und es natuerlich gesegfaultet ist - war die Bewertung imho fair und angemessen. 3 Punkte oder so weg fuer einen doofen Fehler - na was solls - bei einem Segfault - verdient ;).

Kann ich jetzt nach Tennenlohne fahren - erklaeren warum es kaputt geht und dann mehr Punkte drauf bekommen?
So hoerte sich das oben fast an :wink:


Nein, du kannst hinfahren, und wenn du unter Aufsicht deinen Code hinbiegst, DANN kriegst du die Punkte drauf. Wenn du dann noch erklären kannst, WARUM es kaputt geht, kannst du dir Bonuspunkte verdienen!

So hab ICH das oben verstanden… :smiley:


So ungefähr, und wenn du dann noch eine hinreichend rührselige Geschichte erzählst, warum dein Code nicht läuft („Mein Hund hat die korrekte Lösung gefressen“), dann bekommst du ggf. noch Punkte für irgendwas was annähernd richtig ist, aber wegen des Segfaults nicht getestet werden konnte.

Gruss, Jochen


also ich weiss ja nicht ob ich einfach nur zu dumm zum testen bin oder ob das programm einfach nur besoffen ist, aber irgendwie kommt bei mir folgende Ausgabe:

Warning: Addition with different exponentsWarning: Addition with different exponentsAufgabe 2: 3 von 3 Punkten
Aufgabe 3ab: 5 von 5 Punkten
Aufgabe 3c: 7 von 7 Punkten
Kandidat hat: 7.5 von 8 Punkten

Kann mir das irgenjemand erklären?


Hast Recht, das Programm war zu lang auf’m berg gestern… :slight_smile:


Also wenn ich das Testcase richtig verstanden habe:

Die Ausgaben kommen von deinem eigenen Programm, da sollst ja Fehler ausgeben wenn ungleiche Exponenten bei Monomen addiert werden… Wenn das (und noch anderes Zeug klappt) machst: 3 von 3 Punkten…

3ab gibt insgesant 2 Punkte, die „von“ Punkte werden von Aufgabe zu Aufgabe mitaddiert…

s.o.

Beim letzten Test fehlt dir wohl irgendwas… Entweder du sortierst die zu kleinen Mono nicht aus oder der Abschluss test tut nicht (was aber komisch wäre, sonst hättest woanders auch weniger Punkte…

Sers

Seffe


[quote]So ungefähr, und wenn du dann noch eine hinreichend rührselige Geschichte erzählst, warum dein Code nicht läuft (“Mein Hund hat die korrekte Lösung gefressen”), dann bekommst du ggf. noch Punkte für irgendwas was annähernd richtig ist, aber wegen des Segfaults nicht getestet werden konnte.
[/quote]

Also in Echtzeit fixen - kein Problem :wink: - ruehrselige Geschichte - das wird schwierig. Lassen wirs mal bei den -3 :smiley: