欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

杭电OJ 2093——考试排名

程序员文章站 2022-05-13 17:04:23
...

#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;
}
相关标签: 杭电