地大C++课程设计报告_第1页
地大C++课程设计报告_第2页
地大C++课程设计报告_第3页
地大C++课程设计报告_第4页
地大C++课程设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、面向对象程序设计 课程设计报告 学号: 班级序号: 班级: 姓名: 指导老师: 成绩:中国地质大学信息工程学院 2014.06.15实习题目一:一:问题描述及基本要求: (1)下面为一个二维空间点类,圆类,矩形类。阅读代码,将其功能全部完善。并编写主函数进行测试。(10分)(2)完成第一步的工作后,进行一个类的整体改进,抽象出一个高层的抽象基类,使用虚函数,继承等面向对象特征对这些类进行改进。(10分)(3)将代码结合到mfc的单文档视图框架里,进行图形化,显示菜单和鼠标交互操作。(10分)class vecpositionpublic: vecposition ( double vx = 0

2、, double vy = 0); vecposition operator - ( ); vecposition operator + ( const double &d ); vecposition operator + ( const vecposition &p ); vecposition operator - ( const double &d ); vecposition operator - ( const vecposition &p ); vecposition operator * ( const double &d ); vecposition operator * (

3、 const vecposition &p ); vecposition operator / ( const double &d ); vecposition operator / ( const vecposition &p ); void operator = ( const double &d ); void operator += ( const vecposition &p ); void operator += ( const double &d ); void operator -= ( const vecposition &p ); void operator -= ( co

4、nst double &d ); void operator *= ( const vecposition &p ); void operator *= ( const double &d ); void operator /= ( const vecposition &p ); void operator /= ( const double &d ); bool operator != ( const vecposition &p ); bool operator != ( const double &d ); bool operator = ( const vecposition &p )

5、; bool operator = ( const double &d ); void draw ( ); / 绘制到屏幕 string str ( ); / 将向量坐标转为字符串,格式为“(x=, y=)” bool setx ( double dx ); double getx ( ) const; bool sety ( double dy ); double gety ( ) const; void setvecposition ( double dx = 0, double dy = 0 ); double getdistanceto ( const vecposition p );

6、 /获得两点间的距离 vecposition setmagnitude ( double d ); /设置向量长度为d double getmagnitude ( ) const; /获取向量长度 double getdirection ( ) const; /获取向量方向(与x轴夹角) / 判断坐标是否在给定两点的x,y之间 bool isbetweenx ( const vecposition &p1, const vecposition &p2 ); bool isbetweenx ( const double &d1, const double &d2 ); bool isbetwee

