https://www.cnblogs.com/iwillow/p/5003614.html
在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 }
程序运行效果图: