题目集1~3的总结性Blog

  1. 前言
    经历三次题目集后,学习懂了很多,尤其是在处理类的时候更加得心应手了。这三次题目集知识点涉及主要在类和方法的使用,题量不算大,但是难度确实逐级递增的。由于三次题目集的前几道题都是花费小部分时间就能解决的,每次的最后一题对我来说都是很有难度的,所以这篇博客就讲解一些我自己对这三道题的理解与总结。三道题都是答题判断程序,并且后一次是在前一次程序作业的基础上不断增加新功能和完善整个程序。在我看来,前两次作业中的最后一道题主要是依靠解析输入的内容并且存储到相应的变量中,将相应的题目答案比较判断以及分数的计算,从而实现答题判断以及分数的输出。

  2. 设计与分析
    第一次作业
    第一次作业的最后一题是相对简单的。

第一题设计与分析:
由于题目比较简单,题目数量是确定的,就直接定义了int questionCount = Integer.parseInt(scanner.nextLine().trim());,所以可以后续可用循环处理,问题序号和问题内容就用hashmap存储:Map<Integer, String[]> questions = new HashMap<>();答案类用了一个数组存储:String answers[] = new String[questionCount];只有一张卷子,且只要输出一份答案,所以并没有建类。对于解析出输入的内容,我采用了split来分割问题内容以及答案,运用Stringequals.()方法处理输出判断结果。这样设计完后就可以直接写代码了。

第二次作业
第二次作业相对与第一次作业删除了问题数量这一变量,完善了整个程序:比如乱序输入,多张试卷多张答卷输入,判断试卷是否有100分,判断答卷的试卷是否存在以及多张试卷的输出等问题。

第二题题目设计与分析:

这次题目要求的功能较为多且杂,所以这一题我使用了类去处理代码。根据题目给出的内容,我将用三个类处理该题:QuestionTestShow。这三个类分别对用题目中的#N#T#S。然后根据题目要求在里面定义相应的变量。

比如Question中有题目内容、题目答案。之所以没有定义题目号是因为我使用了hashmap,利用hashmap中的键值对功能存储题目号和题目类,这样就能形成一个完整的题目集。

题目类见下:

点击查看代码
class Question {
	private String content;
	private String answer;

	Question(String content, String answer) {
		this.content = content;
		this.answer = answer;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getAnswer() {
		return answer;
	}

	public void setAnswer(String answer) {
		this.answer = answer;
	}

}

但是要记得在类中定义类中变量的setget方法和有参定义类方法,便于后续解析内容后放置到相应的变量内。

对于Test类的定义,我在类里增加了两个动态数组:ArrayList qNum = new ArrayList<>();
ArrayList qScore = new ArrayList<>();
由于试卷不仅要存试卷号,还要存储相应题号以及题目的分数,所以我依旧使用hashmap解决这个问题,hashmap中,键存储试卷号,值通过类中的动态数组的调用存储相应的问题号和问题分数,这样即可实现不同试卷对相同题目的不同分数的存储。不过,因为多了一个对于试卷是否满足100分的这个条件有不同的输出,所以新定义一个变量sum去计算该试卷的总分,在main函数中解析内容的时候利用循环即可计算总的分数。

试卷类见下

点击查看代码
class Test {
	ArrayList<Integer> qNum = new ArrayList<>();
	ArrayList<Integer> qScore = new ArrayList<>();

	void addqNum(int num) {
		qNum.add(num);
	}

	void addqScore(int score) {
		qScore.add(score);
	}

	int sum;

	public int getSum() {
		return sum;
	}

}

依旧是和Question相同,需要设置类中动态数组的添加内容的方法以及返回总分的方法,以便后续解析内容的输入和是否输出:alert: full score of test paper1 is not 100 points

对于Show类的定义,我在其中添加了sid这一变量,这是为了区分每张答卷对应的试卷,在Main方法中我依旧是使用了hashmap,这里的hashmap键是按照“1、2、3...n”的顺序存储的,这是为了防止答卷覆盖,如果不这样做,后续输出中重复的答卷只会读取到输入的最后一份试卷,导致输出不完全。而后的答案就存储在动态数组中:ArrayList answers = new ArrayList<>();这样实现答案的存储。

答卷类见下:

点击查看代码
class Show {
	int sid;
	ArrayList<String> answers = new ArrayList<>();

	void addAnswer(String showAnswer) {
		answers.add(showAnswer);
	}

	public void setAnswers(ArrayList<String> answers) {
		this.answers = answers;
	}

	ArrayList<String> getAnswers() {
		return answers;
	}

}

答卷类同问题类和试卷类一样,设置setget方法,多增加一个answers.add(showAnswer);方法,便于后续解析内容中的答案存入答案动态数组中。

第二题类图:

第三次作业
第三次作业相对于上一次作业删减了多张试卷多张答卷的功能,这一点减负了很多,但是又增加了新功能,改动非常大:加入了学生信息(这项功能较易实现,因为并不做什么特别大的改动,像第二次的类设计一样加入学生信息即可,解析学生信息依旧是使用split解决),删除题目(这个比较困难,由于不是在Question类中删除,而是判定其为无效,输出内容也不尽相同,所以这需要新增一个函数将其实现);Show中需要增加学生信息(这一项稍微有些复杂;因为这要多一个循环,判断学生是否存在);Main中的输出内容也需要改动(利用学生类的信息也可以实现输出);Show中的题目变化有点大,不是简单地改动数字就好,而是根据Test中的题目的排序你来确定该学生的总体分数,还要增加题目引用错误提示信息,如果有误,给出相应的输出,记得判断学生学好信息是否有误,有误就输出相应的内容;判断优先级(这需要对三个等级的输出写判断是否存在该错误的判断方法);Question中增加判断是否格式错误的函数,输出相应的内容。

  1. 踩坑心得

第一次作业:
由于相对简单,所以踩坑不多,主要注意分割的时候数组溢出的问题,第一次使用splithashmap有些不太熟悉,对于split的分法以及hashmap以“1”开始计数而不是“0”有些混淆,导致开始时代码错误,经过调试之后得出是数组溢出问题后才解决,输出比较简单所以并没有什么特别的坑。

第二次作业:

相对第一次难度增加不少,尤其是在一张试卷变成多张,一张答卷变成多张,答卷也不仅仅是是输出结果,还有分数以及判断答题的试卷时否存在和试卷是否有100分。但是运用了类使得其结构变得更加清晰。虽然题目乍一看实现起来比较简单,但是功能多且杂,一开始贸然直接开始敲代码必然会导致思路不清晰,最后变量应用出问题,数组溢出,解析内容放置错误等问题。所以在写这一类程序时,最大的坑就是:不思考直接敲代码。其次就是多张试卷多张答卷的覆盖问题,试卷好说,由于试卷号各不相同且只有一张,只用hashmap中的键表示不同的试卷号就OK,但是答卷不一样,不同的答卷可能对应相同的一张试卷,如果不在Show类中定义一个sid类型,运用hashmap中的键来区分每一张答卷,循环时只会输出每张试卷对应的输入的最后一张答卷,导致输出信息有误。此外,对于alert: full score of test paper1 is not 100 points的输入,一开始,我以为是输入几张答卷就要判断几张答卷的,后面才发现原来是只要看有几张试卷就判断几次,这也算是一个小坑,然后就是alert: full score of test paper1 is not 100 points这句话的输入是要在开头,所以一开始就得判断完全,这也是为什么我把sum放在Show中,这样便于输出。还有一个坑就是answer is null的输出,对于这个我也是通过测试点知道的,原来是缺少几个答案就要输出几次,一开始我还以为只要有空输出一次作为标志就行了,所以这个坑也可以避一避。最后,就是The test paper number does not exist的部分了,这部分的输出位置要特别注意,不要放错了导致循环输出或者是一次都输不出,也不要出现句子中单词写错的情况,需要细心的检查,以防万一。

  1. 改进建议

第一次作业
虽然当时直接用hashmap处理确实可以,但其实使用类的话会更好地存储调用以及保护数据,而且分组更加清晰后有助与之后第二次作业的类的增删。建议用类处理这种输入内容分类较为明显的数据。

第二次作业
第二次作业的代码虽然完全正确,但是总体来说存在的问题就是类与类之间没有关系,这样一来,Main函数中的数据内容引用就会出现反复冗杂的情况,每一次的调用内容就需要很长一段代码,而且如果合理调整一下三个类中的变量,是的类中有类,比如:题目类作为试卷类的成员,存在试卷类中,试卷类又作为答卷类的成员,存在答卷中,这样会省去很多不必要的定义以及数据引用时的杂乱。并且,在Main函数中我的循环也是一层叠一层,有些杂乱,甚至使用不当还会导致数组循环栈溢出,整个程序无法运行,这样是非常忌讳的。所以这一次作业代码的改进要求就是删改类中变量名,增加类中有类的情况,使得代码更为连续且有联系,让整体关系清晰明了,结构明晰。

  1. 总结

三次题目集难度递增,每一次的难度升级都在锻炼个人的能力,通过这三次题目集,锻炼了我对类的使用的能力,在处理一个功能较多的程序时懂得合理定义类以及合理调整类与类之间的关系。最大的收获就是思考和画思维导图,以前经常就是看到一个题目,通读一遍,理解题目后就在大脑中构思一个大概就开写,即使中间出现问题也只是边写边解决。现在遇见比较大的程序后,懂得了思考,依旧是在大脑中构思,构思后动笔,在纸上画出思维导图,列出大概的类以及Main函数中出现功能,这样构思的时候就能随时调整整个代码的结构以及遇到问题时并不是随找随改,最后缝缝补补写出一个差强人意的程序。实践出真知,在收获并且运用这个方法后,我的写代码的时间大大缩短了,因为构思清楚了,照着思维导图写,代码很快就能成形,最后将测试数据测试,不断完善细节就OK,大大节省了因中途遇到问题反复检查而浪费的时间。

posted @   陈敏慧  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示