题目集1-3总结

发布时间 2023-10-07 18:31:14作者: baizanga


一、前言
  在过去的几周里,我投入了大量的时间和精力来研究和发展针对题目集13的解决方案。从第一次的题目集简单的逻辑以及输入、计算、输出到面向对象类的设计、类和数组的应用,学习了hashmap/hashset,封装性等等。  整体来看,这一阶段的题目涵盖了广泛的主题,包括数据结构、算法、和设计模式。题目集涵盖的知识点较广,包括基本语法、面向对象编程、异常处理、集合框架、输入输出、多线程等每个题目都提供了对相关题目的深度理解和实践机会。每个题目集都有基本每日一练的题目,难度逐步提高。下面,我会对题目集2和题目集3中的一些题目进行深入的分析。
二、设计与分析


以题目集27-1为例,该题目要求实现学生信息封装以及成绩的处理。

下面是提供的源代码的类图表示:

Copy Code

+-----------------+

|      Main       |

+-----------------+

| - studentNumber |

| - name          |

| - chineseScore  |

| - mathScore     |

| - physicsScore  |

+-----------------+

| + Main()        |

| + calculateTotalScore(): int

| + calculateAverageScore(): double

| + main(String[]): void

+-----------------+

 

在这个程序中,Main类有以下成员变量:

studentNumber:学生学号,类型为String

name:学生姓名,类型为String

chineseScore:语文成绩,类型为int

mathScore:数学成绩,类型为int

physicsScore:物理成绩,类型为int

主要方法包括:

Main构造方法:用于初始化Main对象的成员变量。

calculateTotalScore方法:计算学生的总分,返回类型为int

calculateAverageScore方法:计算学生的平均分,返回类型为double

main方法:程序的入口方法,执行了以下操作:

创建了一个Main类型的数组students,长度为5

通过输入Scanner对象获取每个学生的学号、姓名和成绩,并使用这些值创建Main 象,并将对象存储在students数组中。

创建DecimalFormat对象,用于格式化输出平均分。

遍历students数组,输出每个学生的学号、姓名、总分和平均分。

 

解释和心得:

Main类是整个程序的主类,它包含了输入、计算和输出学生的信息。

Main类的构造方法 ​Main(studentNumber: String, name: String, chineseScore: int, mathScore: int, physicsScore: int)​ 用于初始化学生对象的成员变量。

​​calculateTotalScore()​ 方法计算学生的总分,它将每科成绩相加并返回结果。这个方法不涉及其他类和对象。

​​calculateAverageScore()​ 方法计算学生的平均分,它通过调用 ​calculateTotalScore()​ 方法获取总分,并除以3取平均值。最后使用Math.roundDecimalFormat格式化结果为两位小数。

​​main(String[] args)​ 方法是程序的入口点,它创建了一个Main类型的数组,并通过Scanner对象获取用户输入的学生信息。然后逐个创建Main对象,并使用成员方法计算总分和平均分,并将结果输出到控制台。

 

 2.以题目集2中的7-2为例:

首先,程序入口在Main类的main方法中。通过Scanner类读取用户输入,然后创建一个空的学生列表students。接着,使用循环读取每行输入,直到遇到空行为止。

 

在内部循环中,首先将每行输入按空格分割为相应字段。然后根据学生的ID查找是否已存在该学生对象,如果不存在则创建一个新的学生对象并添加到列表中。

 

接着调用学生对象的setScore方法,将课程名称、分数1和分数2存储到学生的grades映射中。

 

整个过程重复执行,直到输入结束。

 

接下来,使用DecimalFormat类创建一个格式化对象,用于将数字格式化为带两位小数的字符串。

 

然后,按指定顺序迭代学生列表,打印学生的ID、姓名和成绩信息。通过调用学生对象的相应方法,获取总分、平均分1和平均分2,并使用格式化对象进行格式化输出。

 

接下来看一下Student类和Grade类。

 

Student类表示学生,包含了学生的ID、姓名和成绩映射grades。使用有序的TreeMap来存储课程名称和对应的成绩对象。

 

Student类提供了一系列方法来获取学生的ID、姓名、成绩映射以及计算总分和平均分等。

 

Grade类表示一门课程的成绩,包含平时成绩(score1)和期末成绩(score2)。提供了获取平时成绩、期末成绩和总分的方法。

 

接下来是类图的解析

·Main类依赖于ScannerDecimalFormatStudentGrade类。

·Main类与Student类和Grade类有关联关系,即创建了这两个类的对象,并调用了它们的方法。

·Student类依赖于TreeMap类和Grade类。

·Student类与Grade类有关联关系,即Student类中包含了Grade类的对象。

·Grade类没有依赖其他类。

 

对应类图分析:

 +---------------------+

       |        Main         |

       +---------------------+

       |                     |

       |    - main           |

       |    - findStudent    |

       +---------------------+

                  |

                  v

       +---------------------+

       |       Scanner       |

       +---------------------+

                  |

                  v

       +---------------------+

       |    DecimalFormat    |

       +---------------------+

                  |

                  v

       +---------------------+

       |       Student       |

       +---------------------+

       |                     |

       |  - id               |

       |  - name             |

       |  - grades           |

       |                     |

       |  + getId            |

       |  + getName          |

       |  + getGrades        |

       |  + setScore         |

       |  + getTotalScore    |

       |  + getAverageScore  |

       |  + getAverageScore1 |

       |  + getAverageScore2 |

       +---------------------+

                  |

                  v

       +---------------------+

       |        Grade        |

       +---------------------+

       |                     |

       |  - score1           |

       |  - score2           |

       |                     |

       |  + getScore1        |

       |  + getScore2        |

       |  + getTotalScore    |

       +---------------------+

