【问题标题】:How to display the input value?如何显示输入值?
【发布时间】:2022-01-06 23:18:50
【问题描述】:

当值为 200 时,程序不会读取它。如何解决这个问题呢?该程序需要打印范围和数字,但如果用户输入 200,它就不起作用。例如,用户输入数字 180、190、200。预期输出为 3,但输出仅为 2。有关详细信息,请参阅附图。

【问题讨论】:

  • 您能否详细解释一下您的程序在做什么、您的输入是什么、预期输出是什么以及实际输出是什么?
  • 200 / 25 为 8,超出了results 的范围(有效索引范围为 0 到 7)
  • @BoP 我接下来应该怎么做才能解决这个问题?

标签: c++ arrays


【解决方案1】:

注意在声明中:

results[scores[i] / 25]++;

您应该检查表达式 scores[i] / 25 是否在向量 results 的大小范围内,否则这是未定义行为

在您的情况下,对于值 200,表达式 scores[i] / 25 的结果为 8。但由于 results 向量的大小为 7,因此您越界了,这会导致 未定义的行为

您可以使用std::vector.at() 成员函数来防止这种情况发生。因此,您可以将该语句修改为:

results.at(scores[i] / 25)++;//this will throw if you go out of bounds

这样做的好处是您的程序现在将没有未定义的行为。

您还可以添加检查scores[i] / 25是否大于或等于results向量的大小,然后您可以再次要求用户输入。

【讨论】:

    【解决方案2】:

    如果您想使用固定大小的向量,请确保最大输入分数不会太大。在我的示例中,您可以取输入值的最小值和允许的最大数字。如果您有 N=25 个桶,并且您接受的最大数字是 200,那么 200/25=8 是您希望达到的最大桶索引,这意味着您需要一个大小为 9 的桶。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    double largest_allowed_score = 200;  // if a score is larger than this, use this value isntead of the score
    size_t N = 25;  // number of entries to read in, results has the size of largest_allowed_score/N + 1
    
    ```cpp
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    double largest_allowed_score = 200;  // if a score is larger than this, use this value isntead of the score
    size_t N = 25;  // number of entries to read in, results has the size of largest_allowed_score/N + 1
    
    int main()
    {
        vector<double> scores(N);
    
        cout << "Enter Score: \n";
        for (size_t i = 0; i < N; ++i)
        {
            double val;
            cin >> val;
            val = min(val, largest_allowed_score);
            scores[i] = val;
        }
        size_t res_size = static_cast<int>(largest_allowed_score) / N + 1;  // the number of buckets, result size, or resolution 
        vector<double> results(res_size);
    
        // count the occurances in each bucket
        for (size_t i = 0; i < N; i++)
            results[static_cast<int>(scores[i]) / N]++;
    
        // print the buckets
        for (size_t i = 0; i < res_size; i++)
            cout << i * N << " - " << (i + 1) * N << ": " << results[i] << endl;
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2019-03-22
      相关资源
      最近更新 更多