PTA题目集1~3总结
作者:互联网
(1)前言
题目集一的题目量大,一共九题,但题目难度不大,适合我们现阶段的学习应用,主要考察的是基础java语法的使用和逻辑运算,例如对if判断语句的使用,浮点数的计算,输出,奇数求和的逻辑算法,字符串和字符数组的使用和判断三角形类型的逻辑思维。
题目集二的题目量不大,一共三题,但有一定难度,一三题较为简单,第二题较难,主要考察了判断语句的加深使用和逻辑运算,例如字母数字的转换,串口字符解析和String的格式判断与内容提取
题目集三的题目量不大,但题目难度大,花费了更多的时间去完成,主要考察了类的使用和对继承的掌握,例如解一元二次方程和日期类设计。
(2)设计与分析
1.串口字符解析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
分析:本题要求输入一段数字,读取这段数字,进行判断过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
设计:先创建二维数组用于存储读取的数字,然后进行长度的判断,在用循环将符合条件的数据输出,如果不符合就输出不合法
主要难点:在于循环条件的控制和数据的输出,需要认真全面详细考虑
2.用类解一元二次方程式
定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。main方法源码:
分析:在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。
- 当输入非法时,输出“Wrong Format”
- 当有一个实根时,输出(2行):
a= 值,b= 值,c= 值:
- The root is 值(保留两位小数)
- 当有两个实根时,输出(2行):
- a=值,b=值,c=值:
- The roots are 值1 and 值2(均保留两位小数)
设计:创建一个类class QuadraticEquation用于接收创建的a,b,c的系数,然后用方法getRoots1和方法getRoots2求得根一和根二,再用getDiscriminant求出discriminant,最后用方法getA,getB,getC返回a,b,c的值
主要难点:类的构建和方法的设定
3.日期类设计
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:
分析:应用程序需要以下三个功能1.求前n天2.求后n天3.求两个日期之间的相差的天数并且不能使用JAVA中任何有关日期的类和方法,进行第一个数字的输入来判断使用三种功能的哪一种,
- 当输入有误时,输出格式如下:
Wrong Format
- 当第一个数字为1且输入均有效,输出格式如下:
year1-month1-day1 next n days is:year2-month2-day2
- 当第一个数字为2且输入均有效,输出格式如下:
year1-month1-day1 previous n days is:year2-month2-day2
- 当第一个数字为3且输入均有效,输出格式如下:
The days between year1-month1-day1 and year2-month2-day2 are:值
设计:创建一个类class DateUtil,定义年月日,再构建一个每月份天数的数组,任何用方法getter和setter进行年月日的赋值和返回,任何用方法boolean checkInputValidity()判断输入的年份是否合法以及方法boolean isLeapYear判断输入的年份是否为闰年,用方法int restday计算输入的年份剩余的天数,用方法DateUtil getNextNDays实现程序的第一个功能,先进行n和剩余天rest的比较,再进行该月和剩余月份天数的比较,进行计算下n天的日期,DateUtil getPreviousNDays求前n天的方法类似,也是先进行年份和月份的比较然后计算前n天的日期,实现程序第三个功能用方法int getDaysofDates,首先对输入的两个日期进行比较大小,然后判断两个日期是否相等,然后再进行两个日期的相减
主要难点:如果日期和n之间或者日期和日期之间跨年份过大,就需要对所跨年份的所有年份进行是否为闰年的判断,然后对二月天数进行调整
4.日期问题面向对象设计(聚合一)
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
分析: 这道题通过题目给出的类图可以很清晰得观察整个程序设计类相互关系的体系框架:
main类中包含main函数,主要用途是接收输入的数据,并通过调用类DateUtil中一些具体的方法实现题目的具体要求(像求当前日期后\前N天的日期、求两个日期之间的天数),可以通过输入选项编号1~3来选择程序计算进入以上三种的哪一种。除此之外,通过调用类DateUtil中的checkInputValidity方法以及自检输入选项编号的检测,实现对输入数据合法性的检测判断,若输入有误则打印Wrong Format;
设计:DateUtil类中包含一个实体类Day day、两种自身的构造方法(默认构造方法和带参构造方法)以及一系列具体的日期相关处理方法(像前面提到的校验数据合法性checkInputValidity()、比较两个日期大小compareDates()、判定两个日期是否相等equalTwoDates()以及求当前日期后\前N天的日期、求两个日期之间的天数等等),同时它还可以对实体类Day进行一些操作,比如返回day的值或者设置day的值。总体来讲日期处理类是整个程序设计的核心部分,各种所需的操作方法大都聚合于此。
剩下部分则是三个日期类:Day类、Month类、Year类。它们分别包含了一些自己私有的属性和方法,像自己的参数值,返回自身的值或者设置自身的值,检测自身参数值的合法性,加一减一以及设为最大值或最小值等等。值得一提的是,在这次日期问题面向对象设计方案中,Day类中包含有一个month实体类,Month类中包含有一个year实体类,即在DateUtil类中,可通过调用类Day再调用类Month最后调用类Year,实现对Year类中的属性和方法的访问和调用。
(3)踩坑心得:
多层嵌套导致逻辑错误(由于数据丢失,无法用图片展示)。
使用字符数组不加单引号。
运行超时的情况
由于eclipse计算存在误差,因此有些计算不能取等,例如题目集一的最后一集判断是否为直角三角形。
(4)改进建议:
简化复杂的程序,多使用类来降低耦合性,最好做到一个方法一个职能,这样方便以后我们修改代码
多使用debug进行调试
(5)总结:
前三次pta的练习可以说是从易到难的一个进程,一方面温习了C以及数据结构相关的知识点,另一方面熟悉了新学到的Java语法和各种常用的方法,从第一次作业基础知识点的应用(判断语句的使用如:if...else,do...while,循环语句for和选择语句Switch),而第二次作业升级为更加复杂的逻辑设计,对判断语句,循环语句和选择语句进行更加复杂的嵌套,直到第三次作业进行类的使用(类中包含多个属性和方法),三次作业从浅入深的引导我了解程序设计的语法和逻辑,再对我进行思维逻辑缜密程度进行强化,目前,我认为自己已经掌握基本语法的使用和逻辑设计,但我仍存在很多不足,对其运用的具体场景和条件以及具体的内部原理了解不够透彻,仍需要进一步学习和实践。对类的使用还不是很清楚,并且对多个类的设计感到陌生,往往在调试过程中遇到有关类的bug,因此要加深这方面的学习。另外要加强书写程序的规范,有时候拿着自己的代码去请教问题,对方都会看不懂我的代码,因此要提高代码的规范性,养成更好的习惯。一方面方便自己修改代码,一方面减少不必要的麻烦。
标签:总结,DateUtil,题目,数据,PTA,日期,方法,输入 来源: https://www.cnblogs.com/lyl2505/p/16124453.html