-
2021-05-22 08:31:16
这是那本著名的《C语言程序设计》里的数组那部分的一个练习题
基本思路是先统计出每个单词的长度(longth)和每个长度的单词出现的次数(number),然后用用两重循环分别扫描X和Y轴绘制直方图
代码:
#include
#include
#define N 50
struct words
{
int longth;
int number;
};
int main()
{
//statistics
printf("Please input some words:\n");
words w[N];
for(int i=0;i
int flag=0;
char c;
for(int i=0;i
{
while((c = getchar())!= ' ')
{
if(c == '\n') break;
else w[i].longth++;
}
flag = i;
if(c == '\n') break;
}
printf("Count the longth of each word inputted:\n");
printf("No.\tLongth\n");
for(int j=0;j
{
if(w[j].longth != 0) printf("%2d\t%2d\n",j+1,w[j].longth);
}
//统计长度为i的单词有几个
for(int i=1;i
{
for(int j=0;j<=flag;j++)
if(w[j].longth == i) w[i].number++;
else continue;
}
printf("Count the appearance times of each longth word:\n");
printf("Longth\tCount\n");
for(int i=1;i
if(w[i].number!=0)printf("%d\t%d\n",i,w[i].number);
//sort
int s[N];
for(int i=0;i
//for(int i=0;i
//找到横坐标的最大值
for(int j=0;j
for(int k=0;k
if(s[k]
{
int temp=s[k];
s[k]=s[k+1];
s[k+1]=temp;
}
int ss[N];
for(int i=1;i
//for(int i=1;i
//找到纵坐标的最大值
for(int j=1;j
for(int k=1;k
if(ss[k]
{
int temp=ss[k];
ss[k]=ss[k+1];
ss[k+1]=temp;
}
//draw the Histogram
int max_longth = s[0];//最长的长度,即横坐标的最大点
int max_number = ss[1];//最多的个数,即纵坐标的最高点
printf("max_longth=%d\nmax_number=%d\n",max_longth,max_number);
//print
printf("The Histogram :\n");
printf("X: The longth of each input word\n");
printf("Y: The statistics of their appearance\n");
for(int i=max_number;i>0;i--)//打印纵坐标
{
printf("%2d",i);
for(int k=1;k<=max_longth;k++)//开始对横坐标进行扫描
{
if((w[k].longth = k)&&(w[k].number >= i)) printf("%c",219);
else printf(" ");
}
printf("\n");
}
printf(" ");
for(int i=1;i<=max_longth;i++)
printf("%d",i);
printf("\nJob Done!\n");
}
其实一部分调试时所用的语句我没有删掉,或许对读程序有帮助。
下面是我的一个测试的结果图:
更多相关内容 -
绘制直方图
2022-01-19 01:06:35直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。 绘图库:Easy Graphics Engine (EGE) 编程语言:c++ ...直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
绘图库:Easy Graphics Engine (EGE)
编程语言:c++最终效果:
代码:#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <graphics.h> #include <windows.h> #define pi 3.1415926535897 void color(short x)//设置字体颜色的自定义函数 { if((x>=0)&&(x<=15)) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7); } //0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 //6=黄色 7=白色 8=灰色 9=淡蓝色 10=淡绿色 11=淡浅绿色 //12=淡红色 13=淡紫色 14=淡黄色 15=亮白色 double Max(double a,double b) { if(a>b) { return a; } else { return b; } } int main() { int n,i; double ymax,ymin,x[10000],y[10000],fx,r,w,A,B; color(11); printf("请输入数据个数: "); color(12); initgraph(600,600); while(scanf("%d",&n)!=EOF) { if(n==0) { break; } color(11); printf("数组x:\n"); color(12); for(i=0;i<n;i++) { scanf("%lf",&x[i]); } color(11); printf("数组y:\n"); color(12); for(i=0;i<n;i++) { scanf("%lf",&y[i]); } ymax=y[0]; ymin=y[0]; double s=0; for(i=0;i<=n;i++) { s=s+y[i]; if(y[i]>ymax) { ymax=y[i]; } if(y[i]<ymin) { ymin=y[i]; } } printf("数组y的平均值:%lf\n\n",s/n); A=500/(x[n-1]-x[0]+1); B=500/(ymax); initgraph(600,600); setcolor(EGERGB(0,255,255)); setfillcolor(EGERGB(0,255,255)); w=Max(A*(x[1]-x[0])*0.8,1); double dy=30,dx=50,ddx=15; //double r=(x[n]-x[1])/10000; line(ddx,600-dy,600+ddx,600-dy); //line(ddx,-B*(s/n)+600-dy,600+ddx,-B*(s/n)+600-dy); line(ddx,0,ddx,600-dy); for(i=0;i<n;i++) { bar(A*(x[i]-x[0])+dx,600-dy,A*(x[i]-x[0])+dx+w,-B*y[i]+600-dy); } color(11); printf("请输入数据个数: "); color(12); } return 0; }
-
计算机视觉 实验二 图像的直方图(附opencv代码)
2020-08-16 14:46:04实验二 图像的直方图一、实验目的和要求二、实验内容三、实验仪器、设备四、实验原理五、实验步骤六、实验注意事项七、实验结果八、实验总结 一、实验目的和要求 (一)通过实验掌握绘制图像的直方图方法; ...一、实验目的和要求
(一)通过实验掌握绘制图像的直方图方法;
(二)通过实验掌握图像直方图均衡化方法。二、实验内容
(一)使用OpenCV中的calcHist函数计算直方图,计算完成之后,采用OpenCV中的rectangle函数绘制矩形来完成直方图绘制;
(二)在OpenCV中,使用equalizeHist函数实现直方图均衡化的功能。三、实验仪器、设备
计算机一台,已安装 Windows 7 操作系统和 Visual Studio 2015
四、实验原理
(一)直方图的计算在OpenCV中可以使用calcHist函数,而计算完成之后,可以采用 OpenCV中的绘图函数,如绘制矩形的rectangle函数来完成;
(二)很多时候,用相机拍摄的照片的效果往往会不尽人意。这时可以对这些图像进行一些处理,来扩大图像的动态范围。这种情况下最常用到的技术就是直方图均衡化,经过均衡化的图像,其频谱更加舒展,有效地利用了0-255的空间,图像表现力更加出色;在OpenCV 中,直方图均衡化的功能实现由equalizeHist函数完成。五、实验步骤
(一)创建Visual Studio 2015控制台程序;
(二)在Visual Studio 2015中配置OpenCV;
(三)编写代码,使用calcHist函数和rectangle绘制图像直方图;
(四)编写代码,使用equalizeHist函数完成直方图均衡化。六、实验注意事项
(一)完成OpenCV安装之后,VS中配置OpenCV的方法;
(二)calcHist、equalizeHist函数的功能和使用方法。七、实验结果
(一)实验代码
//------------------------------【头文件、命名空间包含部分】--------------------------- // 描述:包含程序所使用的头文件和命名空间 //------------------------------------------------------------------------------------- #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; //-----------------------------------【main( )函数】------------------------------------- // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行 //------------------------------------------------------------------------------------- Mat drawHist(Mat srcImage) { //【2】定义变量 MatND dstHist; // 在cv中用CvHistogram *hist = cvCreateHist int dims = 1; float hranges[] = { 0, 255 }; const float *ranges[] = { hranges }; // 这里需要为const类型 int size = 256; //设定bin数目,必须和灰度级数目相等,这里是0到255,所以size为256 int channels = 0; //【3】计算图像的直方图 //void calcHist(const Mat* images, int nimages, // const int* channels, InputArray mask, // OutputArray hist, int dims, const int* histSize, // const float** ranges, bool uniform = true, bool accumulate = false) //参数1表示需要用来计算直方图的源图像序列,因此可以允许有多张大小一样,数据类型相同的图像被用来统计其直方图特征。 //参数2表示的就是使用多少张图像序列中的图像用于计算直方图。 //参数3的出现主要是考虑到输入的每一张图像有可能是多通道的,比如说RGB图就是3通道的,那么从统计意义上来讲,一张RGB图其实就是3张单通道的图像,而计算直方图时其本质也是针对单张图像进行的。这里虽然我们输入的图像序列images中有很多图片,但是并不是每一张图片的每一个通道都会被用来计算。所以参数3的功能是指定哪些通道的图像被用来计算(后面的解释都假设图像序列中图像是3通道的,那么有的图像可能有多个通道都被用来计算,有的图像可能连一个通道都没有被采用),这时参数3里面保存的是通道的序号,那么图像序列images中的第一张图片的通道序号(假设图像时3通道的)为0, 1, 2;images中第二张图片的图像序列接着上一次的,为3, 4, 5, ;依次类推即可。 //参数4是mask掩膜操作,即指定每张图片的哪些像素被用于计算直方图,这个掩膜矩阵不能够针对特定图像设定特定的掩膜,因此在这里是一视同仁对待的。 //参数5是保存计算的直方图结果的矩阵,有可能是多维矩阵。 //参数6是需要计算的直方图的维数。 //参数7是所需计算直方图的每一维的大小,即每一维bin的个数。 calcHist(&srcImage, 1, &channels, Mat(), dstHist, dims, &size, ranges); // cv 中是cvCalcHist int scale = 1; Mat dstImage(size * scale, size, CV_8U, Scalar(0)); //【4】获取最大值和最小值 double minValue = 0; double maxValue = 0; minMaxLoc(dstHist, &minValue, &maxValue, 0, 0); // 在cv中用的是cvGetMinMaxHistValue //【5】绘制出直方图 //saturate_cast<int>(double v) { return cvRound(v); } int hpt = saturate_cast<int>(0.9 * size);//防止溢出,hpt=230 for (int i = 0; i < 256; i++) { float binValue = dstHist.at<float>(i); // 注意hist中是float类型 而在OpenCV1.0版中用cvQueryHistValue_1D int realValue = saturate_cast<int>(binValue * hpt / maxValue); rectangle(dstImage, Point(i*scale, size - 1), Point((i + 1)*scale - 1, size - realValue), Scalar(255)); } return dstImage; } int main() { // 【1】加载源图像 Mat srcImage, dstImage; srcImage = imread("1.jpg", 1); if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; } // 【2】转为灰度图并显示出来 cvtColor(srcImage, srcImage, COLOR_BGR2GRAY); imshow("原始图", srcImage); Mat histSrc = drawHist(srcImage); imshow("histSrc", histSrc); // 【3】进行直方图均衡化 equalizeHist(srcImage, dstImage); Mat histDst = drawHist(dstImage); imshow("histDst", histDst); // 【4】显示结果 imshow("经过直方图均衡化后的图", dstImage); // 等待用户按键退出程序 waitKey(0); return 0; }
(二)显示结果
八、实验总结
本次实验的主要内容是掌握绘制图像的直方图方法和图像直方图均衡化方法。使用OpenCV中的calcHist函数计算直方图,计算完成之后,采用 OpenCV中的rectangle函数绘制矩形来完成直方图绘制; 在OpenCV中,使用equalizeHist函数实现直方图均衡化的功能。通过编写代码,我学会了使用calcHist函数和rectangle绘制图像直方图;学会了使用equalizeHist函数完成直方图均衡化。
-
matplotlib绘图(折线图,柱状图,饼状图,散点图,直方图)
2022-03-15 00:23:12matplotlib绘图折线图柱状图叠加柱状图并列柱状图水平柱状图(条形图)饼状图散点图直方图 折线图 x = [1,2,3,4,5] y = [1,2,3,4,5] # 调用绘制线性图函数plot() plt.plot(x,y, c='b', # 线的颜色 linestyle=':', ...折线图
x = [1,2,3,4,5] y = [1,2,3,4,5] # 调用绘制线性图函数plot() plt.plot(x,y, c='b', # 线的颜色 linestyle=':', # 线的风格 linewidth=3, # 线的宽度 marker='o', # 标记点的样式 markerfacecolor='r', # 标记点的颜色 markersize=10, # 标记点的大小 alpha=0.7, # 图形的透明度 label="x=y" # 设置图例的label ) plt.legend() plt.show()
# numpy数据 y1 = np.random.random(6) # 第1条折线y轴 y2 = np.random.random(6) # 第2条折线y轴 x = np.arange(6) # 公用的x轴 plt.plot(x, y1, label='成都') # 绘制第1条折线图 plt.plot(x, y2, label='武汉') # 绘制第2条折线图 plt.legend(loc='best') # 显示折线 plt.title('各城市房价(单位:万)', fontsize=20) # 设置标题 index_name = ['1月', '2月', '3月', '4月', '5月', '6月'] # 设置刻度 plt.xticks(x,index_name) # 将x坐标刻度数值与字符对应 plt.show() # 显示图形
# 使用DataFrame数据 data_frame = pd.DataFrame({ 'Python基础': np.random.randint(10, 100, 5), 'Python爬虫': np.random.randint(10, 100, 5), 'Python Web': np.random.randint(10, 100, 5), }) plt.plot(data_frame, marker='o') # 显示图例 plt.legend(data_frame, loc=2) # 设置x轴刻度标签 plt.xticks([0, 1, 2, 3, 4], ['1月', '2月', '3月', '4月', '5月']) plt.title('2022年课程购买人数') plt.xlabel('月份') plt.ylabel('购买人数') # linewidth 设置网格的宽度 plt.grid() # 显示图形 plt.show()
柱状图
x = [1,2,3,4,5] index_name = ['星期一','星期二','星期三','星期四','星期五'] height = [2.5,3.5,4.6,5.7,6.8] plt.bar(x,height,color='r') plt.xticks(x,index_name) plt.title('销售量(单位:万元)') # 添加文字 for x,height in zip(x,height): plt.text(x,height,height,ha='center',va='bottom') plt.show()
叠加柱状图
plt.figure(figsize=(4,4),dpi=100) # 设置图像大小,dpi设置图像像素 x = [1,2,3,4,5] index_name = ['星期一','星期二','星期三','星期四','星期五'] height1 = [2.5,3.5,4.6,5.7,6.8] height2 = [2,3,4,5,6] plt.bar(x,height1,color='r',label='python销量') plt.bar(x,height2,bottom=height1,color='b',label='c语言销量') plt.xticks(x,index_name) plt.title('销售量(单位:万元)') plt.legend() # 调用label plt.show()
并列柱状图
plt.figure(figsize=(4,4),dpi=100) # 设置图像大小,dpi设置图像像素 x = np.arange(5) index_name = ['星期一','星期二','星期三','星期四','星期五'] height1 = [2.5,3.5,4.6,5.7,6.8] height2 = [2,3,4,5,6] bar_width = 0.3 plt.bar(x,height1, bar_width,color='r',label='python销量') plt.bar(x + bar_width,height2, bar_width, color='b',label='c语言销量') plt.xticks(x+bar_width/2,index_name) plt.title('销售量(单位:万元)') plt.legend() # 调用label plt.show()
水平柱状图(条形图)
plt.figure(figsize=(4,4),dpi=100) y=[1,2,3,4,5] index_name = ['python','c语言','c++','java','php'] plt.yticks(y,index_name) width = [2.5,3.6,4.7,5.8,6.0] plt.barh(y,width) # 添加文字 for y,width in zip(y,width): plt.text(width,y,width) plt.show()
饼状图
plt.figure(figsize=(4,4),dpi=100) labels = ['A','B','C','D','E'] x = [10,20,30.5,40.6,50.7] explode = [0,0.1,0,0,0.1] # 突出某一部分 plt.pie(x,labels=labels,autopct='%.0f%%',explode=explode) plt.show()
散点图
x = [1,2,3,4,5] y = [1,2,3,4,5] a = np.random.rand(10) b = np.random.rand(10) size1 = np.random.rand(5)*200 size2 = np.random.rand(10)*100 plt.scatter(x,y,color='y',s=size1) plt.scatter(a,b,color='b',s=size2) #s的size大小必须与x,y的大小相匹配 plt.show()
直方图
x = [1,2,3,4,5,1.1,1.2,1.3] plt.hist(x) plt.show()
# 正态分布 data = np.random.normal(0,1,100000) plt.hist(data,bins=200) plt.show()
-
opencv 轮廓放大_新视界-OpenCV教程(24)- 直方图:直方图均衡化
2020-11-21 09:42:20即在多少网格下进行直方图的均衡化操作 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) cl1 = clahe.apply(img) cv2.imwrite('clahe_2.jpg',cl1) 运行代码得到下面的结果,并与上面的结果进行比较,... -
练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则...
2020-08-19 00:52:55练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些。 题目的意思应该为“打印输入中不同长度的单词个数的直方图”。 编译运行前,应将第23行的EOF改为... -
【学习图像处理】之实验二——灰度图像直方图规定化
2020-04-14 19:39:592、直方图均衡化3、直方图规定化三、代码实现与分析0、辅助功能实现1、绘制原图像直方图SH2、绘制均衡直方图SQH ,给出均衡图象QI3、绘出目标均衡直方图EQH4、绘制规定化变换函数T,给出最终增强图象DI及其直方图DH... -
c语言循环写回合制小游戏_告别黑框框——用C语言Easyx图形库实现图形界面
2020-11-19 23:53:05Easyx图形库是针对C++的图形库,也可以帮助C语言初学者快速上手图形和游戏编程,给初学者带来 编程的乐趣,享受开发程序的魅力,让写程序更有成就感。 比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一... -
[C程序设计语言]练习1-13:编写一个程序,打印输入中单词长度的直方图。水平容易,垂直难。
2019-07-13 13:50:05水平直方图 #include <stdio.h> #include <stdlib.h> int main() { int c,a; int ndigit[20] = {0}; int i = 0; while((c = getchar()) !=EOF){ if(c != ' ' && c != ... -
python之 matplotlib模块之基本三图形(直线,曲线,直方图,饼图)
2020-12-09 06:44:09matplotlib模块是python中一个强大的绘图模块安装 pip installmatplotlib首先我们来画一个简单的图来感受它的神奇import numpy as npimport matplotlib.pyplot as pltimport matplotlibzhfont1=matplotlib.font_... -
MFC - 课程设计 - 学生成绩管理系统(带直方图/折线图数据显示)
2019-06-28 00:08:42最后实现两个按钮的函数(打开“学生管理系统”中保存的save.txt,根据提取save.txt中的数据更改各个分段的高度以显示出直方图以及折现图)。 (3)带有详细注释的自己编写的关键源程序: 1.学生管理系统: //将四个... -
C语言程序 产生服从正态分布、瑞利分布、泊松分布的随机数
2020-07-13 07:30:41最近上通信建模这门课时范平志老师布置的这个作业,我做好后传上来方便后人参考,包括了三个C语言程序,分别产生服从正态分布、瑞利分布、泊松分布的...如果要画直方图,可用matlab或excel等软件导入.txt文件进行绘图。 -
xmgrace/grace画图简略总结
2021-05-16 02:04:36grace xmgrace 画图写论文出图先用了python.plt,画出初步图,但是想要用这个做出的图片达成论文规范要求还需要学蛮长时间的。一是导师对这个没有那么熟悉,还有 matplotpy 似乎在学术方面没有那么专业。(没有学习多... -
方向梯度直方图HOG(理解与c++代码实现)
2019-12-23 14:12:40方向梯度直方图HOG(理解与c++代码实现) 菜鸟一个,学习视觉跟踪要用到HOG特征,想要深入了解一下HOG特征,但是找了半天很多人的介绍都没有代码,还有的有部分代码,想要全部的代码,还要花钱下载,很不爽,我这里... -
Python进阶课程-Matplotlib绘图
2021-03-16 15:20:38本课程会讲解到matplotlib中最常用的一些知识点,包括绘制基本图形,散点图,直方图,等高线图,3D图,动态图等等。同时还是涉及到legend图例,标注,多figure,subplot,设置坐标轴等一些内容。 -
数字图像处理(二)——BMP图像的统计
2020-03-08 21:42:19使用C(C++)语言统计BMP图像像素的最小值、最大值、整幅图像像素的均值、标准差、计算图像信息量(图像熵),统计图像像素值频率并使用graphics.h头文件绘制灰度直方图。 -
【翻译:OpenCV-Python教程】OpenCV里的直方图
2018-12-11 20:00:27⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.0了正式版,所以接下来是按照4.0.0翻译的...直方图-1:查找,绘图,分析!!! 目标 学会 使用OpenCV以及Numpy的函数找出直方图。 使用OpenCV以及Numpy的... -
C语言图形设计全解.ppt
2021-05-21 08:36:59C语言图形设计全解第11章 图形处理 11.1 概述 11.2 图形函数 11.1 概述 Turbo C提供了非常丰富的...可以实现绘制彩色的线、弧、圆、矩形、扇形、多边形、三维直方图等,可以改变线型、画线的粗细,还可根据预定义模... -
R语言之统计绘图与编程
2021-07-22 05:50:50《R语言之统计绘图与编程》由会员分享,可...,图1 R首页的图形 R是一种统计绘图语言,也指实现该语言的软件。,The R Project for Statistical Computing,3,简 史,R语言是从S统计绘图语言演变而来,可看作S的“方言”... -
c语言学习进阶-C语言程序产生正态分布随机数
2022-01-10 16:26:02C语言程序产生正态分布随机数 -
Python进阶-Matplotlib绘图
2018-12-18 13:43:55本课程会讲解到matplotlib中最常用的一些知识点,包括绘制基本图形,散点图,直方图,等高线图,3D图,动态图等等。同时还是涉及到legend图例,标注,多figure,subplot,设置坐标轴等一些内容。 -
数字图像处理基础代码(C语言)
2021-05-20 03:36:51//区域重绘 } ② 直方图均衡 void CDemoView::OnHistEqual() { CDemoDoc *pDoc = GetDocument(); HDIB dib = pDoc->GetHDIB(); LPSTR lpDIB = (LPSTR)::GlobalLock((HGLOBAL)dib); LPBITMAPINFOHEADER phead = ... -
python--matplotlib-绘图
2022-03-02 10:09:28matplotlib一、matplotlib--数据可视化图表二、绘制折线图1....例子:五、绘制直方图例子: 一、matplotlib–数据可视化图表 1.了解能将数据进行可视化,更直观地呈现 2.使数据更加客观更具说服力 二、绘制折线图 示例