面向对象程序设计实验报告
实验名称:类的定义与使用 学时安排:3
实验类别:设计性实验 实验要求:1人1组
目录
一、实验目的
1)掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2)掌握类对象的定义;
3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;
二、实验原理介绍
通过建立类及对象,用类的成员函数和对象访问类的成员;
利用建立类的构造函数,完成类的成员的初始化工作;
三、实验设备介绍
软件需求: Visual Studio C++或Codeblocks或Dev C++或其他C++ IDE
硬件需求: 能够流畅运行C++ IDE的计算机一台。
四、实验内容
编写一个程序,模拟电梯的功能。功能接口包括电梯上行按钮、下行按钮、楼层选择和电梯在行驶过程中的楼层显示。
要求:
1.由用户选择按上行按钮还是下行按钮,选择操作后再由用户输入要进入的楼层,进而电梯开始运行,显示所到的每一楼层层数。
2.如果是上行,则选择输入的楼层好不能比当前楼层号小,否则应给出不合法提示。
3. 如果是下行,则选择输入的楼层好不能比当前楼层号大,否则应给出不合法提示。
4.电梯一旦开始运作就会始终运行,直到窗口关闭。
5.电梯在经过不同楼层时,最好每个楼层的显示之间能有延迟,最终停靠的楼层的输出形式能更加醒目。如果可以,在电梯最初开始运行时,能在电梯由内部显示当前日期(提示:实现这些功能时,需要调用系统api,实现时间显示功能可以使用Date类)。
五、程序清单
1、电梯头文件
#include<iostream>
class Elevator{
private:
int maxFloor; //电梯最高楼层数
int minFloor; //电梯最低楼层数
int currentFloor; //当前楼层
void menu(); //显示菜单
public:
Elevator(int minFloor_ , int maxFloor_ , int currentFloor_); //构造函数
void setUpFloor(int floorNumber); //上行
void setDownFloor(int floorNumber); //下行
int getCurrentFloor(); //获得当前所在楼层
};
2、电梯源文件
#include "elevator.h"
#include <iostream>
#include <Windows.h>
using namespace std;
Elevator::Elevator(int minFloor_ , int maxFloor_, int currentFloor_){
minFloor = minFloor_; //定义最低楼层数
maxFloor = maxFloor_; //定义最高楼层数
currentFloor = currentFloor_ ; //定义当前楼层
menu();
}
int Elevator::getCurrentFloor(){
return currentFloor;
}
void Elevator::setUpFloor(int floorNumber){
if(floorNumber > currentFloor && floorNumber <= maxFloor)
{
for(int i=currentFloor ; i<floorNumber ; i++)
{
cout << "---(" << i << ")---" << endl;
Sleep(1000); //等待1000ms后再继续执行
currentFloor++;
}
cout << "---(" << floorNumber << ")---" << endl;
Sleep(1000);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); //设置字颜色为绿色
cout << floorNumber << "楼到了,请选择接下来的操作!" << endl;
cout << endl;
}
else if(floorNumber > maxFloor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); //设置字颜色为红色
cout << "您选择的楼层不存在,请重新选择!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); //设置字颜色为白色
}
else if(currentFloor > floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "无法上行,请重新选择!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
else if(currentFloor == floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN); //设置字颜色为黄色
cout << "你已到达该层!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
menu();
}
void Elevator::setDownFloor(int floorNumber){
if(floorNumber < currentFloor && floorNumber >= minFloor)
{
for(int i = currentFloor ; i>floorNumber ; i--)
{
cout << "---(" << i << ")---" << endl;
Sleep(1000);
currentFloor--;
}
cout << "---(" << floorNumber << ")---" << endl;
Sleep(1000);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
cout << floorNumber << "楼到了,请选择接下来的操作!" << endl;
cout << endl;
}
else if(floorNumber < minFloor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "您选择的楼层不存在,请重新选择!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
else if(currentFloor < floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "无法下行,请重新选择!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
else if(currentFloor == floorNumber)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
cout << "你已到达该层!" << endl;
cout << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
menu();
}
void Elevator::menu(){
cout << "-----选项-----" << endl;
cout << "| 1.上升 |" << endl;
cout << "| 2.下降 |" << endl;
cout << "| 3.退出 |" << endl;
cout << "-------------" << endl;
}
3、日期头文件
#include<iostream>
#include<string>
using std::string;
class Date{
public:
Date();
int getYear() const;
int getMon() const;
int getDay() const;
int getHour();
int getMinute();
int getSecond();
static void DateShow(); //显示当前日期与时间
private:
int year = 1900;
int month = 1;
int day = 1;
int hour = 0;
int minute = 0;
int second = 0;
};
4、日期源文件
#include "date.h"
#include <iostream>
#include <ctime>
using namespace std;
Date::Date(){
time_t now;
time(&now); //把系统当前时间存储到now中
struct tm *t_now;
t_now = localtime(&now); //将当前时间格式化为日期结构体
year = t_now -> tm_year + 1900;
month = t_now -> tm_mon + 1;
day = t_now -> tm_mday;
hour = t_now -> tm_hour;
minute = t_now -> tm_min;
second = t_now ->tm_sec;
}
int Date::getYear() const{
return year;
}
int Date::getMon() const{
return month;
}
int Date::getDay() const{
return day;
}
int Date::getHour(){
return hour;
}
int Date::getMinute(){
return minute;
}
int Date::getSecond(){
return second;
}
void Date::DateShow(){
Date today;
cout << "今天是" << today.getYear() << "年" << today.getMon() << "月" << today.getDay() << "日!" << endl;
cout << "现在是北京时间:" << today.getHour() << "时" << today.getMinute() << "分" << today.getSecond() << "秒!"<< endl;
}
5、主函数
#include <iostream>
#include <Windows.h>
#include "date.h"
#include "elevator.h"
using namespace std;
int main()
{
Date::DateShow(); //显示日期与时间
int minFloor, maxFloor, nowFloor , option , aimFloor;
cout << "请输入最低楼层数、最高楼层数和电梯当前停靠的楼层:";
cin >> minFloor >> maxFloor >> nowFloor;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); //设置字颜色为绿色
cout << "本电梯最低" << minFloor << "层,最高" << maxFloor << "层,欢迎乘坐!" << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
Elevator elevator(minFloor, maxFloor, nowFloor);
cin >> option;
while(option!=3)
{
if(option == 1)
{
cout << "现在电梯停靠第" << elevator.getCurrentFloor() << "层。" << endl;
cout << "请输入你想到达的楼层:";
cin >> aimFloor ;
elevator.setUpFloor(aimFloor);
}
if(option == 2)
{
cout << "现在电梯停靠第" << elevator.getCurrentFloor() << "层。" << endl;
cout << "请输入你想到达的楼层:";
cin >> aimFloor ;
elevator.setDownFloor(aimFloor);
}
cin >> option;
}
if(option == 3) exit(0);
system("pause");
return 0;
}
六、运行结果
1、正常上行
2、上行异常
3、正常下行
4、下行异常
5、退出(为显示运行成功,在编译时截图)
七、实验心得
通过这次实验,我掌握了类和对象的定义,并且对类的封装机制有了更深层的认识。对于类的公共成员,成员变量与成员函数可以在类的内部和外界访问及调用;对于类的私有成员,成员变量跟成员函数只能在类的内部被访问及调用。因此,我们在对类进行封装时,一定要判断清楚成员变量和成员函数的属性。
同时通过查阅相关资料,我学会了调用SetConsoleTextAttribute()函数对输出的字体颜色进行修改,掌握了利用Sleep()函数使程序的暂时处于非活动状态,理解了运用time()函数和localtime()函数分别实现系统当前时间的存储和将时间格式化为日期结构体。
本次实验,将课堂中学习的理论知识运用到了实践中,巩固与加强了对类与对象的学习效果。