C语言之机房机位预约系统
🌟 嗨,我是LucianaiB!
🌍 总有人间一两风,填我十万八千梦。
🚀 路漫漫其修远兮,吾将上下而求索。
C语言之机房机位预约系统
目录
在现代计算机实验室中,机位预约系统是提高资源利用效率和用户体验的重要工具。本文将介绍一个基于C++实现的机房机位预约系统,该系统能够帮助用户预约机位、查看预约信息、退订预约以及记录上机信息。
系统功能概述
流程图
该机房机位预约系统具备以下核心功能:
- 预约登记:用户可以预约指定日期和时间段的机位。
- 查看预约信息:用户可以查看所有预约信息。
- 退订预约:用户可以取消已预约的机位。
- 上机登记:用户可以进行上机登记,系统会记录上机信息。
- 系统管理:系统自动保存预约信息和上机记录,并在程序退出时更新文件。
系统设计
系统设计基于以下几个关键结构体和函数:
- Cstf:存储顾客信息,包括姓名和电话号码。
- PCInf:表示一台电脑在某个时间段的状态和顾客信息。
- Date:存储日期信息,包括年、月、日。
- Diary:存储机房一天内所有电脑的预约信息。
主要函数包括:
- Print_Menu():打印系统菜单。
- Get_Res():计算给定日期与当前日期的相对天数。
- Judge_Date():判断输入的日期是否有效,并计算与当前日期的相对天数。
- book_PC():实现预约登记功能。
- View_Reservations():查看所有预约信息。
- Exit_PC():实现退订功能。
- Go_PC():实现上机登记功能。
- Deal():将字符串转换为整数。
- Read():从文件中读取预约信息并存储到结构体数组中。
- Write():将当天的上机信息写入
Past.txt
文件,将预约信息写入Reservation.txt
文件。
系统运行流程
- 初始化:程序启动时,调用
Read()
函数从文件中读取预约信息。 - 主菜单:显示系统菜单,等待用户选择操作。
- 执行操作:根据用户选择,调用相应的功能函数(如预约登记、退订、上机登记等)。
- 保存信息:用户选择退出系统时,调用
Write()
函数保存信息并退出程序。
总结
本文介绍了一个基于C++的机房机位预约系统,旨在高效管理机房资源并提升用户体验。系统通过结构化设计实现了预约登记、查看预约信息、退订预约、上机登记和系统管理等功能。
系统的核心功能包括:
- 预约登记:用户可预约特定日期和时间段的机位,系统自动检查机位可用性。
- 查看预约信息:用户可查看所有预约信息,包括日期、时间段、机位编号、预约人姓名和电话。
- 退订预约:用户可通过输入预约日期、时间段和姓名来取消预约。
- 上机登记:用户到机房后进行上机登记,系统记录上机信息并更新机位状态。
- 系统管理:系统自动保存预约信息和上机记录,并在退出时更新文件。
系统设计基于以下结构体:
- Cstf:存储顾客信息(姓名和电话)。
- PCInf:表示电脑在某个时间段的状态和顾客信息。
- Date:存储日期信息(年、月、日)。
- Diary:存储机房一天内所有电脑的预约信息。
主要函数包括:
- Print_Menu():打印系统菜单。
- Get_Res():计算给定日期与当前日期的相对天数。
- Judge_Date():判断输入日期是否有效。
- book_PC():实现预约登记功能。
- View_Reservations():查看所有预约信息。
- Exit_PC():实现退订功能。
- Go_PC():实现上机登记功能。
- Read():从文件读取预约信息。
- Write():将预约信息和上机记录写入文件。
系统运行流程为:
- 初始化:启动时读取预约信息。
- 主菜单:显示菜单并等待用户选择。
- 执行操作:根据用户选择调用对应功能。
- 保存信息:退出时保存信息并更新文件。
该系统通过文件操作实现了数据持久化,确保了预约信息和上机记录的完整性和一致性。其设计合理、功能齐全,能够有效满足机房日常管理需求。
代码实现
以下是系统的核心代码实现:
// 机房机位预约系统
#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)!