OO三次习题作业总结

发布时间 2023-10-07 19:27:25作者: 聂桑

三次作业一次写的比一次差

虽然很多地方没有写好,希望下次写的更好

在编写的过程中踩过很多坑,也学习到了很多

在这里分享一下三次作业的心路历程

读入

在软件开发中,常见的Bug类型包括逻辑错误、空指针异常、数组越界、死循环、内存泄漏、并发问题、数据类型转换错误、输入验证不严谨、文件读写错误和异常处理不完善等。这些问题都会导致程序出现意外的错误,甚至导致程序崩溃,影响软件质量和用户体验。因此,开发者需要在编写代码时注意细节,进行充分的测试和调试,以消除潜在的Bug,并提高软件的稳定性和可靠性。

第一次作业:

 

 具体来说,代码首先定义了一个double类型的变量qi,用于存储计算出的契税金额。然后通过Scanner类获取用户输入的第几次购房、房款、评估价和房屋面积等数据,并保存在各个变量中。接着,代码根据用户输入的购房次数cishu,使用条件语句判断房屋面积mianji所在的区间,并根据不同的区间计算出契税金额qi并保存在变量中。其中,根据不同的购房次数和房屋面积区间,契税金额的计算方式可能不同。

 

 

 

代码通过for循环遍历字符串a中的每个字符。在循环体中,通过charAt()方法获取字符串a中指定位置的字符,并使用条件语句判断字符是否为'0'或'1'。如果是,则将该字符追加到字符串b的末尾。当遇到字符'-'时,代码会判断下一个字符是否为'1',如果是,则调用System.out.printf()方法打印字符串b,并使用return语句退出程序。

如果在整个循环结束后仍未满足上述条件,则代码会执行最后一行的System.out.printf("Wrong Format")语句,打印提示信息"Wrong Format",表示输入字符串的格式不符合要求。

这段代码比较简单,主要是对输入字符串进行了遍历和条件判断,目的是提取出特定的子串并进行处理。但是需要注意的是,该代码存在一些问题:

第二次作业

 

这段代码实现了一个简单的点餐系统。具体来说,代码定义了三个类:Dish、Menu和Order,并在Main类中进行了调用和测试。

Dish类表示一个菜品,包含菜品名称和单价两个属性,以及计算指定份数对应价格的方法。Menu类为一个菜单,包含多个Dish对象,提供根据菜品名称查找Dish对象的方法。Record类表示一份点菜记录,包含Dish对象和点菜份数两个属性,以及计算此条记录对应价格的方法。Order类表示一张订单,包含多条Record记录,提供添加记录和计算总价的方法。

在Main类中,首先定义了一个菜单对象menu和一个订单对象order,并通过Scanner类获取用户输入的点菜信息。用户输入的每一行包含两个部分,以空格分隔:一个菜品名称和对应的份数。代码首先通过String类的split()方法拆分用户输入的字符串,获取菜品名称和份数,并调用order对象的addARecord()方法添加一条点菜记录。

当用户输入"end"时,循环结束,代码调用order对象的getTotalPrice()方法计算订单总价,并打印输出结果。

这段代码的主要优点是结构清晰,逻辑明确,易于阅读和理解。而且,代码使用了面向对象的设计思想,将业务操作封装为不同的类,便于维护和扩展。但是,该代码也存在一些问题:

  • 对于输入的菜品名称和份数,没有进行格式验证和异常处理。
  • 系统存在数据冗余,例如Dish类中的单价字段和Record类中的Dish对象都保存了相同的单价信息。
  • 代码实现缺乏灵活性,无法支持修改、删除订单中的记录等操作。

因此,在实际应用中,可能需要对代码进行进一步优化和改进,增加更多的业务逻辑和异常处理。

 

 

 

这段代码实现了一个角度转换的程序。程序中通过输入整数degrees、minutes以及小数秒seconds,计算出对应的十进制度数decimalDegrees,并将结果打印输出。

具体来说,代码通过Scanner类获取用户输入的角度信息,并使用公式decimalDegrees = degrees + minutes / 60.0 + seconds / 3600.0进行角度转换。最后,使用System.out.printf()方法将转换结果格式化为指定的字符串格式输出。

