Fragen eines Anfängers



  • schonmal vielen Dank, aber irgendwie schein ich zu dämlich zu sein...

    was ich programmieren soll ist ein Programm, das das Horner Schema anwendet.
    Das Programm besteht aus 3 "Teilen"

    hier ist einmal die main.C

    // main.C:
    
    // include Anweisungen
    
    #include <iostream>         
    #include <iomanip>       
    
    #include "Polynom.h"          
    
    using namespace std;
    
    void TabelleAusgeben()
    
    {
      cout << endl;
      cout.setf(ios::fixed);   // Zahlen in Dezimaldarstellung ausgeben
      cout.precision(5);       // und auf 5 Stellen hinter dem Komma genau
    
      cout << setw(11) << "x" << " " << setw(11) << "p(x)" << endl;
    
      for (double x=-1; x<1; x+=0.1) { 
        cout << setw(11) << x << "  " << setw(11) << p(x) << endl;
      }
    }
    
    // Hauptprogramm
    
    int main()
    {
      PolynomEingeben();
    
      TabelleAusgeben();
    
      return 0;
    }
    

    dann gibts einmal die Polynom.h

    // Polynom:
    
    // Funktionsprototypen
    
    int PolynomEingeben();  
    
    double p(double);
    

    und die polynom.C

    // include Anweisungen
    
    #include <iostream>         // Ein- und Ausgabeoperatoren
    #include <iomanip>          // Formatierungsoperationen fuer die Ausgabe
    
    #include "Polynom.h"          // Funktionsprototypen fuer dieses Programmmodul
    
    using namespace std;
    
    double koeff[20];      // Polynomkoeffizienten
    int n;                 // Grad des Polynoms f
    
    int PolynomEingeben() {
    
      cout << "Programm zur Auswertung eines Polynoms mit dem Horner Schema";
      cout << endl; 
    
      do {
        cout << "Geben Sie den Polynomgrad n ein (0<=n<20): " << flush;
        cin >> n;
      } while ( 0>n || n>=20 );
    
      for ( int i=n; i>=0; --i ) {
        cout << "Geben Sie den " << i << ". Koeffizenten ein: " << flush;
        cin >> koeff[i];
      }
    
      return n;
    
    }
    
    /* ab hier hab ich keine Ahnung mehr... */
    
    double p(double x) 
    
    {
      double p_von_x = koeff[n];
    
      for (int i = n-1; i>=0; i--) {
      p_von_x = p_von_x*x+koeff[n];
      }
    
      return x;	
    }
    

    Womit ich jetzt konkret Probleme hab, ist der unterste Teil - die Implementierung vom Algorithmus. Irgendwie schnall ich nicht, was ich da reinpacken soll...
    Könnt ihr mir dabei vielleicht helfen?



  • Was soll denn der Algorithmus tun? Wo genau kommst du nicht mehr weiter?

    Des Weiteren ist es in C++ eher üblich, die Implementierungsdateien mit der Endung .cpp statt .c zu versehen. Headerdateien gibt es noch einige mit .h, aber .hpp wird auch oft verwendet.



  • ich komm ab da nicht mehr weiter wo steht "ab hier komm ich nicht mehr weiter"^^

    der ganz untere teil - da wo der algorithmus eigentlich rein soll

    Beim Programm soll eine Polynom-Funktion eingegeben werden und dann mittels des HOrner-Schemas ausgewertet werden.
    Eigentlich fehlt nur der Algorithmus

    auf einer seite hab ich das gefunden:

    double p = a[n];
    for (int i = n-1; i>= 0; i--)
    p = p * x + a[i];
    

    Das soll der Algorithmus für das Horner-Schema sein
    Das hab ich versucht im letzten Teil da unten reinzuschreiben... aber irgendwie weiß ich nicht wie das richtig soll. Vor allem weiß ich nicht, was das "x" da soll.

    ich hab den Algorithmus nicht einfach aus einem Programm gerissen - der stand da schon als Hilfe da. Also nehm ich an, dass a der Koeffizient ist, n halt wie bei mir auch der Grad des POlynoms...

    *edit: gibt es einen bestimmten Grund, warum die Endungen sich geändert haben?



  • hat da einer vielleicht´ne Idee?

    sry, für den doppelpost und das drängen, aber es wär ganz schön, wenn ichd as bis morgen noch hinbekommen würde 🙂



  • Wanderfalke schrieb:

    *edit: gibt es einen bestimmten Grund, warum die Endungen sich geändert haben?

    Genau den Grund, den eine Dateiendung hat: Man soll erkennen um was für eine Datei es sich handelt.

    my.c = C Code
    my.cpp = C++ Code



  • ok -ich dachte es hätte ´nen vielleicht´nen technischen Hintergrund...
    Danke 🙂

    Hat noch einer´ne Idee für das Hauptproblem?



  • nö, heut nicht mehr,
    am wochenende wieder ok



  • Wanderfalke schrieb:

    Hat noch einer´ne Idee für das Hauptproblem?

    Ich sehe das Hauptproblem darin, dass du keine Ahnung von den Grundlagen hast..;)
    (Sorry, klingt hart, ist aber so).

    Zu deinem Problem.
    x ist normalerweise eine Variable, die du als Parameter an die Funktion übergibst.

    Das sieht ja aus, wie die Funktion, die du benutzen sollst..
    Und die erwartet x und gibt dann ein double zurück.

    double p(double x)
    
    {
      double p_von_x = koeff[n];
    
      for (int i = n-1; i>=0; i--) {
      p_von_x = p_von_x*x+koeff[n];
      }
    
      return x;   
    }
    

    Und hier findet ja der Aufruf statt..

    for (double x=-1; x<1; x+=0.1) {
        cout << setw(11) << x << "  " << setw(11) << p(x) << endl;
    

    Also wo genau ist denn das Problem?



  • sooo - ich hab jetzt das Problem gelöst - dafür hab ich ein neues Problem - mehr struktureller Art.

    Ich habe jetzt eine main.C, die Werte von anderen Programm übernimmt. Die Hauptarbeit wird halt in den Unterprogrammen gemacht, während die main.C einfach nur die Ergebnisse darstellt.

    Das Programm berechnet die Nullstellen iterativ und ich will jetzt einen Zähler einbauen, dermir angibt, wie oft ich die Schleife durchlaufen musste.
    Ich hab jetzt aber keine Ahnung, wo ich das hinschreiben soll. Eigentlich müsste das doch direkt an die Schleife ran - aber die main.C interessiert sich ja gar nicht dafür, ob ich da irgendwo cout <<"Mein Zähler"; hinschreibe, sondern nimmt einfach nur die Werte...

    Wie kann ich da jetzt einen Zähler reinbauen?

    Danke für eure ANtowrten 🙂



  • ach sry, für die Frage
    ich glaub ich dreh langsam durch...

    Hat sich schon geklärt 🙂



  • boar... in dem du erst mal c++ lernst, bevor du einfach nur copy&paste nutzt...

    komm von globalen variablen weg und übergib das, was du in den einzelnen funktionen brauchst, halt einfach an die fkt...

    #include <iostream>
    #include <cstdlib>
    
    using std::size_t;
    
    int main()
    {
    size_t polynom_grad(0);
    std::cin >> polynom_grad;
    if (!polynom_grad)
    {
      return EXIT_FAILURE;
    }
    std::vector <double> Koeffizienten; //alternativ auch nen rohes array - so mit new und delete und so ^^
    Koeffizienten.reserve(polynom_grad);
    for(size_t i(0); i != polynom_grad; ++i)
    { //das kann man auch in ne fkt auslagern, die polynom_grad und ne referenz auf Koeffizienten übergeben bekommt - und vll noch ne referenz auf den eingabestream (in dem fall std::cin)...
      double tmp;
      do
      {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin >> tmp;
      }while(std::cin.bad());
      Koeffizienten.push_back(tmp);
    }
    
    //Berechne(Koeffizienten);
    }
    

    Berechne würde vll nen besseren Namen und ne Implementieren vertragen ^^ Ansonsten sollte das so weit in Ordnung sein...

    bb


Anmelden zum Antworten