编辑代码

#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;
}