#include<iostream>
#include<iomanip>
#include<fstream>
#include<stdlib.h>
#include<string>
using namespace std;
#define maxsize 100
#define error 0
#define ok 1
typedef struct{
string name;
int score1;
int score2;
}info;
typedef struct {
int num;
string name;
int score1;
int score2;
}elem;
typedef struct{
elem *r;
int length;
}stl;
void menu();
int init(stl &st);
int init1(stl &st);
void han2(stl &st);
void menu2();
void han3(stl &st);
void menu3();
void han4(stl &st);
void menu4();
void search_seq(stl st,string name);
void search_half(stl st,int num);
void show(stl st);
stl st;
int main(){
init1(st);
int x=-1,flag=0;
while(1){
menu();
cout<<"请输入你的选择:";
cin>>x;
switch(x){
case 0: exit(0);break;
case 1: init(st);flag=1;break;
case 2: if(flag==1) han2(st);else cout<<"请先完成信息初始化";break;
case 3: if(flag==1) han3(st);else cout<<"请先完成信息初始化";break;
case 4: if(flag==1) han4(st);else cout<<"请先完成信息初始化";break;
}
}
return 0;
}
void menu(){
cout<<"--------学生成绩管理系统------------"<<endl;
cout<<"1信息初始化 2查找 "<<endl;
cout<<"3排序 4编辑 "<<endl;
cout<<"0退出"<<endl;
cout<<"------------------------------------"<<endl;
}
void menu2(){
cout<<"--------编辑模块------------"<<endl;
cout<<"1顺序查找 2二分查找 "<<endl;
cout<<"3查找所有 0返回上一级 "<<endl;
cout<<"------------------------------------"<<endl;
}
void han2(stl &st){
int x,num;
string name;
menu2();
cout<<"请输入你的选项:";
cin>>x;
switch(x){
case 1:cout<<"请输入查找学生姓名:";cin>>name;search_seq(st,name);break;
case 2:cout<<"请输入查找学生学号:";cin>>num;search_half(st,num);break;
case 3:show(st);break;
case 0:return ;break;
default:cout<<"输入错误;";break;
}
}
void search_seq(stl st,string name){
int i;
for(i=st.length;i>=1;i--)
if(!name.compare(st.r[i].name)){
cout<<"查找成功!"<<endl<<"该学生的信息为:"<<endl;
cout<<setw(8)<<st.r[i].num<<" "<<st.r[i].name<<" "
<<st.r[i].score1<<setw(8)
<<st.r[i].score2<<endl;break;
}
if(i==0) cout<<"查无此人"<<endl;
}
void search_half(stl st,int num){
int low=1,high=st.length,mid;
while(low<=high){
mid=(low+high)/2;
if(num==st.r[mid].num){
cout<<"查找成功"<<endl;
cout<<setw(8)<<st.r[mid].num<<" "<<st.r[mid].name<<" "
<<st.r[mid].score1<<setw(8)
<<st.r[mid].score2<<endl;
break;
}else if(num<st.r[mid].num) high=mid-1;
else low=mid+1;
}
if(low==high-1) cout<<"查找失败"<<endl;
}
void show(stl st){
cout<<" 学号 姓名 数据结构 程序设计"<<endl;
int i=1;
for(i;i<=st.length;i++){
cout<<setw(8)<<st.r[i].num<<" "<<st.r[i].name
<<" "<<st.r[i].score1<<setw(8)
<<st.r[i].score2<<endl;
}
}
void menu3(){
cout<<"--------编辑模块------------"<<endl;
cout<<"1直接插入排序(学号) 2冒泡排序(数据结构) "<<endl;
cout<<"3直接选择排序(总成绩) 0返回上一级 "<<endl;
cout<<"------------------------------------"<<endl;
}
void insertsort(stl &st);
void bubblesort(stl &st);
void selectsort(stl &st);
void han3(stl &st){
int x;
menu3();
cout<<"请输入你的选项:";
cin>>x;
switch(x){
case 1:insertsort(st);show(st);break;
case 2:bubblesort(st);show(st);break;
case 3:selectsort(st);show(st);break;
case 4:break;
default:cout<<"输入错误;";break;
}
}
void insertsort(stl &st){
int i,j;
for(i=2;i<=st.length;i++)
if(st.r[i].num<st.r[i-1].num){
st.r[0]=st.r[i];
st.r[i]=st.r[i-1];
for(j=i-1;st.r[0].num<st.r[j].num;--j) st.r[j+1]=st.r[j];
st.r[j+1]=st.r[0];
}
}
void bubblesort(stl &st){
int m=st.length-1,flag=1,j;
elem t;
while(m>0&&flag==1){
flag=0;
for(j=1;j<=m;j++)
if(st.r[j].score1>st.r[j+1].score1){
flag=1;
t=st.r[j];st.r[j]=st.r[j+1];st.r[j+1]=t;
}
}
}
void selectsort(stl &st){
int i,j,k;
elem t;
for(i=1;i<st.length;i++){
k=i;
for(j=i+1;j<=st.length;j++)
if((st.r[j].score1+st.r[j].score2)<(st.r[k].score1+st.r[k].score2)) k=j;
if(k!=j){
t=st.r[i];st.r[i]=st.r[k];st.r[k]=t;
}
}
}
void menu4(){
cout<<"--------编辑模块------------"<<endl;
cout<<"1修改 2插入 "<<endl;
cout<<"3删除 0返回上一级"<<endl;
cout<<"------------------------------------"<<endl;
}
void modify(stl &st);
void insert(stl &st);
void delete1(stl &st);
void han4(stl &st){
int x;
menu4();
cout<<"请输入你的选项:";
cin>>x;
switch(x){
case 1:modify(st);break;
case 2:insert(st);break;
case 3:delete1(st);break;
case 0: return ;break;
default:cout<<"输入错误;";break;
}
ofstream out("yes.txt",ios::out);
if(!out) //打开失败
{
cout<<"文件打开失败!"<<endl;
return; //函数返回
}
for(int i=1;i<=st.length;i++)
{
out<<st.r[i].num<<"\t" //将学生信息写入文件
<<st.r[i].name<<"\t"
<<st.r[i].score1<<"\t"
<<st.r[i].score2<<endl; //每条信息站一行
}
cout<<"文件写入成功!"<<endl;
out.close();
}
void modify1(stl &st,int num);
void modify2(stl &st,string name);
void modify(stl &st){
int x,num,i;
string name;
cout<<"请决定修改内容:(1学号 2数据结构成绩 0返回上一级)"<<endl;
cin>>x;
switch(x){
case 1: cout<<"请决定修改学号";cin>>num;modify1(st,num);break;
case 2: cout<<"请决定修改姓名";cin>>name;modify2(st,name);break;
case 0: return ;
default: cout<<"输入选项错误,请重新输入";break;
}
}
void modify1(stl &st,int num){
int i,num1;
cout<<"请决定将"<<num<<"学号修改为:";
cin>>num1;
for(i=1;i<=st.length;i++){
if(st.r[i].num==num){
st.r[i].num=num1;
}
}
}
void modify2(stl &st,string name){
int i;
string name1;
cout<<"请决定将"<<name<<"姓名修改为:";
cin>>name1;
for(i=1;i<=st.length;i++){
if(!st.r[i].name.compare(name)){
st.r[i].name=name1;
}
}
}
void insert(stl &st){
cout<<"请输入插入位置:";
int i,j;
cin>>i;
if(i<1||i>st.length){
cout<<"插入位置有误!";return ;
}
if(st.length>=maxsize){
cout<<"空间已满";return ;
}
cout<<"请输入插入学生的学号,姓名,数据结构成绩,程序设计成绩的信息:"<<endl;
for(j=st.length;j>=i-1;j--)
st.r[j+1]=st.r[j];
cin>>st.r[i-1].num>>st.r[i-1].name>>st.r[i-1].score1>>st.r[i-1].score2;
st.length++;
}
void delete1(stl &st){
int i,j;
cout<<"请输入删除(学号):";
cin>>i;
if(i<1||i>st.length){
cout<<"插入不合法";
return ;
}
for(j=i;j<st.length;j++)
st.r[j-1]=st.r[j];
st.length--;
}
int init1(stl &st){
st.r=new elem[maxsize];
if(!st.r) return error;
st.length=0;
return ok;
}
int init(stl &st){
ifstream in("yes.txt",ios::in);
int i=1;
if(!in){
cout<<"文件打开失败"<<endl;
return error;
}
while(in>>st.r[i].num>>st.r[i].name>>st.r[i].score1>>st.r[i].score2){
cout<<setw(8)<<st.r[i].num<<" "<<st.r[i].name<<" "<<st.r[i].score1<<setw(8)<<st.r[i].score2<<endl;
i++;
st.length++;
}
cout<<"读取成功,攻读如"<<i-1<<"个信息";
in.close();
}