PTA一-三周作业总结

一、前言

  通过写这三周作业学到了许多东西,当然发现要学的还有许多。三次题目集难度逐渐上升,不会让人一下子感到无从下手,但也不会什么东西都很简单,尤其是第三次作业的第三题还没完成。

  1.第一次题目集

    第一周作业都是一些比较基础的东西,比如第一题练习输入输出的方式、后边的几乎就是练习if语句的用法、以及简单的一维数组等,要学习的东西也不少但比较简单,因此题量较大,此次bolg重点分                析7-8,此题中运用了大连的if条件句的判断。

  2.第二次题目集

    第二周作业较第一周难度略有提升,前两个题目都练习的是数组的只是,后边三个作业都跟日期有关,主要练习的是JAVA的方法这其实与C语言中的函数类似,题目也不是很难,但是要学的还是很多,此次blog要分析7-4和7-5两个题。这两个题有些地方有些重复。

  3.第三次题目集

    第三周作业难度较大,主要练习的就是JAVA中的类,前两题还好,难度不大,第三题就很复杂,要求要学习并运用正则表达,这之前要理解类的相关知识比如类的封装性,类与类的关系等等,老师上课有讲,mooc上也有课。

二、设计与分析

  1.第一次题目集7-8:此题要求输入三角形三条边,判断该三角形为什么类型的三角形。

    拿到这个题是一步步来的,先要了解三条边满足什么条件才能构成三角形,然后是三条边满足什么条件能构成什么类型的三角形,这就是最开始的思路。有了思路就好做了,通过if语句来判断输入满足        那种情况。以下部分代码是判断输入的三边能构成三角形时三角形的类型

  

if(a+b>c){
//判断三角形类型 if(a==b&&b==c) System.out.print("Equilateral triangle"); else if(a==b&&(c*c-a*a+b*b-c*c<0.01)) System.out.print("Isosceles right-angled triangle"); else if(a==b||b==c||a==c) System.out.print("Isosceles triangle"); else if(a*a+b*b-c*c<0.01) System.out.print("Right-angled triangle"); else System.out.print("General triangle");
}

   

     编写这部分代码是遇到的问题就是在判断能构成直角三角形时及等腰直角三角形的条件,因为输入的三条边的数值为double型,所以不能用两直角边的平方和等于斜边平方,而是

以“a*a+b*b-c*c<0.01”这种差值的形式来判断。
    下面给出一些数据的输入以及输出结果
以下为输入样例:
50 50 50.0

 以下为输出样例:

Equilateral triangle

  

  2.第二次题目集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) ; //求输入日期的下一天

  既然给了方法,那题就好做了,首先写一个方法能够判断输入日期是否合法,然后写一个方法能够判断是否为闰年,然后再写一个方法求输入日期的下一天,其他的就在main方法里边弄就行,当然用到的判断方法还是通过if语句判断,但是if的嵌套多了后复杂度也就多了。

以下为SourceMonitor分析图:

 

 

 看到这个图就知道写的有多垃圾,但是后来的第三次作业提醒下知道用数组的话会简单很多,数组的那个后边会作说明。这个虽然垃圾,但是也要看看,代码不是

以下为求输入日期下一天的方法:

public static void nextDate(int year,int month,int day) {
		//求输入日期的下一天
		checkInputValidity(year,month,day);
		if(month==12&&day==31)
			System.out.print("Next date is:"+(year+1)+"-"+"1"+"-"+"1");
		else if((month==1||month==3||month==5||month==7||month==8||month==10)&&day==31)
			System.out.print("Next date is:"+year+"-"+(month+1)+"-"+"1");
		else if((month==4||month==6||month==9||month==11)&&day==30)
			System.out.print("Next date is:"+year+"-"+(month+1)+"-"+"1");
		else if(month==2&&isLeapYear(year)&&day==29)
			System.out.print("Next date is:"+year+"-"+(month+1)+"-"+"1");
		else if(month==2&&isLeapYear(year)==false&&day==28)
			System.out.print("Next date is:"+year+"-"+(month+1)+"-"+"1");
		else
			System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));
	}

看到if内容和输出的内容就知道我自己弄错了多少遍,这个是自己一遍遍提交,一遍遍改的,说实话答案正确的时候还挺高兴的,另外我发现定义布尔值类型真的方便  

此外判断输入的日期是否合法的方法也是够复杂的,以下为代码:

public static boolean checkInputValidity(int year,int month,int day){
		//判断输入日期是否合法,返回布尔值
		if((year>=1820&&year<=2020) && (month>=1&&month<=12) && (day>=1&&day<=31)) {
			if((month==4||month==6||month==9||month==11)&&day==31)
				return false;
			else if(month==2&&day>=29&&(isLeapYear(year)==false))
				return false;
			else if(month==2&&isLeapYear(year)&&(day==30||day==31)) 
				return false;				
			else {
				return true;
			}
		}
		else
			return false;
	}

下面给出一些输入及输出:

输入数据如下:

2020 3 10 

输出结果如下:

Next date is:2020-3-11

   2.第二次题目集7-5:输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。  

    这题虽然没说要用到哪些方法,但是上一题是有借鉴的,还是定义四个方法,一个方法判断闰年,一个方法判断输入日期是否合法,一个方法计算出输入日期的n天后的日期,其他的在main方法中完成

以下为计算出输入日期的n天后的日期的方法部分代码:
public static void beforeday(int year,int month,int day,int n) {
		switch(n) {
		case 0: System.out.print(n+" days ago is:"+year+"-"+month+"-"+day);
		}
		if(n>0) {
			if(day>n)
				System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
			switch(month) {
			case 5:;
			case 7:;
			case 10:;
			case 12:{
				if(n==day) {
					System.out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+"30");
				}
				else if(n>day) {
					System.out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(30-n+day));
				}
			}
            break;
			case 2:;
			case 4:;
			case 6:;
			case 8:;
			case 9:;
			case 11:{
				if(n==day) {
					System.out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+"31");
				}
				else if(n>day) {
					System.out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(31-n+day));
				}
				break;
			}
			case 1:{
				if(n==day)
					System.out.print(n+" days ago is:"+(year-1)+"-"+"12"+"-"+"31");
				else if(n>day)
					System.out.print(n+" days ago is:"+(year-1)+"-"+"12"+"-"+(31-n+day));
			}
			break;
			case 3:{
				if(day==n) {
					if(isLeapYear(year)) {
						System.out.print(n+" days ago is:"+year+"-"+"2"+"-"+"29");
					}
					else if(isLeapYear(year)==false) {
						System.out.print(n+" days ago is:"+year+"-"+"2"+"-"+"28");
					}
				}
				else if(day<n){
					if(isLeapYear(year)) {
						System.out.print(n+" days ago is:"+year+"-"+"2"+"-"+(29-n+day));
					}
					else if(isLeapYear(year)==false) {
						System.out.print(n+" days ago is:"+year+"-"+"2"+"-"+(28-n+day));
					}
				}
			}
			break;
		}			
	}

  因为老师讲过switch语句的复杂度要比if语句的复杂度低,所以基本框架用的switch case但是如果能用单数组应该会简单很多,这么写真是当时想不出其他办法了。因为n有大于0、小于0等于零三种情况,大于0、小于0,这两种情况写的方法有些地方也不大一样,当时想的时候也是打了好久草稿。虽然代码是长了点但不影响正产运行,不过复杂度可是不低。

以下为SourceMonitor分析图:

 

 

 照例输入输出值来个展示:

以下为输入示例:

2018  6 19 8 

以下为输出结果示例:

8 days ago is:2018-6-11

  4.第三次题目集7-2:题目为定义一个Date类输入日期并输出下一天日期

    这题与题目集二中的第四题基本上一样方法自然不必说,只不过要用类,话不多说想看看powerdesigner的类图

 

 

 基本上写的啥东西就一目了然了,这题中就用到了数组就发现简单很多,复杂度也下降不少,当然一个好的代码是可以复杂度为0的,不必骄傲。

 

 

 一开始用类还有点不伦不类,就是写的和方法一样的那种,后来老师多次强调下,改了又改,才终于是对类有了初步了解,学到点东西还真是有够开心的。

 

  5.第三次题目集7-3:题目为实现对简单多项式的导函数进行求解

    这个题要求我们学习正则表达式,我还清楚记得看的课里讲:正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。看出来它的重要性,我学呀学呀,发现确实好用,后来发现做这个题貌似仅仅会正则表达式也不行,还要会怎么会怎么把字符串分开,怎么再组合到一起,结果到最后就是50分的题自己只拿了15分。

 

那就看一下我这15分的代码吧:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in = new Scanner(System.in);
		String b = in.next();
        String a;
		a = b.replaceAll(" ","");
		if(chs(a)) {
			System.out.print("0");
		}
		else if(pdwf(a)==false) {
			System.out.print("Wrong Format");			
		}		
		in.close();
	}
	public static boolean pdwf(String a) {
		//判断输入的字符串中是否包含系数为0或指数为0的项
		if(a.matches("([+-]?[1-9]\\d*\\*)?x\\^[+-]?[1-9]\\d*"))
			return true;
		else
			return false;
	}
	public static boolean chs(String a) {
		//判断是否为常函数
		if(a.matches("[+-]?[1-9]\\d*")) {
			return true;
		}
		else {
			return false;
		}
	}	
} 

 就是写这个题的时候有种无力感,一直报错,要不就是求不出来导数。

 

三、踩坑心得

  1.老师讲我们提交过多少次,每次啥样他都能看见,我觉得还是应该在eclipse里边编辑好了,没有错误了,然后在PTA里提交。

  2.PTA里边的测试点给出来是要我们找到自己错误的,不是让我们看测试点然后去蒙混过关的。

  3.另外PTA里边交的作业有它自己的环境,一定要看好了,修改好自己代码再交。

四、改进建议

  1.因为switch语句的复杂度更低,所以尽可能不要用if语句

  2.改进的话就是对第二次作业那些复杂的判断的优化,以后在写代码前应该想一些更方便,效率高的方式。

五、总结

  这三次作业学到不少东西,当然这也只是皮毛,但是基础要打牢,慢慢来,我相信我可以学到更多好的东西。

  因为上个学期已经学过C语言,所以这个学期弄JAVA觉得轻松一些,是有许多相似的方式,但还是有很大的不同。我学到了方法和类的区别,也了解到了写代码时不应该只顾着写出

来,更应该对其进行优化。而且不管题目有多难我们都应该努力克服,而不是逃避。当然最大的体悟就是靠自己,靠自学,自己才能帮自己,一定不能抄袭。









posted @ 2021-04-04 23:23  悟陉  阅读(162)  评论(0)    收藏  举报