您的位置:首页 > 其它

程序设计第一次训练题 B大力出奇迹

2020-03-10 00:19 106 查看

题意:
读取所给的人的做题的信息,来通过做题的数量,罚时等对这一组人进行排序。

思路:
即给定一组数据,其中包含了每个人的人名,解题的数量,以及错题罚时等信息,在读入人数量和单位罚时的后,一次读出每个人的自己的做题信息,来判断做题的多少,来对这些人的成绩进行排序。用结构题来存储每个人的信息,用字符数组读入人名,再读入成绩。注意每次cin后,判断,如果是正数,则做题数加1,并且做题时间加上。负数则不管,每次读入数据后,用getchar读入后一个字符,判断,如果是(,则读入括号中的数字,乘上单位罚时,加入到时间中去。再用getchar消化后一个),随后再cin读入下一个数据。第一次getchar读入的如果是不是(,则直接cin读入下一个数据。直到读入所有的数据后,结束。结构体中记得重载<,先以做题数量正序排列,再以罚时升序排列,最后以顺序排列,然后用sort函数排序后输出。最后注意输出时的格式要求。

总结:
这个题目主要是要判断字符的读取问题,即如何读出数字后,判断后面有没有括号,然后需要读出括号中的内容,其他的实现慢慢写还行。(但在最后的格式输出的时候,一开始用的cin和cout,只有第一名字左对齐了,其后的所有都右对齐了,后来用的printf挺好使,不知道哪里的问题。)

代码:

#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <iomanip>

using namespace std;

struct P{
char name[10];  //姓名
int a;           //正确的题数
int b;           //罚时
int c;          //一开始的顺序
bool operator<(const P &p){
if(a != p.a) return a>p.a;  //题数的降序
if(b != p.b) return b<p.b;  //罚时的升序
return c<p.c;
}
}ps[2000];

int main(){
int m,  n;
cin>>m>>n;
int k=0;
int score=0;
char c;
while(cin>>ps[k].name){
for(int i=0; i<m; i++){   //依次读入成绩
cin>>score;
if(score>0){    //做出来了
ps[k].a++;  //题目数增加
ps[k].b+=score;  //罚时
}
c=getchar();
if(c=='('){   //判断是否有括号,里面有罚时
cin>>score;
ps[k].b=ps[k].b+score*n;
c=getchar(); //消化 )
}

}
k++;
}
sort(ps,ps+k);  //排序
for(int i=0; i<k;i++ ){  //输出
printf("%-10s ",ps[i].name);
printf("%2d ",ps[i].a);
printf("%4d\n",ps[i].b);
}

return 0;
}



  • 点赞
  • 收藏
  • 分享
  • 文章举报
banzixiang 发布了8 篇原创文章 · 获赞 1 · 访问量 208 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: