【问题标题】:Find frequency of occurrence, minmax without storing input在不存储输入的情况下查找出现频率,最小值最大值
【发布时间】:2020-01-08 03:01:16
【问题描述】:

任务是读取从 0 到 9 范围内的 N 个数字,并找到输入数字的出现频率。除此之外,我需要找到最小值和最大值以及最常见的数字。至少需要使用 3 个函数(不允许存储输入))

到目前为止,我已完成查找出现次数以及输入的最小值和最大值。 我在查找最常见的数字和创建函数时遇到问题。我为每个数字创建了单独的变量来查找频率。 另外,这段代码似乎不是很好,如果您有更好的解决方案,请分享。

{
    int n=0;
    int max=0,min=9;
    int freq0=0,freq1=0,freq2=0,freq3=0,freq4=0,freq5=0,freq6=0,freq7=0,freq8=0,freq9=0;

    for (;;)
    {
        printf ("Please enter the number in range from 0 to 9 (to break enter: 11): ");
        scanf ("%d",&n);
        if (n==11)//to exit the loop 11 is setteled as a stop value
            break;
        if (n==0)
            freq0++;
        if (n==1)
            freq1++;
        if (n==2)
            freq2++;
        if (n==3)
            freq3++;
        if (n==4)
            freq4++;
        if (n==5)
            freq5++;
        if (n==6)
            freq6++;
        if (n==7)
            freq7++;
        if (n==8)
            freq8++;
        if (n==9)
            freq9++;
        if (n>max)
            max=n;
        if (n<min)
            min=n;
    }

    printf ("Number 0 occured %d times\n",freq0);
    printf ("Number 1 occured %d times\n",freq1);
    printf ("Number 2 occured %d times\n",freq2);
    printf ("Number 3 occured %d times\n",freq3);
    printf ("Number 4 occured %d times\n",freq4);
    printf ("Number 5 occured %d times\n",freq5);
    printf ("Number 6 occured %d times\n",freq6);
    printf ("Number 7 occured %d times\n",freq7);
    printf ("Number 8 occured %d times\n",freq8);
    printf ("Number 9 occured %d times\n",freq9);
    printf ("highest %d \n", max);
    printf ("smallest %d\n",min);
    return 0;
}

【问题讨论】:

  • 这里需要用到数组。这会将您的程序的行数除以大约 10。想象一下,如果您有 0 到 100 的数字而不是 0 到 9 的数字,您的程序会是什么样子。
  • ...什么是“最常见的数字”?显示一个例子。 Edit你的问题。
  • 总是,总是,总是检查scanf()的返回值,看看它是否成功。如果有人输入了a 而不是数字,或者只是输入了^D 来触发文件结束怎么办?
  • 您是否应该在开头输入N 的值?它还说 using 3 个功能。到目前为止,您已经使用了 3 个函数:main、scanf、printf。
  • ... 以及如果用户输入会发生什么,例如12?

标签: c integer max min


【解决方案1】:
#include <stdio.h>
#include <limits.h>

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

int main(void) {
    int n=0;
    int value_max=INT_MIN;
    int value_min=INT_MAX;
    int freq[10] = {0};

    for(;;)
    {
        printf ("Please enter the number in range from 0 to 9 (to break enter: 11): \n");
        scanf ("%d",&n);
        if (n==11) break;
        freq[n]++;
        value_max = MAX(n, value_max);
        value_min = MIN(n, value_min);
    }

    for(n=0; n<10; ++n)
    {
        if (freq[n] == 0) continue;
        printf("Frequency of %d : %d\n", n, freq[n]);
    }
    printf("Maximum value : %d\n", value_max);
    printf("Minimum value : %d\n", value_min);

    return 0;
}

测试输入

4 5 6 1 2 3 4 5 6 11

输出

Frequency of 1 : 1
Frequency of 2 : 1
Frequency of 3 : 1
Frequency of 4 : 2
Frequency of 5 : 2
Frequency of 6 : 2
Maximum value : 6
Minimum value : 1

