2017-11-24 5 views
1

C++을 처음 사용했습니다.C++ 프린트 요소 합계

내가 다른 질문을 검색,하지만 난 그냥 목록 및 인쇄 합의 요소를 모두 인쇄 할 내 문제 :(

를 해결할 수 있습니다.

을하지만, 난 "문자의 몇 가지 문제를 가지고 + "

이 내 코드입니다.

#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

이터레이터를 검사하기 때문에 가장 효율적인 것은 아니지만 문제에 대한 많은 해결책을 찾을 수 있습니다 매번 두 번씩. – 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; 

또는 요는과 출력 코드를 혼합 싶지 않는 경우 그래서을 수 ostream_joiner 하나를 사용

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

: 다른 요는 인쇄 루프를 수정할 수 있습니다 귀하의 문제를 우아하게 생각해보십시오.

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

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

ostream_joiner이 이미 구현되었는지 여부에 따라 컴파일러에 따라 다릅니다.