2013-06-30 68 views
0

我正在做所有K & R练习,并且我终于能够打印水平直方图。它看起来很糟糕,但我会让你判断它。我没有能够垂直打印输入文字长度的直方图。什么方法(使用stdio)可以打印垂直直方图

如何修改我的程序来做到这一点?

问题:编写一个程序,打印输入中的文字 的长度直方图。用水平方向 绘制柱状图很容易;垂直方向更具挑战性。

histogram.c

#include <stdio.h> 
#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 *** 
+0

使用'的printf( “%2D”,I);'在当前程序左对齐你的''秒。 –

+0

@意义事项我不知道,谢谢。 – TheBlueCat

回答

3

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

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"); 
} 

另一种解决方法是水平打印到阵列中,然后按照您想要的方向打印阵列。

+0

+1。我没有想到你的第二点,我会尝试实施挑战! – TheBlueCat

1

让行的数目是等于最高单元条值(或面元值的一些其它合适的函数)。一次打印直方图一行,对于每一列,根据与该列对应的二进制值,决定是否在此行上打印此行中的*

+0

我在我最早的BASIC程序中采用了这种方法。因为能够弄清楚,我对自己感到非常自豪。 :D – 2013-06-30 12:55:48

0
#include <stdio.h> 
#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; 
} 
1
//vertical HISTOGRAM2 
#include<stdio.h> 
#include<stdlib.h> 
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); 
} 

​​