C++——实验1:面向对象程序设计实验报告

面向对象程序设计实验报告

实验名称:类的定义与使用                      学时安排:3

实验类别:设计性实验                         实验要求:1人1组

 

目录

面向对象程序设计实验报告

一、实验目的

二、实验原理介绍

三、实验设备介绍

四、实验内容

五、程序清单

1、电梯头文件

2、电梯源文件

3、日期头文件

4、日期源文件

5、主函数

六、运行结果

1、正常上行

2、上行异常

3、正常下行

4、下行异常

5、退出(为显示运行成功,在编译时截图)

七、实验心得


 

一、实验目的

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、正常上行

266f8832a63642c7bdb9f7f02a887c3e.png

 

2、上行异常

775861926d414d0ab20069fb4d5f8eb7.png

3、正常下行

81aa6cd3a55e4b91a6026db79f13d39c.png

 

4、下行异常

0867d9c738cc451990f7a0cbf32b85ec.png

 

5、退出(为显示运行成功,在编译时截图)

1ff656150ff44bab820a4d406386e327.png

七、实验心得

通过这次实验,我掌握了类和对象的定义,并且对类的封装机制有了更深层的认识。对于类的公共成员,成员变量与成员函数可以在类的内部和外界访问及调用;对于类的私有成员,成员变量跟成员函数只能在类的内部被访问及调用。因此,我们在对类进行封装时,一定要判断清楚成员变量和成员函数的属性。

同时通过查阅相关资料,我学会了调用SetConsoleTextAttribute()函数对输出的字体颜色进行修改,掌握了利用Sleep()函数使程序的暂时处于非活动状态,理解了运用time()函数和localtime()函数分别实现系统当前时间的存储和将时间格式化为日期结构体。

本次实验,将课堂中学习的理论知识运用到了实践中,巩固与加强了对类与对象的学习效果。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阮阮的阮阮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值