PTA题目集1~3总结

PTA题目集1~3总结

目录

  1. 前言
  2. 设计与分析
  3. 采坑心得
  4. 改进建议
  5. 总结

一、前言

  前三次的作业是迭代的,从复杂程度上来看是越来越难越来越复杂的,每次题目集涉及到的知识点也都不太一样。对我来说,题目集3中的7-3确实非常有难度,到了最后也没能把题目完全写出来。因为题目越来越难了,所以在题目的量上每次也都有减少。

   1.第一次题目集

    这次的题目集是第一次给我们写,难度不大,但是题量还比较多,有八题,主要还是判断语句以及数组的使用。和之前学的C语言差别不是很大,所以这次的题目集也算是让我们从C语言过渡到Java中来,自己慢慢摸索了一下java的语法使用,刚开始的时候还是不太习惯Java语法的使用,但是后面用多了写多了也就慢慢习惯了。毕竟接触任何东西都是要从不习惯到习惯,从陌生到熟悉的。

   2.第二次题目集

    第二次题目集主要考验的Java方法的使用,题目量和第一次比较要少了三题。在Java中的方法类似于C语言的函数的使用,用法确实也差别不大。在写题目集二的时候,最后的三题都和日期有关,能把第三题写出来的话后面问题就不是很大了。但是由于我自身的原因吧,掌握的方法不够而且题目要求不能使用和日期有关的类和方法,这就使得题目写起来更加的麻烦。但是不用和日期有关的类和方法的话就更加锻炼我们的逻辑思维。

   3.第三次题目集

    第三次题目集虽然只有三道题,但是难度有了明显的提升,和第一次第二次相比,要难得多。可能是因为第三次题目集接触了新知识类和正则表达式。类和C语言中的多文件有点相似,但是在上个学期我们并没有学习多文件,所以类的使用在最开始对我来说还是有点困难的。正则表达式是第三次题目集中最后一题要用到的东西,之前从来没有接触过。在通过在网上查找资料自学之后还是能稍微使用来判断字符的。第三次题目集中最后一题我并没有写出来,只是判断了表达式的对错,对于简单多元式求导还是没有弄懂。

二、设计与分析

    写了好几次题目集了,每次写完都会有新的收获,改错的过程很着急但是也非常有意义。在写这些题目的过程中还是有些问题值得拿出来分析的,从第一次题目集开始吧。

      1.第一次题目集7-8(判断三角形)

        这道题是让我们判断三角形的种类并输出,整道题最重要的代码就是三角形种类的判断语句了:

if(a >= 1 && a <= 200 && b >= 1 && b<=200&& c >= 1&&c <= 200){
     		
     		if((a + b > c)&&(a - b < c))
     		{
     			if(a == b && b == c)
     				System.out.println("Equilateral triangle");
     			
     			else if(a == b && a * a + b * b - c * c < 0.00001)
     				System.out.println("Isosceles right-angled triangle");
     			else if(a == b||b == c||c == a)
     				System.out.println("Isosceles triangle");
     			else if(a * a + b * b - c * c < 0.00001)
     				System.out.println("Right-angled triangle");
     			else 
     				System.out.println("General triangle");
     		}
     		
     	else
     	        System.out.println("Not a triangle");
     	 }
     	else 
     		System.out.println("Wrong Format");

    在写这道题的时候,最开始我的想法就出现了错误,因为我是把每一种情况都分析了一遍,所以差不多是把每一种情况都写了一遍,最后在提交的时候才发现有错误,有一些情况的判断不能包含在里面。逻辑思维没有理顺,导致最后判断语句的错误。在写这道题时,最让我想不到的问题并不是判断语句的书写中的逻辑问题,而是在定义了三角形三条边的数据类型后,在判断直角三角形的情况时出现的精度误差。

    这是我最初用来判断直角三角形使用的判断语句,如果三条边的数据类型是整型的话这样写好像是没有问题的,但是三角形的三条边定义的是双精度型,这么写就出现了精度误差。而精度误差,是浮点数表示没有足够的内存而导致出现的一些问题。精度误差会有比舍入误差更大程度的大小影响你的判断。

a * a + b * b == c * c  

所以在后面我改成了这样来判断直角三角形:

a * a + b * b - c * c < 0.00001

 这样就可以准确的避免精度误差。

      2.第二次题目集7-4

        这道题和日期有关,需要用到四个方法来完成这道题,其中有两个方法都是需要使用Boolean型的方法,这个没了解之前还有点不会用。在判断闰年的方法里因为判断语句只有一句,true和false情况各一个,所以这个写起来比较简单,中途也没有出问题。但是在判断日期输入是否正确时,情况比较多,而我对Boolean型的了解不够,导致在返回值时出现了问题。

public static boolean checkInputValidity(int year,int month,int day)
	{
		if((year<1820||year>2020)||(month<1||month>12)||(day<1||day>31))
		{
			return false;
		}
		else 
		{
			if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
			{
				return false;
			}
			else
			{
				if((month==4||month==9||month==11)&&day>30)
				{
					return false;
				}
				else
				{
					if(isLeapYear(year))
					{
						if(month==2&&day>29)
						{
							return false;
						}
						else if(month==2&&day<=29)
						{
							return true;
						}
					}
					else if(month==2&&day>28)
					{
						return false;
					}
					else if(month==2&&day<=28)
					{
						return true;
					}
				}
				}
		}
          return true;
		
	}

  在写判断日期的输入时Boolean型和void型最大的区别就是,使用void型返回的值不是true和false,并且在使用if的判断语句时可以只有if而没有else,但是使用Boolean型有true就必须要有false,这就使得不能连续用if语句,情况写起来要更有连续和包括的逻辑。这道题有种繁而不难的感觉,主要就是注意闰年和平年,还有跨年的情况就可以了。

      3.第二次题目集7-5(求前N天)

        这道题是求给定日期的前N天,最重要的就是计算日期了,判断闰年和非法输入和前两题都是一样的方法。其实在写题目时写着写着我有点不知怎么计算,因为我没有看到N是有取值范围的[-10,10],所以当时我在想如果N超过一年的天数该怎么办。但在看清N的取值后,我才继续写了下去,毕竟确定了N的取值后题目就会更简单一点。这道题有非常重要的要考虑的一点,那就是n,因为n是有可能是负数的。当n是负数时,就是求后n天了。我将负数的n转化为正数之后,再去处理日期,这样更好计算。

if(n < 0)
n = -n;

  转化成正数后,就可以和求前n天一样的计算方法,只不过一个是减法一个是加法而已。求前N天,主要分析这么几种情况:跨年,跨月,n=0。其中跨月又要考虑闰年的情况,并且还有判断跨年和跨月的条件,我是这样判断的:

		if(n > 0)
		{
			if(n < day)
				......
			else if(n == day)
			{
				......
			}
			else if(n > day)
			{
				......
		}
		else if(n < 0)
		{
			n = -n;
				if(month==1||month==3||month==5||month==7||month==8||month==10)
				{
					if((n+day)>31)
						......
				}
				else if(month==4||month==6||month==9||month==11)
				{
					if((n+day)>30)
					{
						......
					}
					else
						......
				}
				else if(month==12)
				{
					if((n+day)>31)
					{
						......					
                                         }
					else
						......
				}
				else if(month==2)
				{
					if(isLeapYear(year))
					{
						if((n+day)>29)
						......
						else
						......
					}
					else
					{
						if((n+day)>28)
						......
						else
						......
					}
				}
			}
			else
                         ......
	}

}

  在n大于0时,只需要判断n和输入日期的大小关系就可以进行接下来的计算了,分成了三种情况n<day,n>day,和n=day。而n小于0时,将day和n加在一起和月天数进行比较,就可以判断是否跨月了。最后还有还有一种n=0的情况很容易忽略,最开始写的时候我就忘记了这种情况。

 

 

       4.第三次题目集7-2(创建账户日期类)

        在这次题目集里我们开始接触类与面向对象,开始学习类的使用。最开始老师在课堂上讲类与对象的使用时我当时真的没搞懂这个的用法,所以那次的课堂作业也没有交上。这第三次题目集第二题是让我们建立一个日期类,实现求日期的功能。

 

 

 

 

 类图将这道题分析的挺清楚。最主要就是日期类里面变量的定义和求日期的方法。

