#include <iostream>
using namespace std;
const int N=50;
struct student //定义结构体
{
int no; //学号
char xm[10]; //姓名
double chinese; //语文
double math; //数学
double english; //外语
double sum; //总分
double average; //平均分
};
student stu[N];
void input(student *p,int n); //输入学生信息
void cal(student *p,int i); //计算总分和个人平均分
void aver(student *p,int n); //计算各科平均分和平均总分
void sort(student *p,int n); //按成绩排序
void sortno(student *p,int n); //按学号排序
void search(student *p,int n); //查找学生
int find(student *p,int c,int n); //查找学号
void max(student *p,int n); //查找最好和最差学生
void output(student *p,int n); //输出学生信息
int insert(student *p,int n); //添加学生信息
int del(student *p,int n); //删除学生信息
void showmenu(); //显示菜单
int main()
{
int n;
cout<<"输入学生人数 :"; //输入学生总数
cin>>n;
input(stu,n);
while(n>0) //当n大于0时循环
{
showmenu();
int a; //通过给a赋值调用函数
cout<<"请输入选项 :";
cin>>a;
if(a<1||a>8) //输入指令为1~8
{
cout<<"输入错误!!!\n"; //输入错误
for(int i=0;i<33;i++) //分隔符
cout<<"*";
cout<<endl;
}
else if(a==6) //insert需要返回n值
{
n=insert(stu,n);
cout<<endl;
for(int i=0;i<33;i++)
cout<<"*";
cout<<endl;
}
else if(a==7) //del函数需要返回n值
{
n=del(stu,n);
cout<<endl;
for(int i=0;i<33;i++)
cout<<"*";
cout<<endl;
}
else if(a==8) //结束语句
{
for(int i=0;i<33;i++)
cout<<"*";
cout<<"\n谢谢使用"<<endl;
break;
}
else
{
switch(a) //switch选择语句
{
case 1:aver(stu,n);break;
case 2:sort(stu,n);break;
case 3:search(stu,n);break;
case 4:max(stu,n);break;
case 5:output(stu,n);
}
cout<<endl;
for(int i=0;i<33;i++)
cout<<"*";
cout<<endl;
}
}
return 0;
}
void input( student *p,int n) //输入函数
{
cout<<"Enter students information:"<<endl; //输出表头
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
for(int i=0;i<n;i++)
{
cin>>stu[i].no>>stu[i].xm>>stu[i].chinese>>stu[i].math>>stu[i].english; //输入学生信息
cal(stu,i); //cal函数计算总分和平均分
}
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
for(i=0;i<n;i++)
cout<<stu[i].no<<"\t"<<stu[i].xm<<"\t"<<stu[i].chinese<<"\t"<<stu[i].math<<"\t"<<stu[i].english<<"\t"<<stu[i].sum<<"\t"<<stu[i].average<<"\n";
cout<<endl;
for(i=0;i<33;i++)
cout<<"*";
cout<<endl;
}
void cal(student *p,int i) //计算每个学生总分和平均分
{
stu[i].sum=(p+i)->chinese+(p+i)->math+(p+i)->english;
(p+i)->average=(p+i)->sum/3;
}
void aver(student *p,int n) //计算各科平均分和总平均分
{
double averchinese=0,avermath=0,averenglish=0,aversum=0;
for(int i=0;i<n;i++)
{
averchinese+=(p+i)->chinese;
avermath+=(p+i)->math;
averenglish+=(p+i)->english;
}
averchinese/=n; //将语文成绩都加起来除以总人数
avermath/=n;
averenglish/=n;
aversum=averchinese+avermath+averenglish;
cout<<"average of the scores\n";
cout<<"语文\t数学\t外语\t总分\n";
cout<<averchinese<<"\t"<<avermath<<"\t"<<averenglish<<"\t"<<aversum<<endl;
}
void sort(student *p,int n)
{
student t;
for(int i=0;i<n-1;i++) //冒泡法平均成绩降序排序
for(int j=0;j<n-i-1;j++)
if((p+j)->average<(p+j+1)->average)
{
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
}
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\t名次\n";
for(i=0;i<n;i++)
cout<<stu[i].no<<"\t"<<stu[i].xm<<"\t"<<stu[i].chinese<<"\t"<<stu[i].math<<"\t"<<stu[i].english<<"\t"<<stu[i].sum<<"\t"<<stu[i].average<<"\t"<<i+1<<"\n";
sortno(stu,n);
}
void sortno(student *p,int n) //冒泡法学号升序排序恢复按成绩排序后的学生信息顺序
{
student t;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
if((p+j)->no>(p+j+1)->no)
{
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
}
}
void search(student *p,int n)
{
int code; //输入要查找的学号
cout<<"请输入学号 :";
cin>>code;
int f=find(stu,code,n); //查找函数返回值
if(f==-1)
cout<<"Can not find the student!";
else
{
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<stu[f].no<<"\t"<<stu[f].xm<<"\t"<<stu[f].chinese<<"\t"<<stu[f].math<<"\t"<<stu[f].english<<"\t"<<stu[f].sum<<"\t"<<stu[f].average<<"\n";
}
}
int find(student *p,int c,int n)
{
for(int i=0;i<n;i++)
if((p+i)->no==c)
return i; //查找函数返回值角标
return -1; //查找不到则返回-1
}
void max(student *p,int n)
{
int a=0,b=0;
for(int i=1;i<n;i++) //stu[a]、stu[b]为最好和最差学生
{
if(stu[i].chinese+stu[i].math+stu[i].english>stu[a].chinese+stu[a].math+stu[a].english)
a=i;
if(stu[i].chinese+stu[i].math+stu[i].english<stu[b].chinese+stu[b].math+stu[b].english)
b=i;
}
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<"成绩最好的学生 :\n";
cout<<stu[a].no<<"\t"<<stu[a].xm<<"\t"<<stu[a].chinese<<"\t"<<stu[a].math<<"\t"<<stu[a].english<<"\t"<<stu[a].sum<<"\t"<<stu[a].average<<"\n";
cout<<"成绩最差的学生 :\n";
cout<<stu[b].no<<"\t"<<stu[b].xm<<"\t"<<stu[b].chinese<<"\t"<<stu[b].math<<"\t"<<stu[b].english<<"\t"<<stu[b].sum<<"\t"<<stu[b].average<<"\n";
}
void output(student *p,int n) //输出学生成绩
{
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
for(int i=0;i<n;i++)
cout<<stu[i].no<<"\t"<<stu[i].xm<<"\t"<<stu[i].chinese<<"\t"<<stu[i].math<<"\t"<<stu[i].english<<"\t"<<stu[i].sum<<"\t"<<stu[i].average<<"\n";
}
int insert(student *p,int n)
{
student newstu,*q; //newstu是要添加的学生,q为其指针
q=&newstu;
cout<<"输入新学生的信息 :\n";
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cin>>newstu.no>>newstu.xm>>newstu.chinese>>newstu.math>>newstu.english;
newstu.sum=newstu.chinese+newstu.math+newstu.english;
newstu.average=newstu.sum/3;
for(int i=0;i<n;i++) //找到要插入的位置
{
if(q->no>=p->no&&q->no<=(p+n-1)->no)
{
if((p+i)->no==q->no) //该学号已存在,输出该学号的学生信息
{
cout<<"该学生已存在 "<<endl;
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<stu[i].no<<"\t"<<stu[i].xm<<"\t"<<stu[i].chinese<<"\t"<<stu[i].math<<"\t"<<stu[i].english<<"\t"<<stu[i].sum<<"\t"<<stu[i].average<<"\n";
break;
}
if((p+i)->no<q->no&&q->no<(p+i+1)->no) //录入成功
{
for(int j=n;j>i+1;j--)
stu[j]=stu[j-1];
stu[i+1]=newstu;
cout<<"录入成功!"<<endl;
n++;
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<newstu.no<<"\t"<<newstu.xm<<"\t"<<newstu.chinese<<"\t"<<newstu.math<<"\t"<<newstu.english<<"\t"<<newstu.sum<<"\t"<<newstu.average<<"\n";
break;
}
}
else //录入成功
{
if(q->no<p->no)
{
for(int j=n;j>0;j--)
stu[j]=stu[j-1];
stu[0]=newstu;
cout<<"录入成功!"<<endl;
n++;
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<newstu.no<<"\t"<<newstu.xm<<"\t"<<newstu.chinese<<"\t"<<newstu.math<<"\t"<<newstu.english<<"\t"<<newstu.sum<<"\t"<<newstu.average<<"\n";
break;
}
else
{
stu[n]=newstu;
cout<<"录入成功!"<<endl;
n++;
cout<<"学号\t姓名\t语文\t数学\t外语\t总分\t平均分\n";
cout<<newstu.no<<"\t"<<newstu.xm<<"\t"<<newstu.chinese<<"\t"<<newstu.math<<"\t"<<newstu.english<<"\t"<<newstu.sum<<"\t"<<newstu.average<<"\n";
break;
}
}
}
return n; //学生人数改变,返回人数
}
int del(student *p,int n)
{
int newno; //输入要删除的学生人数
cout<<"输入要删除的学生学号 :";
cin>>newno;
if(newno>=p->no&&newno<=(p+n-1)->no) //查找该学生
{
for(int i=0;i<n;i++)
if((p+i)->no==newno)
{
for(;i<n-1;i++)
stu[i]=stu[i+1];
n--;
cout<<"删除成功 !\n";
}
}
else
cout<<"无法找到该学生 :\n";
return n;
}
void showmenu() //输出菜单
{
cout<<"请输入1~8内的数字选项 :\n";
cout<<"1.计算各科的平均成绩和总平均分\n";
cout<<"2.按学生的平均成绩降序排序\n";
cout<<"3.查询指定学号的学生信息\n";
cout<<"4.找出考得最好和考得最差的学生\n";
cout<<"5.输出学生的信息\n";
cout<<"6.添加学生信息\n";
cout<<"7.删除学生信息\n";
cout<<"8.结束\n";
}
|