在C程序設計語言(第2版▪新版)一書中有一道打印單詞數目水平或者垂直直方圖的習題,參見該第17頁。現在假如我們已經得到了單詞的計數數組。
打印水平方向的直方圖比較簡單, 只需要兩重循環即可,外層循環執行的次數是數組長度。內層循環為該數組每個元素的大小。方法如下:
1 /*
2 * 打印水平方向直方圖
3 *
4 */
5 void horizontal(int array[],int len){
6
7 printf("\t↑\n"); 8 printf("\t|\n"); 9 printf("\t|\n"); 10 int i; 11 for(i=0;i<10;i++){ 12 int k=0; 13 printf("\t|"); 14 for(;k<array[i];k++){ 15 printf("*"); 16 } 17 printf("(%d)",array[i]); 18 printf("\n\t|\n"); 19 } 20 printf("\t--------------------------------------------------->\n"); 21 printf("\t-----------------------------------水平方向直方圖-------------------------------------\n\n"); 22 }
打印垂直方向的直方圖相對麻煩一些,但也只需要兩層循環,首先我們要找出該數組中的最大元素,因為該數據決定了垂直統計直方圖的最大高度,也就是外層循環的次數(此處我們讓最大數據加一,因為我們想在脂肪圖上方顯示數據),內層循環的次數是元素的個數,與水平直方圖的循環方式相反。內層循環每次拿數組中的與外層的數據對比,如果相等,打印符號同時當前數據自動減一,不然下次會打印不停地打印符號,否則打印空,找出數組中的最大數據相對比較簡單。方法如下:
1 /*
2 * 打印垂直方向直方圖
3 *
4 */
5 void vertical(int array[],int len){
6 int maxValue=max(array,len); 7 int j; 8 int i; 9 printf("\t↑\n"); 10 for(i=maxValue+1;i>0;i--){ 11 printf("\t| "); 12 for(j=0;j<10;j++){ 13 if(array[j]==i){ 14 printf("****\t"); 15 array[j]--; 16 }else if(array[j]==i-1){ 17 //顯示數目 18 printf("(%d)\t",array[j]); 19 }else{ 20 printf(" \t"); 21 } 22 } 23 printf("\n"); 24 } 25 printf("\t--------------------------------------------------------------------------------------->\n"); 26 printf("\t-----------------------------------垂直方向直方圖-------------------------------------\n\n"); 27 }
整個程序如下
1 #include<stdio.h>
2 /*
3 * 最大數
4 *
5 */
6 int max(int* array,int len){
7 int maxValue= 0; 8 int i=0; 9 for(i=0;i<len;i++){ 10 if(array[i]>maxValue){ 11 maxValue=array[i]; 12 } 13 } 14 return maxValue; 15 } 16 /* 17 * 打印水平方向直方圖 18 * 19 */ 20 void horizontal(int array[],int len){ 21 22 printf("\t↑\n"); 23 printf("\t|\n"); 24 printf("\t|\n"); 25 int i; 26 for(i=0;i<10;i++){ 27 int k=0; 28 printf("\t|"); 29 for(;k<array[i];k++){ 30 printf("*"); 31 } 32 printf("(%d)",array[i]); 33 printf("\n\t|\n"); 34 } 35 printf("\t--------------------------------------------------->\n"); 36 printf("\t-----------------------------------水平方向直方圖-------------------------------------\n\n"); 37 } 38 39 /* 40 * 打印垂直方向直方圖 41 * 42 */ 43 void vertical(int array[],int len){ 44 int maxValue=max(array,len); 45 int j; 46 int i; 47 printf("\t↑\n"); 48 for(i=maxValue+1;i>0;i--){ 49 printf("\t| "); 50 for(j=0;j<10;j++){ 51 if(array[j]==i){ 52 printf("****\t"); 53 array[j]--; 54 }else if(array[j]==i-1){ 55 //顯示數目 56 printf("(%d)\t",array[j]); 57 }else{ 58 printf(" \t"); 59 } 60 } 61 printf("\n"); 62 } 63 printf("\t--------------------------------------------------------------------------------------->\n"); 64 printf("\t-----------------------------------垂直方向直方圖-------------------------------------\n\n"); 65 } 66 main(){ 67 int words[10]; 68 int temp[10]; 69 int i=0; 70 for(;i<10;i++){ 71 words[i]=(i-4)*(i-4)+1; 72 } 73 int maxValue=max(words,10); 74 printf("maxValue=%d\n",maxValue); 75 horizontal(words,10); 76 vertical(words,10); 77 }
程序運行效果圖:


圖片太大,分為兩次截取
