模拟电梯2.0(继承机制实验)
一、實驗目的
1.掌握單繼承和多重繼承的概念。
2.理解不同的繼承類型:public、protected和private,掌握何時使用何種繼承類型。
3.掌握類層次中構造函數的定義方式和建立對象時構造和析構次序
二、實驗原理介紹
通過繼承機制實現對類功能的擴展,合理設計派生類的構造函數、成員函數。
三、實驗設備介紹
軟件需求: Visual C++ 6.0
硬件需求: 對于硬件方面的要求,建議配置是Pentium III 450以上的CPU處理器,64MB以上的內存,200MB的自由硬盤空間、CD-ROM驅動器、能支持24位真彩色的顯示卡、彩色顯示器、打印機。
四、實驗內容
實現對第一次實驗結果Elevator類的功能擴展。在Elevator類已有功能的基礎上派生AdvElevator類。AdvElevator類可以實現當多人在不同樓層等待乘坐上行或下行的同一部電梯時,能夠合理的根據乘坐人的需求對電梯經停的樓層進行排序。
要求:
1.為了實現上的方便性,我們假設同一組要求乘坐電梯的乘客或者都是上行,或者都是下行。
2.在主函數中對該類的功能進行測試,測試方法是首先選擇在某一時間段一組要乘坐電梯的乘客是上行還是下行,然后輸入組中乘客的人數及每一個乘客所在樓層和目的樓層,由AdvElevator類實例化后的電梯對象在運作的過程中,如果電梯是上行,則能根據乘客所在的樓層和目的樓層從下向上依次停靠;如果電梯是下行,則能根據乘客所在的樓層和目的樓層從上向下依次停靠。
3.在測試的過程中,還需要注意測試當多個用戶在同一樓層或多個用戶的目的樓層為同一樓層時情況的處理。
程序要求的結果請運行elevator.exe
提示:
為了方便描述乘客,我們可以定義一個Person類,主要描述每一個乘客所在樓層和目的樓層。AdvElevator類從Elevator類繼承而來,它從某一個時間段要乘坐電梯的每個乘客的信息當中提取其所在樓層和目的樓層信息,然后對它們進行排序,再由繼承自基類Elevator的成員setFloorNumber對要停靠的樓層序列依次輸出。
思考(可選)
如果加入乘客的體重信息,如何實現在停靠樓層對超載信息的提示。
五、注意事項和要求
要求學生要提前準備實驗的內容
實驗完成后要求寫出實驗報告
六、參考書目
【C++ Prime題解】侯捷譯 華中科技大學出版社
【C++程序設計與應用】 張耀仁著 華中科技大學出版社
一、實驗目的
1.掌握單繼承和多重繼承的概念。
2.理解不同的繼承類型:public、protected和private,掌握何時使用何種繼承類型。
3.掌握類層次中構造函數的定義方式和建立對象時構造和析構次序
二、實驗原理介紹
通過繼承機制實現對類功能的擴展,合理設計派生類的構造函數、成員函數。
三、實驗設備介紹
軟件需求: windows或linux下的c++編譯器
硬件需求: 對于硬件方面的要求,建議配置是Pentium III 450以上的CPU處理器,64MB以上的內存,200MB的自由硬盤空間、CD-ROM驅動器、能支持24位真彩色的顯示卡、彩色顯示器、打印機。
四、實驗內容
實現對第一次實驗結果Elevator類的功能擴展。在Elevator類已有功能的基礎上派生AdvancedElevator類。AdvancedElevator類可以實現當多人在不同樓層等待乘坐上行或下行的同一部電梯時,能夠合理的根據乘坐人的需求對電梯經停的樓層進行排序。
要求:
1.為了實現上的方便性,我們假設同一組要求乘坐電梯的乘客或者都是上行,或者都是下行。
2.在主函數中對該類的功能進行測試,測試方法是首先選擇在某一時間段一組要乘坐電梯的乘客是上行還是下行,然后輸入組中乘客的人數及每一個乘客所在樓層和目的樓層,由AdvancedElevator類實例化后的電梯對象在運作的過程中,如果電梯是上行,則能根據乘客所在的樓層和目的樓層從下向上依次停靠;如果電梯是下行,則能根據乘客所在的樓層和目的樓層從上向下依次停靠。
3.在測試的過程中,還需要注意測試當多個用戶在同一樓層或多個用戶的目的樓層為同一樓層時情況的處理。
提示:
為了方便描述乘客,我們可以定義一個Person類,主要描述每一個乘客所在樓層和目的樓層。AdvancedElevator類從Elevator類繼承而來,它從某一個時間段要乘坐電梯的每個乘客的信息當中提取其所在樓層和目的樓層信息,然后對它們進行排序,再由繼承自基類Elevator的成員setFloorNumber對要停靠的樓層序列依次輸出。
思考(可選)
如果加入乘客的體重信息,如何實現在停靠樓層對超載信息的提示。
五 程序清單
Person.h
Person.cpp
#include "Person.h"Person::Person() {//ctor }Person::~Person() {//dtor } Person::Person(int ID,int u,int v):id(ID),form(u),to(v),weight(50) {//ctor } Person::Person(int ID,int u,int v,int w):id(ID),form(u),to(v),weight(w) {//ctor } void Person::setID(int ID){id=ID; } void Person::setform(int u){form=u; } void Person::setto(int v){to=v; } void Person::setweight(int w){weight=w; } int Person::getID(){return id; } int Person::getform(){return form; } int Person::getto(){return to; } int Person::getweight(){return weight; } bool Person::operator <(const Person & P ){//重載運算符排序if(form==P.form)to<P.to;return form<P.form; }Elevator.h
#ifndef ELEVATOR_H #define ELEVATOR_H #include <iostream> #include <windows.h> #include <stdlib.h> #include"date.h" using namespace std;class Elevator {public:Elevator();virtual ~Elevator();Elevator(int floor);void setUpButton(); //按下上行按鈕void setDownButton(); //按下下行按鈕void setFloorNumber(int floorNumber); //根據要進入的樓層電梯開始運行,并逐層顯示經過的樓層int getCurrentFloor(); //獲得當前所在樓層void setUp(bool up);void setDown(bool down);void setFloor(int floor);bool getup();bool getdown();int getFloor();void err();void init();void memu();void run();protected:int floor; //電梯總的樓層數bool up; //是否上行,bool為布爾類型,可取值true或falsebool down; //是否下行int currentFloor; //當前所在樓層CDate data;private:};#endif // ELEVATOR_HElevator.cpp
#include "Elevator.h"Elevator::Elevator():floor(10),up(0),down(0),currentFloor(1) {}Elevator::~Elevator() {//dtor } Elevator::Elevator(int floor):floor(floor),up(0),down(0),currentFloor(1) {} void Elevator::setUpButton()//按下上行按鈕 {int now=getCurrentFloor(),to;cout<<"當前電梯停在"<<now<<"層"<<endl;cout<<"請輸入要進入的樓層"<<endl;scanf("%d",&to);if(now>=to||to>floor||to<1){cout<<"您不能上行!"<<endl;}else{up=1;setFloorNumber(to);up=0;} } void Elevator::setDownButton()//按下下行按鈕 {int now=getCurrentFloor(),to;cout<<"當前電梯停在"<<now<<"層"<<endl;cout<<"請輸入要進入的樓層"<<endl;scanf("%d",&to);if(now<=to||to>floor||to<1){cout<<"您不能下行!"<<endl;}else{down=1;setFloorNumber(to);down=0;} } void Elevator::setFloorNumber(int floorNumber)//根據要進入的樓層電梯開始運行,并逐層顯示經過的樓層 {if(up){for(int i=currentFloor;i<floorNumber;i++){cout<<"---"<<i<<"---"<<endl<<endl;Sleep(1000);}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);cout<<"第"<<floorNumber<<"層到了"<<endl;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE|FOREGROUND_INTENSITY);}if(down){for(int i=currentFloor;i>floorNumber;i--){cout<<"---"<<i<<"---"<<endl<<endl;Sleep(1000);}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);cout<<"第"<<floorNumber<<"層到了"<<endl;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE|FOREGROUND_INTENSITY);}currentFloor=floorNumber; } int Elevator::getCurrentFloor()//獲得當前所在樓層 {return currentFloor; }void Elevator::setUp(bool up){this->up=up; } void Elevator::setDown(bool down){this->down=down; } void Elevator::setFloor(int floor){this->floor=floor; } bool Elevator::getup(){return up; } bool Elevator::getdown(){return down; } int Elevator::getFloor(){return floor; } void Elevator::err() {cout<<"-----無效操作-----"<<endl; } void Elevator::memu() {cout<<" ---請選擇操作----"<<endl;cout<<"| 1.上升 |"<<endl;cout<<"| 2.下降 |"<<endl;cout<<"| 3.退出 |"<<endl;cout<<" -----------------"<<endl; } void Elevator::init() {cout<<"今天是"<<data.format("DDD")<<endl;cout<<"該電梯一共"<<getFloor()<<"層, 歡迎您的使用!"<<endl; } void Elevator::run() {init();bool online=1;while(online){int op;memu();scanf("%d",&op);switch(op){case 1:setUpButton();break;case 2:setDownButton();break;case 3:online=1;break;default:err();break;}} }AdvElevator.h
#ifndef ADVELEVATOR_H #define ADVELEVATOR_H#include <Elevator.h> #include "Person.h" #include <vector> class AdvElevator : public Elevator {public:AdvElevator();AdvElevator(int floor);AdvElevator(int floor,int weight);virtual ~AdvElevator();void setLimitWeight(int weight);int getLimitWeght();void setUpButton();void setDownButton();void init();void run();protected:int limitweight;private:}; #endif // ADVELEVATOR_HAdvElevator.cpp
#include "AdvElevator.h" //構造函數 默認樓層數 默認載重 AdvElevator::AdvElevator():Elevator(10),limitweight(200) {//ctor }AdvElevator::~AdvElevator() {cout<<"謝謝使用!"<<endl;//dtor } //構造函數 自定義樓層數 默認載重 AdvElevator::AdvElevator(int floor):Elevator(floor),limitweight(200) {//ctor } //構造函數 自定義樓層數 自定義載重 AdvElevator::AdvElevator(int floor,int weight):Elevator(floor),limitweight(weight) {//ctor } void AdvElevator::setUpButton()//按下上行按鈕 {int now=getCurrentFloor();//獲取當前電梯樓層//如果當前在頂樓不能上行if(now==floor){cout<<"本電梯已經到達頂樓"<<endl;return;}cout<<"請輸入要乘坐電梯的人數"<<endl;int num=0;scanf("%d",&num);Person person[num];cout<<"請輸入每個人所在樓層和目的樓層和此人體重"<<endl;cout<<"當前電梯停在"<<now<<"層"<<endl;int u,v,w;//臨時記錄乘客信息int nowW=0;//存儲當前電梯負載int cnt[floor+1]={0};//桶排序數組bool vis[floor+1]={0};//標記乘客是否上電梯//in存儲樓層上電梯的乘客,out存儲樓層下電梯的乘客vector<Person>in[floor+1],out[floor+1];for(int i=0;i<num;i++){scanf("%d%d%d",&u,&v,&w);//判斷乘客是否滿足條件while(now>=v||v>floor||v<1||u<1||u>floor||now>u||u>=v||w>limitweight){//不滿足條件重新錄入if(u==v){cout<<"您不需要坐本電梯!"<<endl;}else if(w>limitweight){cout<<"您體重超出荷載!"<<endl;}else{cout<<"您不能上行!"<<endl;}scanf("%d%d%d",&u,&v,&w);}person[i]=Person(i+1,u,v,w);cnt[u]++;//桶排序cnt[v]++;in[u].push_back(person[i]);out[v].push_back(person[i]);}//處理當前樓層上電梯乘客for(int i=0,j=in[now].size();i<j;i++){if(limitweight-nowW>=in[now][i].getweight()){vis[in[now][i].getID()]=1;nowW+=in[now][i].getweight();}else{cout<<"已超重!!"<<endl;cout<<"第"<<in[now][i].getID()<<"位乘客不能上行!"<<endl;}}//運行電梯for(int i=now+1;i<=floor;i++){if(cnt[i]){up=1;//調用父類函數setFloorNumber();//電梯運行到下一個有乘客上下電梯的樓層setFloorNumber(i);up=0;//先下后上for(int j=0,k=out[i].size();j<k;j++){if(vis[out[i][j].getID()]){vis[out[i][j].getID()]=0;nowW-=out[i][j].getweight();}}for(int j=0,k=in[i].size();j<k;j++){if(limitweight-nowW>=in[i][j].getweight()){vis[in[i][j].getID()]=1;nowW+=in[i][j].getweight();}else{cout<<"已超重!!"<<endl;cout<<"第"<<in[i][j].getID()<<"位乘客不能上行!"<<endl;}}}} } void AdvElevator::setDownButton()//按下下行按鈕 {int now=getCurrentFloor();//獲取當前電梯樓層//如果當前在頂樓不能上行if(now==1){cout<<"本電梯已經到達底樓"<<endl;return;}cout<<"請輸入要乘坐電梯的人數"<<endl;int num=0;scanf("%d",&num);Person person[num];cout<<"請輸入每個人所在樓層和目的樓層和此人體重"<<endl;cout<<"當前電梯停在"<<now<<"層"<<endl;int u,v,w;//臨時記錄乘客信息int nowW=0;//存儲當前電梯負載int cnt[floor+1]={0};//桶排序數組bool vis[floor+1]={0};//標記乘客是否上電梯//in存儲樓層上電梯的乘客,out存儲樓層下電梯的乘客vector<Person>in[floor+1],out[floor+1];for(int i=0;i<num;i++){scanf("%d%d%d",&u,&v,&w);//判斷乘客是否滿足條件while(now<=v||v>floor||v<1||u<1||u>floor||now<u||u<=v||w>limitweight){//不滿足條件重新錄入if(u==v){cout<<"您不需要坐本電梯!"<<endl;}else if(w>limitweight){cout<<"您體重超出荷載!"<<endl;}else{cout<<"您不能下行!"<<endl;}scanf("%d%d%d",&u,&v,&w);}person[i]=Person(u,v,w);cnt[u]++;//桶排序cnt[v]++;in[u].push_back(person[i]);out[v].push_back(person[i]);}//處理當前樓層上電梯乘客for(int i=0,j=in[now].size();i<j;i++){if(limitweight-nowW>=in[now][i].getweight()){vis[in[now][i].getID()]=1;nowW+=in[now][i].getweight();}else{cout<<"已超重!!"<<endl;cout<<"第"<<in[now][i].getID()<<"位乘客不能下行!"<<endl;}}//運行電梯for(int i=now-1;i>=1;i--){if(cnt[i]){down=1;//調用父類函數setFloorNumber();//電梯運行到下一個有乘客上下電梯的樓層setFloorNumber(i);down=0;//先下后上for(int j=0,k=out[i].size();j<k;j++){if(vis[out[i][j].getID()]){vis[out[i][j].getID()]=0;nowW-=out[i][j].getweight();}}for(int j=0,k=in[i].size();j<k;j++){if(limitweight-nowW>=in[i][j].getweight()){vis[in[i][j].getID()]=1;nowW+=in[i][j].getweight();}else{cout<<"已超重!!"<<endl;cout<<"第"<<in[i][j].getID()<<"位乘客不能下行!"<<endl;}}}} } void AdvElevator::setLimitWeight(int weight){//設置最大載重limitweight=weight; } int AdvElevator::getLimitWeght(){//返回最大載重return limitweight; } void AdvElevator::init()//重寫初始化 {Elevator::init();//調用父類初始化cout<<endl;cout<<"該電梯最大載重"<<getLimitWeght()<<"KG"<<endl;//增加顯示最大載重 } void AdvElevator::run()//封裝run {init();bool online=1;while(online){int op;memu();scanf("%d",&op);switch(op){case 1:setUpButton();break;//上行case 2:setDownButton();break;//下行case 3:online=0;break;//退出default:err();break;//錯誤}system("pause");//按任意鍵繼續...} }main.cpp
/* *@Author: STZG *@Language: C++ */ #include<iostream> #include"AdvElevator.h" using namespace std; AdvElevator Adv_Elevator(10,200); int main() {Adv_Elevator.run();//cout << "Hello world!" << endl;return 0; }六 運行結果
輸入數據
七 實驗心得
1.掌握單繼承和多重繼承的概念。
2.理解不同的繼承類型:public、protected和private,掌握何時使用何種繼承類型。
3.掌握類層次中構造函數的定義方式和建立對象時構造和析構次序。
4.掌握桶排序。
5.掌握封裝變量基本權限設置原則。
6.掌握通過接口函數訪問私有變量。
7.掌握重載類內運算符。
8.掌握重寫父類函數、父類與子類之間相同函數名的調用。
總結
以上是生活随笔為你收集整理的模拟电梯2.0(继承机制实验)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧几里得算法和扩展欧几里得算法(Eucl
- 下一篇: Memory Banks