1

我正在从我的 C++ 书中进行随机练习,因为我正在“重新学习”C++,但是我从我编写的程序中得到了一些奇怪的输出。我相当确定程序的逻辑没有错误,但是“scoreCount”数组中元素的总和应该是26,与scores数组的长度相同,它只有20。我可以不知道其他 6 个元素发生了什么。练习的描述在下面的代码中。谁能发现我可能做错了什么?

/* Exercise 09 - 04

   Write a program that reads a file consisting of students' test scores
   in the range 0-200. It should then determine the number of students having
   scores in each of the following ranges: 0-24, 25-49, 50-74, 75-99,
   100-124, 125-149, 150-174, and 175-200. Output the score ranges and the
   number of students. (Run your program with the following input data:
   76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189, 167, 200, 175,
   150, 87, 99, 129, 149, 176, 200, 87, 35, 157, 189.) */
#include <cstdio>

int main(int argc, char ** argv) {
  int scores[] = {76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189,
                  167, 200, 175, 150, 87, 99, 129, 149, 176, 200, 87,
                  35, 157, 189};
  int size = sizeof(scores) / sizeof(scores[0]);
  int scoreCount[] = {0, 0, 0, 0, 0, 0, 0, 0};

  printf("Number of Scores: %d\n\n", size);

  for(int i = 0; i < size; i++) {
    scoreCount[((int)(scores[i]/25))] += 1;
    printf("%d - scoreCount Index: %d\n", i, ((int)(scores[i]/25)));
  }

  printf("\n");

  int low = 0;
  int high = 24;

  size = sizeof(scoreCount) / sizeof(scoreCount[0]);

  for(int i = 0; i < size; i++) {
    printf("Range %d-%d: %d\n", low, high, scoreCount[i]);
    low += 25;
    high += 25;
    if(high == 199) high = 200;
  }

  int sum = 0;

  for(int i = 0; i < size; i++) {
    sum += scoreCount[i];
  }

  if(sum < 26) printf("\n%d: Wrong number of scores counted.\n", sum);
  else printf("\nAll students accounted for.\n");

  return 0;
}

谢谢你的帮助!

4

8 回答 8

7

这是正确的 C++ 风格。我知道这个问题已经得到解答,但这里有一个好处:

在http://ideone.com/rBTi42上现场观看

#include <vector>
#include <map>
#include <iostream>

int main(int argc, char ** argv)
{
    const std::vector<int> scores = {76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189,
                                     167, 200, 175, 150, 87, 99, 129, 149, 176, 200, 87,
                                     35, 157, 189
                                    };
    std::map<int, int> scoreCount;
    std::cout << "Number of Scores: " << scores.size() << "\n";

    for(auto score : scores)
    {
        scoreCount[score/25] ++;
        std::cout <<  score << " - scoreCount Index: " << score/25 << "\n";
    }

    for(auto const& slot : scoreCount)
    {
        auto low  = slot.first*25;
        auto high = low+24;
        std::cout << "Range " << low << "-" << high << ": " << slot.second << "\n";
    }

    int sum = 0;
    for(auto const& slot : scoreCount)
        sum += slot.second;

    if(sum < 26)
        printf("\n%d: Wrong number of scores counted.\n", sum);
    else
        printf("\nAll students accounted for.\n");
}
于 2013-08-01T16:22:45.103 回答
1

scoreCount 数组中的元素数应为 9 而不是 8。

因为 200/25 将被评估为 8 并导致索引超出范围

编辑:

正如 Andrew_CS 所建议的,应该将值为 200 的元素添加到最后一个组本身。

scoreCount[(scores[i]/25)==8?7:(scores[i]/25)] += 1;
于 2013-08-01T16:17:21.317 回答
1
  scoreCount[((int)(scores[i]/25))] += 1; 

如果 score[i] 为 200,这将产生 8。目前您的代码无法处理此问题。

于 2013-08-01T16:18:28.027 回答
1

200 / 25 = 8 并且 scoreCount[8] 不存在。

于 2013-08-01T16:19:00.990 回答
1

scoreCount您正在为此处生成超出范围的索引:

scoreCount[((int)(scores[i]/25))] += 1;

的有效索引scoreCount来自,0 to 7但使用您当前的scores索引,您将生成最高8. 一种解决方案是扩展scoreCount一个元素或检查索引是否是8并将其映射到索引7,因为看起来问题限制了您的范围。

于 2013-08-01T16:19:07.117 回答
0

200/25 = 8 超出 scoreCount 的范围 - 只有索引 0 - 7。

我个人不会增加 scoreCount 中元素的数量,因为只有 8 组有效分数。相反,我会检查产生 8 作为索引的这种情况。

for(int i = 0; i < size; i++){
    int theIndex = (scores[i]/25);
    if(theIndex == 8)
        scoreCount[7] += 1;
    else
        scoreCount[theIndex] += 1;
    printf("%d - scoreCount Index: %d\n", i, theIndex;
}
于 2013-08-01T16:31:00.967 回答
0

我在我的机器上运行了代码。我在 26 分中得到了 23 分。

原因是 200 有 3 个值。当值为 200 时,它将低于 8。

于 2013-08-01T16:20:25.673 回答
0

您需要增加scoreCount数组中的元素数量,因为200/25给出8且不scoreCount[8]存在。

于 2013-08-01T16:24:46.810 回答