C++实习报告(字政专)

版主: 清风云想衣裳宁静致远

回复
云想衣裳
帖子: 5724
注册时间: 周日 10月 25, 2009 9:06 am

RE:C++实习报告(字政专)

帖子 云想衣裳 »

非常严实的实习报告,看得出作者花了很多的精力,也能感知老师对于学生教之有方的结晶。挺好的!加油!
紫藤花
帖子: 932
注册时间: 周六 4月 25, 2009 1:36 pm

RE:C++实习报告(字政专)

帖子 紫藤花 »

Quote引用ID编号为35834,称呼为云想衣裳于2010-12-20 18:14:01发表的 :非常严实的实习报告,看得出作者花了很多的精力,..
衣裳说的对,加油,加油!
何方86
帖子: 989
注册时间: 周五 8月 01, 2008 9:06 am

RE:C++实习报告(字政专)

帖子 何方86 »

功夫不负有心人,非常严实的实习报告。
字政专
帖子: 4
注册时间: 周四 2月 10, 2011 7:06 am

C++实习报告(字政专)

帖子 字政专 »



C++实习报告

作者:字政专//编辑:云想衣裳























《面向对象程序设计》课程设计报告
学 号: 20091002549 班级序号: 114093 07 姓 名: 字政专 指导老师: 万波 成 绩:
中国地质大学(武汉)信息工程学院空间信息工程系2010年6月

目录 《面向对象程序设计》课程设计报告封面 1 实习任务--预备任务 3 实习任务一 5 实习任务二 8 实习任务三 14 实习任务四 16 实习任务五 18 实习任务六 21 总 结 24



