一、作业总结

第一次作业比较简单,都是考察基本语法,意在锻炼java基本语句的使用。在刚开始题目集1的时候我也是刚开始接触java,在这之前,我对java仅会输出"Hello World!",在进行题目集1的时候随着写题目的同时,也学习并慢慢熟练会使用java语法,并到后来题目集2进一步的使用各种算法,题目集3对类的使用。

从结果来看,对题目集3的结果并不是很满意,虽然很长一段时间都在学习正则表达式的使用,但由于思路一直没打通,题目集3完成的并不是很好。虽然题目集3只有三道题,并且前两道题也在最快的时间内把它们完成了,但学的还不够精,钻研的还不够。导致第三题完成并不是很理想。

下面对三次作业做个简要的分析。

1.判断三角形类型(第一次作业)

其实这次作业,完全是考察对if判断语句的使用,题目难并不难,只是需要注意的细节比较多,注意所有的细节才能测试通过。并且通过这道题,我才知道java存在一定误差。

else if((((a==b)&&a!=c)&&((a*a+b*b-c*c)<0.00001))||(((a==c)&&a!=b)&&((a*a+c*c-b*b)<0.00001))||(((b==c)&&b!=a)&&((b*b+c*c-a*a)<0.00001)))

                {

                    System.out.println("Isosceles right-angled triangle");

                }

在数学中,我们都知道三角形的三边a,b,c,若满足a^2+b^2=c^2,则三角形是直角三角形。但是由于java的误差,在条件语句中必须写成a^2+b^2-c^2<0.00001的形式。在这个过程中,我思索了很久,认为自己的代码并没有出现错误了,可有个测试点始终通不过,思考了很久一直没有答案,通过请教同学,才明白其中这一看似小却很大的错误。

2.IP地址转换(第二次作业)

这道题虽然代码我只写了20行不到,可是做这道题我确实是花了大半天时间,究其原因还是因为对很多java中特有的方法不会使用,一直在不停的翻阅查找相关资料用了很长那个时间。这道题后来有和别的同学讨论过,他们不少人用了很实在的方法,很凑巧的答案。可对于以后的学习来说,学会使用相关方法是有好处的。

for(int i=0;i<s.length()-7;i+=8)

            {

                

                System.out.print(Integer.parseInt(s.substring(i,i+8),2));

                if(i!=s.length()-8)

                    System.out.print(".");

                

            }

虽然在查找资料的过程中花费了很多时间,但这个过程中我会使用了Integer.parseInt(String)其作用就是将String字符类型数据转换为Integer整型数据还有stringObject.substring(start,stop)用于提取指定的子字符串也许大家觉得学习这个很是简单,但对于基础不好,理解能力也比较差的我来说,终于学会了它的用法是件很不容易的事。写了不少java代码后,很多算法语句其实是建立在c语言的基础上的,c语言的基础没有打扎实,java代码也并不好写。

3.判断闰年及星期几(第二次作业)

在写这道题之前,我虽然会使用c语言的函数调用,但对于java的调用函数语句并不会。好在题目中所给的使用函数给了很好的提示,所以做题的过程中遇到的困难小了很多。学习使用c语言类似的void(),string(),int(),double()等方法以外,还学会使用boolean类型的方法。

if(isLeapYear(year))

            {

                System.out.println(year+" is a leap year.");

    }

            else

                System.out.println(year+" is not a leap year.");

使用了boolean方法后,语句可以简洁很多,而且在写代码的时候思路非常清晰,不容易出错。

另外,在java中使用方法,少带参数。

Main类结构:

 

 

 

 

 

4.求下一天(第二次作业)

这一题与上一题类似,均为对方法的使用的锻炼。对boolean方法的使用,进一步得到加强。boolean方法的使用使代码更精炼。熟练地使用,会提高我们写代码的效率。这道题对细节考察偏多,要考虑多种情况,而方法的运用提高了效率,使代码看上去清晰易懂。

else if(month == 12)

        {

            if(n < 0)

            {

                if(day - n > 31)

                {

                    year = year + 1;

                    month = 1;

                    day = day - n - 31;

                }

                else

                    day = day - n;

            }

            else

            {

                if(day - n < 1)

                {

                    month = month - 1;

                    day = day - n + 30;

                }

                else

                    day = day - n;

            }

        }

在这里,其实一开始,我并没有考虑到12月份后的下一天,机器是靠代码来运行的,如果想让它知道下一天是哪一天,需要考虑好这些细节,编写出相应的代码命令它去执行。

Main类结构:

 

 

 

5.求前N天(第二次作业)

这道题是前两题的基础,但这道题我的代码着实写的很不好,代码过于简单,而且步骤过于复杂,没有简化。用了过多if...else语句,反反复复,令人看着很费劲。虽然最后能够正确运行, 但由于题目中说明不能用日期类和方法,写这道题的时候,确实更应该仔细,生怕漏了其中一点。做这类日期类题目,不仅需要考虑是否是闰年,还要判断月份,看着题目不难,但其实真正自己写,我认为列草稿是一个比较好的习惯,在稿纸上清晰的画出需要考虑的点,不容易漏,减少提交后答案错误的次数。并且在这道题,不同于上面求下一天,这里需要考虑是几天前还是几天后,根据输入的N的值来决定是过去还是未来。

if(month == 5 || month == 7 || month == 10)

        {

            if(n < 0)

            {

                if(day - n > 31)

                {

                    month ++;

                    day = day - n - 31;

                }

                else

                    day = day - n;

            }

            else

            {

                if(day - n < 1)

                {

                    month = month - 1;

                    day = day - n + 30;

                }

                else

                    day = day - n;

            }

        }

        else if(month == 1)

        {

            if(n < 0)

            {

                if(day - n > 31)

                {

                    month ++;

                    day = day - n - 31;

                }

                else

                    day = day - n;

            }

            else

            {

                if(day - n < 1)

                {

                    year = year - 1;

                    month = 12;

                    day = day - n + 31;

                }

                else

                    day = day - n;

            }

        }

        else if(month == 4 || month == 6 || month == 8 || month == 9 || month == 11)

        {

            if(n < 0)

            {

                if(day - n > 30)

                {

                    month ++;

                    day = day - n - 30;

                }

                else

                    day = day - n;

            }

            else

            {

                if(day - n < 1)

                {

                    month = month - 1;

                    day = day - n + 31;

                }

                else

                    day = day - n;

            }

        }

        else if(month == 12)

        {

            if(n < 0)

            {

                if(day - n > 31)

                {

                    year = year + 1;

                    month = 1;

                    day = day - n - 31;

                }

                else

                    day = day - n;

            }

            else

            {

                if(day - n < 1)

                {

                    month = month - 1;

                    day = day - n + 30;

                }

                else

                    day = day - n;

            }

        }

        else if(isLeapYear(year))

        {

            if(month == 2)

            {

                if(n < 0)

                {

                    if(day - n > 29)

                    {

                        month = month + 1;

                        day = day - n - 29;

                    }

                    else

                        day = day - n;

                }

                else

                {

                    if(day - n < 1)

                    {

                        month = month - 1;

                        day = day - n + 31;

                    }

                    else

                        day = day - n;

                }

            }

            else if(month == 3)

            {

                if(n < 0)

                {

                    if(day - n > 31)

                    {

                        month = month + 1;

                        day = day - n - 31;

                    }

                    else

                        day = day - n;

                }

                else

                {

                    if(day - n < 1)

                    {

                        month = month - 1;

                        day = day - n + 29;

                    }

                    else

                        day = day - n;

                }

            }

        }

        else if(!isLeapYear(year))

        {

            if(month == 2)

            {

                if(n < 0)

                {

                    if(day - n > 28)

                    {

                        month = month + 1;

                        day = day - n - 28;

                    }

                    else

                        day = day - n;

                }

                else

                {

                    if(day - n < 1)

                    {

                        month = month - 1;

                        day = day - n + 31;

                    }

                    else

                        day = day - n;

                }

            }

            else if(month == 3)

            {

                if(n < 0)

                {

                    if(day - n > 31)

                    {

                        month = month + 1;

                        day = day - n - 31;

                    }

                    else

                        day = day - n;

                }

                else

                {

                    if(day - n < 1)

                    {

                        month = month - 1;

                        day = day - n + 28;

                    }

                    else

                        day = day - n;

                }

            }

        }

        System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);

}

