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 

 

posted @ 2012-08-22 23:13  晴天有时下鱼  阅读(375)  评论(0编辑  收藏  举报