student
//main.cpp
#include<iostream> #include<fstream> #include<sstream> #include<string> #include<algorithm> #include"weihu.h" #include"index.h" #include"stat.h" #include"sdt.h" using std::cin; using std::cout; using std::vector; using std::ofstream; using std::map; using std::string; using std::endl; using std::ifstream; using std::istringstream; void main_menu() { cout<<"*********************08欧洲杯冠军意大利***********************"<<"\n" <<"******************欢迎光临学生信息管理系统********************"<<"\n" <<"****************************^_^*******************************"<<"\n" <<"* 1.信息维护 ●█〓██▄▄▄▄▄▄ ●GOAL● *"<<"\n" <<"* 2.信息检索 ▄▅██████▅▄▃▂ *"<<"\n" <<"* 3.信息统计 ██████████████ *"<<"\n" <<"* 4.退出程序 ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ *"<<"\n" <<"* 制作人:剑侠£影枫 *"<<"\n" <<"* 联系QQ:32861410 *"<<"\n" <<"* E-mail:youxiaoitaly@hotmail.com *"<<"\n" <<endl; select_menu(); int select; while(cin>>select) { switch(select) { case 1:system("cls");weihu_menu();break; case 2:system("cls");index_menu();break; case 3:system("cls");stat_menu();break; case 4:exit(0);break; default:cout<<"输入无效,返回重新输入!"; } } } bool admin_pass() { const string pass("13730891297"); //管理员登陆密码 string user_pass; int cnt=0; //统计密码错误次数 cout<<"请输入管理员登陆密码!!!"<<endl; while(cnt<3) { cin>>user_pass; if(user_pass!=pass) { cout<<"密码输入错误!你还剩"<<2-cnt<<"次输入机会!!"<<endl; ++cnt; } else break; } if(cnt<3) return true; else return false; }
int main() { /*读取文件内容到容器*/ ifstream infile("sdt.txt"); string str_line; while(getline(infile,str_line)) { student xuesheng; istringstream sin(str_line); sin>>xuesheng; svec.push_back(xuesheng); } /*对容器按照班级进行排序*/ sort(svec.begin(),svec.end()); system("cls"); main_menu(); }
//index.cpp
#include<iostream>
#include<fstream>
#include<string>
#include"index.h"
#include"sdt.h"
using std::cin;
using std::cout;
using std::vector;
using std::ofstream;
using std::map;
using std::string;
using std::endl;
void index_menu()
{
cout<<"*********************08欧洲杯冠军意大利***********************"<<"\n"
<<"******************欢迎光临学生信息检索系统********************"<<"\n"
<<"****************************^_^*******************************"<<"\n"
<<"* 1.按姓名查找 ●█〓██▄▄▄▄▄▄ ●GOAL● *"<<"\n"
<<"* 2.按班级查找 ▄▅██████▅▄▃▂ *"<<"\n"
<<"* 3.返回上级菜单 ██████████████ *"<<"\n"
<<"* ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ *"<<"\n"
<<"* 制作人:剑侠£影枫 *"<<"\n"
<<"* 联系QQ:32861410 *"<<"\n"
<<"* E-mail:youxiaoitaly@hotmail.com *"<<"\n"
<<endl;
select_menu();
int select_index;
while(cin>>select_index)
{
switch(select_index)
{
case 1:system("cls");search_name();break;
case 2:system("cls");search_class();break;
case 3:come_back();break;
default:cout<<"输入无效,返回重新输入!";
}
}
}
void search_name() //按姓名查找
{
string xingming;
bool flag=false;
cout<<"请输入你要查找同学的名字!"<<endl;
cin>>xingming;
vector<student>::iterator it=svec.begin();
for(;it!=svec.end();++it)
if(it->s_name==xingming)
{
cout<<*it<<endl;
flag=true;
}
if(!flag) cout<<"没有你要查找的同学名字!"<<endl;
back_main();
}
void search_class() //按班级查找
{
string banji;
bool flag=true;
cout<<"请输入你要查找的班级!"<<endl;
cin>>banji;
vector<student>::iterator it=svec.begin();
for(;it!=svec.end();++it)
if(it->s_class==banji)
{
cout<<*it<<endl;
flag=true;
}
if(!flag) cout<<"没有你要查找的班级!"<<endl;
back_main();
}
//stat.cpp
#include<iostream> #include<fstream> #include<string> #include<algorithm> #include"stat.h" #include"sdt.h" using std::cin; using std::cout; using std::vector; using std::ofstream; using std::map; using std::string; using std::endl; void stat_menu() { cout<<"*********************08欧洲杯冠军意大利***********************"<<"\n" <<"******************欢迎光临学生信息统计系统********************"<<"\n" <<"****************************^_^*******************************"<<"\n" <<"* 1.成绩统计 ●█〓██▄▄▄▄▄▄ ●GOAL● *"<<"\n" <<"* 2.返回上级菜单 ▄▅██████▅▄▃▂ *"<<"\n" <<"* ██████████████ *"<<"\n" <<"* ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ *"<<"\n" <<"* 制作人:剑侠£影枫 *"<<"\n" <<"* 联系QQ:32861410 *"<<"\n" <<"* E-mail:youxiaoitaly@hotmail.com *"<<"\n" <<endl; select_menu(); int select_stat; while(cin>>select_stat) { switch(select_stat) { case 1:system("cls");tongji();break; case 2:come_back(); default:cout<<"输入无效,返回重新输入!";
} } } void tongji() //统计显示每个班每一科目的成绩 { vector<student>::const_iterator beg=svec.begin(); vector<student>::const_iterator end=svec.end(); while(beg!=end) { vector<student>::const_iterator copy_beg=beg; vector<student>::const_iterator copy_end=find_if(beg,end,GT_cls(beg->s_class)); map<string,double>::const_iterator m_it=beg->s_score.begin(); //控制各科目的循环 map<string,double>::const_iterator m1_it=beg->s_score.end(); //控制各科目的循环 int nCurIdx = 0; //增加一个索引,记录当前正在处理的科目位置 cout<<beg->s_class<<" 成绩统计情况如下: "<<endl; while(m_it!=m1_it) { /*遍历每一科目的时候重置各项为0*/ double max=0.0; double min=0.0; double ave=0.0; double sum=0.0; int cnt=0; beg=copy_beg; max=min=m_it->second; cout<<"\t\t"<<m_it->first<<" : "; for(;beg!=copy_end;++beg) //for(;beg!=end;++beg) //控制班上同学的循环 { map<string,double>::const_iterator mm_it=beg->s_score.begin(); //mm_it指向每1科目
//调整当前统计的科目成绩的位置 int nIdx = 0; while(nIdx++<nCurIdx) //控制mm_it指向下一个应该被处理的科目 ++mm_it; if((mm_it->second)>max) max=mm_it->second; if((mm_it->second)<min) min=mm_it->second; sum+=mm_it->second; ++cnt; } ++nCurIdx; //处理完一科 nCurIdx加1 cout<<"平均分:"<<sum/cnt<<"\t"<<"最高分;"<<max<<"\t"<<"最低分:"<<min<<endl; ++m_it; } beg=copy_end; } back_main(); }
//weihu.cpp
#include<iostream> #include<fstream> #include<string> #include<algorithm> #include<vector> #include"weihu.h" #include"sdt.h" using std::cin; using std::cout; using std::vector; using std::ofstream; using std::map; using std::string; using std::endl; std::vector<student> svec; void weihu_menu() { cout<<"*********************08欧洲杯冠军意大利***********************"<<"\n" <<"******************欢迎光临学生信息维护系统********************"<<"\n" <<"****************************^_^*******************************"<<"\n" <<"* 1.建立学生成绩文件 ●█〓██▄▄▄▄▄▄ ●GOAL● *"<<"\n" <<"* 2.添加学生记录 ▄▅██████▅▄▃▂ *"<<"\n" <<"* 3.删除学生记录 ██████████████ *"<<"\n" <<"* 4.修改学生记录 ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ *"<<"\n" <<"* 5.删除全部学生记录 *"<<"\n" <<"* 6.返回上级菜单 *"<<"\n" <<"* 制作人:剑侠£影枫 *"<<"\n" <<"* 联系QQ:32861410 *"<<"\n" <<"* E-mail:youxiaoitaly@hotmail.com *"<<"\n" <<endl; select_menu(); int select_weihu; while(cin>>select_weihu) { switch(select_weihu) { case 1:system("cls");build_data();back_main();break; case 2:system("cls");con_add(); build_data();back_main();break; case 3:system("cls");del_data();build_data();back_main();break; case 4:system("cls");modif_data();build_data();back_main();break; case 5:system("cls");del_all();build_data();back_main();break; case 6:come_back();break; default:cout<<"输入无效,返回重新输入!"; } } }
void build_data() //建立学生成绩文件 { char ss; if(svec.empty()) { cout<<"现在还没有任何内容,需要马上添加吗?(Y/N)"<<endl; cin>>ss; if(ss=='y'||ss=='Y') con_add(); else { ofstream os("sdt.txt"); for(vector<student>::const_iterator sdt_it=svec.begin();sdt_it!=svec.end();++sdt_it) os<<*sdt_it<<endl; exit(0); } } else { ofstream os("sdt.txt"); sort(svec.begin(),svec.end()); //按班级排序输出 for(vector<student>::const_iterator sdt_it=svec.begin();sdt_it!=svec.end();++sdt_it) os<<*sdt_it<<endl; } } void add_data() //添加学生记录 { cout<<"请按照“学生 学号 班级 课程1 分数 课程2 分数”格式录入数据(每一个班的课程顺序必须一直)Ctrl+Z结束录入"<<endl; student s; cin>>s; svec.push_back(s); } void con_add() //重复添加 { bool flag=true; char c; while(flag) { add_data(); cin.clear(); //刷新输入流 cout<<"继续添加吗?(Y/N)"<<endl; cin>>c; if(c=='n'||c=='N') flag=false; } } void del_data() //删除3门课程不及格的学生记录 { bool has=true; cout<<"即将删除有3门课程不及格的学生记录!"<<endl; for(vector<student>::iterator del_it=svec.begin();del_it!=svec.end();++del_it) { int cnt=0; /*遍历每一个同学每一门学科,找出小于60分的*/ for(map<string,double>::iterator map_it=del_it->s_score.begin();map_it!=del_it->s_score.end();++map_it) { if(map_it->second<60.0) ++cnt; } if(cnt>=3) //如果有3门小于60 则删除 { has=false; char flag; cout<<"即将删除:"<<"\n" <<"\t"<<*del_it<<"\n" <<"\t"<<"确认吗?(Y/N)"<<endl; cin>>flag; if(flag=='Y'||flag=='y') { svec.erase(del_it); --del_it; } else continue; } } if(has) cout<<"没有符合删除条件的数据!"<<endl; } void del_all() { char s; cout<<"该操作会删除全部数据,你确认继续吗?(Y/N)"<<endl; cin>>s; if(s=='y'||s=='Y') svec.clear(); else weihu_menu(); } void modif_data() { string mdi_num; head:cout<<"输入要修改学生的学号:"<<endl; cin>>mdi_num; bool has=true; for(vector<student>::iterator mdi_it=svec.begin();mdi_it!=svec.end();++mdi_it) { if((*mdi_it).s_num==mdi_num) { has=false; for(map<string,double>::iterator map_it=(*mdi_it).s_score.begin();map_it!=(*mdi_it).s_score.end();++map_it) { char flag; cout<<"是否修改:"<<"\n" <<"\t"<<(*mdi_it).s_name<<"\t"<<(*mdi_it).s_class<<"\t"<<map_it->first<<"\t"<<map_it->second<<"\n" <<"\t"<<"确认吗?(Y/N)"<<endl; cin>>flag; if(flag=='Y'||flag=='y') { cout<<"请输入修改后的分数:"<<endl; cin>>map_it->second; }
} } } if(has) { char y; cout<<"没有找到你输入的学号!返回重新输入?(Y/N)"<<endl; cin>>y; if(y=='y'||y=='Y') goto head; }
}
//index.h
void index_menu(); //信息检索主菜单
void search_name(); //按姓名查找
void search_class(); //按班级查找
//sdt.h
#ifndef SDT_H
#define SDT_H
#include<map>
#include<utility>
#include<vector>
#include<cstdlib>
void main_menu();
class student{
friend std::istream& operator>>(std::istream&,student&);
friend std::ostream& operator<<(std::ostream&,const student&);
public:
student():s_name("*"),s_num("*"),s_class("*"){}
operator std::string() const
{
return s_class;
}
std::string s_name; //姓名
std::string s_num; //学号
std::string s_class; //班级
std::map<std::string,double> s_score;//课程得分
};
extern std::vector<student> svec; //申明全局vector存放文件内容
inline bool operator<(const student &lhs,const student &rhs) //重载小于操作符,供按班级排序
{
return lhs.s_class<rhs.s_class;
}
inline std::istream& operator>>(std::istream &in,student &rhs)
{
in>>rhs.s_name>>rhs.s_num>>rhs.s_class;
std::string kc; //课程名字
double score=0.0; //课程得分
while(in>>kc>>score)
rhs.s_score.insert(make_pair(kc,score));
return in;
}
inline std::ostream& operator<<(std::ostream &os,const student &rhs)
{
os<<rhs.s_name<<"\t"<<rhs.s_num<<"\t"<<rhs.s_class
<<"\t";
std::map<std::string,double>::const_iterator map_it=rhs.s_score.begin();
while(map_it!=rhs.s_score.end())
{
os<<map_it->first<<" "<<map_it->second<<"\t";
++map_it;
}
return os;
}
inline void select_menu()
{
std::cout<<"请输入数字键进行选择!"<<std::endl;
}
inline void come_back()
{
system("cls");
main_menu();
}
class GT_cls //函数对象,做find_if的谓词函数,找出第1个不相等的
{
public:
GT_cls(std::string new_val="*"):val(new_val){}
bool operator()(const std::string &s)
{
return s!=val;
}
private:
std::string val;
};
inline void back_main()
{
std::cout<<std::endl<<std::endl;
char y;
std::cout<<"操作完毕,是否返回主菜单(Y/N)"<<std::endl;
std::cin>>y;
if(y=='Y'||y=='y')
{
system("cls");
main_menu();
}
else exit(0);
}
#endif
//stat.h
void stat_menu(); //统计菜单
void tongji(); //统计显示每个班每一科目的成绩
//weihu.h
void weihu_menu(); //信息维护主菜单
void build_data(); //建立学生成绩文件
void add_data(); //添加学生记录
void del_data(); //删除3门课程不及格的学生记录
void modif_data(); //修改学生记录
void con_add(); //重复添加学生记录
void del_all(); //删除所有学生记录
//sdt.txt
黄山 03 初2002级1班 数学 99 英语 99 语文 99
游枭 03 初2003级1班 数学 11