⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实验室机位管理.cpp

📁 实验室机位管理模型的完整实现
💻 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 + -