题目集4-6作业总结

xk159753963w / 2023-04-28 / 原文

一、前言

这三次的作业难度相较于前三次作业,题目难度有所上升,在第四次作业中遇到了之前没学到哈希表,刚开始只会用for循环和if语句做,但通过网上查阅资料,学会了哈希表的基本语法和一些用法,比如去重。在第五次作业中,用到了正则表达式,之前只会用嵌套的if语句去设置条件,会比较麻烦,但用正则表达式,就只用一次if语句就能够实现条件限制,比之前的嵌套if方便许多。然后菜单计价这题对我来说有点难度,我尽我所能去写,但还是没能在结束前完成这题,但下次一定会做的更好的。

二、设计与分析

第四次OOP训练题集总结

第一题:

因为后面第六次作业有这题的升级版,所以都写在第六次作业了。

第二题:

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

 本题总结:这题主要考察的哈希表的应用,先定义一个字符串数组,然后再通过一次for循环依次输入字符,再把字符串强行转化换为整数型,,然后通过哈希表来筛掉重复的整数型,最后通过数组长度来判断是否有重复的数据。

第三题:

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,去掉所有重复的数字。最后按照输入顺序输出没有重复数字的数据。所有重复的数字只保留第一次出现的那份。

 本题总结:本题用哈希表筛掉重复数据,先定义一个数组,然后再用for循环依次输入,再用哈希表依次将数组中重复的数据筛掉,再遍历数组输出没有重复数字的数据。

第四题:

