PTA前三次大作业总结

1.前言

知识总结:
1.StringBuilder是一个可变的字符序列,与StringBuffer类似,但不保证同步(即线程不安全)。
它被设计作为StringBuffer的一个简易替换,适用于单线程环境下字符串的频繁拼接和修改操作。
在大多数情况下,由于少了同步的开销,StringBuilder在性能上优于StringBuffer。
2.append():用于向StringBuilder对象追加字符串或其他类型的数据。可以连续调用以拼接多个字符串。
3.toString():将StringBuilder对象转换为String类型的字符串副本。
4.Matcher类是对输入字符串进行解释和匹配操作的引擎。在使用Matcher类进行匹配之前,你需要首先通过Pattern对象的matcher()方法获取一个Matcher对象。然后,你可以使用Matcher类提供的各种方法来进行匹配操作,如find()、start()、end()等,这些方法可以用于查找符合正则表达式的子串并获取其起始位置和结束位置。
5.split函数是一个用于对字符串进行分隔的重要工具。该函数返回一个下标从零开始的一维数组,该数组包含根据指定分隔符拆分的子字符串。
在使用split函数时,需要注意以下几点:
对于特殊字符(如竖线“|”、脱字符“^”、美元符“$”、星号“*”、点号“.”、圆括号“( )”、反斜杠“\”和斜杠“/”等),它们都是正则表达式的一部分,因此如果需要将其作为分隔符,需要在它们前面加上反斜杠“\”进行转义。注意,在Java字符串中,反斜杠本身也需要转义,因此实际上需要写为“\”。
当字符串中有连续的分割符时,split函数会在这些连续的分割符之间产生空字符串。例如,字符串"a,,b"在按照逗号分隔时,会产生一个包含三个元素的数组:["a", "", "b"]。
如果分割符出现在字符串的开头,那么会产生一个或多个空字符串作为数组的元素。
6.charAt是一个用于获取字符串中指定索引位置字符的方法,charAt方法返回的是一个字符,这意味着你可以直接将返回值赋给一个char类型的变量,或者在需要字符操作的地方直接使用它。
7.private成员只能在类内部访问。
public成员可以被所有其他类访问。
protected成员可以被该类自身、子类以及同一包中的其他类访问。
默认访问控制符意味着成员只能被同一包(类库)中的类访问和调用。

题量:
前三次大作业的题量有点多。
难度:
前三次大作业说难不难,不难也难。如果只是通过给的样例进行输出,不难,每个例子都能输出正确结果,但是答案测评有很多没有例子的测试点,让人摸不着头脑,测试点通过的人不知道为什么过,测试点没通过的人不知道哪里错了,使得分高的人无从教起,分低的人无从改起,再改代码时迷茫占大多数时间。

2.设计与分析



设计思路:因为输入中给了题目的数量,所以我通过构建字符串数组以及用正则表达式来获取题目和答案信息,并通过循环嵌套对题目号和答案进行匹配。
一个数组用来储存所有题号,一个数组用来储存所有题目,一个数组用来储存所有标准答案,最后一个数组储存答卷。通过对题号的匹配来达到答案的顺序输出。
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容。
踩坑心得:StringBuilder对象并不是字符串,需要用toString将其转为字符串形式。无法用split直接对StringBuilder进行分隔。对数据储存的区分不合理,导致判断顺序过于复杂。
改进建议:合理储存信息,做到逻辑清晰。

设计思路:因为不确定输入的数量,我便以行为单位对每一行输出进行判断并定义4整型为0,如果该行输入为#T类型,则对应整型+1,其他同理,输入为“end”则跳出循环,就可以得到各类型输入的数量,以此数量为数组大小,创建3个数组分别储存#N,#T,#S的一行的信息,用正则表达式提取#T题号的分数,若总分不等于100,输出alert: full score of test paper答卷号 is not 100 points。用正则表达式提取题号并用循环将#T中的题号与#N进行匹配,匹配成功后,再将答案进行比对,若不成功,输出The test paper number does not exist。
创建一个StringBuilder对象;
若答案无法比对,输出answer is null,StringBuilder对象追加0;
若答案比对不相等,StringBuilder对象追加0;
若答案比对相等,StringBuilder对象追加相应分数;
总分输出时,输出StringBuilder对象及总分即可。
踩坑心得:正则表达式的知识点要记牢,才能成功获取正确信息。
改进建议:循环过于复杂,逻辑表现不够清晰。

设计思路与第二次大作业基本一致,多出了删除#D和学号#X,同时#S多了判题程序,用正则表达式判断输入是否符合格式,#T匹配后,在#N与#S匹配前添加循环匹配#D与#N来判断是否删除,对#S再添加循环来实现判题顺序。
踩坑心得:数组在处理多数据时很麻烦,应为多种信息相匹配导致循环过多,使得我在改代码时要一次次缕清思路,头痛欲裂。
改进建议:多使用类或列表对信息进行储存。

3.总结

在开始学习Java时,我首先掌握了Java的基本语法,包括变量、数据类型、运算符、控制流语句等。Java是强类型语言,对数据类型有严格的要求,这有助于我养成良好的编程习惯。同时,我也学习了Java中的类与对象,理解了面向对象编程的基本思想。
同时,我学会了java基本的书写格式,大致明白java运行的逻辑思路,学会了调试,培养了我的自学能力。层层递进的作业模式让我初次体会到中长代码的书写过程--不断地改进并添加功能,让我明白代码的可读性也很重要。同时在进行中长代码的工作中,基本的框架至关重要,影响着后续的改动。
面向对象编程是Java的核心,但在学习过程中,我发现自己对类和对象的理解还不够深入。尤其是在处理复杂的继承关系和实现多态性时,我时常感到困惑。为此,我需要加强对面向对象编程的学习,通过实践项目来加深理解。
在Java学习的过程中,我发现自己的学习方法和习惯还存在一些问题。比如,有时我会过于依赖教材或网上的教程,而忽略了自己的思考和总结;有时我在学习过程中缺乏计划性,导致学习进度缓慢。为了改进这些不足,我需要调整自己的学习方法和习惯,注重培养自己的独立思考能力和自主学习能力,同时制定合理的学习计划,确保学习进度的高效推进。
总的来说,Java学习的前期阶段是一个充实而富有挑战的过程。通过不断学习和实践,我逐渐掌握了Java的基础知识,并为后续的学习打下了坚实的基础。我相信在未来的学习中,我会继续提升自己的编程能力,探索更多的Java应用领域。
对于作业方面,我希望示例的类型能更多一些,能让我更容易明白自己代码的错误与缺陷。

posted @ 2024-04-23 19:33  无法离地的飞行  阅读(25)  评论(0)    收藏  举报