【问题标题】:Incorrect output using array as counter使用数组作为计数器的错误输出
【发布时间】:2015-05-28 05:41:55
【问题描述】:

我正在尝试通过 codeabbey.com 上的问题自学编程。

我在this question 上没有得到正确的输出。

问题: 这是一个长度为 M 的数组,其数字在 1 ... N 范围内,其中 N 小于或等于 20。您将通过它并计算每个数字遇到的次数。

输入数据在第一行包含 M 和 N。 第二行(相当长)将包含由空格分隔的 M 个数字。 答案应该正好包含 N 个值,用空格分隔。首先应该给出 1-s 的数量,第二个 - 2-s 的数量等等。

数据输入:

10 3

1 2 3 2 3 1 1 1 1 3

正确的输出:

5 2 3

我的输出:

7 3 4

您可以查看here

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int arrayLength,range,a;
    cin>>arrayLength>>range;
    int array[20];
    array[20]={0};
    
    for(int i=0; i<arrayLength; i++)
    {   
        cin>>a;
        ++array[a-1];
    }
    for(a=0; a<range; a++)
    {   
    cout<<array[a]<<" ";
    }
    return 0;
}

没有任何错误消息或警告。另外,如果您对改进代码有任何建议,那就太好了。

【问题讨论】:

    标签: c++ arrays counter


    【解决方案1】:
    int array[20];
    array[20]={0};
    

    是错误的,因为它使数组未初始化并尝试初始化第 21 个元素(顺便说一句,这是未定义的行为,因为您的数组只有 20 个元素,请记住索引从 0 开始)。使用

    int array[20] = {0}; // this will initialize all elements to 0
    

    您的代码将按预期工作。有关 C++ 中聚合初始化的更多详细信息,请参阅 here

    【讨论】:

      【解决方案2】:

      array[20]={0}; 将第 21 个元素(不存在)初始化为 0。 所以你必须使用int array[20] = {0};,它将所有20个元素初始化为零。

      同样从您的代码中,您没有将元素存储到数组中。您只是在读取输入时增加相应的计数。如果是这样,将数组初始化为最大限制需要什么。只需根据需要声明数组即可。在你的情况下,

      int array[range] = {0};

      它将初始化一个由三个(范围=3)元素组成的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        相关资源
        最近更新 更多