?? 實驗室機位管理.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 + -