当前位置: 首页 > news >正文

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");elseprintf("\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”) ,获取最新动态,⚡️ 让信息传递更加迅速。

相关文章:

  • AIGC(生成式AI)试用 30 -- AI做软件程序测试 1
  • Day58 | 179. 最大数、316. 去除重复字母、334. 递增的三元子序列
  • 插叙的作用
  • 安全技术和防火墙
  • Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)
  • 《银行数字化风控-业务于实战》读后知识总结
  • 算法—插入排序—js(小数据或基本有序数据)
  • 八大排序之希尔排序
  • StringEscapeUtils:给你的字符串穿上“防弹衣“——转义工具类深度解析
  • 【Rust 精进之路之第6篇-流程之舞】控制流:`if/else`, `loop`, `while`, `for` 与模式匹配初窥
  • PFLM: Privacy-preserving federated learning with membership proof证明阅读
  • 最新iOS性能测试方法与教程
  • 秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全
  • QML、Qt Quick 、Qt Quick Controls 2
  • Android Drawable 目录下的 XML 图形文件详解
  • 英语学习4.15
  • 线性DP:数字三角形
  • 简单使用MCP
  • 体育用品有哪些·棒球1号位
  • 哪个开源协议对用户最友好?开源协议对比
  • 北理工:开除宫某党籍,免去行政职务,解除聘用关系
  • 第八届进博会倒计时200天,超100家展商将连续八届参展
  • 绝境逆转晋级世界杯四强,王楚钦再爆金句:能抽死我就给你了
  • 居然智家:实控人、董事长兼CEO汪林朋被留置、立案,公司经营正常
  • 钧正平发声:擅自更改地图标注,谷歌想当南海搅局者?!
  • 人事时间|商务部国际贸易谈判代表是什么职务,负责哪些工作?