PTA(Basic Level) 1080:MOOC期终成绩(C语言实现)
分析:
①定义结构体存入学生信息;
②定义结构体数组,先输入学生的Gp,获得证书的学生的Gp>=200,所以忽略Gp<200的学生,存入数组中的学生Gp》=200,对所有数组中学生的Gm和Gf赋初值-1;再输入id和Gm,查找输入的id是否存在,存在则更新学生的Gm,否则忽略;输入id和Gf,规则同上;
③求学生的总评G(四舍五入),对数组中存入的学生按要求排序;
④输出符合要求的学生信息。
错误分析:按照以上思路,写好代码提交,测试点4运行超时,原因是当数组中的元素很大时,顺序查找相同id学生耗时太多。
学习:鉴于以上错误,查看了其他大神的方法,学习到了标准库中的bsearch()函数,下面简要介绍:
**bsearch(const void *key, const void *array, int n, int size, int (*cmp)(const void , const void ) );
- key:要查找的值
- array: 查找的数组
- n:数组元素个数
- size:数组中每个元素的大小
- cmp:比较函数
bsearch()在头文件<stdlib.h>中,按照二分查找的方法查找数组中是否存在给定元素,因此,查找的数组必须是有序的,排序(一般用qsort函数排序)的规则也要和此处cmp比较函数的规则相同。若存在则返回该元素的地址,否则返回NULL。对于有多于一个的元素匹配成功的情况,bsearch()未定义返回哪一个,由于此题学生学号唯一,所以可以用它查找。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
char id[21];
int gp;
int gm;
int gf;
int g;
}student;
int cmp(const void *a,const void *b)
{
student *p=(student*)a;
student *q=(student*)b;
if(p->g == q->g