在C中查找整数数组中的数字频率

在C中查找整数数组中的数字频率,c,arrays,function,io,frequency,C,Arrays,Function,Io,Frequency,我正在尝试编写一个函数,它将数组的大小和由数字组成的int数组作为输入,并打印每个数字的频率 输入和输出示例: Input: [1,2,2,3,3,3] Output: 1 occurs 1 times. 2 occurs 2 times 3 occurs 3 times. 以下是我的尝试,不是最优雅的: void freq(int size, int numArray[]) { int one=0, two=0, thr=0, fou=0, fiv=0, six=0, sev=0,

我正在尝试编写一个函数,它将数组的大小和由数字组成的int数组作为输入,并打印每个数字的频率

输入和输出示例:

Input: [1,2,2,3,3,3]

Output:
1 occurs 1 times.
2 occurs 2 times
3 occurs 3 times.
以下是我的尝试,不是最优雅的:

void freq(int size, int numArray[]) {
    int one=0, two=0, thr=0, fou=0, fiv=0, six=0, sev=0, eit=0, nin=0;
    int i, j;

    for (i = 0; i < size; i++) {
        for (j = 1; j < size; j++) {
            if (numArray[i] == numArray[j] && numArray[i] == 1) {
                one+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 2) {
                two+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 3) {
                thr+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 4) {
                fou+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 5) {
                fiv+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 6) {
                six+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 7) {
                sev+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 8) {
                eit+=1;
            }
            else if (numArray[i] == numArray[j] && numArray[i] == 9) {
                nin+=1;
            }
        }
    }
    printf("1 occurs %d times.\n", one);
    printf("2 occurs %d times.\n", two);
    printf("3 occurs %d times.\n", thr);
    printf("4 occurs %d times.\n", fou);
    printf("5 occurs %d times.\n", fiv);
    printf("6 occurs %d times.\n", six);
    printf("7 occurs %d times.\n", sev);
    printf("8 occurs %d times.\n", eit);
    printf("9 occurs %d times.\n", nin);
}

你需要内环做什么?您需要的是在每次迭代中查看每个数字一次,以便对其进行计数。这比你想象的要简单。将代码更改为:

void freq(int size, int numArray[]) {
    int one=0, two=0, thr=0, fou=0, fiv=0, six=0, sev=0, eit=0, nin=0;
    int i, j;

    for (i = 0; i < size; i++) {
        if (numArray[i] == 1) 
            one+=1;
        else if (numArray[i] == 2)
            two+=1;
        else if (numArray[i] == 3) 
            thr+=1;      
        else if (numArray[i] == 4) 
            fou+=1;
        else if (numArray[i] == 5) 
            fiv+=1;
        else if (numArray[i] == 6) 
            six+=1;
        else if (numArray[i] == 7) {
            sev+=1;
        else if (numArray[i] == 8) 
            eit+=1; 
        else if (numArray[i] == 9) 
            nin+=1;
}
    printf("1 occurs %d times.\n", one);
    printf("2 occurs %d times.\n", two);
    printf("3 occurs %d times.\n", thr);
    printf("4 occurs %d times.\n", fou);
    printf("5 occurs %d times.\n", fiv);
    printf("6 occurs %d times.\n", six);
    printf("7 occurs %d times.\n", sev);
    printf("8 occurs %d times.\n", eit);
    printf("9 occurs %d times.\n", nin);
}

你需要内环做什么?您需要的是在每次迭代中查看每个数字一次,以便对其进行计数。这比你想象的要简单。将代码更改为:

void freq(int size, int numArray[]) {
    int one=0, two=0, thr=0, fou=0, fiv=0, six=0, sev=0, eit=0, nin=0;
    int i, j;

    for (i = 0; i < size; i++) {
        if (numArray[i] == 1) 
            one+=1;
        else if (numArray[i] == 2)
            two+=1;
        else if (numArray[i] == 3) 
            thr+=1;      
        else if (numArray[i] == 4) 
            fou+=1;
        else if (numArray[i] == 5) 
            fiv+=1;
        else if (numArray[i] == 6) 
            six+=1;
        else if (numArray[i] == 7) {
            sev+=1;
        else if (numArray[i] == 8) 
            eit+=1; 
        else if (numArray[i] == 9) 
            nin+=1;
}
    printf("1 occurs %d times.\n", one);
    printf("2 occurs %d times.\n", two);
    printf("3 occurs %d times.\n", thr);
    printf("4 occurs %d times.\n", fou);
    printf("5 occurs %d times.\n", fiv);
    printf("6 occurs %d times.\n", six);
    printf("7 occurs %d times.\n", sev);
    printf("8 occurs %d times.\n", eit);
    printf("9 occurs %d times.\n", nin);
}

你的逻辑有缺陷。您想要的是在数组上迭代一次并检查每个元素。大概是这样的:

for(int i = 0; i < size; i++){
    if (numArray[i] == NUMBER)
       NUMBER_COUNTER ++;
.
.
.
    void freq(int size, int numArray[]) {
    int freq_arr[size];
    int i;

    for(i = 0; i < size; i++)
        freq_arr[ numArray[i] ] ++;
    for(i = 0; i < size; i++)
        printf("i: %d = %d\n", i, freq_arr[i]);
或者,使用原始代码:

void freq(int size, int numArray[]) {
    int one=0, two=0, thr=0;
    int i;

    for (i = 0; i < size; i++) {
            if (numArray[i] == 1) {
                one+=1;
            }
            else if (numArray[i] == 2) {
                two+=1;
            }
            else if (numArray[i] == 3) {
                thr+=1;
            }
    }
    printf("1 occurs %d times.\n", one);
    printf("2 occurs %d times.\n", two);
    printf("3 occurs %d times.\n", thr);

}
我认为另一个更优雅的解决方案是: 创建一个包含9个元素的新数组,假设您要计算9位数的频率。。。并增加找到的数字的槽。。。大概是这样的:

for(int i = 0; i < size; i++){
    if (numArray[i] == NUMBER)
       NUMBER_COUNTER ++;
.
.
.
    void freq(int size, int numArray[]) {
    int freq_arr[size];
    int i;

    for(i = 0; i < size; i++)
        freq_arr[ numArray[i] ] ++;
    for(i = 0; i < size; i++)
        printf("i: %d = %d\n", i, freq_arr[i]);

你的逻辑有缺陷。您想要的是在数组上迭代一次并检查每个元素。大概是这样的:

for(int i = 0; i < size; i++){
    if (numArray[i] == NUMBER)
       NUMBER_COUNTER ++;
.
.
.
    void freq(int size, int numArray[]) {
    int freq_arr[size];
    int i;

    for(i = 0; i < size; i++)
        freq_arr[ numArray[i] ] ++;
    for(i = 0; i < size; i++)
        printf("i: %d = %d\n", i, freq_arr[i]);
或者,使用原始代码:

void freq(int size, int numArray[]) {
    int one=0, two=0, thr=0;
    int i;

    for (i = 0; i < size; i++) {
            if (numArray[i] == 1) {
                one+=1;
            }
            else if (numArray[i] == 2) {
                two+=1;
            }
            else if (numArray[i] == 3) {
                thr+=1;
            }
    }
    printf("1 occurs %d times.\n", one);
    printf("2 occurs %d times.\n", two);
    printf("3 occurs %d times.\n", thr);

}
我认为另一个更优雅的解决方案是: 创建一个包含9个元素的新数组,假设您要计算9位数的频率。。。并增加找到的数字的槽。。。大概是这样的:

for(int i = 0; i < size; i++){
    if (numArray[i] == NUMBER)
       NUMBER_COUNTER ++;
.
.
.
    void freq(int size, int numArray[]) {
    int freq_arr[size];
    int i;

    for(i = 0; i < size; i++)
        freq_arr[ numArray[i] ] ++;
    for(i = 0; i < size; i++)
        printf("i: %d = %d\n", i, freq_arr[i]);

嵌套循环方法没有任何意义,您只需查看每个数字一次即可对其进行计数。当然,数组保留计数器更有意义:

void freq(int size, const int *numbers)
{
  unsigned int counts[10] = { 0 };
  for(int i = 0; i < size; ++i)
  {
    const int here = numbers[i];
    if(here >= 1 && here <= 9)
      counts[here]++;
  }
  for(int i = 1; i < 10; ++i)
    printf("%d occurs %u times\n", i, counts[i]);
}

嵌套循环方法没有任何意义,您只需查看每个数字一次即可对其进行计数。当然,数组保留计数器更有意义:

void freq(int size, const int *numbers)
{
  unsigned int counts[10] = { 0 };
  for(int i = 0; i < size; ++i)
  {
    const int here = numbers[i];
    if(here >= 1 && here <= 9)
      counts[here]++;
  }
  for(int i = 1; i < 10; ++i)
    printf("%d occurs %u times\n", i, counts[i]);
}

仅使用一个循环keep i loop and remove numArray[i]==numArray[j]这里考虑使用一个数组来保持数字频率,这样freqs[i]就是数字i的频率。你应该在学习c的开始。个人建议:使用调试器,这是一个非常好的学习工具!在找到bug之后。你可以一步一步地运行你的程序,看看变量的演变,这将帮助你理解代码的作用。只要有一个循环,就可以保持i循环并删除numArray[i]==numArray[j]每个地方都可以考虑使用一个数组来保持数字频率,这样freqs[i]就是数字i的频率。你应该开始学习c。个人建议:使用调试器,这是一个非常好的学习工具!在找到bug之后。您可以一步一步地运行程序并查看变量的演变,这将帮助您了解代码的作用正确的输入将损坏堆栈或导致内存访问错误,示例:arr[4]={1,14097,2};频率4,arr;–阿列克西Voytenko@AlexeyVoytenko当然,这可能是需要防范的,我添加了一些代码。谢谢。这个函数应该是数字吗?应该包括0。@AlexeyVoytenko我知道,但它不在原始代码中。别问我为什么不正确的输入将损坏堆栈或导致内存访问错误,示例:arr[4]={1,14097,2};频率4,arr;–阿列克西Voytenko@AlexeyVoytenko当然,这可能是需要防范的,我添加了一些代码。谢谢。这个函数应该是数字吗?应该包括0。@AlexeyVoytenko我知道,但它不在原始代码中。别问我为什么最后一个函数不检查numArray[i]是否是freq_arr的有效索引。输入错误将损坏内存:arr[2]={1,-19};据我所知,OP的输入是有界的,因此不需要输入检查最后一个函数不检查numArray[I]是否是freq_arr的有效索引。输入错误会损坏内存:arr[2]={1,-19};据我所知,OP的输入是有界的,因此不需要输入检查