说明1. 本次实习的程序中代码太多,如果全部写在报告文档中就会占去很多页面,而且是一种不必要的浪费,如任务一到任务四中很多代码是一样的,因此实习报告只有一些难理解,容易产生歧义的,以及一些完成主要运算的代码,一些常规的及前一个任务中说到了的就不再重复写。2. 在实习程序中文件命名规律为:预备任务为try1,任务一为:work1_try2, 任务二为:work2_try3,以此类推,到任务六为:work6_try7,这样命名易于直接查找文件,避免文件名称混乱。文件名和工程名完全相互对应。3. 实习报告中有多个截图,任务一中最多(有一页全为图片),目的是为了表示真实的运行界面,以及数据,同时任务二到四的界面与任务一相近,重复部分不再重写。4. 每个任务的附录中都给出了部分程序代码解释,都是该程序中有代表性的语句,其余的语句在源程序中也有部分解释。5. 目录是通过插入--引用--索引和目录--目录生成的,在大纲中每个任务的名字前都在"段落"上定义为第1级别,word文档中可以直接跳到任意一个任务。 实习任务--预备任务【需求规格说明】在Visual Studio2005中创建MFC基本框架,添加菜单,添加菜单处理函数,增加自己的类,复习调试技术。
【算法设计】(1)设计思想: 这个任务的目的是熟悉MFC的编程环境,学会新建MFC项目,给自定义菜单添加响应函数,添加包含自定义文件#ifndef/define/endif结构产生预处理块来防止头文件重复包含,以及相应调试技巧。根据题目要求,按照上机指南完成该项任务。(2)设计表示:这个任务从新建一个MFC工程开始,根据上课时讲授的内容和上机指南完成了这项任务,自定义菜单建立类向导时修改了ID,这样便于查找和添加响应函数。程序中自定义类型只有CPoint一个类,添加这个自定义类时,上机指南上告诉我们在源文件文件夹上击右键添加,但是这种方法在写.CPP文件时就会缺少cpp文件必须包含的预编译指令#include"stdafx.h",在.h文件中则没有宏定义,所以每次加新文件时都要重复写相同的内容,如果这种方法是为了添加一个类,则直接在class类文件夹下NEW一个generic class,(类名前应加一个大写C),这样就不用写宏定义和无参数构造函数及析构函数,节约时间。在resource中添加的菜单及对话框要起作用则必须有响应函数,题目中要求用AfxMessageBox()函数显示出函数运行结果,可以直接给一个字符串,也可以给一个变量或对象(一般要用sprintf()进行,字符串转换),他可以在任何一个.cpp文件下使用,如果在view.cpp下些可以用CDC类或CclintDC类的指针调用txtout(),将内容直接显示在屏幕上。
【调试报告】 调试过程中出现某个类的声明有误或者头文件打不开,主要是大小写的错误,中英符号交替,还有,用NEW Class 定义新类时类名加了C,但是头文件上没有,出现类没定义或头文件打不开的几率很大。
【附录】1、 主要代码为:class point //类的声明部分{public: //公有成员函数 piont(); point (int x,int y); ~point(){} int GetX(); int GetY(); void SetX(int x); void SetY(int y);private: //私有变量 int m_x; int m_y;};Cpp中主要代码为:point::point(int x ,int y){ m_x=x; m_y=y;}int point::GetX() //获取横坐标x的值{ return m_x;}int point::GetY()//获取纵坐标y的值{ return m_y;}void point::SetX(int x){ m_x=x;}void point::SetY(int y){ m_y=y;}在View中的代码为:void CCtry1View::OnMenuitem32771() //阴影部分是函数名,由于没改ID,所以函数名为系统分配。{ // TODO: Add your command handler code here AfxMessageBox("这是我做的菜单");//显示这是我做的菜单 point p(100,40); //定义一个point的对象,用于初始化point类 char coord[30]; //定义一个容量为30字节的字符数组 sprintf(coord,"X:%d,Y:%d",p.GetX(),p.GetY()); //转换数据格式,同时定义输出形式。 AfxMessageBox(coord); // 显示coord中的内容。
}2.运行结果为:这是我做的菜单 X: 100 ,Y:40
实习任务一【需求规格说明】通过预备任务,重新编写基本类(点类)编写矩形类,三角形,圆形类,正方形类,图形类(Graph)。使用点类做为坐标的类型,每个具体图形的类需要有计算面积、计算周长,绘画自己(draw)等成员函数。draw函数弹出一个对话框,显示自己的形状,并显示出坐标即可;除了缺省构造函数外,添加能够直接定义矩形的带参数的构造函数;添加一个新菜单,在菜单处理函数中创建一个具体的图形对象,调用该对象的几个方法,弹出对话框显示结果。【算法设计】(1)设计思想: 建立一个新的MFC工程,命名为work1_try2,新写好基本类point类,在菜单中除了添加msg外再加一个图形菜单,包含矩形,三角新,正方形,圆形和Graph五个子选项,graph类中包含前面四个具体图形,用于计算所有图形的周长和面积。建立相对应的类向导,用对应图形的英文名做ID;矩形类,按照上机指南编写,三角形(用三个定点坐标标识三角形),圆形类(用圆心、半径表示圆),正方形类(用一个定点加上宽度标识正方形),图形类(Graph)(把图形类考虑为一张画,画里面有一个圆,一个矩形,一个正方形,一个三角形。把这几个形状做为图形类的私有成员变量,通过构造函数或者set函数设置进来,然后利用这些变量实现计算总面积、计算总周长、绘画等功能)。 定义point p1(x1,y1),p2(x2,y2) , p3(x3,y3)三个对象,p1,p2,p3三个对象就可以直接用于确定这些图形,每个具体图形类定义时包含point的.h文件,就可用const point &p 方式进行参数传递,例如用p1和p2确定矩形,则四个点的坐标为(x1,y1)(x1,y2)(x2,y1)(x2,y2)。长为:| x1 - x2 | 宽为:| y1 - y2 | ;实现周长,面积等的计算时,计算长和宽时有时结果会是负的,应该用一个条件判断语句使其返回值始终为正。用相应的公式表示即可,计算总面积,总周长时,用相应对象调用对应函数,对返回值求和,就能算出所求数据。在三角形中用到圆周率3.14159,就将他定义为常量,三角形中需开平方根,包含标准库头文件#include就可直接用sqrt();(2)设计表示:这个工程中共有六个自定义类,也就是有六个模块,其中点类是基础类,点的坐标值全部是int型数字,关系如图:






后面的五个模块都有计算面积,周长,还有显示图形属性的函数,每个图形的计算方法都写在相应的.cpp文件下,调用顺序在wive中和菜单决定。具体代码及解释见附录。【调试报告】 编译时出现错误最多的是文件打不开,或者提示某个类没定义,这类问题首先是查看头文件的拼写有没有错,让后检查累的声明是否有错误,这两步都通过是可以rebuild整个工程,这上述问题可以解决,而警告最多的是数据类型不同一,如定义圆形时,圆心和半径都是整形的,但计算周长和面积是引入了圆周率,结果是浮点数,如不进行数据类型同一就会有数据丢失,使运算结果不正确。我的解决方式是在函数体中进行数据类型强制转换。这样做也有数据丢失,没有找到更好的解决办法,举行和正方形的面积和周长的计算法一样(周长=2*(长+宽),面积=(长*宽)),三角形的面积和周长计算要先算出三条边的长,面积为周长的一半,设三角形三个点为A(x1,y1),B(x2,y2),C(x3,y3),AB间的距离就为:同理其它边长就能求出,圆形只要知道半径的大小就可出求周长面积。 在定义三角形时,自己的三角形只能是直角三角形,因为不知道任意三角形的面积怎样求,此外,菜单中每个选项的响应函数都写在view.cpp下,使用同一个对象时,每个函数体内重新写类和对象显得重复,而且很容易出错,分不清数据来源,经多次尝试后,发现可以将,所要用到的类的对象全部定义在函数体外(预编译指令写完之后直接定义对象),这样不论添加多少函数都不用再次定义对象(除非需要改变调用方式),修改数值也很方便。Sprintf()中%d和%f是指转换为该类型,同时确定输出格式,但是输出后明显是一个随机值,调试没有错误,编译能通过,改变数组的大小有是可以解决,但不知道什么原因。
【附录】1. 部分函数的代码及其解释:const float Pi=3.14;//声明一个常量pi,值为3.14float Circle::GetArea(){ float area; area=Pi*(m_R*m_R);//计算圆形的面积,半径的平方乘以圆周率,平方也可以用pow(); return area;}float Circle::GetPerimeter(){ float perimeter; perimeter=Pi*m_R*2;//计算圆的周长:圆周率乘以直径 return perimeter;}void Circle::draw()//这是一个画图函数,在这里只实现相关信息的只弹出相关信息{ char Circle[100]; sprintf(Circle,"这是一个圆形,圆心坐标为 A:%d,%d,半径为:%f",m_Centercircle.GetX(),m_Centercircle.GetY(),m_R); AfxMessageBox(Circle);//运行到这个地方时,就会向错误提示一样,显示coord数组中的信息。} 下面是graph类的声明部分,参数传递全为const 类 &对象 的方式 也就是包含四个图形class CGraph {public: CGraph(); virtual ~CGraph(); CGraph(const Rect &rect,const Triangle &trg,const Circle &circle,const Square &squ); float getTotolArea(); float getTotolPerimeter(); void draw();private: Rect m_rect; Triangle trg; Circle circle; Square squ;
};double Triangle::getArea()//这个函数用字于计算三角形的面积{double a,b,c,Area;a=(m_Left.GetX()-m_Top.GetX())*(m_Left.GetX()-m_Top.GetX())+ (m_Left.GetY()-m_Top.GetY())*(m_Left.GetY()-m_Top.GetY());//a=(x2 - x1)2+(y2 - y1)2b=(m_Right.GetX()-m_Top.GetX())*(m_Right.GetX()-m_Top.GetX())+ (m_Right.GetY()-m_Top.GetY())*(m_Right.GetY()-m_Top.GetY());//a=(x3 - x2)2+(y3 - y2)2c=(m_Right.GetX()-m_Left.GetX())*(m_Right.GetX()-m_Left.GetX())+ (m_Right.GetY()-m_Left.GetY())*(m_Right.GetY()-m_Left.GetY());//a=(x3 - x1)2+(y3 - y1)2Area=(sqrt(a)+sqrt(b)+sqrt(c))/2;//政三角形的面积为周长的一半return Area; //返回三角形的面积}//view.cpp中Graph类的一个command型函数,单击菜单时调用void CWork1_try2View::OnGraph() { // TODO: Add your command handler code here point p1(10,10),p2(30,30),p3(40,40); //定义个个类的对象 char coord[40]; Rect r(p1,p2); Triangle trg(p1,p2,p3); Circle circle(p1,4); Square squ(p1,40); CGraph sgp(r,trg,circle,squ);//定义Graph的对象 sprintf(coord,"CgraohTotolArea:%f,TotolPerimeter:%f",sgp.getTotolArea(),sgp.getTotolPerimeter()); AfxMessageBox(coord);//输出所有图形的面积和周长 sgp.draw(); //专调用Graph里的draw函数}
2.测试数据和运行结果: 测试数据: point p1(10,10),p2(30,30),p3(40,40); Rect r(p1,p2); Triangle trg(p1,p2,p3); Circle circle(p1,4); Square squ(p1,40); CGraph sgp(r,trg,circle,squ); 运行结果:实际运行结果如下图片,任务一到四的界面都相似,以后不再给出完整运行界面: SPAN lang=EN-US style="FONT-SIZE: 15pt; COLOR: white; mso-fareast-font-family: 楷体_GB2312; mso-ascii-font-f
回复