C++面向对象程序设计的大作业计算两点之间的距离.docx
《C++面向对象程序设计的大作业计算两点之间的距离.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计的大作业计算两点之间的距离.docx(15页珍藏版)》请在冰点文库上搜索。
C++面向对象程序设计的大作业计算两点之间的距离
武汉轻工大学
面向对象程序设计期末大作业
专业:
电子信息科学与技术
班级:
电信产业1301班
学号:
1304100025
姓名:
肖梦
1目的与要求
学生能够比较熟练地掌握C++语言的基本语法规则;熟练掌握基本的面向对象的程序设计方法,如类的实现、创建类的实例—对象、实现类的继承等;掌握各种面向对象的程序设计技术,如继承和派生,虚继承、虚函数、抽象类、多态的实现等。
掌握在VC++平台上进行程序设计和调试的方法。
学生利用学到的面向对象的基本原理和C++语言语法以及编程技巧,通过灵活应用VisualC++6.0集成开发环境进行应用程序和系统的开发设计,掌握可视化程序设计的基本方法和步骤,强化巩固已有编程知识,训练新的设计与编程思路,帮助熟悉程序编写,及时查究错误。
要求学生独立完成完整的用C++语言编写的应用程序,以全面掌握C++面向对象程序设计的基础知识。
2设计内容
2.1计算两点之间的距离
用类实现计算两点之间的距离。
(可以定义点类(Point),再定义一个类(Distance)描述两点之间的距离,其数据成员为两个点类对象,两点之间距离的计算可设计由构造函数来实现。
)
2.1.1程序设计方案和原理
根据题目要求本题可以用类的组合来实现。
我们可以用一个point类来描述平面上点的的坐标,然后为Distance类添加一个Point类的对象作为其数据成员,用来计算两个点之间的距离。
ycord
2.1.2程序的代码实现
#include
#include
classPoint//定义Point类
{
public:
Point(inta=0,intb=0)
{
x=a;
y=b;
}
intxcord()
{
returnx;
}
intycord()
{
returny;
}
private:
intx,y;
};
classDistance//定义Distance类作为容器类
{
public:
Distance(Pointq1,Pointq2);
floatgetdist()
{
returndist;
}
private:
Pointp1,p2;//p1,p2是类嵌对象
floatdist;
};
Distance:
:
Distance(Pointq1,Pointq2):
p1(q1),p2(q2)/*Distance类的构造函数通过初始化列表向
类嵌对象的构造函数赋值*/
{
floatx=float(p1.xcord()-p2.xcord());
floaty=float(p1.ycord()-p2.ycord());
dist=sqrt(x*x+y*y);//两点间距离
}
voidmain()
{
Pointp(0,0),q(1,1);//创建Point类对象
Distancedis(p,q);//创建Distance类对象
cout<<"Thedistanceis:
"<}
Distance类为容器类,包含Point类的内嵌对象q1和q2,Distance类的构造函数通过初始化列表向Point类的构造函数传递参数。
2.1.3程序运行效果
程序对(0,0)、(1,1)两点间的距离进行计算,结果为1.41421.
2.2类的应用
一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。
栅栏价格为35元/米,过道造价为20元/平方米。
过道宽度为3米,游泳池半径由键盘输入。
要求编程计算并输出过道和栅栏的造价。
2.2.1程序设计方案和原理
先定义PI、栅栏和过道造价等常量,创建一个Circle类,通过类的面积和周长的成员函求出过道的面积和周长,最后乘以造价得到所需的造价。
2.2.2程序的代码实现
#include
usingnamespacestd;
constfloatPI=3.14159;
constfloatFencePrice=35;
constfloatConcretePrice=20;
//声明类Circle及其数据成员和成员函数
classCircle
{
private:
floatradius;
public:
Circle(floatr);//声明带参构造函数
floatCircumference()const;//圆周长
floatArea()const;//圆面积
};
//构造函数初始化数据成员radius
Circle:
:
Circle(floatr)
{radius=r;}
//计算圆的周长
floatCircle:
:
Circumference()const
{
return2*PI*radius;
}
//计算圆的面积
floatCircle:
:
Area()const
{
returnPI*radius*radius;
}
voidmain()
{
floatradius;
floatFenceCost,ConcreteCost;
cout<<"Entertheradiusofthepool:
";
cin>>radius;
//声明Circle对象
CirclePool(radius);
CirclePoolRim(radius+3);
//计算栅栏造价并输出
FenceCost=PoolRim.Circumference()*FencePrice;
cout<<"FencingCostis¥"<//计算过道造价并输出
ConcreteCost=(PoolRim.Area()-Pool.Area())*ConcretePrice;
cout<<"ConcreteCostis¥"<}
利用类中的Circumference()成员函数来计算周长,用PoolRim.Area()-Pool.Area()来计算过道的面积,再算出造价。
2.2.3程序运行效果
输入池子的半径为10米,得出栅栏和过道造价分别为2858.85和4335.39。
2.3虚基类应用
设计一个虚基类Person,包含姓名和年龄私有数据成员以及相关的成员函数;由它派生出领导类Leader,包含职务和部门私有数据成员以及相关的成员函数;再由Person派生出工程师类Engineer,包含职务和专业私有数据成员以及相关的成员函数;再由Leader和Engineer类派生出主任工程师类Chairman。
并采用相关数据进行测试。
2.3.1程序设计方案和原理
2.3.2程序的代码实现
#include
#include
classPerson
{
private:
charname[20];
intage;
public:
Person(char*n,inta);//声明带参的构造函数
char*getname();
intgetage();
};
classLeader:
virtualpublicPerson//Person是虚基类
{
private:
charjob[20];
chardep[20];
public:
Leader(char*jb,char*dp);
char*getjob();
char*getdep();
};
classEngineer:
virtualpublicPerson//Person是虚基类
{
private:
charmajor[20];
charprof[20];
public:
Engineer(char*maj,char*pf);
char*getprof();
char*getmajor();
};
classChairman:
publicLeader,publicEngineer//Chairman是虚基类Person的间接派生类
{
public:
Chairman(char*n,inta,char*job,char*dp,char*maj,char*pf);
voiddisp();
};
Person:
:
Person(char*n,inta)
{
strcpy(name,n);
age=a;
}
char*Person:
:
getname()
{
returnname;
}
intPerson:
:
getage()
{
returnage;
}
Leader:
:
Leader(char*jb,char*dp):
Person("",20)
{
strcpy(job,jb);
strcpy(dep,dp);
}
char*Leader:
:
getjob()
{
returnjob;
}
char*Leader:
:
getdep()
{
returndep;
}
Engineer:
:
Engineer(char*maj,char*pf):
Person("",30)
{
strcpy(major,maj);
strcpy(prof,pf);
}
char*Engineer:
:
getmajor()
{
returnmajor;
}
char*Engineer:
:
getprof()
{
returnprof;
}
Chairman:
:
Chairman(char*n,inta,char*jb,char*dp,char*maj,char*pf):
Person(n,a),Leader(jb,dp),Engineer(maj,pf)
{}
voidChairman:
:
disp()
{
cout<<"姓名:
"<"<"<"<"<"<}
voidmain()
{
cout<<"请分别输入:
"<<"姓名:
"<<'\t'<<"年龄:
"<<'\t'<<"职务:
"<<'\t'<<"部门:
"<<'\t'<<"专业:
"<<'\t'<<"职称:
"<charname[20];
intage;
charjob[20];
chardep[20];
charmajor[20];
charprof[20];
cin>>name;
cin>>age;
cin>>job;
cin>>dep;
cin>>major;
cin>>prof;
Chairmanc(name,age,job,dep,major,prof);
c.disp();
}
2.3.3程序运行效果
3总结
1.在计算两点间的距离时,直接开方和乘方时出错。
解决方法:
加上math头文件。
2.在对类的继承相关程序进行编程时,感觉类之间的关系非常混乱。
解决方法:
先在构思出大致的框架,理清类与类之间的关系,再进行编程。
3.在对用户自己输入信息这部分进行编程时,如果全部用指针和数组来实现,程序会变得比较复杂。
解决方法:
利用string头文件里面的strcpy等函数来实现,使程序更加简洁。
通过本次大作业,使我对c++编程有了更深的了解,它具有更好的模块化,更高级的抽象性,更好的代码可重用性,巩固了我对OOP的掌握和对类等知识点的掌握。
今后还需要更多的练习,才能更好的使用c++这一语言来解决问题。
《面向对象程序设计》期末大作业评分表
学生姓名
肖梦
班级
电产1301
学号
1304100025
评分项目
评分档次及分值
评分
分值
A
B
C
D
E
基础知识
10
10
9
8
7
<6
实践操作
10
10
9
8
7
<6
分析与设计
30
30
27
24
21
<18
代码质量
30
30
27
24
21
<18
答辩水平
10
10
9
8
7
<6
文档撰写
10
10
9
8
7
<6
总分