解释和心得:

这份代码实现了一个学生成绩管理系统,主要功能是读取学生信息、课程课程成绩,并计算每个学生的总分和平均分。

 

在代码实现方面,使用了面向对象的编程思想,将学生和成绩抽象为两个类,通过类与类之间的关联实现功能的实现。使用TreeMap保存学生的成绩信息,可以方便地进行查找和排序。

 

使用Scanner类实现从控制台读取用户输入,使用DecimalFormat类实现数字格式化输出,使输出结果更具可读性。

 

在命名方面,遵循了Java的命名规范,使代码更加易于阅读和理解。

 

3.对于题目集37-2

主要实现了一个学生选课、考试评分和成绩查询系统;

系统中包含三个主要的类:CourseGradeStudent,以及一个管理班级的Class类;

Course类表示课程信息,包括课程名称、性质(选修或必修)和考核方式(考试或其他),以及考试成绩;

Grade类表示学生成绩,包括平时成绩和期末考试成绩,通过计算得出总成绩;

Student类表示学生信息,包括学号、姓名、所选课程列表和对应的成绩列表;

Class类用于管理同一班级内的学生和成绩信息;

主函数中首先读入课程信息,然后根据输入读取学生考试成绩,最后输出每门课程的考试成绩和全部学生的总成绩。

 

类图说明:

说明:

 

·Course类表示课程信息,包括课程名称(courseName)、性质(nature)、考核方式(assessmentMethod)和考试成绩(examScores)

·Grade类表示成绩信息,包括平时成绩(normalScore)、期末成绩(finalScore)和总成绩(totalScore)

·Student类表示学生信息,包括学号(studentNumber)、姓名(name)、所选课程(courses)和对应的成绩(grades)

·Class类表示班级信息,包括班级编号(classNumber)、学生列表(students)和成绩列表(grades)

·Main类是程序的入口点,用于实例化对象、读取输入和输出结果。

·Scanner类用于从控制台读取输入。

 

类图分析:

+------------------+       +---------------------+       +-------------------+

|     Course  |    |       Grade         |       |      Student      |

+------------------+       +---------------------+       +-------------------+

| - courseName     |       | - normalScore       |       | - studentNumber   |

| - nature         |       | - finalScore        |       | - name            |

| - assessmentMethod |     | - totalScore        |       | - courses         |

| - examScores     |       +---------------------+       | - grades          |

+------------------+                                      +-------------------+

                |                                                 |

                |                                                 |

                |uses                                             |uses

                |                                                 |

                |                                                 |

                V                                                 V

            +-----------+                                 +---------------+

            |   Class   |                                 |   Main        |

            +-----------+                                 +---------------+

            | - classNumber                                |  <<entry point>> |

            | - students                                   |                 |

            | - grades                                     |                 |

            +-----------------------------------+         +-------------------+

                                                |uses

                                                |

                                                V

                                            +------------------+

                                            |    Scanner       |

                                            +------------------+
三、采坑心得
在解题过程中,我也遇到了一些问题。

 

1.类之间的关系设计不够好。在实现代码时,需要仔细分析各个类之间的关系,理解它们的职责和作用,才能正确地实现程序逻辑以及减少老师所说的类与类之间的重叠度

 

 

2.输入和输出的格式化学习。在读取用户输入和输出结果时,需要考虑到数据的格式化问题。比如,可以使用Scanner类的nextLine()方法读取一行字符串,并将其转换为相应的数据类型;同时还可以使用String.format()方法格式化输出结果,使其更加易读又比如浮点数的保留DecimalFormat转换等等每次过测试点在输入输出的格式转换上会花大量时间。

 

 

3.编码规范不严格。编写代码时需要注意一些细节问题,如代码缩进、命名规范、注释等等。这些都会影响代码的可读性和可维护性。尤其不喜欢打空格,这也使得代码的观赏性降低,也是自己需要注意的大问题。

 

 

4.会忘记数据合法性校验。程序在输入和处理数据时,需要对数据的合法性进行校验。有时虽然题目要求没有明说,但会过不了测试点,这也是自己考虑问题不全面,有时没有写数据合法性的代码也过了测试点但也要注意到这方面的问题,比如要检查学生学号是否重复、课程名称是否存在等等。只有保证数据的正确性,才能避免出现不必要的错误。


四、主要困难以及改进建议
    在解题过程中,我遇到的主要困难包括对某些概念的理解不够深入、对各种语法学习的不全面以及代码性能优化的问题。为了改进这些问题,希望老师能有时间讲解一些作业中的题目,以便学生更好地理解和应用它们。此外,也可以提供更多关于代码优化和性能测试的指导。

对于我来说代码设计和思路是很容易的,但是敲代码时会遇到各种语法、函数等等问题,自己对java基础知识掌握还不够,敲代码相对也不是很熟练,还要多花功夫在代码的编程能力提升上。
五、总结
通过这一阶段的题目集练习,我对算法、设计模式尤其是面向对象设计有了更深入的理解和应用。我意识到优化代码和改善性能的重要性不容忽视。此外,我也明白了持续学习和实践是提高编程能力的关键。对于教师、课程、作业、实验、课上及课下组织方式等方面,我希望能够提供更多实战机会让我们深入理解和掌握编程技能。同时,对于一些复杂的算法,希望能够在课程中增加详细的讲解,以便我们更全面地理解和应用它们。

以上是对我过去几周java编程学习的总结和分析。我将继续努力学习和实践,希望能在这个过程中不断提高自己的编程能力。