上机考试的一道题目,缕清思路后保存下来,供以后复习
题目如下
思路分析:
1,定义一个结构体,保存学生信息
2,输入学生信息(姓名,学号,成绩)
3,计算平均成绩
4,按平均成绩进行排序,如果相同,按学号排
5,安排名次
6,输出
代码如下:
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
struct student
{
int number;
string name;
int score[3];//三科成绩
float aver;//平均分
int rank;//名次
};
int main()
{
int n;
cin>>n;
if(n<10)
{
struct student s1[n];
//输入学生信息
for(int i=0; i<n; i++)
{
cin>>s1[i].number>>s1[i].name;
for(int j=0; j<3; j++)
{
cin>>s1[i].score[j];
}
}
//计算平均成绩排序
for(int i=0; i<n; i++)
{
int sum=0;
for(int j=0; j<3; j++)
{
sum+=s1[i].score[j];
}
s1[i].aver=sum/3.0;
}
//按平均成绩进行排序,如果相同,学号排
//此处用冒泡排序,按平均分由高到低排序
for(int i=0; i<n-1; i++)
{
for(int j=n-1; j>i; j--)
//每排好一次,就可以少比较一个值
{
if(s1[j].aver>s1[j-1].aver)
{
swap(s1[j],s1[j-1]);
}
else if(s1[j].aver==s1[j-1].aver)
{
if(s1[j].number<s1[j-1].number)
{
swap(s1[j],s1[j-1]);
}
}
}
}
//安排名次
//待排数前有n个与它不相同的数
//它的位次为n+1
for(int i=0; i<n; i++)
{
int count=1;
for(int j=i; j>=0; j--)
{
if(s1[i].aver==s1[j].aver)
{
continue;
}
else
{
count++;
}
}
s1[i].rank=count;
}
//输出
for(int i=0; i<n; i++)
{
cout<<setw(4)<<s1[i].rank
<<setw(10)<<s1[i].number
<<setw(10)<<s1[i].name;
for(int j=0; j<3; j++)
{
cout<<setw(5)<<s1[i].score[j];
}
cout<<endl;
}
}
else
{
cout<<"Please input 1-9.";
}
return 0;
}
输出样式:
花了一上午写出来,运行完成时,觉得代码真美。