C++程序设计 学生成绩管理程序

C++程序设计已完成

在此共享源代码和报告
由于程序测试中含有图片较多
我已将整个成品上传到网盘中

 
 

 

 
 
private: System::Void On_Click(System::Object^  sender, #ifndef H_STUDENT_H_ABCDE
#define H_STUDENT_H_ABCDE
#include<vector>
const int NUM_SUBJECT=5;
//#include<string>
//#include<iostream.h> //科目数
using namespace std; //每一条记录的结构
struct Record
{
string number; //学号
string name; //姓名
string gender; //性别
float score[NUM_SUBJECT]; //分别为该学生门课的成绩
float sum; //总分
float average; //平均分
int index; //名次
bool toBeDeleted; //是否删除的标记
Record() {toBeDeleted = false;}
}; //用于存储通信录
//存储学生信息使用的底层数据结构是数组向量
class RecordVec : public vector<Record*>
{
friend ostream& operator<< (ostream& os, const RecordVec& c_rl);
friend istream& operator>> (istream& is, RecordVec& rl);
public:
//销毁数组中记录的所有Record所占用的空间,并且清空数组存储的记录
//该函数覆盖了基类中的同名函数
void clear()
{
//历遍整个记录提取并销毁所有Record
iterator iter;
iterator it_end = end();
for (iter=begin(); iter!=it_end; iter++)
{
delete *iter;
}
//调用超类的函数来清空记录
vector<Record*>::clear();
}
//销毁指定的记录,然后从数组中将其删除
//该函数覆盖了基类中的同名函数
iterator erase(iterator where)
{
delete *where;
return vector<Record*>::erase(where);
}
~RecordVec()
{
this->clear();
}
};
#endif //H_STUDENT_H_ABCDE
2.student.cpp文件
#include<iostream>
#include<string>
#include”student.h”
#include”StuInfoVec.h”
#include”stuInfoManager.h”
using namespace std;
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<<’\n’
<< (*it)->name<<’\n’
<< (*it)->gender<<’\n’;
for (int i=0;i<NUM_SUBJECT;i++)
os<<(*it)->score[i]<<’ ‘;
os << ‘\n’<<(*it)->sum<<’\n’
<< (*it)->average<<’\n’
<< (*it)->index<<’\n’;
}
os << flush;
return os;
}
istream& operator>> (istream& is,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->average>>rec->index;
is.ignore();
rl.push_back(rec);
}
return is;
}
StuInfoVec文件
1. StuInfoVec.h文件
#ifndef H_STUINFOVEC_H_PPWE
#define H_STUINFOVEC_H_PPWE
#include<iostream>
#include<string>
#include<iterator>
#include “student.h”
using namespace std;
// 处理成绩管理操作的底层类,包括增加记录、删除记录、查询记录以及保存和读取
// 记录等的函数,该类不涉及任何关于用户界面的操作
class StuInfoVec
{
protected:
RecordVec recVec; //这是包含关系
public:
typedef vector<Record*>::iterator Iterator;
//添加新的学生记录
virtual void addRecord(Record* rec);
//删除做了”待删除”标记的记录
virtual int removePerform();
//寻找一个学生记录
virtual Iterator findRecord(const string& pattern,
int type,Iterator from);
//将学生信息保存到输出流中
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();}
};
#endif //H_STUINFOVEC_H_PPWE
2. StuInfoVec.cpp文件
#include “StuInfoVec.h”
 
StuInfoVec::~StuInfoVec()
{
recVec.clear();
}
/****
* 功能:添加新的记录
* 参数:rec, 指向新记录的指针
*********/
void StuInfoVec::addRecord(Record* rec)
{
if (rec != NULL)
{
recVec.push_back(rec);
}
}
/******
* 功能:从数组中删除了”待删除”标记的记录
* 返回:实际上删除了的记录数
**********/
int StuInfoVec::removePerform()
{
int deletedNum = 0;
// 为了获得更加高的效率,从数组的末尾开始查找做了标记的记录并将其删除
Iterator it,it2,it_end;
Iterator it_beforeBegin = recVec.begin()-1;
 
int inx; // 被删除记录的名次
for (it=recVec.end()-1; it!=it_beforeBegin; it–)
{
if ((*it)->toBeDeleted)
{
inx = (*it)->index;
it = recVec.erase(it);
deletedNum++;
// 更新剩下的所有记录的名次
// 将名次排在被删除记录后面的记录的名次减
it_end = recVec.end();
for (it2=recVec.begin(); it2!=it_end; it2++)
{
if ((*it2)->index > inx)
(*it2)->index–;
}
}
}
return deletedNum;
}
/**********
* 功能:从记录信息中寻找一个记录
* 参数:pattern, 欲寻找的记录的指定域与pattern相等。
* type, 为表示欲寻找记录的学号(number)与pattern相等;
* 为表示欲寻找记录的姓名(name)与pattern相等;
* 为表示欲寻找记录的名次(index)与pattern相等。
* from, 从from开始寻找匹配的记录。
* 返回:若找到了则返回指向第一个匹配记录的迭代器,
* 若找不到则返回的迭代器等于pastEnd()的返回值。
* 注意:from应是可提领的迭代器。
* 第一次调用可以有first(),之后使用上一次findRecord()的返回值增,
* 直到返回pastEnd(),便可以获得所有匹配的记录
********/
StuInfoVec::Iterator StuInfoVec::findRecord(
const string& pattern, int type, StuInfoVec::Iterator from)
{
Iterator it;
Iterator it_end = recVec.end();
for (it=from; it!=it_end; it++)
{
if ((type==0 && (*it)->number==pattern) ||
(type==1 && (*it)->name==pattern) ||
(type==2 && (*it)->index==atoi(pattern.c_str())))
break;
}
return it;
}
/****
* 功能:将信息记录数组保存到输出流中
* 参数:os, 指定的输出流
**************/
void StuInfoVec::saveRecords(ostream &os)
{
os << recVec;
}
/*****
* 功能:从输入流中读入数据并追加到当前记录的末尾
* 参数:is, 指定的输入流
* 返回:读入的记录数
**/
int StuInfoVec::loadRecords(istream &is)
{
int ori = size();
is >> recVec;
int addedCount = size()-ori;
// 如果是在原有记录的基础上追加新的记录,则更新所有记录的名次项
if (ori != 0)
{
int i,j;
int num = size();
int ncount; //记录总分大于当前记录的人数
float sumi;
for (i=0; i<num; i++)
{
ncount = 0;
sumi = recVec[i]->sum;
for (j=0; j<num; j++)
{
if (recVec[j]->sum > sumi)
ncount++;
}
recVec[i]->index = ncount+1;
}
}
return addedCount;
}
StuInfoManager文件
1.StuInfoManager.h文件
#ifndef H_STUINFOMANAGER_H_ZZZ
#define H_STUINFOMANAGER_H_ZZZ
#include “StuInfoVec.h”
class StuInfoManager : public StuInfoVec//处理成绩管理的面向用户使用的类,包含所有功能的用户界面及用户交互的实现
{
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(bool isToRemove); //标记删除记录
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); //找出给定总分在所有记录中的名次
};
#endif //H_STUINFOMANAGER_H_ZZZ
1.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()
{
 
handleMenu();
}
/**************
* 功能:显示成绩管理程序菜单,返回用户选择的选项
* 返回:用户选择的选项,是~9之间的一个字符
************/
char StuInfoManager::menuSelect()
{
cout<<”┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓”<<endl;
cout<<”┃ ***** ☆ 学生成绩管理系统 ☆ ***** ┃”<<endl;
cout<<”┃**** ★★★★ ★★★★****┃”<<endl;
cout<<”┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫”<<endl;
cout<<”┃*★ ☆ 0. 显示 学生成绩 ☆ ★*┃”<<endl;
cout<<”┃*★ ☆ 1. 查找 学生成绩 5. 排序 统计成绩 ☆ ★*┃”<<endl;
cout<<”┃*★ ☆ 2. 增加 学生成绩 6. 保存 学生成绩 ☆ ★*┃”<<endl;
cout<<”┃*★ ☆ 3. 删除 学生成绩 7. 读取 学生成绩 ☆ ★*┃”<<endl;
cout<<”┃*★ ☆ 4. 修改 学生成绩 8. 新建 学生信息文件 ☆ ★*┃”<<endl;
cout<<”┃*★ ☆ 9. 结束 运行 ☆ ★*┃”<<endl;
cout<<”┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛”<<endl;
cout<<” 请输入您的选择(0–9):”;
string str;
char choice;
while(true)
{
cin>>str;
cin.ignore(); //从cin中将回车符提取出来
choice = str[0];
if(choice<’0′ || choice>’9′ )
cout<< “\n输入错误,重选~9:”;
else
break;
}
return choice;
}
/****************
* 功能:根据用户选择的项目调用相应的处理函数
***************/
void StuInfoManager::handleMenu()
{system(”cls”);
while(true)
{
switch(menuSelect())
{
case ‘0′:
displayRecords();// DOS下的清屏命令
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<<” ━━┳━━━┳━━━┳━━━┳━━━”
<<”┳━━━┳━━━┳━━━┳━━━┳━━━”<<endl;
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 if (choi[0] == ‘3′)
{
cout<< “请输入欲查询的学生的名次:”;
type = 2;
}else {cout<<”输入有误,请重新输入!!!”;}
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的记录名次增
} 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(”请输入性别(为女,为男):”);
cin.getline(choi,5);
while((choi[0] != ‘0′)&&(choi[0] != ‘1′)){
cout<<”★★★输入有误,请重新输入!!!★★★”<<endl;
printf(”请输入性别(为女,为男):”);
cin.getline(choi,5); }
if(choi[0] == ‘0′){rec->gender = “女”;}
else if(choi[0] == ‘1′){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;
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;
}
}
}
/***********
* 功能:标记指定记录为”待删除”或取消该标记
* 参数:isToRemove,为true表示标记指定记录为”待删除”
* 为false表示取消指定记录为”待删除”标记
************/
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<< “请输入欲查询的学生的姓名:”;
type = 1;
} else if (choi[0] == ‘3′)
{
cout<< “请输入欲查询学生的名次:”;
type = 2;
}else {cout<<”★★★输入有误,请重新输入!!!★★★”;}
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; // 总分大于sum的人数
int tmpi =(*it)->index; //记录当前修改的记录的名次
cout<< “下面请重新输入该学生的信息:\n”;
cout<< “请输入学号:”;
cin>> (*it)->number;
cin.ignore();
cout<< “请输入姓名:”;
cin.getline(name,20);
(*it)->name = name;
printf(”请输入性别(为女,为男):”);
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;
//修改其他记录的名次、
//将原来名次排在被修改记录之后,而其sum大于等于
//修改后记录的sum的记录的名次减,
//将原来名次排在被修改记录之前或相同,而其sum小于
//修改后记录的sum的记录的名次增
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 ((*it)->index<=tmpi && (*it1)->sum<sum)
(*it1)->index++;
if ((*it1)->sum > sum)
ncount++;
}
//nocut是总分比当前学生的总分大的学生的个数
//当前学生的名次是nocunt+1
(*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]); //这是STL的一个函数
}
}
}
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);
}
 
 
版权所有© HzlzH | 本文采用 BY-NC-SA 进行授权
转载需注明 转自: 《C++程序设计 学生成绩管理程序

随机文章

{ Leave a Reply ? }

  1. 黄河 China Mozilla Firefox Windows

    没用,用不着

  2. Anonymous China Internet Explorer Windows

    我也不觉得有多少的讲解啊!为了让初手看的懂就应该再写的明白些啦!
    不过还是要谢谢你们的提供阅读.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)