采用简单的方法,简单的语句对学生成绩进行操作。
1.计算每一科目的总分,平均分,最高分,最低分
2.输出学生的学号,姓名,所有成绩以及总分,平均分,gpa(加权值)
3.根据学生的名字升序排列
4.根据学生的学号升序排到
5.根据学生的学号查询学生的排名并展示他的成绩
6.根据学生的姓名查询学生的排合并展示他的成绩
7.由分数书成5个阶段: A(90——100) B(80—— 90)C(70—— 80). D(60——70) F(0-59)
计算每一科目每一阶段的人数及百分比
#include<iostream>
#include<string>//fileName.c_str()函数调用
#include<fstream>//文件流头文件
#include<iomanip>//流操作符
#include<stdio.h>
using namespace std;//申请内存空间,
//输出 学生号,学生姓名,所有成绩,总分,平均分,和每个学生的绩点,保存结果到指定文件。
struct student
{
string sno;//学号
string name;//姓名
double score[5];//五门科目成绩
double perSum;//每名学生五门科目总成绩
double perAvg;//每名学生五门科目平均分
double perGpa;//gpa(加权值)
int Rank;//
}stud1[8];//结构体大小为8个,可以录入8人成绩信息
void inputScoreFromFile();//调用函数,将文件内容读入磁盘
int menu();//菜单选项
void displayScoreStudent();//显示单个学生信息,计算每一科目的总分,平均分,最高分,最低分
void displayAll();//输出学生的学号,姓名,所有成绩以及总分,平均分,gpa(加权值)
void sortByName(struct student[]);//按照学生姓名冒泡排序
void sortBySno(struct student[]);//按照学生姓名冒泡排序
void searchBySno();//根据学生的学号查询学生的排名并展示他的成绩
int searchByName(struct student[],string enterByName);//根据学生的姓名查询学生的排名并展示他的成绩
void searchByPercentage(struct student[]);//第七题,计算每一科目每一阶段的人数及百分比
void SAG();
void RANK();
int main()
{
int itemSelected=0;//承接菜单项返回值,然后进入switch选项
while(true){//while(true)死循环,必须有结束循环标准,for(;;)
inputScoreFromFile();
SAG();
RANK();
itemSelected=menu();
string enterName;//输入学生姓名进行查找
switch(itemSelected){
case 1:
displayScoreStudent();
break;
case 2:
displayAll();
break;
case 3:
sortByName(stud1);
break;
case 4:
sortBySno(stud1);
break;
case 5:
searchBySno();
break;
case 6:
cin>>enterName;
searchByName(stud1,enterName);
break;
case 7:
searchByPercentage(stud1);
break;
case 0:
return 0;
default:
cout<<"Wrong choose you entered!"<<endl;
}
}
return 0;
}
int n=0;//定义为全局变量
void inputScoreFromFile()//转存到磁盘上
{
ifstream iofile("F:\\scores.txt",ios::in);//文件打开
if(!iofile.is_open())
{
cerr<<"Error:opening file fail"<<endl;
}
while(!iofile.eof()&&n<8)
{
iofile>>stud1[n].sno>>stud1[n].name>>stud1[n].score[0]>>stud1[n].score[1]>>stud1[n].score[2]>>stud1[n].score[3]>>stud1[n].score[4];
n++;
}
iofile.close();//关闭文件
}
int menu()//菜单
{
cout<<"1.计算每一科目的总分,平均分,最高分,最低分"<<endl;
cout<<"2.输出学生的学号,姓名,所有成绩以及总分,平均分,gpa(加权值)"<<endl;
cout<<"3.根据学生的名字升序排列"<<endl;
cout<<"4.根据学生的学号升序排到"<<endl;
cout<<"5.根据学生的学号查询学生的排名并展示他的成绩"<<endl;
cout<<"6.根据学生的姓名查询学生的排名并展示他的成情"<<endl;
cout<<"7.按标准计算每一科目每一阶段的人数及百分比"<<endl;
cout<<"Select the desired option:";
int choose;
cin>>choose;
return choose;//返回值
}
void SAG()//对结构体一些变量赋值
{
for(int i=0;i<8;i++)
{
stud1[i].perSum=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4];
stud1[i].perAvg=stud1[i].perSum/5;
stud1[i].perGpa=(stud1[i].score[0]*3+stud1[i].score[1]*2+stud1[i].score[2]*4+stud1[i].score[3]*3+stud1[i].score[4]*3)/(3+2+4+3+3);
}
}
void RANK()
{
for(int i=0;i<8;i++)
{
stud1[i].Rank=1;
for(int j=0;j<8;j++)
{
if(i==j)continue;
if(stud1[i].perSum<stud1[j].perSum) stud1[i].Rank++;
}
}
}
void displayScoreStudent()//1
{//显示单个学生信息,计算每一科目的总分,平均分,最高分,最低分
int m=0;
double sum[5];//求和变量值
double average[5];//求平均值
double min[5];//求最小值
double max[5];//求最大值
for(int i=0;i<5;i++)
{
sum[i]=stud1[0].score[i]+stud1[1].score[i]+stud1[2].score[i]+stud1[3].score[i]+stud1[4].score[i]+stud1[5].score[i]+stud1[6].score[i]+stud1[7].score[i];
}
for(int i=0;i<5;i++)
{
average[i]=sum[i]/8;
}
for(int i=0;i<5;i++)
{
double minNumber=9999;
for(int j=0;j<8;j++)
{
if(minNumber>stud1[j].score[i])
{
minNumber=stud1[j].score[i];
}
}
min[i]=minNumber;
}
for(int i=0;i<5;i++)
{
double maxNumber=0;
for(int j=0;j<8;j++)
{
if(maxNumber<stud1[j].score[i])
{
maxNumber=stud1[j].score[i];
}
}
max[i]=maxNumber;
}
cout<<"ECE101:"<<sum[0]<<"ECE102:"<<sum[1]<<"ECE103:"<<sum[2]<<"ECE104:"<<sum[3]<<"ECE105:"<<sum[4]<<endl;
cout<<"ECE101:"<<average[0]<<"ECE102:"<<average[1]<<"ECE103:"<<average[2]<<"ECE104:"<<average[3]<<"ECE105:"<<average[4]<<endl;
for(int i=0;i<5;i++)
{
cout<<"ECE10"<<(i+1)<<setw(6)<<":"<<min[i];
}
cout<<endl;
for(int i=0;i<5;i++)
{
cout<<"ECE10"<<(i+1)<<setw(6)<<":"<<max[i];
}
cout<<endl;
}
void displayAll()//2
{
for(int i=0;i<8;i++)
{
cout<<"sno:"<<stud1[i].sno<<"name:"<<stud1[i].name<<"ECE101:"<<stud1[i].score[0]<<"ECE102:"
<<stud1[i].score[1]<<"ECE103:"<<stud1[i].score[2]<<"ECE104:"<<stud1[i].score[3]<<"ECE105:"<<stud1[i].score[4]<<"perSum:"<<stud1[i].perSum<<"perAvg:"<<stud1[i].perAvg<<"perGpa:"<<stud1[i].perGpa<<endl;
}
ofstream outfile("D:\\stud.dat",ios::binary);
if(!outfile)
{
cerr<<"Error:open error!"<<endl;
}
else
for(int i=0;i<8;i++)
outfile.write((char*)&stud1[i],sizeof(stud1[i]));
outfile.close();
}
void sortByName(struct student stud1[])//3
{
int i,j;
student character;//定义一个结构体
for(i=0;i<8-1;i++)
{
for(j=0;j<8-1-i;j++)
{
if(stud1[j].name>stud1[j+1].name)
{
character=stud1[j];
stud1[j]=stud1[j+1];
stud1[j+1]=character;
}
}
}
for(int i=0;i<8;i++)
{
cout<<"sno:"<<stud1[i].sno<<setw(6)<<"name:"<<stud1[i].name<<setw(10)
<<"ECE101:"<<stud1[i].score[0]<<setw(10)<<"ECE102:"<<stud1[i].score[0]<<setw(10)
<<"ECE103:"<<stud1[i].score[0]<<setw(10)<<"ECE104:"<<stud1[i].score[0]<<setw(10)
<<"ECE105:"<<stud1[i].score[0]<<endl;
}
}
void sortBySno(struct student stud1[])//4
{
int i,j;
student character;
for(i=0;i<8-1;i++)
{
for(j=0;j<8-1-i;j++)
{
if(stud1[j].sno>stud1[j+1].sno)
{
character=stud1[j];
stud1[j]=stud1[j+1];
stud1[j+1]=character;
}
}
}
for(int i=0;i<8;i++)
{
cout<<"sno:"<<stud1[i].sno<<setw(6)<<"name:"<<stud1[i].name<<setw(10)
<<"ECE101:"<<stud1[i].score[0]<<setw(10)<<"ECE102:"<<stud1[i].score[1]<<setw(10)
<<"ECE103:"<<stud1[i].score[2]<<setw(10)<<"ECE104:"<<stud1[i].score[3]<<setw(10)
<<"ECE105:"<<stud1[i].score[4]<<endl;
}
}
void searchBySno()//5
{
string ID;
cout<<"请输入学号:"<<endl;
cin>>ID;
for(int i=0;i<8;i++)
{
if(ID==stud1[i].sno)
{
cout<<"sno:"<<stud1[i].sno<<"name:"<<stud1[i].name
<<"ECE101:"<<stud1[i].score[0]<<"ECE102:"<<stud1[i].score[1]
<<"ECE103:"<<stud1[i].score[2]<<"ECE104:"<<stud1[i].score[3]
<<"ECE105:"<<stud1[i].score[4]<<"rank:"<<stud1[i].Rank<<endl;
break;//对于单个for循环,break能够跳出循环,对于双层for循环,只能跳出最内层循环
}
if(i==7&&ID!=stud1[i].sno)
cout<<"学号不存在!"<<endl;
}
}
int searchByName(struct student stud1[],string enterName)//6
{
int i,j=0,num;
double chooseValue;
for(i=0;i<8;i++)
{
if(enterName==stud1[i].name)
{
num=i;//记录下该学生的结构体数组下标
j=1;
chooseValue=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4];
}
}
if(j==0)
{
cout<<"Error:Incorrect name!"<<endl;
return 0;
}
double sum[8];//利用数组,承接每位学生的总分
for(i=0;i<8;i++)
{
sum[i]=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4];
}
double value1;
for(i=0;i<8-1;i++)//对学生总分进行排序
{
for(j=0;j<8-1-i;j++)
{
if(sum[j]<sum[j+1])
{
value1=sum[j];
sum[j]=sum[j+1];
sum[j+1]=value1;
}
}
}
for(i=0;i<8;i++)
{
if(chooseValue==sum[i])
{
cout<<"该学生排名为:"<<(i+1)<<"sno:"<<stud1[num].sno<<setw(6)<<"name:"<<stud1[num].name<<setw(10)
<<"ECE101:"<<stud1[num].score[0]<<setw(10)<<"ECE102:"<<stud1[num].score[1]<<setw(10)
<<"ECE103:"<<stud1[num].score[2]<<setw(10)<<"ECE104:"<<stud1[num].score[3]<<setw(10)
<<"ECE105:"<<stud1[num].score[4]<<endl;
}
}
return 0;
}
void searchByPercentage(struct student stud1[])//7
{
int array[5][5];//五门科目分五个等级成绩
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
array[i][j]=0;
}
cout<<endl;
}
for(i=0;i<8;i++)
{
if(stud1[i].score[0]>=90&&stud1[i].score[0]<100)
{
array[0][0]+=1;
}
if(stud1[i].score[0]>=80&&stud1[i].score[0]<90)
{
array[0][1]+=1;
}
if(stud1[i].score[0]>=70&&stud1[i].score[0]<80)
{
array[0][2]+=1;
}
if(stud1[i].score[0]>=60&&stud1[i].score[0]<70)
{
array[0][3]+=1;
}
if(stud1[i].score[0]>=0&&stud1[i].score[0]<60)
{
array[0][4]+=1;
}
}
for(i=0;i<8;i++)
{
if(stud1[i].score[1]>=90&&stud1[i].score[1]<100)
{
array[1][0]++;
}
if(stud1[i].score[1]>=80&&stud1[i].score[1]<90)
{
array[1][1]++;
}
if(stud1[i].score[1]>=70&&stud1[i].score[1]<80)
{
array[1][2]++;
}
if(stud1[i].score[1]>=60&&stud1[i].score[1]<70)
{
array[1][3]++;
}
if(stud1[i].score[1]>=0&&stud1[i].score[1]<60)
{
array[1][4]++;
}
}
for(i=0;i<8;i++)
{
if(stud1[i].score[2]>=90&&stud1[i].score[2]<100)
{
array[2][0]++;
}
if(stud1[i].score[2]>=80&&stud1[i].score[2]<90)
{
array[2][1]++;
}
if(stud1[i].score[2]>=70&&stud1[i].score[2]<80)
{
array[2][2]++;
}
if(stud1[i].score[2]>=60&&stud1[i].score[2]<70)
{
array[2][3]++;
}
if(stud1[i].score[2]>=0&&stud1[i].score[2]<60)
{
array[2][4]++;
}
}
for(i=0;i<8;i++)
{
if(stud1[i].score[3]>=90&&stud1[i].score[3]<100)
{
array[3][0]++;
}
if(stud1[i].score[3]>=80&&stud1[i].score[3]<90)
{
array[3][1]++;
}
if(stud1[i].score[3]>=70&&stud1[i].score[3]<80)
{
array[3][2]++;
}
if(stud1[i].score[3]>=60&&stud1[i].score[3]<70)
{
array[3][3]++;
}
if(stud1[i].score[3]>=0&&stud1[i].score[3]<60)
{
array[3][4]++;
}
}
for(i=0;i<8;i++)
{
if(stud1[i].score[4]>=90&&stud1[i].score[4]<100)
{
array[4][0]++;
}
if(stud1[i].score[4]>=80&&stud1[i].score[4]<90)
{
array[4][1]++;
}
if(stud1[i].score[4]>=70&&stud1[i].score[4]<80)
{
array[4][2]++;
}
if(stud1[i].score[4]>=60&&stud1[i].score[4]<70)
{
array[4][3]++;
}
if(stud1[i].score[4]>=0&&stud1[i].score[4]<60)
{
array[4][4]++;
}
}
for(i=0;i<5;i++ )
{
for(j=0;j<5;j++)
{
cout<<array[i][j];
}
cout<<endl;
}
//输出等级所占比例
// double array1[5][5];//存储科目成绩所占比例
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
double munber=0;
double a=0;
if(array[i][j]!=0)
{
munber=(double)array[i][j]/8;
double a=munber*100;
if(j==0)
{
cout<<"科目ECE10"<<i<<setw(6)<<"所在阶段90--100"<<setw(6)<<a<<"%"<<endl;
}
if(j==1)
{
cout<<"科目ECE10"<<i<<setw(6)<<"所在阶段80--90"<<setw(6)<<a<<"%"<<endl;
}
if(j==2)
{
cout<<"科目ECE10"<<i<<setw(6)<<"所在阶段70--80"<<setw(6)<<a<<"%"<<endl;
}
if(j==3)
{
cout<<"科目ECE10"<<i<<setw(6)<<"所在阶段60--70"<<setw(6)<<a<<"%"<<endl;
}
if(j==4)
{
cout<<"科目ECE10"<<i<<setw(6)<<"所在阶段0--60"<<setw(6)<<a<<"%"<<endl;
}
}
}
}
}