#include <stdio.h>
/*录入成绩 储存在数组tensu[NUMBER]中,NUMBER限定了数组的元素个数*/
#define NUMBER 20
int main(void)
{
int tensu[NUMBER];
int fb[11] = {0};
int i, num;
int max = 0;
int j, k, l, m;
/*实际录入的数组数为num,num不得大于NUMBER*/
printf("请输入本次录入数量(0~20):");
do
{
scanf("%d", &num);
if (num > NUMBER || num < 1)
printf("\a 请输入1~%d之间的数:", NUMBER);
} while (num > NUMBER || num < 1);
/*录入成绩,依次储存到数组tensu[NUMBER]内的元素tensu[0]~tensu[num]*/
for (i = 0; i < num; i++)
{
printf("学生%d:", i+1);
scanf("%d", &tensu[i]);
/*如本次输入9,则经过计算后变为fb[0],通过++使fb[0]的计数增加1*/
fb[tensu[i] / 10 ]++;
/*每次计数增加后,比较出fb[11]内最大的元素,将其值赋给max*/
max = (fb[tensu[i] / 10 ] > max) ? fb[tensu[i] / 10 ] : max;
}
/*验证
int a;
printf("成绩分布:\n");
printf("max = %d\n", max);
for (a = 0; a < 11; a++)
{
printf("%d", fb[a]);
}
*/
/*显示分布图:
思路:
首先确定打印多少行? a:根据数组fb[11]内最大的元素的值max
确定 * 出现的位置? a:根据fb[11]内最大的元素的名称
如:max = fb[1] == 3时,打印3行;在每行的第 1+1(因为包含0) 列的位置 打印 *
其他fb[11]的元素,* 如何显示?
如:fb[0] = 1, fb[1] = 3, fb[2] = 1 时
首先确定打印max行:for j = max;j > 0; j--
每行打印11列:for k = 0; k < 11; k++
第1行 j=3 第1列 k=0 如何显示? 判断 fb[k]的值 是否 >= j的值 满足则打印*
因为 fb[0]=1, j=3 所以 不打印* 因为fb[1]=3 所以 打印*
第2行 j=2 因为fb[0]=1 所以不打印 因为fb[1]=3 所以 打印*
*/
printf("\n成绩分布图:\n");
for(j = max; j > 0; j--)
{
putchar(' ');
for(k = 0; k < 11; k++)
{
if(fb[k] >= j)
printf("* ");
else
printf(" ");
}
putchar('\n');
}
putchar('-');
for(l = 0; l < 11; l++)
{
printf("---");
}
putchar('-');
putchar('\n');
putchar(' ');
for(m = 0; m < 11; m++)
{
printf("%-3d", m * 10);
}
return 0;
}