题目

对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分(满分100)。总评成绩的计算公式为 G=(Gmid−term × 40%+Gfinal × 60%),如果 Gmid−term > Gfinal;否则总评 G 就是 Gfinal。这里 Gmid−term​ 和 Gfinal 分别为学生的期中和期末成绩。
现在的问题是,每次考试都产生一张独立的成绩单。本题就请你编写程序,把不同的成绩单合为一张。

输入格式:
输入在第一行给出3个整数,分别是 P(做了在线编程作业的学生数)、M(参加了期中考试的学生数)、N(参加了期末考试的学生数)。每个数都不超过10000。

接下来有三块输入。第一块包含 P 个在线编程成绩 Gp;第二块包含 M 个期中考试成绩 Gmid−term​;第三块包含 N 个期末考试成绩 Gfinal。每个成绩占一行,格式为:学生学号 分数。其中学生学号为不超过20个字符的英文字母和数字;分数是非负整数(编程总分最高为900分,期中和期末的最高分为100分)。

输出格式:
打印出获得合格证书的学生名单。每个学生占一行,格式为:
学生学号 Gp Gmid−term Gfinal G
如果有的成绩不存在(例如某人没参加期中考试),则在相应的位置输出“−1”。输出顺序为按照总评分数(四舍五入精确到整数)递减。若有并列,则按学号递增。题目保证学号没有重复,且至少存在1个合格的学生。

输入样例:

6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81
结尾无空行

输出样例:

missing 400 -1 99 99
ydjh2 200 98 82 88
dx86w 220 88 81 84
wehu8 300 55 84 84
结尾无空行

解题思路

  1. 读入各位学生的学号、编程成绩、期中考试成绩和期末考试成绩;
  2. 计算总分并排序;
  3. 按题目指定格式,输出合格学生。

总结:
本题类似于蓝桥杯题目 1556: 统计单词数。该类题目都是统计一个对象的多个属性,故需要用到qsort和bsearch函数,前者用于对该对象按照某一、或者多个属性排序,后者用于查找该对象是否曾经出现过。

这类题目的解题思路都是利用结构体数组存储每一个对象,在main当中不断的读入信息,先查找该信息的对象是否已经“建档”(即存在于结构体数组中),如果是,将该对象对应的属性更新,否则,重新为该对象“建档”。最后,再按照要求输出即可。

难点

本题的难点主要在于时间,易错点是四舍五入到整数后再排序。时间方面,如果在读入编程成绩后,在读入期中成绩时,若采用传统的for循环遍历查找的方法,会出现超时,因此需要用到二分查找(bsearch),但需要注意的是,使用二分查找之前,首先要对待查找的内容进行排序(升序降序皆可);在分数排序方面,最好是先四舍五入后再存入student的结构体当中的总分变量,以免产生排序错误等问题。

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student{char id[21];//学生学号为不超过20个字符的英文字母和数字int total;//输出顺序为按照总评分数(四舍五入精确到整数)递减int marks_P;//编程分数int marks_M;//期中分数int marks_F;//期末分数
};int cmp_id(const void *a,const void *b){struct student c = *(struct student *)a;struct student d = *(struct student *)b;return strcmp(c.id,d.id);//学号没有重复,学号递增
}int cmp_bs(const void *a,const void *b){char* c = (char *)a;struct student d = *(struct student *)b;return strcmp(c,d.id);
}int cmp(const void *a,const void *b){struct student c = *(struct student *)a;struct student d = *(struct student *)b;if (c.total!=d.total)//总分递减return d.total-c.total;else //若有并列,则按学号递增return strcmp(c.id,d.id);
}int main(){int num_P,num_M,num_F;//做了在线编程作业、参加了期中考试、参加了期末考试的学生数int i,temp_marks,k = 0;//k记录编程>=200的人数char temp[21];double temp_total;scanf("%d %d %d\n",&num_P,&num_M,&num_F);struct student S[num_P];struct student *p;//结构体指针,记录bsearch的返回值for (i=0;i<num_P;i++)//读入编程分数{scanf("%s %d\n",temp,&temp_marks);if (temp_marks>=200){S[k].marks_P = temp_marks;S[k].marks_M = -1;S[k].marks_F = -1;//有的成绩不存在,则在相应的位置输出“−1”strcpy(S[k].id,temp);k++;}}qsort(S,k,sizeof(S[0]),cmp_id);for (i=0;i<num_M;i++)//读入期中考试成绩{scanf("%s %d\n",temp,&temp_marks);p = (struct student *)bsearch(temp,S,k,sizeof(S[0]),cmp_bs);if (p!=NULL)//该生的编程成绩不少于200(*p).marks_M = temp_marks;}for (i=0;i<num_F;i++)//读入期末考试成绩{scanf("%s %d\n",temp,&temp_marks);p = (struct student *)bsearch(temp,S,k,sizeof(S[0]),cmp_bs);if (p!=NULL)//该生的编程成绩不少于200(*p).marks_F = temp_marks;}for (i=0;i<k;i++)//计算总分{if (S[i].marks_F==-1)temp_marks = 0;elsetemp_marks = S[i].marks_F;if (S[i].marks_M>S[i].marks_F)//期中大于期末temp_total = 0.4*S[i].marks_M+0.6*temp_marks;elsetemp_total = S[i].marks_F;S[i].total = temp_total+0.5;//总评分数四舍五入精确到整数}qsort(S,k,sizeof(S[0]),cmp);for (i=0;i<k;i++){if (S[i].total<60)//总评获得不少于60分break;elseprintf("%s %d %d %d %d\n",S[i].id,S[i].marks_P,S[i].marks_M,S[i].marks_F,S[i].total);}
}

