7

我想遍历一个最大值为 1000 的数组。我正在用文本文件中的值填充数组。我正在尝试遍历该数组,但在我的 for 循环中,我不知道数组的长度,所以我不知道在 for 循环语句的第二部分中放入什么。例如:我有一个名为:的数组int scores[1000];,我正在尝试遍历这个数组并将分数放入一个等级类别中。所以 A = 90-100,B = 80-89,C = 70-79,D = 60-69,F = 0-59。

所以我不知道我的 for 循环会是什么样子:

for(int i = 0; i < ...; i++){

if(scores[i] > = 90 || scores[i] <= 100){

//Do stuff...

}

我想我也对如何在最后获得每个类别的总数感到困惑。但在大多数情况下,它是如何遍历这个数组的。我知道 sizeof(scores[]) 不会工作,因为这会给我 int 大小而不是数组本身的长度。提前谢谢!

4

4 回答 4

8

实际上sizeof()应该这样做:

sizeof(scores) / sizeof(scores[0])

这将为您提供数组的总元素数。

于 2013-05-21T01:48:52.100 回答
6

如果您改用std::vector( link ),则可以添加元素并让矢量动态更改大小。使用该方法可以轻松查询该大小size()。如果您使用这样的数组,您必须自己跟踪其中的元素数量。

如果您有一个向量填充元素,您的循环可能如下所示:

std::vector<int> scores;
// fill vector

for (unsigned int i=0; i<scores.size(); i++) {
  // use value
}

如果您必须使用数组并且实际上有一个scoreCount变量,其中包含实际值的数量,只需在循环中使用它:

for (int i=0; i<scoreCount; i++) {
  // use value
}

正如我在评论中提到的,第三种选择是使用您从未使用过的值(通常为 -1)初始化整个数组,然后将其用作填充数组位置与空数组位置的标记,如下所示:

for (int i=0; i<1000; i++) {
    scores[i] = -1;
}

// add real values to scores 

int i=0;
while (scores[i] != -1 && i < 1000) {
  // use value
  i++;
}
于 2013-05-21T00:21:26.007 回答
2

填充scores数组时,您需要实际计算放入其中的项目数。然后你记住这个数字并在以后使用它进行迭代。例如,您可能读过这样的分数:

// Read some scores: Stop when -1 is entered, an error occurs, or 1000 values are read.
int num_scores = 0;

for( ; num_scores < 1000; num_scores++ )
{
    if( !(cin >> scores[num_scores]) || scores[num_scores] == -1 ) break;
}

// Do stuff with scores...
for(int i = 0; i < num_scores; i++) {
    ...
}

还有一些其他选项需要考虑:

  • 使用标记值来表示数据的结尾,例如分数为 -1。
  • 改用 a std::vector

顺便说一句,循环中的逻辑语句将始终为真。你确定你不是故意使用&&代替||吗?

于 2013-05-21T00:28:05.047 回答
2

如果您真的想使用固定大小的容器,请使用std::array现代 C++ 而不是 C 数组:

#include <array>

std::array<std::int32_t, 1000> scores;

for (std::size_t i{0}; i < scores.size(); ++i) {
  // Do stuff...
}

否则使用std::vector

#include <vector>

std::vector<std::int32_t> scores;

for (std::size_t i{0}; i < scores.size(); ++i) {
  // Do stuff...
}

如果您能够使用 C++11,我还建议使用固定宽度整数类型。

于 2014-07-28T10:31:51.640 回答