c++实验报告二.docx
- 文档编号:29437311
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:21
- 大小:116.16KB
c++实验报告二.docx
《c++实验报告二.docx》由会员分享,可在线阅读,更多相关《c++实验报告二.docx(21页珍藏版)》请在冰豆网上搜索。
c++实验报告二
实验项目二类对象成员、静态成员和友元
题目:
1.用两点(端点)表示一条直线段
2.输出若干个三角形周长的总和,判断2个三角形的面积大小
题目1:
一、需求分析
1.总体功能
一条线段可以用两个点来表示,从面向对象程序设计的角度看,点是线段的组成部分,于是,点类和线段类之间形成部分——整体关系。
本题目的问题就是如何通过实现部分——整体关系来实现和操作线段类。
自行设计线段类,用两个点对象作为线段的属性。
编写程序,定义两条线段,从键盘输入它们的端点信息,并输出这两条线段,在程序中,显示这两条线段的长度,在程序中,改变这两条线段的长度,改变线段的有关信息从键盘输入,该信息是在原有长度的基础上增加一个增量t并显示改变后的线段长度和线段。
2.输入形式和数据类型
输入形式为坐标点的值,数据类型为double型
3.输出形式
L1:
(a1,b1),(a2,b2)
L2:
(c1,d1),(c2,d2)
4.测试数据
(1).定义的两条线段为L1和L2。
L1:
(19,75),(11,12)L2:
(86,19),(25,01)
(2).改变两条线段的长度增量t=10
二、模块设计
1.本程序中用到的类模型
Point类的模型如下:
属性:
横纵坐标X,Y;
服务:
提供x和提供y,相应函数原型为:
intGetX();和intGetY();
Line类的模型如下:
属性:
两个点对象Pointop1,op2
服务:
查询位置Where函数和求长度length函数
2.本程序中类与类之间的关系,给出类层次结构图
(1)point类与Line类之间是部分——整体关系
3.main函数的流程
构建线段L1
输出两点并输出线段L1长度
改变L1长度
输出L1改变后的位置
输出L1改变后的长度
构建线段L2
输出两点并输出线段L2长度
改变L2长度
输出L2改变后的位置
输出L2改变后的长度
三.详细设计
1.给出模块设计中各类模块的实现算法
(1)Point类的定义与实现
classPoint
{
doubleX,Y;
public:
Point(doublex=0,doubley=0)
{
X=x;
Y=y;
cout<<"ConstructorofPoint."< } doubleGetX(){returnX;} doubleGetY(){returnY;} voidSet(doublex,doubley){X=x;Y=y;} ~Point(){cout<<"DestructorofPoint."< }; (2)Line类的定义与实现 classLine { Pointop1,op2; public: voidWhere(double&x1,double&y1,double&x2,double&y2)//设置点的位置 { op1.Set(x1,y1); op2.Set(x2,y2); x1=op1.GetX(); y1=op1.GetY(); x2=op2.GetX(); y2=op2.GetY(); } doublelength(doublex1,doubley1,doublex2,doubley2)//计算线段长度 { doublel; l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); returnl; } doublelength2(doublex1,doubley1,doublex2,doubley2,doublet)//计算改变后线段长度 { doublel; l=length(x1,y1,x2,y2); l+=t; returnl; } ~Line(){cout<<"DestructorofLine."< }; 2.写出主函数的实现 voidmain() { LineL1,L2; doublex1,y1,x2,y2,t,x,y; cout<<"构建线段L1,请输入L1的两个点: "< cin>>x1>>y1>>x2>>y2; cout<<"线段L1点的位置: "< L1.Where(x1,y1,x2,y2); cout<<"L1: ("< cout<<"L1的长度length="< cout<<"请输入长度增量t: "< cin>>t; cout<<"改变后线段L1点的位置: "< change(x1,y1,x2,y2,t,L1.length(x1,y1,x2,y2),x,y); cout<<"L1: ("< cout<<"改变后的L1的长度length="< cout<<"构建线段L2,请输入L2的两个点: "< cin>>x1>>y1>>x2>>y2; cout<<"线段L2点的位置: "< L2.Where(x1,y1,x2,y2); cout<<"L2: ("< cout<<"L2的长度length="< cout<<"请输入长度增量t: "< cin>>t; cout<<"改变后线段L2点的位置: "< change(x1,y1,x2,y2,t,L2.length(x1,y1,x2,y2),x,y); cout<<"L2: ("< cout<<"改变后的L2的长度length="< } 四.调试分析 一开始出现了很多的错误,看着都让人差点没有信心了,经过检查,发现很多是语法问题和拼写错误。 但是在确定改变线段点的位置时,纠结了很久,在main函数中也是一样,有的地方不知道该怎么写,最后经过多次尝试,终于运行成功了。 五.使用说明 点击运行后,按提示输入数据就可得出答案。 六.测试结果 七.附录(实验源程序) #include #include #include classPoint { doubleX,Y; public: Point(doublex=0,doubley=0) { X=x; Y=y; cout<<"ConstructorofPoint."< } doubleGetX(){returnX;} doubleGetY(){returnY;} voidSet(doublex,doubley){X=x;Y=y;} ~Point(){cout<<"DestructorofPoint."< }; classLine { Pointop1,op2; public: voidWhere(double&x1,double&y1,double&x2,double&y2)//设置点的位置 { op1.Set(x1,y1); op2.Set(x2,y2); x1=op1.GetX(); y1=op1.GetY(); x2=op2.GetX(); y2=op2.GetY(); } doublelength(doublex1,doubley1,doublex2,doubley2)//计算线段长度 { doublel; l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); returnl; } doublelength2(doublex1,doubley1,doublex2,doubley2,doublet)//计算改变后线段长度 { doublel; l=length(x1,y1,x2,y2); l+=t; returnl; } ~Line(){cout<<"DestructorofLine."< }; voidchange(doublex1,doubley1,doublex2,doubley2,doublet,doublel,double&a,double&b) {a=t*(x2-x1)/l+x2;b=t*(y2-y1)/l+y2;}//改变点的位置 voidmain() { LineL1,L2; doublex1,y1,x2,y2,t,x,y; cout<<"构建线段L1,请输入L1的两个点: "< cin>>x1>>y1>>x2>>y2; cout<<"线段L1点的位置: "< L1.Where(x1,y1,x2,y2); cout<<"L1: ("< cout<<"L1的长度length="< cout<<"请输入长度增量t: "< cin>>t; cout<<"改变后线段L1点的位置: "< change(x1,y1,x2,y2,t,L1.length(x1,y1,x2,y2),x,y); cout<<"L1: ("< cout<<"改变后的L1的长度length="< cout<<"构建线段L2,请输入L2的两个点: "< cin>>x1>>y1>>x2>>y2; cout<<"线段L2点的位置: "< L2.Where(x1,y1,x2,y2); cout<<"L2: ("< cout<<"L2的长度length="< cout<<"请输入长度增量t: "< cin>>t; cout<<"改变后线段L2点的位置: "< change(x1,y1,x2,y2,t,L2.length(x1,y1,x2,y2),x,y); cout<<"L2: ("< cout<<"改变后的L2的长度length="< 题目2: 一、需求分析 1.总体功能 本题目的问题是,如何利用静态成员机制,求得若干个三角形周长的总和以及如何利用友元,使三角形的用户——面积判断模块能访问三角形的私有成员。 要求学生自行设计三角形类模型,确定属性和服务,编写程序,定义若干个三角形,从键盘输入与它们的属性有关的数据,并输出这些三角形即其周长。 输入的数据是三角形的三边信息,程序中要能判断输入数据的合法性。 同时在程序中,判断这些三角形其中的2个的面积大小,并输出判断结果。 2.输入形式和数据类型 输入三角形三边长,数据类型为double型。 3.输出形式 输出这些个三角形周长的总和S,类型为double型。 判断这些三角形其中的2个的面积大小,并输出判断结果。 结果用如下形式: 三角形1=或者<或者>三角形2 4.测试数据 1.三角形的个数定为3个: ot1,ot2和ot3 2.三个三角形的三边数据分别为: ot1: 3,4,5ot2: 6,7,8ot3: 2,8,12 二、模块设计 1.本程序中用到的类模型 Triangle类的模型如下: 属性: 三边边长及周长a,b,c,l,和一个静态成员周长总和totals 服务: 一个构造函数,一个静态成员函数,一个友元函数 2.main函数的流程 计算初始周长总和 输入ot1的三边,计算其周长 计算此时周长总和 输入ot2的三边,计算其周长 计算此时周长总和 输入ot3的三边,计算其周长 计算此时周长总和 比较ot1和ot2的面积大小 三.详细设计 1.给出模块设计中各类模块的实现算法 classTriangle { doublea,b,c,l; doublearea; staticdoubleTotals;//将Totals定义为Triangle的静态数据成员 public: Triangle(doublea,doubleb,doublec) { l=a+b+c; Totals+=l; area=sqrt((l/2)*((l/2)-a)*((l/2)-b)*((l/2)-c)); } doubleL() {returnl;} doubleArea() {returnarea;} staticdoubleGetTotals()//GetTotals为类Triangle的静态成员函数 {returnTotals;} //frienddoubleArea(Triangle&t); friendvoidfun(Triangle&a,Triangle&b);//声明函数fun为本类的友元函数 }; 2.写出主函数的实现 voidmain() { doublea,b,c; cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot1三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p1; p1=(newTriangle(a,b,c)); cout<<"ot1的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot2三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p2; p2=(newTriangle(a,b,c)); cout<<"ot2的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot3三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p3; p3=(newTriangle(a,b,c)); cout<<"ot3的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"ot1与ot2进行面积判断: "< fun(*p1,*p2); } 四.调试分析 对于这个程序,我最大的问题就是友元函数和静态成员函数的运用上,对于这两个问题真的不是很了解,同时就面积的算法来说,确实很纠结,一开始怎么都不能运行通过,根据提示检查了很久都找不出问题,最后还是在看书过后才修改正确。 但是在计算面积时,最后能运行,但是第二个面积一直都运行错误,,然后发现当面积为整数时不会出错,但是一旦出现小数就会出错,所以我就把所有数据类型全部改为double型,就算出了正确的面积。 五.使用说明 只要根据提示输入数据就可运行成功。 六.测试结果 七.附录(实验源程序) #include #include #include classTriangle { doublea,b,c,l; doublearea; staticdoubleTotals;//将Totals定义为Triangle的静态数据成员 public: Triangle(doublea,doubleb,doublec) { l=a+b+c; Totals+=l; area=sqrt((l/2)*((l/2)-a)*((l/2)-b)*((l/2)-c)); } doubleL() {returnl;} doubleArea() {returnarea;} staticdoubleGetTotals()//GetTotals为类Triangle的静态成员函数 {returnTotals;} //frienddoubleArea(Triangle&t); friendvoidfun(Triangle&a,Triangle&b);//声明函数fun为本类的友元函数 }; doubleTriangle: : Totals=0;//使用类名限定A: : 对静态数据成员进行定义,并进行初始化 voidmain() { doublea,b,c; cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot1三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p1; p1=(newTriangle(a,b,c)); cout<<"ot1的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot2三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p2; p2=(newTriangle(a,b,c)); cout<<"ot2的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"输入ot3三边边长: "< do {cin>>a>>b>>c; if(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)) { cout<<"dataerror! \n"; cout<<"请重新输入数据: "< } }while(! ((a+b)>c)||! ((a+c)>b)||! ((b+c)>a)); Triangle*p3; p3=(newTriangle(a,b,c)); cout<<"ot3的周长为: "< cout<<"l="; cout< cout<<"此时三角形周长总和为: "< cout<<"total="; cout< : GetTotals()< cout<<"ot1与ot2进行面积判断: "< fun(*p1,*p2); } voidfun(T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 实验 报告