学生管理系统

大作业  学生成绩管理
【题    目】
设计一个实用的小型学生成绩管理程序,要求不用链表,而用向量来设计这个程序。它有查询和检索等功能,并且能够对指定文件操作,也可将多个文件组成一个文件。
【设计要求】
功能设计要求
建立文件
可以使用默认文件名或者指定文件名将记录存储到文件。
设置适当的标志位,作为对记录进行操作的信息。
写同名文件将覆盖原文件的内容。
增加学生记录
可在已有记录后面追加新的记录。
可以随时增加新的记录,它们仅保存在向时数组中。
可以将一个文件读入,追加在已有记录之后。
采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续文件追加操作方式。
如果没有记录存在,给出提示信息。
新建学生信息文件
用来重新建立学生信息记录。
如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存到一个指定文件,然后重新建立记录。
显示记录
如果没有记录可供显示,给出提示信息。
可以随时显示内存中的记录。
显示表头。
文件存储
可以按默认名字或指定名字存储记录文件。
更新存储标志。
读取文件
可以按默认名字或指定名字将记录文件读入内存。
可以将指定或默认文件追加到现有记录的尾部。
可以将文件连续追加到现有记录并更新记录中的“名次”项。
更新存储标志。
删除记录
可以按“学号”、“姓名”或“名次”方式删除记录。
标志将被删除的记录,可以再次取消标志,经确认后删除已标记的记录。
如果已经是空表,删除时应给出提示信息并返回主菜单。
如果没有要删除的信息,输出“没有找到”的信息。
应该更新其它记录的名次。
删除操作仅限于内存,只有执行存储操作时,才能覆盖原记录。
修改记录
可以按“学号”、“姓名”或“名次”方式修改记录。
给出将被修改记录信息,经确认后进行修改。
如果已经是空表,应该给出提示信息并返回主菜单。
如果没有找到需要修改的信息,输出提示信息。
应该同时更新其它记录的名次。
修改操作仅限于内存,只有进行存在操作时,才能覆盖原记录。
查询记录
可以按“学号”、“姓名”或“名次”方式查询记录。
能给出查询记录的信息。
如果查询的信息不存在,输出提示信息。
对记录进行排序
可以按“学号”进行升序或降序排序。
可以按“姓名”进行升序或降序排序。
可以按“名次”进行升序或降序排序。
如果属于选择错误,可以立即即出排序。
测试程序
应列出测试大纲对程序进行测试。
应保证测试到程序的各种边缘情况,
以上是基本要求,希望通过深入理解本设计,重新考虑如何改进设计。


总体设计
本设计由6 个文件组成,3个头文件及其相应的.cpp。
用于保存数据的底层数据结构是向量数组,使用C++标准库提供的vector来实现这个向量数组的结构(要具体了解vector的用法,可以查询关于STL的资料)。




在成绩管理程序中定义1个结构和3个类,说明如下:
结构Record
//每条记录的结构
Struct Record
{
string number; //学号(中间不能有空格)
string name; //姓名(中间可以有空格)
string gender; //性别(中间无空格)
float score[NUM_SUBIECT]; //学生各科成绩
float sum; //总分
float average; //均分
int index; //名次
bool toBeDeleted; //是否需要删除的标记
Record(){toBeDeleted=false;}
};
类RecordVec
class RecordVec:publeic vector<Record*>
{
friend ostream& operator<<(ostream& os,const RecordVec& c_r1);
friend istream& operator>>(istream& is,const RecordVec& r1);
public:
//销毁数组中记录的所有Record所占内存空间,并且清空数组储存的记录
//该函数覆盖了基类中的同名函数
void clear();
//销毁指定记录,然后从数组中将其删除
//该函数覆盖了基类中的同名函数
iterator erase(iterator where);
~RecordVec(){ this->clear(); }
};
该类能针对学生信息记录进行特殊处理,它继承于vector<Record*>,即以指向结构Record的指针为元素的向量数组。之所以使用指针来作为向量的元素,是因为在vector中进行元素的插入和删除都会涉及许多元素考贝的工作。在RecordVec类重载clear()和erase()函数,使得在删除元素时首先释放该元素,即Record指针所指向的对象,然后后再调用基类中被覆盖的同名函数以实现删除元素的功能。增加析构函数是为了将指针销毁的同时,也将其所记录的所有对象销毁。重载输入、输出操作符是便于从输入、输出流中还原或保存记录的对象。


类StuInfoVec
//处理成绩管理操作的底层类,包括增加记录、删除记录、查询记录以及保存和
//读取记录等的函数。该类不涉及任何关于用户界面的操作
class StuInfoVec
{
protected:
RecordVec recVec; //使用RecordVec的对象作为数据成员
public:
typedef vector<Record*>::iterator Iterator;
//添加新的学生记录
virtual void addRecord(const string& pattern,int type,Iterator from);
//删除有“待删除”标记的记录
virtual int removePerform();
//寻找一个学生记录
virtual void saveRecords(ostream& os);
//将学生信息保存到输出流中
virtual int loadRecords(istream& is);
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();}
};
该类是处理学生信息记录的底层类,针对增加记录、删除记录、查询记录以及保存和读取记录等操作进行与底层数据结构相关的处理,该类不涉及任何与用户界面或用户交互相关的操作。
该类以中“包含”关系持有一个RecordVec类的对象recVec,作为保护型数据成员,这是存取记录的底层数据结构。
StuInfoVec类中定义的一些成员函数可直接使用RecordVec类的成员函数。如addRecord()函数调用RecordVec类继承自基类的push_back()函数,saveRecords()函数只是调用了RecordVec重载的输出操作符。
需要特别说明的是以下3 个函数:
findRecord()成员函数。它用于从已有的学生信息记录中寻找一个符合条件的记录,并返回指向该记录的iterator(迭代器)。该函数将从给定的iterator开始,按递增的顺序依次考查每一记录,直到找到符合条件的记录或者到达记录的末尾。Iterator迭代遍历记录时采用如下代码:
Iterator it;
Iterator it_end = recVec.end();
for(it=from;  it!=it_end; it++)
{
//对*it进行操作
}
这里的from是迭代开始的位置,it_end是记录的末尾。若要想遍历整个记录并找出所有符合条件的记录,from第一次可以使用recVec.begin()函数的返回值,之后每次取前一次运行findRecord()函数所得返回值增1,直到findRecord()函数返回it_end为止。
另外由于存储记录的数据结构是vector,vector可以通过下标操作符[]以常量时间存取它的任一元素,所以遍历记录的另一种方法就是通过下标操作:
int nSize = size();
for(int i=0; i<nSize; i++)
{
//对recVec[i]进行操作
}
removePerform()成员函数。用于从数组中真正删除做了“待删除”标记的记录,并返回实际上删除了的记录数。
由于向量这种数据结构的特点,每删除一个元素都必须将被删除元素后面的所有元素前移一格,为了减少这种移动的次数,提高效率,故从向量的末尾开始逆向寻找每一个做了标记的记录,调用recVec的erase()成员函数实际将其删除。
由于记录中有一个“名次”项,所以在删除了记录之后,为了保证名次的正确,必须更新剩余记录中的“名次”项,更新的方法是将剩余记录中名次排在被删除记录后面的记录的名次减1。
loadRecord()成员函数。将写在文件里的记录读取出来,追加到当前记录的末尾,这是通过对recVec调用其重载的操作符>>实现的。但是如果追加前已经有了一部分记录信息,则加入了新记录之后名次会被打乱,因此所有记录的“名次”项都应进行相应调整。调整的方法是对每一条记录都计算部分大于它的人数ncount,而该记录的名次便是ncount+1。


类StuInfoManager
class StuInfoManager :public StuInfoVec
{
protected:
bool isModified; //学生信息是否已被修改还未保存
int toRemvNodes; //做了删除标记的记录数
public:
static char* subject_[];


StuInfoManager();
virtual ~StuInfoManager();


//开始成绩管理程序的用户界面操作
virtual void start();
//菜单处理函数 
virtual void handleMenu();
//显示记录
virtual void displayRecords();
//查询记录
virtual void queryRecord();
//增加记录
virtual void addRecord();
//删除记录
virtual void removeRecord();
//标记删除记录
virtual void removeNote(bool irToRemove);
//修改记录
virtual void modifyRecord();
//记录排序
virtual void sortRecords();
//保存记录
virtual void saveRecords();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前记录信息
virtual void clear();
protected:
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
//显示一条记录的信息
void dispRecord(Record* rec);
//找出给定总分在所有记录中的名次
int getIndex(float sum);


};
该类是处理成绩管理操作的面向用户使用的类,它包含了所有功能的用户界面以及用户交互的实现。
在运行管理程序时只要新建一个StuInfoManager对象,就可以自动执行与用户交互的操作了。
StuInfoManager的构造函数将调用欢迎界面成员函数start(),start()成员函数将调用菜单处理成员函数handleMenu(),在handleMenu() 成员函数中,将反复调用菜单选择成员函数menuSelect(),然后依据用户的选择调用相应的处理成员函数。


【提示】
displayRecords():每输出20条记录后停下,按回车后,再输出后面的记录。
queryRecord():首先获得用户要求的查询条件,然后反复调用StuInfoVec的findRecore()成员函数,找出所有匹配条件的记录并显示出来。
addRecord():要求用户输入学号、姓名、性别、各科成绩等必要信息,并自动计算出总分、平均分和名次,从而构建新的Record对象,然后将指向该对象的指针作为vector的元素,通过调用StuInfoVec的addRecord()成员函数添加到信息记录的末尾。注意这里在计算名次时调用了protected的成员函数getIndex()。
将getIndex()成员函数设计为protected型,它有一个float型的参数sum,其功能是找出总分为sum的记录在当前所有记录中按升序排序的位置,并且同时更新总分小于sum的记录的名次增1,同时计算总分大于sum的记录的数目ncount,最后返回ncount+1作为总分为sum的记录名次。
removeRecord():启动一个子菜单,让用户选择具体的删除操作,包括标记待删除的记录、执行标记、取消指定记录的删除标记和取消全部标记。然后依据用户的选择调用removeNote()和removePerform()成员函数。
removeNote()成员函数是用来做删除标记的函数,它有一个bool参数isToRemove,通过该参数来区别当前函数调用是希望打上标记不是取消删除标记。removeNote() 成员函数会首先获得用户要求的查询条件,使用该查询条件来找到用户想要标记(取消标记)的确切记录,将每一个符合条件的记录显示给用户看,询问用户是否确定标记(取消标记)该记录;若确定,则通过对该记录的bool型对象toBeDeleted进行赋值来实现操作。
modifyRecord():可以更改已有的信息记录。它将首先获得用户的查询条件,使用该查询条件来找到用户想要更改的确切记录,将每一个符合条件的记录显示给用户看,询问用户是否确定更改该记录;若确定,则要求用户重新输入学号、姓名、性别和各科成绩,并且自动计算出总分、平均分和名次,更改该记录的内容,同时还要更新其他记录的名次项。关于“名次”的计算方法是:通过iterator迭代每条不等于当前记录的记录,将原来名次排在被修改记录之后、而其sum小于修改后记录的sum的记录的名次减1,将原来名次排在被修改记录之前或相同、而其sum小于修改后的记录的名次增1,同时计算其sum大于修改后记录的sum的记录的数目ncount,则修改后记录的名次为ncount+1。
sortRecords():功能是根据用户的选择“学号”、“姓名”或“名次”对记录进行排序。
saveRecords():让用户输入的文件名,然后建立文件输出流,再调用StuInfoVec类的saveRecords()成员函数完成。
loadRecords():从文件读取记录。该函数首先询问用户:是希望将从文件中读取的记录覆盖当前学生信息,不是追加到当前学生信息的末尾。如果选择覆盖,就会首先调用clear()成员函数,将当前的信息记录清空。接着让用户输入文件名,然后建立文件输入流,最后调用StuInfoVec类的loadRecords()成员函数完成读取操作。
clear()成员函数功能是清空当前记录。它会首先检查当前是否还有被做了标记但还没执行的记录,若有则会提示用户是否执行并作相应处理。然后检查信息记录是否已被改动并提示用户进行保存,最后调用StuInfoVec类的clear()成员函数完成清空操作。
quit()成员函数会首先调用clear()成员函数,然后运行语句
delete this;
来销毁自己的(StuInfoManager)对象,最后运行exit()成员函数结束程序。


主函数如下:
int main()
{
new StuInfoManager; //开启成绩管理程序
return 0;
}


//友元重载<<、>>函数  参考程序
ostream& operator<<(ostream& os,const RecordVec& c_rl)
{
RecordVec::const_iterator it;
RecordVec::const_iterator it_end = c_rl.end();
for(it=c_rl.begin(); it!=it_end; it++)
{
os  << (*it)->number << endl
<< (*it)->name << endl
<< (*it)->gender << endl;
for(int i=0; i<NUM_SUBJECT; i++)
os << (*it)->score[i] << ' ';
os << endl << (*it)->sum << endl
<< (*it)->average << endl
<< (*it)->index << endl;
}
os << flush;
return os;


}


istream& operator>>(istream& is,const RecordVec& rl)
{
Record* rec;
string number;
while(true)
{
//注意这里使用的是全局的getline()函数,
//该函数可以直接适用于string类
getline(is,number);
if(number == "")
break;
rec = new Record;
rec->number = number; 
getline(is,rec->name);
getline(is,rec->gender);
for(int i=0;i<NUM_SUBJECT;i++)
is >> rec->score[i];
is >> rec->sum >> rec->averager >> rec->index;
is.ignore();


rl.push_back(rec);
}
return is;

}



程序段

#include <cstdlib>
#include <iostream>
#include <fstream>  
#include <vector> 
#include <string>
#include <algorithm>
#include <iomanip>
#define NUM_SUBIECT 3 
using namespace std;


class info{
public:
string number; //学号(中间不能有空格)
string name; //姓名(中间可以有空格)
string gender; //性别(中间无空格)
double score[NUM_SUBIECT]; //学生各科成绩
double sum; //总分
double average; //均分
int index; //名次
};


class List{  
public:  
    List();  
    ~List();  
    void Showfile();
    int Readfile();//从磁盘读取文件  
    void Reflush();//刷新数据,即重新写入磁盘 
    void setIndex();//设置排名 
    void Add(); //添加数据 
    void Del();  //删除数据
void Search();//查找数据
void Updata();//修改数据 
void sort();//排序 
private:  
    std::vector<info> myfile;  
};


List::List(){}  
List::~List(){}


bool compare1(const info i1, const info i2){
return i1.number.compare(i2.number);
}


bool compare2(const info i1, const info i2){
return i2.number.compare(i1.number);
}


bool compare3(const info i1, const info i2){
return i1.name.compare(i2.name);
}


bool compare4(const info i1, const info i2){
return i2.name.compare(i1.name);
}


bool compare5(const info i1, const info i2){
return i2.sum > i1.sum;
}


bool compare6(const info i1, const info i2){
return i1.sum > i2.sum;
}


