绘制成绩分布图

上传人:hs****ma 文档编号:511458236 上传时间:2023-01-21 格式:DOCX 页数:23 大小:91.27KB
返回 下载 相关 举报
绘制成绩分布图_第1页
第1页 / 共23页
绘制成绩分布图_第2页
第2页 / 共23页
绘制成绩分布图_第3页
第3页 / 共23页
绘制成绩分布图_第4页
第4页 / 共23页
绘制成绩分布图_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《绘制成绩分布图》由会员分享,可在线阅读,更多相关《绘制成绩分布图(23页珍藏版)》请在金锄头文库上搜索。

1、Visual c+可视化程序 设计报告绘制成绩分布图系别:电气系班级: 电子092班姓名:杜力朝绘制成绩分布图报告、设计内容介绍:本示例主要的功能是通过给定的一组成绩数据绘制出成绩的分布图(包括直方图和圆 饼图)。这里没有用到数据库,因为是一个简单的成绩分布图,而用数据库的话在转到另一 台机子上还要重新建表,对于学生信息也要涉及到录入问题,不容易实际操作,所以本示 例采用了更为方便的通过手动录入数据或者是从文件(txt格式文本文档,第一个数为总 人数,其余为分数,分数之间用逗号隔开)导入数据两种方式绘制出其统计图。录入的成 绩可查看可修改,直方图采用了立体图模式,看起来更直观,各个分数段都有明

2、显的分数 人数标注,看起来直观形象。饼形图也同样标注了各颜色对应的分数段及人数,看起来很 直观。数据录入部分与绘图部分集成在一个对话框上面,没有在单个文档中调用,减少了 不必要的繁琐过程。二、设计思路方法、过程在早期一段时间做过界面设计,多媒体的制作以及网络部分的程序,而对于绘图一部 分一直以来都为触及到,所以在这方面采用了查找样本借鉴修改的方法来完成本实验。通过查阅资料分析一共得到两个差不多的实例,其中一个是创建一个绘图类,然后在 绘制过程中创建该类,将该类实例化以后绘制出相应的图形;另一个是直接从给出的数据 中绘出直方图和饼图来。因为学 C+处未达到一定层次,对于建类来说并不是一件容易的

3、事,所以采用了第二种直接绘图的方法,即在绘制按钮中添加所有绘制代码。因为给定的是一个在单文档中绘制的实例,而且数据是直接绘出的,本实例是需要从 所给分数数据中统计出各分数段人数,然后将其分布图绘制出来,所以在将其源码打出来 以后,在其基本框架上加以修改而来,将当文档换成为基本对话框,并且数据经过处理以 后显示在对话框右侧部分。所给实例只是一个简单的绘制图形的实例,仅在单机是进行绘制,而本例则在导入数 据或者录入数据后绘制图形,所以在调试过程中加入了很多变量,和局部变量。通过全局 变量将局部变量联系到一起,从而实现了要求所述的基本功能。老师说,一个软件的好与 坏区别在其制作时考虑是否全面,要将其

4、可能出现的用户所要求的所有情况都加以完善, 所以本示例在基本功能完成后的完善部分做了很大一部分工作,主要有在绘制时没有绘制数据时报错提醒,导入时没有导入文件报错提醒,文件录入查看及录入修改,重新录入等,录入人数不可大于总人数,在录入区域及标注上也做了相应调整,还有在程序从得到焦点重绘图形的过程上加以了完善。最后程序基本上就成型了,不过程序还有一点问题就是在导入文件时的问题现在还未想到解决方法。在导入数据的时候要做一个检测,检测路径框是否为空,如果为空则提示错误,不为空则导入数据,这时如果路径框中路径不对的话,那么导入数据时程序便会终止。因为不知道怎么见得文件时候合法,所以这个问题暂时还没有解决

