2017-11-24 4 views
1

C++で初めてのことです。C++のprint要素の合計

私は他の質問を検索、しかし、私は私の問題を解決することができませんでした:(

私はちょうどリストとプリント和の要素のすべてを印刷したい。

しかし、私は、「文字のいくつかの問題を抱えて+」

これは私のコードです。

#include <iostream> 
#include <list> 
using namespace std; 

int main() { 
    int count = 0, sum = 0; 
    list<int> square; 
    int n, m; 
    cout << "Please enter tow positive integers between M and N -> "; 
    cin >> m >> n; 
    while (m>=n) { 
     cout << "Please try agrin" << endl; 
     cin >> m >> n; 
    } 
    for (int i = 1; i <= n; i=i+1) { 
     /*cout << i << endl;*/ 
     if (i*i >= m && i*i <= n) { 
      square.push_back(i*i); 
      count=count+1; 
      sum = sum + (i*i); 
      //cout << i << endl; 
     } 
    } 
    for (list<int>::iterator i = square.begin(); i != square.end(); ++i) 
     cout << *i << "+"; 
    cout << "=" << sum; 
    return 0; 
} 

私は以下のような出力を得た。

16+25+36+49+64+81+100+=371 

しかし、私は以下のようになっています。

16+25+36+49+64+81+100=371 

最後の要素に「+」の文字がありません。

しかし、私はやり方がわかりません。

いいですか?

+1

リストの最後に繰り返し、ループの後の最後の要素を印刷します。 – George

+0

@ Georgeあなたのポイントは有効です。しかし、より多くの詳細を言い換えて改善することができるようです。より多くの書式設定機能を利用できるようにすることを検討してください。 – Yunnosch

+0

[Here](https://stackoverflow.com/questions/3496982/printing-lists-with-commas-c) – Oneiros

答えて

3

でない場合は、の最後の要素を(std::prev)で印刷してから、プラス記号を印刷してください。

for (list<int>::iterator i = square.begin(); i != square.end(); ++i) { 
    cout << *i; if(i != std::prev(square.end())) cout << "+"; 
} 

PS:すべての反復で二回イテレータをチェックしないようにするためには、あなたがprelast要素まで追加プラス記号を使用して印刷してから、最後に印刷する必要があります。このよう

要素外部プラス記号のないループ。

例:

for (list<int>::iterator i = square.begin(); i != std::prev(square.end()); ++i) 
    cout << *i << "+"; 
cout << *std::prev(square.end()); 
cout << "=" << sum; 
+0

では、イテレータをチェックするので、最も効率的ではありません。毎回2回。 – ROX

+1

@ROX私は同意し、実際これは私の初期のアプローチでしたが、私はdownvotesだったので、コースが変更されました。私は今私の答えにそれを注入した、何を言う? – gsamaras

+0

はい、これは私が思っていたことです。=記号が付いていると、ループの最後にはいつも特別なケースがあることを意味します(ループ内に置くこともできます)。それがなぜdownvotesを集めたのか分からない - それを説明するコメントはありません。 – ROX

0

あなたが反復しながら、数字を印刷し、印刷することができます「+」だけの要素間:

for (int i = 1; i <= n; i=i+1) { 
    if (i*i >= m && i*i <= n) { 
     if (count) // If we already printed a number then include also a plus sign 
     { 
      cout << "+"; 
     } 
     cout << (i*i); 
     square.push_back(i*i); 
     count=count+1; 
     sum = sum + (i*i); 
    } 
} 

cout << "=" << sum; 

それともyoが持つ出力コードをミックスしたいいけない場合他のものは、印刷ループのみを変更することができます:

for (list<int>::iterator i = square.begin(); i != square.end(); ++i) 
{ 
    if (i != square.begin()) 
    { 
     cout <<"+"; 
    } 
    cout << *i; 
} 
1

ostream_joiner

#include <experimental/iterator> 
#include <algorithm> 

std::copy(cbegin(square), cend(square), 
      std::experimental::make_ostream_joiner(std::cout, "+")); 
std::cout << "=" << sum; 

ostream_joinerが既に実装されているかどうかは、コンパイラによって異なります。

関連する問題