该代码的主要优点是简洁明了、易于理解和使用。同时,代码中也没有太多冗余的逻辑和重复的代码,结构十分清晰。但是,该代码有以下几点需要注意:

  • 程序假设输入的角度信息符合格式要求,没有进行有效性检查和异常处理。
  • 程序输出的结果精度较低,只取了小数点后6位。如果需要更高的精度,可能需要更改代码中的格式化方式或改用其他数据类型实现。
  • 程序中使用了硬编码的方式定义了60和3600这两个常量值,可能会影响代码的可读性和可维护性。

因此,在实际使用时,可能需要对代码进行进一步的优化和改进,增加更多的异常处理和精度控制等功能,提高代码的鲁棒性和可扩展性。

第三次作业  

 

这段代码实现了一个日期比较和计算间隔的程序。程序中通过输入两个日期字符串,使用Java 8中的日期时间API对日期进行解析和比较,并计算两个日期之间的天数和周数。

具体来说,代码首先创建了一个Scanner对象用于接收用户的输入,并创建了一个DateTimeFormatter对象来定义日期的格式。然后通过Scanner获取用户输入的两个日期字符串dateStr1和dateStr2,并使用LocalDate类的parse()方法将字符串解析成LocalDate对象date1和date2。

接下来,代码使用isBefore()和isAfter()方法比较date1和date2的大小,根据比较结果输出不同的提示信息。然后,通过until()方法结合ChronoUnit.DAYS和ChronoUnit.WEEKS来计算date1到date2的天数和周数,并将结果打印输出。

该代码的优点是简洁明了,使用了Java 8中提供的日期时间API,操作方便。同时,代码逻辑清晰,易于理解和修改。但是,需要注意以下几点:

  • 程序假设输入的日期字符串符合指定的格式要求,没有进行有效性检查和异常处理。
  • 程序中硬编码使用了日期格式"yyyy-M-d",可能需要根据实际需求更改格式。
  • 程序中没有考虑闰年和月份天数不同的情况,对于某些特殊日期可能存在计算错误的问题。

因此,在实际使用时,可能需要对代码进行进一步的优化和改进,增加更多的异常处理和边界情况的考虑,提高代码的鲁棒性和准确性。

 

这段代码实现了一个学生选课系统的主程序。程序中使用了Scanner类获取用户的输入,并创建了一个ParseInput对象handle来处理用户的输入。

具体来说,代码通过while循环不断读取用户输入的字符串s_record,并调用ParseInput对象handle的parseInput()方法解析用户的输入。直到用户输入"end"为止,循环结束。

接下来,程序分别调用ParseInput对象handle的showStudents()、showCourses()和showClasses()方法,将解析后的学生、课程和班级信息输出到控制台。

该代码的优点是简洁明了,使用了面向对象编程的思想,将输入的解析和输出的显示分离开来,结构清晰。同时,代码逻辑简单,易于理解和修改。但是,需要注意以下几点:

  • 程序假设用户输入的字符串格式符合要求,没有进行有效性检查和异常处理。
  • 程序中未给出ParseInput类的具体实现,无法确定其解析和输出的具体细节。
  • 程序中未给出其他相关类的定义和实现,如Student、Course、Class等,无法确定程序的完整性和正确性。

因此,在实际使用时,可能需要对代码进行进一步的优化和改进,增加更多的异常处理和数据校验等功能,同时需要设计和实现相关的类、接口和方法,提高代码的可用性和可维护性。

  • 总结
  1. 逻辑错误:程序中的逻辑错误会导致程序运行不符合预期。例如,条件判断错误、循环控制错误等。

  2. 空指针异常(NullPointerException):当试图访问空对象或未初始化的对象时,会抛出空指针异常。

  3. 数组越界(ArrayIndexOutOfBoundsException):当试图访问数组中不存在的索引位置时,会抛出数组越界异常。

  4. 死循环(Infinite Loop):循环条件设置错误或循环内缺少跳出循环的语句,导致程序陷入无限循环,无法终止。

  5. 内存泄漏(Memory Leak):程序中存在未释放的内存资源,导致内存占用不断增加,最终可能导致系统崩溃或性能下降。

  6. 并发问题:多线程或多进程环境下,对共享资源的访问没有进行正确的同步操作,导致数据错误或竞争条件。

  7. 数据类型转换错误:在不同数据类型之间进行转换时,可能会出现截断、溢出等问题,导致结果不准确或程序异常。

  8. 输入验证不严谨:未对用户输入进行有效的验证或过滤,容易导致安全漏洞或程序崩溃。