有某班三门课的成绩:语文,数学,英语,格式如下:
学号 语文 数学 英语
2008200901 70 65 76
2008200902 80 56 76
2008200903 70 34 67
2008200904 90 57 45
2008200905 88 56 56
2008200906 65 76 55
2008200907 70 66 76
2008200908 80 57 76
2008200909 70 32 67
2008200910 90 58 45
2008200911 87 57 56
2008200912 65 76 55
要求
1、在屏幕上输出如下格式成绩表,表格线可不要:
成绩表
学号 语文 数学 英语 总分 名次
2008200901 70 65 76 211 4
2008200902 80 56 76 212 3
2008200903 70 34 67 171 10
2008200904 90 57 45 192 9
2008200905 88 56 56 200 6
2008200906 65 76 55 196 7
2008200907 70 66 76 212 2
2008200908 80 57 76 213 1
2008200909 70 32 67 169 11
2008200910 90 58 45 193 8
2008200911 87 57 56 200 5
2008200912 65 76 55 196 7
其中的总分为每人三项成绩之和,名次按如下方式产生:
1)先按总分降序排名,总分高的排前面;
2)总分相同情况下,按数学成绩降序排名;
3)总分、数学成绩都相同者则名次并列。
2、按名次选拔总人数的20%作为优秀生,将其学号按名次保存到指定文件中去。
【输入】
输入文件名称为input3.txt,包含一组测试数据。第一行为一个整数C(1<=C<=200),
表示人数,接下来有C 行数据,每行数据分三列,分别对应语文,数学,英语成绩,各数据之间用空格分开。
【输出】
屏幕上输出上述格式成绩表,并且按名次输出优秀生学号到文件output3.txt 中去,每个学号一行。
帮你写了个. 你可以看看. 测试通过. 满意还请采纳..
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class student
{
public:
friend void Set_Input(int C,student stu[]);
friend void Print(int C,student stu[]);
friend void Taxis(int C,student stu[]);
friend void Set_Ranking(int C,student stu[]);
friend void Write(int C,student str[],string filename);
private:
int Sequence_number; //学号
int Ranking; //名次
float Total_score; //总分
float Chinese; //语文
float Math; //数学
float English; //英语
};
void change(student &stu1,student &stu2)
{
student t;
t=stu1; stu1=stu2; stu2=t;
}
void Set_Input(int C, student stu[]){
int xuehao=2008200901;
for(int i=0;i<C;++i)
{
cin>>stu[i].Chinese>>stu[i].Math>>stu[i].English;
stu[i].Sequence_number=xuehao+i;
stu[i].Total_score=stu[i].Chinese+stu[i].English+stu[i].Math;
}
}
void Print(int C, student stu[]){
cout<<"成绩表"<<endl
<<" 学号\t语文\t数学\t英语\t总分\t名次"<<endl;
for(int i=0;i<C;++i)
{
cout<<stu[i].Sequence_number<<'\t'<<stu[i].Chinese<<'\t'<<stu[i].Math<<'\t'<<stu[i].English
<<'\t'<<stu[i].Total_score<<'\t'<<stu[i].Ranking<<endl;
}
}
void Taxis(int C,student stu[]){
for(int i=0;i<C-1;++i)
{
for(int j=i+1;j<C;++j)
{
if(stu[i].Total_score==stu[j].Total_score)
{
if(stu[i].Math<stu[j].Math)
{
change(stu[i],stu[j]);
}
}
else if(stu[i].Total_score<stu[j].Total_score)
{
change(stu[i],stu[j]);
}
}
}
}
void Set_Ranking(int C, student stu[]){
int cnt=1;
for(int i=0;i<C;++i)
{
if(stu[i].Total_score==stu[i+1].Total_score)
{
if(stu[i].Math==stu[i+1].Math)
{
stu[i].Ranking=cnt;
stu[i+1].Ranking=cnt;
++i;
}
else
stu[i].Ranking=cnt;
}
else
stu[i].Ranking=cnt;
cnt++;
}
}
void Write(int C, student stu[], string filename){
ofstream ofs;
ofs.open(filename.c_str(),ostream::app);
ofs<<"优秀生名单:"<<endl
<<" 学号\t语文\t数学\t英语\t总分\t名次"<<endl;
for(int i=0;i<C*0.2;++i)
{
ofs<<stu[i].Sequence_number<<'\t'<<stu[i].Chinese<<'\t'<<stu[i].Math<<'\t'<<stu[i].English
<<'\t'<<stu[i].Total_score<<'\t'<<stu[i].Ranking<<endl;
}
ofs.close();
ofs.clear();
}
int main()
{
int C;
string filename;
cout<<"输入文件名:";
cin>>filename;
cout<<"输入学生人数:";
cin>>C;
student *stu=new student[C]; //根据输入的人数动态申请数组.
Set_Input(C,stu);
Taxis(C,stu);
Set_Ranking(C,stu);
Print(C,stu);
Write(C,stu,filename);
return 0;
}