C++的频率数组

问题描述

#include <iostream>

using namespace std;
int main()
{
    int arr,i=0,frequancy,y,X,l;
    
    int V[arr];
    cout<<"Enter the size of an array: ";
    cin>>arr;
    
    cout<<"Enter all "<<arr<<" elements in array: ";
    for(i=0;i<=arr-1;i++)
    cin>>V[i];
    
    int a[arr]={0};
    
    cout<<"Frequency of all "<<arr<<" elements in array:"<<endl;
        
    for(i=0;i<arr;i++)
    {
        int count=0;
        if (a[i]!=1)
        {
            for (int j=0;j<arr;j++)
            {
                if(V[i]==V[j])
                {
                    count++;
                    a[j]=1;
                }
            }
            if (count>1||count==1)
            {
                cout<<V[i]<<" occurs "<<count<<" times "<<endl;
            }
        }
    }
return 0;
}

//this is the answer
Enter the size of an array: 9
Enter all 9 elements in array: 1
1
2
3
1
5
3
12
1
Frequency of all 9 elements in array:
1 occurs 4 times
2 occurs 1 times
3 occurs 2 times
5 occurs 1 times
12 occurs 1 times

所以有几个问题我不太明白,我需要有人解释一下这是怎么回事。

  1. 我不明白为什么我们必须将 this(int a[arr]={0}) 初始化为 0,我问过我的教授,他说必须这样。这没有回答我的问题:'C.

  2. 我的代码底部有问题,我有点明白,但如果有人可以帮助我,那将很有帮助,谢谢!!!!

解决方法

int arr/*...*/;
int V[arr];
cin>>V[i];

此程序严重损坏。

问题 1:数组变量的大小在 C++ 中必须是编译时常量。 arr 不是编译时常量值。违反此规则会使程序格式错误,这意味着不需要编译器来编译它。你应该避免这种情况。

解决方案:如果您需要一个在运行时确定大小的数组,那么您应该动态分配该数组。实现这一目标的最简单方法是使用标准库中的 std::vector 模板。


问题 2:读取不确定值的程序的行为未定义。未定义的行为意味着对程序的行为没有任何保证。这是非常糟糕的,应该避免。

arr 在您使用时具有不确定的值。程序的行为是未定义的。我再说一遍:这很糟糕。

C++ 不是“数据流”语言。您不能简单地使用变量并在使用后对其进行初始化。程序不会自动停止,创建线程并等待后面的初始化进一步进行。

解决方案:使用前初始化。


我不明白为什么我们必须将 this(int a[arr]={0}) 初始化为 0

稍后在程序中,读取该数组的值 (a[i]!=1)。如果在使用之前不初始化这些值,则程序的行为是未定义的。见上一段。

据推测,为了避免这种未定义的行为,数组的元素被初始化为零。

请注意,将数组的第一个元素显式初始化为零是多余的,而将其余元素初始化为值是多余的,因为它们实现了相同的目的。因此,实现相同目标的更简单方法是通过不为任何元素提供初始化器来对所有元素进行值初始化:

constexpr int arr = 42;
int a[arr] {};

代码底部有问题

解决这个问题的第一步是弄清楚为什么你认为你有问题,以及它可能是什么类型的问题。