ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:186.70KB ,
资源ID:28397510      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28397510.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(绘制成绩分布图.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

绘制成绩分布图.docx

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

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

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

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

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

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

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

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

9、到了很多错误,软件自身带有的DEBUG功能有一定的好处,但是这个功能不怎么会用,而在查阅资料的时候记得看到过用MessageBox来调试程序的用法,如果出错了,那么就用MessageBox来看看到底程序执行到了什么步骤,出现对话框,则说明之前的都执行过了,如果没出现,则程序没执行到这里就已经产生了错误。MessageBox还可以显示所处理的数据或者字符串的变化。用起来相当简单。这个小技巧是自己在调试过程中效率提高了不少,在源代码中,这些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);这是模拟单机事件的代码,在重绘过程中自动模拟单机事件。DrawMode是定义的一个绘图模式,若单机绘制直方图,DrawMode=1;单机绘制圆饼图,DrawMode=2。在重绘过程中自动模拟但

13、是过程。省去了使用者再次点击的过程。六、设计中的关键源程序1、绘制直方图代码:void CMy09228DulichaoDlg:OnButton1() if(True=0) MessageBox(未导入数据!,错误!); else CClientDC *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*.txt0); /ofn

14、.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/MessageBox(),;i

15、nt Sc5;Sc0=0;Sc1=0;Sc2=0;Sc3=0;Sc4=0;for(i=0;iN;i+) if(ai60) Sc0+; else if(ai70) /统计各个分段中的人数 Sc1+; else if(ai80) Sc2+; else if(ai90) Sc3+; else Sc4+; 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 v

16、4;CBrush br;CPen pen,*p_pen;#define R rand()%56+200BYTE r,g,b; br.CreateSolidBrush(RGB(126,126,126); pDC-SelectObject(&br);/srand(unsigned)time(NULL); CRect rc;GetClientRect(&rc);pDC-Rectangle(x0-40,0,rc.right,rc.bottom); /画出绘制区域 br.DeleteObject();pDC-MoveTo(x0,y1);pDC-LineTo(x=x1+80,y1);pDC-MoveTo(

