#include<iostream>//基本输入输出流
#include<fstream>//文件操作流
#include<algorithm>//算法
#include<string>//string类
using namespacestd;
struct Student//结构体
{
char name[20];//姓名
double chi;//语文成绩
double math;//数学成绩
double english;//英语成绩
}out[1000];//in用于存储输入数据,out用于输出数据。
int top;//读取文件的栈头
int user;//判断是否跳出菜单标量
intsort_method(Student a,Student b)//定义排序方式
{
returna.chi+a.math+a.english>b.chi+b.math+b.english;
}
void fileget()//读取文件
{
top=-1;
ifstreamin("c://database.dat",ios::binary|ios::out);
while(!in.eof())//每次文件读取到文件尾
{
top++;
in.read((char*)&out[top],sizeof(out[top]));//文件读取操作
}
in.close();//关闭
}
voidstudent_print()//打印学生成绩表
{
fileget();
if(top<1)
cout<<"信息表无信息"<<endl;
cout<<"姓名 语文 数学 英语 平均分 总分"<<endl;
for(int i=0;i<top;i++)
{
cout<<out[i].name<<""<<out[i].chi<<""<<out[i].math<<""<<out[i].english<<"";
cout<<(out[i].chi+out[i].math+out[i].english)/3<<""<<out[i].chi+out[i].math+out[i].english<<endl;
}
}
voidstudent_insert()//插入操作,文件保存操作
{
cout<<"请输入学生姓名 三科成绩并用空格隔开"<<endl;
Student A;
cin>>A.name>>A.chi>>A.math>>A.english;
ofstreamout("c://database.dat",ios::binary|ios::app);//二进制打开,ios:app不覆盖插入
out.write((char*)&A,sizeof(A));
out.close();
cout<<"插入成功,新的信息表为"<<endl;
student_print();//执行插入语句再次输出学生信息表
}
voidstudent_print_sort()//打印学生排序后成绩表
{
fileget();
cout<<"姓名 语文 数学 英语 平均分 总分"<<endl;
sort(out,out+(top-1),sort_method);//C++STLsort()排序函数
for(int i=0;i<top;i++)
{
cout<<out[i].name<<""<<out[i].chi<<""<<out[i].math<<""<<out[i].english<<"";
cout<<(out[i].chi+out[i].math+out[i].english)/3<<""<<out[i].chi+out[i].math+out[i].english<<endl;
}
}
voidstudent_select()//学生信息查询
{
string name_find;
fileget();
cout<<"请输入欲查询的学生"<<endl;
cin>>name_find;
int pos=-1;//定位学生的下标
for(int i=0;i<top;i++)
{
if(name_find==out[i].name)
{
pos=i;
break;
}
}
if(pos==-1)
{
cout<<"查无此人"<<endl;
}
else
{
cout<<"姓名 语文 数学 英语 平均分 总分"<<endl;
cout<<out[pos].name<<""<<out[pos].chi<<""<<out[pos].math<<""<<out[pos].english<<"";
cout<<(out[pos].chi+out[pos].math+out[pos].english)/3<<""<<out[pos].chi+out[pos].math+out[pos].english<<endl;
}
}
voidstudent_delete()
{
top=-1;
Student out1[1000];//执行write时,该结构体必须于该函数内定义
ifstream in("c://database.dat",ios::binary|ios::out);
while(!in.eof())//每次文件读取到文件尾
{
top++;
in.read((char*)&out1[top],sizeof(out1[top]));//文件读取操作
}
in.close();//关闭
string name_find;
fileget();
cout<<"请输入欲删除的学生"<<endl;
cin>>name_find;
int pos=-1;//定位学生的下标
for(int i=0;i<top;i++)
{
if(name_find==out1[i].name)
{
pos=i;
break;
}
}
if(pos==-1)//当语句不执行,即pos变量未被赋值,此时可确认查无信息
{
cout<<"查无此人"<<endl;
}
else
{
ofstreamout("c://database.dat",ios::binary|ios::ate);//二进制打开,ios:app不覆盖插入,反之是覆盖插入
for(int i=0;i<top;i++)
{
if(i!=pos)//忽略删除一行
{
out.write((char*)&out1[i],sizeof(out1[i]));//覆盖更新插入
}
}
out.close();
cout<<"删除成功,新的学生信息表为:"<<endl;
student_print();//再次输出学生表信息
}
}
void menu()//主菜单
{
string menu_order;//字符串指令,防止用户输入指令出现多个字符
cout<<"************学生成绩管理************"<<endl;
cout<<"1.学生信息添加"<<endl;
cout<<"2.学生信息输出"<<endl;
cout<<"3.学生信息删除"<<endl;
cout<<"4.学生信息查询"<<endl;
cout<<"5.学生成绩排序"<<endl;
cout<<"请按一个数字1-5,进行一项操作,0表示退出"<<endl;
mark: //输入指令非法可goto到此处
cin>>menu_order;
if(menu_order=="0")
{
user=0;//表示退出菜单
cout<<"欢迎下次使用"<<endl;
}
if(menu_order<"0"||menu_order>"5")
{
cout<<"输入有误,请重新输入"<<endl;
goto mark;
}
if(menu_order=="1")
{
student_insert();
}
if(menu_order=="2")
{
student_print();
}
if(menu_order=="3")
{
student_delete();
}
if(menu_order=="4")
{
student_select();
}
if(menu_order=="5")
{
student_print_sort();
}
}
int main()
{
user=1;
while(user)
{
menu();
}
return 0;
}