📄 成绩管里系统1.h
字号:
#include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;
struct Record
{
string number; // 学号(中间不能有空格)
string name; // 姓名(中间可以有空格)
string gender; // 性别(中间无空格)
float score[NUM_SUBJECT]; // 分别为该学生5门课的成绩
float sum; // 总分
float average; // 平均分
int index; // 名次
bool toBeDeleted; // 做是否删除的标记
Record() {toBeDeleted = false;}
};
class StuInfoVec
{
protected:
RecordVec recVec;
public:
typedef vector<Record>::iterator Iterator;
//添加新的学生的记录
virtual void addRecord(Record* rec);
//删除有"待删除"标志的记录
virtual int removePerform();
//寻找一个学生记录
virtual Iterator findRecord(const string& patten, int type, Iterator form);
//将学生信息保存到输出流中
virtual void saveRecords(ostream& os);
//从输入流中读入数据,并追加到当前学生信息记录的末尾
virtual int loadRecords(istream& in);
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();}
};
//该类是处理学信息记录的底层类,针对增加记录、删除记录、查询记录一级保存和读取记录等操作进行与底层数据结构相关的处理,该类不涉及与用户界面或用户交互相关的操作。
//该类以"包含"(has a)关系持有一个RecordVec类的对象recVec,作为保护型数据成员,这是存取记录的底层数据结构。
//StuInfoVec类中定义的一些成员函数直接使用了RecordVec类的成员函数,没有增加太多的功能,如addRecord()函数只是调用了RecordVec类继承子基类的push_back()函数,saveRecord()函数只是调用了RecordVec重载的输出操作符。
//需要特别解释的是以下三个函数:
//1) findRecord()成员函数。它用于从已有的学生信息记录中寻找一个符合条件的记录,并返回指向该记录的迭代器(iterator)。该函数将从给定的iterator开始,按递增的顺序依次考察每一记录,直到找到符合条件的记录或者到达记录的末尾。Iterator迭代遍历记录时采用如下的代码:
//Iterator it;
//iterator it_end = recVec.end();
//for(it = from; it != it_end; it++)
//{
//对it进行操作
//}
//这里的form时迭代开始的位置,it_end时记录的末尾,如要遍历整个记录并找出所有符合条件的记录,form第一次可以使用recVec.begin()函数的返回值,之后每次取前一次运算后findRecord()函数所得返回值增1,直到findRecord()函数返回it_end为止。
//另外由于存储记录的数据结构是vector,vector可以通过下标操作符[]以常量时间存取它的任一个元素,所以遍历记录的另外一种方式就是通过下标操作:
// int nSize;
//for(int i = 0; i < nSize; i++)
//{
//对recVec[i]进行操作
//}
//2) removePerform()成员函数。用于从数组中真正删除做了"待删除"标志的记录,并返回实际上删除了的记录数。
//由于向量这种数据结构的特点,每删除一个元素都必须将被删除元素后面的所有元素前移一格,为了减少这种移动的次数,提高效率,故从向量的末尾开始逆向寻找每一个做了标记的记录,调用recVec的erase()成员函数实际将其删除。
//由于记录中有一个"名次"项,所以在删除了记录以后,为了保证名次的正确,必须更新剩余记录的"名次"项,更新的方法是将剩余记录名次排在被删除记录后面的记录的名次减1。
//) loadRecords()成员函数。将写在文件里的记录读取出来,追加在当前记录的末尾,这是通过对recVec调用其重载的操作符>>实现的。但是如果追加前已经有了一部分记录信息,则加入了新的记录以后名次会被打乱,因此所有记录的"名次"项都要进行调整。调整的方法是对每条记录都计算总分大于它的人数ncount,而该记录的名次便是ncount+1。
//4. 类StuInfoManager
//它的声明如下:
class StuInfoManager
{
protected:
bool isModified;//学生信息是否已被修改还未保存
int toRemvNodes;//做了删除标记的记录数
public:
static char* subject_[];
public:
StuInfoManager();
virtual ~StuInfoManager();
//开始成绩
virtual void start();
//菜单处理函数管理程序的用户界面操作
virtual void handleMenu();
//显示记录
virtual void displayRecords();
//查询记录
virtual void queryRecord();
//添加记录
virtual void addRecord();
//删除记录
virtual void removeRecord();
//标记删除记录
virtual void removeNote();
//修改记录
virtual void modifyRecord();
//记录排序
virtual void sortRecords();
//保存记录
virtual void saveRecords();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前记录信息
virtual void clear();
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
//显示一条记录的信息
void dispRecord();
//找出给定总分在所有记录中的名次
int getIndex(float sum);
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -