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

📄 学生信息管理.cpp

📁 学生信息管理
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<string.h>
const int MaxSize=1000;


typedef struct Clock
{
	int hour,minute,second;
}clock;
void DisClock(clock c)
{
	cout<<c.hour<<":"<<c.minute<<":"<<c.second<<endl;
}

clock Subtime(clock c1,clock c2)
{
	clock sub;
	if(c2.second<c1.second)
	{
		c2.minute--;
		c2.second+=60;
		sub.second=c2.second-c1.second;
	}
	else sub.second=c2.second-c1.second;
    if(c2.minute<c1.minute)
	{
		c2.hour--;
		c2.minute+=60;
		sub.minute=c2.minute-c1.minute;
	}
	else sub.minute=c2.minute-c1.minute;
	if(c2.hour<c1.hour)
	{
		cerr<<"error!"<<endl;
		exit(1);
	}
	else sub.hour=c2.hour-c1.hour;
	return sub;
}

clock Add(clock c1,clock c2)
{
	clock add;
	if((c1.second+c2.second)>=60)
	{
		add.second=c1.second+c2.second-60;
		c1.minute+=1;
	}
	else add.second=c1.second+c2.second;
	if((c1.minute+c2.minute)>=60)
	{
        add.minute=c1.minute+c2.minute-60;
		c1.hour+=1;
	}
    else add.minute=c1.minute+c2.minute;
	add.hour=c1.hour+c2.hour;
	return add;
}

typedef struct StuInfo
{ 
    int ID;
	char name[20];
	int Class;
	clock buytime;
	clock totaltime;
	clock remain;
}stuinfo;

typedef struct INFO
{
	stuinfo data;
	INFO *next;
}InfoList;

void Insert1(InfoList *&HL,const StuInfo &item)
{
	InfoList *newptr=new InfoList;
	if(newptr==NULL)
	{
		cerr<<"内存分配失败!"<<endl;
		exit(1);
	}
	newptr->data=item;
	InfoList *ap,*cp;
	ap=HL;
	cp=HL->next;
	while(cp!=NULL)
		if(item.ID<cp->data.ID) break;
		else
		{
			ap=cp;
			cp=cp->next;
		}
    if(ap==HL)
	{
		newptr->next=HL->next;
		HL->next=newptr;
	}
	else
	{
		newptr->next=cp;
		ap->next=newptr;
	}
}

void PrintInfo(InfoList *info)
{
	if(info->next==NULL)
	{
		cout<<"暂无学生信息!"<<endl;
		exit(1);
	}
	cout<<"******学生信息(按学号排列)******"<<endl;
	InfoList *head=new InfoList;
	head=info->next;
	while(head!=NULL)
	{
		cout<<setw(5)<<head->data.ID<<"  "<<head->data.name<<"  "<<head->data.Class<<"  "<<endl;
		cout<<"购买机时:"<<head->data.buytime.hour<<":"<<head->data.buytime.minute<<":"<<head->data.buytime.second<<endl;
		cout<<"总机时:"<<head->data.totaltime.hour<<":"<<head->data.totaltime.minute<<":"<<head->data.totaltime.second<<endl;
		cout<<"剩余机时:"<<head->data.remain.hour<<":"<<head->data.remain.minute<<":"<<head->data.remain.second<<endl;
	    head=head->next;
	}
	cout<<endl;
}

void CreatInfoList(InfoList *info)
{
	
	info->next=NULL;
	stuinfo stu[5]={{003,"aaa",42,{10,23,56},{45,05,00},{19,24,32}},{002,"dsd",42,{9,12,34},{49,23,53},{10,23,45}},{001,"vvv",43,{12,34,5},{23,34,56},{20,34,9}},{004,"uio",45,{23,45,2},{0,0,0},{0,0,0}},{005,"and",44,{34,45,34},{23,45,43},{12,34,45}}};
	for(int j=0;j<5;j++) Insert1(info,stu[j]);
	
}

InfoList* FindStu(InfoList *info,int id)
{
	InfoList *cp=new InfoList;
	cp=info->next;
	if(cp==NULL)
	{
		cerr<<"暂无学生信息!"<<endl;
		exit(1);
	}
	while(cp!=NULL)
	{
		if(cp->data.ID==id)  return cp;
		else cp=cp->next;
	}
	cout<<"没有找到学号为"<<id<<"的学生信息!"<<endl;
	return NULL;
}

void ChangeInfo(InfoList *info)
{
	if(info->next==NULL)
	{
		cerr<<"暂无学生信息!"<<endl;
		exit(1);
	}
	InfoList *cp=new InfoList;
	int num;
    cout<<"请输入要修改信息的学生的学号:"<<endl;
	cin>>num;
	cp=FindStu(info,num);
	if(cp!=NULL)
	{
		cout<<"请输入需要修改的项目: 1:班级 2:购买机时 3:总机时 "<<endl;
		int k;
		cin>>k;
		switch(k)
		{
		case 1: cout<<"请输入新的班级:";
			    int Class;   cin>>Class;
				cp->data.Class=Class;
				break;
		case 2: cout<<"请输入购买机时数:"<<endl;
			    clock buy;  cin>>buy.hour>>buy.minute>>buy.second;
			    cp->data.buytime=Add(cp->data.buytime,buy);
				cp->data.totaltime=Add(cp->data.totaltime,buy);
				break;
        case 3: cout<<"请输入总机时数:"<<endl;
			    clock total; cin>>total.hour>>total.minute>>total.second;
				cp->data.totaltime=total;
				break;
		}
	}
	else
		cout<<"没有找到有关的学生信息,无法修改!"<<endl;
}
void Count0(InfoList *&info)
{
   if(info->next==NULL)
   {
	   cout<<"暂无学生信息!"<<endl;
	   exit(1);
   }
   InfoList *cp=new InfoList;
   cp=info->next;
   int count=0;
   cout<<"剩余机时为零的学生有:"<<endl;
   while(cp!=NULL)
   {
	   if(cp->data.remain.hour==0&&cp->data.remain.minute==0&&cp->data.remain.second==0) 
	   {
		   cout<<cp->data.ID<<"   ";
		   count++;
	   }
       cp=cp->next;
   }
   if(count==0)  cout<<"无!"<<endl;
   else 
   {  cout<<endl;  
      cout<<"当前剩余机时为零的学生共有"<<count<<"人."<<endl;
   }
}



typedef struct CurrentStu
{
	int ID;
	char name[20];
	int Class;
	int CN;
	clock geton;
	clock getoff;
}currentstu;
typedef struct CurrentList
{
	currentstu data;
	CurrentList *next;
}CurList;


typedef struct STack
{
	int stack[200];
	int top;
}Stack;
void InitStack(Stack &S)
{
	S.top=-1;
}
void ClearStack(Stack &S)
{
	S.top=-1;
}
int StackEmpty(Stack &S)
{
	return S.top==-1;
}
int Peek(Stack &S)
{
	if(S.top==-1)
	{
		cerr<<"当前栈为空!"<<endl;
		exit(1);
	}
	return S.stack[S.top];
}
void Push(Stack &S,const int item)
{
	if(S.top==200-1)
	{
		cerr<<"栈已满!"<<endl;
		exit(1);
	}
	S.top++;
	S.stack[S.top]=item;
}
int Pop(Stack &S)
{
	if(S.top==-1)
	{
		cerr<<"当前栈为空!"<<endl;
		exit(1);
	}
	int temp=S.stack[S.top];
	S.top--;
	return temp;
}
int StackFull(Stack &S)
{
	return S.top ==200-1;
}
 

void InitCurList(CurList *&HL)
{
	HL=new CurList;
	HL->next=NULL;
}

void Insert2(CurList *&HL,const currentstu &item)
{
	CurList *newptr=new CurList;
	if(newptr==NULL)
	{
		cerr<<"内存分配失败!"<<endl;
		exit(1);
	}
	newptr->data=item;
	CurList *ap,*cp;
	ap=HL;
	cp=HL->next;
	while(cp!=NULL)
		if(item.ID<cp->data.ID) break;
		else
		{
			ap=cp;
			cp=cp->next;
		}
    if(ap==HL)
	{
		newptr->next=HL->next;
		HL->next=newptr;
	}
	else
	{
		newptr->next=cp;
		ap->next=newptr;
	}
}

CurList* FindCur(CurList *&HL,int id)
{
	CurList *cp=new CurList;
	cp=HL->next;
	if(cp==NULL)
	{
		cerr<<"目前没有学生在上机!"<<endl;
		return NULL;
	}
	while(cp!=NULL)
	{
		if(cp->data.ID==id)  
		{
			cout<<"该学生正在上机!"<<endl;
			cout<<cp->data.name<<"   "<<cp->data.Class<<"   "<<cp->data.CN<<endl;
			cout<<"其上机时间为:";
			cout<<cp->data.geton.hour<<":"<<cp->data.geton.minute<<":"<<cp->data.geton.second<<endl;
			return cp;
		}
		else cp=cp->next;
	}
	cout<<"学号为"<<id<<"的学生没有在上机!"<<endl;
	return NULL; 
}

