检查年龄重复的次数

时间:2015-12-27 12:52:53

标签: c

我编写了一个程序,它从用户那里获取随机值的数量,其范围为1-100。例如,如果用户输入" 5",则输出为50100

到目前为止一直很好,现在我想用功能开关/箱子对每个年龄进行排序,并且每10年排序一次。每场比赛都会得到*'。 例如,如果我有8个年龄, 55, 35, 36 ,22, 25, 40, 60, 90,那么:

输出将是:

  

21-30 **

     

31-40 ***

     

51-60 **

     

81-90 *

问题是,我不确定如何正确编写开关功能。我知道我可以用if来轻松解决它,但这里的重点是用switch / case函数训练我的理解。任何帮助将不胜感激。

代码更新:(没有开关,因为开关不适合此问题。)

    #include <conio.h>
#include <stdio.h>
#include <stdlib.h>

#define N 10

int main()
{
    int num = 0, i, arr1[N] = { 0 }, temp = 0,j;
    srand(time(NULL));
    printf("Please emter the number of values: ");
    scanf("%d", &num);
    for (i = 0; i < num; i++)
    {
        temp = rand() % 100 + 1;

        if (temp == 100)
            arr1[9]++;
        else if (temp > 0 && temp < 10)
            arr1[0]++;
        else
        arr1[temp / 10]++;
        printf("%d ", temp);
    }
    for (i = 0; i < N; i++)
    {
        if (arr1[i] == 0) {
            printf("\n%d-%d ", (i * 10 + 1), (i + 1) * 10);
        }

        int add = 0;
        if (i > 0) {
            add = i;
        }
        if (arr1[i] != 0)
        printf("\n%d-%d ", (i * 10 + 1), (i + 1) * 10);
        for(j = 0; j < arr1[i]; j++)
            printf("*");
    }



    getch();
}

6 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作来计算数字可能范围的出现次数:

int count[10] = {0}; // Remember to set the values of each element of this array to 0

// ...a few lines later...

int val = 0;
for (int i = 0; i < num; i++) {
    val = arr[i];
    if (val == 10 || val == 20 || val == 30 ||
        val == 40 || val == 50 || val == 60 ||
        val == 70 || val == 80 || val == 90 ||
        val == 100) {
        val--;
    }

    val = val / 10;

    count[val]++;
}

要打印*,您可以执行以下操作:

for (int i = 0; i < 10; i++) {
    if (count[i] == 0) {
        continue;
    }

    int add = 0;
    if (i > 0) {
        add = i;
    }
    printf("%d-%d ", ((i + 1) * 10) + add, (i + 1) * 10);

    for (int j = 0; j < count[i]; j++) {
        printf("*");
    }

    printf("\n");
}

注意:上面的代码假设您的count[]数组包含10个元素。

答案 1 :(得分:1)

您不需要switch

创建一个int-array,其中包含10个初始化为0的项目。在循环中执行count_arr[number % 10]++;

之类的操作

请务必先检查范围(number)。

此外,您不需要为您的阵列使用malloc()。但如果你这样做,你也需要free()

答案 2 :(得分:1)

您不需要switch - 数组也可以。

将整数除法/除以10,将1..100范围内的数字放入范围0..10

for (int i = 0 ; i != num ; i++) {
    countByDecade[arr[i] / 10]++;
}

答案 3 :(得分:1)

我不认为switch是解决此问题的合适工具。每个case都使用一个常量作为输入来评估switch中的语句。因此,您需要为每个选项设计常量。这基本上是你面临的同样问题,可以用ifs或其他解决,但可能不会切换。

答案 4 :(得分:0)

为什么需要这项检查?

if (temp == 100)
else if (temp > 0 && temp < 10)

问题是你当前的代码会打印

  

20-29 **
  30-39 **
  40-49 *
  50-59 *
  60-69 *
  90-99 *

所以你需要的是:

for (i = 0; i < num; i++) {
    temp = rand() % 100 + 1;
    arr1[(temp + 1) / 10]++;
    printf("\nRANDOM = %d", temp);
}

int j;
for (i = 0; i < N; i++) {
    if (arr[i] > 0) {
         printf("\n%d-%d: ", i*10 + 1, (i+1)*10);
         for (j = 0; j < arr[i]; j++) putchar('*');
    }
}

答案 5 :(得分:-1)

您可以尝试以下代码:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int num = 0, i, *arr;
    srand(time(NULL));
    printf("Please emter the number of values: ");
    scanf("%d", &num);
    arr = (int*)(malloc(num*sizeof(int)));
    if (arr == NULL)
        printf("Not enough memory\n");
    for (i = 0; i < num; i++,arr++)
    {
        *arr = rand() % 100 + 1;
        printf("arr[%d] = %d\n", i, *arr);

        switch((*arr -1) / 10)
        case 0: 
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
    }

    getch();
}