Java学习笔记:PTA的1-3作业总结
(1)前言:在JAVA学习的PTA三次作业中,涉及到了简单语法的运用、简单类的运用和创建类以及关联类的使用。下面我将具体描述这三次作业的题目集内容、知识点、题量和难度。
第一次作业主要涉及简单语法的运用,旨在加深对JAVA基础语法的理解和熟练运用。题目集包括常见的语法题,如数据类型的转换、条件语句、循环语句等。学生需要根据题目要求编写代码,实现特定的功能。知识点包括变量定义与赋值、算术运算符、关系运算符、逻辑运算符等。题量较小,有9道题目,难度适中,适合初学者。
第二次作业主要涉及简单类的运用和创建类,旨在培养学生对类和对象的理解和使用能力。题目集包括类的定义、属性和方法的添加、对象的创建和调用等。学生需要根据题目要求创建特定的类,实现特定的功能,并进行测试。知识点包括类的定义与实例化、属性的封装、方法的定义与调用等。题量适中,有8道题目,第二题和第八题难度稍大。
第三次作业主要涉及关联类的使用,旨在培养学生解决实际问题时的面向对象思维和类之间的关联能力。题目集通常设计为实际场景下的问题,要求学生设计多个类之间的关系并实现特定功能。例如,学生可能需要创建一个学生类和课程类,通过关联关系实现选课和成绩管理等功能。知识点包括类之间的关联关系、继承与多态等。
综上所述,这三次作业分别涵盖了简单语法的运用、简单类的运用和创建类以及关联类的使用。题量适中,难度逐渐增加,帮助学生逐步掌握JAVA的基础知识和面向对象编程的思想。完成这些作业不仅可以提升编程技能,还能够为日后更深入的JAVA学习打下坚实的基础。
(2)设计与分析:
第一题:实现了一个学生类的创建,并在主函数中通过用户输入5个学生的信息,创建5个学生对象,并输出每个学生的总分和平均分。
首先,在代码中定义了一个内部类Student,它具有私有属性id、name、chinese、math和physics,分别表示学号、姓名、语文成绩、数学成绩和物理成绩。通过Student类的构造方法可以为这些属性赋值。
Student类还有一个print方法,用于打印学生的学号和姓名。
在main方法中,首先创建了一个Scanner对象scan,用于从标准输入读取用户的输入。
然后,创建了一个长度为5的Student数组stus,用于保存5个学生对象。
另外,代码还定义了两个整型数组sum和aver,分别用于保存每个学生的总成绩和平均分。
接下来,使用一个循环依次读取5个学生的信息,并将信息封装到对应的Student对象中。其中,scan.next()用于读取学号和姓名,scan.nextInt()用于读取成绩。
读取完毕后,通过new Student(id, name, chinese, math, physics)创建了一个学生对象,并将其存储在stus数组中。同时,计算出该学生的总成绩和平均分,分别存储在sum和aver数组中。
最后,再次使用循环依次输出每个学生的信息。通过调用stus[i].print()方法打印学号和姓名,然后输出总成绩和平均分。对于平均分,使用String.format("%.2f",aver[i])将其格式化为保留两位小数的字符串输出。
整体来说,该程序通过创建学生类和使用数组等数据结构,实现了学生信息的录入和输出功能。通过输入5个学生的信息,按照要求格式输出每个学生的总成绩和平均分。
该题目的类图和复杂度分析如下:


第二题:实现一个学生成绩管理系统
首先,定义了一个Scores内部类,用于存储每个科目的平时成绩和期末成绩。其中,p_score表示平时成绩,q_score表示期末成绩。该类中还有一个calculateScore()方法,用于根据平时成绩和期末成绩计算出该科目的总成绩,并返回向下取整后的结果。
接着,定义了一个Student内部类,用于存储一个学生的所有信息。包括姓名、学号、语文、数学和物理三门科目的成绩。该类中有一系列的setXxxScores()方法,用于设置三门科目的成绩。另外,还有printIdAndName()方法,用于输出该学生的学号和姓名,calculateTotalScore()方法,用于计算该学生的总成绩,以及p_scores()和q_scores()方法,分别用于计算该学生三门科目的平时成绩和期末成绩的平均值。
最后,在main()方法中,创建了一个长度为3的Student数组stus,用于保存三个学生的信息。通过循环输入三个学生的各项信息。首先输入学号和姓名,然后输入科目名称、平时成绩和期末成绩。通过调用对应的setXxxScores()方法,将成绩封装到该学生对应的科目中。循环结束后,再次循环遍历每个学生,依次输出其学号、姓名、总成绩、三门科目平时成绩和期末成绩的平均值。
整个程序主要涉及到了Java中的类、对象、数组、循环和分支等知识点。通过创建内部类Scores和Student,实现了对学生信息的封装,并实现了一些方法对学生信息进行管理和输出。同时,通过数组和循环的方式,实现了对多个学生的信息进行批量录入和统计。
该题目的类图和复杂度分析如下:


第三题:实现了一个点菜计价程序,输入订单中的菜品和份数,计算并输出总价格。
首先定义了一个Dish类,表示菜品。该类包含了菜品的名称和单价,并提供了获取菜品名称和菜品单价的方法。其中,getPrice()方法用于计算菜品的价格,接受一个参数portion表示份额(1/2/3代表小/中/大份),根据菜品的单价和份额计算出总价并返回。
接着定义了一个Menu类,表示菜谱。该类包含一个Dish数组dishs,用于保存所有菜品的信息。在searthDish()方法中,通过遍历菜谱数组,根据输入的菜名在菜谱中查找对应的菜品信息,并返回该Dish对象。
然后定义了一个Record类,表示一条点餐记录。该类包含了一个Dish对象d和一个份额portion,还有一个getPrice()方法,用于计算本条记录的价格。计价采用了一种简单的计算规则,即将菜品的单价乘以一个系数(0.5 + portion * 0.5),并对结果进行四舍五入取整后返回。
最后定义了一个Order类,表示点餐订单。该类包含一个Record数组records,用于保存订单上每一道菜品的记录。在addARecord()方法中,可以添加一条菜品信息到订单中。
在main()方法中,首先通过创建Scanner对象sc,接收用户的输入。然后创建了一个长度为4的Dish数组dishs,用于保存餐厅提供的菜品信息。接着创建了一个Record对象dish,用于保存当前点的菜品信息。创建一个整型变量num用于保存用户点的份额数。创建一个Order对象order表示当前的点餐订单。还创建了一个整型变量sum用于保存订单的总价。
在循环中,首先通过sc.next()获取用户输入的菜名,并判断是否为"end",若是则跳出循环。然后通过sc.nextInt()获取用户输入的份额数。接着遍历菜品数组dishs,找到对应菜名的菜品信息,并将菜品单价和份额数传入dish.getPrice()方法中,获得本条记录的价格,并将其加入sum中。若找不到对应的菜品,则输出提示信息。
循环结束后,输出sum作为订单的总价。
整个程序主要涉及到了Java中类、对象、数组、循环等知识点,通过创建类和对象实现了菜品信息的封装和操作,以及点餐订单的管理和计价功能。
该题的类图和复杂度分析如下:


第四题:
题目:设计并实现一个对学生、班级成绩的管理系统,成绩有“必修”,“选修”的属性,成绩的计算也有“考试”,“考察”的区别。
主要包含了三个类:Sub(课程类)、Cla(班级类)和Stu(学生类)。其中,Sub类代表课程,包括课程名称、课程性质和考试方式;Cla类代表班级,包括班级号;Stu类代表学生,包括学号、姓名、选修的课程以及平时成绩和期末成绩。
主要逻辑如下:
首先,通过Scanner从输入中读取数据,并根据空格分割成字符串数组。
通过while循环判断读取到的第一个元素是否为"end",如果是,则结束输入。
如果不是"end",则进行进一步处理:
如果第一个元素不是数字字符串,说明是课程类的信息,创建Sub对象,并设置其属性值。
如果第一个元素是数字字符串,说明是学生类的信息,创建Stu对象,并设置其属性值。同时使用stu_sub方法将学生选修的课程与已创建的课程对象关联起来。
将学生对象存储在List集合中,并通过IdComparator对学生对象按照学号进行排序。
遍历List集合,根据学生的属性信息进行成绩输出,并统计各门课程的总分和人数。
最后,根据班级信息对学生进行分组,并计算各班级的平均成绩。
代码中还包含了一些辅助方法,如判断字符串是否为数字字符串的方法fri,和按照学号进行排序的比较器IdComparator。


(3)踩坑心得:
前两个题目没有出现一些值得参考的编程经验;
1.第三题,菜单设计题:

出现这种错误,可能是出现了对错误输入内容没有进行处理,比如这题就需要对菜单中没有的菜输出“does not exist “。
所以在JAVA编程过程中要仔细审题,并对输入数据先进行输入格式,输入内容的初步检验,在对输入内容进行计算、逻辑处理。
2.第四题:这题对我而言太难了,到现在也没有想到怎么设计。
(4)出现的问题及改进方法:
问题1:见(3).1
解决方法如下:

相比错误的代码,新增了一个flag进行一个检验标志,将不存在的菜名输出“does not exist“,多个不同菜名也要输出。
(5)总结:
在这三次的JAVA作业中,我们学习了JAVA语言的基本语法、面向对象编程思想以及库函数的运用。
首先,在第一次作业中,我们掌握了JAVA语言的基本语法,包括变量的声明和赋值、数据类型的使用、运算符的运用等。我们还学习了如何通过输入输出与用户进行交互,并且学会了利用库函数实现字符串的操作,比如截取、连接等。
在对类的学习中,我们进一步深入学习了面向对象编程思想。我们了解了类的概念,并学会了如何创建自定义的类。在类中,我们可以定义属性和方法,通过构造方法来创建对象,并调用类中的方法进行相应的操作。这让我们能够更加灵活地组织和管理代码。
我们学习了关联类的使用。我们了解到一个类可以包含另一个类的对象,通过类之间的关联可以协同完成复杂的任务。我们学会了在一个类中实例化另一个类,并在方法调用时实现两个类对象之间的协作。这让我们能够更好地设计和组织程序,提高代码的可维护性和扩展性。
通过这几次作业,我不仅学会了JAVA语言的基本语法和面向对象编程的思想,还掌握了如何利用库函数来简化代码的操作。这些知识和技能对我们日后的编程学习和实践将起到重要的基础作用。同时,这些作业也帮助我们培养了逻辑思维和问题解决的能力,提升了我们的编程水平。
总的来说,这三次作业的学习让我们对JAVA语言有了更深入的认识,为我们未来的学习和实践打下了坚实的基础。希望在以后的学习中能够不断积累经验,提升自己的编程能力。
浙公网安备 33010602011771号