航电oj2093—考试排名

在这里插入图片描述
在这里插入图片描述
思路:
1.首先定义一个学生类结构体,里面包括学生姓名、通过题数、所用时间数。还需要自定义排序规则。
2.在主函数中,需定义结构体数组,首先输入题数和罚分值,从i=0开始连续输入学生姓名,然后将每个人的通过题数、所用时间初始化置0,再依次遍历每题。
3.先将每题错误次数、通过时间初始化为0,输入做题时间字符串。
4.若该题所用时间为0或负数,跳出循环,看下一题 ;若为正数,遍历每个字符。
5.出现括号,则看下一个字符,将括号里的错误次数转化成数字;未出现括号,将所用时间转化成数字。
6.将正确题数相加 ,所用时间和罚时相加,存入该学生结构体数组,以此类推,最后按自定义规则排序,输出结果。

#include <iostream>
#include <string.h>
#include <algorithm>     
using namespace std; 
struct Stu
{
	string name;  //学生姓名 
	int score;    //所用时间数 
	int num;      //通过题数 
};
bool cmp(Stu a,Stu b)    //自定义排序规则,先按通过题数降序,再按时间数升序 
{
	if(a.num!=b.num)
	   return a.num>b.num;   
	else{
	    if(a.score!=b.score)
	        return a.score<b.score;
	    else 
		    return a.name<b.name;
	}	 
}
int main(int argc, char** argv) {
	int i=0,j,k,n,s,y,t;  //n为题数,s为罚分值,y代表提交正确时所用时间,t代表错误次数 
	Stu stu[1000];         
	string a;
	cin>>n>>s;
	i=0;       //从0开始输入学生姓名 
	while(cin>>stu[i].name)
	{    
	    stu[i].num=0;    //每个人通过题数初始化置0 
	    stu[i].score=0;  //每个人所用时间初始化置0 
		for(j=0;j<n;j++)  
		{	
		    t=0;        //每题错误次数初始化为0 
			y=0;	    //每题通过时间初始化为0  
			cin>>a;     //a为字符串 	
			if(a[0]=='0'||a[0]=='-')  //若该题所用时间为0或负数,跳出循环,看下一题 
			   continue;
			for(k=0;k<a.length();k++)  
			{   			    
				if(a[k]=='(')  //出现括号,则看下一个字符 
				{
					k++;
					while(a[k]!=')') //将错误次数转化成数字 
					{
						t=t*10+a[k]-'0';
						k++; 
					}      
				}
				else
				y=y*10+a[k]-'0';   //未出现括号,将所用时间转化成数字 					    
			}
			stu[i].num++;     //将正确题数相加    
			stu[i].score+=s*t+y;   //将所用时间和罚时相加 
		}
		i++;	 //继续输入	
	}
	sort(stu,stu+i,cmp);   //按自定义规则排序 
	for(j=0;j<i;j++)
	    printf("%-10s %2d %4d\n",stu[j].name.c_str(),stu[j].num,stu[j].score); //stu[j].name.c_str()用c_str获取C风格字符串
	return 0;
}

知识点:
1.sort(first,last,cmp)
(1)第一个参数first:是要排序的数组的起始地址。

(2)第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)

(3)第三个参数cmp是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序。题中bool cmp(Stu a,Stu b)是对结构体排序。
注:使用此函数需先包含:#include < algorithm >
并且导出命名空间:using namespace std;

2.因为用printf输出,加上c_str获取C风格字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值