Ausgabe des Programm(Hornschema)

Neue Frage »

Auf diesen Beitrag antworten »
beta258 Ausgabe des Programm(Hornschema)

Wie kann man auf die Ausgabe des Programms kommen.

Kann das leider nicht nachvollziehen, kann mir einer weiterhelfen.

Lösungen: Nr. 1 (x,k,grad) Nr. Rückgabewert
1. (3,0,2) 6. 7*3+a[0]=24
2. (3,1,1) 5. 2*3+a[1]=7
3. (3,2,0) 4. a[2]= 2
Ausgabe: 24

Der Code, der diese Ausgaben produziert ist im Anhang.
Ich verstehe leider nicht so, wie man auf diese Ergebnisse kommt. Könnte mir einer helfen und sagen, wie und welche Codes diese Ausgaben(die einzelnen Schritte, die dazu führen) produzieren und wie?

Wäre sehr nett, wenn ihr mir helfen könntet Augenzwinkern
 
Auf diesen Beitrag antworten »
as_string

Was genau verstehst Du nicht? Kennst Du das Horner Schema zum effizienten ausrechnen eines Polynoms?

Gruß
Marco
Auf diesen Beitrag antworten »
beta258

Zitat:
Original von as_string
Was genau verstehst Du nicht? Kennst Du das zum effizienten ausrechnen eines Polynoms?

Gruß
Marco




2 1 3 x=3
+ 6 21
2 7 24

Grad ist doch immer z.B. ^2 oder so und x=3 ist ja konstant.
Und 1 , 2 , 3 sind immer die Nummern

Schuldige, wenn ich mich so schlecht ausdrücke ):

code:
1:
return grad?poly(x,k+1,grad-1)*x+a[k]:a[k];


Warum muss für k also die Nr. extra eingeben werden, dass k+1 wird, außer es enthält kein Grad, obwohl das letzte dann k=3 wäre, oder gilt das erst für das folgende und nicht für das aktuelle(so eine Art Zähler?)

code:
1:
Polynom(const vector <double>&koeffizienten) : a(koeffizienten)


Und wozu dient eigentlich extrra dieses & , etwa um die beiden zu verknüpfen?


code:
1:
2:
3:
4:
5:
vector<double> a
.
.
const vector <double> koeff
vector <double> koeff


Wieso muss da extra double deklariert werden, obwohl das schon bei der Funktion getan wurde
Und ist vector nicht double, weswegen man doch nicht extra vector <double> a deklarieren müsste.

Schließlich wollte ich noch wissen, ob
code:
1:
double operator() (double x)
nur reine Formsache ist und man theoretisch nur x deklarieren könnte.
Auf diesen Beitrag antworten »
as_string

Zitat:
Original von beta258
Zitat:
Original von as_string
Was genau verstehst Du nicht? Kennst Du das zum effizienten ausrechnen eines Polynoms?

Gruß
Marco




2 1 3 x=3
+ 6 21
2 7 24

Zwar schwer lesbar, aber ok.
Zitat:
Original von beta258
Grad ist doch immer z.B. ^2 oder so und x=3 ist ja konstant.
Und 1 , 2 , 3 sind immer die Nummern

Grad ist hier 2, richtig, aber x ist ja eigentlich nicht konstant, sondern eben gerade eine Variable, die hier zur Beispiel-Berechnung halt mal den Wert 3 annehmen soll. Letztlich willst Du ja aber das Polynom-Objekt eigentlich zur Berechnung von vielen Funktionswerten des Polynoms verwenden, wenn man das wirklich mal nutzen würde (also z. B. um einen Funktions-Graph des Polynoms zu zeichnen, musst Du ja ganz häufig alle möglichen x-Werte einsetzen, um die y-Werte raus zu bekommen).
Nummern? Was für Nummern??? 2, 1 und 3 sind hier die Koeffizienten des Polynoms, also die Vorfaktoren.

Zitat:
Original von beta258
code:
1:
return grad?poly(x,k+1,grad-1)*x+a[k]:a[k];


Warum muss für k also die Nr. extra eingeben werden, dass k+1 wird, außer es enthält kein Grad, obwohl das letzte dann k=3 wäre, oder gilt das erst für das folgende und nicht für das aktuelle(so eine Art Zähler?)

code:
1:
Polynom(const vector <double>&koeffizienten) : a(koeffizienten)


Und wozu dient eigentlich extrra dieses & , etwa um die beiden zu verknüpfen?


code:
1:
2:
3:
4:
5:
vector<double> a
.
.
const vector <double> koeff
vector <double> koeff


Wieso muss da extra double deklariert werden, obwohl das schon bei der Funktion getan wurde
Und ist vector nicht double, weswegen man doch nicht extra vector <double> a deklarieren müsste.

vector ist eine generische Klasse, die viele Elemente eines bestimmten Datentyps (nicht nur double, sondern alle möglichen Klassen sind möglich) beinhalten kann. Hier brauchen wir für die Koeffizienten ja eine Liste (also einen Vektor) von double-Werten, deshalb kann man mit vector<double> eine Klasse angeben, die eben einen Vektor liefert, in dem nur double-Werte rein können.
Variable a, vom Typ vector<double>, ist eine Member-Variable der Klasse Polynom. dem Konstruktor wird die Übergabe eines Koeffizienten-Vektors definiert (bzw. der Referenz, da ist ja ein Kaufmanns-Und hinten dran!), die direkt in a zugewiesen wird. Und dann gibt es noch in main() einen entsprechenden Vektor in einer lokalen Variable "koeff".

In main() wird koeff mit Werten belegt und dieser auf diese Art vorbelegte Vektor wird zur Initialisierung des neuen Objekts Namens p der Klasse Polynom verwendet. Das führt dazu, dass die Member-Variable a des Objekts p die Werte vom koeff-Vektor übernimmt.
Du kannst auf diese Art viele Polynome mit unterschiedlichen Koeffizienten definieren, indem Du die Koeffizienten zuerst in einen Vektor schreibst und dann beim Initialisieren des neuen Polynoms übergibst. Dann wird a der unterschiedlichen Polynome auch mit unterschiedlichen Koeffizienten belegt.
Zitat:
Original von beta258
Schließlich wollte ich noch wissen, ob
code:
1:
double operator() (double x)
nur reine Formsache ist und man theoretisch nur x deklarieren könnte.

Das ist eine Operator-Überladung für die Klammern. Das erst ermöglicht, dass man in Zeile 24 die Ausgabe von p(3) auf diese Art schreiben kann, weil die Klammer hinter p zu diesem Operator aufgelöst wird und dann die für diesen operator definierte Anweisungs-Block ausgeführt wird, nämlich der
code:
1:
return poly(x, 0, a.size() - 1);


Ich denke, hier verstehst Du gar nicht, was überhaupt gemacht wird! p(3) in main() ruft diesen Code auf, deligiert also direkt nach poly mit den entsprechenden Anfangswerten x, 0 und a.size() -1, wobei x dann eben den Wert 3 annimmt und a ist ja mit 3, 1, 2 vorbelegt, also ist a.size() 3 und es wird letztlich poly(3, 0, 2) aufgerufen (entsprechend der ersten Zeile Deiner Musterlösung).
In poly gibt es aber einen rekursiven Aufruf, wobei 3 immer weiter gegeben wird, aber k um eins erhöht weiter gegeben wird und grad eins niedriger, also wird aus der 0 (k im zweiten Argument) eine 1 und aus 2 (dem grad im 3. Argument) wird auch eine 1, deshalb hat man (3, 1, 1). Im letzten Aufruf von poly wird dann entsprechend (3,2,0) übergeben.
Die einzelnen Aufrufe rechnen genau die Werte aus, die Du oben in Deinem tabellarischen Schema von Hand auch ausgerechnet hast: poly(3,2,0) gibt die 2 zurück, die bei poly(3,1,1) verwendet wird, um in Summe auf die 7 zu kommen, und letztlich wird die 7 dann im Aufruf von poly(3,0,2) verwendet, um in Summe das Endergebnis von 24 auszurechnen.
Dabei werden genau die Rechenschritte durchgeführt, die im Horner-Schema auch ausgeführt werden müssen. Überlege Dir mal diese einzelnen Rechenschritte und schau, wie der Ablauf mit dieser Rekursion ist und wie damit genau diese benötigten Rechenschritte auch durchgeführt werden.

Gruß
Marco
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »