Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Tipp Polynom berechnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.01.2014, 13:00 Uhr
~surge
Gast


Hallo,

ich habe die Aufgabe ein Programm zuschreiben, dass zuerst den Polynomgrad (zwischen 2 und 8) und anschließend die Koeffizienten einliest. Der Anwender soll dann eine reelle Zahl eingeben, für die der Wert des Polynoms berechnet wird. Die Koeffizienten werden in einem Feld gespeichert.
So weit so gut.
Muss ich das "hart programmieren", also für jeden Polynomgrad (unterscheidung mittels if/if else) alle Berechnungen anstellen? Bei einem Polynom 8. Grades wären das 8 Rechnungen + Addition.
Oder gibt es da eine elegantere Variante? Habe das Gefühl irgendwie auf dem Schlauch zu stehen.

Das habe ich bis jetzt geschrieben:


Code:
#include "iostream"
using namespace std;

void main ()
{
    int pgrad, aus, za, Feld[100], x, Wert, quad_2, i;
    int quad_k =0;
cout<<"Programm zur Berechnung der Werte eines Polynoms" << endl;
    do {
    
    cout<<"Bitte auswaehlen: "<<endl;
    cout<<"1 - Polynomgrad eingeben"<<endl;
    cout<<"2 - Koeffizienten einlesen"<<endl;
    cout<<"3 - Reelle Zahl einlesen und Wert berechnen"<<endl;
    cout<<"4 - Reelle Zahl einlesen und Quadratwurzel berechnen"<<endl;
    cout<<"5 - Programm beenden"<<endl;
    cin>>(aus);

    switch (aus)
    {
    case 1:
        do
        {
        cout<<"Bitte Polynomgrad eingeben, er muss zwischen 2 und 8 liegen:"<<endl;
        cin>>pgrad;
        }while (pgrad < 2 || pgrad > 8);
        break;
    case 2:
        za=0;
        while (za!=pgrad+1)
        {
            cout<<"Bitte Koeffizienten Nr. " <<za<< " eingeben."<<endl;
            cin>>Feld[za];
            za++;
        }
        break;
    case 3:
        do
        {
        cout << "Bitte geben Sie eine reelle Zahl ein: "<<endl;
        cin >> x;
        }
        while (x<0);
    
        if (pgrad == 2) // Beginn der Berechnung eines Polynoms des 2. Grades
        quad_2 = 0;
        i=0;
        while ( i<pgrad)
        {
            quad_2=x*x*i;
            i++;
        }

        za=0;
        if (za == 0)
        {
        quad_k=Feld[za]*quad_2;
        za++;
        }

    
        za=1;
        Wert=0;
        while (za != pgrad)
        {
        Wert+=x*Feld[za];
        za++;
        }

    if (za == pgrad)
    {
    Wert+=Feld[za];
    za++;
    }
    Wert+=quad_2;
        cout<<"Wert des Polynoms: "<<Wert<<endl;

        break;
    default:
        cout<<"Ungueltige Auswahl!"<<endl;
        break;
    }
    }while (aus != 5);
    
}




Danke für eure Antworten.
Gruß,
surge
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.01.2014, 16:53 Uhr
ao

(Operator)


Hi,
das sieht mir so aus, als wäre deine Polynom-Berechnung irgendwie Murks, aber vielleicht liegts auch nur daran, dass der Algorithmus ein bisschen hintenrum ist. Ein paar Kommentare, wie das Ding rechnet, wären angebracht.

Allgemein geht die Polynomberechnung so, vielleicht solltest du das einfach umsetzen:


Code:

y = a[0] * x^0 + a[1] * x^1 + a[2] * x^2 + .... + a[N] * x^N

mit N = Grad des Polynoms. Es sind also N+1 Summanden. Die Formel in Summenschreibweise:

      N  
y = Summe ( a[i] * x^i )
     i=0


Der Grad des Polynoms kann auch daran erkannt werden, dass es der höchste vorkommende Index ist, für den a[i] != Null ist.

Dass das Ganze als Summenausdruck darstellbar ist, ist ein Hinweis darauf, dass eine Implementierung mit einer for-Schleife naheliegt.

Weiterhin gibt es keinen sinnvollen Grund dafür,
* dass die Koeffizienten nur ganzzahlig sein können (float oder double wäre besser),
* dass du Speicher für 100 Koeffizienten reservierst, wenn der Polynomgrad maximal 8 sein kann,
* dass für x und Wert nur ganze Zahlen zugelassen sind,
* dass für x obendrein nur positive Zahlen zugelassen sind.

Dieser Post wurde am 14.01.2014 um 17:01 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.01.2014, 17:00 Uhr
ao

(Operator)


*gelöscht*
Dieser Post wurde am 14.01.2014 um 17:00 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.01.2014, 18:09 Uhr
~surge
Gast



Zitat von ao:
Hi,
das sieht mir so aus, als wäre deine Polynom-Berechnung irgendwie Murks, aber vielleicht liegts auch nur daran, dass der Algorithmus ein bisschen hintenrum ist. Ein paar Kommentare, wie das Ding rechnet, wären angebracht.

Allgemein geht die Polynomberechnung so, vielleicht solltest du das einfach umsetzen:


Code:

y = a[0] * x^0 + a[1] * x^1 + a[2] * x^2 + .... + a[N] * x^N

mit N = Grad des Polynoms. Es sind also N+1 Summanden. Die Formel in Summenschreibweise:

      N  
y = Summe ( a[i] * x^i )
     i=0


Der Grad des Polynoms kann auch daran erkannt werden, dass es der höchste vorkommende Index ist, für den a[i] != Null ist.

Dass das Ganze als Summenausdruck darstellbar ist, ist ein Hinweis darauf, dass eine Implementierung mit einer for-Schleife naheliegt.

Weiterhin gibt es keinen sinnvollen Grund dafür,
* dass die Koeffizienten nur ganzzahlig sein können (float oder double wäre besser),
* dass du Speicher für 100 Koeffizienten reservierst, wenn der Polynomgrad maximal 8 sein kann,
* dass für x und Wert nur ganze Zahlen zugelassen sind,
* dass für x obendrein nur positive Zahlen zugelassen sind.


Das ist in der Aufgabenstellung vorgegeben.

Vielen Dank für deine Antwort.
Der Algorithmus funktioniert, allerdings sehr umständlich. Deswegen auch mein Posting hier.
Werde mich mal daran, deinen Vorschlag zuprogrammieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.01.2014, 10:46 Uhr
~surge
Gast


Habe es nun so programmiert:


C++:
        case 3:
            do
                {
                    cout << "Bitte geben Sie eine reelle Zahl ein: "<<endl;
                    cin >> x;
                }while (x<0);
            Wert=0;
            za=0;
            i=0;
            grad=pgrad+1;
                while (i<grad)
                    {
                        Wert+=Feld[za]*pow(x,pgrad);
                        za++;
                        i++;
                        pgrad--;
                    }
                        cout<<"Wert des Polynoms: "<<Wert<<endl;
        break;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.01.2014, 13:47 Uhr
ao

(Operator)


Schon besser, aber eigentlich immer noch zu kompliziert. Diese while-Schleife über i macht einem einen Knoten ins Hirn.

Du speicherst die Koeffizienten in ungeschickter Reihenfolge (Feld[0] gehört zur höchsten Potenz von x). Deswegen brauchst du in der Berechnungsschleife gegeneinanderlaufende Indizes. Würdest du die Koeffizienten umgekehrt ablegen (Feld[0] gehört zu x^0), dann könntest du alles mit demselben Index erledigen und der Code würde viel klarer.

za und i laufen exakt gleich, d.h. einer von beiden ist überflüssig und gehört rausgeschmissen.

Außerdem veränderst du pgrad, und das darfst du hier nicht. Im Menüpunkt 3 muss pgrad für dich konstant sein, damit du die Berechnung mehrfach hintereinander machen kannst. So wie es jetzt ist, muss du nach jeder X-Wert-Berechnung den Grad neu setzen (Menüpunkt 1), damit es weitergehen kann.

Aus der Sicht eines Softwareentwicklers, der jeden Tag 8 Stunden lang Programme schreibt: Guter Code ist Code, dem ich mit einem Blick ansehen kann, was er tut und den ich auch in drei Monaten noch verstehe. Verklausulierungen wie oben sind Mist, weil ich ständig über Nebensachen nachdenken muss.

Hier ist zum Vergleich mal mein case 3:

C++:
            case 3:
                cout << "x: ";
                cin >> x;            
                xpow = 1;            //    x^0
                y = 0;
                for (i = 0; i <= grade; i++)
                {
                    y += a[i] * xpow;    //    xpow ist hier x^i
                    xpow *= x;            //    naechste Potenz von x
                                        //    fuer naechsten Durchlauf
                }
                cout << "y = " << y << endl;
                break;


Dieser Post wurde am 15.01.2014 um 14:10 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.01.2014, 14:46 Uhr
~surge
Gast



Zitat von ao:
Schon besser, aber eigentlich immer noch zu kompliziert. Diese while-Schleife über i macht einem einen Knoten ins Hirn.

Du speicherst die Koeffizienten in ungeschickter Reihenfolge (Feld[0] gehört zur höchsten Potenz von x). Deswegen brauchst du in der Berechnungsschleife gegeneinanderlaufende Indizes. Würdest du die Koeffizienten umgekehrt ablegen (Feld[0] gehört zu x^0), dann könntest du alles mit demselben Index erledigen und der Code würde viel klarer.


Stimmt, daran habe ich nicht gedacht. Die Koeffizienten nun anderst eingelesen, siehe unten.


Zitat von ao:

za und i laufen exakt gleich, d.h. einer von beiden ist überflüssig und gehört rausgeschmissen.



Uups, danke für den Hinweis. Ist raus.

Außerdem veränderst du pgrad, und das darfst du hier nicht. Im Menüpunkt 3 muss pgrad für dich konstant sein, damit du die Berechnung mehrfach hintereinander machen kannst. So wie es jetzt ist, muss du nach jeder X-Wert-Berechnung den Grad neu setzen (Menüpunkt 1), damit es weitergehen kann.
[/quote]

Deswegen hat das anschließende Wurzel ziehen nicht geklappt

Allerdings stimmt die Berechnung nicht.
Test mit dem Polynom 4x^3+2bx^2+7x+2 mit x=2 => 56
Laut Programm aber 52??


C++:
    case 1:
        do
        {
        cout<<"Bitte Polynomgrad eingeben, er muss zwischen 2 und 8 liegen:\n";
        cin>>pgrad;
        }while (pgrad < 2 || pgrad > 8);
        break;
    case 2:
        
            za=0;
            while (za<=pgrad)  // Koeffizienten einlesen
            {
                cout<<"Bitte Koeffizienten Nr. " <<za<< " eingeben.\n";
                cin>>Feld[za];
                za++;
            }
    
        break;
    case 3:
          
                cout << "x: ";
                cin >> x;            
                xpow = 1;            //    x^0 xpow = int variable!!
               Wert = 0;
                for (i = 0; i <= pgrad; i++)
                {
                    Wert += Feld[i] * xpow;    //    xpow ist hier x^i
                    xpow *= x;            //    naechste Potenz von x fuer naechsten Durchlauf
                                            
                }
                cout << "Wert = " << Wert << endl;
                break;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.01.2014, 14:52 Uhr
surge



Post über mir kann gelöscht werden, sind ein paar Fehler drin
Fehler gefunden.

Dieser Post wurde am 16.01.2014 um 14:53 Uhr von surge editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: