我可以用什么方法(使用stdio)打印垂直直方图

我正在做所有的K&R练习,最后我能够打印水平直方图。 它看起来很糟糕,但我会让你判断它。 我无法在其输入中垂直打印单词长度的直方图。

如何修改我的程序来执行此操作?

问题:如果输入中有单词,则编写程序以打印长度的直方图。 可以很容易地绘制水平条形图的直方图; 垂直方向更具挑战性。

histogram.c

#include  #define MAX 10 #define IN 1 #define OUT 0 int main() { int c, len, state; int nlength[MAX]; c = len = 0; state = 1; for(int i = 0; i < 10; ++i) nlength[i] = 0; while ((c = getchar()) != EOF) { ++len; if (c == ' ' || c == '\n' || c == '\t') { --len; state = OUT; } if(state == OUT) { if(len != 0 && len <= MAX) ++nlength[len]; len = 0; state = IN; } } for (int i = 0; i <= MAX; ++i) { printf("%d ", i); for (int a = 0; a < nlength[i]; ++a) printf("*"); printf("\n"); } return 0; } OUTPUT: ./histogram < histogram.c 0 1 ************************************* 2 ************************* 3 ************** 4 ************ 5 ***** 6 ****** 7 **** 8 ** 9 * 10 *** 

首先,您需要知道直方图的高度,即最大值。 然后你打印每一行,你决定放一个*或一个 根据价值。

 int h_max = 0; for (int a = 0; a < MAX; a++) { if (h_max <= nlength[a]) h_max = nlength[a]; } for (int i = h_max; i >= 0; i--) { for (int a = 0; a < MAX; ++a) { if (nlength[a] > i) { printf("*"); } else { printf(" "); } } printf("\n"); } 

另一种解决方案是水平打印到arrays中并按照您想要的方向打印arrays。

令行数等于最高bin值(或bin值的一些其他合适函数)。 一次打印一行直方图,对于每一列,根据与该列对应的bin值,决定是否在此行的此列中打印*

 //vertical HISTOGRAM2 #include #include int main() { int c,i,j,arr[10],height=0; system("clear"); for(i=0 ; i<10 ; i++) arr[i]=0; while( ( c=getchar() ) != EOF) { if(c >= '0' || c <='9') ++arr[c-'0']; if( arr[c-'0'] > height ) { height = arr[c-'0']; } } printf("\n"); for(j=height ; j>0 ; j--) // row { printf("%2d|",j); for ( i=0 ; i<=9 ; i++) // column { if( j == arr[i] ) { printf(" *|"); arr[i]--; } else printf(" |"); } printf("\n"); } printf(" |"); for ( i=0 ; i<=9 ; i++) printf(" %d|",i); printf("\n ------------DIGITS-------------"); printf("\n"); return(0); } 

计划的输出

 #include  #define MAX 10 #define IN 1 #define OUT 0 int main(void){ int c, len, state; int nlength[MAX]; c = len = 0; state = IN; for(int i = 0; i < MAX; ++i) nlength[i] = 0; while ((c = getchar()) != EOF) { ++len; if (c == ' ' || c == '\n' || c == '\t') { --len; state = OUT; } if(state == OUT) { if(len != 0 && len <= MAX) ++nlength[len-1]; len = 0; state = IN; } } int max = 0; //horizontal for (int i = 0; i < MAX; ++i) { if(max < nlength[i]) max = nlength[i]; printf("%2d ", i+1); for (int a = 0; a < nlength[i]; ++a) printf("*"); printf("\n"); } printf("\n"); //vertical for (int i = max; i > 0; --i){ for (int j = 0; j < MAX; ++j) if(nlength[j]>=i) printf("%c ", '*'); else printf("%c ", ' '); printf("\n"); } for(int i=1;i<=MAX;++i) printf("%-2d", i); return 0; }