PAT乙级1080:MOOC期终成绩(25)相关推荐

  1. 【PAT乙】1080 MOOC期终成绩 (25分)

    problem 1080 MOOC期终成绩 (25分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格 ...

  2. PAT | 1080 MOOC期终成绩 (25分)【附柳神代码】

    1080 MOOC期终成绩 (25分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获 ...

  3. 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想 ...

  4. 1080. MOOC期终成绩 (25)-PAT乙级真题

    对于在中国大学MOOC(http://www.icourse163.org/)学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评 ...

  5. 【PAT乙级】1080 MOOC期终成绩 (25 分)

    题目地址 #include<bits/stdc++.h> using namespace std; int n,m,k; struct node {int a,b,c,d; string ...

  6. 1080 MOOC期终成绩 (25 分) java 题解

    题目描述: 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作 ...

  7. 1080 MOOC期终成绩 (25 分)

    对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总 ...

  8. PAT (Basic Level) 1080 MOOC期终成绩(模拟+stl)

    题目链接:点击查看 题目大意:分别给出a个学生的编程分数,b个学生的期中考试成绩,c个学生的期末考试成绩,有几个规则: 总评为: 若期中考试成绩大于期末考试成绩: 否则: 合格的定义是编程分数大于等于 ...

  9. Pat乙级 1038 统计同成绩学生

    Pat乙级1038统计同成绩学生 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/9948052840928 ...

最新文章

  1. php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法
  2. 开源 免费 java CMS - FreeCMS1.5-建站向导
  3. 美多商城之订单(提交订单2)
  4. 李开复:明年会有一批AI公司倒闭
  5. axure9 html文件使用ie打开图片无法显示_win7系统html文件如何打开 win7系统html文件打开方法【介绍】...
  6. API网关Kong(二):Kong与Kubernetes集成的方法
  7. HDU1166敌兵布阵
  8. 【C/C++】异或操作巧妙实现两个数的交换操作
  9. Spring-IOC之BeanDefinitionHolder
  10. 听听【八年阿里架构师】怎样讲述Dubbo和Spring Cloud微服务架构
  11. ssh-add - 向认证代理添加 RSA 或 DSA 身份数据
  12. Futter基础第10篇: 实现替换路由、返回到根路由
  13. 高仿QQ游戏大厅-支持换肤和控件切换动画
  14. How do I find the FC ID (WWN) of a scsi device/LUN on Red Hat Enterprise Linux?
  15. tensorrt遇到torch.bmm的解决
  16. 基于URLOS的SaaS平台发布,轻松卖软件!
  17. AE基本知识【影视后期制作课题】
  18. 如何用命令关闭/启动mysql服务
  19. VS code 离线安装插件/扩展方法
  20. js 获取浏览器滚动条距离顶端的距离

热门文章

  1. Java对姓名, 手机号, 身份证号, 地址进行脱敏
  2. MQ报错2009/2085解决方法
  3. 中国站长站 - 站长资讯 | 我们致力于为中文网站提供动力!
  4. 三菱MR-JE-C伺服电机FB功能块 流水线项目,16个MR-JE-C电机
  5. iOS extern使用教程
  6. GIS十问之三:公司要求工作经验,应届生怎么办?
  7. MathType到期后的解决方法
  8. Python推导式(列表推导式、元组推导式、字典推导式、集合推导式)
  9. android 6.0.1 充电提示音
  10. python绘制堆叠图_在python中使用plotly创建堆叠图形或条形图