U410866 统计分数

文章详细描述了一个C++程序,通过结构体存储学生信息,利用排序算法对学生成绩进行整理,并考虑了分数相等时的排名规则。
摘要由CSDN通过智能技术生成

本题为本人原创,请勿抄袭。

难度:普及-

题目背景

  • 为了统计学生们的分数和排名,老师们翻来覆去睡不着觉。请你为老师编写一个这样的程序。 

题目描述

这是一题将结构体和排序结合在一起的题。

输入格式

  1. 输入:
  • 第一行,学生的数量。
  • 第二行,学生的名字。
  • 第三行,学生的语文、数学、英语、历史、生物、地理、政治成绩。

输出格式

  1. 输出:
  • 第一行,学生的名字。
  • 第二行,学生的排名。
  • 第三行,学生的总分。

输入输出样例

输入 #1

4
xiaowang
90 80 70 60 75 79 95
xiaohua
100 33 70 100 90 20 67
xiaoye
98 70 67 99 65 87 65
xiaozhang
56 78 89 90 78 87 66

输出 #1

xiaoye
1
551
xiaowang
2
549
xiaozhang
3
544
xiaohua
4
480

 输入 #2

2
xiaohuang
80 80 80 80 80 80 80
xiaorui
81 79 100 60 80 99 61

输出 #2

xiaorui
1
560
xiaohuang
1
560

说明/提示

  1. 提示
  • 1<n<10
  1. 说明
  • 会出现分数相等、总分相同的情况
  • 如果总分相同,先输出后输入的人的姓名,如样例2.

 思路

很明显,这道题是一道将结构体和排序相结合的一道题。

  • 首先,我们需要定义一个结构体,至于定义什么,题目要求什么就定义什么。
  • struct student{
    	string name;
    	int a,b,c,d,e,f,g;
    	int s;
    	int rank;
    	int index; 
    }a[11];
  • 然后,我们将七科成绩存入结构体中。
  • for(int i=0;i<n;i++){
    		cin>>a[i].name;
    		cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d>>a[i].e>>a[i].f>>a[i].g;
    		a[i].s=a[i].a+a[i].b+a[i].c+a[i].d+a[i].e+a[i].f+a[i].g;		
    	}
  • 接下来就是最重要的部分--排序。
  • bool cmp(student x,student y){
    	return x.s<y.s;
    }
  • sort(a,a+n,cmp);
    for(int i=0;i<n;i++)a[i].rank=i;
  •  最后,题目要求:如果总分相同,先输出后输入的人的姓名。所以,我们可以用倒序输出来解决,如下:
  • for(int i=n-1;i>=0;i--){
    		cout<<a[i].name<<endl;
    		cout<<sum<<endl;
    		cout<<a[i].s<<endl;
    		if(a[i].s!=a[i-1].s)sum++;
    }

 完整代码

#include<bits/stdc++.h>
using namespace std;
int n,sum=1;
struct student{
	string name;
	int a,b,c,d,e,f,g;
	int s;
	int rank;
	int index; 
}a[11];
bool cmp(student x,student y){
	return x.s<y.s;
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].name;
		cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d>>a[i].e>>a[i].f>>a[i].g;
		a[i].s=a[i].a+a[i].b+a[i].c+a[i].d+a[i].e+a[i].f+a[i].g;		
	}
	sort(a,a+n,cmp);
	for(int i=0;i<n;i++)a[i].rank=i;
	for(int i=n-1;i>=0;i--){
		cout<<a[i].name<<endl;
		cout<<sum<<endl;
		cout<<a[i].s<<endl;
		if(a[i].s!=a[i-1].s)sum++;
	}
	return 0;
}
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值