但事后,看我之前写的代码,我觉得可以改动下,每次都要重新判断,循环太多,导致代码运行也很慢。

虽然很多时候,我们看着测试点去过,但是测试点非常的细节,也让我在不断提交测试的过程中发现代码的漏洞,从而去改动代码。

6.定义日期类(第三次作业)

刚开始,我是并不会使用类的相关方法,说实话,题目集3 的前两道题我用了整整一天才写完。我刚开始写的时候,因为不太懂,书上的很多代码我并不能全部看得懂,只能一行一行去理解到底什么意思,跟着书上一起打,第一题确实这么过来,第二题增加了点难度,好在题目中已经给了类图,思路非常清晰明确。

Date date = new Date(year, month, day);

        date.checkInputValidity();

定义类非常的方便,语句也只要两行就可以定义一个新的类,并执行类中的相关语句,避免了代码过长看起来不够整洁。

与在编译器上不同,代码复制到PTA上类需要改为static class Date这样子的,否则会编译不通过。

与题目集2不同,这次题目集的题目方法不可带参数。

Main类结构:

 

 

 7.一元多项式求导(类设计)(第三次作业)

这道题思路上是筛选出每一项存入ArrayList数组后,筛选出每一项的系数和指数,进行相关语句实现求导过程,最后以标准形式输出。一开始最大的问题就是对于正则表达式并不会使用,在学习了一段时间后,开始尝试写发现网页版上测试的正则表达式在java代码里实现的并不太一样。正则表达式的学习上的一些难度导致一直没有太大的进展,分离多项式的每一项需要讨论好几种不同的情况,例如某一项不含系数或者指数,某一项是常数项等等。一开始在思路上一直有问题,最后截止了才想起来可以使用的循环方法,希望下一次这道类似的题目和我可以作出改进,好好梳理一下自己的思路。正则表达式,ArrayList数组,需要去熟练使用,题目才可能做出来。另外,这道题,是需要巧妙使用类的,我没有去用到,对于类的使用还不是很会,这是需要着重学习的一个点。

考虑到一些问题,至今还没有办法很好的解决,例如某一项系数为1,暂时只能做到1*x的筛选;对于测试用例中的输入用例3,一直没有成功的匹配最后一项;测试用例中有一个大数测试的点,也不能够通过。

目前有认真在CSDNB站中研读博主的经验,进一步学习类的使用和正则表达式,希望下一次作业不会无从下手,至少能写出一个明确的框架。

Pattern pattern111 = Pattern.compile("([+-]?^0)|(\\^0)|(0\\*)(.*)");

        Matcher matcher111 = pattern111.matcher(fx);

        if(matcher111.find())

        {

            System.out.println("Wrong Format");

            System.exit(0);

        }

该处是筛选多项式是否是非法输入,该处细节多,一开始并不是使用这种语句,后来发现这种更方便,筛选出来更准确。

   public static int num(String str, char c) {

        int n = 0;

        char[] charArray = str.toCharArray();

        for (char item : charArray) {

            if (item == c)

                n++;

        }

        return  n;

}

该处原本思路是查找多项式中的x的数量以确定多项式的项数,最后不知道如何使用。

二、心得

java编译器上写代码再到PTA上提交,需要做出改动,例如不同类如何在同一.java文件中;再者面向对象的思维能力确实不够有待提升;虽然第三次题目集分数不怎么理想,但希望在这次题目集以后,吸取教训,下一次题目集不踩同样的坑,在代码上少走弯路,做到精简代码,语句不繁琐。另外在方法的使用上不够熟练,很多方法并不知道,每次做题时,方法都需要边查边做,希望可以有所改进,做到不看书不查资料能完整的写完一道题。

在编译器上,我其实大部分时候用的都是IDEA,虽然老师说大部分公司主张用的还是eclipse,但我在这么多次使用过程下来,IDEA在使用感受上非常好,对于初学者不是很了解的人来说,用起来可能会比较方便。