从键盘录入一段英文文本(句子之间的标点符号只包括“,”或“.”,单词之间、单词与标点之间都以" "分割。
要求:按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。

 

 

 本题总结:本题要用哈希表去进行标点和单词之间的分割和用ArrayList作为容器,先定义一个字符串并输入,然后再用户哈希表对标点和单词分隔后依次放入定义的字符串数组中,然后就遍历用set去重,然后再将数组中的数据放入ArrayList中,然后再利用for循环,将ArrayList的数据放入数组b中,然后再用选择排序法对字母顺序进行排序,最后遍历输出。

第五题

Student类具体要求如下:
私有成员变量:学号(sid,String类型),姓名(name,String类型),年龄(age,int类型),专业(major,String类型) 。
提供无参构造和有参构造方法。(注意:有参构造方法中需要对年龄大小进行判定)
普通成员方法:print(),输出格式为“学号:6020203100,姓名:王宝强,年龄:21,专业:计算机科学与技术”。
普通成员方法:提供setXxx和getXxx方法。(注意:setAge()方法中需要对年龄进行判定)
注意:
年龄age不大于0,则不进行赋值。
print()中的“:”和“,”为均为中文冒号和逗号。

 

 

 本题总结:本题将学号、姓名、年龄和专业的属性变为私有进行封装,然后再分别用getter和setter的方法进行取值。

第七题

从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。

预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

 本题总结:本题先定义输入两个日期,然后再用-分隔年月日,再将两个日期的年月日转化为整数型,并存入对应数组中,再用LocalDate类中的isAfter()方法来判断两个日期的先后,再用until的方法计算两个日期的天数差和周数差,最后再输出。

 第四次OOP训练题集总结

第一题 

校验键盘输入的 QQ 号是否合格,判定合格的条件如下:

  • 要求必须是 5-15 位;
  • 0 不能开头;
  • 必须都是数字;

 本题总结:首先先定义并输入一个字符串,然后再正则表达式去对qq号进行条件限制,如第一位为1-9,后面的数字限制为0-9,位数为4-14,最后再进行输出。

第三题

接受给定的字符串,判断该字符串是否属于验证码。验证码是由四位数字或者字母(包含大小写)组成的字符串。

 本题总结:本题与第一题大致相同,首先先定义一个字符串,然后再用正则表达式来去进行条件筛选,相较于第一题,本题多一个字母的条件限制。

第五题

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

类图.jpg

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

 

 

 

 

 

 

 

 

 

 

 本题总结:本题按照题目给出的类图依次写出各个类考察了类之间的聚合。首先先写出year类,写出year的getter和setter方法,再写判断是否为闰年的isLeapYear方法,写出校验数据合法性的validate,最后写出年份加一和减一;再创建一个Month类,同样写出getter和setter的方法,再写出月份为1和12的方法,通过validate来检验数据合法性,最后写出月份加减1的方法;再创造一个Day类,定义一个每月的天数的数组,再写出getter和setter的方法,再写将day调成月最大天数和最小天数的方法,再通过检验数据合法性的方法校验,最后写出日期加减一天的方法;创造一个DateUtil类,里面有检查数据合法性的方法和比较两个日期大小的方法,还有判断两个日期是否相等和日期值格式化、求下n天、求前n天和求两个日期之间的天数的方法;最后写主类。

第六题

 

参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

 

类图.jpg

 

应用程序共测试三个功能:

 

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

 

 

 

 

 

 

 

 

 

 本题总结:本题与上题的区别在于类与类之间的关系有所改变,Year、Month、Day类与DateUtil聚合,其他地方大致相似。

 第四次OOP训练题集总结

 第一题

设计点菜计价程序,根据输入的信息,计算并输出总价格。

输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。

菜单由一条或多条菜品记录组成,每条记录一行

每条菜品记录包含:菜名、基础价格 两个信息。

 

 

 

 

 

 

 

 

 本题总结:因为本题难度较大和时间关系所以就只写了一部分代码。我创建了Dish类、Menu类、Record类、Order类、Table类,Dish中有菜品名称、特色菜名称、单件、菜品价格,还有计算菜品价格的方法;Menu类里面定义了一个菜品数组,写了一个根据菜名在菜谱中查找菜品信息的方法、添加一道菜品的方法;Record类里面,有点菜序号、份数、菜品、份额,写出检验数量合法性、份额合法性的方法和计算本条记录价格的方法;Order类中,用一个数组保存订单上每一道记录,再写出计算订单总价的方法,在写出添加订单记录的方法、删除一条订单的方法和查找一条记录的方法;Table类里面用getter和setter的方法对时间和订单序号依次赋值。

三、踩坑心得

 在第四次作业中,由于不会会用哈希表,导致开始多次出现语法错误,但在后面的学习中也逐渐掌握了哈希表语法的正确使用。在单词排序那题开始没有用到ArrayList,所以导致数组输出有空值的情况,后面用了ArrayList,将数组放入ArrayList把空值的空间清除了。在计算日期先后和间隔天数、周数一题中,开始并不会应用LocalDate的of()、ifAfter()、isBefore()、until()的方法,后面通过查询资料学会了这些方法的使用。

在第五次作业中,前面几题都用到了正则表达式,但开始用的是if的嵌套语句,所以很麻烦,然后后面学了正则表达式的用法,大大提高了效率。在写日期问题面向对象设计中,刚开始写类与类之间的关系中,没有体现出聚合,这也导致了后面运行错误,但后面按照题目给的类图给的类图关系去改正,就运行通过了。

第六次作业中,这次作业题目对本人来说难度较高较复杂加上时间不太够,就没能完全写出来,类也没能全部写全。

四、改进建议

 在以后碰到查重和去重的题,可以用哈希表去解决了,不需要用复杂的嵌套for循环,在遇到分隔的题目时可以用split去进行分隔。在遇到那种限制条件的题目时,可以用正则表达式去解决,这样就可以不用复杂的if嵌套了,这样大大的提高了效率。

 

 

 

 

在写一些面向对象设计问题时要先分析类与类之间的关系,再去写代码,这样可以有着清晰的思路去写。

 五、总结

这三次作业难度较于前三次,难度有所提升,遇到了之前没用过的哈希表和正则表达式,这些方法都很实用,用起来效率会很高,所以在之后的实验和作业中,我会去多运用新学的知识,去熟练运用并掌握。对于菜单计价的那个题,对我来说,可能有点难度,时间上的条件也不是很好,所以这个题尽我所能了还没有做完,但在之后的题目中,我会投入更多的精力去解决,希望下一次的训练集不会出现此类情况,我也将在后面的课程中努力的去落实老师所传授的知识点。