PTA-Blog-1.
在这次pta的大作业中,题目难度依次递增,第三次作业的复杂程度多次让我怀疑人生。总共十六道题,前面十道题让我们小试身手,让我们初步了解java的基础编写方法,输入输出,以及统一的
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); in.close();
在答题期间学习了charAt()函数的使用,可以用来判断输入的数值,具体在某一位,例如1234的charAt(1)为‘2’;如需使用数学方法的话,就要在方法面前加Math以正常运行,substring的截取字符串,indexof的寻找目标第一次出现的下标,split的字符串切割,强制转换类型,matches的匹配方式,以及正则表达式,这个东西属实难搞,目前只能依葫芦画瓢画出个大概,例如
if(!str[i].matches("^[-+]?([1-9]\\d*|0|0\\.\\d+|[1-9]\\d*\\.\\d+)$"))
这一连串稀奇古怪的符号就是判断是否为正负数,
面对这些题目时,我们脑中应首先对代码整体进行构思设计,就论作业三的7-2,要进行正常的运行,首先要进行格式排查,输入点的数据是否正确,在进行选项要求的操作时,是否达到进行操作的要求:点的数量以及选项本身,在这些基础上再完成需求,这就需要列出多个类进行操作,才会使代码本身更具可视性,更显得有条有序不紊乱。

2-7-2因过程较简单直接,感觉无创建类的必要,所以就没有创建
3-7-1类列表
-
shu():判断点的数量
-
xing():判断输入数据形式是否正确
3-7-2类列表 -
shu():判断点的数量,m的值:2为两个点以此类推,0为输入点不符合要求
-
chuiju():输出第一个点与另外两点连线的垂直距离
-
gongxian():判断三个点是否在一条线上
-
px():判断前两个点所构成的直线与后两点构成的直线是否平行
3-7-3类列表 -
shu():判断点的数量
-
xing():判断输入数据形式是否正确
-
tri():判断三角形类型
-
zhou():计算周长
-
mian():计算面积
-
zhong():计算重心坐标
-
jiao():判断角的类型
-
jd():交点数量
-
inside():判断点是否在三角形内部
以上类均服务于main(),类似于上图
在码的时候,不是所有的时候都能跑对方向,以3-7-2为例
在未进一步了解正则表达式的时候,输入的数据根本无法匹配,导致后面的运行不成功,一开始还不知道具体要怎么分辨输入了几个点,到后面试着换一个思路,不去纠结数字的个数,而是着手于点坐标之间所必需的‘,’和两个点之间所需的‘ ’,所以使用
`String[] str=x.split(" ");
String[] str1=str[0].split(",");
String[] str2=str[1].split(",");
String[] str_=str1[0].split("😊;double x1=Double.parseDouble(str_[1]); double y1=Double.parseDouble(str1[1]); double x2=Double.parseDouble(str2[0]); double y2=Double.parseDouble(str2[1]);`
来区别点个数;一开始也一直在试着输入数据后,先进行分辨数据格式,再区分点个数,然后进行具体操作,但这样,若格式和点个数都正常,选项不符合点的个数的话,就会先进行一些无意义的操作,不如个个分析,例如选项一的操作:
if(x.charAt(0)=='1') { if(m!=2) System.out.print("wrong number of points"); else if(x1==x2&&y1==y2) System.out.print("points coincide"); else if(x1==x2) System.out.println("Slope does not exist"); else if(!x.matches("^1:([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?" + "\\s([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?$")) System.out.println("Wrong Format"); else{ System.out.println((y2-y1)/(x2-x1)); } }
在分析选项操作后再依次进行判断(m为之前判断点个数的结果),这样做还有一个好处就是在出问题后,可以知道具体哪里出错了,不过因为都是类似的格式,出错概率极低,ctrl c+ctrl v即可,在创建第四个点double x4=Double.parseDouble(str4[0]);double y4=Double.parseDouble(str4[1]);的时候,写成str[3]导致后面第四和第五的操作失败,好在多次检查后,发现问题改正,pta凭空多了十几分:)
在创建类的时候,一定要注意返回值,这里m是int类型,创建的类也应是int类型,不然就只会显示
也不能使用void类型,在这里是需要返回数值的,而且是需要传形参的,String x必不可少需要代入所输入的数据才能进行操作
int m=shu(x); public static int shu(String x) { int i,m=0; for(i=0;i<x.length();i++){ if(x.charAt(i) == ','){ m++; } } return m; }
一开始写的if(x.charAt(0)=='1')之类的,依旧考虑不完善,还应考虑不为1,2,3,4,5,其他数字其他字符出现的情况,这时候就应该报错,单论正确的可不够。
至于编码改进,以3-7-2为例,可以将类分的细致些,主函数只做基本操作,剩下的交给手下的类来做,在每个类后加上注释会更易理解操作,使程序猿思路更清晰,在正则表达式的运用上,应又更简略的方法,不是像我这种到四个点的时候就得
([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?" + "\\s([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?" + "\\s([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?" + "\\s([+-]?\\d+)(\\.\\d+)?,([+-]?\\d+)(\\.\\d+)?$")
而应通过判断所需点的个数,再以i计算个数,用循环来进行操作,虽然这样要思考的略微多一点,但是收益远比死脑经套个数高。
The last but not least(总结):
都说熟能生巧,单纯的看mooc上翁恺老师的课和线上教学是远远不够的,这门科目思维能力固然重要,但是好的动手能力也不可缺少,在做完这三次的练习题后,勉强算是融会贯通目前学到的知识吧,做题过程中也让我明白,代码世界还很大,等着我们探索,每一道题都是外来的挑战,只能通过不断挑战去解决问题,收获最大的当然是几个函数的用法以及正则表达式,短短的matches巴拉巴拉一堆字符,就能美化if else,九九归一岂不美哉,虽然运用的还不是很流畅,但是熟能生巧嘛,多用几次就会了,在我看来,java,c语言都是一个模子刻出来的,大体还是相近的,并不是说学了java就只能通过java解题,这几种语言只是提供了多种方法,各有利弊,在学习过程中若有时间应多尝试,多亲身经历这几种的区别会让人印象更深刻。在这之前,我是完全不希望写多个类的,可以一股脑写下去的东西为什么要分开来,但是随着代码的复杂程度越来越高,出错的概率也会加大,出错要怎么找呢,只能一个一个尝试,换做之前,找出其中一个错误,要花费大量时间,因为不知道具体错在哪,而现在,分类把错误安排的明明白白

查找错误的时候直接一个类一个类测试,而且类的名称根据自己的理解命名,对自己来说是通俗易懂的,总之分类是好处远远大于弊的。当然,分类的前提是先得把题目需求理解通透,思路清晰写起来自然行云流水。
再说说最近的疫情吧,对于我来说,这门课线上好似比线下效果更好,也不是说线下教学环境不好,线上的时候,可以和室友一起讨论,而且也不用担心讨论声音过大影响到身边的人,便于沟通,线上组织,同学都会很积极的参加。任课老师是目前见过老师最为负责的,每节课对教学重点极其清楚,知道如何引导学生进入这个题目链,还会引导学生思考,改变学生看待问题的思考方式,这是我较为喜欢的,学习别人的思考方式能够让我们走更少的弯路。作业的话,难度较大,时间不是很充裕,希望能多加些时间,或减少些难度。
这次的blog就写到这了,毕竟也是第一次写还不太了解规则,希望下次多多改善吧(如果有的话)。
浙公网安备 33010602011771号