📄 新建 文本文档.txt
字号:
#include<iostream>
#include<cstdlib>
#include<vector>
#include<string>
#include<iterator>
#include<fstream>
#include<cstdlib>
#define NUM_SUBJECT 5
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 RecordVec : public vector<Record*>
{
public:
void clear();
iterator erase(iterator where)
{
delete *where;
vector<Record*>::erase(where);
return where;
}
~RecordVec();
};
void RecordVec::clear()
{
iterator p=begin(),s=end();
for(; p!=s; p++)
delete *p;
vector<Record*>::clear();
}
RecordVec::~RecordVec()
{
clear();
}
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) //寻找一个学生记录
{
Iterator p;
int i=0;
switch(type)
{
case 0: for(p=form;p!=recVec.end();p++)
{
if(patten==(*p)->number) return p;
}
break;
case 1: for(p=form;p!=recVec.end();p++)
{
if(patten==(*p)->name) return p;
}
break;
case 2: i=atoi(patten.c_str());
for(p=form;p!=recVec.end();p++)
{
if(i==(*p)->index) return p;
}
default:break;
}
return 0;
}
//virtual void saveRecords(ostream& os); //将学生信息保存到输出流中
//virtual int loadRecords(istream& in);//从输入流中读入数据,并追加到当前学生信息记录的末尾
virtual ~StuInfoVec(){ recVec.clear(); }
const int size() const {return recVec.size();}//获得记录的学生数量
const bool empty() const {return recVec.empty();}//是否无学生信息
virtual void clear(){recVec.clear();}//清空学生信息
Iterator first(){return recVec.begin();}//获得第一条记录
Iterator pastEnd(){return recVec.end();}//获得超过最后一条记录之后的一个迭代器
};
void StuInfoVec::addRecord(Record* rec) //添加新的学生的记录
{
rec->sum=0;
for(int i=0;i<NUM_SUBJECT;i++)
rec->sum+=rec->score[i];
rec->average=rec->sum/NUM_SUBJECT;
recVec.push_back(rec);
}
int StuInfoVec::removePerform() //删除有"待删除"标志的记录
{
Iterator p,r,itEnd;
int total=0,i=0;
itEnd=recVec.end();
for(p=recVec.begin(); p!=itEnd; p++)
{
if((*p)->toBeDeleted==true) {
recVec.erase(p);
total++;
for(r=p;r!=itEnd;r++)
(*r)->index--;
}
}
return total;
}
class StuInfoManager: public StuInfoVec
{
protected:
bool isModified; //学生信息是否已被修改还未保存
int toRemvNodes; //做了删除标记的记录数
public:
// static char* subject[NUM_SUBJECT];
public:
StuInfoManager(){
toRemvNodes=0;
isModified=false;
}
// virtual ~StuInfoManager();
//开始成绩
// virtual void start();
//菜单处理函数管理程序的用户界面操作
// virtual void handleMenu();
//显示记录
// virtual void displayRecords();
//查询记录
virtual void queryRecord()
{
Iterator tmp=recVec.begin(),qrr;
string stmp;
cout<<"choose the query condition: "<<endl;
cout<<"1. [n]umber"<<endl<<"2. n[a]me"<<endl<<"3. [i]ndex"<<endl;
switch(menuSelect())
{
case 'n': cout<<"Enter the number:";
cin>>stmp;
while(tmp!=recVec.end())
{
if((qrr=findRecord(stmp, 0, tmp))!=0)
{
//处理查询
break;
}
}
break;
case 'a': cout<<"Enter the name:";
cin>>stmp;
while(tmp!=recVec.end())
{
if((qrr=findRecord(stmp, 1, tmp))!=0)
{
//处理查询
break;
}
}
break;
case 'i': cout<<"Enter the number";
cin>>stmp;
while(tmp!=recVec.end())
{
if((qrr=findRecord(stmp, 2, tmp))!=0)
{
//处理查询
break;
}
}
break;
default: cout<<"不是有效的选项"<<endl;
}
}
//添加记录
// virtual void addRecord(AddNewdlg& dlg)
//删除记录
virtual void removeRecord()
{
removePerform();
toRemvNodes=0;
isModified=true;
}
//标记删除记录
virtual void removeNote( Record& rc)
{
rc.toBeDeleted=true;
toRemvNodes++;
}
//修改记录
// virtual void modifyRecord(Record *tmp,Record*tmp2)
// {
// }
//记录排序
// virtual void sortRecords();
//保存记录
virtual void saveRecords(string filename)
{
if(isModified!=0) {
MessageBox(NULL,"Record unchanged,needn't save","Warning",MB_OK);
return;
}
ofstream out;
out.open(filename.c_str(),ios::out);
if(!out) {
MessageBox(NULL,"can't open file","Warning",MB_OK);
return;
}
Iterator tmp,end;
tmp=recVec.begin();
end=recVec.end();
while(tmp!=end)
{
out<<(*tmp)->number<<' '<<(*tmp)->name<<' '<<(*tmp)->gender<<' '<<(*tmp)->score[0]<<' '<<(*tmp)->score[1]<<' '<<(*tmp)->score[2]<<' '<<(*tmp)->score[3]<<' '<<(*tmp)->score[4];
out<<'\n';
tmp++;
}
MessageBox(NULL,"save success","Warning",MB_OK);
isModified=false;
out.close();
}
// 读取记录
virtual void loadRecords(string filename)
{
ifstream in;
in.open(filename.c_str());
if(!in) {
MessageBox(NULL,"can't open file","Warning",MB_OK);
return;
}
Record *tmp;
char s;
while(!in.eof())
{
tmp=new Record;
in>>tmp->number>>tmp->name>>tmp->gender>>tmp->score[0]>>tmp->score[1]>>tmp->score[2]>>tmp->score[3]>>tmp->score[4];
addRecord(tmp);
cout<<tmp->name;
in>>s;
}
isModified=true;
in.close();
}
//结束程序
// virtual void quit();
//清空当前记录信息
virtual void clear()
{
StuInfoVec::clear();
}
//菜单选择函数
char menuSelect()
{
char select=-1;
while(select<'A'||(select>'Z'&&select<'a')||select>'z')
{
cout<<"Please Select: ";
cin>>select;
}
if(select>'A'&&select<'Z') select+=32;
return select;
}
//显示表头
// void dispTable();
//显示一条记录的信息
// void dispRecord();
//找出给定总分在所有记录中的名次
int getIndex(float sum)
{
Iterator p,s;
s=recVec.end();
for(p=recVec.begin();p!=s;p++)
{
if(sum==(*p)->sum) return (*p)->index;
}
return 0;
}
};
int main()
{
StuInfoManager v;
Record a;
a.name="yangzhao";
a.number="13051266";
a.gender="male";
a.score[0]=a.score[2]=a.score[1]=a.score[3]=a.score[4]=60;
v.addRecord(&a);
v.addRecord(&a);
v.addRecord(&a);
v.saveRecords("a.txt");
v.clear();
cout<<v.size()<<endl;
v.loadRecords("a.txt");
system("pause");
cout<<endl<<v.size();
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -