自学内容网 自学内容网

C语言之机房机位预约系统


🌟 嗨,我是LucianaiB

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。


C语言之机房机位预约系统

目录

  1. 博客:机房机位预约系统设计与实现
    1. 系统功能概述
    2. 系统设计
      1. 结构体设计
      2. 主要函数
    3. 系统运行流程
    4. 总结
    5. 代码实现

在现代计算机实验室中,机位预约系统是提高资源利用效率和用户体验的重要工具。本文将介绍一个基于C++实现的机房机位预约系统,该系统能够帮助用户预约机位、查看预约信息、退订预约以及记录上机信息。

系统功能概述
流程图

在这里插入图片描述

该机房机位预约系统具备以下核心功能:

  1. 预约登记:用户可以预约指定日期和时间段的机位。
  2. 查看预约信息:用户可以查看所有预约信息。
  3. 退订预约:用户可以取消已预约的机位。
  4. 上机登记:用户可以进行上机登记,系统会记录上机信息。
  5. 系统管理:系统自动保存预约信息和上机记录,并在程序退出时更新文件。
系统设计

系统设计基于以下几个关键结构体和函数:

  1. Cstf:存储顾客信息,包括姓名和电话号码。
  2. PCInf:表示一台电脑在某个时间段的状态和顾客信息。
  3. Date:存储日期信息,包括年、月、日。
  4. Diary:存储机房一天内所有电脑的预约信息。

主要函数包括:

  • Print_Menu():打印系统菜单。
  • Get_Res():计算给定日期与当前日期的相对天数。
  • Judge_Date():判断输入的日期是否有效,并计算与当前日期的相对天数。
  • book_PC():实现预约登记功能。
  • View_Reservations():查看所有预约信息。
  • Exit_PC():实现退订功能。
  • Go_PC():实现上机登记功能。
  • Deal():将字符串转换为整数。
  • Read():从文件中读取预约信息并存储到结构体数组中。
  • Write():将当天的上机信息写入Past.txt文件,将预约信息写入Reservation.txt文件。
系统运行流程
  1. 初始化:程序启动时,调用Read()函数从文件中读取预约信息。
  2. 主菜单:显示系统菜单,等待用户选择操作。
  3. 执行操作:根据用户选择,调用相应的功能函数(如预约登记、退订、上机登记等)。
  4. 保存信息:用户选择退出系统时,调用Write()函数保存信息并退出程序。

总结

本文介绍了一个基于C++的机房机位预约系统,旨在高效管理机房资源并提升用户体验。系统通过结构化设计实现了预约登记、查看预约信息、退订预约、上机登记和系统管理等功能。

系统的核心功能包括:

  1. 预约登记:用户可预约特定日期和时间段的机位,系统自动检查机位可用性。
  2. 查看预约信息:用户可查看所有预约信息,包括日期、时间段、机位编号、预约人姓名和电话。
  3. 退订预约:用户可通过输入预约日期、时间段和姓名来取消预约。
  4. 上机登记:用户到机房后进行上机登记,系统记录上机信息并更新机位状态。
  5. 系统管理:系统自动保存预约信息和上机记录,并在退出时更新文件。

系统设计基于以下结构体:

  • Cstf:存储顾客信息(姓名和电话)。
  • PCInf:表示电脑在某个时间段的状态和顾客信息。
  • Date:存储日期信息(年、月、日)。
  • Diary:存储机房一天内所有电脑的预约信息。

主要函数包括:

  • Print_Menu():打印系统菜单。
  • Get_Res():计算给定日期与当前日期的相对天数。
  • Judge_Date():判断输入日期是否有效。
  • book_PC():实现预约登记功能。
  • View_Reservations():查看所有预约信息。
  • Exit_PC():实现退订功能。
  • Go_PC():实现上机登记功能。
  • Read():从文件读取预约信息。
  • Write():将预约信息和上机记录写入文件。

系统运行流程为:

  1. 初始化:启动时读取预约信息。
  2. 主菜单:显示菜单并等待用户选择。
  3. 执行操作:根据用户选择调用对应功能。
  4. 保存信息:退出时保存信息并更新文件。

该系统通过文件操作实现了数据持久化,确保了预约信息和上机记录的完整性和一致性。其设计合理、功能齐全,能够有效满足机房日常管理需求。

代码实现

以下是系统的核心代码实现:

// 机房机位预约系统
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>

/*
    程序第一次运行,两个文件应该全是空
    程序结束之后,将当天的上机信息,记录到Past文件中
    Reservation文件更新未第二天开始后的两周内的预约记录
    Past文件中的每一行存储:日期,每个上机顾客时间段和机位
    Reaervation文件中每一行记录, 日期,
*/
using namespace std;
fstream past,reservation;
//存储顾客情况(姓名和电话号)的结构体Cstf
typedef struct{
    char name[20];
    char tel[12];
}Cstf;
//表示一台电脑在一个时段的状态和顾客情况的结构体PCInf
typedef struct{
    int state;        //机位状态  0 代表空闲,1代表已经被占用  2 代表正在上机
    Cstf cst;        //
}PCInf;
//存储机房一天全部机位信息的结构体Diary
typedef struct{
    int year;
    int month;
    int day;
}Date;
typedef struct{
    Date dd;
    PCInf pc[20][6];        //20个电脑  每个电脑的各个时间段状态
}Diary;
int Month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
/*
    Diary结构体数组 wday[15]表示每天营业开始对应当天起的连续15天内机位的预约内容
    其中,第15个元素对应的电脑在所有时段都为未预约
    当程序运行到当天营业结束时,第一个元素变量wday[0]表示当天的上机情况
    程序开始运行时,系统首先从预约文件中读取数据,作为数组wday[]前14个元素的值
    程序结束y运行前,数组wday[0]表示当天,追加到过期日志文件中去
*/
Diary wday[15];        //每天营业开始对应当天起的连续15天内机位的预约内容。
void Print_Menu(){
    printf("\t\t\t\t\t***欢迎使用机房机位预约系统***\n\n");
    printf("\t\t\t\t\t   请保证系统的正常关闭   \n\n");
    printf("\t\t\t\t\t***    1、预约登记     ***\n\n");
    printf("\t\t\t\t\t***    2、退订         ***\n\n");
    printf("\t\t\t\t\t***    3、上机登记     ***\n\n");
    printf("\t\t\t\t\t***    4、退出系统     ***\n\n");
    printf("\t\t\t\t\t**************************\n\n");
}

int Get_Res(int year,int month,int day){
    int res = 0;
    if(year==wday[0].dd.year&&month==wday[0].dd.month)    res = day-wday[0].dd.day;
    else if(year==wday[0].dd.year) res = day + Month[month]-wday[0].dd.day;
    return res;
}

int Judge_Date(int year,int month,int day,int &res){
    int flag = 1;
    if(month>=1&&month<=12){
        if(day<=0||day>Month[month]) flag = 0;
        res = Get_Res(year,month,day);
        if(res>=15) flag = 0;
    }
    else flag = 0;
    return flag;
}

