我编写了一个程序,它从用户那里获取随机值的数量,其范围为1-100
。例如,如果用户输入" 5
",则输出为5
个0
到100
。
到目前为止一直很好,现在我想用功能开关/箱子对每个年龄进行排序,并且每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();
}
答案 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();
}