PTA作业4-6阶段性总结
前言
这是第二次写PTA作业阶段性总结了,经过了几个月的面向对象编程学习,本人更加深刻的认识到了以Java为典型的面向对象编程语言和以c语言为典型的面向过程编程语言在使用过程中的不同之处和侧重点的差异。作为面向对象编程语言,Java在使用时更加注重于对程序结构的设计和巧妙运用链接,如继承和多态的运用、类间不同的关系设计安排、对于属性的封装以及调用等。这很大程度上地展示了Java作为面向对象编程语言所展示出的可拓展性和利于维护性。相比Java,C语言更倾向于对于函数内部算法的安排进行严苛要求,对于结构的要求目前个人所接触到的也仅仅是多文件结构,但是因为没有继承等特性,所以C语言编写的程序往往会出现同样的部分需要多次复写以及可拓展性和可维护性不强的特点,但是相反的,C语言程序的效率是比Java语言要高的。
在近几个月的课程学习的过程中,老师也在有意地帮助我们进行思维模式的转变,通过练习使我们从面向过程思想逐渐转变为面向对象思想,而且也在逐渐的引导我们在编程过程中遵循基础原则,从而增加程序的可读性和加快编写程序的效率,这一阶段对我来说使比较难过的过渡阶段,思想的转变是一时难以完成的,而处在转变过程中也经常会出现思维的混乱,比如在面对某些问题的时候往往会出现“为什么要这么做,按照原来的方法不也能行得通吗,并且还更简单了”的想法,虽然明知道这种想法是错误的,却还是总想着尝试,个人把产生这种想法的原因归结于个人和惰性作祟以及思想模式的未完全转变。
题目集整体分析
对于题目集4-6,个人认为相较于之前的入门阶段,这一阶段的题目明显的偏向于考察对Java中方法的特性和对于程序结构的考察,前两次题目集的题量适中,难度偏向于中低。第三题的题目个人认为虽然只有一道题难度较大,具体的分析我会在后面详细解释。
重点题目分析
1.题目集4 7-2 有重复的数据
这一题在刚入手的时候感觉是很简单的基础题目,因为之前编写过类似程序所以很快就写出了第一版的代码,但是经过提交后却反映出了内存超限和运行超时的问题,在寻找解决方案的过程中个人尝试过很多方法,比如从二重循环减少到单重循环、通过释放属性空间来减少对内存的占用情况、通过在发现不符合要求的情况是提前跳出循环并结束程序等方法,但都没能达到题目要求的内存限度和运行时间,后来在查询资料和询问更有经验的大佬们之后,本人了解到了Hashset的相关知识。这是一种高效的、不重复的储存容器,虽然它是无序的,但是在其中插入链表使用LinkedHashset就可以在保留其无重复元素的特性的同时让其对元素的存储从无序变为有序,这对于在代码中对其中元素的操作和查询也是有帮助的。在此之后本人对代码进行了更改,将其中的数组换为了Hashset,再次提交后果然能在题目要求的时间和内存范围内实现要求的功能。由于本题虽然不难,但却让本人接触了一个新的数据存储类,所以在总结时本人选择将这道题目也算入重点题目进行分析和总结。
错误代码展示:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in= new Scanner(System.in); int a=in.nextInt(); int y = 0; int[]b=new int[a]; for(int i=0;i<a;i++) { b[i]=in.nextInt(); } for(int i = 0;i < a;i++){ for(int j=i+1;j < a;j++){ if(b[i]==b[j]){ y=1; break; } } if(y==1) break; } if (y==0) System.out.print("NO"); else System.out.print("YES"); } }
正确代码展示:
import java.util.HashSet; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int N = input.nextInt(); HashSet<Integer> A = new HashSet<>();//设置hashset属性 for(int i = 0;i < N;i++){ if(!A.add(input.nextInt())){//若添加失败则输出结果退出程序 System.out.print("YES"); return; } } System.out.print("NO"); } }
2.题目集5 7-1正则表达式训练
这道题是一道正则表达式的练习题,需要使用正则表达式对输入的字符串进行匹配和验证。在实际工作中,对用户输入的格式进行验证是非常常见的,能否正确识别并验证数据的格式对于程序的正常运行和数据的有效性非常重要。
正则表达式是一种强大的字符串匹配工具,可以用来匹配和识别特定格式的文本,如邮件地址、电话号码、身份证号码等等。虽然正则表达式的规则有些难以学习,但是学习正则表达式不仅可以帮助我们提高编程效率,还可以帮助我们更好地理解计算机的字符串处理机制。
有关于正则表达式的运用也能增强代码的可读性和简洁性。
通过完成这道题,不仅仅加深了本人对正则表达式的理解和应用,还可以提高有关于字符串匹配的能力,为以后的实际工作和学习打好基础。
代码展示:
import java.util.*; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String QQnumber = in.nextLine(); String Regex = "[1-9][0-9]{4,14}"; boolean Final = QQnumber.matches(Regex); if(Final){ System.out.print("你输入的QQ号验证成功"); } else { System.out.print("你输入的QQ号验证失败"); } } }
3.题目集5 7-5 7-6 日期问题面向对象编程(聚合二)
本题是上次题目集中日期类编程的进一步迭代版本,由于本人在上次的题目中编程的主要逻辑是对单次求下一天的重复调用,所以代码是完全可以无视要求的变化而重复使用的,与上次相比,这次对类的结构进行了进一步的要求,代码的结构也更加的严谨化合理化,日期类代码也在迭代中逐渐想着合乎编程基本原则的方向上靠拢。本题展示出了Java类间关系其中的聚合,即某个类的实例与另一个类的实例之间的“整体-部分”关系,即一个对象包含另一个对象。聚合是面向对象编程中的重要一部分,使用聚合能够降低程序的耦合度,增强程序的灵活性并且能实现对于代码的重复使用,能够实现更好的面向对象的设计,也能实现一些复杂的数据结构(当然数据结构的使用是以后需要学习的暂时对于本人来说还使用不上相关内容),对于聚合的使用也是增强程序可维护性和可读性的一种重要方式。本题和下一题向本人展示了聚合可以通过不同的数据结构来实现。本人也将本题与下一题的对比视为对抄袭现象的一种警告,因为同样运用聚合的类间关系,也可以得出完全不同的代码和解题思路。
7-5类图:
7-6类图:
4.题目集6 7-1 菜单计价程序 与 题目集4 7-1 菜单计价程序
在这两次题目中,本人并未完整地写出符合题目要求的程序,在所以在本次总结中本人对出现这类情况的原因进行了深刻的反思和检讨分析。对于为什么没有写出要求的程序个人总结出以下几点原因:
1:最根本的原因还是本人的编程能力不足,不够丰富的编程经历使我无法根据太长的题目文本总结出题目程序所需要实现的功能和内容,这样就会导致在题目程序的编写初期就会出现方向不明确等重大问题。从而进一步影响到了对于程序结构的设计和后续代码的补充填写,这是最根本也是最重要的问题。
2:逻辑思维不够清晰也是导致本次编程失败的重要原因之一,不够清晰明确的目标以及不够成熟的逻辑思维综合在一起使我在本次题目程序的编写中遇到了很多的困难,比如在实现已经设计好的方法时,经常会出现对于属性的不正确认知,比如错误调用属性和将两个属性的位置和所属类的混淆,这种情况的出现在程序编写中期尤为明显,中期编写时因为已经写出了一部分代码,此时再重新构思接下来的部分或者考虑类间的属性调用时就会混乱,因为已经出现的方法和属性太多了,一来二去就会陷入死循环从而导致无法继续推进编写进度。
3:个人的从众心理和惰性作祟也拖慢了编写的进度,因为其他人也没完成,所以自己也放松了紧张感,同时还抱着“还来得及,明天再写“的拖延症心态,最后一手造就了没完成目标程序编写的结果。
有了这次经历,本人深刻反思了自己的错误并且改正了自己不端正的态度,在后续的学习过程中要保持良好的心态和认真的学习态度来完成接下来的课程目标。
踩坑心得
在本阶段的学习过程中,我曾经犯下了以下的错误,并且得出了一些心得体会:
1. 理解对象和类的概念:
Java是一门面向对象的编程语言,因此理解对象和类的概念是非常重要的。在编程过程中,需要注意类的定义、类实例化、对象引用等方面的问题。
2. 理解数据类型和变量:
Java有很多的数据类型,包括整型、浮点型、布尔型、字符型和字符串等,需要注意不同数据类型之间的转换以及变量的命名和作用域。在编程过程中要注意引用数据类型和基础数据类型之间的差异而避免犯错,
3. 控制流程和函数:
控制流程和函数是Java编程中非常重要的部分,需要掌握的内容包括条件语句、循环语句、递归、函数定义和调用等。
4. 异常处理:
Java具有良好的异常处理机制,在编程中需要利用好这一点,要学会能读懂报错内容,从报错中找到问题的根本原因所在,而不是盲目的逐行检查寻找错误。
5. 编程实践:
实践是掌握编程语言最重要的方式之一,需要不断地练习和尝试,体验Java编程的乐趣并发现更多的问题和解决方案。
总之,要想成为一名优秀的Java开发者,还需要不断地学习和实践,不断完善自己的技能。在学习过程中,需要细心注意一些常见的问题,逐步攀升技能的高峰,最终成为一名优秀的Java开发者。
总结
在本阶段的学习中,个人认识最深刻的一点就是要深入理解Java的面向对象特性,要对Java中的基本概念如多态和继承、类和对象等有深刻的认知并能熟练运用。为了提升自己的编程能力,还需要广泛的学习知识并做好相关总结,做到对于同一个问题要能给出多种解决方案而不是拘泥于一种方案,要对于问题做到举一反三,在经验的积累中形成属于自己的问题解决思路。在平常的编写中也要注意经验的积累,要在日积月累中总结出一套属于自己的可复用性强的代码库,正如老师所说:不要重复造轮子。有自己的代码库能帮助自己提高不少的编写效率。