📄 实验室机位管理.cpp
字号:
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <stdio.h>
//以下为第一部分,定义单链表的抽象数据类型
struct DNode//存储学生信息的节点
{
char id[4];
char name[8];
char clas[5];
int seat;
int tmin[2];
int tmout[2];
DNode *next;
};
int comp(char a[4],char b[4])
{ //比较学号是否相同
for(int i=0;i<4;i++)
if(a[i]!=b[i]) break;
if(i==4) return 1;
else return 0;
}
void InitList(DNode *&HL)//初始化
{
HL=NULL;
}
int EmptyList(DNode *&HL)//判断链表是否为空
{
return HL==NULL;
}
void NewInsert(DNode *&HL,char in1[4],char in2[8],char in3[5],int &in4,int in5[2],int in6[2])
{ //向链表中插入新节点
DNode *newptr;
newptr=new DNode;
if(newptr==NULL)
{ //分配内存失败,输出提示,结束程序
cerr<<"Memory allocation failure!"<<endl;
exit(1);
}
for(int i=0;i<4;i++) //节点信息插入新节点中
newptr->id[i]=in1[i];
for(i=0;i<8;i++)
newptr->name[i]=in2[i];
for(i=0;i<5;i++)
newptr->clas[i]=in3[i];
newptr->seat=in4;
for(i=0;i<2;i++)
newptr->tmin[i]=in5[i];
for(i=0;i<2;i++)
newptr->tmout[i]=in6[i];
newptr->next=NULL;
if(HL==NULL) HL=newptr;//表空则作新节点
else{ //否则遍历到末尾再插入
DNode *p=HL;
while(p->next!=NULL)
p=p->next;
p->next=newptr;
}
}
void nodecut(DNode *&HL,char id[4])
{ //从链表中删除节点
if(HL==NULL)
{ //表已空则输出提示,结束程序
cerr<<"链表已空,无法删除节点,结束操作。"<<endl;
exit(1);
}
DNode *ptr,*pos;
ptr=HL;
while(!comp(ptr->id,id)){
pos=ptr;
ptr=ptr->next;
}
if(HL==ptr) HL=ptr->next;//删除头节点
else pos->next=ptr->next;
delete ptr;//释放节点空间
}
//以下为第二部分,定义栈的抽象数据类型
struct Stack{ //用于存储机位的栈
int stack[20];//机位总数为两百
int top;
};
void InitStack(Stack &s)//初始化栈
{
s.top=-1;
}
int EmptyStack(Stack &s)//检查栈是否为空
{
return s.top==-1;
}
void Push(Stack &s,int item)//向栈中插入元素
{
if(s.top==19){//栈已满则输出提示、结束程序
cerr<<"Stack overflow!"<<endl;
exit(1);
}
s.top++;
s.stack[s.top]=item;
}
int Pop(Stack &s)//从栈中删除元素
{
if(s.top==-1){////栈已空则输出提示、结束程序
cerr<<"Stack is empty!"<<endl;
exit(1);
}
int temp=s.stack[s.top];
s.top--;
return temp;
}
//以下为第三部分,定义结构体的模块和计算上机时间的函数
struct Stu
{
char id[4];
char name[8];
char clas[5];
double buy;
double total;
double left;
};
static struct Stu stu[6]=
{ //初始化存储学生信息的结构体数组
{"121","tom","w41",0,10,10},
{"122","sam","w42",0,10,10},
{"123","jay","w43",0,10,10},
{"124","moses","w45",0,10,10},
{"125","john","w46",0,10,10},
{"126","peter","w48",0,10,10},
};
double timecut(int a[2],int b[2])
{ //计算上机时间的函数
double c;
if(a[1]>=b[1]){//a的秒值比b的秒值大
int pp=a[1]-b[1];
c=a[0]-b[0]+pp/60.0;
}
else{//a的秒值比b的秒值小
int pp=a[1]-b[1]+60;
c=a[0]-b[0]-1+pp/60.0;
}
return c;
}
//以下为第四部分,实现各种功能的模块
void xiaji(Stack &lef,struct Stu stu[6],DNode *&sin,int n)
{ //处理有学生下机时的操作
int a[2];
char temp[4];
double time=0.0;
for(int i=0;i<4;i++)
temp[i]=stu[n].id[i];
DNode *ptr;
ptr=sin;
while(!comp(ptr->id,temp))
ptr=ptr->next;
cout<<"您的上机时间为"<<ptr->tmin[0]<<":"<<ptr->tmin[1]<<endl;
cout<<"请分别输入下机时间的时和分,中间空格:"<<endl;
cin>>a[0]>>a[1];
time=timecut(a,ptr->tmin);
while(time<0||a[0]<0||a[0]>24||a[1]<0||a[1]>60)
{
cout<<"下机时间错误,请确认后再输入!"<<endl;
cin>>a[0]>>a[1];
time=timecut(a,ptr->tmin);
}
stu[n].left=stu[n].left-time;
Push(lef,ptr->seat);//回收机位,入栈
nodecut(sin,ptr->id);//从当前上机学生表中删除此人信息
cout<<"下机并回收机位成功,上机总时间为"<<time<<endl;
}
void fun1(Stack &lef,struct Stu stu[6],DNode *&sin,int n)
{ //处理有学生刷卡进入时的操作
int a[2],b[2]; //记录时间的数组
b[0]=b[1]=0;
DNode *ptr;
ptr=sin;
while(ptr!=NULL)
{
if(!comp(ptr->id,stu[n].id))
ptr=ptr->next;
else break;
}
if(ptr==NULL)
{
cout<<"请分别输入进入时间的时和分,中间空格:"<<endl;
cin>>a[0]>>a[1];//输入进入时间
while(a[0]<0||a[0]>24||a[1]<0||a[1]>60)
{
cout<<"上机时间有误,请确认后再输入!"<<endl;
cin>>a[0]>>a[1];
}
if(EmptyStack(lef))//没有空闲机位
cout<<"此时不能进入,没有空闲机位。"<<endl;
else if(stu[n].left==0)//没有剩余机时
cout<<"您已没有剩余机时,不能进入,请购买机时。"<<endl;
else{ //符合要求则分配机位并记录其信息
int temp=Pop(lef);
cout<<"机位分配成功,机位号为"<<temp<<endl;
NewInsert(sin,stu[n].id,stu[n].name,stu[n].clas,temp,a,b);
}
}
else xiaji(lef,stu,sin,n);
}
void fun2(DNode *&sin)
{ //统计输出当前上机学生的信息
DNode *ptr=sin;
cout<<"当前上机学生相关信息依次如下:"<<endl;
cout<<setw(5)<<"学号";
cout<<setw(8)<<"姓名";
cout<<setw(6)<<"班级";
cout<<setw(5)<<"座号";
cout<<setw(4)<<"上机时间";
cout<<endl;
while(ptr!=NULL){//遍历输出学号、姓名、班级、座位号、进入时间
cout<<setw(5)<<ptr->id;
cout<<setw(8)<<ptr->name;
cout<<setw(6)<<ptr->clas;
cout<<setw(3)<<ptr->seat;
cout<<setw(4)<<ptr->tmin[0]<<":"<<ptr->tmin[1];
cout<<endl;
ptr=ptr->next;
}
}
void fun3(DNode *&sin,char temp[4])
{ //查找某个学生是否在上机
DNode *ptr;
ptr=sin;
while(ptr!=NULL)
{
if(!comp(ptr->id,temp))
ptr=ptr->next;
else break;
}
if(ptr==NULL) cout<<"此人目前不在上机!"<<endl;
else{
cout<<"此人相关信息如下:"<<endl;
cout<<"学号:"<<setw(5)<<ptr->id<<endl;
cout<<"姓名:"<<setw(8)<<ptr->name<<endl;
cout<<"班级:"<<setw(5)<<ptr->clas<<endl;
cout<<"机号:"<<setw(3)<<ptr->seat<<endl;
cout<<"上机时间:"<<setw(4)<<ptr->tmin[0]<<":"<<ptr->tmin[1];
cout<<endl;
}
}
void fun4(struct Stu stu[6],int m)//m为学生总人数
{ //统计学生剩余机时
int i=0,temp=0;
cout<<"剩余机时不足的学生有:"<<endl;
for(i=0;i<m;i++)
{ //输出剩余机时为零的学生学号
if(stu[i].left<=0)
{
cout<<setw(4)<<stu[i].id;
cout<<setw(7)<<stu[i].left<<endl;
temp++;
}
}
if(temp==0) cout<<"没有剩余机时不足的学生!"<<endl;
}
void fun5(Stack &lef)
{ //统计目前剩余机位情况
if(EmptyStack(lef)) cout<<"目前无空闲机位!"<<endl;
else{//有剩余机位则输出空闲机位号
cout<<"目前空闲的机位号为:"<<endl;
int temp=lef.top;
for(int i=0;i<=temp;i++)
cout<<setw(4)<<lef.stack[i];
cout<<endl;
}
}
void fun6(struct Stu stu[6],int n,double time)
{ //购买机时的函数,购买机时、总机时、剩余机时都增加
stu[n].left=stu[n].left+time;
stu[n].buy=stu[n].buy+time;
stu[n].total=stu[n].total+time;
cout<<"购买及时成功,购买机时为"<<time<<endl;
}
int input()
{ //输入并验证学号的函数
int patch1,i,num;
char id[4];
cout<<"请输入你的学号(121~126):"<<endl;//输入学号
cin>>id;
while(patch1){//学号输入的异常处理
i=0;//查找学号在学生信息表格中的编号
while(i<6&&!comp(stu[i].id,id))
i++;
if(i==6) //没找到则重新输入
{
cout<<"学号错误,请重新输入:"<<endl;
cin>>id;
}
else {num=i;patch1=0;}//找到并记录编号
}
return num;
}
//以下为第五部分,主函数
void main()
{
int patch=1,func,i,num;
char num1[4];
double time;
Stack lefp;
InitStack(lefp);
for(i=19;i>=0;i--)
Push(lefp,i+1);
DNode *infs;
InitList(infs);
cout<<"学生初始信息如下:"<<endl;
for(i=0;i<6;i++){
cout<<setw(5)<<stu[i].id;
cout<<setw(8)<<stu[i].name;
cout<<setw(5)<<stu[i].clas;
cout<<setw(4)<<stu[i].buy;
cout<<setw(4)<<stu[i].total;
cout<<setw(4)<<stu[i].left;
cout<<endl;
}
while(patch){
cout<<"请选择要执行的系统功能:"<<endl;
cout<<"1:刷卡进出机房;"<<endl;
cout<<"2:统计当前上机同学的信息;"<<endl;
cout<<"3:查找某个学生是否在机房;"<<endl;
cout<<"4:统计学生剩余机时的情况;"<<endl;
cout<<"5:统计当前空闲机位情况;"<<endl;
cout<<"6:购买机时;"<<endl;
cin>>func;
while(func<1||func>7){//功能选择的异常处理
cout<<"输入错误,请重新选择!"<<endl;
cin>>func;
}
switch(func)//执行所选择的功能功能
{
case 1: {
num=input();
fun1(lefp,stu,infs,num);
break;
}
case 2: fun2(infs); break;
case 3: {
cout<<"请输入你要查找的人的学号:"<<endl;
cin>>num1;
fun3(infs,num1);
break;
}
case 4: fun4(stu,6); break;
case 5: fun5(lefp); break;
default: {
num=input();
cout<<"请输入要购买的机时数:"<<endl;
cin>>time;
fun6(stu,num,time);
break;
}
}
cout<<"请选择是否继续程序,是请输入1,否请输入0:"<<endl;
cin>>patch;
while(patch!=0&&patch!=1)//功能选择的异常处理
{
cout<<"功能选择错误,请重新输入"<<endl;
cin>>patch;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -