资源描述
院 系: 数学与记录学学院
专 业: 信息与计算科学
年 级: 2023
课程名称: 面向对象程序设计
学 号:
姓 名:
指导教师:
2023年 11 月 日
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
类和对象
实验室
实
验
目
的
或
要
求
1.掌握类的定义和使用方法,掌握类对象的声明和使用方法。
2.掌握对象的初始化和赋值的方法。
3.了解成员函数的特性、友元。
4.静态成员的使用方法。
5.理解和掌握this指针的用法。
6.理解和掌握const类型数据的使用。
实
验
原
理
(
算
法
流
程
)
1、实验内容
2、类的设计及说明
定义一个描述学生(Student)基本情况的类,数据成员涉及姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(mathTotalScore)和英语总成绩(englishTotalScore)。其中姓名定义为长度为18的字符数组,其它数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员,函数成员涉及构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数,数学总成绩,英语总成绩;规定所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。
组内分工
(选)
无
实
验
结
果
分
析
及
心
得
体
会
根据题目的规定,成功的定义一个描述学生(Student)基本情况的类,数据成员涉及姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(mathTotalScore)和英语总成绩(englishTotalScore)。其中姓名定义为长度为18的字符数组,其它数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员,函数成员涉及构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数,数学总成绩,英语总成绩;规定所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
#include <string>
#include <iostream>
using namespace std;
class Student{
private:
string name;
int num, mathScore, englishSorce;
static int count, mathTotalSorcce, englishTotalSorce;
public:
Student(string a, int b, int c, int 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;
}
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("师兄",,80,85);
Student b("师弟",, 73, 63);
a.ShowBase();
b.ShowBase();
b.ShowStatic();
system("pause");
}
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
继承与派生
实验室
实
验
原
理
(
算
法
流
程
)
1、实验内容
2、类的设计及说明
定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继承关系如图1.2所示。
图2.2 各类之间的继承关系
规定:
(1)在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其它数据成员。
(2)各类人员的实发工资公式如下:
员工实发工资 = 基本工资 + 奖金 * 出勤率
销售员实发工资 = 基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例
经理实发工资 = 基本工资 + 奖金 * 出勤率 + 总销售额 * 经理提成比例
销售经理实发工资 =基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例+ 总销售额 * 经理提成比例
(3)每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。
(写不完时,可另加附页。)
实
验
目
的
或
要
求
1.纯熟掌握类的继承,可以定义和使用类的继承关系。
2.掌握派生类的声明与实现方法。
3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。
4.理解虚基类在解决二义性问题中的作用。
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
根据规定,成功的定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继承关系。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
// 文献名: main.cpp
#include <iostream> // 预解决命令
using namespace std; // 使用标准命名空间std
// 员(Employee)工
class Staff//Employee
{
protected:
// 数据成员:
int num; // 编号
char name[16]; // 姓名
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);}
void Show() const // 显示相关信息
{
cout << "编号:" << num << endl; // 显示编号
cout << "姓名:" << name << endl; // 显示姓名
cout << "基本工资:" << basicSalary << "元" << endl; // 显示基本工资
cout << "奖金:" << prize << "元" << endl; // 显示奖金
cout << "出勤率:" << rateOfAttend << "元" << endl;
}
void ShowSalary() const // 输出实发工资
{
cout<<"实发工资:"<< basicSalary+prize*rateOfAttend<< "元" << endl;
}
};
// 生明销售员类
class Saleman: virtual public Staff
{
protected:
// 保护成员:
double deductRate; //销售提成比例
double personAmount; //个人销售额
public:
// 公有函数:
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 << "个人销售额:" << personAmount << "元" <<endl; // 换行
}
void ShowSalary() const //输出实发工资
{
cout <<"实发工资:"<<basicSalary+prize*rateOfAttend+deductRate*personAmount<<"元" <<endl;
}
};
// 声明经理类
class Manager: virtual public Staff
{
protected:
// 保护成员:
double tatalDeductRate; //经理提成比例
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 << "经理提成比例:" << tatalDeductRate << endl; // 显示经理提成比例
cout << "总销售额:" << tatalAmount << "元" <<endl;
}
void ShowSalary() const // 显示实发工资
{
cout <<"实发工资:"<<basicSalary+prize*rateOfAttend+tatalDeductRate*tatalAmount<< "元" <<endl;
}
};
// 声明销售经理类
class SaleManager: public Saleman, public 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(); // 调用基类函数Show()
cout << "销售员提成比例:" << deductRate << endl; // 显示销售员提成比例
cout << "个人销售额:" << personAmount << "元" <<endl;
cout << "经理提成比例:" << deductRate << endl; // 显示经理提成比例
cout << "总销售额:" << tatalAmount << "元" <<endl;
}
void ShowSalary() const // 显示实发工资
{
cout <<"实发工资:"<<basicSalary+prize*rateOfAttend+deductRate*personAmount+tatalDeductRate*tatalAmount<< "元" <<endl;
}
};
int main() // 主函数main()
{
Staff e(106,"文冠杰", 1680, 1080,0.9); // 定义对象
cout<<"员工信息:"<< endl; //输出提醒
e.Show(); //输出基本信息
e.ShowSalary(); //输出实发工资
Saleman s(108,"周杰", 2680,1680,0.15,23000,0.8); // 定义对象
cout<< endl<<"销售员信息:"<< endl; //输出提醒
s.Show(); //输出基本信息
s.ShowSalary(); //输出实发工资
Manager 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); // 定义对象
cout<< endl<<"销售经理信息:"<< endl; //输出提醒
sm.Show(); //输出基本信息
sm.ShowSalary(); //输出实发工资
system("PAUSE"); // 调用库函数system( ),输出系统提醒信息
return 0; // 返回值0, 返回操作系统
}
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
函数重载与运算符重载
实验室
实
验
目
的
或
要
求
1.学习函数和操作符重载的使用方法。
2.理解函数和运算符重载的作用和意义。
3.掌握类运算符和友元运算符重载的定义和使用。
4.掌握常用运算符的重载。
实
验
原
理
(
算
法
流
程
)
设计一个时间类Time,规定:
(1)包含时(hour)、分(minute)和秒(second)私有数据成员。
(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。
组内
分工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:1.学习函数和操作符重载的使用方法。2.理解函数和运算符重载的作用和意义。3.掌握类运算符和友元运算符重载的定义和使用。4.掌握常用运算符的重载。设计一个时间类Time,并且(1)包含时(hour)、分(minute)和秒(second)私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
#include <iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
Time(int hh=0,int mm=0,int ss=0):hour(hh),minute(mm),second(ss){}
void 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);
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);
}
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,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<<ss.GetHour()<<"时"<<ss.GetMinute()<<"分"<<ss.GetSecond()<<"秒";
return out;
}
istream &operator>>(istream &in,Time &ss)
{
int hour,minute,second;
cin>>hour>>minute>>second;
ss=Time(hour,minute,second);
return in;
}
int main(void)
{
Time ss(17,27,30);
cout<<"时间"<<ss<<endl;
cout<<"时间+10:"<<ss+10<<endl;
cout<<"时间-10:"<<ss-10<<endl;
cout<<"输出时间:";
cin>>ss;
cout<<"时间:"<<ss<<endl;
system("PAUSE");
return 0;
}
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
虚函数与多态性
实验室
实验
目的
或要
求
1.掌握虚函数的作用、定义和用途。
2.掌握纯虚函数的作用、定义和使用。
3.理解使用虚函数和继承实现多态性。
实验
原理
(算
法流
程)
1、实验内容
2、类的设计及说明
编写程序,定义抽象基类Shape(形状),由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)和Square 正止方形),用函数函数ShowArea()分别显示各种图形的面积,最后还要显示所有图形的总面积。规定用基类指针数组,使它的每一个元素指向一一个派生类对象。
组
内
分
工
(可
选)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:1.掌握虚函数的作用、定义和用途。 2.掌握纯虚函数的作用、定义和使用。3.理解使用虚函数和继承实现多态性。并且编写程序,定义抽象基类Shape(形状),由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)和Square 正止方形),用函数函数ShowArea()分别显示各种图形的面积,最后还要显示所有图形的总面积。规定用基类指针数组,使它的每一个元素指向一一个派生类对象。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
// 文献名: main.cpp
#include <iostream> // 预解决命令
using namespace std; // 使用标准命名空间std
const double 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(r) // 构造函数
{ sum += PI * radius * radius; }
void ShowArea() const // 显示圆形相关信息
{
cout << "圆形:" << endl;
cout << "半径:" << radius << endl; // 显示半径
cout << "面积:" << PI * radius * radius << endl; // 显示面积
}
};
// 矩形类
class Rectangle: public Shape
{
private:
// 数据成员:
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 << "宽:" << 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 += longth * width; }
void ShowArea() const // 显示矩形相关信息
{
cout << "正方形:" << endl;
cout << "长:" << longth << endl; // 显示长
cout << "宽:" << width << endl; // 显示宽
cout << "面积:" << longth * width << endl; // 显示面积
}
};
double Shape::sum = 0; // 为静态数据成员赋初值
int main(void) // 主函数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; // 半径
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; // 输入宽
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 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"); // 调用库函数system( ),
return 0; // 返回值0, 返回操作系统
}
年级
2023
班号
2
组号
17
学号
专业
信息与计算科学
姓名
实验名称
模板
实验室
实
验
目
的
或
要
求
1.了解模板的作用,熟悉函数模板和类模板的定义格式。
2.掌握函数模板与类模板的应用。
实
验
原
理
(
算
法
流
程
)
对数组进行排序、求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板ArrayAlg,并采用相关数据进行测试。
组
内
分
工
(
可选
)
无
实
验
结
果
分
析
及
心
得
体
会
从本次实验中,我学到了:了解模板的作用,熟悉函数模板和类模板的定义格式。 并且掌握函数模板与类模板的应用。对数组进行排序、求最大值和求元素和的实现。
成
绩
评
定
教师署名:
年 月 日
源代码如下:
#include<iostream>
using namespace std;
template<class T>
class ArrayAlg
{
private:
T *elem;
int size;
public:
ArrayAlg(T *a,int s):elem(a),size(s){}
static T Max(T *elem,int size);
static T Sum(T *elem,int size);
static void Sort(T *elem,int size);
static void Display(T *elem,int size);
};
template <class T>
T ArrayAlg<T>::Max(T *elem,int size)
{
T max=elem[0];
for(int i=1;i<size;i++)
{
if(max<elem[i])
max=elem[i];
}
return max;
}
template <class T>
T ArrayAlg<T>::Sum(T *elem,int size)
{
T sum=0;
for(int i=0;i<s
展开阅读全文