OO第一次博客作业(前三次习题集总结)

大一下学期第一次接触JAVA,也是第一次接触面对对象,所以刚刚开始学习很挣扎度,对于JAVA的各种规则及语法的使用很不适应。

 

前三次题目集题量及难度

前三次作业主要是老师让我们要C语言转向JAVA的一个适应过程,对于面对对象还没有摸到很多,除了第二次,大多都是摸着石头过河地暴力解决,我的思想还停留在C语言时期,没有及时转变,希望之后尽快转变。

第一次题目集:

第一次题目集总体难度不大,属于对JAVA的了解,共七道题。主要是熟悉JAVA的简单语法,难度较大的题目有 使用一维数组求平均值、对多个整数进行排序、判断三角形类型。使用到了简单的数组和for循环,其中对于数组的使用有了初步的认识,可以将数字,符号存入数组并输出。

 

代码分析: 

7-7对多个整数进行排序

代码:

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        int array[] = new int[num];
        for(int i=0;i<num;i++){
            array[i] = input.nextInt();
        }
        Arrays.sort(array);
         System.out.print("The sorted numbers are:");
        for(int n:array)
          System.out.print(n+" ");
        input.close();
    }
}


题目小节:

本题考察了JAVA的基本语法规则,数组的存储与输出,用到了一个Arrays.sort()方法对数组进行升序排列。

7-8 判断三角形类型         

圈复杂度分析:                                                                                        

            

类图:                                  

 

 代码:

 1 package 第一次博客作业;
 2 
 3     import java.util.Arrays;
 4     import java.util.Scanner;
 5 
 6     public class Pta题目集一7_8 {
 7 
 8         public static void main(String[] args) {
 9             Scanner in=new Scanner(System.in);
10             double a[] = new double[3];
11             int i;
12             for(i = 0; i < 3; i++){
13                 a[i] = in.nextDouble();
14             }
15             for(i = 0; i < 3; i++){
16                 if(a[i] < 1 || a[i] > 200){
17                     System.out.println("Wrong Format");
18                     return;
19                 }
20             }
21             Arrays.sort(a);
22            if(a[0] + a[1] > a[2]){
23                if(a[0] == a[1] && a[1] == a[2]){
24                     System.out.println("Equilateral triangle");
25                 }
26                 else if(a[0] == a[1] && a[0] * a[0] + a[1] * a[1] - a[2] * a[2] < 0.000001)
27                     System.out.println("Isosceles right-angled triangle");
28                 else if(a[2] == a[1] || a[2] == a[0] || a[0] == a[1])
29                     System.out.println("Isosceles triangle");
30                 else if(a[0] * a[0] + a[1] * a[1] - a[2] * a[2] < 0.0000010)
31                     System.out.println("Right-angled triangle");
32                else{
33                     System.out.println("General triangle");
34
35 } 36 37 } 38 else
39 System.out.println("Not a triangle"); 40 } 41 42 }

题目小节:

 

本题算法很简单,输入三角形三边长度,存入一个数组,然后通过判断三角形两边之和大于第三边;两边之差小于第三边,来输出输入的三条边是否可以构成一个三角形。

但我在做题时候 因为没有注意输出错误的格式,导致PTA耽误了很多时间,下次需要注意对于输出格式的改进。

第二次题目集:

第二次题目集在第一次题目集上提升了难度,主要考察类与对象。

7-4 求下一天 

圈复杂度分析:

类图:

 代码:

 1 import java.util.*;
 2 public class Main {
 3     public static void main(String[] args) {
 4         Scanner x = new Scanner(System.in);
 5         int year = x.nextInt();
 6         int month = x.nextInt();
 7         int day = x.nextInt();
 8         nextDate(year,month,day);
 9     }
10     
11     public static boolean isLeapYear(int year) {
12         if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
13             return true;
14         }
15         else{
16             return false;
17         }
18     }
19     
20     public static boolean checkInputValidity(int year,int month,int day) {
21         boolean y =true ;        
22         if(year <1820||year >2020||month < 1||month > 12||day < 1||day > 31){
23          y=false;                
24         }   
25         if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
26             if(day > 31){
27                  y=false;
28                 
29             }
30         if(month == 4||month == 6||month == 9||month == 11)
31             if(day > 30){
32                  y=false;
33                 
34             }
35         if(month == 2){
36             if(isLeapYear(year)){
37                 if(day > 29){
38                      y=false;
39                     return y;
40                 }
41             }
42             else
43                 if(day > 28){
44                      y=false;
45                 
46                 }
47         }
48         return y;
49     }
50     public static void nextDate(int year,int month,int day) {
51         int[] x=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
52         if(isLeapYear(year))
53             x[2] = 29;
54         int a = 0,b = 0,c = 0;
55         if(checkInputValidity(year,month,day)) {
56             if(month==12) {
57                 if(day==x[month]) {
58                 a = year+1;
59                 b = 1;
60                 c = 1;}
61             if(day>0&&day<x[month]) 
62                     {a = year;
63                     b = month;
64                     c =day +1;
65                     }
66             }
67             if(month<12) {
68                 if(day==x[month]) {
69                     a = year;
70                     b = month + 1;
71                     c = 1;}
72                 if(day>0&&day<x[month]) 
73                         {a = year;
74                         b = month;
75                         c = day+1;
76                         }
77             }
78             System.out.println("Next date is:"+a+"-"+b+"-"+c);
79             }
80         else System.out.println("Wrong Format");
81     }
82 
83 
84 }

 题目小节:

7-4题要求用户输入年月日,然后程序输出下一天。其实算法并不是特别困难。使用了求一下天的方法 public static void nextDate(int year,int month,int day),比较麻烦的是对于边界值的判断(2月和12月)和对于闰年的判断,而且每个月存在30号和31号,所以处理起来相对麻烦,一不小心就会漏掉边界值导致运行出错或者PTA检查点过不去。

 

7-5求下N天

圈复杂度分析:

类图:

 

代码:

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4         public static void main(String[] args) {
 5             Scanner x = new Scanner(System.in);
 6             int year = x.nextInt();
 7             int month = x.nextInt();
 8             int day = x.nextInt();
 9             int n = x.nextInt();
10           if (checkInputValidity(year,month,day))
11               nextDate(year,month,day,n);
12             else 
13                 System.out.print("Wrong Format");
14             
15     }
16     public static boolean isLeapYear(int year) {
17         if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
18             return true;
19         }
20         else{
21             return false;
22         }
23     }
24         
25         public static boolean checkInputValidity(int year,int month,int day) {
26             boolean y =true ;        
27             if(year <1820||year >2020||month < 1||month > 12||day < 1||day > 31){
28              y=false;                
29             }   
30 
31                 
32                 
33             if(month == 4||month == 6||month == 9||month == 11)
34                 if(day > 30){
35                      y=false;
36                     
37                 }
38             if(month == 2){
39                 if(isLeapYear(year)){
40                     if(day > 29){
41                          y=false;
42                     
43                     }
44                 }
45                 else
46                     if(day > 28){
47                          y=false;
48                     
49                     }
50             }
51             return y;
52         }        
53 
54             public static void nextDate(int year,int month,int day,int n) {
55                 int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
56                 if (isLeapYear(year))mm[2]=29;
57                 day-=n;
58                 if (n>0){
59                     while (day<=0){
60                     
61                         month--;
62                         if (month==0){
63                             month+=12;
64                             year--;
65                         }
66                         day+=mm[month];
67                     }
68                 }else if (n<0){
69                     while (day>mm[month]) {
70                         day-=mm[month];
71                         month++;
72                         if (month==13){
73                             month-=12;
74                             year++;
75                         }
76                     }
77                 }
78                 System.out.printf("%d days ago is:%d-%d-%d\n",n,year,month,day);
79             }
80 
81         }

 题目小节:

7-5题其实是7-4题的延伸,两道题都不允许使用Java中任何与日期有关的类或方法,略微提升了题目难度。两道题唯一不同的地方就是边界值的判断及对于 public static void nextDate(int year,int month,int day)的算法改进。

 

 

第三次题目集

 第三次题目集整体难度比较前两次题目集有不小提升,开始学会定义并在类中使用私有属性(不被外界修改),本次习题集中7-1创建的Account,7-2中创建的Date,都是类,其中也包括私有属性。

7-2 定义日期类

圈复杂度分析:

