我的第一个Blog作业

作业总结

  经过了三次题目集的pta作业,逐步慢慢了解了Java语言的语法,了解了c语言与Java语法的不同。这三个题目集中,多了好多新的知识点,例如c语言的输入用scanf或者gets(),但是在Java语法中却不同,要先申请一个对象才能用。

  这三个pta题目集的作业量不多不少,刚刚能够可以满足c语言到Java的过渡过程所需的知识点,且难度适中,只有部分作业的某个题目难。在这三次题目,我学习到了Java的面向对象的含义,面向对象就是一种思想。它将数据和操作数据的方法封装在对象中,从而使对象有了一些功能,也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想将数据和操作数据的方法交给对象去管理,当我们需要某些功能的时候,只要找到能够实现该功能的对象然后让他去做就好了。这样的好处是我们不需要知道这个对象是如何实现这个功能的,我们要的是一个结果。

作业分析

1.题目集1的7-8

7-8 判断三角形类型 (20 分)

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		int year,moon,day;
		Scanner input = new Scanner(System.in);
		year = input.nextInt();
		moon = input.nextInt();
		day = input.nextInt();
		if(checkInputValidity(year,moon,day)==false)
		{
			System.out.print("Date Format is Wrong");
			System.exit(0);
		}
		nextDate(year,moon,day);
}
public static boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
{
	if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
		return true;
	}else{
		return false;
	}
}

public static boolean checkInputValidity(int year,int moon,int day)//判断输入日期是否合法,返回布尔值
{
	if((year<1900||year>2000)||(moon<1||moon>12)||(day<1||day>31))
	{
		
		return false;
	}
	if(isLeapYear(year) == false&&moon==2&&day>=29)
    {
		return false;
	}
	return true;
}
public static void nextDate(int year,int moon,int day)//求输入日期的下一天
{
	int[] date = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(year) == true)
	{
		date[1]=29;
	}
	if(day+1<date[moon-1])
	{
		System.out.print("Next day is:"+year+"-"+moon+"-"+(day+1));
	}
	else
	{
		if(moon+1<=12)
		{
			System.out.print("Next day is:"+year+"-"+(moon+1)+"-"+"1");
		}
		else
		{
			System.out.print("Next day is:"+(year+1)+"-"+"1"+"-"+"1");
		}
	}
}
}

输入样例:

60.2 60.2 80.56

输出结果:

Isosceles triangle

 

对本次题目代码进行复杂度分析,结果如下:

 

在该图中,函数的平均圈复杂度偏高了,超出了绿色的范围,在代码中,有一段if-else嵌套了太多条件了,在以后的写代码过程中,应当注意这个问题

踩坑心得

本题没有什么踩坑心得,唯一要注意的点,测试的数据得出三角形的顺序要按照测试点去写,不然某些可能会报错

 2.7-4 

7-4 求下一天 (30 分)

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

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) ; //求输入日期的下一天

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String[] args) {
 5         int year,moon,day;
 6         Scanner input = new Scanner(System.in);
 7         year = input.nextInt();
 8         moon = input.nextInt();
 9         day = input.nextInt();
10         if(checkInputValidity(year,moon,day)==false)
11         {
12             System.out.print("Wrong Format");
13             System.exit(0);
14         }
15         nextDate(year,moon,day);
16 }
17 public static boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
18 {
19     if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
20         return true;
21     }else{
22         return false;
23     }
24 }
25 
26 public static boolean checkInputValidity(int year,int moon,int day)//判断输入日期是否合法,返回布尔值
27 {
28     if((year<1820||year>2020)||(moon<1||moon>12)||(day<1||day>31))
29     {
30         
31         return false;
32     }
33     if(isLeapYear(year) == false&&moon==2&&day>=29)
34     {
35         return false;
36     }
37     return true;
38 }
39 public static void nextDate(int year,int moon,int day)//求输入日期的下一天
40 {
41     int[] date = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
42     if(isLeapYear(year) == true)
43     {
44         date[1]=29;
45     }
46     if(day+1<date[moon-1])
47     {
48         System.out.print("Next date is:"+year+"-"+moon+"-"+(day+1));
49     }
50     else
51     {
52         if(moon+1<=12)
53         {
54             System.out.print("Next date is:"+year+"-"+(moon+1)+"-"+"1");
55         }
56         else
57         {
58             System.out.print("Next date is:"+(year+1)+"-"+"1"+"-"+"1");
59         }
60     }
61 }
62 }

输入测试:

2020 3 10

输出结果:

Next date is:2020-3-11

 

对代码进行圈复杂度分析

 

 

分析,在本题的圈复杂度中,函数的平均圈复杂度在在绿色范围内,没有很复杂,在正常的范围区间内

踩坑建议

在本题中,要注意闰年与平年的区别,在闰年中的2月28日的下一天是2月29日,并不是3月1日。也要注意看题目给的条件范围,不然到时候错哪个点都不清楚

改题建议:

在这个nextdate()这个函数中,可以用其他方法做,这个是比较简单的,也有其他更简单的,不用那么多的if-else嵌套

 

3.题目集3 7-5

7-5 求前N天 (30 分)

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

    1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
    2. 当输入数据合法时,输出“n days ago is:年-月-日”

代码:

 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String[] args) {
 5         int year,moon,day,n;
 6         Scanner input = new Scanner(System.in);
 7         year = input.nextInt();
 8         moon = input.nextInt();
 9         day = input.nextInt();
10         n = input.nextInt();
11         if(checkInputValidity(year,moon,day,n)==false)
12         {
13             System.out.print("Wrong Format");
14             System.exit(0);
15         }
16         if(n<0)
17         {
18             nextDate(year,moon,day,-n);
19         }
20         else
21         {
22             agoDate(year,moon,day,n);
23         }
24         
25 }
26 public static boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
27 {
28     if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
29         return true;
30     }else{
31         return false;
32     }
33 }
34 
35 public static boolean checkInputValidity(int year,int moon,int day,int n)//判断输入日期是否合法,返回布尔值
36 {
37     if((year<1820||year>2020)||(moon<1||moon>12)||(day<1||day>31)||(n<-10||n>10))
38     {
39         
40         return false;
41     }
42     if(isLeapYear(year) == false&&moon==2&&day>=29)
43     {
44         return false;
45     }
46     return true;
47 }
48 public static void nextDate(int year,int moon,int day,int n)//n<0时
49 {
50     int[] date = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
51     if(isLeapYear(year) == true)
52     {
53         date[1]=29;
54     }
55     if(day+n<date[moon-1])
56     {
57         System.out.print(-n + " days ago is:"+year+"-"+moon+"-"+(day+n));
58     }
59     else
60     {
61         if(moon+1<=12)
62         {
63             System.out.print(-n + " days ago is:"+year+"-"+(moon+1)+"-"+(day+n-date[moon-1]));
64         }
65         else
66         {
67             System.out.print(-n + " days ago is:"+(year+1)+"-"+"1"+"-"+(day+n-31));
68         }
69     }
70 }
71 public static void agoDate(int year,int moon,int day,int n)//n>0时
72 {
73     int[] date = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
74     if(isLeapYear(year) == true)
75     {
76         date[1]=29;
77     }
78     if(day-n>0)
79     {
80         System.out.print(n + " days ago is:"+year+"-"+moon+"-"+(day-n));
81     }
82     else
83     {
84         if(moon-1>0)
85         {
86             System.out.print(n + " days ago is:"+year+"-"+(moon-1)+"-"+(date[moon-2]+day-n));
87         }
88         else
89         {
90             System.out.print(n + " days ago is:"+(year-1)+"-"+"12"+"-"+(31+day-n));
91         }
92     }
93 }
94 }

测试数据:

2018  6 19 8 

输出结果:

8 days ago is:2018-6-11

圈复杂度分析:

 

在该图中,函数的平均圈复杂度在合理的绿色的区间,表明该函数的圈复杂度不高,刚刚好。

 踩坑建议:

 

主要是这几个点,要注意闰年与平年的区别,还要输出的格式。

 

 

4.题目集3 7-2

7-2 定义日期类 (28 分)

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

 

 

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

代码:

 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String[] args) {
 5         int year,month,day;
 6         Scanner input = new Scanner(System.in);
 7         Date a=new Date();
 8         year = input.nextInt();
 9         month = input.nextInt();
10         day = input.nextInt();
11         a.setYear(year);
12         a.setMonth(month);
13         a.setDay(day);
14         
15         if(a.checkInputValidity()==false)
16         {
17             System.out.print("Date Format is Wrong");
18             System.exit(0);
19         }
20         a.getNextDate();
21 }
22 }
23 
24 class Date{
25     private int year,day,month;
26     int[] date = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
27     Date(){
28     }
29     int getYear() {
30         return year;
31     }
32     void setYear(int year) {
33         this.year=year;
34     }
35     int getMonth() {
36         return year;
37     }
38     void setMonth(int month) {
39         this.month=month;
40     }
41     int getDay() {
42         return year;
43     }
44     void setDay(int day) {
45         this.day=day;
46     }
47     boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
48     {
49          if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
50              return true;
51          }else{
52              return false;
53          }
54     }
55     boolean checkInputValidity()//判断输入日期是否合法,返回布尔值
56      {
57          if((year<1900||year>2000)||(month<1||month>12)||(day<1||day>31))
58          {
59              
60              return false;
61          }
62          if(isLeapYear(year) == false&&month==2&&day>=29)
63          {
64              return false;
65          }
66          return true;
67      }
68 
69         void getNextDate() {
70             if (isLeapYear(year) == true) {
71                 date[1] = 29;
72             }
73             if (day + 1 < date[month - 1]) {
74                 System.out.print("Next day is:" + year + "-" + month + "-" + (day + 1));
75             } else {
76                 if (month + 1 <= 12) {
77                     System.out.print("Next day is:" + year + "-" + (month + 1) + "-" + "1");
78                 } else {
79                     System.out.print("Next day is:" + (year + 1) + "-" + "1" + "-" + "1");
80                 }
81             }
82         }
83 }

 

测试数据:

1912 12 25

输出结果:

Next day is:1912-12-26

圈复杂度分析

 

 

 

 

 分析,在本题的圈复杂度中,函数的平均圈复杂度在在绿色范围内,没有很复杂,在正常的范围区间内

踩坑建议:

这个题目和上一个差不多,踩坑建议可以参考上面的,但是要注意这个是要新建一个类!!!

 

5.题目集3 7-3

7-3 一元多项式求导(类设计)

编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf

输入格式:

在一行内输入一个待计算导函数的表达式,以回车符结束。

输出格式:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  • 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

代码如下

  1 import java.util.*;
  2 public class Main {
  3 
  4     public static void main(String[] args) {
  5         Count a=new Count();
  6         a.setterS();
  7         a.judgeS();
  8         a.doStorage();
  9         //a.print1();
 10         //System.out.println();
 11         a.print();
 12     }
 13 
 14 }
 15 class Count{
 16     Scanner input=new Scanner(System.in);
 17     private String s;
 18     long[] a=new long[1000000];
 19     int a1=0;
 20     long[] b=new long[1000000];
 21     int b1=0;
 22     void setterS() {
 23         s=input.nextLine();
 24     }
 25     int getLength() {
 26         return s.length();
 27     }
 28     void judgeS() {
 29         if(getLength()==0)
 30         {
 31             System.out.println("Wrong Format");
 32             System.exit(0);
 33         }
 34         
 35     }
 36     void print1() {
 37         for(int i=0;i<a1;i++)
 38         {
 39             System.out.print(a[i]+" ");
 40         }
 41         System.out.println(" ");
 42         for(int i=0;i<b1;i++)
 43         {
 44             System.out.print(b[i]+" ");
 45         }
 46     }
 47     void print() {
 48         if(b1!=0) {
 49         for(int i=0;i<a1;i++)
 50         {
 51             a[i]=a[i]*b[i];
 52         }
 53         for(int i=0;i<b1;i++)
 54         {
 55             b[i]--;
 56         }
 57         for(int i=0;i<a1&&i<b1;i++)
 58         if(a[i]==0||a[i]==-1||a[i]==1||b[i]==0||b[i]==1)
 59         {
 60             if(a[i]==1)
 61             {
 62                 if(b[i]!=0&&b[i]!=1)
 63                 {
 64                     System.out.print("x^"+b[i]);
 65                 }
 66                 else
 67                     if(b[i]==0)
 68                     {
 69                         System.out.print("1");
 70                     }
 71                     else
 72                     {
 73                         System.out.print("x");
 74                     }
 75             }
 76             if(a[i]==-1)
 77             {
 78                 if(b[i]!=0&&b[i]!=1)
 79                 {
 80                     System.out.print("-x^"+b[i]);
 81                 }
 82                 else
 83                     if(b[i]==0)
 84                     {
 85                         System.out.print("-1");
 86                     }
 87                     else
 88                     {
 89                         System.out.print("-x");
 90                     }
 91             }
 92             if(b[i]==0)
 93             {
 94                 System.out.print(a[i]);
 95             }
 96             if(b[i]==1)
 97             {
 98                 System.out.print(a[i]+"*x");
 99             }
100         }
101         else
102         {
103             System.out.print(a[i]+"*x^"+b[i]);
104         }
105         }else
106             System.out.print("0");
107     }
108     void doStorage() {
109         int len=getLength();
110         long temp,sum=0;//flag当前数标志正数或者负数(1),flag1标志当前数,flag2标志系数(0)或者指数(1)
111         int i,flag=0,flag1=0,flag2=0;
112         char[] s1=s.toCharArray();
113         for(i=0;i<len;) {
114             switch(s1[i]) {
115             case '-':
116                 flag=1;
117                 i++;
118                 break;
119             case '+':
120                 flag=0;
121                 i++;
122                 break;
123             case '*':
124                 i++;
125                 break;
126             case ' ':
127                 i++;
128                 break;
129             case 'x':
130                 if (i + 1 == len ||s1[i + 1] == '-'||s1[i + 1] == '+')
131                 {
132                     b[b1++]=1;
133                 }
134                 if(i==0)
135                 {
136                     a[a1++]=1;
137                 }
138                 if(i!=0&&s1[i - 1] == '-')
139                 {
140                     a[a1++]=-1;
141                     flag=0;
142                 }
143                 if(i!=0&&s1[i - 1] == '+')
144                 {
145                     a[a1++]=1;
146                 }
147                 i++;
148                 break;
149             case '^':
150                 flag2=1;
151                 i++;
152                 break;
153             default:
154                 temp=s1[i]-'0';
155                 if(flag2==0)//系数
156                 {
157                     if(flag1==1)
158                     {
159                         if (i + 1 == len ||s1[i + 1] == '*'||s1[i + 1] == '-'||s1[i + 1] == '+') {
160                             sum = sum * 10 + temp;
161                             if (flag == 1)
162                                 a[a1] = 0 - sum;
163                             else
164                                 a[a1] = sum;
165                             a1++;
166                             if(i+1!=len&&s1[i + 1] != '*') {
167                                 b[b1++]=0;
168                             }
169                             sum = 0;
170                             flag=0;
171                             flag1 = 0;
172                         } else {
173                             sum = sum * 10 + temp;
174                         }
175                     }
176                     else
177                     {
178                         flag1=1;
179                         sum=temp;
180                         if (i + 1 == len ||s1[i + 1] == '*'||s1[i + 1] == '-'||s1[i + 1] == '+')//系数为个位数
181                         {
182                             if (flag == 1)
183                                 a[a1] = 0 - sum;
184                             else
185                                 a[a1] = sum;
186                             a1++;
187                             if(i+1!=len&&s1[i + 1] != '*') {
188                                 b[b1++]=0;
189                             }
190                             if(sum==0)
191                             {
192                                 System.out.println("Wrong Format");
193                                 System.exit(0);
194                             }
195                             sum = 0;
196                             flag1 = 0;
197                             flag=0;
198                         }
199                     }
200                 }
201                 else {
202                     if(flag1==1)
203                     {
204                         if (i + 1 == len ||s1[i + 1] == '*'||s1[i + 1] == '-'||s1[i + 1] == '+') {
205                             sum = sum * 10 + temp;
206                             if (flag == 1)
207                                 b[b1] = 0 - sum;
208                             else
209                                 b[b1] = sum;
210                             b1++;
211                             sum = 0;
212                             flag=0;
213                             flag1 = 0;
214                             flag2=0;
215                         } else {
216                             sum = sum * 10 + temp;
217                         }
218                     }
219                     else
220                     {
221                         flag1=1;
222                         sum=temp;
223                         if (i + 1 == len ||s1[i + 1] == '*'||s1[i + 1] == '-'||s1[i + 1] == '+')//系数为个位数
224                         {
225                             if (flag == 1)
226                                 b[b1] = 0 - sum;
227                             else
228                                 b[b1] = sum;
229                             b1++;
230                             if(sum==0)
231                             {
232                                 System.out.println("Wrong Format");
233                                 System.exit(0);
234                             }
235                             sum = 0;
236                             flag=0;
237                             flag1 = 0;
238                             flag2=0;
239                         }
240                     }
241                 }
242                 i++;
243                 
244             }
245         }
246     }
247 }

测试结果:

2*x^6-0*x^7+5

输出结果:

Wrong Format

圈复杂度分析:

 

 

 分析,在本题中,函数的平均圈复杂度都超出绿色范围,函数总体写得比较复杂,代码嵌套的函数复杂

踩坑建议&&改进建议:本题有些点还没有过测试点,且有些函数的圈复杂度较高,有一些嵌套了过多的if-else的循环太过于复杂,可以试着把嵌套if-else过多的函数分开,用其他方法降低圈复杂度。

 

 综合性总结

  在这三次题目集中,学到了Java的基本语法,对于以后无论是作业还是做项目,都提供了很大的帮助,在对于类的处理中,我希望能够可以更加灵活的使用类,在今后的学习生涯中,希望能够学到更多有用的知识,且能够快乐的学习Java。

 

posted @ 2021-10-15 15:41  初雨天  阅读(49)  评论(1)    收藏  举报