5、方案。不过一般按正确操作的话是不会出现问题的。三、设计结果示范本示例主要有两个结果:1) 、直方图绘制效果图2) 、圆饼图绘制效果图四、设计心得体会通过这个小小的程序设计,对程序设计有了一个新的认识,也使自己在生活过程中用一种新的思维审视世界。曾听过这样的一段话:在玩游戏的过程中看到的不是画面,而是各种数据在有规律的运动,计算,时刻进行着各种循环和假设判断,我玩的已不是游戏,而是方程式这段话深刻的反映出了游戏的设计过程。同样也折射出了程序设计的原理。在绘图这方面以前只设计过简单的直线曲线自由线画图,而对于这样的数据自动绘图没有涉及到,在设计出来前就曾想过做一个图像处理程序,不过在看过程序的复杂

6、性以及时间短暂的原因,没有着手哪方面的准备,在这之后课题为绘图设计正好可以弥补这方面的空缺。设计时由于没有任何的基础,所以搜索了很多资料,最终锁定了一个比较简单的模板,将模板打出来是很简单的事情,但是真正有趣的是后面的调试完善工作,其中各种环节都是围绕绘制矩形和绘制扇形而来,大量的工作就是将数据导入数组并将其处理分组得到其人数以后将其转化为矩形以及为立体而设计的平行四边形的坐标,扇形的坐标。其他的一些完善代码大部分都是辅助的,不过在设计过程中也是十分有趣的。在设计过程中遇到了很多问题,从最简单的矩形图数据分析到后来的文件操作以及画刷颜色的随机选取,模拟按键消息,各种错误的报错提醒等等问题都一一

7、排除,通过查阅大量资料来进行各种完善。因为学过其他的编程软件,所以在编程的过程中,也在比较两者的区别,各自的特点以及缺点,不同和相同之处。C+勺各类分的比较详细,在创建变量时也是通过对话框创建,结构性比较好,适合于团队协作;而另一个编程软件(delphi )则在类于类之间比较模糊,所有的工作都在Form上操作,不过这样操作起来比较方便,整合的控件也相当多,直接摆放即可,适合个人应用。不管哪种软件都是为编程而服务的,其目的是一样的,只是在操作上不同而已,通过两个软件的比较是自己更好的掌握了其类的概念,控件的用途,在函数以及属性的设计上都有了更深的理解。语言都是想通的,在学过一门语言以后其他的便可

8、以读懂了。最开始学习的是C+,而后又接触了delphi ,在刚开始学习delphi 的过程中基本上都可以读懂其中的代码,而后再学习Visual C+ 便轻松多了。在刚开始讲课的时候几乎不知道怎么去分析处理,因为有了前者使用的习惯,所以在后者使用时总会想当然的以为该那样,其实两者在程序使用中有很大的不同,即使到了考试时也不是很明白该怎么去使用它。直到现在设计这个小程序时才系统的将这个软件大致的掌握了其使用方法。在变量声明以及转换显示,属性的动态修改等等都有了一个新的认 识。那么剩下的在编程方面的思想以及 windows API接口函数的使用都是相通的。只不过 实现的过程不一样而已。在设计过程中遇

9、到了很多错误,软件自身带有的DEBU助能有一定的好处,但是这个功能不怎么会用,而在查阅资料的时候记得看到过用 MessageBo冰调试程序的用法,如果 出错了,那么就用MessageBo江看看到底程序执行到了什么步骤,出现对话框,则说明之 前的都执行过了,如果没出现,则程序没执行到这里就已经产生了错误。MessageBo斑可以显示所处理的数据或者字符串的变化。用起来相当简单。这个小技巧是自己在调试过程 中效率提高了不少,在源代码中,这些 MessageBox并没有删除,只是注释掉了,在以后分 析的时候这也是相当有帮助的。五、由现的错误及改正方法1 .刚开始是将浏览和导入的函数集成到一个按钮“浏