类图:

 

  1 import java.util.Scanner;
  2 
  3 public class Main {
  4 
  5 
  6 
  7     public static void main(String[] args) {  
  8         Scanner x= new Scanner(System.in);
  9         int year = x.nextInt();
 10         int month = x.nextInt();
 11         int day = x.nextInt();
 12         
 13         Date csm = new Date(year,month,day);
 14         csm.getNextDate();
 15         
 16         
 17     }
 18 
 19 }
 20     class Date {
 21         private  int year;
 22         private  int month;
 23         private  int day;
 24         private int[] mon_maxnum= new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
 25         
 26         
 27        public Date() {          
 28        }
 29        public Date(int year , int month , int day ) {
 30         this.year = year;
 31         this.month = month;
 32         this.day = day;
 33         
 34        }
 35         public int getYear() {
 36             return year;
 37         }
 38         public void setYear(int year) {
 39             this.year = year;
 40         }
 41         public int getMonth() {
 42             return month;
 43         }
 44         public void setMonth(int month) {
 45             this.month = month;
 46         }
 47         public int getDay() {
 48             return day;
 49         }
 50         public void setDay(int day) {
 51             this.day = day;
 52         }
 53         
 54         public boolean isLeapYear(int year){
 55             if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
 56                 return true;
 57             }
 58             else{
 59                 return false;
 60             }
 61             }
 62              public boolean checkInputValidity() {
 63                 boolean y =true ;        
 64                 if(year < 1900 ||year > 2000 || month < 1|| month > 12 || day < 1|| day > 31){
 65                  y= false;                
 66                 }   
 67                 if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
 68                     if(day > 31){
 69                          y=false;                      
 70                     }
 71                 if(month == 4||month == 6||month == 9||month == 11)
 72                     if(day > 30){
 73                          y=false;                        
 74                     }
 75                 if(month == 2){
 76                     if(isLeapYear(year)){
 77                         if(day > 29){
 78                              y= false;
 79                             return y;
 80                         }
 81                     }
 82                     else
 83                         if(day > 28){
 84                              y= false;                        
 85                         }
 86                 }
 87                 return y;             
 88         }    
 89             public void getNextDate() {
 90                 int[] x=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
 91                 if(isLeapYear(year))
 92                     x[2] = 29;
 93                 int a = 0,b = 0,c = 0;
 94                 if(checkInputValidity()) {
 95                     if(month == 12) {
 96                         if(day == x[month]) {
 97                         a = year+1;
 98                         b = 1;
 99                         c = 1;}
100                     if(day > 0 && day < x [month])                         
101                     {
102                             a = year;
103                             b = month;
104                             c = day +1;
105                     }
106                     }
107                     if(month < 12) {
108                         if(day == x[month]) {
109                             a = year;
110                             b = month + 1;
111                             c = 1;}
112                         if(day > 0 && day < x [month]) 
113                                 {
114                                  a = year;
115                                  b = month;
116                                  c = day+1;
117                                 }
118                     }
119                     System.out.println("Next day is:"+a+"-"+b+"-"+c);
120                     }
121                 else System.out.println("Date Format is Wrong");
122             
123             
124             
125             
126         }    
127             }
128 
129     
130     

题目小节:

 7-2题中用到了Date这个类,其中包括了year,month,day三个私有属性。对于其中算法可以参考习题集二的7-4题,只不过对于封装性(封装是一种将抽象性接口的实现细节都包装和隐藏起来的方法,它具有减少耦合,类内部结构可以修改,成员变量精准控制的优点)有了要求,通过set和get方法设置对每个属性对外访问接口,外部需要改变类的属性,需要通过这些公共public的方法使得用户在外界无法访问year,month,day三个私有属性,只能输入。

 

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

代码:

 1 import java.util.*;
 2 public class Main {
 3 
 4     public static void main(String[] args) {
 5         int i,fl=0;
 6         Scanner input= new Scanner(System.in);
 7         String s=input.nextLine();
 8         for(i=0;i<s.length();i++){
 9             if(s.charAt(i) == 'x')
10             fl= 1;}
11         if(fl== 0){
12             System.out.println("0");
13             System.exit(0);
14         }
15 System.out.println("Wrong Format");
16 
17     }
18 
19 }

 

题目小节:

前三次作业中做的最差的一道题就是7-3 一元多项式求导,只得到了15分(输出错误的分数),基本相当于未完成。对于正则表达式的使用(正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。)并不清楚,只知道是用来判断输入的数据是否符合规则的方法。所以要尽快学习正则表达式的使用,完善题目。

 

 

优化与改进:

在题目集一使用了过多的if语句,可改为switch语句来提升效率,降低复杂度。

题目集二中for循环已经够了 嵌套了多个for循环,大大增加了复杂度,使程序效率低下。并且对于算法仍有提升空间。

题目集三中对于正则表达式的使用不了解,导致对第三题无从下手,尽快学习正则表达式的使用。对于类的使用不够熟系,无法快速上手,做题很慢。

 

 

总结:

前三次题目集 难度不是特别大 主要集中于题目集二7-5和题目集三7-3题。

我对于JAVA语法有个初步熟悉,学习到了简单的输入输出,将C语言一些陈规与JAVA语言互通。学会了使用一维数组,for循环等,并且学会了在创建类并在类中创建私有属性来实现JAVA语言特有的封装性,使用set和get语句来帮助实现。

但对于一些题目的处理不恰当,例如可以用switch语句处理的日期问题,还是喜欢无脑使用if语句,这样不仅对于程序编写不利,还会使复杂度上升,加大程序运行难度。

对于刚刚认知JAVA,我还有很长很长的道路可走。

PS:感谢老师对我PTA作业的督促和ypc同学对我平时的悉心教导。

 

posted on 2021-04-04 22:37  晨_之曦  阅读(63)  评论(0)    收藏  举报

导航