杭电OJ 2093——考试排名

#2054
这道题总结起来就是麻烦,首先需要设置结构体存储学生的得分情况,之后需要进行根据得分进行排序,最后需要对学生成绩进行格式化输出。
重点在字符串的读取上,首先读取学生姓名,之后按照题目个数依次读取学生的做题情况,需要每次都读取成绩后面一个字符,判断是否有多次提交情况,之后再统计得分。

记录重点
1、sort函数的使用,添加头部文件algorithm;
2、strcmp函数,s1<s2(负数) ;s1>s2 (正数);s1=s2(返回0),注意这里是按照字母的大小来比较的,如果是按照题目的字典顺序的话,应该是小的字母在前;
3、结构体的使用
4、字符串的读取和记录

总体思路
读取字符串,存入学生成绩结构体,排序后格式化输出

题目直达

AC代码

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
struct sts {
	char sn[10];//学生姓名 
	int n;//做对的题目数 
	int score;//消耗的时间得分 
};//学生成绩的结构体 

//比较函数,返回结果a>b 
bool cmp(sts a,sts b) {
	//首先比较学生做对的题目个数 
	if(a.n!=b.n) {
		return a.n>b.n;
	} 
	//比较学生的耗时情况 
	else if(a.score!=b.score) {
		return a.score<b.score;
	} 
	//比较学生的姓名,按照字典顺序排序 
	else {
		return(strcmp(a.sn,b.sn)<0);
	}
}
int main() {
	int m,n;
	cin>>m>>n;
	getchar();//读取换行符 
	struct sts student[1010];//结构体存储学生成绩 
	int flag=0;//统计读取的学生个数
	//读取学生姓名 
	while(scanf("%s",student[flag].sn)!=EOF) {
		int sc;//成绩时间分 
		char ch,cc;//括号字符串的读取 
		int count=0;//学生做对题目数量 
		int sum=0;//统计时间分 
		int temp=0;//每道题提交的次数 
		for(int i=0; i<m; i++) {
			scanf("%d%c",&sc,&ch);
			if(sc>0) {
				sum+=sc;//时间分 
				count++;//做对题目 
				if(ch=='(') {
					scanf("%d%c",&temp,&cc);
					sum=sum+temp*n;//计算时间分 
				}
			}

		}
		//统计数据计入学生结构体 
		student[flag].n=count;
		student[flag].score=sum;
		flag++;
	}
	sort(student,student+flag,cmp);//将成绩从大到小排序
	//格式化输出
	for(int i=0; i<flag; i++) {
		 printf("%-10s %2d %4d\n",student[i].sn,student[i].n,student[i].score);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值