void List::setIndex(){
std::sort(myfile.begin(), myfile.end(), compare6);
    std::vector<info>::iterator iter;
    int i = 0;
    for (iter = this->myfile.begin(); iter != this->myfile.end();)  
    {
iter->index = ++i;
        ++iter;
    }



void setout()//输出格式控制,即左对齐  
{
    std::cout.setf(std::ios_base::left, std::ios_base::adjustfield);  
}


void List::Showfile()  
{  
    std::vector<info>::iterator iter;  
    setout();  
    std::cout.width(7);
    std::cout << "学号";  
    std::cout.width(7);
    std::cout << "姓名";  
    std::cout.width(7);
    std::cout << "性别";  
    std::cout.width(24);
    std::cout << "各科成绩";  
    std::cout.width(7);
    std::cout << "总分";  
    std::cout.width(7);
    std::cout << "均分";  
    std::cout.width(7);
    std::cout << "名次" << endl;  
    
    for (iter = this->myfile.begin(); iter != this->myfile.end(); iter++)  
    {  
        std::cout.width(7);
        std::cout << iter->number;  
        std::cout.width(7);
        std::cout << iter->gender;
        std::cout.width(7);
        std::cout << iter->gender;
        std::cout.width(8);
        std::cout << iter->score[0];
        std::cout.width(8);
        std::cout << iter->score[1];
        std::cout.width(8);
        std::cout << iter->score[2];
        std::cout.width(7);
        std::cout << iter->sum;
        std::cout.width(7);
        std::cout << iter->average;
        std::cout.width(7);
        std::cout << iter->index<< "\n";  
    }  
}


int List::Readfile()  
{  
    std::fstream readfile("infolist.txt");  
    int rows = 0;  
    if (readfile)//如果文件存在  
    {  
        std::cout << "*******学生成绩管理系统********\n";   
        info p;  
        if (!(readfile >> p.number >> p.name >> p.gender >> p.score[0] >> p.score[1] >> p.score[2] >> p.sum >> p.average >> p.index))//如果第一次读取为空  
        {  
            std::cout << "\n空\n";  
            return 1;  
        }  
        myfile.push_back(p);  
        rows++;  
        while(readfile >> p.number >> p.name >> p.gender >> p.score[0] >> p.score[1] >> p.score[2] >> p.sum >> p.average >> p.index)//读取后存入vector容器中  
        {  
            rows++;  
            myfile.push_back(p);  
        }  
        this->Showfile();  
        std::cout << "总共:\t" << rows << "\t条记录\n";  
        readfile.close();  
        return rows;  
    }  
    else  
    {  
        std::ofstream outfile;//磁盘中不存在文件的话则创建  
        outfile.open("infolist.txt");  
        if (!outfile.is_open())  
        {  
            std::cout << "文件创建失败!\n";  
            return -1;  
        }  
        else  
        {  
            std::cout << "文件未找到,已创建!\n";  
            std::cout << "*******学生成绩管理系统********\n";
            std::cout << "学号" << "\t" << "姓名" << "\t" << "性别" << "\t" << "各科成绩" << "\t\t\t" << "总分" << "\t" << "均分" << "\t" << "排名" << "\n";  
            std::cout << "\tNULL\n";  
        }  
        outfile.close();  
    }  
    return 2;  
}


void List::Reflush()  
{
    std::ofstream outfile("infolist.txt");  
    std::vector<info>::iterator iter;  
    setout();  
    for (iter = this->myfile.begin(); iter != this->myfile.end(); iter++)  
    { 
        outfile.width(15);  
        outfile << iter->number;  
        outfile.width(15);  
        outfile << iter->name;
        outfile.width(15);  
        outfile << iter->gender;
        outfile.width(15);  
        outfile << iter->score[0];
        outfile.width(15);  
        outfile << iter->score[1];
        outfile.width(15);  
        outfile << iter->score[2];
        outfile.width(15);  
        outfile << iter->sum;
        outfile.width(15);  
        outfile << iter->average;
        outfile.width(15);  
        outfile << iter->index << "\n";  
    }  
    outfile.close();  



void List::Add()  
{  
    info p;  
    std::cout << "请输入学号:\n";
    std::cin >> p.number;  
    std::cout << "请输入姓名\n";
    std::cin >> p.name;  
    std::cout << "请输入性别:\n";
    std::cin >> p.gender;  
    p.sum = 0;
    std::cout << "请输入第一科成绩:\n";
    std::cin >> p.score[0];  
    p.sum += p.score[0];
    std::cout << "请输入第二科成绩:\n";
    std::cin >> p.score[1];  
    p.sum += p.score[1];
    std::cout << "请输入第三科成绩:\n";
    std::cin >> p.score[2];
    p.sum += p.score[2];
    p.average = p.sum / 3.0;
    myfile.push_back(p);
    
setIndex();
    std::cout << "创建成功!\n";
    this->Reflush();
}


void List::Del()  
{  
    if (myfile.empty())  
    {  
        std::cout << "没有信息可以删除!\n";  
        return;  
    }
int flag;
    string num;
    std::cout << "请输入您要删除的类型:\n";
    std::cout << "1.学号\n";
    std::cout << "2.姓名\n";
    std::cout << "3.排名\n";
    std::cin >> flag;
    if(flag == 1){
    std::cout << "请输入您要删除的学号:\n";
        std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->number == num)  
       {
myfile.erase(iter);
           this->Reflush();
           return;  
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
    }else if(flag == 2){
    std::cout << "请输入您要删除的姓名:\n";
    std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->name == num)  
       {
myfile.erase(iter);
           this->Reflush();
           return;  
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n"; 
    }else{
    std::cout << "请输入您要删除的排名:\n";
    std::cin >> flag;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->index == flag)  
       {
myfile.erase(iter);
           this->Reflush();
           return;  
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
    }
setIndex();
 
}


void List::Search(){
if (myfile.empty())  
    {  
        std::cout << "没有信息可以查找!\n";  
        return;  
    }
    int flag;
    string num;
    std::cout << "请输入您要查找的类型:\n";
    std::cout << "1.学号\n";
    std::cout << "2.姓名\n";
    std::cout << "3.排名\n";
    std::cin >> flag;
    if(flag == 1){
   std::cout << "请输入您要查找的学号:\n";  
   std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->number == num)  
       {
std::cout << "查找到的信息对应如下:" << endl;
           std::cout << "学号" << "\t" << "姓名" << "\t" << "性别" << "\t" << "各科成绩" << "\t\t" << "总分" << "\t" << "均分" << "\t" << "排名" << "\n"; 
           std::cout << iter->number << "\t" << iter->name << "\t" << iter->gender << "\t" << iter->score[0] << "\t" 
<< iter->score[1] << "\t" << iter->score[2] << "\t" << iter->sum << "\t" << iter->average << "\t" << iter->index << "\n"; 
           return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}else if(flag == 2){
std::cout << "请输入您要查找的姓名:\n";  
   std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->name == num)  
       {
std::cout << "查找到的信息对应如下:" << endl;
           std::cout << "学号" << "\t" << "姓名" << "\t" << "性别" << "\t" << "各科成绩" << "\t\t" << "总分" << "\t" << "均分" << "\t" << "排名" << "\n"; 
           std::cout << iter->number << "\t" << iter->name << "\t" << iter->gender << "\t" << iter->score[0] << "\t" 
<< iter->score[1] << "\t" << iter->score[2] << "\t" << iter->sum << "\t" << iter->average << "\t" << iter->index << "\n"; 
           return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}else{
std::cout << "请输入您要查找的排名:\n";  
   std::cin >> flag;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->index == flag)  
       {
std::cout << "查找到的信息对应如下:" << endl;
           std::cout << "学号" << "\t" << "姓名" << "\t" << "性别" << "\t" << "各科成绩" << "\t\t" << "总分" << "\t" << "均分" << "\t" << "排名" << "\n"; 
           std::cout << iter->number << "\t" << iter->name << "\t" << iter->gender << "\t" << iter->score[0] << "\t" 
<< iter->score[1] << "\t" << iter->score[2] << "\t" << iter->sum << "\t" << iter->average << "\t" << iter->index << "\n"; 
           return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}
setIndex();
}


void List::Updata(){
if (myfile.empty())  
    {  
        std::cout << "没有信息可以修改!\n";  
        return;  
    }
    int flag;
    string num;
    std::cout << "请输入您要查找的类型:\n";
    std::cout << "1.学号\n";
    std::cout << "2.姓名\n";
    std::cout << "3.排名\n";
    std::cin >> flag;
    if(flag == 1){
   std::cout << "请输入您要修改的学号:\n";  
   std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->number == num)  
       {
   std::cout << "请输入姓名\n";
   std::cin >> iter->name;  
   std::cout << "请输入性别:\n";
   std::cin >> iter->gender;  
   iter->sum = 0;
   std::cout << "请输入第一科成绩:\n";
   std::cin >> iter->score[0];  
   iter->sum += iter->score[0];
   std::cout << "请输入第二科成绩:\n";
   std::cin >> iter->score[1];  
   iter->sum += iter->score[1];
   std::cout << "请输入第三科成绩:\n";
   std::cin >> iter->score[2];
   iter->sum += iter->score[2];
   iter->average = iter->sum / 3.0;
           std::cout << "修改成功!" << endl;
           this->Reflush();
return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}else if(flag == 2){
std::cout << "请输入您要修改的姓名:\n";  
   std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->name == num)  
       {
   std::cout << "请输入性别:\n";
   std::cin >> iter->gender;  
   iter->sum = 0;
   std::cout << "请输入第一科成绩:\n";
   std::cin >> iter->score[0];  
   iter->sum += iter->score[0];
   std::cout << "请输入第二科成绩:\n";
   std::cin >> iter->score[1];  
   iter->sum += iter->score[1];
   std::cout << "请输入第三科成绩:\n";
   std::cin >> iter->score[2];
   iter->sum += iter->score[2];
   iter->average = iter->sum / 3.0;
           std::cout << "修改成功!" << endl;
           this->Reflush();
return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}else {
std::cout << "请输入您要修改的排名:\n";  
   std::cin >> num;
   std::vector<info>::iterator iter;  
   for (iter = this->myfile.begin(); iter != this->myfile.end();)  
   {  
       if (iter->name == num)  
       {
   std::cout << "请输入学号\n";
   std::cin >> iter->number;  
   std::cout << "请输入姓名\n";
   std::cin >> iter->name;  
   std::cout << "请输入性别:\n";
   std::cin >> iter->gender;  
   iter->sum = 0;
   std::cout << "请输入第一科成绩:\n";
   std::cin >> iter->score[0];  
   iter->sum += iter->score[0];
   std::cout << "请输入第二科成绩:\n";
   std::cin >> iter->score[1];  
   iter->sum += iter->score[1];
   std::cout << "请输入第三科成绩:\n";
   std::cin >> iter->score[2];
   iter->sum += iter->score[2];
   iter->average = iter->sum / 3.0;
           std::cout << "修改成功!" << endl;
           this->Reflush();
return;
       }  
       else
           ++iter;
   }
   std::cout << "未查找到对应信息!\n";
}
setIndex();
}


int sortMenu(){
int num;  
    cout << "***************************" << endl;  
    cout << "*   1   按学号进行升序    *" << endl; 
    cout << "*   2   按学号进行降序    *" << endl;  
    cout << "*   3   按姓名进行升序    *" << endl; 
    cout << "*   4   按姓名进行降序    *" << endl;  
    cout << "*   5   按名次进行升序    *" << endl;
    cout << "*   6   按名次进行降序    *" << endl;
    cout << "***************************" << endl;  
    cout << "请输入菜单号:";  
    cin >> num;
    return num;
}






void List::sort(){
setIndex();
int num = sortMenu();


        switch (num)  
        {
case 1:
std::sort(myfile.begin(), myfile.end(), compare1);
break;
case 2:
std::sort(myfile.begin(), myfile.end(), compare2);
break;
case 3:
std::sort(myfile.begin(), myfile.end(), compare3);
break;
case 4:
std::sort(myfile.begin(), myfile.end(), compare4);
break;
case 5:
std::sort(myfile.begin(), myfile.end(), compare5);
break;
case 6:
std::sort(myfile.begin(), myfile.end(), compare6);
break;
default :
            cout<<"没有该选项请重输!\n";  
}





int Menu()  
{  
    int num;  
    cout << "***************************" << endl;  
    cout << "*   1   显示信息列表      *" << endl; 
    cout << "*   2   添加学生信息      *" << endl;  
    cout << "*   3   修改学生信息      *" << endl; 
    cout << "*   4   查询学生信息      *" << endl;  
    cout << "*   5   删除学生信息      *" << endl; 
    cout << "*   6   学生信息排序      *" << endl;  
    cout << "*   7   退出              *" << endl;   
    cout << "***************************" << endl;  
    cout << "请输入菜单号:";
    cin >> num;
    return num;  
}


int main(){
List mylist;  
    mylist.Readfile(); 
int num = Menu();
    bool flags = 1;  
    while (flags)  
    {
        system("cls");
        switch (num)  
        {  
        case 1:  
            mylist.Showfile();  
            break;  
        case 2:  
            mylist.Add();  
            break;  
        case 3:   
            mylist.Updata();  
            break;
        case 4:  
            mylist.Search();  
            break;
        case 5:
            mylist.Del();
            break;
        case 6:
            mylist.sort(); 
            break;
        case 7:  
            cout << "Bye.\n";  
            return 0;  
        default:  
            cout<<"没有该选项请重输!\n"; 
            break; 
        } 
        num = Menu();
    }  
    system("pause");
}


代码截图:



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值