matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Schulmathe
  Status Primarstufe
  Status Mathe Klassen 5-7
  Status Mathe Klassen 8-10
  Status Oberstufenmathe
    Status Schul-Analysis
    Status Lin. Algebra/Vektor
    Status Stochastik
    Status Abivorbereitung
  Status Mathe-Wettbewerbe
    Status Bundeswettb. Mathe
    Status Deutsche MO
    Status Internationale MO
    Status MO andere Länder
    Status Känguru
  Status Sonstiges

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenC/C++Klasse für ein Polynom in C++
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Geschichte • Erdkunde • Sozialwissenschaften • Politik/Wirtschaft
Forum "C/C++" - Klasse für ein Polynom in C++
Klasse für ein Polynom in C++ < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Klasse für ein Polynom in C++: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 21:47 So 25.07.2010
Autor: qsxqsx

Hi...

Ich habe noch mal eine letzte(...) Frage hier. Ich habe eben bald Informatik Klausur und jetzt noch etwas auf dem "Herzen".

Es handelt sich um eine Klasse für Polynome, und ich soll eine Funktion der Klasse schreiben, die zwei Polynome miteinander multipliziert. Vom algorithmischen ist das kein Problem für mich, vom programmieren her bezüglich Klassen und deren Funktionen aber schon.

Gegeben ist folgendes Gerüst:
----------------------------------------------------------------------------------------------

class CPolynom
{
private:
int degree;
double * coeff;

public:
CPolynom(const CPolynom &);
CPolynom(int d) {coeff = new double[d+1]; degree = d;};
virtual ~CPolynom {delete [] coeff;};
int getDegree() const {return degree;};
double * getCoeff() const {return coeff;};

CPolynom deriv() const; Funktion fürs Ableiten
CPolynom multiply(const CPolynom& p) const; Funktion für die Multiplikation

}

Copykonstruktor
CPolynom::CPolynom(const CPolynom & p){
degree = p.getDegree();
coeff = new double[degree+1];
double* coeff2 = p.getCoeff();
for(int i = 0; i <= degree; i ++){coeff[i] = coeff2[i]};

}
-----------------------------------------------------------------------------------------------

So und ich soll die Funktion multiply implementieren.
CPolynom CPolynom::multiply(const CPolynom & p) const {
              ...

}

Hier mein Versuch:
-----------------------------------------------------------------------------------------------

CPolynom CPolynom::multiply(const CPolynom& p) const {

CPolynom c = new CPolynom(degree + p.getDegree());  
Bei der Multiplikation wird der maximale Grad gleich der Summe der Beiden Grade
int temparray[] = new int[degree + p.getDegree()];

for (int k = 0; k < degree + p.getDegree(); k++){  
Array auf 0 initialisiere
temparray[k] = 0;
}

double* tempcoeff = p.getCoeff();


Hier: Algorithmus - welcher sowas macht: [mm] (x^3 [/mm] + [mm] 3x^2 [/mm] + [mm] 4)*(x^2 [/mm] + 7) = ...

for(int i = 0; i < (degree+1); i++){

for(int j = 0; j < (p.getDegree()+1); j++){
temparray[i+j] = temparray[i+j] + (coeff[i])*(tempcoeff[j]);

}


                }

Hier müssten noch die Werte vom temparray in die Koeffizienten vom Objekt c kopiert werden - weiss aber nicht wie das geht


return c;



}

----------------------------------------------------------------------------------------------

Mal vorneweg: Wenn ich das zu kompilieren versuche, dann hat es 30 Fehler - keine Ahnung wieso aber das ist mir auch egal. Ich will hier nicht wegen Fehlersuche fragen, sondern mir ist das nicht ganz klar, wie ich diese Funktion multiply schreiben soll:

1.) Ist das richtig, wie ich in der Funktion multiplay mit p.getDegree auf die Sachen zugreife? Es sollen ja ZWEI Polynome miteinander multipliziert werden. Irgendwie bin ich aber nicht sicher wo zwei herkommen. Eins von der Klasse selbst und eine andere ist das Argument der Funktion? Weil eigentlich braucht ja eine Funktion zwei Polynome als Argument, wenn sie zwei Polynome multiplizieren soll.

2.) Ist es richtig, das ich in dieser Klasse multiply ein neues Polynome c erzeugt habe, welches dann zurückggegeben wird? Und wenn ja, wie kann ich nun die Berechneten Koeffizienten, die ich im Array temparray berechnet und gespeichert habe in dieses c übertragen. Mit c.getCoeff() erhalte ich ja nur den Koeffizient. Wie kann ich da rein schreiben?


Das wäre sehr nett. Falls etwas zu unklar ist oder so, einfach trotzdem antworten und das ignorieren, ich bin auch für kleine Tipps dankbar. Einem geschenktem Gaul schaut man nicht ins Maul, oder so;)

Gruss






        
Bezug
Klasse für ein Polynom in C++: Antwort
Status: (Antwort) fertig Status 
Datum: 10:08 Mo 26.07.2010
Autor: Event_Horizon

Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)

Hallo!

Bei er Multiplikation erwarte ich natürlich auch, daß ich ein Element zurück bekomme, welches das Produkt enthält, daher ist das mit dem Erstellen und Zurückgeben eines neuen Polynoms völlig richtig.
Der Aufruf deiner Funktion wird nun so aussehen:

parabel3=parabel1.Multiply(parabel2)

Und das heißt für das Multiply eben, daß der eine Faktor aus der eigenen Instanz (Nicht Klasse, die Klasse ist im Prinzip nur eine Typdefinition!)  parabel1 besteht, und der andere aus der anderen Instanz parabel2.

Von der Schreibweise ist das oben nicht so schön, weil ich bei parabel1.Multiply(parabel2) eher davon ausgehe, daß auf parabel1 parabel 2 draufmultipliziert wird, und das Ergebnis parabel1 überschreibt. Man könnte überlegen, ob man hier den *-Operator überlagert, um dann

parabel3=parabel1 * parabel1

schreiben zu können, aber das ist eigentlich unnötig, außerdem das sieht unter der Haube genauso aus.


Das reinschreiben deiner Koeffizienten ist so nicht möglich, weil dein double *coeff so, wie es guter Stil ist, private ist. Genauso, wie du eine Get-Methode geschrieben hast, solltest du auch eine Set-Methode schreiben. Entweder nimmt die ein Array entgegen (Anzahl zu lesender Werte kennst sie ja, aber wehe, das array ist zu klein), oder sie nimmt einzelne Werte sowie nen Index entgegen, dann solltest du den Index aber auf seine Größe checken.
Genauso wäre es für deine Multiplikation sinnvoll, ein GetSingleCoefficient() einzuführen, mit dem du die einzelnen Koeffizienten abfragen kannst, dann sparst du dir dein tempcoeff.


Nun zu deinem Code:

int temparray[] = new int[degree + p.getDegree());    // Hier muß die letzte klammer eckig sein



j++; } i++;     // Sicher nicht, i und j kommen aus FOR-Schleifen, die werden automatisch vergrößert.


CPolynom c = new CPolynom(degree + p.getDegree());  //Funktioniert so nicht. das new gibt dir einen Pointer zurück, du brauchst daher eher
CPolynom *c = new CPolynom(degree + p.getDegree()). Denn du schreibst ja C++, weil du von Compilieren redest und so.

Hinterher schreibst du dann auch eher

*parabel3=parabel1.Multiply(parabel1)

weil du nen Pointer auf c zurück gibst, und den nun als Pointer für parabel3 benutzen willst.

Also, das war jetzt so das auffälige, was ich gesehen habe.

Die Compilermeldungen gegen dir wertvolle, aber auch teils kryptische Hinweise auf Fehler in deinem Code. Kleine Tippfehler oder vergessene Semikola sind nervig, kosten dich in der Arbeit aber auch Punkte. Wichtiger sind aber Syntax-Fehler, er wird sicher über das new mosern. Du solltest bei sowas aber nicht versuchen, alle 30 Fehler gleichzeitig zu lösen, sondern fange beim ersten an, und korrigiere vielleicht offensichtliches wie fehlende Semikola. Ansonsten nochmal kompilieren, und schaun, welche Fehler nun noch auftreten. Denn ein Fehler zieht meist böse weitere Fehlermeldungen mit sich, die eigentlich keine sind.




Bezug
                
Bezug
Klasse für ein Polynom in C++: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 10:33 Mo 26.07.2010
Autor: qsxqsx

Hallo Event_Horizon,

Wieder danke...

Ist gut zu wissen das ich auf dem richtigen Weg bin. Ob ich das Porgramm im Prüfungsstress noch fertig schreibe denk ich nicht - das kann bei mir eine Woche dauern bei 30 Fehlern (ich erinnere mich noch an zeiten wo ich ein Sudoku solver geschrieben hab...).

"Das reinschreiben deiner Koeffizienten ist so nicht möglich, weil dein double *coeff so, wie es guter Stil ist, private ist. Genauso, wie du eine Get-Methode geschrieben hast, solltest du auch eine Set-Methode schreiben."
Gute Info. Ich hab mich eben auch noch gewundert, aber im Gerüst war eben keine solche Methode "set" und da in der Testaufgabe nur steht man solle multiply schreiben habe ich gedacht das muss auch ohne gehen...aber das sind ja Klassen...

Ja ich hoffe, wenn man weiss wie der Algorithmus gehen soll für die Multiplikation, dass man dann schon viele Punkte kriegt;).


Gruss Qsxqsx

(Ich ändere die j++ und i++ noch weg, sowie die Klammern hier in meinem Vorigen Beitrag)

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.schulmatheforum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]