作业1-3
题目集1-3作业总结
(1) 前言
在题目集1-3中,题目集1的作业较为简单,我们只需通过Java对输入数据进行一个简单处理之后再输出相应的数据即可。题目较为简单,但在完成过程中依旧遇到一些问题。题目集2 主要考察的是对于类与数组的运用,这次的题目难度有了不小的提升,且题量也不小,在完成过程中遇到了不小的困难,且本人最终也有部分题目未得到完美的解决。第三次作业是对类的运用的进一步深入,题目的难度进一步加大,题量有所减少,但由于难度的提升本人最终没能很好的完成。
(2) 设计与分析
题目集2 7-1
这段代码实现了一个简单的学生成绩管理程序,主要功能为输入五个学生的基本信息和成绩信息,计算并输出每个学生的总分和平均分。
具体分析如下:
定义Main类,包含学生的基本信息和成绩信息,以及计算总分和平均分的方法,使用构造函数进行初始化。
在main方法中,创建一个List对象用于存储学生信息,同时创建一个Scanner对象用于输入学生信息。
使用for循环读取五个学生的信息,将其封装成Main对象,并加入到List对象中。
使用DecimalFormat类对平均分进行格式化,保留两位小数。
遍历List对象,依次输出每个学生的信息,包括学号、姓名、总分和平均分。
7-7
这段代码实现了一个简单的点餐程序,主要功能为输入菜品名称和数量,计算并输出总价。
具体分析如下:
定义Dish类,包含菜品名称和单价两个属性,以及获取指定份量的菜品价格的方法。
定义Menu类,包含一个Dish数组属性,以及根据菜品名称查找Dish对象的方法。
定义Record类,包含一个Dish对象和点菜份量两个属性,以及获取点菜总价的方法。
定义Order类,包含一个Record数组和记录点菜数量的属性,以及添加点菜记录和计算点菜总价的方法。
在main方法中,创建一个Dish数组对象和一个Menu对象,用于初始化菜单信息。同时创建一个Order对象和一个Scanner对象,用于进行点餐和输入操作。
使用while循环读取用户点餐信息,并调用Order类中的addARecord方法添加点餐记录。
调用Order类中的getTotalPrice方法计算并输出点餐总价。需要注意的是,在记录点餐数量时,需要使用count变量记录已经点了几个菜,而不是使用Record数组的长度。
(3) 踩坑心得
在题目集1的作业7-5游戏角色选择该题目中,在对Wrong Format的输出条件中出现了判定错误,出现了一次输出出现两次Wrong Format的输出,究其问题是选择使用了switch语句,在两个switch语句中的两个defalut中都有Wrong Format的输出从而出现了它的两次Wrong Format。在7-7判断三角形类型中,对等腰直角三角形的判断条件设定错误,经过室友指点后改成了正确的判定条件。
这是该题未改正前的源码:
import java.util.Scanner;
public class Main{
public static void main(String[]args){
Scanner input = new Scanner(System.in);
String race=input.next();
String juese=input.next();
switch(race) {
case "1":
System.out.printf("人类 ");break;
case "2":
System.out.printf("精灵 ");break;
case "3":
System.out.printf("兽人 ");break;
case "4":
System.out.printf("暗精灵 ");break;
default: System.out.printf("Wrong Format");return;
}
switch(juese) {
case "1":
System.out.printf("战士");break;
case "2":
System.out.printf("法师");break;
case "3":
System.out.printf("射手");break;
default: System.out.printf("Wrong Format");return;
}
}
}
出现的问题是在两次选择的错误时会输出两个Wrong Format
这是改正后的源码:mport java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建数组
String[][] names = {
{" ","人类", "精灵", "兽人", "暗精灵"},
{" ","战士", "法师", "射手"}
};
Scanner scanner = new Scanner(System.in);
int OptRace = scanner.nextInt(); // 种族
int OptRole = scanner.nextInt(); // 角色
// 判断是否超出范围
if (OptRace >= 1 && OptRace <= 4 && OptRole >= 1 && OptRole <= 3) {
String RaceName = names[0][OptRace];
String RoleName = names[1][OptRole];
System.out.println(RaceName + " " + RoleName);
} else {
System.out.println("Wrong Format");//超出范围
}
}
}
在题目集2的作业7-2中由于该题复杂了一些,有了更多的错误:
错误1:输入格式的处理问题。在使用line.split(" ")将一行输入按空格分隔成字符串数组时,没有考虑到可能存在多个连续空格的情况。
改正方法:使用正则表达式line.split("\\s+")来处理输入,可以确保在连续空格的情况下也能正确地分隔字符串。
错误2:浮点数精度问题。在计算平均分时,使用了Math.round()进行四舍五入处理,但没有将结果保存为浮点数类型。
改正方法:将平均分的计算结果保存为float类型,以避免精度问题。即将averageScore的计算语句改为float averageScore = Math.round(averageScore * 100) / 100f;。
错误3:数组越界问题。在创建学生对象时,没有考虑到输入可能不足三个学生的情况,而直接使用了固定长度为3的学生数组。
改正方法:在使用学生数组之前,先统计输入的学生数量,然后根据数量创建对应长度的学生数组。可以使用动态数组(如ArrayList)来存储学生对象,或者通过循环判断输入是否结束来确定数组的长度。
在7-3有重复的数据我首先就是对有重复数据的查找方法的选定遇到了困难,前两种你方法要不就是空间超额,要不就是时间超额,最后改用哈希表的方法解决,除此之外还有以下问题:
在完成该代码时可能会犯以下错误:
错误1:输入错误的数据类型。在使用scanner.nextInt()读取输入时,没有检查输入是否为有效的整数。
改正方法:在读取输入之前,先使用scanner.hasNextInt()方法检查是否有下一个整数可供读取。如果返回true,再使用scanner.nextInt()读取输入;如果返回false,可以给出相应的错误提示或默认处理。
错误2:忽略对输入大小的验证。在创建BloomFilter对象时,没有验证输入的大小是否合适。
改正方法:在创建BloomFilter对象之前,先对输入的大小进行验证。可以检查输入是否大于0,并根据实际情况设置一个合理的上限值。
错误3:哈希种子生成错误。在generateHashSeeds方法中,哈希种子的生成方式不正确。
改正方法:可以考虑使用随机数或其他更有效的方式生成哈希种子。可以使用Random类来生成随机数,确保生成的种子数具有足够的随机性。
通过以上改正,可以避免输入错误的数据类型、忽略对输入大小的验证以及哈希种子生成错误等问题,使代码更稳健和准确。
题目集3的作业7-2,该题目困难较大,以至于在关闭之前未能完成该题,该题的苦难有:
1、 结构较为复杂,对类的使用要求较高。
2、 输入信息的处理:程序需要能够正确解析和处理输入的课程和成绩信息,包括对输入格式的验证、字符串的分割和类型转换等。在处理输入信息时,可能会遇到格式错误、数据类型不匹配、数组越界等问题。
3、 数据结构的设计和管理:程序需要将输入的课程和成绩信息进行存储和管理,包括课程信息、学生信息和班级信息。在处理成绩平均分和班级总成绩平均分时,还需要考虑如何进行数据的累加和统计,并确保数据的准确性。
4、 异常情况的处理:程序需要能够正确处理各种异常情况,包括重复的课程/成绩信息、课程性质和考核方式不匹配、成绩超出范围等。需要根据具体情况进行异常处理,并输出相应的错误信息。
完成过程中的错误有:
处理输入信息时,需要进行字符串的分割和类型转换。在此过程中可能会出现数组越界、字符串转换异常等问题,需要根据具体情况进行异常处理。
解决方法:使用try-catch语句捕获相关异常,并输出相应的错误信息。
对于重复的成绩/课程信息,需要忽略后面输入的信息,只保留第一个。
解决方法:使用HashMap存储已输入的成绩/课程信息,在处理新输入信息时判断是否已存在,如果已存在则忽略。
在计算平均分时,需要注意整数相除可能会出现精度问题。
解决方法:将总成绩和总数都转换成double类型再进行相除,最后再强制转换成整型输出。
在处理班级平均分时,需要根据学号前缀判断班级号。
解决方法:使用字符串截取函数substring()获取学号前缀,作为班级号进行统计。
在处理异常情况时,需要输出具体的错误信息。
解决方法:使用System.out.println()语句输出相应的错误信息。
(4) 主要困难以及改进建议:
目前我的问题还是只会较为简单的类的应用,对于复杂的类的使用常常没有头绪,或者是有一点思路但是编码能力无法支撑自己完成自己的想法。就是因为有这些问题导致自己无法较好的完成题目集三的7-2.还有就是自己积累的排序以及查找方法较少,遇到此类问题是只会暴力算法,导致空间时间有巨大损失。所以我认为我需要进一步的加强自己对类的理解使用,并且积累一些常用的方法,增强自己的编码能力。
(5) 总结
在完成这三次题目的过程中,我已经掌握了Java基本的一些功能,输入输出、类与数组的简单应用以及一些简单的排序、查找方法。但在此过程中。我也发现我存在很多问题,对复杂类的使用毫无头绪,无从下手。因此我认为我需要多编码较为复杂的类的问题,让自己有一套方法能够解决该问题,进一步增强自己的编码能力,多掌握一些方法。我有一个建议就是希望单个题目分数占比不要太大可以有所比重但是不要差距过大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!