10、览”里面,但是在调试中发现如 果单击浏览而不选中文件的话, 会出现错误二终止。 通过分析其主要原因是因为函数理念 有导入数据的代码,单击后会一并执行,如果没有选中文件那么就无法导入数据产生错误。解决方法:将浏览和导入功能分装到两个按钮里面,并在导入数据的时候检测是否有 文件导入。如果没有则报错提醒。2 .在绘制直方图或圆饼图时如果没有数据则会出现错误而自动终止程序,原因是数组 当中没有数据而无法绘图。解决方法:定义全局变量,在导入后全局变量变为1,绘制时检测全局变量是否为1,是则绘制,否则报错提醒。3 .在录入过程中难免会录入错误,所以查看录入和重新录入就显得很重要了。而在录 入的过程中会出现

11、录入人数大于所规定的人数的,这样在数组存放数据时就会产生错误。解决方法:增加重新录入和查看录入成绩的功能,为了方便起见,每行显示五个成绩, 而且在录入时对录入人数做了一个判断,如果大于所输人数,则提示成绩录入完毕。4 .在做圆饼图时发现如果某一分数段的人数为0的话,就会产生这样的结果这种结果并不是我们想要的。图中可以看到本来没有的分数段70-80覆盖掉了原有的60和60-70的分数段。解决方法:在绘制过程中对绘制扇形一部分做了检测,发现如果所绘制分数段如果为 零则不绘制这段扇形。这样结果便正常了。5 . 由于绘图部分并不是在OnPaint 函数里所写的,而是直接在按钮里添加的,所以在程序重新得

12、到焦点重绘的过程中会产生这样的错误:一部分被挡住的图形丢失了。虽说可以重新点击绘图重绘,不过这样的事情最好不要发生。解决方法:在程序重绘的过程中在OnPaint 事件里添加如下代码:if(DrawMode=1) PostMessage(WM_COMMAND,IDC_BUTTON1,BN_CLICKED); else if(DrawMode=2)PostMessage(WM_COMMAND,IDC_BUTTON2,BN_CLICKED);这是模拟单机事件的次码,在重绘过程不自动模拟单机不件。DrawModel定义的一个绘图模式,若单机绘制直方图, DrawMode=1单机绘制圆饼图,DrawMo

13、de=2在重绘过程 中自动模拟但是过程。省去了使用者再次点击的过程。六、设计中的关键源程序1、绘制直方图代码:void CMy09228DulichaoDlg:OnButton1()if(True=0)MessageBox(未导入数据!,错误!);elseCClientDC *pDC=new CClientDC(this);const int x0=280,y0=35,x1=780,y1=395;/定义绘制的矩形区域/CFileDialog ofn(TRUE,NULL,*.txt,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,Text files (*.txt)0*.

14、txt0);/ofn.DoModal();/FILE *fp=fopen(ofn.GetPathName(),rt);int N,*a;int i,x,y;CString s;/for(fscanf(fp,%d,&N),a=new intN,i=0;iN;+i)/fscanf(fp,%d,&ai);/fclose(fp);N=Num;a=new intN;/int aN;for(i=0;iN;+i)ai=Scorei;/ CString str1;/ str1.Format(%d,ai);/ MessageBox(str1,);/ 将全局变量Scorei 里的数据传递给局部变量ai/Messa

15、geBox(),;int Sc5;Sc0=0;Sc1=0;Sc2=0;Sc3=0;Sc4=0;for(i=0;iN;i+)if(ai60)Sc0+;elseif(ai70)/统计各个分段中的人数Sc1+;elseif(ai80)Sc2+; elseif(ai90)Sc3+;elseSc4+;int Max=0;for(i=0;iMax) /确定五个分段中最大的个数Max=Sci;/MessageBox(adfasdf,sss); /调试所用const int dx=(x1-x0)/5,M=30,dy=(y1-y0)/10,h=dx/4,dh=(y1-y0)/Max;CPoint v4;CBrush br;CPen pen,*p_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号