首页 > 其他分享 >blog-3

blog-3

时间:2023-06-28 17:23:23浏览次数:32  
标签:String int blog course student data public

一、前言

  第六次题目集中有一道题,题目有一定的难度,是课程成绩统计系统-1,他对于各个类之间的嵌套关系以及ArrayList等数据的储存和利用有一定的涉及。
  第七次题目集的难度有一定的减少,因为一共有四道题,第一二和四题较简单,第三题就是课程统计系统-2,对于我们有一点点不友好,它是在课程成绩统计系统-1的基础上加上其他功能并进行改进,类与类的关系复杂程度加深。而另外三题主要考察我们对于容器-HashMap的检索与排序,题目要求较为基础,内容较简单。(相比于课程成绩统计系统来说已经是简单很多了······)
  第八次的题目集的难度某些题更上一步,共有五道题,有对于ArrayList的排序以及其他锻炼我们编程能力的接口与覆盖的练习,当然少不了最难的课程成绩统计系统-3·······。

二、设计与分析
(题目集一中的题目较为简单,可分析部分较少,但做题需注意题目的要求与一开始的初始条件,可能结果与正确答案就差一行代码)

*这里主要分析课程成绩统计系统

题目要求(图片)

 

该题代码:

 

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int count = 0;
        Scanner sc = new Scanner(System.in);
        ArrayList<Course> courses = new ArrayList<>();
        ArrayList<Student> students = new ArrayList<>();
//        while (true) {
//            String[] data = sc.nextLine().split(" ");
//            if (data[0].equals("end")) {
//                break;
//            }
//            Course course = new Course(data[0], data[1], data[2]);
//            courses.add(course);
//        }
        while (true) {
            String[] data = sc.nextLine().split(" ");
            if (data[0].equals("end")) {
                break;
            }
            Student student = new Student(data[0], data[1]);
            for (Course course : courses) {
                if (course.getName().equals(data[2])) {
                    if (course.getType().equals("必修") && course.getExam().equals(data[3])) {
                        student.addGrade(new Grade(course, Integer.parseInt(data[4])));
                    } else if (course.getType().equals("选修") && course.getExam().equals(data[3])) {
                        student.addGrade(new Grade(course, Integer.parseInt(data[4])));
                    } else {
                        System.out.println(student.getID() + " " + student.getName() + " : access mode mismatch");
                        continue;
                    }
                }
            }
            students.add(student);
        }
        for (Student student : students) {
            int totalScore = 0, totalCredit = 0;
            for (Course course : courses) {
                int score = student.getGrade(course);
                if (score == -1) {
                    continue;
                } else if (score == -2) {
                    System.out.println(student.getID() + " " + student.getName() + " did not take " + course.getName());
                    continue;
                }
                totalScore += score * course.getCredit();
                totalCredit += course.getCredit();
            }
            if (totalCredit == 0) {
                if(count < 2){
                    System.out.println(student.getID() + " " + /* student.getName() + */"has no grades yet");
                    count++;
                }
                else
                    System.out.print(student.getID() + " " + /* student.getName() + */"has no grades yet");
            } else {
                double gpa = 1.0 * totalScore / totalCredit;
                System.out.printf("%s %s %.0f\n", student.getID(), student.getName(), gpa);
                for (Course course : courses) {
                    int score = student.getGrade(course);
                    if (score == -1) {
                        System.out.println(course.getName() + " has no grades yet");
                    } else if (score == -2) {
                        System.out.println(course.getName() + " has no records");
                    } else {
                        System.out.printf("%s %d ", course.getName(), score);
                    }
                }
                System.out.println();
                System.out.printf("%s %.0f\n", student.getID().substring(0, 6), gpa);
            }
        }
    }
}

class Course {
    private String name;
    private String type;
    private String exam;
    private int credit;

    public Course(String name, String type, String exam) {
        this.name = name;
        this.type = type;
        this.exam = exam;
        this.credit = 2;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public String getExam() {
        return exam;
    }

    public int getCredit() {
        return credit;
    }
}

class Grade {
    private Course course;
    private int score;

    public Grade(Course course, int score) {
        this.course = course;
        this.score = score;
    }

    public Course getCourse() {
        return course;
    }

    public int getScore() {
        return score;
    }
}

class Student {
    private String id;
    private String name;
    private ArrayList<Grade> grades;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
        this.grades = new ArrayList<>();
    }

    public String getID() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void addGrade(Grade grade) {
        grades.add(grade);
    }

    public int getGrade(Course course) {
        boolean hasRecord = false;
        for (Grade grade : grades) {
            if (grade.getCourse().getName().equals(course.getName())) {
                hasRecord = true;
                return grade.getScore();
            }
        }
        if (!hasRecord) {
            return -1;
        } else {
            return -2;
        }
    }
}

分析:课程成绩统计程序-1虽说相比前面的题目对于我们而言是一个大挑战,但是不断熟悉类与类之间的关系与调用,凭借我们之前的基础,还是能加把劲赶出来的。

 

课程成绩统计程序-2

 