//预约登记
void book_PC(){
    int year,month,day,book;
    int duan,i,j;
    int flag = 1;
    char c;
    int res = 0;
    printf("请输入预约的日期:(格式:YYYY/MM/DD)");
    scanf("%d/%d/%d",&year,&month,&day);
    flag = Judge_Date(year,month,day,res);
    if(!flag){
        printf("日期输入有误!即将返回主菜单!");
        system("pause");
        return;
    }
    printf("请输入要预约这一天的时间段:\n");
    printf("1、8:00~10:00\n2、10:00~12:00\n3、12:00~14:00\n4、14:00~16:00\n5、16:00~18:00\n6、18:00~20:00\n");
    scanf("%d",&duan);
    //利用循环检查这一天的20台PC  有没有空闲的机器
    flag = 0;
    for(i = 0 ; i < 20 ; i ++ ){
        if(wday[res].pc[i][duan-1].state==0){
            flag = 1;
            book = i+1;
            break;
        }
    }
    if(flag==0){
        printf("不好意思!您选择的日期对应的时间段已经被预约!\n");
        printf("以下列出了你预约这一天的有空机位的其他时间段:\n");
        for(i = 0 ; i < 20 ; i ++ ){
            for(j = 0 ; j < 6 ; j ++ ){
                if(wday[res].pc[i][j].state==0){
                    printf("第%d号机器\t时间段:",i+1);
                    if(j==0) printf("8:00~10:00\t时间段编号:1\n");
                    else if(j==1) printf("10:00~12:00\t时间段编号:2\n");
                    else if(j==2) printf("12:00~14:00\t时间段编号:3\n");
                    else if(j==3) printf("14:00~16:00\t时间段编号:4\n");
                    else if(j==4) printf("16:00~18:00\t时间段编号:5\n");
                    else if(j==5) printf("18:00~20:00\t时间段编号:6\n");
                    printf("\n");
                }
            }
        }
        printf("\n您还需要预约机位吗?(Y/N)");
        scanf("%c",&c);
        getchar();
        if(c=='y'||c=='Y'){
            printf("请从以上列出的可用机器中选择机位:(输入序号)");
            scanf("%d",&book);
            printf("请输入相应的时间段:");
            scanf("%d",&duan);
        }else{
            printf("\n预约机位失败!即将返回主菜单!\n");
            system("pause");
            return;
        }
    }
    printf("请输入你的姓名:");
    scanf("%s",wday[res].pc[book-1][duan-1].cst.name);
    getchar();
    printf("请输入你的电话:");
    scanf("%s",wday[res].pc[book-1][duan-1].cst.tel);
    getchar();
    wday[res].pc[book-1][duan-1].state=1;        //表示已预约
    printf("\nOK!你已经成功预约%d号机器\n时间段编号:%d\n预约日期:%d年%d月%d日\n\n",book,duan,year,month,day);
    printf("即将返回主界面!\n");
    system("pause");
}

//查看所有人预约
void View_Reservations(){
    ifstream reservation("Reservation.txt");
    if(reservation.is_open()){
        string line;
        cout << "\n所有预约信息如下:\n";
        while(getline(reservation, line)){
            if(!line.empty()) {
                cout << line << endl;
            }
        }
        reservation.close();
    } else {
        cout << "无法打开预约文件。\n";
    }
    system("pause");
}

//退订
void Exit_PC(){
    int year,month,day;
    int i,flag,res=0,duan;
    char nname[20];
    printf("请输入您预约的日期:(YYYY/MM/DD)");
    scanf("%d/%d/%d",&year,&month,&day);
    flag = Judge_Date(year,month,day,res);
    if(!flag){
        printf("日期输入有误,将返回至主菜单!\n");
        system("pause");
        return;
    }
    printf("请输入时间段编号:");
    scanf("%d",&duan);
    printf("请输入您的姓名:");
    scanf("%s",nname);
    getchar();
    flag = 0;
    for(i = 0 ; i < 20 ; i ++ ){
        if(strcmp(wday[res].pc[i][duan-1].cst.name,nname)==0){
            flag = 1;
            wday[res].pc[i][duan-1].state=0;
            break;
        }
    }
    if(!flag)
        printf("\n没有找到您的预约座位信息!\n");
    else
        printf("\n已成功取消预约!\n");
    printf("\n系统将返回主界面!!\n");
    system("pause");
    return;
}

//上机登记
void Go_PC(){
    int i,j,duan,book;
    char c,nname[20];
    printf("请问您是预约客户吗?(Y/N)");
    scanf("%c",&c);
    getchar();
    if(c=='y'||c=='Y'){
        printf("请输入您的姓名:");
        scanf("%s",nname);
        getchar();
        printf("请输入您预约的机器编号:");
        scanf("%d",&book);
        printf("请输入您预约的时间段:");
        scanf("%d",&duan);
        if(strcmp(nname,wday[0].pc[book-1][duan-1].cst.name)==0){
            wday[0].pc[book-1][duan-1].state=2;
            printf("上机成功!\n\n");
            printf("即将返回至主菜单!");
            system("pause");
            return;
        }
        else{
            printf("没有检索到对应的人!\n\n");
            printf("即将返回至主菜单!");
            system("pause");
            return;
        }
    }else{
        printf("以下是今天所有空机位对应的时间段:\n\n");
        for(i = 0 ; i < 20 ; i ++ ){
            for(j = 0 ; j < 6 ; j ++ ){
                if(wday[0].pc[i][j].state==0){
                    printf("第%d号机器\t时间段:",i+1);
                    if(j==0) printf("8:00~10:00\t时间段编号:1\n");
                    else if(j==1) printf("10:00~12:00\t时间段编号:2\n");
                    else if(j==2) printf("12:00~14:00\t时间段编号:3\n");
                    else if(j==3) printf("14:00~16:00\t时间段编号:4\n");
                    else if(j==4) printf("16:00~18:00\t时间段编号:5\n");
                    else if(j==5) printf("18:00~20:00\t时间段编号:6\n");
                    printf("\n");
                }
            }
        }
        printf("\n您还需要上机吗?(Y/N)");
        scanf("%c",&c);
        getchar();
        if(c=='y'||c=='Y'){
            printf("请从以上列出的可用机器中选择机位:(输入序号)");
            scanf("%d",&book);
            printf("请输入相应的时间段:");
            scanf("%d",&duan);
        }else{
            printf("\n上机失败!即将返回主菜单!\n");
            system("pause");
            return;
        }
        printf("请输入你的姓名:");
        scanf("%s",wday[0].pc[book-1][duan-1].cst.name);
        getchar();
        printf("请输入你的电话:");
        scanf("%s",wday[0].pc[book-1][duan-1].cst.tel);
        getchar();
        wday[0].pc[book-1][duan-1].state=2;
        printf("您已成功上机!\n\n即将返回主菜单!\n\n");
        system("pause");
        return;
    }
}

int Deal(string str){
    int res = 0;
    for(int i = 0 ; i < str.length(); i ++ )
        res = res*10+(str[i]-48);
    return res;
}