7、ny ( const vecposition &p1, const vecposition &p2 ); bool isbetweeny ( const double &d1, const double &d2 ); / 正规化坐标 vecposition normalize ( ); / 向量旋转 vecposition rotate ( double angle ); / 根据极坐标获取笛卡尔坐标 static vecposition getvecpositionfrompolar( double dmag, double ang ); / 将任意角度转为(180,180范围 static

8、 double normalizeangle ( double angle );private:double m_x; double m_y; ;class circlepublic: circle( ); circle( vecposition pos, double dr ); void draw ( ); / get and set methods bool setcircle ( vecposition pos, double dr ); bool setradius ( double dr ); double getradius ( ); bool setcenter ( vecpo

9、sition pos ); vecposition getcenter ( ); double getcircumference ( ); / 获取周长 double getarea ( );/ 获取面积 / 判断点是否在圆内部 bool isinside ( vecposition pos );/ 求两个圆的交点 int getintersectionpoints ( circle c, vecposition *p1, vecposition *p2 );/求两个圆的相交面积 double getintersectionarea ( circle c );private:vecpositi

10、on m_poscenter; / 中点坐标double m_dradius; / 半径;class rectpublic: rect ( vecposition pos, vecposition pos2 ); void draw ( ); / 判断点是否在矩形内部 bool isinside ( vecposition pos ); / get 和set 函数 void setrectanglepoints( vecposition pos1, vecposition pos2 ); bool setposlefttop ( vecposition pos ); vecposition g

11、etposlefttop ( ); bool setposrightbottom ( vecposition pos ); vecposition getposrightbottom ( ); / 获取面积和周长 double getarea(); double getcircumference();private:vecposition m_poslefttop; / 矩形的左上角坐标vecposition m_posrightbottom; / 右下角坐标;二总体分析与设计:(1)设计思想:用类来实现题目要求,先按要求实现题目所给三个类的成员函数,然后再抽象出基类。程序中圆类和矩形类的实现

12、主要靠调用点类的成员函数。点类中定义的一系列重组函数为三个类中各成员函数的实现提供了方便,对象之间的计算使得程序更具有可操作性。本题。三个类中最复杂的是点类,成员函数特别多,完成的难度最大。其中,点类作为基础部分,为圆类和矩形类中部分函数的实现提供条件。(2)设计表示:class shape(基类) class vecposition(子类)class rect(子类)class circle(子类)(3)程序主要算法分析:本题主要的算法就是实现函数的调用以及类的基本知识(一个类调用另一个类的成员函数)。例如:1. 圆类中求两圆交点的函数就调用了点类中的getdistancet(计算点之间的距

13、离),normalize,getdirection(利用向量与x轴的夹角)等函数。2. 在normalize ()函数中调用getdirection()来得到正规化坐标以后的点的坐标。3. 求两相交圆相交部分面积的函数getintersectionarea (),也调用了点类中的getdistancet()、getdirection()等函数。(4)调试报告:编写本题最初遇到的困难是,题目所给的信息量太大,题中涉及到的变量,常量非常多,不知道这些量所代表的实际意义,所以便有一种法无从下手的感觉。特别是点类一开始的一系列重组函数,起初不明白其意图,也就不好写出其函数体。调试时,程序中偶尔回出现致

14、命性的错误,明明在于语法上没有错误,但无法运行得到结果。应该是程序的逻辑混乱导致。调试结果如下:(5)小结通过对本题的实习,对类的知识有了更进一步的了解,对类之间各种成员变量,函数的调用更加熟悉。知道怎样去调用另一个类中的成员函数。这个题除了锻炼对类的理解外,还增强了我们对程序编写的整体把握,让我们的思路不局限于一个函数或几个函数的调用,而是掌握几个类之间的相互作用。(6)主要函数代码:1.求两圆交点的代码:int getintersectionpoints (circle c, vecposition *p1,vecposition *p2) double centerdistance =

15、m_poscenter.getdistanceto(c.m_poscenter); double m = centerdistance - (m_dradius + c.m_dradius); double n = centerdistance - fabs(m_dradius - c.m_dradius); double midx = (m_poscenter.getx() + c.getcenter().getx() / 2; double midy = (m_poscenter.gety() + c.getcenter().gety() / 2; if (centerdistance =

16、 0 & n = 0) return -1; if (m0 | n 0) return 0; if (m = 0 |(n=0&m!=0) *p1 = *p2 = vecposition(midx, midy); return 1; if (m0) double ae = 0.5*(m_dradius*m_dradius - c.m_dradius*c.m_dradius) / centerdistance + centerdistance); double de = sqrt(m_dradius*m_dradius - ae*ae); vecposition vecab(c.m_poscent

17、er - m_poscenter); vecposition e(m_poscenter + vecab.normalize()*ae); vecposition veccd; if (vecab.getdirection()pi / 2) veccd= vecab.rotate(1.5*pi);else veccd = vecab.rotate(pi/2); *p1 = (e + veccd.normalize()*de); *p2 = (e - veccd.normalize()*de); return 2; else return 0; 2.正规化坐标代码vecposition norm

18、alize () return vecposition(cos(this-getdirection(), sin(this-getdirection(); 3.向量旋转 vecposition rotate (double angle )angle=angle/180*pi; /由于输进去的角度值不是幅度制,统一化成幅度值 angle += this-getdirection();return vecposition(this-getmagnitude()*cos(angle),this-getmagnitude()*sin(angle);4.根据极坐标获取笛卡尔坐标 static vecpo

19、sition getvecpositionfrompolar (double dmag,double ang)ang=ang/180*pi; /return vecposition(dmag*cos(ang),dmag*sin(ang);5.将任意角度转化为(-180,180范围static double normalizeangle (double angle)angle=angle/pi*180;/化成幅度值 int a=int(angle/180); if(a%2=0) return angle-a*180; else return angle-(a+1)*180;6. 获得两点间距离v

20、ecposition setmagnitude (double d) m_x = d*cos(this-getdirection(); m_y = d*sin(this-getdirection(); return *this;double getmagnitude ()const return sqrt(m_x*m_x+m_y*m_y);实习题目二:一:问题描述及基本要求:(1) (10分)编写一个程序实现文件读写操作、排序、查找、删除等操作。 要求:a将“a.txt”文件中将学生成绩记录按照总分的由高到低方式排列,并将结果输出到“b.txt”。总分相同的情况下,按照数学成绩的由高到低排列。

21、 b输入一个学生姓名,查找并输出他/她的信息。若无,则提示“无此人”。 c输入一个学生学号,查找并删除文件中他/她的记录。若无,则提示“无此人”。 d增加一个学生信息到记录中,并保持文件中学生记录仍然有序,不可重复。(2)(10分)采用mfc设计开发,提供对话框操作和结果显示界面将获得加分,最高10分。a. txt文件内容如下:(自行下去复制存文件)学号姓名专业数学外语物理20121000265寇明洋111121906874.6 20121000318李智威111121907076.0 20121000588刘国维111121907076.0 20121000727黄道丰11112180596

22、5.3 20121000820许昕恺111121908485.8 20121001032苗云东111121907076.0 20121001136路明明111121856067.5 20121001282钟佳杰111121704049.0 20121001627王擎天111121856268.9 20121001731王程111121907680.2 20121001941唐兴利111121958990.8 20121002029胡一鸣111121907478.8 20121002094郑强111121907579.5 20121002480张彬彬111121856772.4 20121002

23、634胡振洲111121856268.9 20121002879杨磊源111121856571.0 20121002905张国彪111121845060.2 20121003289严泽发111121908083.0 20121003293林腾111121908083.0 20121003371周金满111121908284.4 20121003708蒋承君111121908787.9 20121003837李永昌111121907378.1 20121003845陈宁111121856067.5 20121003910王贤兵111121704854.6 20121004002胡燚1111219

24、68789.7 20121004012邓希帆111121907076.0 20121004026占晶111121856973.8 20121004043张林111121856873.1 20121004132吴鹏111121704049.0 20121004311刘畅111121958487.3 20121004312王帅鑫111121907982.3 20121004437尼玛旦增111121704250.4 20121000455何文斌111122704955.3 20121000613周进南11112220121000687曾航旗111122856973.8 20121000827芮明明

25、111122856067.5 20121000948朱晓迎111122907176.7二.总体分析与设计:(1)设计思想:这是一个学生成绩管理系统,设计到的数据类型比较多,所以,采用结构体和模板来解决数据类型问题。又由于,这是一个小型的管理系统,涉及到的函数内容比较多,考虑到数据的封装问题,所以用类来设计。按题目的要求,这个类需要包含:查找,交换,增加,排序,删除,读写文件等一些函数。先是读出文本a.txt,然后,可进行查找,增加,删除,排序学生信息,最后再写入到b.txt文件中,进行输出。模板 template 结构体: struct mystructvoid swap(t &a,t &b)

26、 int math; t temp; int english temp=a; double phyics; a=b; double score; b=temp; void show(); string xuehao; string name; string zhuanye; (2)设计表示:增加学生信息安全退出系统按姓名查找学生成绩管理系统删除学生信息查找学生信息按学号查找对学生信息排序显示全部学生信息(3)程序主要算法分析:1. void sort()排序函数,采用for循环语句,先按总成绩排序,总成绩相同,则进入第二重for循环,按数学成绩进行排序。判断完后再调用swapall()函数进行

27、两位同学信息的顺序交换。2. int findxinxi()、void nameseek()、void xuehaoseek()查找函数,可分为按名字查找和按学号查找,输入信息后,查找函数会判段所提供的文本中是否有此人的信息,如果有则会把该同学的全部信息输出,没有则会提示“没有此人”。4. void add()增加函数,就是在文本中输入新的学生的信息,保存在所定义的数组mystructc里面即可。5. void delete()删除函数,输入需要删除的学生信息后,会调用查找函数int findxinxi()找寻该同学的信息,找到后,去掉所定义的数组mystructc中该同学所对应的信息,然后,

28、该信息后面的数据存储位置就相应的减一位。6. 读写文件的函数部分,把通过操作后的的数组输出并保存在b.txt中。(4)调试报告:本题最大的问题就是对文件读写代码的使用不够熟练,由于课堂上未做重点学习,临时学习对做题的进度产生了很大的影响。在调试查找函数时,起初,无论是否找到需要查找的那个学生,发现运行后的结果都会出现很多个“亲!没有您要找的人哦。”也就是,即使找到了目标,循环还是会继续,不会随着目标找到而跳出循环。后来,经讨论才发现是因为else if语句的控制区域错误,少加了一对“”。尽管程序基本达到题目所需要求,但还是存在问题。在显示全部学生信息时,出现“0x00429dbc 指令引用的0

29、xdddddad 内存,该内存不能为read”错误。(5)小结:通过本题的学习,对原本不怎么了解的文件读写方面的知识有了更好的了解。同时,又尝试着把类与结构体结合使用,加深了对结构体的认识。另外,通过题中的多重循环的使用,对循环控制范围引起了重视,今后在设计循环结构时会特别注意这个地方。(6)主要函数代码:1.查找函数的代码int findxinxi(string xinxi) for (int i = 0; i c; i+)if ( = message|struct1i.xuehao = message)/找到匹配的人struct1i.show();/显示出找到的信

30、息 return i;else if (i = c - 1)cout 亲!没有您要找的人哦。 endl; cout 按任意键返回主菜单 endl;getch();return 0;2.删除函数的代码void delete() string findnum;cout findnum;int n = findmsg(findnum);/调用查找函数if (n = 0) else int deletenum=0; cout确定要删除吗?endl; cout如果确定请输入1deletenum; if (deletenum = 1)/确认删除 c -= 1;/删除后该数组少一个元素mystruct *s

31、truct2 = new mystructc;/删除后的保存信息数组int i=0;for (int j = 0; j c+1; j+)if(j!=n) struct2i = struct1j;else i-=1;i+;delete struct1;struct1 = struct2;cout 已经成功删除! endl;cout endl;cout 任意键可返回主菜单 endl;getch(); else cout 按任意键可返回主菜单 endl;getch();3.增加函数代码:void add() c += 1;mystruct *struct2 = new mystructc;for (

32、int i = 0; i c - 1; i+)struct2i = struct1i;deletestruct1;cout 请输入增加学生的信息: endl;cout struct2c - 1.xuehao; cout endl;cout struct2c - 1.name; cout endl; cout struct2c - 1.zhuanye; cout endl;cout struct2c - 1.math; cout endl;cout struct2c - 1.english; cout endl;cout struct2c - 1.phyics; cout endl;struct

33、2c - 1.score = struct2c - 1.math + struct2c - 1.english + struct2c - 1.phyics;struct1 = struct2;cout 添加成功! endl;cout endl;cout 按任意键返回主菜单 endl;getch(); 实习题目四:一:问题描述及基本要求: (15分)“火烧连营”是三国演义中的著名典故之一广为流传,假定文本文件c1.txt是火烧连营中的军营分布图,每个字符a代表一个营帐,营帐是可燃物,其他字符代表不可燃的空白地段,文件共有40行70列,请你编写程序,读入该文件的内容,再从键盘输入任意点的x和y值(x70,y40)作为着火点,“火烧连营”后,被燃烧的营帐标上字符x,并把整个结果输出到文件c2.t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论