定义变量:

private int year;
	private int month;
	private int day;
	int mon_maxnum[] = new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};

求日期的方法:

if(month==12&&day==31)
		{
			System.out.println("Next day is:"+(year+1)+"-"+1+"-"+1);
		}
		else if((month==1||month==3||month==5||month==7||month==8||month==10)&&day==31)
		{
			System.out.println("Next day is:"+year+"-"+(month+1)+"-"+1);
		}
		else if((month==4||month==6||month==9||month==11)&&day==30)
		{
			System.out.println("Next day is:"+year+"-"+(month+1)+"-"+1);
		}
		else if(isLeapYear(year)&&month==2&&day==29)
		{
				System.out.println("Next day is:"+year+"-"+(month+1)+"-"+1);
		}
		else if(!isLeapYear(year)&&month==2&&day==28)
		{
			System.out.println("Next day is:"+year+"-"+(month+1)+"-"+1);
		}
		else
		{
			System.out.println("Next day is:"+year+"-"+month+"-"+(day+1));
		}

  这道题我刚开始写的时候真的是会出现一些问题,关于类与对象了解还不够,所以对于写在类中判断日期和求日期的方法我不能在主方法里面调用,而在主函数里输入的数据也不能传入到类中,写的就挺自闭的,后面写着写着,更加理解了,稍微也就能写出来了。相比较来说,第一题还是挺简单的。日期类里最重要的就是定义变量和求日期和判断输入的日期的各种方法。

 

      5.第三次题目集7-3(求导)

        这道题真的是这次题目集最难题了,不仅要用到类,还要用到正则表达式来判断输入的表达式是否符合正确。

String zz1 = "([-+]?[1-9]\\d*\\*x\\^-?[1-9]\\d*)";

  正则表达式就从长相上看上去就不算很简单的样子,它的每一个符号都代表不同的意义,要把所有符号所代表的的意义和用法记住真的还是挺难的,接下来得花更多的时间来学习正则表达式。对于这道题,就非常遗憾,我对于求导还没有掌握,这道题我也没有写到核心的求导部分,只是判断了输入表达式的正确与否。第四次题目集还会有这道题,到时候一定要做出进步。虽然正则表达式比较难,但是在用起来是真的方便,不用再去一个一个读取字符串。添加一个符号有时候就可以表示一串很长的字符串,所以正则表达式的学习是很有必要的。

三、采坑心得

  1.在第一次的题目集中没有考虑精度的问题,导致了错误,下次要注意精度误差,避免这种错误。

  2.在求前N天时没有看清楚题目,没有注意n的取值范围,下次要注意看清楚题。

  3.对于正则表达式的?,\,*,没有分辨清楚,使用起来错误百出。

  4.在日期中平年的日期考虑不清楚。

四、改进建议

  1.自学能力比较弱,还是得提升自学能力,多看网上的教学视频。

  2.正则表达式一定得掌握,要加快自己的学习进度。

  3.减少if语句的使用,可以多使用switch语句,和if语句比起来复杂度会更高一点。

  4.类与对象之间要更加进一步熟练的掌握。

五、总结

  刚开学的这个第一个月接触了Java,感受到了Java的难度,我们接触到Java的一些皮毛,Java里面我们要学的还有很多,需要自己更加努力的学习。在学习Java的过程中非常的锻炼我们自身,不管是哪个方面,都能得到提升。同时也在促进我们的积极心,提高我们的自学能力。不管是什么,Java里面的所有东西都是我们之前没有接触过得,对我来说都是一种很大的挑战。在之后的学习中要更加的努力,不仅是为了学习,也是为了自己吧。加油努力!

posted @ 2021-04-04 19:04  肖肖呐肖肖  阅读(104)  评论(0)    收藏  举报