任何疑问、意见、建议请留言公众号:一航代码
题目描述:
建立一个学生信息系统,输入学生信息,输出有挂科同学的信息,再按照平均成绩从高到低排序输出。
输入格式:
首先输入学生的个数N,在接下来的N行,每行输入由学生姓名(小写拼音)、第一科成绩、第二科成绩、第三科成绩以及总分构成。
输出格式:
首先输出学科中有挂科的同学信息,并将其姓名和单科成绩以如下格式输出:
*[qianer] 65 32 77
然后按照平均成绩由高到低,输出所有同学姓名和单科成绩。
输入样例:
5
zhaoyi 70 80 90 240
qianer 65 32 77 174
sunsan 100 55 68 223
lisi 86 77 90 253
wangwu 100 59 66 225
输出样例:
*[qianer] 65 32 77
*[sunsan] 100 55 68
*[wangwu] 100 59 66
lisi 86 77 90
zhaoyi 70 80 90
wangwu 100 59 66
sunsan 100 55 68
qianer 65 32 77
解决方法:
(1)算法思想:
题目中言明只有三个科目,但代码中做了一般化处理。
题目中未言明最大学生数量,如果使用定长数组需注意这一点。
知识点:结构体的定义与使用,结构体排序。
(2)代码实现:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
using namespace std;
struct student
{
string name; //学生姓名
vector<int> scores; //学生成绩数组,默认数组最后一个数值保存总成绩
bool flag = true; //若该同学未挂科,则flag为true,否则为false
};
bool cmp(student a, student b) //总成绩除以总科目数,默认数组中最后一个数值为总成绩,按平均成绩从高到低排序
{
return a.scores[a.scores.size() - 1] / a.scores.size() - 1 > b.scores[b.scores.size() - 1] / b.scores.size() - 1;
}
int main()
{
int n;
while (cin >> n)
{
vector<student> s;
for (int i = 0; i < n; i++)
{
student t;
cin >> t.name;
int score;
while (cin >> score) //循环读入成绩
{
t.scores.push_back(score);
if (score < 60) //如该同学挂科,将其flag置为false
{
t.flag = false;
}
char ch;
if ((ch = getchar()) == '\n') //回车保留在输入流中,如遇回车则结束循环
{
break;
}
}
s.push_back(t);
}
for (int i = 0; i < s.size(); i++)
{
if (!s[i].flag) //flag为false,该同学挂科,将该同学按格式输出
{
cout << "*[" << s[i].name << "]";
for (int j = 0; j < s[j].scores.size() - 1; j++)
{
cout << " " << s[i].scores[j];
}
cout << endl;
}
}
sort(s.begin(), s.end(), cmp); //结构体排序,按照平均成绩从高到低
for (int i = 0; i < s.size(); i++) //按格式输出
{
cout << s[i].name;
for (int j = 0; j < s[i].scores.size(); j++)
{
cout << " " << s[i].scores[j];
}
cout << endl;
}
}
system("pause");
return 0;
}