C语言打印直方图(垂直方向)
本人学生,在学习C时用的是学校编的书,效果很差,后来买了《The C Programming Language》,重新学习C语言,感觉很好。做里面的习题,打印单词长度的直方图,参考网上大神的代码,并加以修改,达到了自己满意的效果,代码方面我自己加了许多注释,希望对大家有用。
程序功能说明
输入:输入单词,以空格、回车、制表符为间隔,EOF为结束输入。(window 下CTRL+Z ,Linux 下CTRL +D)
输出:打印输入的单词数量、最大单词长度以及单词长度直方图。
程序功能展示
输入
输出
代码片段
绘制直方图的代码,两个For循环
/*
绘制直方图
备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐
*/
void vertical(int array[],int len)
{
int maxValue = max(array,len);
int j;
int i;
printf(" y/num↑\n"); /* 打印直方图的y轴顶部 , y前面2个SP */
for(i = maxValue + 1; i > 0; i--)
{
printf("%8d|_ ", i); /* 打印直方图的y轴 */
for(j = 0; j < len; j++)
{
if(array[j] == i) /* 打印直方图的顶部 ,1个SP,3个_,4个SP */
{
printf(" ___ ");
}
else if(array[j] >= i) /* 打印直方图的侧部 ,2个|,3个SP,3个SP */
{
printf("| | ");
}
else if(array[j] == i-1) /* 打印该数据,位于直方图顶部的上方 */
{
printf(" (%d) ",array[j]);
}
else
{
printf(" "); /* 无数据 8个SP */
}
}
printf("\n");
}
/*
* 纯属美观需要,并打印 X轴
*
*/
printf(" 0");
for(i = 0; i < len + 1; i++)
{
printf("|___|___");
}
printf("|___→\n");
for(i = 0; i< (2 * len); i++)
{
printf("\t");
}
printf("\tx/word\n\t ");
for(i = 0; i < len; i++)
{
printf(" word%d",i+1); /* 3个SP */
}
printf("\n\n");
}
最终代码
#include<stdio.h>
#include<string.h>
/* word 数量*/
#define NUM 100
/*
数组中的最大数
*/
int max(int* array,int len)
{
int maxValue = 0;
int i=0;
for(i = 0; i < len; i++)
{
if(array[i] > maxValue)
{
maxValue = array[i];
}
}
return maxValue;
}
/*
绘制直方图
备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐
*/
void vertical(int array[],int len)
{
int maxValue = max(array,len);
int j;
int i;
printf(" y/num↑\n"); /* 打印直方图的y轴顶部 , y前面2个SP */
for(i = maxValue + 1; i > 0; i--)
{
printf("%8d|_ ", i); /* 打印直方图的y轴 */
for(j = 0; j < len; j++)
{
if(array[j] == i) /* 打印直方图的顶部 ,1个SP,3个_,4个SP */
{
printf(" ___ ");
}
else if(array[j] >= i) /* 打印直方图的侧部 ,2个|,3个SP,3个SP */
{
printf("| | ");
}
else if(array[j] == i-1) /* 打印该数据,位于直方图顶部的上方 */
{
printf(" (%d) ",array[j]);
}
else
{
printf(" "); /* 无数据 8个SP */
}
}
printf("\n");
}
/*
* 纯属美观需要,并打印 X轴
*
*/
printf(" 0");
for(i = 0; i < len + 1; i++)
{
printf("|___|___");
}
printf("|___→\n");
for(i = 0; i< (2 * len); i++)
{
printf("\t");
}
printf("\tx/word\n\t ");
for(i = 0; i < len; i++)
{
printf(" word%d",i+1); /* 3个SP */
}
printf("\n\n");
}
int main()
{
int words[NUM];
char temp[NUM][100];
int i;
int num;
num = 0;
printf("请输入单词:");
while(1) /* 循环输入单词,直到EOF结束 */
{
if (scanf("%s", temp[num])==EOF)
{
break;
}
else
{
num++;
}
}
printf("\n共输入了%d个单词:", num);
for(i = 0; i < num; i++)
{
printf("\n\t word%2d is %s\n", i+1, temp[i]);
}
for(i = 0; i < num; i++)
{
words[i] = strlen(temp[i]);
}
int maxValue = max(words,num);
printf("maxValue =%d \n", maxValue);
vertical(words,num);
return 0;
}