标签:
在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 }
程序运行效果图:
图片太大,分为两次截取
标签:
原文地址:http://www.cnblogs.com/iwillow/p/5003614.html