📄 stuinfomanager.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 + -