杭电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;
}
上一篇: Windows 7隐藏功能 虚拟WiFi