17、x,y1);pDC-LineTo(x-12,y1-3);pDC-MoveTo(x,y1);pDC-LineTo(x-12,y1+3); /画出x轴pDC-MoveTo(x0,y1);pDC-LineTo(x0,0);pDC-MoveTo(x0,0);pDC-LineTo(x0-3,12);pDC-MoveTo(x0,0);pDC-LineTo(x0+3,12); /画出y轴pen.DeleteObject();/pDC-SetROP2(R2_MASKPEN);/pen.CreatePen(PS_DOT,1,RGB(70,70,70);/p_pen=pDC-SelectObject(&pen);

18、pDC-MoveTo(x1+55,0);pDC-LineTo(x1+55,y1);pen.CreatePen(PS_SOLID,2,RGB(0,0,0);p_pen=pDC-SelectObject(&pen);for(i=0,x=x0;iSelectObject(&br); pDC-Rectangle(x,y1-dh*Sci,x+dx,y1); /画出矩形区域 v0.x=x+dx; v0.y=y1-dh*Sci; v1.x=v0.x+h; v1.y=v0.y-h; v2.x=v1.x-dx; v2.y=v1.y; v3.x=v2.x-h; v3.y=v2.y+h; / 画出顶部平行四边形区域

19、 pDC-Polygon(v,4); pDC-SelectStockObject(WHITE_BRUSH); br.DeleteObject(); if(i=4|SciSci+1) br.CreateSolidBrush(RGB(r*0.7,g*0.7,b*0.7); pDC-SelectObject(&br); v2.x=v1.x; v2.y=v1.y+dh*Sci; v3.x=x+dx; v3.y=y1; pDC-Polygon(v,4); / 画出侧边四边形区域 pDC-SelectStockObject(WHITE_BRUSH);br.DeleteObject(); pDC-Selec

20、tObject(p_pen);pen.DeleteObject();pen.CreatePen(PS_DOT,1,RGB(70,70,70);p_pen=pDC-SelectObject(&pen);pDC-SetROP2(R2_MASKPEN);for(y=y1,i=0;y=y0;+i,y-=dh) if(y!=y0&y!=y1) pDC-MoveTo(x0,y); pDC-LineTo(x1+h+30,y); /沿y轴标注 s.Format(%3d,i); pDC-TextOut(250,y-8,s);CString ren;ren=人;s.Format(%s,ren);pDC-TextO

21、ut(260,10,s);pDC-SelectObject(p_pen);pen.DeleteObject();CString Str5;Str0=90分;for(i=0;iTextOut(x0+i*dx+(dx-s.GetLength()*8)/2,y1+4,s);/沿x轴标注 s.Format(%d人,Sci); pDC-TextOut(x0+i*dx+(dx-s.GetLength()*8)/2+6,y1-20-dh*Sci,s); /顶层标注人数CString fen;fen=分数;s.Format(%s,fen);pDC-TextOut(x0+i*dx+(dx-s.GetLength

22、()*8)/2+30,y1+4,s);delete pDC; /删除指针if(a!=NULL) delete a; /Num=1; /将最大数清零 DrawMode=1;True=1; 2.绘制饼形图源代码 if(True=0) MessageBox(未导入数据!,错误!); else CClientDC* pDC=new CClientDC(this);const double PI=3.1415926536,_2PI=PI+PI; /圆周率/定义#define Sum sn-1 const int r=170,p=20;const int x0=r+20,y0=r+20,x1=x0-r,y

23、1=y0-r,x2=x0+r,y2=y0+r;int n=5,*data=new intn,*s=new intn;static int promin=0; /*int N,*a;int i,x,y;/CString s;N=Num;a=new intN;/int aN;for(i=0;iN;+i) ai=Scorei; /将全局变量Scorei里的数据传递给局部变量aiint Sc5;Sc0=0;Sc1=0;Sc2=0;Sc3=0;Sc4=0;for(i=0;iN;i+) if(ai60) Sc0+; else if(ai70) /统计各个分段中的人数 Sc1+; else if(ai80)

24、 Sc2+; else if(ai90) Sc3+; else Sc4+; int Max=0;for(i=0;iMax) /确定五个分段中最大的个数 Max=Sci;/data0=Sc0;data1=Sc1; /将分数段传给data数组data2=Sc2;data3=Sc3;data4=Sc4;int x3,y3,x4,y4;double theta3,theta4,thetam,tx,ty;/#define R 156+rand()%100 /BYTE r1,g,b; CBrush br,*p_br;CRect rc;GetClientRect(&rc);TEXTMETRIC txMetr

25、ic;pDC-GetTextMetrics(&txMetric);/br.CreateSolidBrush(RGB(r1=R,g=R,b=R);/ pDC-SelectObject(&br);CString str;br.CreateSolidBrush(RGB(126,126,126); pDC-SelectObject(&br);pDC-Rectangle(240,0,rc.right,rc.bottom); br.DeleteObject(); /绘图区域for(s0=data0,i=1;in;+i) si=si-1+datai; /求总和srand(unsigned)time(NULL

26、); CString Str15;Str10=90分;for(theta3=0.0,x3=x0+r/*x0=r+20*/,y3=y0/*y0=r+20*/,i=0;iSelectObject(&br); pDC-Pie(x1+tx+250,y1+ty,x2+tx+250,y2+ty/*边缘矩阵*/,x4+tx+250,y4+ty/*起始点*/,x3+tx+250,y3+ty/*终止点*/); /第一个是边缘矩阵,第二个是起始点,第三个是终止点 str.Format(%d,datai); /各个分段数据 pDC-TextOut(x0+tx-txMetric.tmAveCharWidth*str.GetLength()*0.5+r*0.7*cos(thetam)+250,y0+ty-(txMetric.tmExternalLeading+txMetric.tmHeight)*0.5+r*0.7*s

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1