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<L()<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<L()<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<L()<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<L()<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<L()<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<L()<cout<<"此时三角形周长总和为:
"<cout<<"total=";
cout<:
GetTotals()<cout<<"ot1与ot2进行面积判断:
"<fun(*p1,*p2);
}
voidfun(T