博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【PAT】1137. Final Grading (25)
阅读量:742 次
发布时间:2019-03-22

本文共 2407 字,大约阅读时间需要 8 分钟。

  • 题目大意:计算每个学生的最终成绩(注意最后的总分是四舍五入得到的整数),判断学生是否能获得证书,获得证书标准为:

    1. 在线编程任务得分 >= 200
    2. 60 <= 最终成绩 <= 100(若期末成绩 >= 期中成绩,只考虑期末成绩;否则就以40%期中和60%期末的和算)
    3. 若满足上述条件,该学生就能拿到证书。并且按照最终成绩(四舍五入的整数)降序输出,若成绩相同,则按id升序输出
  • 思路:

    1. 用map(字符串)存每个人的三个成绩;
    2. 判断每个人的编程得分是否达标,若达标,再判断他们的期中成绩和期末成绩大小(即只存编程得分达标的),计算最终成绩(四舍五入);
    3. 用unordered_map存符合条件的学生,存最终成绩时记得四舍五入,最后将最后成绩放入数组,降序输出学生的各个成绩;
  • 知识点:

    1. 结构体
    2. map
    3. unordered_map
    4. 四舍五入:round()
    5. sort,cmp
  • 代码:

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;struct stu{ string name; // 忘记加了,应该和类一样严谨 int points, mid = -1, final = -1; int grade;};bool cmp(stu a, stu b){ // 读题失误,没注意“如果成绩相同按名字升序排序” return a.grade != b.grade ? a.grade > b.grade : a.name < b.name;}int main(){ int p, m, n, score; string name; map
    m1; unordered_map
    q; vector
    g; // 用vector方便排序 cin >> p >> m >> n; for(int i = 0; i < p; i++){ cin >> name >> score; if(score >= 200) m1[name].points = score; } for(int i = 0; i < m; i++){ cin >> name >> score; if(m1[name].points != 0) m1[name].mid = score; } for(int i = 0; i < n; i++){ cin >> name >> score; if(m1[name].points != 0) m1[name].final = score; } for(auto it = m1.begin(); it != m1.end(); it++) if((it -> second).points != 0){ // 符合条件的 float grade = 0.0; if((it -> second).final >= (it -> second).mid) grade = round((it -> second).final); else grade = round((it -> second).mid * 0.4 + (it -> second).final * 0.6); if(grade >= 60 && grade <= 100){ q[it->first].name = it->first; q[it->first].points = (it -> second).points; q[it->first].mid = (it -> second).mid; q[it->first].final = (it -> second).final; q[it->first].grade = grade; } } for(auto it = q.begin(); it != q.end(); it++) g.push_back(it->second); sort(g.begin(), g.end(), cmp); for(auto it = g.begin(); it != g.end(); it++) printf("%s %d %d %d %d\n", (*it).name.c_str(), (*it).points, (*it).mid, (*it).final, (*it).grade); return 0;}
  • 总结

    1. 仔细读题!,这次没看到“若成绩相同,则按id升序输出”,所以输出结果有错;

    2. 如果一个东西有多个属性,就用结构体

    3. 要排序的东西可以放到数组里

    4. 以后多用三目运算符,可以减少代码量。

    5. 结构体的元素可以用{}表示;

      struct stu{
      string name; int age; int sex;};int main(){
      stu student1 = {
      "Lily", 10, 1}; stu student2 = stu{
      "Tom", 11, 0}; // 也可在打括号前写结构体名字 return 0;}
    6. unordered_mapmap会自动排序,若不需排序,可用 unordered_map减少运算时间。

    7. 四舍五入:round()

      • #include <cmath>

      • round(x)返回x的四舍五入整数值。

      • ceil(x)返回不小于x的最小整数值(然后转换为double型)。

      • floor(x)返回不大于x的最大整数值。

转载地址:http://dgjwk.baihongyu.com/

你可能感兴趣的文章