第一次Bolg作业

一、前言

    第一次Blog作业,这里我对前三次PTA作业做一个阶段性总结。

从难度上来讲,这三次作业呈梯度。也是因为难度逐渐提高,所以从第二次作业开始题量较前一次有所下降,这样也有助于我们有更多的时间思考,学习相关内容。其次,也给我们充沛时间修改我们的代码。

在第一次题集,题目共8道,主要考察我们对运算的熟练度,以及对数的类型的处理(整型、浮点型)。第二次题集中,题目共5道,主要考察学生的思维逻辑及运算能力,题目集可以参考教材中的类与对象的相关内容。第三次题集中,题目共3道,介于极少数人在题目集二中用到类与对象的知识点,所以这次强制性要求学生使用类与对象。所以这部分的难度较前两次有巨大提升。

 

二、设计与分析

题目集一:题目集1主要考察我们对数的类型的处理。

这次题目集最有难度的是7-4和7-8。7-4的算法很清晰也很简单,但难度在于代码量有点大(较于本次题集的其他题目)。而7-8这道题,就是一连串的if-else,难度在于个层次的关系需要同学们分清楚,不能漏了情况以及重复某种情况。

题目集二:题目集二在题目集一的基础上,难度有了较大的提升。这次不单单有对数据类型的操作,还有了对字符串的相关操作。并且,在这次题目集中,老师提示我们参考教材中类的相关知识。这里我主要分析一下7-4和7-5。从考察的方面讲,这两题所考查的知识点基本一致。但不同的是,7-4中有一些方法的提示:

public static void main(String[] args);//主方法

public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型

public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值

public static void nextDate(int year,int month,int day) ; //求输入日期的下一天

 

我在7-5中也用到了这些方法,这无疑大大提高了我写代码的效率。另外这两题比较难的一个点就是闰年和平年2月份的相关操作,这需要学生处理好条件之间的对应。

  题目集三:鉴于题目集二中所谈及到的类和对象的相关操作,这次的题目集对这一块的知识点有了一个巩固的意义。虽然只有三道题,但代码量的要求很高。这里我对这次题目集的7-2,和7-3分析一下。

  7-2:

   

 

从题目的需求而言,这道题和题目集二中的7-4是一样的,但不同的是这次的题目强制的的需要我们用类的相关知识,特别是类的封装性(无参)。

  7-3

1)实现功能 ⚫ 判定输入表达式是否为正确的表达式;

2) ⚫ 若输入为正确表达式,则计算其导函数并按要求输出。

3)输入输出规则 ①输入规则 在一行内输入一个待计算导函数的表达式,以回车符结束。②输出规则

4) ⚫ 如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。

5) ⚫ 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: ➢ 结果不需要排序,也不需要化简; ➢ 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”; ➢ 当输出结果第一项系数符号为“+”时,不输出“+”; ➢ 当指数符号为“+”时,不输出“+”; ➢ 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。 输出格式见输入输出示例。

6)编程时务必考虑面向对象中的封装性本题目中的应用。

 

7-3的题除了锻炼学生的逻辑思维能力,还锻炼了学生的自学能力(学会运用正则表达式)。

 

三、踩坑心得:

这里我分享一下在敲写代码的过程中我所遇到的问题及自己如何解决的。

  题目集一:

      在写税率那道题时,由于我在设置数的类型时,都用了int型

相关代码如下:

       int a=in.nextInt();

int b=in.nextInt();

int c = 0;

报错如下:

 

   我便把c改为double型,之后便顺利运行。

 

7-8判断三角形中:我遇到的不是运行报错。而是有一个测试点过不了。

  刚开始以为老师给的数据有问题。最后通过查找,发现自己在运算的结果上的精度不够(我用了float型)。所以我便把代码中判断是否为直角三角形的语句a*a+b*b>c*c改为a*a+b*b-c*c<0.000001。顺利通过所有测试点。

 

题目集二:

   在处理7-1 IP地址转换时,我起先使用创建字符串数组的方法来对01这样的字符串进行操作。但发现这样写代码的话,内容太过繁琐。不利于我之后代码的调整以及修bug。通过查阅资料我得知可以用在母串中提取子串的方法来对每一段字符串进行操作。

  首先我输入字符母串:String  b = input.nextLine();

 在进行操作时:String z = b.substring(0,8);通过这样的方法来截取子串。

通过子串中的每个字符是否是‘0’和‘1’将它们转化为int型的数。再用

d1 = Integer.parseInt(n,2);的方法直接将数字字符串直接从10进制转化为二进制数。

   在处理最后三道日期类题时:题目中所提示的那些方法让我联想到了C语言中的调用函数的相关内容。并且和那一样在最开始写了调用类型,代码如下:

 

 

在这是就有了报错:

 

通过查找资料,我发现这与C语言的调用函数是不一样的,Java在使用方法是并不需要对方法声明。于是我把前段代码删了,运行也没有了问题。

但是在提交待代码时,我有闰年2月的测试点没过,通过反复查找,发现我在判断非法值时单单对day的上限判定,并没有加下限(而题目中的下限是大于0的整数)。

  题目集三:

这里最大的难点是我之前没有用到过类的相关操作,以及正则表达式;

后来通过查找资料,类的相关操作可能就是模块化编程。

这里我主要说一下第三题:

(1)在做这道题时,正则表达式的作用极大,而这个知识点,需要我们自学,通过寻找匹配项来进行相关的操作,是正则表达式的核心。

(2)在写算法时,我遇到了一些问题:

1、当我用intlong型处理整数时,当这个数的位数超过了19位,则无法进行运算,通过查找资料。我了解到有一种专门处理大数的方法,就是BigInteger;这个用法可以用到无限位的整数。

2、因为输入的格式是字符长串,除了用正则表达式匹配出系数和指数,但这时的系数和指数还只是字符串,我需要一种直接将数字字符串转化为整数型的方法。通过上B站,我学习到类似于

long w = Long.parseLong(b);

BigInteger w2 = w1.multiply(w);

的语句可已将数字字符串直接转化为数字,而

String b3 = String.valueOf(w2);的语句可以将一整型的数转化为数字字符串。

3、在写第三题的时候花的最长时间便是关于正则表达式的相关内容,

当然,我在翻找资料的过程中得到regex101.com这样一个书写正则表达式的工具性网站。这对我在匹配字符串的过程中帮助巨大,修改匹配方式更是不必说。附上一张我在使用过程中的图片:

 

四、改进建议

(1)前面提到我在题目集一三角形的类型判断中存在精度不够的问题并且用a*a+b*b-c*c<0.000001的方法改进,其实不需要这样,我在前面设置a,b,c类型时用的时float型,其实可以把a,b,c都初始化为double型。应为double精度更高。

(2)在题目集三的第三题中我学习到了直接将数字字符串转化为整数的方法:long w = Long.parseLong(b);

其实可以运用到题目集二中IP地址转换的题,在截取子串后,直接通过这样的语句将子串中的‘0’和‘1’转化为数字01

(3)题目集3中,在判断(f[j].matches("[-]*[+]*x\\^[-]*[+]*[0-9]*"))的情况时,我将数字字符串转为了long型的数。其实这里有一个漏洞,当出现x^t,-x^t时,如果t是一个位数超过20位的数字字符串,我的程序是不能运行的。最好的改进方法是将t也用BigInteger转换一下。

五、总结

  

对于前三次的题目集我有了一些心得:

(1)在这之前我虽然知道float和double的精度上存在差异,但在之前写题时感觉 并不明显,知道这次的三角类型判断,我有了具体的体会。

(2)在使用类的知识结题时,目前我对类的封装性有了较为具体的体会。

    一个类作为一个封闭的模型,与外界的联系只在于和它有直接联系的另一个类,每个类就相当于一个小黑盒。从外界是无法感知里面的情况的!

(3)题目集三给我的直观感觉是我需要培养自学的能力,就正则表达式而言,我要知道正则是在哪个包的方法:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

其次,我要了解正则使用的语法。

题目集三的求导题除了正则表达式和类的封装性,还有用到大数BigInteger方法。

建议:

(1)在做题目集三求道题时,最后一个综合性测试点老师给的数据是有问题的,比如我要对-2*     x^-2+  5*x^12-4*x+   4*x+    12进行求导时,

   本来正确答案应该是4*x^-3+60*x^11-4+4

但真正能过测试点的却是:4*x^-3+60*x^11-44

原因在于当一次求导以后该项为正数则不输出+’号,这显然是错的。

     2)老师讲课可以风趣一点,因为每次听课都很压抑,说白了就是压力。因为害怕自己过不了这门课,所以压着呢。

posted @ 2021-04-03 23:42  封xin  阅读(100)  评论(0)    收藏  举报