2

本で取り組んでいる質問に本当に苦労しています。私は独学で C++ を学んでいて、まだ第 3 章までしか進んでいませんが、この質問には本当に行き詰まりました。

問題は次のとおりです。「din から一連の単語を読み取り、その値を [in] ベクトルに格納します。すべての単語を読み取った後、ベクトルを処理し、各単語を大文字に変更します。変換された要素、8 つの単語を 1 つの形式に出力します。ライン。" - C++ Primer (第 5 版) の演習 3.17

ベクトルに保存して、すべての単語を大文字に変更しても問題ありません。問題なのは、それらを印刷することです。

助けてください!私はとてもイライラしています!!! また、それを本当に素晴らしくシンプルにしてください。それは第3章に過ぎず、複雑な(現在のレベルの)コードではなく、そのレベルで答えを書きたいと思います。

すべての助けに感謝します!!

ここに私のコードがあります:

#include <iostream>
#include <string>
#include <vector>

using std::string; using std::vector; using std::cout; using std::cin; using std::endl;

int main ()
{
    vector<string> v1;  // Create an empty vector

    string words;     // Create a string "words"
    string output;

    while (cin >> words) {
        v1.push_back(words);
    }
    for (auto i = 0; i<v1.size(); ++i){
        for (auto &s : v1) {
            for (auto &c : s)
                c = toupper(c);
        }
        cout << v1[i] << " ";
    }
}
4

5 に答える 5

1

モジュラス演算子を使用して、ジョンが提案したものの代替。

for (int i = 0, i < v1.size(); ++i) {
    for (auto &c : v1[i]) {
        c = toupper(c)
    }

    // satisfying 8-per-line requirement
    if (i % 8 == 0) {
        std::cout << std::endl;
    }
    std::cout << v1[i] << " ";
}
于 2013-01-08T04:28:08.163 に答える
0

通常、 avectorcoutusingcopyにコピーし、ostream_iterator:

vector<string> words;
copy(words.begin(), words.end(), ostream_iterator<string>(cout, " "));

最後のパラメーターは、セパレーター (この場合はスペース) を決定します。

からに移動すると、全体がコピーbeginされます。andの代わりに何かを使用して、ベクトルを 8 つのチャンクで前進できるようにしたいと考えています。endvectorbeginend

int chunk_size = 8;

auto chunk_begin = words.begin();
while(disance(chunk_begin, words.end()) >= chunk_size) {
    auto chunk_end = chunk_begin;
    advance(chunk_end, chunk_size);
    copy(chunk_begin, chunk_end, ostream_iterator<string>(cout, " "));
    chunk_begin = chunk_end;
    cout << endl;
}
copy(chunk_begin, words.end(), ostream_iterator<string>(cout, " "));

PS私はしばしばカプセル化をお勧めします。もう少し考えてみると、出力反復子をカプセル化して追跡し、8 つの代入ごとにスペースの代わりに改行を書き込むことができます。これはかなりの作業ですが、再利用、可読性、コード サイズ、テストなどすべてが影響を受けるため、覚えておく価値があります。

copy(words.begin(), words.end(),
     chunked_ostream_iterator<string>(cout, " ", 8, "\n"));
于 2013-01-08T09:06:18.897 に答える
0

これを行う簡単な方法は、現在の行にこれまでに出力された単語の数を追跡し、その数が 8 を超えたときに行を終了することです。

int count = 0;
const int max = 8;

for (const auto& word : words) {
  cout << word << ' ';

  // One more word has been printed.
  ++count;

  // If the count exceeds the maximum number of words per line...
  if (count > max) {

    // ...then move to the next line.
    count = 0;
    cout << '\n';

  }

}
于 2013-01-08T04:15:16.813 に答える
0

STL を使用しているため、反復子に慣れていることを願っています。次の例は、反復子を使用したものです。

vector<string>::iterator itrbegin = v1.begin();
vector<string>::iterator itrend = v1.end();
int count = 0;
while(itrbegin != itrend)
{
  cout<<*itrbegin;
  count++;
  if(count % 8 == 0)
  {
    cout<<endl;  
  }
 itrbegin++;
}

これは機能し、ベクトルを出力するはずです。ベクトルに文字列が完全に入力された後に配置する必要があります。お役に立てれば!!

于 2013-01-08T06:40:21.203 に答える