C语言打印水平直方图或者垂直直方图

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 }

程序运行效果图:

图片太大,分为两次截取

时间: 2024-07-30 19:29:24

C语言打印水平直方图或者垂直直方图的相关文章

2800:垂直直方图

描述 输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数.注意:只用输出字符的出现次数,不用输出空白字符,数字或者标点符号的输出次数. 输入 输入包括4行由大写字母组成的文本,每行上字符的数目不超过80个. 输出 输出包括若干行.其中最后一行给出26个大写英文字母,这些字母之间用空格隔开.前面的几行包括空格和星号,每个字母出现几次,就在这个字母的上方输出一个星号.注意:输出的第一行不能是空行. 样例输入 THE QUICK BROWN FOX JUMPED OVER T

Openjudge 1.3-04 垂直直方图

04:垂直直方图 查看 总时间限制: 1000ms 内存限制: 65536kB 描述 输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数.注意:只用输出字符的出现次数,不用输出空白字符,数字或者标点符号的输出次数. 输入 输入包括4行由大写字母组成的文本,每行上字符的数目不超过80个. 输出 输出包括若干行.其中最后一行给出26个大写英文字母,这些字母之间用一个空格隔开.前面的几行包括空格和星号,每个字母出现几次,就在这个字母的上方输出一个星号.注意:输出的第一行不能是

mysql的水平拆分和垂直拆分

转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢.如果将这一张表分成100份,每张表有1亿条,就小了很多,比如qq0,qq1,qq1...qq99表. 用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名.比如123456789用户,取模的89,那么

关于数据库的水平切分和垂直切分的一些概念(转)

垂直拆分 垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的.当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求.其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝

C语言打印记事本内搜索字符串所在行信息

本程序采用C语言编写,使用方法: 1.双击“甲骨文字符串查询作品.exe”运行程序; 2.运行前请确保此可执行程序目录下有1.txt文件. 3.根据提示输入一个字符串,程序将显示存在所搜索字符串的所有行! 程序如果问题,请联系[email protected]! 2014-7-31日安阳师范学院机房完成. 程序截图: 源码如下: #include <stdio.h> #include<string.h> #include<stdlib.h> #include<co

&#8203;用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。

用c语言打印自定义的乘法口诀表.例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表. #include <stdio.h> int main () { int n; int i, j; printf ("请输入要打印多大的乘法口诀表"); scanf ("%d",&n); for (j=1; j<=n; j++) { for(i=1; i<=j; i++) { printf ("%d*%d=%2d &quo

CSS如何设置背景图片水平重复和垂直重复

CSS如何设置背景图片水平重复和垂直重复: 设置背景图片的水平平铺或者垂直平铺非常的简单,使用两端代码就可以了,代码如下: background:url("photo.gif") repeat-y; 以上代码可以让背景图片在垂直方向上平铺. background:url("photo.gif") repeat-x; 以上代码可以让背景图片在水平方向上平铺. 非常的简单,具体可以参阅以下两篇文章: 1.background-repeat属性可以参阅CSS的backgr

数据库的水平扩展与垂直扩展

数据库水平扩展与垂直扩展 在互联网应用中,数据库经常是我们存储和访问数据的常用介质.随着负载的增大,对数据库读写性能的要求往往成为很大的挑战.在这种情况下我们可以考虑数据库相关的replication机制提高读写的性能.由于一般采用一写多读的replication机制(写master同步到多个slaves),导致这样的机制往往会有缺陷.首先它依赖于读写的比例,如果写的操作过多,导致master往往成为性能的瓶颈所在,从而使得slaves的数据同步延迟也变大,进而大大消耗CPU的资源,并且导致数据

数据库的水平分割和垂直分割

在数据库操作中,我们常常会听说这两个词语:水平分割和垂直分割.那么到底什么是数据库的水平分割,什么是数据库的垂直分割呢?本文我们就来介绍一下这部分内容. 1.水平分割: 按记录进分分割,不同的记录可以分开保存,每个子表的列数相同. 水平分割通常在下面的情况下使用: A 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度. B 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用. C需要把数据