//读文件
void Read(){
    string line;
    int ite1,ite2,ite3,timep,c;
    int top = -1;
    reservation.open("Reservation.txt");
    while(getline(reservation,line)){
        //若第一个字符是数字那就代表是姓名,应该存储到结构体数组里面
        if((line[0]>='a'&&line[0]<='z')||(line[0]>='A'&&line[0]<='Z')){
            ite1 = line.find_first_of(',');
            ite2 = line.find(',',ite1+1);
            ite3 = line.find_last_of(',');
            timep = Deal(line.substr(ite3+1,line.length()-ite3-1))-1;
            c = Deal(line.substr(ite2+1,ite3-ite2-1))-1;
            wday[top].pc[c][timep].state=1;
            strcpy(wday[top].pc[c][timep].cst.name,line.substr(0,ite1).c_str());
            strcpy(wday[top].pc[c][timep].cst.tel,line.substr(ite1+1,ite2-ite1-1).c_str());
//            string s;
//            while(getline(reservation,s)){
//                if((s[0]>='a'&&s[0]<='z')||(s[0]>='A'&&s[0]<='Z')){
//                    ite1 = s.find_first_of(',');
//                    ite2 = s.find(',',ite1+1);
//                    ite3 = s.find_last_of(',');
//                    timep = Deal(s.substr(ite3+1,s.length()-ite3-1))-1;
//                    c = Deal(s.substr(ite2+1,ite3-ite2-1))-1;
//                    wday[top].pc[c][timep].state=1;
//                    strcpy(wday[top].pc[c][timep].cst.name,s.substr(0,ite1).c_str());
//                    strcpy(wday[top].pc[c][timep].cst.tel,s.substr(ite1+1,ite2-ite1-1).c_str());
//                }else{
//                    top++;
//                    ite1 = s.find_first_of(',');
//                    wday[top].dd.year=Deal(s.substr(0,ite1));
//                    ite2 = s.find(',',ite1+1);
//                    wday[top].dd.month=Deal(s.substr(ite1+1,ite2-ite1-1));
//                    ite3 = s.find(',',ite2+1);
//                    wday[top].dd.day=Deal(s.substr(ite2+1,ite3-ite2-1));
//                }
//            }
        }else{
            top++;
            ite1 = line.find_first_of(',');
            wday[top].dd.year=Deal(line.substr(0,ite1));
            ite2 = line.find(',',ite1+1);
            wday[top].dd.month=Deal(line.substr(ite1+1,ite2-ite1-1));
            ite3 = line.find(',',ite2+1);
            wday[top].dd.day=Deal(line.substr(ite2+1,ite3-ite2-1));
        }
    }
    reservation.close();
}

//写文件
void Write(){
    // 打开Past文件,以追加的形式写入当天的上机信息
    past.open("Past.txt", ios::app);
    if (past.is_open()) {
        // 遍历当天的电脑和时间段,如果状态为2(正在上机),则写入信息
        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 6; j++) {
                if (wday[0].pc[i][j].state == 2) {
                    past << wday[0].dd.year << ","
                         << wday[0].dd.month << ","
                         << wday[0].dd.day << ","
                         << wday[0].pc[i][j].cst.name << ","
                         << wday[0].pc[i][j].cst.tel << ","
                         << i + 1 << ","
                         << j + 1 << endl;
                }
            }
        }
        past.close();
    } else {
        cerr << "无法打开Past.txt文件进行写入。" << endl;
    }

    // 打开Reservation文件,以覆盖的形式写入预约信息
    reservation.open("Reservation.txt", ios::trunc | ios::out);
    if (reservation.is_open()) {
        // 遍历预约数组,写入所有预约信息
        for (int k = 0; k < 15; k++) {
            reservation << wday[k].dd.year << ","
                        << wday[k].dd.month << ","
                        << wday[k].dd.day << "\n";
            for (int i = 0; i < 20; i++) {
                for (int j = 0; j < 6; j++) {
                    if (wday[k].pc[i][j].state == 1) { // 如果状态为1(已预约)
                        reservation << wday[k].pc[i][j].cst.name << ","
                                    << wday[k].pc[i][j].cst.tel << ","
                                    << i + 1 << ","
                                    << j + 1 << endl;
                    }
                }
            }
        }
        reservation.close();
    } else {
        cerr << "无法打开Reservation.txt文件进行写入。" << endl;
    }
}
int main(){
    Read();
    while(1){
        system("cls");
        Print_Menu();
        printf("请选择你想做的操作:");
        int c;
        scanf("%d",&c);
        getchar();
        if(c==1) book_PC();
        else if(c==2) Exit_PC();
        else if(c==3) Go_PC();
        else if(c==4) View_Reservations();
        else if(c==5){
            Write();
            exit(0);
        }
        else{
            printf("选择错误!\n");
            system("pause");
        }
    }
    return 0;
}

嗨,我是[LucianaiB](https://lucianaib.blog.csdn.net/ “LucianaiB”)。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉[LucianaiB](https://lucianaib.blog.csdn.net/ “LucianaiB”) ,获取最新动态,⚡️ 让信息传递更加迅速。


原文地址:https://blog.csdn.net/lwcwam/article/details/145263891

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!