📄 stuinfomanager.cpp
字号:
//StuInfoManager.cpp
#include<stdlib.h>
#include<fstream>
#include"stuinfomanager.h"
#include<iomanip>
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();
}
/****************************************
*功能:显示程序管理菜单,返回用户选择的选项
*返回:用户选择的选项,是0-9之间的一个字符
****************************************/
char StuInfoManager::menuSelect()
{
cout << "\n"
<< "0.显示记录\n"
<< "1.查询记录\n"
<< "2.增加记录\n"
<< "3.删除记录\n"
<< "4.修改记录\n"
<< "5.记录排序\n"
<< "6.保存记录\n"
<< "7.读取记录\n"
<< "8.新建学生信息文件\n"
<< "9.结束运行\n"
<< "\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 << "学号 姓名 性别";
for (int j=0;j<NUM_SUBJECT;j++)
cout << '\t'<< subject_[j];
cout << " 总分 平均分 名次 删除标志\n";
}
/********************************************
*功能:显示指定记录的信息
********************************************/
void StuInfoManager::dispRecord(Record* rec)
{
//打印学生信息
cout<<setw(4) << rec->number << setw(4) << rec->name << setw(4)<< rec->gender;
for (int j=0;j<NUM_SUBJECT;j++)
cout<<'\t'<<rec->score[j];
cout.precision(3);
cout<<setw(6)<<rec->sum<<setw(6)<<rec->average<<setw(6)<<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]);
//打印满20个记录后停下来
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;
}
}
/***********************************************
*找出总分为sum在当前所有记录中按升序排序的位置
*参数:sum, 欲找位置的总分
*返回:sum在当前所有记录中按升序排序的位置
*结果:原有记录中"名次"项也会依需要相应改变
**************************************************/
int StuInfoManager::getIndex(float sum)
{
int ncount = 0; //总分大于sum的人数
Iterator it;
Iterator it_end = pastEnd();
for (it = first(); it!=it_end; it++)
{
if ((*it)->sum < sum)
{
(*it)->index++;//总分小于sum的记录名次增1
} 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.取消全部删除标记"<< 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -