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同学对我平时的悉心教导。
浙公网安备 33010602011771号