2

我真的在努力解决我在一本书中正在解决的问题。我正在自学 C++,只到了第 3 章,但这个问题真的让我陷入了困境。

问题是:“从 din 读取一系列单词并将值存储在一个向量中。读取所有单词后,处理向量并将每个单词更改为大写。将转换后的元素,八个单词打印为线。” - 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

Jon 建议的替代方法,使用模数运算符。

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

一个简单的方法是跟踪当前行上已打印的单词数,并在该计数超过 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 回答
0

通常,您会将 a 复制vectorcoutusingcopy和 an ostream_iterator

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

最后一个参数确定分隔符,在本例中为空格。

beginend复制 整个vector. 我们想使用一些东西来代替beginand end,这样我们就可以在向量中以 8 个块为单位向前移动,在最后的块中可能更少。

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

我知道这个线程已经很老了,但是我在阅读本书(第 5 版)时遇到了同样的问题,并找到了一个与本书中解释的内容更一致的解决方案,直到本章(第 3 章)。本书目前唯一没有涉及的问题是使用模数方法来实现一个运行速度比循环迭代器慢的计数器,但其余的都是从那里获取的。

int main () { vector<string> sentence; string word; while (cin >> word) // add words from input sentence.push_back(word); unsigned cnt = 1; // initialize counter for (auto &w: sentence) { for (auto &c: w) // uppercase word c = toupper(c); cout << w << " "; // print word if (cnt%8 == 0) cout << endl; // eol every 8 counts ++cnt; } cout << endl; // extra eol return 0; }

于 2016-10-12T02:03:45.733 回答