一、实验目的
1.掌握单继承和多重继承的概念。
2.理解不同的继承类型:public、protected和private,掌握何时使用何种继承类型。
3.掌握类层次中构造函数的定义方式和建立对象时构造和析构次序
二、实验原理介绍
通过继承机制实现对类功能的扩展,合理设计派生类的构造函数、成员函数。
三、实验设备介绍
软件需求: 支持C++程序编辑、编译和运行的软件
硬件需求: 处理器i3、内存2G以上计算机一台。
四、实验内容
实现对第一次实验结果Elevator类的功能扩展。在Elevator类已有功能的基础上派生AdvancedElevator类。AdvancedElevator类可以实现当多人在不同楼层等待乘坐上行或下行的同一部电梯时,能够合理的根据乘坐人的需求对电梯经停的楼层进行排序。
要求:
1.为了实现上的方便性,我们假设同一组要求乘坐电梯的乘客或者都是上行,或者都是下行。
2.在主函数中对该类的功能进行测试,测试方法是首先选择在某一时间段一组要乘坐电梯的乘客是上行还是下行,然后输入组中乘客的人数及每一个乘客所在楼层和目的楼层,由AdvancedElevator类实例化后的电梯对象在运作的过程中,如果电梯是上行,则能根据乘客所在的楼层和目的楼层从下向上依次停靠;如果电梯是下行,则能根据乘客所在的楼层和目的楼层从上向下依次停靠。
3.在测试的过程中,还需要注意测试当多个用户在同一楼层或多个用户的目的楼层为同一楼层时情况的处理。
提示:
为了方便描述乘客,我们可以定义一个Person类,主要描述每一个乘客所在楼层和目的楼层。AdvancedElevator类从Elevator类继承而来,它从某一个时间段要乘坐电梯的每个乘客的信息当中提取其所在楼层和目的楼层信息,然后对它们进行排序,再由继承自基类Elevator的成员setFloorNumber对要停靠的楼层序列依次输出。
思考(可选)
如果加入乘客的体重信息,如何实现在停靠楼层对超载信息的提示。
五 、程序清单
//Main.cpp: #include<iostream> #include<ctime> #include"AdvancedElevator.h" #pragma warning(disable:4996) using namespace std; int main() { AdvancedElevator e(10); time_t timer; time(&timer); tm* t_tm = localtime(&timer); int year = t_tm->tm_year + 1900;//年 int month = t_tm->tm_mon + 1;//月 int day = t_tm->tm_mday;//日 cout << "今天是" << year << "年" << month << "月" << day << "日 " << endl; cout << "该电梯一共" << e.getFloor() << "层, 欢迎您的使用!" << endl << endl; e.Main(); return 0; }
//Elevator.h: #pragma once class Elevator { private: int floor;//电梯的总层数 public: int currentFloor;//当前所在楼层 Elevator(int);//给楼层和当前所在楼层初始化 int getFloor();//返回电梯总层数 void setFloorNumber(int);//根据要进入的楼层电梯开始运行,并逐层显示经过的楼层 int getCurrentFloor();//返回电梯当前所在楼层 };
//Elevator.cpp: #include"Elevator.h" #include<iostream> #include<windows.h> using namespace std; void Elevator::setFloorNumber(int floorNumber) { int f = 1; if (floorNumber < getCurrentFloor()) f = -1; for (int i = getCurrentFloor(); i != floorNumber; i = i + f) { cout << "--" << i << "--" << endl << endl; Sleep(1000); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); cout << "第" << floorNumber << "层到了" << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); currentFloor = floorNumber; } int Elevator::getCurrentFloor() { return currentFloor; } Elevator::Elevator(int floor) { this->floor = floor; currentFloor = 1; } int Elevator::getFloor() { return floor; }
//AdvancedElevator.h: #pragma once #include"Elevator.h" #include"Person.h" class AdvancedElevator :public Elevator { private: int tot;//乘坐电梯的人数 int b[99];//进行比较 int c[99]; int d[99]; Person p[99];//输入所在和目的楼层 public: AdvancedElevator(int); void Main();//输入窗口 void setUpButton();//上升 void setDownButton();//下升 void read(int);//输入人数 void preparation();//进行排序 };
//AdvancedElevator.cpp: #include "AdvancedElevator.h" #include<iostream> using namespace std; AdvancedElevator::AdvancedElevator(int floor) :Elevator(floor) { d[0] = 0; } void AdvancedElevator::Main() { while (1) { cout << " ---请选择操作----" << endl; cout << "| 1.上升 |" << endl; cout << "| 2.下降 |" << endl; cout << "| 3.退出 |" << endl; cout << " -----------------" << endl; int op; cin >> op; if (op == 3) exit(0); cout << "当前电梯停在" << getCurrentFloor() << "层" << endl; if (op == 1) setUpButton(); else if (op == 2) setDownButton(); } } void AdvancedElevator::setUpButton() { read(0); preparation(); for (int i = 1; i <= d[0]; ++i) setFloorNumber(d[i]); for (int i = 1; i <= 99; i++) { d[i] = 0; c[i] = 0; } } void AdvancedElevator::setDownButton() { read(1); preparation(); for (int i = d[0]; i >= 1; --i) setFloorNumber(d[i]); for (int i = 1; i <= 99; i++) { d[i] = 0; c[i] = 0; } } void AdvancedElevator::read(int flag) { cout << "请输入要乘坐电梯的人数" << endl; cin >> tot; cout << "请输入每个人所在楼层和目的楼层" << endl; for (int i = 1; i <= tot; ++i) { while (1) { cin >> p[i].a >> p[i].b; if (p[i].b > getFloor() || p[i].a <= 0 || p[i].b <= 0 || p[i].b > getFloor()) cout << "楼层不存在" << endl; else if (flag == 0) { if (p[i].a >= p[i].b) cout << "您不能上行,请稍后再乘坐" << endl; else break; } else { if (p[i].a <= p[i].b) cout << "您不能下行,请稍后再乘坐" << endl; else break; } } } } void AdvancedElevator::preparation() { for (int i = 1; i <= getFloor(); ++i) b[i] = 0, c[i] = 0; for (int i = 1; i <= tot; ++i) b[p[i].a] = 1, c[p[i].b] = 1; for (int i = 1; i <= getFloor(); ++i) if (b[i] || c[i]) d[++d[0]] = i; }
//Person.h: #pragma once class Person { public: int a; int b; };
六、 运行结果
首先输出时间与地点等,输入1进行上升,输入将要乘坐电梯人数和所在楼层和目的楼层,实现了电梯的运行。然后输入2进行下降,输入将要乘坐电梯人数和所在楼层和目的楼层,电梯会自动运行去接人,进而送达到地方。最后输入1进行上升,输入多人乘坐的所在楼层和目的楼层,电梯会自动去接不同乘客,进而把乘客送达到目的楼层。
编辑编辑编辑七 、实验总结
该实验通过继承,将最初的单人电梯升级成多人电梯,学会了类的封装,与继承内容的学习,使得面向对象的能力不断提高。并且写电梯使得自己更贴近生活,去了解了不同电器的运行流程。本次实验学习,运用多文件的运行,学会更好的整理自己的程序,与继承时构造函数等的运用,更深化了对继承的了解与学习。