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. 保存信息:退出时保存信息并更新文件。

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

代码实现

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

c 复制代码
// 机房机位预约系统
#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") ,获取最新动态,⚡️ 让信息传递更加迅速。

相关推荐
czy87874751 小时前
C语言主要标准版本的演进与核心区别的对比分析
c语言
巨龙之路1 小时前
C语言中的assert
c语言·开发语言
辛一一2 小时前
neo4j图数据库基本概念和向量使用
数据库·neo4j
熊大如如3 小时前
Java 反射
java·开发语言
巨龙之路3 小时前
什么是时序数据库?
数据库·时序数据库
蔡蓝3 小时前
binlog日志以及MySQL的数据同步
数据库·mysql
猿来入此小猿3 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
goTsHgo4 小时前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder4 小时前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
是店小二呀4 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文