2017-11-13 4 views
0

Ich hatte dieses eine booger eines Codes, den ich nicht in der Lage gewesen bin, meinen Kopf herum zu wickeln. Die Voraussetzung ist die Eingabe einer Reihe von Zahlen: und es wird ausgegeben: 4x^(3) + 5x^(2) + 6x^(1) + 7x^(0) mit istream und Ostream. Ich verwende einen Vektor für die Zahlen und das Problem, das ich habe, ist, dass der Vektor nicht richtig füllt.C++ Vektoren mit ostream und istream

Zum Beispiel, wenn der Vektor vec1 der obigen Eingabe aufgerufen wird, was aus:

`vec1[0]==4 
    vec1[1]==5 
    vec1[2]==6 
    vec1[3]==4 
    vec1[4]==4` 

aber ich mag es Ausgabe:

`vec1[0]==3 
    vec1[1]==4 
    vec1[2]==5 
    vec1[3]==6 
    vec1[4]==7` 

ich nicht in der Lage war, alle Tutorials zu finden Beispiele für die Verwendung von istream mit einem Vektor, also hoffte ich, jemand könnte mir helfen mit den Grundlagen der istream mit einem Vektor zu verwenden? Nur ein allgemeines Beispiel wäre absolut großartig!

PS: Ich bin neu in C++, also tut mir leid, wenn meine Terminologie irgendwo falsch ist.

edit: (hier ist mein istream Code zur Zeit):

istream& operator>>(istream& left, Polynomial& right) //input 
    { 
     int tsize, tmp; 

     while (!(left >> tsize)) 
     { 
      left.clear(); 
      left.ignore(); 
     } 

     if (tsize < 0) 
     { 
      tsize *= -1; 
     } 

     vector<double>tmp1; 
     for (int i = 0; i < tsize; i++) 
     { 
      tmp1.push_back(0); 
     } 

     right.setPolynomial(tmp1); 

     for (int i = 0; i < tsize; i++) 
     { 
      while (!(left >> tmp)) 
      { 
       left.clear(); 
       left.ignore(); 
      } 

     right[i]=tmp; 

     } 
     //return a value 
     return left; 
    } 

`

void Polynomial::setPolynomial(vector<double>vec1) 
    { 
     for (int i = 0; i < vec1.size(); i++) 
      polynomial.push_back(vec1[i]); 

    } 
+0

Zeigen Sie uns den Code. Ich vermute, Sie haben ein paar einfache und häufige Fehler. –

+1

'Vektor tmp1; für (int i = 0; i tmp2 (tsize);' – PaulMcKenzie

Antwort

1

Ah, ich verstehe. Wie wäre es mit so etwas:

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 

// A polynomial is represented as a single non-negative integer N representing 
// the degree, followed by N+1 floating-point values for the coefficients in 
// standard left to right order. For example: 
// 3 4 5 6 7 
// represents the polynomial 
// 4x**3 + 5x**2 + 6x + 7 

std::istream& operator >> (std::istream& ins, Polynomial& p) 
{ 
    // You could set p to something invalid/empty here 
    // ... 

    // Get the degree of the polynomial 
    int degree; 
    ins >> degree; 
    if (degree < 0) ins.setstate(std::ios::failbit); 
    if (!ins) return ins; 

    // Get the polynomial's coefficients 
    std::vector <double> coefficients(degree + 1); 
    std::copy_n( 
    std::istream_iterator <double> (ins), 
    degree + 1, 
    coefficients.begin() 
); 
    if (!ins) return ins; 

    // Update p 
    p.setPolynomial(coefficients); 
    return ins; 
} 

Die richtige Benennung der Dinge hilft, und stellen Sie sicher, dass Sie durch die Dinge richtig durchlaufen. Der Eingabestream wird Fehler korrekt protokollieren, wenn etwas falsch ist, ausgenommen nur, wenn der Grad negativ ist, für den wir einen speziellen Fall benötigen.

Ich habe ein paar Standardobjekte anstelle einer Schleife verwendet; Sie können das verwenden, was Ihnen am bequemsten erscheint: Denken Sie daran, dass nach Ihrem ersten ganzzahligen Wert N + 1 Doppelpunkte folgen.

Schließlich sollten Sie die Funktionen Ihres Polynoms richtig verwenden: Wenn Sie einen Vektor verwenden können, um alle Koeffizienten in einem einzigen Durchgang zu setzen, tun Sie das einfach.

(BTW, wurde dieser Code gerade eingegeben-in aus der Spitze von meinem Kopf. Typos und dumme Fehler aufgetreten sind.)

bearbeiten modifiziert pro Caleth Kommentar.

+0

Sie könnten den 'vector (size_t)' -Konstruktor und 'coefficients.begin()' anstelle von 'back_inserter' verwenden, um die Neuzuweisung in' copy_n' zu vermeiden – Caleth