#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";
}
|