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

📄 stuinfomanager.cpp

📁 这是个职工管理系统
💻 CPP
字号:
//StuInfoManager.cpp文件
#include<stdlib.h>
#include<fstream>
#include "stuinfomanager.h"
using namespace std;
char* StuInfoManager::subject_[]={"语文","数学","英语","物理","化学"};
StuInfoManager::StuInfoManager(void)
{
	isModified=false;
	toRemvNodes=0;
	start();
}
StuInfoManager::~StuInfoManager(void)
{}
void StuInfoManager::start()
{
	cout<<"\n"<<"\t*******************\n"<<"\t*  这是一个*\n"<<"\t* 学生成绩管理程序  *\n"<<"\t* 可以对学生成绩进行管理 *\n"<<"\t* 欢迎使用管理程序 *\n"	<<"\t*********************\n"<<"\n";		
	handleMenu();
}
char StuInfoManager::menuSelect()
{
	cout<<"\n"<<"0.显示记录;"<<"1.查询记录  "<<"2.增加记录;"<<"3.删除记录;"		
		<<"4.修改记录;"<<"5.记录排序\n"<<"6.保存记录;"
		<<"7.读取记录;"<<"8.新建学生信息文件;"<<"9.结束运行."
		<<"\n左边数字对应功能选择,请选0-9:";
		string str;
		char choice;
		while(true)
		{
		cin>>str;
		cin.ignore();//从cin中将回车符提取出来
		choice=str[0];
		if(choice<'0'||choice>'9')
		cout<<"\n输入错误,重选0-9:";
		else break;
		}
		return choice;
}
void StuInfoManager::handleMenu()
{
	while(true)
	{
		switch(menuSelect())
	{
	case '0':
		displayRecords();break;		
	case '1':
		queryRecord();break;		
	case '2':
		addRecord();break;		
	case '3':
		removeRecord();break;	
	case '4':
		modifyRecord();break;		
	case '5':
		sortRecords();break;			
	case '6':
		saveRecords();break;		
	case '7':
		loadRecords();break;		
	case '8':
		clear();addRecord();break;	
	case '9':
		quit();		
	}
	}
}
void StuInfoManager::dispTable()
{
	cout<<"学号\t姓名\t性别";
	for(int j=0;j<NUM_SUBJECT;j++)
		cout<<'\t'<<subject_[j];
	cout<<"\t总分\t平均分\t名次\t删除标记\n";
}
void StuInfoManager::dispRecord(Record* rec)
{
	cout<<rec->number<<'\t'<<rec->name<<'\t'<<rec->gender;
	for(int j=0;j<NUM_SUBJECT;j++)
		cout<<'\t'<<rec->score[j];
	cout.precision(3);
	cout<<'\t'<<rec->sum<<'\t'<<rec->average<<'\t'<<rec->index;
	if(rec->toBeDeleted)
		cout<<"\t*\n";
	else  cout<<'\n';		
}
void StuInfoManager::displayRecords()
{
	if(empty())
	{cout<<"没有记录可以显示"<<endl;return;}	
	dispTable();
	int num=size();
	for(int i=0;i<num;i++)
	{
		dispRecord(recVec[i]);
		if(i%20==0&&i!=0)
		{
			cout<<"输入任一字符后继续...\n";
			cin.get();
			cout<<endl;
			dispTable();
	}
	}
	cout<<"一共有"<<size()<<"条记录\n"<<endl;
}
void StuInfoManager::clear()
{
	char choi[5];
	if (toRemvNodes !=0)
	{
		cout<<"现在还有被做了删除标记但还没有执行的记录,是否执行删除?(Y/n)";
		cin.getline(choi,5);
		if (choi[0]!='n'&& choi[0]!='N')
		{
			int num=removeperform();
			toRemvNodes=0;
			cout<<"一共删除了"<<num<<"条记录\n"<<"现在还剩下"<<size()<<"条记录"<<endl;				
			if(num !=0)
				isModified=true;
		}
	}
	if(isModified)
	{
		cout<<"学生信息已改动,是否保存?(Y\n)";
		cin.getline(choi,5);
		if (choi[0]!='n'&&choi[0]!='N')
			saveRecords();
	}
	StuInfoVec::clear();
	isModified=false;
}
void StuInfoManager::queryRecord()
{
	if(empty())
	{cout<<"记录是空表,退出查询操作! "<<endl;return;}	
	char choi[5];
	int type;
	char pattern[20];
	while(true)
	{cout<<"请输入查询的方式:(直接输入回车则结束 查询)\n"<<"1.安学号\n"<<"2.按姓名\n"<<"3.按名次\n";
	cin.getline(choi,5);
	if(choi[0]=='\0') break;
	if(choi[0]=='1')
	{cout<<"请输入与查询的学生的学号:";type=0;}	
	else if(choi[0]=='2')  {cout<<"请输入欲查询的学生的姓名:";type=1;}			
	else {cout<<"请输入欲查询的学生的名次:";  type=2;}		
	cin.getline(pattern,20);
	int findCount=0;
	Iterator it=findRecord(pattern,type,first());
	Iterator it_end=pastEnd();
	dispTable();
	while(it!=it_end)
	{
		findCount++;
		dispRecord(*it);
		it=findRecord(pattern,type,++it);
	}
	cout<<"一共找到了"<<findCount<<"条记录\n"<<endl;
	}
}
int StuInfoManager::getIndex(float sum)
{
		int ncount=0;
		Iterator it;
		Iterator it_end=pastEnd();
		for(it=first();it!=it_end;it++)
		{
			if((*it)->sum<sum)
			{(*it)->index++;}				
			else if((*it)->sum>sum)  {ncount++;}						
		}
	
	return ncount+1;
}
void StuInfoManager::addRecord()
{
	if(empty())
		cout<<"原来没有记录,现在建立新的记录"<<endl;
	else   cout<<"下面在当前表的末尾增加新的信息"<<endl;		
	char choi[5];char name[20];	
	Record* rec;
	float sum;
	int j;int ncount=0;	
	while(true)
	{
		cout<<"你将要添加一组信息,确定吗?(Y/n)";
		cin.getline(choi,5);
		if(choi[0]=='n'||choi[0]=='N') break;			
		rec=new Record;
		cout<<"请输入学号:"<<flush;
		cin>>rec->number;
		cin.ignore();
		printf("请输入姓名:");
		cin.getline(name,20);
		rec->name=name;
		printf("请输入性别(0为女,1为男):");
		cin.getline(choi,5);
		if(choi[0]=='0')
			rec->gender="女";
		else   rec->gender="男";			
		sum=0;
		for(j=0;j<NUM_SUBJECT;j++)
		{
			cout<<"请输入"<<subject_[j]<<"成绩:";
			cin>>rec->score[j];
			sum+=rec->score[j];
		}
		cin.ignore();
		rec->sum=sum;
		rec->average=sum/NUM_SUBJECT;
		rec->index=getIndex(sum);
		StuInfoVec::addRecord(rec);
		ncount++;
	}
	cout<<"一共新增了"<<ncount<<"条记录\n"<<"现在一共有"<<size()<<"条记录"<<endl;
	if(ncount!=0)
		isModified=true;
}
void StuInfoManager::removeRecord()
{
	if(empty())
	{cout<<"记录已空,退出删除操作!"<<endl;return;}	
	cout<<"1.标记待删除的记录\n"<<"2.执行标记\n"<<"3.取消指定记录的删除标记\n"<<"4.取消全部删除标记\n"<<endl;
	string str;
	do
	{
		cout<<"请选择你要进行的操作(1-4):";
		cin>>str;
	}while(str[0]<'1'||str[0]>'4');
	cin.ignore();
	switch(str[0])
	{
	case '1':
		removeNote(true);break;		
	case '2':
		{
			int num=removeperform();
			toRemvNodes=0;
			cout<<"一共删除了"<<num<<"条记录\n"<<"现在还剩"<<size()<<"条记录"<<endl;
			if(num!=0)
				isModified=true;
		}break;		
	case '3':
		removeNote(false);break;		
	case '4':
		{
			Iterator it;
			Iterator it_end=pastEnd();
			for(it=first();it!=it_end;it++)
			{(*it)->toBeDeleted=false;}
			toRemvNodes=0;
			cout<<"所有的删除标记已取消"<<endl;
		}
	}
}
void StuInfoManager::removeNote(bool isToRemove)
{
	if(empty())
	{cout<<"当前没有任何记录:"<<endl;return;}	
	if(!isToRemove&&toRemvNodes==0)
	{cout<<"当前没有被作了删除标记的项目"<<endl;  return;}	
	char choi[5];
	char pattern[20];
	int type;
	while(true)
	{
		cout<<"请输入如何找到欲更改标记了记录的方式:(直接输入回车则结束移除操作)\n"<<"1.按学号\n"<<"2.按姓名\n"<<"3.按名次\n";
		cin.getline(choi,5);
		if(choi[0]=='\0')  break;
		if(choi[0]=='1')
        {cout<<"请输入与查询的学生的学号:";   type=0;}			
		else if(choi[0]=='2')
		{cout<<"请输入与查询的学生的姓名:"<<endl;   type=1;}		
		else  {cout<<"请输入与查询的学生的名次:"<<endl;   type=2;}				
		cin.getline(pattern,20);
		bool gotMatch=false;
		Iterator it=findRecord(pattern,type,first());
		Iterator it_end=pastEnd();
		while(it!=it_end)
		{
			if((!isToRemove && !(*it)->toBeDeleted)||(isToRemove &&(*it)->toBeDeleted))
			{it=findRecord(pattern,type,++it); continue;}			
			gotMatch=true;
			cout<<"共找到一条匹配的记录:\n";
			dispTable();
			dispRecord(*it);
			cout<<"确定要改变这条记录的标记吗?(Y/n)";
			cin.getline(choi,5);
			if(choi[0]!='n'&&choi[0]!='N')
				(*it)->toBeDeleted=!(*it)->toBeDeleted;
			if(isToRemove)
				toRemvNodes++;
			else  toRemvNodes--;				
			it=findRecord(pattern,type,++it);
		}
		if(!gotMatch)
			cout<<"没有找到匹配的记录"<<endl;
		else
		{
			if(toRemvNodes!=0)
				cout<<"当前有"<<toRemvNodes<<"条记录被作了删除标记"<<endl;
			else  cout<<"现在已经没有被作了删除标记了记录了\n";				
		}
	}
}
void StuInfoManager::modifyRecord()
{
	if(empty())
	{cout<<"没有可供修改的记录"<<endl;return;}	
	char choi[5];
	char pattern[20];
	char name[20];
	int type;
	string str;
	while(true)
	{
		cout<<"请输入如何找到与修改的记录的方式:(直接输入回车则结束移除操作)\n"<<"1.按学号\n"<<"2.按姓名\n"<<"3.按名次\n";
		cin.getline(choi,5);
		if(choi[0]=='\0')break;
		if(choi[0]=='1')
		{cout<<"请输入与查询的学生的学号:";  type=0;}		
		else if(choi[0]=='2')
		{cout<<"请输入与查询的学生的姓名:";  type=1;}		
		else {cout<<"请输入与查询的学生的名次:";  type=2;}				
		cin.getline(pattern,20);
		Iterator it=findRecord(pattern,type,first());
		Iterator it_end=pastEnd();
		if(it==it_end)
		{cout<<"没有匹配的记录。"<<endl;continue;}		
		while(it!=it_end)
		{
			cout<<"找到一条匹配的记录:\n";
			dispTable();
			dispRecord(*it);
			cout<<"确定要修改这条记录吗?[Y/N]";
			cin.getline(choi,5);
			if(choi[0]!='n'&&choi[0]!='N')
			{
				int ncount=0;
				int tmpi=(*it)->index;
				cout<<"下面请重新输入该学生的信息:\n";
				cout<<"请输入学号:";
				cin>>(*it)->number;
				cin.ignore();
				cout<<"请输入姓名:";				
				cin.getline(name,20);				
				(*it)->name=name;
				printf("请输入性别 (0为女,1为男):");
				cin>>str;
				cin.ignore();
				if(str[0]=='0')
					(*it)->gender="女";
				else
					(*it)->gender="男";
				float sum=0;
				for(int j=0;j<NUM_SUBJECT;j++)
				{
					cout<<"请输入"<<subject_[j]<<"成绩:";
						cin>>(*it)->score[j];
					sum+=(*it)->score[j];
				}
				cin.ignore();
				(*it)->sum=sum;
				(*it)->average=sum/NUM_SUBJECT;
				ncount=0;
				Iterator it1;
				for(it1=first();it1!=it_end;it1++)
				{
					if(it1==it) continue;
					if((*it1)->index>tmpi&&(*it1)->sum>=sum)
						(*it1)->index--;
					else if((*it1)->index<=tmpi&&(*it1)->sum<sum)
						(*it1)->index++;
					if((*it1)->sum>sum)
						ncount++;
				}
				(*it)->index=ncount+1;
				isModified=true;
			}
			it=findRecord(pattern,type,++it);
		}
		cout<<"已找完所有的记录\n"<<endl;
	}
}
void StuInfoManager::sortRecords()
{
	if(empty())
	{cout<<"没有可供排序的记录!"<<endl;return;}	
	string str;
	cout<<"请输入你希望进行排序的方式:\n"<<"1.按学号进行升序排序\n"<<"2.按学号进行降序排序\n"<<"3.按姓名进行升序排序\n"<<"4.按姓名进行降序排序\n"<<"5.按名次进行升序排序\n"<<"6.按名次进行降序排序\n"<<"7.按错了,我不想进行排序"<<endl;
	cin>>str;
	cin.ignore();
	if(str[0]<'1'||str[0]>'6')return;
	int i,j;
	int numStus=size();
	for(i=0;i<numStus-1;i++)
	{
		for(j=(i+1);j<numStus;j++)
		{
			if((str[0]=='1'&&recVec[i]->number>recVec[j]->number)||(str[0]=='2'&&recVec[i]->number<recVec[j]->number)||(str[0]=='3'&&recVec[i]->name>recVec[j]->name)||(str[0]=='4'&&recVec[i]->name<recVec[j]->name)||
				(str[0]=='5'&&recVec[i]->index>recVec[j]->index)||(str[0]=='6'&&recVec[i]->index<recVec[j]->index))
			{swap(recVec[i],recVec[j]);}			
		}
	}
	cout<<"排序已经完成"<<endl;
	isModified=true;
}
void StuInfoManager::saveRecords()
{
	if(empty())
	{cout<<"没有记录可存!"<<endl;return;}	
	char name[40];
	string fname;
	cout<<"请输入要存入的文件名(直接回车选择文件sname):";
	cin.getline(name,40);
	fname=name;
	if(fname.empty())
		fname="sname";
	ofstream of(fname.c_str(),ios_base::out);
	if(!of)
	{cout<<"不能存入文件!"<<endl;return;}	
	StuInfoVec::saveRecords(of);
	of.close();
	cout<<size()<<"条记录已经存入文件,请继续操作。"<<endl;
	isModified=false;
}
void StuInfoManager::loadRecords()
{
	char choi[5];
	if(!empty())
	{
		cout<<"请选择是要覆盖现有记录(Y),还是要将读取的"<<"记录添加到现有记录之后(n)?\n"<<"直接回车则覆盖现有记录\n";
		cin.getline(choi,5);
		if(choi[0]=='n'||choi[0]=='N')
		{isModified=true;}
		else
		{clear();}
	}
	string fname;
	char fname1[40];
		cout<<"请输入要读取的文件名(直接回车选择文件sname):";
	cin.getline(fname1,40);
	fname=fname1;
	if(fname.empty())
		fname="sname";
	ifstream ifs(fname.c_str(),ios_base::in);
	if(!ifs)
	{cout<<"打不开文件! 请重新选择"<<endl;return;}
	int num=StuInfoVec::loadRecords(ifs);
	ifs.close();
	cout<<"取入"<<num<<"条记录。\n"<<"现有一共有"<<size()<<"条记录"<<endl;
}
void StuInfoManager::quit()
{
	clear();
	cout<<"退出操作,再见! "<<endl;
	delete this;
	exit(0);
}

⌨️ 快捷键说明

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