打印直方图--C程序设计语言

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 }
复制代码

  程序运行效果图:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值