1、 院 系: 数学与记录学学院 专 业: 信息与计算科学 年 级: 2023 课程名称: 面向对象程序设计 学 号: 姓 名: 指导教师: 2023年 11 月 日 年级 2023 班号 2 组号 17 学号 专业 信息与计算科学 姓名 实验名称 类和对象 实验室 实
2、验 目 的 或 要 求 1.掌握类的定义和使用方法,掌握类对象的声明和使用方法。 2.掌握对象的初始化和赋值的方法。 3.了解成员函数的特性、友元。 4.静态成员的使用方法。 5.理解和掌握this指针的用法。 6.理解和掌握const类型数据的使用。 实 验 原 理 ( 算 法 流 程 ) 1、实验内容 2、类的设计及说明 定义一个描述学生(Student)基本情况的类,数据成员涉及姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(
3、mathTotalScore)和英语总成绩(englishTotalScore)。其中姓名定义为长度为18的字符数组,其它数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员,函数成员涉及构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数,数学总成绩,英语总成绩;规定所有数据成员为private访问权限,所有成员函数为public访问
4、权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。 组内分工 (选) 无 实 验 结 果 分 析 及 心 得 体 会 根据题目的规定,成功的定义一个描述学生(Student)基本情况的类,数据成员涉及姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(mathTotalScore)和英语总成绩(englishTotalScore)。其中姓名定义为长度为18的字符数组,其它数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员
5、函数成员涉及构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数,数学总成绩,英语总成绩;规定所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。 成 绩 评 定 教师署名:
6、 年 月 日
源代码如下:
#include
7、d) { name = a; num = b; mathScore = c; englishSorce = d; count++; mathTotalSorcce += c; englishTotalSorce += d; } void ShowBase() { cout << "姓名:" << name << endl; cout << "学号:" << num<< endl; cout << "数学成绩:" << mathScore << endl; cout << "英语成绩:" << englishSorce << endl << endl
8、 } void ShowStatic() { cout << "人数:" << count << endl; cout << "数学总成绩:" << mathTotalSorcce << endl; cout << "英语总成绩:" << englishTotalSorce << endl; } }; int Student::count = 0; int Student::mathTotalSorcce = 0; int Student::englishTotalSorce = 0; void main() { Student a("师兄"
9、80,85); Student b("师弟",, 73, 63); a.ShowBase(); b.ShowBase(); b.ShowStatic(); system("pause"); } 年级 2023 班号 2 组号 17 学号 专业 信息与计算科学 姓名 实验名称 继承与派生 实验室 实 验 原 理 ( 算 法 流 程 ) 1、实验内容 2、类的设计及说明 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Salem
10、an(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继承关系如图1.2所示。 图2.2 各类之间的继承关系 规定: (1)在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManag
11、er类中不包含其它数据成员。 (2)各类人员的实发工资公式如下: 员工实发工资 = 基本工资 + 奖金 * 出勤率 销售员实发工资 = 基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例 经理实发工资 = 基本工资 + 奖金 * 出勤率 + 总销售额 * 经理提成比例 销售经理实发工资 =基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例+ 总销售额 * 经理提成比例 (3)每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 (写不完时,可另加附页。) 实 验 目 的 或 要 求
12、 1.纯熟掌握类的继承,可以定义和使用类的继承关系。 2.掌握派生类的声明与实现方法。 3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。 4.理解虚基类在解决二义性问题中的作用。 组 内 分 工 ( 可 选 ) 无 实 验 结 果 分 析 及 心 得 体 会 根据规定,成功的定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继承关系。 成
13、
绩
评
定
教师署名:
年 月 日
源代码如下:
// 文献名: main.cpp
#include
14、// 姓名 double basicSalary; //基本工资 double prize; //奖金 double rateOfAttend; public: // 公有函数: Staff(int n, char nm[], double bs,double p,double r): // 构造函数 num(n),basicSalary(bs),prize(p),rateOfAttend(r){strcpy(name, nm);} voi
15、d Show() const // 显示相关信息 { cout << "编号:" << num << endl; // 显示编号 cout << "姓名:" << name << endl; // 显示姓名 cout << "基本工资:" << basicSalary << "元" << endl; // 显示基本工资 cout << "奖金:" << prize << "元" << endl; // 显示奖金 cout << "出勤率:" << rateOfAttend << "元" << endl; } void ShowSalary
16、) const // 输出实发工资 { cout<<"实发工资:"<< basicSalary+prize*rateOfAttend<< "元" << endl; } }; // 生明销售员类 class Saleman: virtual public Staff { protected: // 保护成员: double deductRate; //销售提成比例 double personAmount; //个人销售额 public: // 公有函数:
17、 Saleman(int n, char nm[], double bs,double p,double d,double pa,double r): Staff(n, nm, bs,p,r),deductRate(d),personAmount(pa){} void Show() const // 显示相关信息 { Staff::Show(); // 调用基类函数Show() cout << "销售员提成比例:" << deductRate << endl; // 显示销售员提成比例 cout << "个人销售额:" << person
18、Amount << "元" < 19、 double tatalAmount; //总销售额
public:
// 公有函数:
Manager(int n, char nm[], double bs,double p,double td,double ta,double r):
Staff(n, nm, bs,p,r),tatalDeductRate(td),tatalAmount(ta){}
void Show() const // 显示相关信息
{
Staff::Show(); // 调用基类函数Show()
cout << "经理提成比 20、例:" << tatalDeductRate << endl; // 显示经理提成比例
cout << "总销售额:" << tatalAmount << "元" < 21、 Manager
{
public:
// 公有函数:
SaleManager(int n, char nm[], double bs,double p,double d,double pa,double td,double ta,double r): //构造函数
Staff(n,nm,bs,p,r), Saleman(n,nm, bs, p ,d, pa,r), Manager(n,nm, bs, p , td, ta,r){}
void Show() const // 显示相关信息
{
Staff::Show(); // 调用基类 22、函数Show()
cout << "销售员提成比例:" << deductRate << endl; // 显示销售员提成比例
cout << "个人销售额:" << personAmount << "元" < 23、sicSalary+prize*rateOfAttend+deductRate*personAmount+tatalDeductRate*tatalAmount<< "元" < 24、ShowSalary(); //输出实发工资
Saleman s(108,"周杰", 2680,1680,0.15,23000,0.8); // 定义对象
cout<< endl<<"销售员信息:"<< endl; //输出提醒
s.Show(); //输出基本信息
s.ShowSalary(); //输出实发工资
Manager 25、 m(116,"李靖", 3680, 2680, 0.1, 83000,0.7); // 定义对象
cout<< endl<<"经理信息:"<< endl; //输出提醒
m.Show(); //输出基本信息
m.ShowSalary(); //输出实发工资
SaleManager sm(118,"吴姐", 3680, 2680, 0.15, 28000, 0.1,88000,0.6); // 定义对象
26、cout<< endl<<"销售经理信息:"<< endl; //输出提醒
sm.Show(); //输出基本信息
sm.ShowSalary(); //输出实发工资
system("PAUSE"); // 调用库函数system( ),输出系统提醒信息
return 0; // 返回值0, 返回操作系统
}
年级
2023
班 27、号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
函数重载与运算符重载
实验室
实
验
目
的
或
要
求
1.学习函数和操作符重载的使用方法。
2.理解函数和运算符重载的作用和意义。
3.掌握类运算符和友元运算符重载的定义和使用。
4.掌握常用运算符的重载。
实
验
原
理
(
算
法
流
程
)
设计一个时间类Time,规定:
(1)包含时(hour)、分(minute)和秒(second)私有数据成员。
(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间 28、减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。
组内
分工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:1.学习函数和操作符重载的使用方法。2.理解函数和运算符重载的作用和意义。3.掌握类运算符和友元运算符重载的定义和使用。4.掌握常用运算符的重载。设计一个时间类Time,并且(1)包含时(hour)、分(minute)和秒(second)私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>> 29、等。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
#include 30、SetHour(int hh){hour=hh;}
void SetMinute(int mm){minute=mm;}
void SetSecond(int ss){second=ss;}
int GetHour() const{return hour;}
int GetMinute() const{return minute;}
int GetSecond() const{return second;}
Time operator+(int seconds);
Time operator-(int seconds 31、);
static int TimeToNum(const Time &ss);
static Time NumToTime(int n);
};
ostream &operator<<(ostream &out,const Time &ss);
istream &operator>>(istream &in,Time &ss);
Time Time::operator+(int seconds)
{
int n=TimeToNum(*this)+seconds;
return NumToTime(n);
}
32、
Time Time::operator-(int seconds)
{
int n=TimeToNum(*this)-seconds;
return NumToTime(n);
}
int Time::TimeToNum(const Time &ss)
{
int n=0;
n+=ss.GetHour()*3600;
n+=ss.GetMinute()*60;
n+=ss.GetSecond();
return n;
}
Time Time::NumToTime(int n)
{
int hh, 33、mm,ss;
hh=n/3600;
mm=(n-hh*3600)/60;
ss=n%60;
return Time(hh,mm,ss);
}
ostream &operator<<(ostream &out,const Time &ss)
{
out< 34、t hour,minute,second;
cin>>hour>>minute>>second;
ss=Time(hour,minute,second);
return in;
}
int main(void)
{
Time ss(17,27,30);
cout<<"时间"< 35、
cout<<"时间:"< 36、由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)和Square 正止方形),用函数函数ShowArea()分别显示各种图形的面积,最后还要显示所有图形的总面积。规定用基类指针数组,使它的每一个元素指向一一个派生类对象。
组
内
分
工
(可
选)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:1.掌握虚函数的作用、定义和用途。 2.掌握纯虚函数的作用、定义和使用。3.理解使用虚函数和继承实现多态性。并且编写程序,定义抽象基类Shape(形状),由它派生出3个派生类: Circle(圆形)、Rect 37、angle(矩形)和Square 正止方形),用函数函数ShowArea()分别显示各种图形的面积,最后还要显示所有图形的总面积。规定用基类指针数组,使它的每一个元素指向一一个派生类对象。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
// 文献名: main.cpp
#include 38、 PI = 3.1415926; // 常量PI
// 形状类
class Shape
{
public:
// 公有成员:
virtual void ShowArea() const = 0; // 纯虚函数
static double sum; // 静态数据成员
};
// 形状类
// 圆形类
class Circle: public Shape
{
private:
// 数据成员:
double radius; // 半径
public:
// 公有函数:
Circle(double r): radius 39、r) // 构造函数
{ sum += PI * radius * radius; }
void ShowArea() const // 显示圆形相关信息
{
cout << "圆形:" << endl;
cout << "半径:" << radius << endl; // 显示半径
cout << "面积:" << PI * radius * radius << endl; // 显示面积
}
};
// 矩形类
class Rectangle: public Shape
{
private:
// 数据成员:
40、
double height; // 高
double width; // 宽
public:
// 公有函数:
Rectangle(double h, double w): height(h), width(w) // 构造函数
{ sum += height * width; }
void ShowArea() const // 显示矩形相关信息
{
cout << "矩形:" << endl;
cout << "高:" << height << endl; // 显示高
cout << " 41、宽:" << width << endl; // 显示宽
cout << "面积:" << height * width << endl; // 显示面积
}
};
// 正方形类
class Square: public Shape
{
private:
// 数据成员:
double longth; // 长
double width; // 宽
public:
// 公有函数:
Square(double l, double a): longth(l), width(a) // 构造函数
{ sum += longt 42、h * width; }
void ShowArea() const // 显示矩形相关信息
{
cout << "正方形:" << endl;
cout << "长:" << longth << endl; // 显示长
cout << "宽:" << width << endl; // 显示宽
cout << "面积:" << longth * width << endl; // 显示面积
}
};
double Shape::sum = 0; // 为静态数据成员赋初值
int main(void) 43、 // 主函数main(void)
{
char flag = 'Y'; // 判断是否继续录入的标志, 初始化为'Y'
Shape *p[3]; // 基类指向
while (toupper(flag) == 'Y')
{
cout << "请选择输入类别(1.圆形 2.矩形 3.正方形)";
int select; // 临时变量
cin >> select; // 输入选择
switch (select)
{
case 1: // 圆形
double r; 44、 // 半径
cout << "输入半径:";
cin >> r; // 输入半径
p[3] = new Circle(r); // 生成圆对象
p[3]->ShowArea(); // 显示相关信息
delete p[3]; // 释放存储空间
break;
case 2: // 矩形
double h, w; // 高宽
cout << "输入高:";
cin >> h; // 输入高
cout << "输入宽:";
cin >> w; 45、 // 输入宽
p[3] = new Rectangle(h, w); // 生成矩形对象
p[3]->ShowArea(); // 显示相关信息
delete p[3]; // 释放存储空间
break;
break;
case 3: // 矩形
double l, a; // 长宽
cout << "输入长:";
cin >> l; // 输入高
cout << "输入宽:";
cin >> a; // 输入宽
p[3] = new 46、Rectangle(l, a); // 生成矩形对象
p[3]->ShowArea(); // 显示相关信息
delete p[3]; // 释放存储空间
break;
default: // 其它情况, 表达选择有误
cout << "选择有误!"<< endl;
break;
}
cout << endl << "是否继续录入信息?(Y/N)";
cin >> flag;
}
cout << "总面积:" << Shape::sum << endl;
system("PAUSE" 47、); // 调用库函数system( ),
return 0; // 返回值0, 返回操作系统
}
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
模板
实验室
实
验
目
的
或
要
求
1.了解模板的作用,熟悉函数模板和类模板的定义格式。
2.掌握函数模板与类模板的应用。
实
验
原
理
(
算
法
流
程
)
对数组进行排序、求最大值和求元素和的函数采用静态成员 48、函数的方式封装成数组算法类模板ArrayAlg,并采用相关数据进行测试。
组
内
分
工
(
可选
)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:了解模板的作用,熟悉函数模板和类模板的定义格式。 并且掌握函数模板与类模板的应用。对数组进行排序、求最大值和求元素和的实现。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
#include 49、namespace std;
template 50、e);
};
template






