📄 stuinfomanager.cpp
字号:
#include <stdlib.h>
#include <fstream>
#include "StuInfoManager.h"
using namespace std ;
char* StuInfoManager::subject_[] = {"A","B","C", "D", "E"};
StuInfoManager::StuInfoManager(void)
{
isModified = false;
toRemvNodes = 0;
start();
}
StuInfoManager::~StuInfoManager(void){}
void StuInfoManager::start(){
cout << endl
<< "\t*************************************************" << endl
<< "\t* *" << endl
<< "\t* 这是一个 *" << endl
<< "\t* 学生成绩管理程序 *" << endl
<< "\t* 可以对学生成绩进行管理 *" << endl
<< "\t* *" << endl
<< "\t* *" << endl
<< "\t* 欢迎使用管理程序! *" << endl
<< "\t*************************************************"<<endl
<< endl;
handleMenu();
}
char StuInfoManager::menuSelect()
{
cout<<"0"<<"显示记录"<<endl
<<"1"<<"查询记录"<<endl
<<"2"<<"添加记录"<<endl
<<"3"<<"删除记录"<<endl
<<"4"<<"修改记录"<<endl
<<"5"<<"记录排序"<<endl
<<"6"<<"保存记录"<<endl
<<"7"<<"读取记录"<<endl
<<"8"<<"新建学生信息"<<endl
<<"9"<<"结束运行"
<<endl;
string str;
char choice;
while(true)
{
cin>>str;
cin.ignore();
choice =str[0];
if(choice<'0'||choice>'9')
cout<< endl <<"输入错误,重新输入0到9之间的数字";
else
break;
}
return choice;
}
void StuInfoManager::handleMenu(){
while (true)
{char c;
c= menuSelect();
switch(c){
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<<"请输入字符继续"<<endl;
cin.get();
cout<<endl;
dispTable();
}
}
cout<<"共有"<<size()<< " 条记录 " << 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<<"条记录"<<endl
<<"现在还剩下"<<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"<<endl
<<"1.按学号\n"<<endl
<<"2.按姓名\n"<<endl
<<"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;
cout << "请输入性别(1.男0.女):"<<endl;
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"<<endl
<<"现在共有"<<size()<<"条记录"<<endl;
if(ncount !=0)
isModified = true;
}
void StuInfoManager::removeRecord(){
if(empty())
{
cout<<"记录已空,退出删除操作!"<<endl;
return;
}
cout<<"1.标记待删除的记录\n"
<<"2.执行标记\n"
<<"3.取消指定记录的删除标记\n"
<<"4. 取消全部删除标记"<<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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -