思路:
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风格字符串。