分析:该程序相比与课程统计-1增加了实验的功能,模板还是套用课程统计-1,但因有了这功能输入的情况也变得随之不一样了,课程的数量也不一样。一开始我认为,可能并不太难,因为我们有了第一次的经验,相较于之前的代码,我最初的思路是增加addCourse()与但最后调试时发现我的操作与数据一直无法相对应,它们之间毫无关联,这时才意识到可能没有这么简单,后来我通过再次深入了解静态变量与静态方法,数组大小的原因等,解决了该问题。

 

部分代码:

ArrayList<Course> courses = new ArrayList<>();
        ArrayList<Student> students = new ArrayList<>();
//        while (true) {
//            String[] data = sc.nextLine().split(" ");
//            if (data[0].equals("end")) {
//                break;
//            }
//            Course course = new Course(data[0], data[1], data[2]);
//            courses.add(course);
//        }
        while (true) {
            String[] data = sc.nextLine().split(" ");
            if (data[0].equals("end")) {
                break;
            }
            Student student = new Student(data[0], data[1]);
            for (Course course : courses) {
                if (course.getName().equals(data[2])) {
                    if (course.getType().equals("必修") && course.getExam().equals(data[3])) {
                        student.addGrade(new Grade(course, Integer.parseInt(data[4])));
                    } else if (course.getType().equals("选修") && course.getExam().equals(data[3])) {
                        student.addGrade(new Grade(course, Integer.parseInt(data[4])));
                    } else {
                        System.out.println(student.getID() + " " + student.getName() + " : access mode mismatch");
                        continue;
                    }
                }
            }
            students.add(student);
        }

   课程成绩统计程序-3

 

题目增加的部分要求:

分析:课程成绩统计程序-3新加了计算总成绩等信息,组合关系等。第三次程序对于前面来说,虽说是延续着先前的模板,但难度还是一下子增幅太大了,不仅对于功能的增加过多,同时需要思考运用的灵活性,某方面来说要更改部分先前的逻辑,增添新的东西,使该闭环更加的复杂。

  但部分测试点还是出错,课程成绩统计程序-3的难度还是对我来说较大,无法顺利完成,类与类之间的关系过于复杂。

 

7-1 容器-ArrayList-排序

 

代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Student> list = new ArrayList<>();
        while (true) {
            String str = sc.nextLine();
            if ("end".equals(str)) {
                break;
            }
            String[] strs = str.split(" ");
            int id = Integer.parseInt(strs[0]);
            String name = strs[1];
            int math = Integer.parseInt(strs[2]);
            int physics = Integer.parseInt(strs[3]);
            Student s = new Student(id, name, math, physics);
            list.add(s);
        }
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int sum1 = o1.getMath() + o1.getPhysics();
                int sum2 = o2.getMath() + o2.getPhysics();
                if (sum1 != sum2) {
                    return sum2 - sum1;
                } else {
                    return list.indexOf(o1) - list.indexOf(o2);
                }
            }
        });
        for (Student student : list) {
            System.out.println(student.toString());
        }
    }
}

class Student {
    private int id;
    private String name;
    private int math;
    private int physics;

    public Student(int id, String name, int math, int physics) {
        this.id = id;
        this.name = name;
        this.math = math;
        this.physics = physics;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getMath() {
        return math;
    }

    public int getPhysics() {
        return physics;
    }

    public int getSum() {
        return math + physics;
    }

    @Override
    public String toString() {
        return id + " " + name + " " + getSum();
    }
}

  7-3 jmu-Java-02基本语法-03-身份证排序

 

 

 分析:这些题目的难度都不大,但是需要有耐心进行一次次的测试。

 

三、踩坑心得


1、非零返回:

  编写课程成绩统计程序的代码时,测试点经常由于非零返回出错,实际上就是程序的语法在中间就出现了异常,或者是没有结束的方法,导致程序可能返回null,判断的逻辑出错了,无法进行到该方法最后的return,因此出现了非零返回的状态。

2、运行超时:

  在编写“容器-ArrayList-排序”以及“课程成绩统计程序”等题目时,也都出现了该情况,最初我使用嵌套循环的方法,结果严重超时,代码的复杂度太高了,因此一次两个测试点都错了,我重复修改了很多次但仍然没有很好的改善,因此去网上查阅方法查资料,学会了字符流输入,动态的将其的大量计算给省去了。

 

四、主要困难以及改进建议


1、主要困难:

  a.我认为初学Java的我们,第一次的题目集对于我们来说可能比较友好,因为有了C语言的基础,但是对于后面编写的困难,难就难在我们对于Java很多与C语言不同的语法,以及类的用法不一样,我们没有办法直接像逻辑关系等直接套用,我们需要花时间慢慢去了解,因此一上来做类似菜单计价程序这样的题对于我们来说负担过大时间过短。

  b.对于我们来说运用一门新的编程语言,我们要做到对而且得知道哪里错了,而PTA中测试点的模糊描述,让我们不知所以然,很难第一时间就了解自己的问题出现在哪里,只能不断的花时间去思索考虑并调试修正;同时在提交题目后不论对错,我们也没有答案可以参考,这样我认为不利于我们的提升,对于我们编写题目是一种困难。

  c.题目难度的跳跃有点大,菜单计价程序若是通过慢慢添加一两个功能,我认为我们还能接受,但看到后面那十多二十来个的测试点,不禁会有想要放弃的念头,没有了继续编写的激情。

2、改进建议:

  我认为PTA网站的测试点应该描述的更加详细,能够让我们提交之后更加清晰的了解到到底错了哪里;同时希望题目集时间截至时间过去了之后能够给我们参考答案,我认为这能让我们的提升更快,也能让我们每次写题目集都有连续的想法。我认为我们应该多去参考一些别人的代码来看看自己的代码究竟是哪里出了问题,请教他人请教老师;可以运用报表图等来辅助自己撰写代码,也方便让自己进行添加删改,同时对于代码进行注释,保证自己在做完其他题目之后还能回忆先前自己编写的内容。

 

五、总结

  

  对于该三次的题目集,我认为对于我自己来说是一个很大的提升,PTA和这次的博客对我们来说都是很重要的提升自己的机会,也能够让我们回过头来给自己的成果予以反思、总结。虽然说过程有点艰难,但自己写出代码并看到它能成功运行时,心里有一种油然而生的成就感。我认为给我们更多的时间,让题目量可以增多但难度适当降低一些,能够增加我们的积极性,让我们对于Java的学习更加有动力。

 

标签:String,int,blog,course,student,data,public
From: https://www.cnblogs.com/pumpkin-9/p/17511969.html

相关文章

  • 面向对象程序编程6-8次PTA题目集(成绩计算系列)的总结性Blog
    1.对之前发布的6-8次PTA题目集(成绩计算系列),内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况第六次PTA题目集:知识点:此次PTA题目仅只有这一个题目,主要考的内容就是对类的使用(类似现实,对有关联的各个数据合并在一起,便于一起使用),运用正则表达式(比较苦难使用,要记住那......
  • 成绩计算系列blog
    一、前言主要学习了java的集合框架一系列知识,如,HashSet,HashMap,TreeMap等,以及对该知识的应用。这几周的作业让我们进一步掌握OOP的继承和多态性,而其中具有代表性的就是课程成绩统计系统。题目的难度中等偏上,适合用来考察学生对面向对象设计原则和异常处理的理解。题量中等,包含......
  • BLOG-3
    前言:知识点第一次作业:练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构;练习数据的输入与输出;理解抽象类与子类的关系,代码聚合性的调试。第二次作业:练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构;练习数据的输入与输出;理解抽象类......
  • BLOG-3
    一、前言(1)第6-8次PTA题目集主要以课程成绩统计程序题目为主,难度逐步提升,此外,在第7次题目集中还考察了HashMap及多态。(2)相关知识点:这三次题目集基本覆盖了大部分java基础语法及其用法,以及java中的类及其中的方法,如HashMap类。此外,还涉及了java三大特性之一的多态。......
  • 选课成绩管理系统-BLOG-3-PTA6-8
    目录(1)前言(2)设计与分析(3)踩坑心得(4)改进建议(5)总结正文(1)前言题目知识点题量(5分为满)难度(5分为满)选课11.正则表达式的基本使用(选课1要求会读懂)。2.多次if-else完成业务判断。3.解析字符串处理一般业务(之后我会总结到正文第五点总结部分)。4.简单的继承多态,以及基本......
  • Blog - 3
    前言这次的题目集总共有三道题,难度逐级增加,不过只要逻辑清晰,还是很容易做出来的。以下是涉及到的知识点:Java基础语法,包括变量、数据类型、运算符、控制语句等。Java中的字符串处理,包括字符串的拼接、分割、替换等。Java中的数组和集合,包括数组的定义、初始化、遍历等,以......
  • 6-8次PTA题目集(成绩计算系列)BLOG-3
    1.前言对题目集的总结:1.知识点第6次:6-1课程成绩计价程序-1锻炼学生自主构建类(maybe,如果是完全参考题目给的那当我没说),实现继承,组合关系的能力。第7次:或许是上次作业有些学生不太理想,所有第七次出了几个小题去让学生了解一些知识点:7-1 容器-HashMap-检索(相当于利用HashMap......
  • 题目集7~11的总结性Blog
    一、前言(1)pta第七次作业题目列表如下:7-1 菜单计价程序-5总结:这个菜单计价1程序-5是前菜单计价程序-3的迭代,难度较之前的有所提升,题目难度对我来说感觉很大,写了很久也没有拿下。(2)pta第八次作业题目列表如下:7-1课程成绩统计程序-1总结:总算是熬过了菜单,迎来了新的课......
  • BLOG-3
    某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。考察的总成绩直接等于期末成绩必修课的考核方式必须为考试,选修课可以选择考试、......
  • oop题目集7~11的总结性Blog
    目录一、前言二、设计与分析:一、前言4~6的训练集难度较上一次提升很多,训练了很多java中独有的提供好的方法,如hashset,数组的sort等方法,实现了代码运行时间的优化,和内存的占用减少,学会了代码的封装,和使用类间关系,同时了解并使用了正则表达式,了解Scanner类中nextLine()等方法、Str......