【问题标题】:Finding the frequency of an element in an array using a user-defined function in C使用 C 中的用户定义函数查找数组中元素的频率
【发布时间】:2021-12-07 23:43:41
【问题描述】:

我正在编写一个程序,我们需要在其中找到数组中所选数字的频率。数字由用户输入,他/她将选择一个数字来计算其实例。我用这个程序做到了。

#include<stdio.h>
int main()
{
    
    int n, frq=0, chn;
    int num[10];
    int i, j;
    
    printf("Enter quantity of numbers to be inputted: ");
    scanf("%d", &n);
    
    for(i=0; i<n; i++)
    {
        printf("Enter number[%d]: ", i+1);
        scanf("%d", &num[i]);
    }
    printf("(");
    for(j=0; j<n; j++)
    {
        printf("%d, ", num[j]);
    }
    printf(")\n\n");
    
    printf("Enter number to be counted: ");
    scanf("%d", &chn);
    
    for(i=0; i<n; i++)
    {
    if(num[i]==chn)
    {
       frq++;   
    }}
    printf("Instance count: %d", frq);
    return 0;
}

它工作得很好。然后我们的老师要求我们做同样的事情。但是这一次,我们将使用用户定义的函数来计算程序将计算所选数字的实例的部分。这就是我所做的。

#include<stdio.h>

int freq(int n);

int main()
{
    
    int n, frq=0, chn;
    int num[10];
    int i, j;
    
    printf("Enter quantity of numbers to be inputted: ");
    scanf("%d", &n);
    
    for(i=0; i<n; i++)
    {
        printf("Enter number[%d]: ", i+1);
        scanf("%d", &num[i]);
    }
    printf("(");
    for(j=0; j<n; j++)
    {
        printf("%d, ", num[j]);
    }
    printf(")\n\n");
    
    printf("Enter number to be counted: ");
    scanf("%d", &chn);
    
    frq = freq(n); 

    printf("Instance count: %d", frq);
    return 0;
}

int freq(int n)
{
int chn, num[10], i, frq=0;
    
    
    for(i=0; i<n; i++)
    {
    if(num[i]==chn)
    {
       frq++;   
    }}
    return(frq);
}

但是当我运行它时,它并没有带出假定的输出。例如;

input quantity: >>>6
Enter number[1]: >>>1
Enter number[2]: >>>2
Enter number[3]: >>>3
Enter number[4]: >>>3
Enter number[5]: >>>3
Enter number[6]: >>>2
(1, 2, 3, 3, 3, 2, )

Enter number to be counted: >>>3
Instance count: 1

Process Finished.
>>>

它应该打印 3,但它却打印了 1。我不知道我在哪里做错了,我需要你们的帮助。我真的很感谢你放在这里的每一个答案和 cmets,我浏览了每一个答案,这对我有帮助。再次感谢!

ps。我们还不允许在这个程序中使用指针、结构或 idk。以防万一你们中的一些人会建议使用它们哈哈。

【问题讨论】:

  • if(num[i]==chn) 您应该阅读有关函数参数和局部变量的学习资料。您在freq 中使用了一个局部变量num,它与main 中的变量num 无关,并且包含未确定的(随机)内容。
  • 我不禁想知道...您正确地将n 作为参数传递给函数。很好 - 你知道 n 需要从 main 传递给函数。那么是什么让您认为 chn 也不需要传递。并且认为什么样的魔法会在不传递的情况下将数组num带入函数中。
  • 换句话说:int chn, num[10], i, frq=0; --> int i, frq=0; 并将其他变量作为参数传递给函数
  • 通过解决编译器已经为您找到的问题停止浪费您的时间。 What compiler options are recommended for beginners learning C?

标签: arrays c function user-defined-functions frequency


【解决方案1】:

要编写函数找到你需要通过的频率:

  1. 数组
  2. 数组的大小
  3. 号码。

您只需在函数内声明数组,以为它会神奇地拥有您在另一个函数中输入的内容。不,它包含未确定的值并调用 UB

size_t freq(int *array, size_t size, int val)
{
    size_t freq = 0;
    while(size--) freq += *array++ == val;
    return freq;
}

int main(void)
{
    
    int num[] = {1, 2, 3, 3, 3, 2, };

    printf("The %d is present in the array %zu times\n", 3, freq(num, sizeof(num)/sizeof(num[0]), 3));
}

或者取而代之(正如@4386427 发现的那样)“oneliner”

    while(size--) 
    {
        if(*array == val) freq += 1;
        array++;
    }

【讨论】:

  • hmmm... 单线器做 6 种不同的事情。我相信当学生上交时老师会留下深刻的印象。顺便说一句:它不会通过我的工作的代码审查
  • @4386427 为什么?这很简单。我很容易通过我的。
  • 甚至size_t 也无法计算由具有多种副作用的语句引入的错误数量。保持简单是一个很好的设计原则。
  • while(size--)freq+=array[size-1]==val?1:0;
  • @EvilDogPie BTW:谢谢你让我的观点更加有力。您的重写建议现在使代码失败。你能看出为什么吗?这正是原始代码过于复杂时发生的情况。迟早会有同事过来做一个“简单”的重写,这会使事情失败。
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2020-10-26
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多