【讨论】:

  • 非常感谢!您能否解释一下这部分#define MIN(a,b) (((a)&lt;(b))?(a):(b)) #define MAX(a,b) (((a)&gt;(b))?(a):(b)) 或提供任何我可以了解的链接。
  • int value_max=INT_MIN; int value_min=INT_MAX; 将其初始化为 9 和 0 或您的方式有什么区别?我都试过了,得到了相同的答案,真的很好奇
【解决方案2】:

试试这个。

#include <stdio.h>

int min(int a, int b) { return (a < b) ? a : b; }
int max(int a, int b) { return (a > b) ? a : b; }
int valid(int n) { return (n >= 0 && n <= 9) ? 1 : 0; }

int main() {
    int i, n, min_number = 10, max_number = -1, max_frequency = 0;
    int freq[10] = {0,0,0,0,0,0,0,0,0,0};

    // Read all numbers from input (read until end of file or press Ctrl+Z in console)
    while (scanf("%d", &n) > 0) {
        if (valid(n) == 0) {
            printf("Number %d is invalid and will be ignored\n", n);
            continue;
        }
        freq[n] += 1;
        min_number = min(min_number, n);
        max_number = max(max_number, n);
        max_frequency = max(max_frequency, freq[n]);
    }

    printf("Occurences of digits:\n");
    for (i = 0; i < 10; i++)
        printf("Number %d occured %d times\n", i, freq[i]);
    printf("\n\nMin value: %d\n", min);
    printf("Max value: %d\n", max);

    // Print numbers with greatest frequency
    printf("\n\nMost common numbers: ");
    for (i = 0; i < 10; i++) {
        if (freq[i] == max_frequency)
            printf("%d\n", i);
    }
    return 0;
}

【讨论】:

    【解决方案3】:
    #include <stdio.h>
    
    void test(int N){
        int arr[] = {0,0,0,0,0,0,0,0,0,0};
        for (int i =0; i < N; i++){ 
            int num;
            printf ("Please enter the number in range from 0 to 9 (to break enter: 11): ");
            scanf ("%d",&num);
            if (num==11) break;
            if (num>9 || num<0){
                printf("Number is not in range 0..9! Try another number..\n");
                i--;
                continue;
            }
            arr[num]++;
        }
    
        int max = 0, min = 9, max_occurrences = 0, min_occurrences = N;
    
        for (int i = 0; i < 10; i++){
          printf ("Number %d occured %d times\n", i, arr[i]);
            max_occurrences = arr[max_occurrences] < arr[i] && arr[i]!=0? i : max_occurrences;
            min_occurrences = arr[min_occurrences] > arr[i] && arr[i]!=0? i : min_occurrences;
            max = max < i && arr[i]!=0? i : max;
            min = min > i && arr[i]!=0? i : min;
    
    
        }
        printf("max occurrences : %d \nmin occurrences : %d \nmax common : %d \nmin common : %d \n ", max_occurrences, min_occurrences, max, min);
    }
    
    int main()
    {
      test(6);
    
      return 0;
    }
    

    【讨论】:

    • 我只怀疑max = 0, min = 9, max_occurrences = 0, min_occurrences = 9; - 如果N 是100 并且我输入数字1 一百次怎么办?实际上在您的示例中N 是10 - 如果我输入相同的数字10 次会发生什么?我认为您可以使用N + 1 进行初始化。请注意其他人需要在此处处理scanf - 此代码不会在输入的数字11 处中断,不检查该值是否在0...9 范围内并且不检查scanf 的返回值。好吧,你可以初始化为 N。我想min = N 也是,对吧?或max = N,我不确定。
    • @Kamil Cuk,是的,你说得对)它要大得多
    • @Kamil Cuk,感谢您的建议,非常有帮助!我现在试试这个
    • 您可以(应该?)显示printf ("Number %d occured %d times\n", i, arr[i]);并计算同一循环中的最小/最大/最小出现/最大出现。
    • @Cid ,当然,我可以,而且我必须这样做,很抱歉错过了这个!
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多