首页 > 其他分享 >BLOG-3

BLOG-3

时间:2023-06-23 19:22:05浏览次数:30  
标签:存储 信息 学生 BLOG 课程 使用 成绩

一、**前言**

本次Java大作业是一次非常有意义的学习经历,我们学习了泛型、接口、继承与多态、组合、排序、HashMap、HashSet、TreeMap等知识点,并将它们应用于实际编程中。通过这次大作业,我们不仅巩固了Java基础知识,还学会了如何将这些知识点结合起来进行实际应用。

二、**设计与分析**

课程成绩统计程序-1

类图如下:

 

在写这道题时,我使用了六个类。Main类用于解析输入数据,包括课程信息和学生成绩信息,并将这些数据存储在相应的数据结构中。Course类用于存储课程信息。Student类用于存储学生信息、计算平均分等。CourseScore类用于存储课程成绩、计算总成绩等。CourseStatistics类用于计算课程统计数据,ClassStatistics班级统计数据。

 

在Main类中,我首先创建一个名为courses的HashMap,用于存储课程信息。然后使用while循环不断读取输入的每一行,直到遇到"end"为止。对于每一行输入,我先使用trim()方法去除首尾空格,然后使用split(" ")方法将字符串拆分成一个字符串数组,接着根据字符串数组的长度和内容判断输入的格式是否正确。在处理成绩信息时,我首先创建一个名为students的HashMap,用于存储学生信息。同时,还创建了一个名为addedStudents的HashSet,用于去重。接下来的输入读取与课程信息的处理相同。在解析成绩信息的过程中,还涉及到了对学生和课程信息的查找和更新。例如,我使用了courses.containsKey(courseName)方法判断课程是否存在;使用courses.get(courseName)方法获取课程信息;使用students.computeIfAbsent(studentId, id -> new Student(studentId, studentName.substring(0, Math.min(studentName.length(), 10)), studentId.substring(0, 6)))方法查找或创建学生信息;以及使用student.addScore(courseScore)方法更新学生的成绩信息。

 

在计算和输出学生、课程和班级的各项统计指标时,我使用了泛型和集合框架。泛型是Java语言中的一种特性,允许在编译时检查类型安全。集合框架是Java中用于存储和操作数据的一组接口和实现类。我首先创建了一个名为studentList的List<Student>对象,并将students这个Map的values(即所有学生对象)添加到studentList中。然后,对studentList进行排序,按照学生的学号排序。接着,遍历studentList,计算每个学生的平均分数,并根据是否参加了考试输出不同的信息。

 

接着,我创建了一个名为courseMap的TreeMap<String, CourseStatistics>对象,用于存储每个课程的统计信息。遍历courses这个Map的values(即所有课程对象),将课程名称和对应的CourseStatistics对象添加到courseMap中。然后,遍历所有学生,将每个学生的成绩添加到对应课程的统计信息中。最后,输出每个课程的统计信息。

 

之后,我创建了一个名为classMap的HashMap<String, ClassStatistics>对象,用于存储每个班级的统计信息。遍历所有学生,将每个学生的成绩添加到对应班级的统计信息中。如果classMap中不存在该班级的统计信息,则创建一个新的ClassStatistics对象并添加到classMap中。然后,将classMap的values(即所有班级统计信息)添加到名为classList的List<ClassStatistics>对象中,并按照班级名称排序。最后,输出每个班级的统计信息。

 

在静态内部类CourseStatistics类和ClassStatistics类中,我通过使用成员变量、构造方法、成员方法和数学运算等Java语法,实现了对课程和班级成绩的统计和展示功能。在编写这段代码时,我主要考虑了如何将课程和班级的统计数据进行封装和计算,以及如何根据统计数据生成易于理解的统计信息字符串。

 

在Student类中,我使用getId(),getName(),getClassName()和getScores()等方法获取对象的属性值。这些方法的返回类型分别对应各个属性的类型。此外,我还使用了addScore()方法向scores列表中添加一个CourseScore对象。接着,我使用getAverageScore()方法计算平均分。该方法接收一个Course集合作为参数。该方法首先遍历传入的课程集合,并调用getCourseScores()方法获取该课程的成绩列表。如果成绩列表不为空,则累加该课程的平均分(通过调用getCourseAverageScore()方法计算)并递增计数器。最后,根据累计的总分和计数器计算平均分并返回。如果计数器为0,则返回Double.NaN表示无法计算平均分。getCourseScores()方法用于获取指定课程的成绩列表。该方法首先创建一个空的ArrayList对象,然后遍历scores列表,将属于指定课程的成绩添加到新列表中。最后返回新列表。getCourseAverageScore()方法用于计算指定课程的平均分。该方法首先调用getCourseScores()方法获取该课程的成绩列表。然后遍历成绩列表,累加平时成绩和期末成绩。如果平时成绩存在,则计算平时成绩的加权平均分(占30%)。最后,根据平时成绩和期末成绩的加权和计算总平均分并返回。

 

在Course类中,我使用了一个带参数的构造函数,用于创建一个Course对象并设置其name、type和accessMode属性。此外,我还使用了getName(),getType()和getAccessMode()等方法用于获取对象的属性值。

 

CourseScore类的大致结构与Corse类相似。在计算总成绩时,我使用了getTotalScore()方法根据平时成绩和期末成绩的加权和计算总成绩。平时成绩占30%,期末成绩占70%。为了将计算结果转换为整数,使用Math.round()方法四舍五入。

 

课程成绩统计程序-2

类图如下:

 

这一次大作业相比上次,增加了异常处理机制。在Main类中,我定义了一系列的变量,包括存储课程信息的courses列表,选课信息的curriculaVariables列表,学生信息的students映射,以及其他用于统计和存储数据的集合类变量。接着,我通过一个while循环读取输入的内容,并根据输入的内容进行不同的处理。根据输入的长度和内容,分别处理了课程信息、学生选课信息、实验课程成绩信息等不同情况。我将课程的平时成绩、期末成绩、总成绩和课程人数存储到对应的Map中,并将班级号添加到classSet中。对于学生选课信息和实验课程成绩信息的处理,通过解析学号、姓名、课程名称、实验次数和实验成绩,并计算总成绩。然后,将相应的数据存储到对应的Map和List中。在处理学生选课信息和实验课程成绩信息时,我对一些特殊情况进行了判断和处理,如成绩超出范围、选修课程数量不一致等。接下来,我对存储学生选课信息的Map进行遍历,计算每个学生的平均成绩,并将结果存储到一个新的Map中。然后,将新的Map转换为List,并按学号由小到大进行排序。在输出阶段,我首先判断是否出现了错误的格式或其他异常情况。然后,根据题目要求,按照指定的格式输出学生的成绩信息、课程的成绩信息和班级的总成绩信息。接着,我使用了Collator和Collections.sort()方法对课程列表进行排序,并按要求输出排序后的结果。

 

课程成绩统计程序-3

类图如下:

 

在这一次大作业中,我首先定义了多个用于存储数据的Map和List,如courseMap、scoreMap、studentMap等。这些集合类用于存储课程、成绩、学生等信息。接下来,我通过一个while循环读取用户的输入,并根据输入的内容进行相应的处理。接下来的处理与上一次大作业类似。在处理输入和输出的过程中,我使用了正则表达式对学号进行格式验证,使用了流式操作对集合进行筛选、映射和排序等操作,使用了BigDecimal来处理精确的浮点数计算。

 

Course类用于表示课程信息。在Course类中,我设置了课程名称、课程性质和考核方式等属性,并提供了相应的getter和setter方法来访问和修改这些属性。Course类还实现了Comparable接口,用于比较课程对象的名称。同时,Student类也实现了Comparable接口,用于比较学生对象的学号。CourseScore类包含了组合分项成绩的列表,实现了Cloneable接口,用于实现深拷贝。类之间通过组合关系建立了相互关联,例如,CurriculaVariable类包含了Course、Student和CourseScore对象,用于表示一条选课记录。Student类包含了Class对象,用于表示学生所在的班级。

 

三、**踩坑心得**

在第一个课程成绩统计分析系统中,对于输入的课程信息和课程成绩信息,需要对输入进行解析和验证。在解析时,我使用了字符串的split方法,通过空格将输入拆分成数组。然后,根据数组的长度和内容进行相应的处理。在处理过程中,要注意判断数组的长度是否符合预期,以及保证输入的格式正确。为了存储课程和学生成绩的信息,我需要选择合适的数据结构。例如,使用Map来存储课程和学生的信息,使用List来存储学生的课程成绩。在使用数据结构时,要注意选择合适的集合类和泛型,以及正确地插入、更新和删除数据。

 

在第二个课程成绩统计分析系统中,处理输入参数和计算成绩时,需要考虑异常情况的处理。例如,输入的学号、姓名、课程名称等字段的长度和格式是否正确,成绩的取值范围是否符合要求。在这道题中,我使用了正则表达式来处理异常情况。题目还要求对学生的课程总成绩平均分和班级的总成绩平均分进行排序和输出,在排序时,我使用了Collections.sort方法,并自定义了比较器来按照学号或班级号进行排序。

 

在第三个课程成绩统计分析系统中,我将成绩类的继承关系改为组合关系。在原来的设计中,成绩类通过继承的方式获得了课程成绩的属性和方法。但是在实际应用中,继承关系可能会导致类的耦合性增强,难以灵活地应对需求变更。通过对比继承关系和组合关系,我发现组合关系更加灵活和适应变更。在使用继承关系时,类之间的耦合性较高,一旦需求发生变更,需要修改多个类的结构。而使用组合关系,可以更灵活地组合不同的类和对象,可以减少类之间的依赖关系,使得程序更加易于维护和扩展。

 

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

1、缺乏调试和排查问题的技巧:

困难:在编程过程中,可能会遇到各种问题和bug,但缺乏有效的调试和排查问题的技巧。

改进建议:学会使用调试工具和技术,在遇到问题时,使用逐步执行和打印调试信息的方法,逐步排查问题所在。学会利用搜索引擎和技术社区,寻求帮助和解决方案。

2、缺乏代码复用和模块化的能力:

困难:在编写代码时,可能没有充分利用代码复用和模块化的能力,导致代码冗余和维护困难。

改进建议:学会使用继承、接口、组合等,以实现代码的复用和模块化。尽量遵循设计原则,如单一职责原则、开闭原则等,以实现代码的高内聚和低耦合。合理划分代码的模块和功能,遵循良好的代码组织和命名规范,提高代码的可读性和可维护性。

 

五、**总结**

通过这次Java大作业的学习,我深刻地认识到了泛型、接口、继承与多态、组合、排序、HashMap、HashSet、TreeMap等知识点的重要性。在实际编程中,我们可以灵活地运用这些知识点,帮助我们更加高效地开发出符合需求的程序。

总之,通过本次Java大作业的学习,我对Java编程语言有了更深刻的认识和理解。我相信这些知识点可以帮助我们更好地进行Java开发,也希望未来可以有更多的机会学习和应用它们。

标签:存储,信息,学生,BLOG,课程,使用,成绩
From: https://www.cnblogs.com/6123zoe/p/17500034.html

相关文章

  • BLOG-3
    (1)前言:这三次作业加强了我们对HashMap 类的理解,训练了我们对HashMap 类中方法的掌握,再次加强对我们对继承关系中的多态的掌握。也让我们通过例子掌握ArrayList-排序,以及各种自定义接口。而本次的迭代题目是课程成绩统计,主要还是按照类图设计代码,以及考虑字符的比较以及排序,题目......
  • BLOG-3
    前言: 这次博客是对之前发布的6-8次PTA题目集(成绩计算系列)的一次总结,经过前几次系列题目的磨练,相信对于认真写的同学来说这次成绩系列的题目也不是很难。只要肯花点时间,拿个及格不是问题。题量来说还是比较少的,对于一些高手来说,几个小时便可拿到高分。设计与分析:7-1课程成绩......
  • Blog-3
    (1).前言:(总结之前所涉及到的知识点、题量、难度等情况)一7-1课程成绩统计程序-1难度:对我来说,难,难,难,写这个我花了好长时间,分析了很久很久,但是要比较的话,菜单要更难,还是我太菜了。知识点:1.集合类:代码使用了多种集合类,如'ArrayList'、'HashMap'和'LinkedHashMap',用于存储和管理......
  • 最后一次Blog
    BLOG: 1.前言:最后几周的PTA难度明显上升,需要设计的类更多,尤其是学生成绩录入系统。还更考察对集合的使用,如Map,Set集合,利用他们自动排序去重的功能,完成题目.难度呈递增趋势。自己还是太菜,许多题目就没有拿到满分。随着本次的博客作业到来也预示着我的本学期的Java课程也......
  • BLOG-3
    一、前言先叠个甲,针对上次互评同学们的评论,我这次虽说也写上了题目,但我写了一万多字,真的没有水字数!!而且也没用ChatGPT写,麻烦各位帅哥美女给高点分儿,我也保证在互评时都打90分以上。1.知识点:LinkedHashMap和HashMap是有区别的,前者是按插入顺序储存元素,后者是哈希表排序会在后面......
  • blog
    importjava.text.Collator;importjava.util.*;classCourse{Stringname;Stringtype;Stringmode;Course(Stringname,Stringtype,Stringmode){this.name=name;this.type=type;this.mode=mode;}}classGrade{......
  • 2023-06-20 hexo博客 运行报错:Cannot find module 'hexo' from 'D:\ablog' 提示要rm
    前言:把博客拉到到新电脑,运行hexos报错如下:PSD:\ablog>hexosERRORCannotfindmodule'hexo'from'D:\ablog'ERRORLocalhexoloadingfailedinD:\ablogERRORTryrunning:'rm-rfnode_modules&&npminstall--force'原因:没有装......
  • BUUCTF:[CFI-CTF 2018]webLogon capture
    https://buuoj.cn/challenges#[CFI-CTF%202018]webLogon%20capturelogon.pcapng包的数量很少,随便抓个包跟踪一下流即可发现passwordPSC:\Users\Administrator>php-r"var_dump(urldecode('%20%43%46%49%7b%31%6e%73%33%63%75%72%33%5f%6c%30%67%30%6e%7d%20'));"Co......
  • BLOG-3
    通过对最后三次大作业中的题目集的学习,我有以下心得:1.三次题目集的知识点我觉得有这些(1):输入语句的使用。  (2):java中多个if()判断语句的使用。(3):java中的if()和else语句的嵌套使用。......
  • weblogic学习笔记
    前言工作原因,在weblogic上部署了一个很重要的服务。虽然部署成功了,但是对该weblogic还不是很了解。市面上中文资料少之又少,而且讲解的weblogic版本已经很老旧,对新人不是很友好。借着这个机会,打算系统学习下weblogic,也将学习的内容与大家进行分享。本文章weblogic版本为12.2.1.4......