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

📄 stuinfovec.h

📁 在年级成绩管理系统中
💻 H
字号:
#include "RecordVec.h"
#include "BasicStringTool.h"
using namespace BasicStringTool;
#include "FileStreamTool.h"
using namespace FileStreamTool;

namespace StudentInfomationManageStudio
{
enum SaveFileMark
{
	VARIABLE_TYPE='$',
	VARIABLE_VALUE=':',
	VARIABLE_ARRAY='^'
};
class StuInfoVec
{
protected:  RecordVec recVec;


public:
	typedef vector<Record*>::iterator Iterator;
	//添加新的学生的记录
	virtual void addRecord(Record* rec)
	{
		recVec.push_back(rec);
	}
	//删除有"待删除"标志的记录
	virtual int removePerform()
	{
		Iterator it;
		int count=0;
		for(it = recVec.begin(); it != recVec.end();)
		{
			if((*it)->toBeDeleted==true)
			{
				recVec.erase(it);
				it=recVec.begin();
				count++;
			}
			else
			{
				it++;
			}
		}
		return count;
	}
	//寻找一个学生记录
	virtual Iterator findRecord(const string& patten, int type, Iterator from)
	{
		Iterator it;
		Iterator it_end = recVec.end();
		std::string str_temp;
		for(it = from; it != it_end; it++)
		{
			switch(type)
			{
			case 0: str_temp = (*it)->number; break;//0:Number
			case 1: str_temp = (*it)->name;   break;//1:Name
			case 2: str_temp = NumberToString::FromInt((*it)->index); break;//2:Index
			default:return it_end;
			};
			if(str_temp==patten)
			{
				return it;
			}
		}
		return it_end;
	}
	//将学生信息保存到输出流中
	virtual bool saveRecords(ofstream& fileStreamOut)
	{
		int TSize=this->size();
		if(!fileStreamOut) return false;
		Record *newRec;
		for(int i=0;i<TSize;i++)
		{
			newRec=this->recVec[i];
			if(newRec->toBeDeleted==false)
			{
				fileStreamOut<<(char)VARIABLE_TYPE<<"Begin" <<(char)VARIABLE_VALUE;
				fileStreamOut<<(char)VARIABLE_TYPE<<"Number"<<(char)VARIABLE_VALUE<<newRec->number;
				fileStreamOut<<(char)VARIABLE_TYPE<<"Name"  <<(char)VARIABLE_VALUE<<newRec->name;
				fileStreamOut<<(char)VARIABLE_TYPE<<"Index" <<(char)VARIABLE_VALUE<<newRec->index;
				fileStreamOut<<(char)VARIABLE_TYPE<<"Gender"<<(char)VARIABLE_VALUE<<newRec->gender;
				fileStreamOut<<(char)VARIABLE_TYPE<<"Score" <<(char)VARIABLE_VALUE<<DEFUALT_SCORE_AMOUNT;
				for(int j=0;j<DEFUALT_SCORE_AMOUNT;j++)
				{
					fileStreamOut<<(char)VARIABLE_ARRAY<<(int)newRec->score[j];
				}
				fileStreamOut<<(char)VARIABLE_TYPE<<"End"   <<(char)VARIABLE_VALUE;
				fileStreamOut<<std::endl;
			}
		}
		return true;
	}
	//从输入流中读入数据,并追加到当前学生信息记录的末尾
	virtual int loadRecords(ifstream& fileStreamIn)
	{
		int count=0;
		std::string variableType;
		std::string variableValue;
		if(!fileStreamIn) return false;
		std::string number="unknown";
		std::string name="unknown";
		std::string gender="unknown";
		int index=0;
		float score[DEFUALT_SCORE_AMOUNT];
		for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
		{
			score[i]=0;
		}
		while(!fileStreamIn.eof())
		{
			FileStreamGoto::Goto(fileStreamIn,(char)VARIABLE_TYPE);
			variableType=StringFromFile::Get(fileStreamIn,(char)VARIABLE_VALUE);
			fileStreamIn.get();
			variableValue=StringFromFile::Get(fileStreamIn,(char)VARIABLE_TYPE);
			if(variableType=="Begin")
			{
				number="unknown";
				name="unknown";
				gender="unknown";
				index=0;
				for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
				{
					score[i]=0;
				}
			}
			else if(variableType=="Number")
			{
				number=variableValue;
			}
			else if(variableType=="Name")
			{
				name=variableValue;
			}
			else if(variableType=="Index")
			{
				index=0;
				/*
				int len=variableValue.length();
				int temp;
				bool eff=false;
				for(int i=0;i<len;i++)
				{

					temp=variableValue[i]-'0';
					if(temp<0||temp>9)
					{
						if(eff==false)
							continue;
						else
							break;
					}
					index=10*index+temp;
					eff=true;
				}
				*/
			}
			else if(variableType=="Gender")
			{
				gender=variableValue;
			}
			else if(variableType=="Score")
			{
				int count=0;
				int len=variableValue.length();
				int temp=0;
				char ch;
				bool eff=false;
				for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
				{
					eff=false;
					temp=0;
					while(count<len)
					{
						ch=variableValue[count++];
						if(   ch==(char)VARIABLE_ARRAY
							||ch==(char)VARIABLE_TYPE
							||ch==(char)VARIABLE_VALUE)
						{
							break;
						}
					}
					if(ch!=(char)VARIABLE_ARRAY) 
					{
						break;
					}
					while(count<len && (ch=variableValue[count++])!=(char)VARIABLE_ARRAY)
					{
						if(ch<'0'||ch>'9')
						{
							if(eff==false)
								continue;
							else
								break;
						}
						temp=10*temp+ch-'0';
						eff=true;
					}
					count--;
					score[i]=(float)temp;
				}
			}
			else if(variableType=="End")
			{
				Record *newRec=new Record();
				newRec->number=number;
				newRec->name=name;
				newRec->gender=gender;
				newRec->sum=0;
				for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
				{
					newRec->score[i]=score[i];
					newRec->sum+=score[i];
				}
				newRec->average=newRec->sum/DEFUALT_SCORE_AMOUNT;
            	newRec->index=index;
            	this->addRecord(newRec);
            	count++;
			}
		}//while
		return count;
	}
	virtual ~StuInfoVec()
	{
		//...
	}

	//获得记录的学生数量
	const int size() const {return (int)recVec.size();}
	//是否无学生信息
	const bool empty() const {return recVec.empty();}
	//清空学生信息
	virtual void clear(){recVec.clear();}

	//获得第一条记录
	Iterator first(){return recVec.begin();}
	//获得超过最后一条记录之后的一个迭代器
	Iterator pastEnd(){return recVec.end();}

};
};

⌨️ 快捷键说明

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