/*
练习 1 - 13 编写一个程序,打印输入中单词长度的水平直方图 和 垂直直方图
*/
#include <stdio.h>
#define IN 1
#define OUT 0
#define NUM 1024
//求数组元素最值
int getArrarMax(int *arr,int arrLength)
{
int i,j,temp;
for(i = 0;i < arrLength; ++i)
for (j = i + 1; j < arrLength; ++j)
if(arr[i] < arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr[0];
}
//利用双层循环打印水平直方图
void horizontal(int *arr,int arrLength)
{
int i,k;
printf("\t*\n\t|\n");
for(i = 0; i < arrLength;i++)
{
printf("\t|");
for(k = 0; k < arr[i]; k++)
printf("|");
printf("<%d>\n\t|\n",arr[i]);
}
printf("\t*------------------------水平直方图------------------------*\n");
}
//打印垂直直方图
void vertical(int *arr,int arrLength)
{
int maxValue=getArrarMax(arr, arrLength);
int i,j;
printf("\t*\n");
for(i = maxValue+1; i > 0;i--)
{
printf("\t|");
for(j = 0; j < arrLength; j++)
{
if(arr[j] == i)
{
printf("___\t");
arr[j]--;
}
else if(arr[j] == i - 1)
{ //显示数目
printf("(%d)\t",arr[j]);
}
else
{
printf("\t");
}
}
printf("\n");
}
printf("\t*------------------------垂直直方图------------------------*\n");
}
int main(int argc, char* argv[])
{
int c, nw, nc, state,i;
int arr[NUM];
c = nw = nc = i = 0;
state = OUT;
memset(arr,0,NUM);
//求出数组的元素个数以及单词数
while((c = getchar()) != EOF)
{
++nc;
if(c == ' ' || c == '\n' || c == '\t')
{
nc -= 1;
state = OUT;
arr[i] = nc - arr[i];//对数组填充值
++i;
}
else if(state == OUT)
{
state = IN;
++nw;//计算单词数
}
}//对数组的每个元素 重新赋值每个单词的单词数
for(i = nw - 1;i >0; --i)
{
arr[i] -= arr[i-1];
}
horizontal(arr,nw);
vertical(arr,nw);
return 0;
}
输出结果: