需求分析说明
设计一个菜单驱动的学生成绩管理程序。输 入学生的基本信息,包括学生的学号、姓名、数学、语文、英语等 信息,实现如下管理功能:
- 能输入并显示n 个学生的基本信息。
- 计算学生的平均分和总分。
- 按总分降序进行排序。
- 任意输入一个学号,能显示该学生的基本信息。
- 可根据需要添加学生信息到指定位置,亦可在最后追加一批 学生信息。
- 文件的导入和导出(从文件中读取若干条学生信息,或者将 学生信息输出到文件中)。
- 注意:学号不能重复;有效成绩的范围为[0,100]
代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
class CStudent
{
public:
string m_strNumber; //学号
string m_strName; //姓名
string m_strClass; //班级
double m_dChinese; //语文成绩
double m_dMath; //数学成绩
double m_dEnglish; //英语成绩
CStudent() {}
friend istream &operator >> ( istream &in, CStudent &s ) //重载>>
{
in>>s.m_strNumber>>s.m_strName>>s.m_strClass>>s.m_dChinese>>s.m_dMath>>s.m_dEnglish;
return in;
}
friend ostream &operator << ( ostream &out, CStudent &s ) //重载<<
{
out<<s.m_strNumber<<" "<<s.m_strName<<" "<<s.m_strClass<<" "<<s.m_dChinese<<" "<<s.m_dMath<<" "<<s.m_dEnglish;
return out;
}
~CStudent() {}
};
class CSystem
{
public:
vector<CStudent>vecStu;// vector数组
void Create(); //创建
void Add(); //添加
void Show(); //显示学生基本信息
void Change(); //修改学生信息
void Delnews(); //删除学生信息
void Searchnews(); //查找学生信息
void Sort(); //按总分降序排序
void Getnews(); //文件的导出,获取文件学生信息
void Savenews(); //文件导入,保存为文件数据
};
/* 创建 */
void CSystem::Create()
{
double d1,d2,d3;
cout<<"学生人数:";
int n;
cin>>n;
int i;
string str;
cout<<"请输入学生的基本信息:"<<endl;
for( i=0; i<n; i++ )
{
CStudent cs; //定义CStudent类对象
while(1)
{
cout<<"学号: ";
cin>>str;
int flag = 1;
for( vector<CStudent>::iterator it=vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strNumber == str )
{
flag = 0;
}
}
if( flag == 1 )
{
cs.m_strNumber = str;
break;
}
else
{
cout<<"学号重复,请重新输入!"<<endl;
}
}
cout<<"姓名: ";
cin>>cs.m_strName;
cout<<"班级: ";
cin>>cs.m_strClass;
while(1)
{
cout<<"语文成绩: ";
cin>>d1;
if( d1>=0 && d1<=100)
{
cs.m_dChinese = d1;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
while(1)
{
cout<<"数学成绩: ";
cin>>d2;
if( d2>=0 && d2<=100)
{
cs.m_dMath = d2;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
while(1)
{
cout<<"英语成绩: ";
cin>>d3;
if( d3>=0 && d3<=100)
{
cs.m_dEnglish = d3;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
vecStu.push_back(cs);
cout<<endl;
}
cout<<"学生信息管理程序创建成功"<<endl;
}
/* 添加学生信息 */
void CSystem::Add()
{
cout<<"请输入待添加学生的基本信息:"<<endl;
CStudent cs; //定义CStudent类对象
double d1,d2,d3;
string str;
while(1)
{
cout<<"学号: ";
cin>>str;
int flag = 1;
for( vector<CStudent>::iterator it=vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strNumber == str )
{
flag = 0;
}
}
if( flag == 1 )
{
cs.m_strNumber = str;
break;
}
else
{
cout<<"学号重复,请重新输入!"<<endl;
}
}
cout<<"姓名: ";
cin>>cs.m_strName;
cout<<"班级: ";
cin>>cs.m_strClass;
while(1)
{
cout<<"语文成绩: ";
cin>>d1;
if( d1>=0 && d1<=100)
{
cs.m_dChinese = d1;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
while(1)
{
cout<<"数学成绩: ";
cin>>d2;
if( d2>=0 && d2<=100)
{
cs.m_dMath = d2;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
while(1)
{
cout<<"英语成绩: ";
cin>>d3;
if( d3>=0 && d3<=100)
{
cs.m_dEnglish = d3;
break;
}
else
{
cout<<"成绩错误,请重新输入!"<<endl;
}
}
cout<<"请输入学生信息添加位置(第几个):";
int n;
cin>>n;
vecStu.insert( vecStu.begin()+(n-1),cs );
cout<<"学生信息添加成功"<<endl;
}
/* 显示学生基本信息 */
void CSystem::Show()
{
for( vector<CStudent>::iterator it = this->vecStu.begin(); it != vecStu.end(); it++ )
{
cout<<"学号: "<<it->m_strNumber;
cout<<" 姓名: "<<it->m_strName;
cout<<" 班级: "<<it->m_strClass;
cout<<" 语文成绩: "<<it->m_dChinese;
cout<<" 数学成绩: "<<it->m_dMath;
cout<<" 英语成绩: "<<it->m_dEnglish;
double dsum = it->m_dChinese + it->m_dMath + it->m_dEnglish;
cout<<" 总分: "<<dsum;
cout<<" 平均分: "<<dsum/3<<endl;
}
}
/* 修改学生信息 */
void CSystem::Change()
{
if(vecStu.empty()) //判断vector数组是否有学生信息
{
cout<<"暂无学生信息,无法修改"<<endl;
return ;
}
cout<<"要修改的学生姓名: ";
string strname;
cin>>strname;
cout<<"修改学号输入1,修改语文成绩输入2,修改数学成绩输入3,修改英语成绩输入4"<<endl;
cout<<"请选择: ";
int n;
cin>>n;
cout<<"输入改后内容:";
vector<CStudent>::iterator it;
for( it = vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strName == strname )
{
break;
}
}
if(n==1)
{
string s;
cin>>s;
it->m_strNumber = s;
}
else
{
int s;
cin>>s;
switch(n)
{
case 2:
it->m_dChinese = s;
case 3:
it->m_dMath = s;
case 4:
it->m_dEnglish = s;
}
}
this->Savenews();
}
/* 删除学生信息 */
void CSystem::Delnews()
{
if(vecStu.empty()) //判断vector数组是否有学生信息
{
cout<<"暂无学生信息,无法删除"<<endl;
return ;
}
cout<<"要删除的学生姓名: ";
string strname;
cin>>strname;
for( vector<CStudent>::iterator it = vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strName == strname )
{
vecStu.erase(it);
this->Savenews();
}
}
cout<<"已删除"<<endl;
}
/* 查找学生信息 */
void CSystem::Searchnews()
{
if(vecStu.empty()) //判断vector数组是否有学生信息
{
cout<<"暂无学生信息,无法查找"<<endl;
return ;
}
cout<<"按学号查找输入1,按姓名查找输入2"<<endl;
int n;
cout<<"请输入: ";
cin>>n;
switch(n)
{
case 1:
{
string strnumber;
cout<<"要查找的学生学号: ";
cin>>strnumber;
for( vector<CStudent>::iterator it = vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strNumber == strnumber )
{
cout<<"学号: "<<it->m_strNumber;
cout<<" 姓名: "<<it->m_strName;
cout<<" 班级: "<<it->m_strClass;
cout<<" 语文成绩: "<<it->m_dChinese;
cout<<" 数学成绩: "<<it->m_dMath;
cout<<" 英语成绩: "<<it->m_dEnglish;
double dsum = it->m_dChinese + it->m_dMath + it->m_dEnglish;
cout<<" 总分: "<<dsum;
cout<<" 平均分: "<<dsum/3<<endl;
}
}
}
break;
case 2:
{
cout<<"要查找的学生姓名: ";
string strname;
cin>>strname;
for( vector<CStudent>::iterator it = vecStu.begin(); it != vecStu.end(); it++ )
{
if( it->m_strName == strname )
{
cout<<"学号: "<<it->m_strNumber;
cout<<" 姓名: "<<it->m_strName;
cout<<" 班级: "<<it->m_strClass;
cout<<" 语文成绩: "<<it->m_dChinese;
cout<<" 数学成绩: "<<it->m_dMath;
cout<<" 英语成绩: "<<it->m_dEnglish;
double dsum = it->m_dChinese + it->m_dMath + it->m_dEnglish;
cout<<" 总分: "<<dsum;
cout<<" 平均分: "<<dsum/3<<endl;
}
}
}
break;
}
}
/* 定义排序的顺序 */
bool operator < ( CStudent &A, CStudent &B )
{
return ( A.m_dChinese+A.m_dMath+A.m_dEnglish > B.m_dChinese+B.m_dMath+B.m_dEnglish );
}
/* 按总分降序排序 */
void CSystem::Sort()
{
sort( vecStu.begin(), vecStu.end() ); //调用库函数sort
cout<<"按总分降序排序如下:"<<endl;
for( vector<CStudent>::iterator it = vecStu.begin(); it != vecStu.end(); it++ )
{
cout<<"学号: "<<it->m_strNumber;
cout<<" 姓名: "<<it->m_strName;
cout<<" 班级: "<<it->m_strClass;
cout<<" 语文成绩: "<<it->m_dChinese;
cout<<" 数学成绩: "<<it->m_dMath;
cout<<" 英语成绩: "<<it->m_dEnglish;
double dsum = it->m_dChinese + it->m_dMath + it->m_dEnglish;
cout<<" 总分: "<<dsum;
cout<<" 平均分: "<<dsum/3<<endl;
}
}
/* 文件的导出,获取文件学生信息 */
void CSystem::Getnews()
{
ifstream file2( "成绩.txt", ios_base::in | ios_base::binary );
CStudent cst;
if(!(file2.is_open()))
{
cout<<"文件打开失败"<<endl;
return ;
}
while(!(file2.eof()))
{
file2>>cst;
vecStu.push_back(cst);
}
file2.close();
}
/* 文件导入,保存为文件数据 */
void CSystem::Savenews()
{
ofstream file1( "成绩.txt", ios_base::out | ios_base::binary );
if(!(file1.is_open()))
{
cout<<"文件打开失败"<<endl;
return ;
}
for( vector<CStudent>::iterator it = vecStu.begin(); it != vecStu.end(); it++ )
{
file1<<*it;
if( it != vecStu.end()-1 )
{
file1<<endl;
}
}
cout<<"学生信息已存入文件"<<endl;
file1.close();
}
/* 主菜单 */
void menu()
{
cout<<" 学生成绩管理系统 "<<endl;
cout<<" 1创建 "<<endl;
cout<<" 2添加 "<<endl;
cout<<" 3汇总 "<<endl;
cout<<" 4排序 "<<endl;
cout<<" 5修改 "<<endl;
cout<<" 6查询(学号或姓名) "<<endl;
cout<<" 7显示 "<<endl;
cout<<" 8文件导入 "<<endl;
cout<<" 9文件导出 "<<endl;
cout<<" 10删除 "<<endl;
cout<<" 11退出 "<<endl;
}
int main()
{
menu();
int im;
int iz = 1;
cout<<"\n请选择: ";
cin>>im;
if(im==1)
{
CSystem p;
p.Create();
while(iz==1)
{
cout<<"\n请选择: ";
cin>>im;
switch(im)
{
case 2:
p.Add();
break;
case 3:
p.Show();
break;
case 4:
p.Sort();
break;
case 5:
p.Change();
break;
case 6:
p.Searchnews();
break;
case 7:
p.Show();
break;
case 8:
p.Savenews();
break;
case 9:
p.Getnews();
break;
case 10:
p.Delnews();
break;
case 11:
iz=0;
break;
}
}
}
return 0;
}