2017-11-13 6 views
0

私はこの頭の中に私の頭を包み込むことができなかったコードを持っています。前提は、数字のセットを入力することです:そして、出力する:4x ^(3)+ 5x ^(2)+ 6x ^(1)+ 7x ^(0) istreamとostream。私は数字のためのベクトルを使用している、私が持っている問題は、ベクトルが正しく充填されていないということです。例えばostreamとistreamのあるC++ベクタ

ベクターは、上記の入力を配っているVEC1呼び出される場合:私は、任意のチュートリアルを見つけることができませんでした

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

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

を私は出力にそれをしたいですベクトルと一緒にistreamを使用する例があるので、誰かがベクトルと一緒にistreamを使う基本を私に助けてくれることを望んでいましたか?ちょうど一般的な例は絶対に素晴らしいでしょう!

PS:私はC++を使い慣れていないので、用語の使い方が間違っているとすみません。

編集:(ここに私のIStreamコードが現在です):

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

私たちにコードを教えてください。私はあなたにいくつかのシンプルで一般的なエラーがあると思う。 –

+1

'ベクトル tmp1; for(int i = 0; i tmp2(tsize);' – PaulMcKenzie

答えて

1

ああ、私は理解しています。このようなものはどうですか:

#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; 
} 

物事を適切に命名すると、物事を正しくループさせることができます。入力ストリームは、何かが間違っている場合はエラーを正しくログに記録しますが、度が負の場合のみを除いて、特別な場合が必要です。

私はループの代わりにいくつかの標準オブジェクトを使用しました。より便利なものを使用することができます:最初の整数値の後にN + 1の倍数があることを覚えておいてください。

最後に、多項式の関数を使用することを忘れないでください。ベクトルを使用してすべての係数を1回のパスで設定できる場合は、そのようにします。

は(ところで、このコードは単なるタイプミス。私の頭の上オフで入力したと愚かなエラーが発生した可能性があります。)

編集はCalethさんのコメントに従って修正します。

+0

'copy_n'で再割り当てを避けるために、' back_inserter'の代わりに 'vector(size_t)'コンストラクタと 'coefficients.begin()'を使うことができます。 – Caleth

関連する問題