#include<algorithm>
#include<string>
#include<streambuf>
#include<iostream>
#include<sstream>
#include<cstdio>
#include<fstream>
using namespace std;
struct student{
string sno;
string name;
double s[4];
}A[500];
int cnt=0;
int cur=0;
int handle();
void method_help(int x);
void method_list(int x,string str);
void method_print_i(int i);
void method_add(student a);
void method_rem(int x,string str);
void method_edit(int x);
void method_set(int i);
void method_sort(int x);
int cmp(int x,int i,int j);
int main(void)
{
streambuf *stdcin;
stdcin=cin.rdbuf();
string sno,name;
double s[4];
ifstream in;
streambuf *sin;
sin=cin.rdbuf();
in.open("C:\\database.txt");
cin.rdbuf(in.rdbuf());
cin >> cnt;
for(int i=0;i<cnt;i++)
{
cin>>sno>>name>>s[0]>>s[1]>>s[2];
A[i].sno=sno;
A[i].name=name;
A[i].s[0]=s[0];
A[i].s[1]=s[1];
A[i].s[2]=s[2];
A[i].s[3]=(s[0]+s[1]+s[2])/3;
}
cin.rdbuf(sin);
method_help(1);
while(true){
int res = handle(); //获取命令
if(res == 0) break;
if(res == -1) {
cout<<"错误指令"<<endl;
}
}
freopen("c:\\database.txt","w",stdout);
cout<<cnt<<endl;
for(int i=0;i<cnt;i++){
cout<<A[i].sno<<" "<<A[i].name<<" "<<A[i].s[0]<<" "<<A[i].s[1]<<" "<<A[i].s[2]<<endl;
}
return 0;
}
int handle()
{
string line,parameter;
cin>>line;
getline(cin,parameter);
stringstream ss(parameter);
if(line=="quit") return 0;
else if(line=="list"){
string str;
ss>>str;
if(str=="") method_list(1,"");
else if(str=="a") method_list(2,"");
else if(str=="x"){
ss>>str;
method_list(3,str);
}
else if(str=="n") {
ss>>str;
method_list(4,str);
}
else return -1;
}
else if(line=="add"){
string str;
ss>>str;
if(str=="a"){
cout<<"“add a”命令参数格式为:add a 学号 姓名 成绩1 成绩2 成绩3"<<endl;
cout<<">>:"<<endl;
}
else if(str==""){
cout<<"请输入记录:"<<endl;
}
else return -1;
student a;
cin>>a.sno>>a.name>>a.s[0]>>a.s[1]>>a.s[2];
a.s[3]=0;
for(int i=0;i<3;i++) a.s[4]+=a.s[i];
a.s[3]/=3;
method_add(a);
}
else if(line=="rem"){
string str;
ss>>str;
if(str=="a") cnt=0,cur=0;
else if(str=="x"){
ss>>str;
method_rem(1,str);
}
else if(str==""){
method_rem(2,"");
}
else return -1;
}
else if(line=="edit"){
cout<<"修改前记录为:"<<endl;
method_list(1,"");
string str;
ss>>str;
if(str=="") method_edit(1);
else if(str=="a") method_edit(2);
else if(str=="x") method_edit(3);
else if(str=="n") method_edit(4);
else if(str=="s1") method_edit(5);
else if(str=="s2") method_edit(6);
else if(str=="s3") method_edit(7);
}
else if(line=="set"){
int i;
ss >>i;
method_set(i);
}
else if(line=="sort") {
string str;
ss>>str;
if(str=="") method_sort(1);
else if(str=="x") method_sort(2);
else if(str=="n") method_sort(3);
else if(str=="s1") method_sort(4);
else if(str=="s2") method_sort(5);
else if(str=="s3") method_sort(6);
else return -1;
}
else if(line=="help"){
string str;
ss>>str;
if(str=="") method_help(1);
else if(str=="list") method_help(2);
else if(str=="add") method_help(3);
else if(str=="rem") method_help(4);
else if(str=="edit") method_help(5);
else if(str=="set") method_help(6);
else if(str=="sort") method_help(7);
else if(str=="help") method_help(8);
else if(str=="quit") method_help(9);
else return -1;
}
else {
cout<<"非法指令!"<<endl;
}
return 1;
}
void method_help(int x)
{
switch(x)
{
case 1:
cout<<"主菜单:"<<endl;
cout<<"------------------"<<endl;
cout<<"1. 显示学生记录(list)"<<endl;
cout<<"2. 增加学生记录(add)"<<endl;
cout<<"3. 删除学生记录(rem)"<<endl;
cout<<"4. 修改学生记录(edit)"<<endl;
cout<<"5. 设置当前记录(set)"<<endl;
cout<<"6. 排序学生记录(sort)"<<endl;
cout<<"7. 帮助(help)"<<endl;
cout<<"8. 退出(quit)"<<endl;
cout<<"-------------------"<<endl;
break;
case 2:
cout<<" list---------------显示当前记录"<<endl;
cout<<" list a-------------显示所有记录"<<endl;
cout<<" list x 学号值------显示相应“学号”记录"<<endl;
cout<<" list n 姓名值------显示所有相应“姓名”记录"<<endl;
break;
case 3:
cout<<" add----------------------------------在最后插入一条新记录"<<endl;
cout<<" add a 学号 姓名 分数1 分数2 分数3----在最后插入一条新记录(快速)"<<endl;
break;
case 4:
cout<<" rem----------------删除当前记录"<<endl;
cout<<" rem a--------------删除所有记录"<<endl;
cout<<" rem x 学号值-------删除指定“学号”记录"<<endl;
break;
case 5:
cout<<" edit---------------更新当前记录所有项"<<endl;
cout<<" edit x 学号值-----更新当前记录学号值"<<endl;
cout<<" edit n 姓名值-----更新当前记录姓名值"<<endl;
cout<<" edit s1 分数1值----更新当前记录分数1值"<<endl;
cout<<" edit s2 分数2值----更新当前记录分数2值"<<endl;
cout<<" edit s3 分数3值----更新当前记录分数3值"<<endl;
cout<<" edit a 学号 姓名 分数1 分数2 分数3----更新当前记录所有项(快速)"<<endl;
break;
case 6:
cout<<" set 序号值-- --使用“序号”进行定位,并设置为当前记录"<<endl;
break;
case 7:
cout<<" sort---------------使用“平均成绩”进行排序"<<endl;
cout<<" sort x-------------使用“学号”进行排序"<<endl;
cout<<" sort n-------------使用“姓名”进行排序"<<endl;
cout<<" sort s1------------使用“分数1”进行排序"<<endl;
cout<<" sort s2------------使用“分数2”进行排序"<<endl;
cout<<" sort s3------------使用“分数3”进行排序"<<endl;
break;
case 8:
cout<<" 没有“help”的帮助。"<<endl;
break;
case 9:
cout<<" 没有“exit”的帮助。"<<endl;
break;
}
}
void method_list(int x,string s)
{
cout<<"======================================================================="<<endl;
cout<<"|| 序号 | 学号| 姓名| 成绩1| 成绩2| 成绩3| 平均成绩||"<<endl;
cout<<"-----------------------------------------------------------------------"<<endl;
switch(x)
{
case 1:
method_print_i(cur);
break;
case 2:
for(int i=0;i<cnt;i++) method_print_i(i);
break;
case 3:
for(int i=0;i<cnt;i++) if(A[i].sno==s) method_print_i(i);
break;
case 4:
for(int i=0;i<cnt;i++) if(A[i].sno==s) method_print_i(i);
break;
}
cout<<"======================================================================="<<endl;
}
void method_print_i(int i)
{
printf("|| %c %02d | %s| %s| %.2lf| %.2lf| %.2lf| %.2lf||\n",
i==cur?'*':' ',i+1,A[i].sno.c_str(),A[i].name.c_str(),A[i].s[0],A[i].s[1],A[i].s[2],A[i].s[3]);
}
void method_add(student a)
{
for(int i=0;i<cnt;i++){
if(A[i].sno==a.sno){
cout<<"该学号已有"<<endl;
return;
}
}
for(int i=0;i<a.sno.length();i++){
if(a.sno[i]<'0' || a.sno[i]>'9'){
cout<<"该学号包含非数字!"<<endl;
return ;
}
}
A[cnt]=a;
cnt++;
}
void method_rem(int x,string s)
{
if(x==1){
for(int i=0;i<cnt;i++){
if(A[i].sno==s){
cout<<"你要删除的学生信息为:"<<endl;
method_list(3,s);
cout<<"是否真的要删除?(y/n)";
char c;
cin >> c;
if(c=='y' || c=='Y') {
for(int j=i+1;j<cnt;j++)
{
A[j-1]=A[j];
}
if(cur=cnt-1) cur--;
cnt--;
break;
}
}
}
}
else if(x==2)
{
cout<<"你要删除的学生信息为:"<<endl;
method_list(1,"");
cout<<"是否真的要删除?(y/n)";
char c;
cin >> c;
if(c=='y' || c=='Y')
{
for(int i=cur+1;i<cnt;i++)
{
A[i-1]=A[i];
}
cur=0;
cnt--;
}
}
}
void method_edit(int x){
student t;
string sno;
double a;
string name;
switch(x){
case 1:
cout<<"请输入记录:";
cin>>t.sno>>t.name>>t.s[0]>>t.s[1]>>t.s[2];
t.s[3]=0;
for(int i=0;i<3;i++) t.s[3]+=t.s[i];
t.s[3]/=3;
A[cur]=t;
break;
case 2:
cout<<"“edit a”命令参数格式为:edit a 学号 姓名 成绩1 成绩2 成绩3";
cin>>t.sno>>t.name>>t.s[0]>>t.s[1]>>t.s[2];
t.s[3]=0;
for(int i=0;i<3;i++) t.s[3]+=t.s[i];
t.s[3]/=3;
A[cur]=t;
break;
case 3:
cout<<"请输入学号新值:"<<endl;
cin >> sno;
for(int i=0;i<sno.length();i++){
if(sno[i]<'0' || sno[i]>'9'){
cout<<"该学号不规范!"<<endl;
return ;
}
}
A[cur].sno=sno;
break;
case 4:
cout<<"请输入姓名新值:"<<endl;
cin >> name;
A[cur].name=name;
break;
case 5:
cout<<"请输入分数1新值:"<<endl;
cin >> a;
A[cur].s[0]=a;
A[cur].s[3]=0;
for(int i=0;i<3;i++) A[cur].s[3]+=A[cur].s[i];
A[cur].s[3]/=3;
break;
case 6:
cout<<"请输入分数2新值:"<<endl;
cin >> a;
A[cur].s[1]=a;
A[cur].s[3]=0;
for(int i=0;i<3;i++) A[cur].s[3]+=A[cur].s[i];
A[cur].s[3]/=3;
break;
case 7:
cout<<"请输入分数3新值:"<<endl;
cin >> a;
A[cur].s[2]=a;
A[cur].s[3]=0;
for(int i=0;i<3;i++) A[cur].s[3]+=A[cur].s[i];
A[cur].s[3]/=3;
break;
}
}
void method_set(int i){
if(i<=0 || i>cnt){
cout<<"输入的序号不在范围内。"<<endl;
return ;
}
cur=i-1;
method_list(1,"");
}
void method_sort(int x){
for(int i=0;i<cnt;i++){
for(int j=i+1;j<cnt;j++){
if(cmp(x,i,j)<0) swap(A[i],A[j]);
}
}
}
int cmp(int x,int i,int j)
{
student a=A[i],b=A[j];
switch(x)
{
case 1:
if(a.s[3]<=b.s[3]) return 1;
else return -1;
break;
case 2:
if(a.sno<=b.sno) return 1;
else return -1;
break;
case 3:
if(a.name<=b.name) return 1;
else return -1;
break;
case 4:
if(a.s[0]<=b.s[0]) return 1;
else return -1;
break;
case 5:
if(a.s[1]<=b.s[1]) return 1;
else return -1;
break;
case 6:
if(a.s[2]<=b.s[2]) return 1;
else return -1;
break;
}
}
原始code:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<sstream>
#include<fstream>
#include<streambuf>
using namespace std;
struct message{
string stu_id;
string stu_name;
double s1;
double s2;
double s3;
double avg;
}Stu[1000];
int stu_num=0; //学生人数
int cur_order_num=0; //当前序号
int getCommand(); //获取指令
void help(int mode);
void list(int mode,string str);
void print_i(int i);
void add(message a);
void rem(int mode,string str);
void edit(int mode);
void set(int i);
void sort(int mode);
int cmp(int mode,int i,int j);
int main(void)
{
string id,name;
double s1,s2,s3,avg;
ifstream infile;
streambuf *stdcin;
stdcin=cin.rdbuf();
infile.open("C:\\database.txt");
cin.rdbuf(infile.rdbuf());
cin >> stu_num;
for(int i=0;i<stu_num;i++)
{
cin>>id>>name>>s1>>s2>>s3;
Stu[i].stu_id=id;
Stu[i].stu_name=name;
Stu[i].s1=s1;
Stu[i].s2=s2;
Stu[i].s3=s3;
Stu[i].avg=(s1+s2+s3)/3;
}
infile.close();
cin.rdbuf(stdcin);
help(1);
while(true)
{
int retcode = getCommand(); //获取命令
if(retcode == 0) break;
if(retcode == -1)
{
cout<<"错误指令"<<endl;
}
}
//写回文件
freopen("c:\\database.txt","w",stdout);
cout<<stu_num<<endl;
for(int i=0;i<stu_num;i++)
{
cout<<Stu[i].stu_id<<" "<<Stu[i].stu_name<<" "<<Stu[i].s1<<" "<<Stu[i].s2<<" "<<Stu[i].s3<<endl;
}
return 0;
}
int getCommand()
{
string line,parameter;
cin>>line;
getline(cin,parameter);
stringstream ss(parameter);
if(line=="quit") return 0;
else if(line=="list")
{
string str;
ss>>str;
if(str=="") list(1,"");
else if(str=="a") list(2,"");
else if(str=="x")
{
ss>>str;
list(3,str);
}
else if(str=="n")
{
ss>>str;
list(4,str);
}
else return -1;
}
else if(line=="add")
{
string str;
ss>>str;
if(str=="a")
{
cout<<"“add a”命令参数格式为:add a 学号 姓名 成绩1 成绩2 成绩3"<<endl;
cout<<">>:"<<endl;
}
else if(str=="")
{
cout<<"请输入记录:"<<endl;
}
else return -1;
message temp;
cin>>temp.stu_id>>temp.stu_name>>temp.s1>>temp.s2>>temp.s3;
temp.avg=(temp.s1+temp.s2+temp.s3)/3;
add(temp);
}
else if(line=="rem")
{
string str;
ss>>str;
if(str=="a") stu_num=0,cur_order_num=0;
else if(str=="x")
{
ss>>str;
rem(1,str);
}
else if(str=="")
{
rem(2,"");
}
else return -1;
}
else if(line=="edit")
{
cout<<"修改前记录为:"<<endl;
list(1,"");
string str;
ss>>str;
if(str=="") edit(1);
else if(str=="a") edit(2);
else if(str=="x") edit(3);
else if(str=="n") edit(4);
else if(str=="s1") edit(5);
else if(str=="s2") edit(6);
else if(str=="s3") edit(7);
}
else if(line=="set")
{
int i;
ss >>i;
set(i);
}
else if(line=="sort")
{
string str;
ss>>str;
if(str=="") sort(1);
else if(str=="x") sort(2);
else if(str=="n") sort(3);
else if(str=="s1") sort(4);
else if(str=="s2") sort(5);
else if(str=="s3") sort(6);
else return -1;
}
else if(line=="help")
{
string str;
ss>>str;
if(str=="") help(1);
else if(str=="list") help(2);
else if(str=="add") help(3);
else if(str=="rem") help(4);
else if(str=="edit") help(5);
else if(str=="set") help(6);
else if(str=="sort") help(7);
else if(str=="help") help(8);
else if(str=="quit") help(9);
else return -1;
}
else {
cout<<"非法指令!"<<endl;
}
return 1;
}
void help(int mode)
{
if(mode==1)
{
cout<<"主菜单:"<<endl;
cout<<"------------------"<<endl;
cout<<"1. 显示学生记录(list)"<<endl;
cout<<"2. 增加学生记录(add)"<<endl;
cout<<"3. 删除学生记录(rem)"<<endl;
cout<<"4. 修改学生记录(edit)"<<endl;
cout<<"5. 设置当前记录(set)"<<endl;
cout<<"6. 排序学生记录(sort)"<<endl;
cout<<"7. 帮助(help)"<<endl;
cout<<"8. 退出(quit)"<<endl;
cout<<"-------------------"<<endl;
}
else if(mode==2)
{
cout<<" list---------------显示当前记录"<<endl;
cout<<" list a-------------显示所有记录"<<endl;
cout<<" list x 学号值------显示相应“学号”记录"<<endl;
cout<<" list n 姓名值------显示所有相应“姓名”记录"<<endl;
}
else if(mode==3)
{
cout<<" add----------------------------------在最后插入一条新记录"<<endl;
cout<<" add a 学号 姓名 分数1 分数2 分数3----在最后插入一条新记录(快速)"<<endl;
}
else if(mode==4)
{
cout<<" rem----------------删除当前记录"<<endl;
cout<<" rem a--------------删除所有记录"<<endl;
cout<<" rem x 学号值-------删除指定“学号”记录"<<endl;
}
else if(mode==5)
{
cout<<" edit---------------更新当前记录所有项"<<endl;
cout<<" edit x 学号值-----更新当前记录学号值"<<endl;
cout<<" edit n 姓名值-----更新当前记录姓名值"<<endl;
cout<<" edit s1 分数1值----更新当前记录分数1值"<<endl;
cout<<" edit s2 分数2值----更新当前记录分数2值"<<endl;
cout<<" edit s3 分数3值----更新当前记录分数3值"<<endl;
cout<<" edit a 学号 姓名 分数1 分数2 分数3----更新当前记录所有项(快速)"<<endl;
}
else if(mode==6)
{
cout<<" set 序号值-- --使用“序号”进行定位,并设置为当前记录"<<endl;
}
else if(mode==7)
{
cout<<" sort---------------使用“平均成绩”进行排序"<<endl;
cout<<" sort x-------------使用“学号”进行排序"<<endl;
cout<<" sort n-------------使用“姓名”进行排序"<<endl;
cout<<" sort s1------------使用“分数1”进行排序"<<endl;
cout<<" sort s2------------使用“分数2”进行排序"<<endl;
cout<<" sort s3------------使用“分数3”进行排序"<<endl;
}
else if(mode==8)
{
cout<<" 没有“help”的帮助。"<<endl;
}
else if(mode==9)
{
cout<<" 没有“exit”的帮助。"<<endl;
}
}
void list(int mode,string str)
{
cout<<"======================================================================="<<endl;
cout<<"|| 序号 | 学号| 姓名| 成绩1| 成绩2| 成绩3| 平均成绩||"<<endl;
cout<<"-----------------------------------------------------------------------"<<endl;
if(mode==1) print_i(cur_order_num);
if(mode==2) for(int i=0;i<stu_num;i++) print_i(i);
if(mode==3) for(int i=0;i<stu_num;i++) if(Stu[i].stu_id==str) print_i(i);
if(mode==4) for(int i=0;i<stu_num;i++) if(Stu[i].stu_name==str) print_i(i);
cout<<"======================================================================="<<endl;
}
void print_i(int i)
{
printf("|| %c %02d | %s| %s| %.2lf| %.2lf| %.2lf| %.2lf||\n",
i==cur_order_num?'*':' ',
i+1,
Stu[i].stu_id.c_str(),
Stu[i].stu_name.c_str(),
Stu[i].s1,
Stu[i].s2,
Stu[i].s3,
Stu[i].avg
);
}
void add(message a)
{
for(int i=0;i<stu_num;i++)
{
if(Stu[i].stu_id==a.stu_id)
{
cout<<"该学号已经存在!"<<endl;
return;
}
}
for(int i=0;i<a.stu_id.length();i++)
{
if(a.stu_id[i]<'0' || a.stu_id[i]>'9')
{
cout<<"该学号不规范!"<<endl;
return ;
}
}
Stu[stu_num]=a;
stu_num++;
}
void rem(int mode,string str)
{
if(mode==1)
{
for(int i=0;i<stu_num;i++)
{
if(Stu[i].stu_id==str)
{
cout<<"你要删除的学生信息为:"<<endl;
list(3,str);
cout<<"是否真的要删除?(y/n)";
char ch;
cin >> ch;
if(ch=='y' || ch=='Y')
{
for(int j=i+1;j<stu_num;j++)
{
Stu[j-1]=Stu[j];
}
if(cur_order_num==stu_num-1) cur_order_num--;
stu_num--;
break;
}
}
}
}
else if(mode==2)
{
cout<<"你要删除的学生信息为:"<<endl;
list(1,"");
cout<<"是否真的要删除?(y/n)";
char ch;
cin >> ch;
if(ch=='y' || ch=='Y')
{
for(int i=cur_order_num+1;i<stu_num;i++)
{
Stu[i-1]=Stu[i];
}
cur_order_num=0;
stu_num--;
}
}
}
void edit(int mode)
{
if(mode==1)
{
message tmp;
cout<<"请输入记录:";
cin>>tmp.stu_id>>tmp.stu_name>>tmp.s1>>tmp.s2>>tmp.s3;
tmp.avg=(tmp.s1+tmp.s2+tmp.s3)/3;
Stu[cur_order_num]=tmp;
}
else if(mode==2)
{
message tmp;
cout<<"“edit a”命令参数格式为:edit a 学号 姓名 成绩1 成绩2 成绩3";
cin>>tmp.stu_id>>tmp.stu_name>>tmp.s1>>tmp.s2>>tmp.s3;
tmp.avg=(tmp.s1+tmp.s2+tmp.s3)/3;
Stu[cur_order_num]=tmp;
}
else if(mode==3)
{
cout<<"请输入学号新值:"<<endl;
string id;
cin >> id;
for(int i=0;i<id.length();i++)
{
if(id[i]<'0' || id[i]>'9')
{
cout<<"该学号不规范!"<<endl;
return ;
}
}
Stu[cur_order_num].stu_id=id;
}
else if(mode==4)
{
cout<<"请输入姓名新值:"<<endl;
string name;
cin >> name;
Stu[cur_order_num].stu_name=name;
}
else if(mode==5)
{
cout<<"请输入分数1新值:"<<endl;
double s;
cin >> s;
Stu[cur_order_num].s1=s;
Stu[cur_order_num].avg=
(Stu[cur_order_num].s1+Stu[cur_order_num].s2+Stu[cur_order_num].s3)/3;
}
else if(mode==6)
{
cout<<"请输入分数2新值:"<<endl;
double s;
cin >> s;
Stu[cur_order_num].s2=s;
Stu[cur_order_num].avg=
(Stu[cur_order_num].s1+Stu[cur_order_num].s2+Stu[cur_order_num].s3)/3;
}
else if(mode==7)
{
cout<<"请输入分数3新值:"<<endl;
double s;
cin >> s;
Stu[cur_order_num].s3=s;
Stu[cur_order_num].avg=
(Stu[cur_order_num].s1+Stu[cur_order_num].s2+Stu[cur_order_num].s3)/3;
}
}
void set(int i)
{
if(i<=0 || i>stu_num)
{
cout<<"输入的序号不在范围内。"<<endl;
return ;
}
cur_order_num=i-1;
list(1,"");
}
void sort(int mode)
{
for(int i=0;i<stu_num;i++)
{
for(int j=i+1;j<stu_num;j++)
{
if(cmp(mode,i,j)<0) swap(Stu[i],Stu[j]);
}
}
}
int cmp(int mode,int i,int j)
{
message a=Stu[i],b=Stu[j];
if(mode==1)
{
if(a.avg<=b.avg) return 1;
else return -1;
}
else if(mode==2)
{
if(a.stu_id<=b.stu_id) return 1;
else return -1;
}
else if(mode==3)
{
if(a.stu_name<=b.stu_name) return 1;
else return -1;
}
else if(mode==4)
{
if(a.s1<=b.s1) return 1;
else return -1;
}
else if(mode==5)
{
if(a.s2<=b.s2) return 1;
else return -1;
}
else if(mode==6)
{
if(a.s3<=b.s3) return 1;
else return -1;
}
}
网友评论