c++实验报告二.docx

上传人:b****8 文档编号:29437311 上传时间:2023-07-23 格式:DOCX 页数:21 大小:116.16KB
下载 相关 举报
c++实验报告二.docx_第1页
第1页 / 共21页
c++实验报告二.docx_第2页
第2页 / 共21页
c++实验报告二.docx_第3页
第3页 / 共21页
c++实验报告二.docx_第4页
第4页 / 共21页
c++实验报告二.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

c++实验报告二.docx

《c++实验报告二.docx》由会员分享,可在线阅读,更多相关《c++实验报告二.docx(21页珍藏版)》请在冰豆网上搜索。

c++实验报告二.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

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

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