Polynomaddition mit verketteter Liste
-
Hallo zusammen!
Ich habe ein Problem mit meinem Algorithmus zu einer Polynomaddition. Man soll zwei Polynome beliebigen Grades nehmen und mittels verketteten Listen addieren. Klingt einfach, dachte ich auch.Der Code ist auch an sich kein Problem - er ist noch etwas redundant (das ist mir bewusst) und einige Bedingungen fehlen noch, aber das ist auch gar nicht das Problem. Wenn ich ihn kompiliere und ausführe, meine beiden Polynome eingebe, sieht das ganze wie folgt aus:
http://i.imagebanana.com/img/aesw2nz5/polynom.png
Jeder Schritt wird einzeln ausgedruckt, obwohl ich nur den untersten haben möchte. Das ist mein Problem - ich sitze jetzt seit mehreren Stunden dran und bekomme meinen Fehler nicht raus. Vielleicht könnt ihr mir helfen

#include <iostream> #include <list> #include <sstream> #include <iterator> using namespace std; //Funktionen// std::list<string> AddPolynomes(std::list<string> l1, std::list<string> l2) { std::list<string> polynome; string temp1, temp2, pol; stringstream ss1, ss2, ss3; int coef1, coef2, coef3, expo1, expo2; for (std::list<string>::iterator i=l1.begin(); i!=l1.end(); ++i) { temp1 = ""; ss1.clear(); temp1 = *i; ss1 << temp1; ss1 >> coef1 >> expo1; for(std::list<string>::iterator j=l2.begin(); j!=l2.end(); ++j) { temp2 = ""; ss2.clear(); temp2 = *j; ss2 << temp2; ss2 >> coef2 >> expo2; if (expo1 == expo2) { coef3 = coef1 + coef2; pol = ""; ss3.clear(); if (coef3 < 0) { ss3 << coef3 << "x^" << expo2; pol = ss3.str(); polynome.push_back(pol); } else { ss3 << coef3 << "x^" << expo2 << "+"; pol = ss3.str(); polynome.push_back(pol); } } } } return polynome; } void PrintList(std::list<string> l) { std::copy(l.begin(), l.end(), std::ostream_iterator<string>(std::cout, "\n")); } //Main// int main() { int degree, coef, expo; string s; ostringstream os; std::list<string> list1, list2, polynome; /* First polynome */ cout << "Enter the degree of polynomial: "; cin >> degree; while (expo != degree) { s = ""; os.str(""); cout << "Enter coef, expo: "; cin >> coef >> expo; os << coef << " " << expo; s = os.str(); list1.push_back(s); } degree = 0; expo = 0; coef = 0; /* second polynome */ cout << "Enter the degree of polynomial: "; cin >> degree; while (expo != degree) { s = ""; os.str(""); cout << "Enter coef, expo: "; cin >> coef >> expo; os << coef << " " << expo; s = os.str(); list2.push_back(s); } /*Addition and print of new polynome*/ polynome = AddPolynomes(list1, list2); PrintList(polynome); }
-
was erwartest du was passiert, wenn du die Ausgabe in eine doppelt verschachtelte Schleife packst?
Dr COde ist auch total wirr. Strukturier ihn mal so um:
1. addier die beiden Polynome und speicher das Ergebnis in einer dritten Liste
2. gib diese dritte Liste als Polynom aus.
-
Die methode clear() beim stringstream macht warscheinlich nicht was Du denkst.
In deiner Print Funktion reicht es dadurch nur das Element der Liste auszugeben.
-
Hallo Verzweifelter,
ist in der Liste 'l1' ein Polynom mit einem Exponenten vorhanden, der in 'l2' nicht vorkommt, so ist der Ausdruck in Zeile 33 nie 'true'. Also wird dieses Element auch nie zur Summe hinzugefügt. Aus diesem Grund fehlt auch der Term '5x^5' im Ergebnis.
Tipps:
- Deklariere Variablen erst dann, wenn Du sie benötigst. Das schafft Überblick.
- Die Zeilen 18, 26 und 35 kannst Du löschen.
- speichere die Elemente nicht als strings, sondern so, dass Du mit ihnen direkt rechnen kannst (als Zahlen)
- Mache aus dem Polynom eine Klasse, die einen Container enthält (vector<> oder list<>). Damit kapselst Du den Zugriff, und kannst z.B. festlegen, das der Exponent implizit über die Stellung des Elements im Container festgelegt ist.
- Die Ausgabe in Zeile 44 passt nicht zu der Abfrage in Zeile 38.
- kommen in der Liste 'l2' zwei Elemente mit dem gleichen Exponenten vor, so wird der zugehörige Wert aus 'l1' zweimal addiert.