void DeleteCur(CurList *&HL,int id)
{
    if(HL->next==NULL)
	{
		cout<<"无法执行删除操作!"<<endl;
		exit(1);
	}
	CurList *cp=new CurList,*ap=new CurList;
	ap=HL;  cp=HL->next;
	while(cp!=NULL)
	{ 
		if(cp->data.ID==id) break;
		else
		{
			ap=cp;
			cp=cp->next;
		}
	}
	if(cp==NULL)
	{ 
		cerr<<"没有找到该学生!"<<endl;
		exit(1);
	}
	else
	{
		ap->next=cp->next;
		delete cp;
		cp=NULL;
	}
}
void PrintCur(CurList* &HL)
{
     
	if(HL->next==NULL)
	{
		cout<<"暂无学生上机!"<<endl;
		exit(1);
	}
	cout<<"******上机学生信息(按学号排列)******"<<endl;
	CurList *head=new CurList;
	head=HL->next;
	while(head!=NULL)
	{
		cout<<setw(5)<<head->data.ID<<"  "<<head->data.name<<"  "<<head->data.Class<<"  "<<endl;
		cout<<"进入时间:";
		DisClock(head->data.geton);
		head=head->next;
	}
	cout<<endl;
}
 





void Manage(CurList *&HL,InfoList *&info,Stack &S)
{  
   cout<<"请输入指令: 1 上机 2 注销 "<<endl;
   int command;   cin>>command;
   if(command==1)
   {
             if(StackEmpty(S))
			 {
	            cerr<<"抱歉,目前已没有空闲机位!"<<endl;
	            exit(1);
			 }
	         cout<<"请输入要上机的学生的学号:";
             int id;   cin>>id;
             InfoList *reg=new InfoList;
             reg=FindStu(info,id);
             if(reg==NULL)
			 {
	             cerr<<"没有找到该学生的相关信息!"<<endl;
	             exit(1);
			 }
             else
			 {
	             clock left;
				 left=reg->data.remain;
				 if(left.hour==0&&left.minute==0&&left.second==0)
				 {   
					 cerr<<"该学生已没有剩余机时!"<<endl;
					 exit(1);
				 }
				 else
				 {
					 currentstu temp;
					 temp.ID=reg->data.ID;
					 temp.Class=reg->data.Class;
					 strcpy(temp.name,reg->data.name);
					 cout<<"请输入当前时间:"<<endl;
					 int hour,minute,second;
					 cin>>hour>>minute>>second;
					 cout<<hour<<":"<<minute<<":"<<second<<endl;
					 temp.geton.hour=hour;
					 temp.geton.minute=minute;
					 temp.geton.second=second;
					 temp.CN=Pop(S);
                     Insert2(HL,temp);
				 }
			 }
   }
			 
  if(command==2)
  {
	         cout<<"请输入要注销的学生的学号:"<<endl;
	         int num;
			 cin>>num;
			 CurList *p=new CurList;
			 p=FindCur(HL,num);
			 if(p==NULL)
			 {
				 cout<<"无法执行注销命令!"<<endl;
				 exit(1);
			 }
			 else
			 {
				 cout<<"请输入当前时间:"<<endl;
				 int Hour,Minute,Second;
				 cin>>Hour>>Minute>>Second;
				 cout<<Hour<<":"<<Minute<<":"<<Second;
				 p->data.getoff.hour=Hour;
				 p->data.getoff.minute=Minute;
				 p->data.getoff.second=Second;
				 int no=p->data.CN;
				 Push(S,no);
				 InfoList *tmp=new InfoList;
				 tmp=FindStu(info,p->data.ID);
				 if(tmp==NULL) exit(1);
				 else
				 {
					 clock newtime;
					 newtime=Subtime(p->data.geton,p->data.getoff);
					 cout<<endl;
					 cout<<"该生本次上机的时间为:";
					 cout<<newtime.hour<<":"<<newtime.minute<<":"<<newtime.second<<endl;
					 tmp->data.remain=Subtime(newtime, tmp->data.remain);
					 tmp->data.totaltime=Subtime(newtime,tmp->data.totaltime);
					 DeleteCur(HL,num);
				 }
			 }
  }
}
  

                   
void main()
{  
   Stack  Computer;
   InitStack(Computer);
   int i;
   for(i=0;i<200;i++)
	   Push(Computer,i+1);
   InfoList *List1=new InfoList;
   CreatInfoList(List1);
   PrintInfo(List1);
   ChangeInfo(List1);
   PrintInfo(List1);
   Count0(List1);
   InfoList *p1=new InfoList;
   cout<<"现在查找学号为20的学生信息"<<endl;
   p1=FindStu(List1,20);
   CurList *List2=new CurList;
   InitCurList(List2);
   CurList *p2=new CurList;
   cout<<"现在查找学号为5的学生是否在上机"<<endl;
   p2=FindCur(List2,005);

   Manage(List2,List1,Computer);
   Manage(List2,List1,Computer);
   Manage(List2,List1,Computer);
   Manage(List2,List1,Computer);
   PrintCur(List2);
   cout<<"现在查找学号为5的学生是否在上机"<<endl;
   p2=FindCur(List2,005);
   Manage(List2,List1,Computer);
   PrintCur(List2);
   cout<<"现在查找学号为5的学生是否在上机"<<endl;
   p2=FindCur(List2,005);
   PrintInfo(List1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -