#include <stdio.h>
#define NUMBER 20 //定义学生人数
int max_of(int arr[], int n) { //用于返回数组最大值
int max = 0;
for (int i = 0; i < n; i++) {
max = max > arr[i] ? max : arr[i];
}
return max;
}
void number_horizon(int arr[], int n) //绘制水平标签的直方图
{
int i, j, index = 0;
int arr2[11] = { 0 }; //arr2数组,用于统计不同分数段的学生人数
for (i = 0; i < n; i++) {
index = arr[i] / 10; //将形参里arr的每项分数,通过整型除法,抹去个位,赋值给index,表示该学生所处的分数段
arr2[index] += 1; //对应在arr2中,通过index索引到对应下标,
}
int height = max_of(arr2, 11); //统计分数段最多的同学人数,用于计算直方图高度
int max = height; //将直方图高度height赋值给max,用于后续动态判定
for (i = 0; i < height; i++) { //外循环,输出的直方图高度层数
for (j = 0; j < 11; j++) { //内循环,输出每行的符号
if (arr2[j] == max) { //如果arr2中对应下标(也即对应分数段)的人数与最大值相等
printf("* "); //则打印图形符号‘*’
arr2[j] -= 1; //同时该分数段人数减一,可意为已计入图形
}
else {
printf(" "); //不符合则打印空格
}
}
max = max_of(arr2, 11); //一层循环结束后,重新计算arr2中最大值
printf("\n"); //换行,进入下一层打印
}
printf("-----------------------------------------\n");
for (i = 0; i < 11; i++) { //打印标签
printf("%d ", i * 10);
}
}
int main()
{
int arr[NUMBER] = { 89,32,42,51,62,100,45,63,43,100,98,92,94,95,89,83,91,78,6,8 };
number_horizon(arr, NUMBER);
return 0;
}
输出结果: