浙江理工大学信息学院 实验指导书 实验名称:
类得继承机制得实现
学时安排:3 实验类别: 设计性实验
实验要求:1 人1 组
学号:
姓名
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
一、实验目得 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对要停靠得楼层序列依次输出。
思考 (可选)
如果加入乘客得体重信息,如何实现在停靠楼层对超载信息得提示. 五 程序清单
(el、cpp)
#include "Elevator、h" Elevator::Elevator(int f) {
floor =f;
up=false;
down=false;
currentFloor=1; }; void Elevator::setUpButton()
{
if(currentFloor>floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"您不能上行!"〈〈endl〈<endl;
}
else if(floorNumber>floor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈〈"没这一层!太高啦!您想上天?!"<<endl<〈endl;
}
else up=true; } void Elevator::setDownButton()
{
if(currentFloor<floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈<"您不能下行!”<<endl〈<endl;
}
else if(floorNumber〈1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈<"没这一层!太低啦!您想入地?!”<〈endl<<endl;
}
else down=true; }
void Elevator::setFloorNumber(int floorNumber)
{
if(up)
{
for(;currentFloor<floorNumber;currentFloor++)
{
cout〈〈"—-"〈〈currentFloor<〈”--"<〈endl;
Sleep(2000);}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<〈”第”〈<currentFloor〈<"层到了”〈〈endl<〈endl;
up=false;
}
if(down)
{
for(;currentFloor>floorNumber;currentFloor-—)
{
cout〈〈"--”<<currentFloor〈<"--"<〈endl;
Sleep(2000);}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<”第”〈〈currentFloor<<”层到了”<〈endl<<endl;
down=false;
} } void Elevator::choice() {
cin>>n;
switch(n)
{
case 1: cout<〈”当前电梯停在"<<currentFloor〈〈"层"<〈endl;
cout<〈"请输入要进入得楼层”<<endl;cin〉〉floorNumber;setUpButton();setFloorNumber(floorNumber); break;
case 2:
cout<<”当前电梯停在”<<currentFloor<<"层"<<endl;
if(currentFloor==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<〈”您已经在第一层了!除非您自己打洞,不然我就是不会带您下去得!"<〈endl<〈endl;return;
}
cout〈<”请输入要进入得楼层”<<endl;cin〉〉floorNumber;setDownButton();setFloorNumber(floorNumber);break;
case 3:exit(0);
default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈<"只能选上升与下降!您难道还想玩电梯漂移?!"〈<endl<<endl; break;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<”当前电梯停在”〈〈currentFloor〈<"层”<〈endl;
} void Elevator::charge() {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<"-—-请选择操作—--"〈<endl;
cout〈〈”|
1、上升
|”〈〈endl;
cout<〈"|
2、下降
|"<〈endl;
cout〈<”|
3、退出
|”<<endl;
cout<<"|--------——-—--|"<<endl; } (main、cpp) #include "Elevator、h” class AdvElevator:public Elevator { public:
AdvElevator(int f):Elevator(f){currentFloor=1;}
void setdata();
void setFloorNumber();
void choice(); private:
int judge(int);
int fln[20];
int w[10];
int N;
int num; }; void AdvElevator::setFloorNumber()
{
int i;
if(up)
{cout〈〈endl;
for(i=0;currentFloor<=floorNumber;currentFloor++)
{
if(currentFloor==fln[i])
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout〈〈"第”〈<currentFloor〈<"层到了"<〈endl;
Sleep(2000);i++;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
else {cout<〈"--”<〈currentFloor〈〈"—-”〈<endl;Sleep(2000);}
} currentFloor=floorNumber;cout〈〈endl;up=false;
}
if(down)
{cout〈<endl;
for(i=N—1;currentFloor>=floorNumber;currentFloor—-)
{
if(currentFloor==fln[i])
{
SetConsoleTextAttribute(GetStdHandle(STD_
OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<"第"<<currentFloor<〈"层到了"<〈endl;
Sleep(2000);i-—;
SetConsoleTextAttribute (GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
else{
cout<<"—-”〈〈currentFloor〈<”——”<〈endl;Sleep(2000);}
}currentFloor=floorNumber;cout<<endl;down=false;
} } void AdvElevator::setdata()
{
cout<<"请告诉我共有几人"<〈endl;
int weight=0;
cin>〉num;cout<〈endl;
N=2*num;
int i=0,n=1,q=1;
while(q<=num)
{
cout<<”第"<〈q〈〈"位乘客,请依次输入您所在楼层、您想去得楼层及您得体重(kg)"<〈endl;
cin〉>fln[i]>〉fln[n]〉〉w[i];
if(judge(fln[n])==1){q++;N—=2;fln[i]="\0’;continue;}
weight+=w[i];
if(weight>500)
{cout<<endl;cout<〈"第"<<q<<"位乘客,因超载原因,您不
能上"〈〈endl〈<endl; q++;N—=2;fln[i]=’\0";weight—=w[i];w[i]=0;continue;}
i+=2;n+=2;q++;
}
for (i=0; i〈N—1; i++ )
for (q=i+1; q<N; q++ )
if (fln[i]== fln[q] )
{
ﻩ
)
++n ;N〈n ;q=n(rofﻩ
fln[n] = fln[n+1];
;-—Nﻩ
q-—;
}
int j,k,temp;
for(j=0;j<N;j++)
for(k=0;k<N-1-j;k++)
{
if(fln[k]〉fln[k+1])
{
temp=fln[k];
fln[k]=fln[k+1];
fln[k+1]=temp;
}
}
if(fln[0]==’\0’) num=100;
if(up)floorNumber=fln[N-1];
if(down)floorNumber=fln[0]; } int AdvElevator::judge(int n)
{
if(up)
{
if(currentFloor>n)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"您不能上行!别捣乱,给我出去!"〈〈endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);return 1;
}
else if(n>floor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈〈”没这一层!太高啦!您想上天?!别捣乱,给我出去!”<〈endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);return 1;
}
}
if(down)
{
if(currentFloor<n)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE) , FOR E GROUN D _I N TENSIT Y | FOR E G R OUND_RED|F O R E GROUND_GREEN);
cout<〈"您不能下行!别捣乱,给我出去!"〈<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);return 1;
}
else if(n〈1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<〈"没这一层!太低啦!您想入地?!别捣乱,给我出去!”<〈endl;
Se t C o nsoleTextAttribute ( G e tSt d H a ndl e ( STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);return 1;
}
}
return 0; } void AdvElevator::choice() {
cin>>N;
switch(N)
{
case 1: up=true;cout<<”当前电梯停在"〈<currentFloor<〈"层"〈〈endl;
setdata();if(num==100)break;setFloorNumber(); break;
case 2: down=true;cout<<"当前电梯停在"<〈currentFloor<<”层”<<endl;
if(currentFloor==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout〈<"您已经在第一层了!除非您自己打洞,不然我就是不会带您下去得!”〈<endl<<endl;down=false;return;
}
setdata();if(num==100)break;setFloorNumber();break;
case 3:exit(0);
default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"只能选上升与下降!您难道还想玩电梯漂移?!"〈〈endl〈<endl; break;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout〈〈”—-———--—---—---"<<endl; } int main()
{
long a;
time(&a);
int floor;
cout<〈"告诉我总共有几层"<〈endl;
cin〉〉floor;
AdvElevator el(floor);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout〈<ctime(&a)<<endl;
cout<<"本电梯共"<〈floor〈<”层,且最多上 10 人,欢迎您得使用(限重 500kg)"<<endl<<endl;
while(1)
{
el、charge();
el、AdvElevator::choice();
}
return 0; } 六 运行结果
七 实验心得 复习了有关数组得内容,比如排序,去除重复元素;费了很大精力来改,但总觉得写得不好,代码太长,内容冗杂。有待进步,加强。