<center> 浙江理工大学信息电子学院 </center> <center> 实验指导书 </center> <center> 实验名称:类的定义与使用 学时安排:3 </center> <center> 实验类别:设计性实验 实验要求:1人1组 </center> <center>  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ </center>

一、实验目的
1)掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2)掌握类对象的定义;
3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;
二、实验原理介绍
通过建立类及对象,用类的成员函数和对象访问类的成员;
利用建立类的构造函数,完成类的成员的初始化工作;
三、实验设备介绍
软件需求: Visual C++ 6.0
硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。
四、实验内容
编写一个程序,模拟电梯的功能。功能接口包括电梯上行按钮、下行按钮、楼层选择和电梯在行驶过程中的楼层显示。
要求:
1.由用户选择按上行按钮还是下行按钮,选择操作后再由用户输入要进入的楼层,进而电梯开始运行,显示所到的每一楼层层数。
2.如果是上行,则选择输入的楼层号不能比当前楼层号小,否则应给出不合法提示。
3. 如果是下行,则选择输入的楼层号不能比当前楼层号大,否则应给出不合法提示。
4.电梯一旦开始运作就会始终运行,直到窗口关闭。
程序要求的结果请运行elevator.exe
提示:
从功能要求上我们可以抽象出一个Elevator电梯类,结构如下:

class Elevator
{
private:
	int floor;  //电梯总的楼层数
	bool up;    //是否上行,bool为布尔类型,可取值true或false
	bool down;   //是否下行
	int currentFloor; //当前所在楼层
public:
	Elevator(int floor);  
	void setUpButton();   //按下上行按钮
	void setDownButton();  //按下下行按钮
	void setFloorNumber(int floorNumber);  //根据要进入的楼层电梯开始运行,并逐层显示经过的楼层
	int getCurrentFloor(); //获得当前所在楼层
};

接下来需要做的就是在主函数中根据已经定义好的Elevator类实例化一个电梯,根据用户的输入选择来操作这个实例化的电梯了。
五、注意事项和要求
要求学生要提前准备实验的内容
实验完成后要求写出实验报告
六、参考书目
【C++ Prime题解】侯捷译 华中科技大学出版社
【C++程序设计与应用】 张耀仁著 华中科技大学出版社

<center> 浙江理工大学信息学院 </center> <center> 面向对象程序设计实验报告 </center> <center> 实验名称:类的定义与使用 学时安排:3 <center> 实验类别:设计性实验 实验要求:1人1组 <center> 姓名: 申屠志刚 学号: 2018329621200 </center> <center>  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ </center> </center> </center>

一、实验目的
1)掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2)掌握类对象的定义;
3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;
二、实验原理介绍
通过建立类及对象,用类的成员函数和对象访问类的成员;
利用建立类的构造函数,完成类的成员的初始化工作;
三、实验设备介绍
软件需求: windows或linux下的c++编译器
硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。
四、实验内容
编写一个程序,模拟电梯的功能。功能接口包括电梯上行按钮、下行按钮、楼层选择和电梯在行驶过程中的楼层显示。
要求:
1.由用户选择按上行按钮还是下行按钮,选择操作后再由用户输入要进入的楼层,进而电梯开始运行,显示所到的每一楼层层数。
2.如果是上行,则选择输入的楼层号不能比当前楼层号小,否则应给出不合法提示。
3. 如果是下行,则选择输入的楼层号不能比当前楼层号大,否则应给出不合法提示。
4.电梯一旦开始运作就会始终运行,直到窗口关闭。
5.电梯在经过不同楼层时,最好每个楼层的显示之间能有延迟,最终停靠的楼层的输出形式能更加醒目。如果可以,在电梯最初开始运行时,能在电梯由内部显示当前日期(提示:实现这些功能时,需要调用系统api,实现时间显示功能可以使用CDate类)。
五 程序清单
main.cpp

/* *@Author: STZG *@Language: C++ */
#include<iostream>
#include"date.h"
#include"Elevator.h"
using namespace std;
CDate data;
Elevator elevator(10);
void err(){
    cout<<"-----无效操作-----"<<endl;
}
void exit(){
    exit(0);
}
void memu(){
    cout<<" ---请选择操作----"<<endl;
    cout<<"| 1.上升 |"<<endl;
    cout<<"| 2.下降 |"<<endl;
    cout<<"| 3.退出 |"<<endl;
    cout<<" -----------------"<<endl;
}
void init(){
    cout<<"今天是"<<data.format("DDD")<<endl;
    cout<<"该电梯一共10层, 欢迎您的使用!"<<endl;
}
int main()
{
    init();
    while(1){
        int op;
        memu();
        scanf("%d",&op);
        switch(op){
            case 1:elevator.setUpButton();break;
            case 2:elevator.setDownButton();break;
            case 3:exit();break;
            default:err();break;
        }
    }
    //cout << "Hello world!" << endl;
    return 0;
}

Elevator.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);
        currentFloor=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);
        currentFloor=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);
    }
}
int Elevator::getCurrentFloor()//获得当前所在楼层
{
    return currentFloor;
}

Elevator.h

#ifndef ELEVATOR_H
#define ELEVATOR_H
#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std;

class Elevator
{
    public:
        Elevator();
        virtual ~Elevator();
        Elevator(int floor);
        void setUpButton();   //按下上行按钮
        void setDownButton();  //按下下行按钮
        void setFloorNumber(int floorNumber);  //根据要进入的楼层电梯开始运行,并逐层显示经过的楼层
        int getCurrentFloor(); //获得当前所在楼层
    protected:

    private:
        int floor;  //电梯总的楼层数
        bool up;    //是否上行,bool为布尔类型,可取值true或false
        bool down;   //是否下行
        int currentFloor; //当前所在楼层

};

date.cpp

#endif // ELEVATOR_H
#include"date.h"
CDate::CDate(int dd, int mm, int yy):df_s("ddd"),df_l("DDD")    //初始化
{
	if((mm>=1 && mm<=12) && (dd>=1 && dd<=31))
	{
		m = mm; d = dd; y = yy;

	}else {

		m = 0; d = 0; y = 0;

		cout<<"the date created is wrong"<<endl;

	}

}
CDate::CDate():df_s("ddd"),df_l("DDD")    //初始化
{
	time_t now;

	time(&now);

	struct tm *t_now;

	t_now = localtime(&now);

	y = t_now -> tm_year + 1900;

	m = t_now -> tm_mon + 1;

	d = t_now -> tm_mday;
}
void CDate::add_year(int n)               //加n年
{
		y += n;
}
void CDate::add_month(int n)              //加n月
{
		m += n;
}
void CDate::add_day(int n)                //加n天
{
		d += n;
}
string CDate::format(string df)
{
		char c_df[20];
		if(df == df_s)
		{
			sprintf(c_df, "%d-%d-%d", y, m, d);
			return string(c_df);
		}
		if(df == df_l)
		{
			sprintf(c_df, "%d年%d月%d日", y, m, d);
			return string(c_df);
		}
		return string("");
}
int CDate::get_day() const
{
	return d;
}
int CDate::get_month() const
{
	return m;
}
int CDate::get_year() const
{
	return y;
}

date.h

#ifndef DATE_H
#define DATE_H
#include <iostream>
#include<ctime>
#include<cstdlib>
#include<string>
#include<cstdio>
using namespace std;
class CDate{
	int d,m,y;
	const string df_s;
	const string df_l;
public:
	CDate(int dd,int mm=1,int yy=1999);
	CDate();
	void add_year(int n);
	void add_month(int n);
	void add_day(int n);
	string format(string df);
	int get_day() const;
	int get_month() const;
	int get_year() const;
};
#endif

六 运行结果

七 实验心得
通过本次实验
掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
掌握类对象的定义;
理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;
学会通过建立类及对象,用类的成员函数和对象访问类的成员;
学会利用建立类的构造函数,完成类的成员的初始化工作;