OO第一次博客作业
一、前言:
第一次题目集
题量:八道简单题,每题代码的平均长度在30行左右。
知识点:主要是一些简单的Java应用:比如,数据的输入输出,一维数组的应用,以及简单的排序函数(Arrays.sort),及编程的简单思想。
第二次题目集
题量:5道题目,难度较第一次略微提升。每题代码的平均长度在70行左右。
知识点:类与对象的简单应用:(一个类包含局部变量、成员变量、类变量)构造方法(构造方法的名称必须与类同名,一个类可以有多个构造方法。),创建对象(三步走:声明、实例化、初始化)。
第三次题目集
题量:3题,难度如老师所说难度提升幅度较大。每题代码的平均长度在80行左右。
知识点:类与对象的应用,正则表达式的应用。
二、设计与分析:
题目集一:
l 第八题

本题为判断三角形类型,用了四对if-else语句,所以导致圈复杂度过高。个人觉得本题应该注意:对于两个double类型的数据,是不能直接用==来比较是否相等。可以将这两个数相减,判断他们的差在一定范围内就认为相等。同时还可以使用Big Decimal(高精度)类型。
(不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、
质数测试、素数生成、位操作以及一些其他操作。)
其实我们所应该知道的就是BigInteger可以表示任意大小的整数,并且可以像我们使用int之类的数字一样正常的进行计算。只不过加减乘除之类的操作都换成了方法调用,要注意的是BigXXXXX是不可变的,也就是说每次进行运算都会产生新的对象来进行计算,所以应该避免大规模的使用,主要的方法有:
如:
String temp1 = "-1000000000000000000000000000000000000";
BigInteger bg1 = new BigInteger(temp1); //注意初始化的方式,使用字符串来初始化
System.out.println(bg1.abs()); //绝对值方法 object.abs()
String temp2 = "100000000000000000000000000";
BigInteger bg2 = new BigInteger(temp2);
System.out.println(bg1.add(bg2)); //加法 object.add(BigInteger b)
System.out.println(bg1.subtract(bg2)); //减法 返回为 bg1 - bg2 (this - param)
System.out.println(bg1.multiply(bg2)); //乘法 返回 bg1 * bg2
System.out.println(bg1.divide(bg2)); //除法 返回bg1 / bg2
System.out.println(bg1.mod(bg2)); //取模运算 返回的是 bg1%bg2 (this mod param)
System.out.println(bg1.gcd(bg2)); //直接封装好了 求解bg1,bg2 的最大公约数
int temp5 = 5;
System.out.println(bg2.pow(temp5)); //乘方运算 注意这个方法的参数是基本类型int
System.out.println(bg2.compareTo(bg1)); // 比较方法 结果为1 bg2大
System.out.println(bg1.compareTo(bg2)); // 结果为-1 bg2大
//这个地方注意比较的方法,还有一个方法是equal()
String temp3 = "1000";
String temp4 = "001000";
BigInteger bg3 = new BigInteger(temp3);
BigInteger bg4 = new BigInteger(temp4);
System.out.println(bg3.compareTo(bg4)); //结果为0 表示相等
System.out.println(bg3.equals(bg4)); //返回结果为true 这样看是没有区别,但是更推荐比较的时候使用compareTo()方法,
//在BigDecimal更直观,例如0.1 与0.10 ,equal返回false 而compareTo则是正确的结果。
当然,还有一些其他方法,主要方法有:
String temp1 = "1.2222222222222222222222222";
BigDecimal bd1 = new BigDecimal(temp1);
String temp2 = "2.333333333333333333333333";
BigDecimal bd2 = new BigDecimal(temp2);
System.out.println(bd1.add(bd2)); // 加法 输出 3.5555555555555555555555552
System.out.println(bd1.add(bd2).doubleValue()); // 输出 3.5555555555555554 这里用了一个方法将结果转化为double类型了
System.out.println(bd2.subtract(bd1)); //减法 输出 1.1111111111111111111111108
System.out.println(bd2.subtract(bd1).doubleValue()); //输出 1.1111111111111112
System.out.println(bd2.multiply(bd1)); //乘法 输出 2.8518518518518518518518513925925925925925925925926
System.out.println(bd2.multiply(bd1).doubleValue()); //乘法 2.8518518518518516
System.out.println(bd2.divide(bd1, 5, RoundingMode.HALF_UP)); //除法应该注意很有可能会有除不尽的情况,这时候会有异常抛出,所以要传入控制参数
System.out.println(bd2.divide(bd1, 5, RoundingMode.HALF_UP).doubleValue()); //输出都是 1.90909
System.out.println(bd1.compareTo(bd2)); //比较方法
BigDecimal bd3 = new BigDecimal("1.20");
BigDecimal bd4 = new BigDecimal("1.2");
System.out.println(bd3.compareTo(bd4)); //返回0表示相等
System.out.println(bd3.equals(bd4)); //返回的是false 是错误的
//所以比较的时候使用compareTo()方法
题目集二
第四题

本题为求某一天的下一天。具体做法:
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) ; //求输入日期的下一天
(用一个数组记录每月的最大天数,如果该年是闰年,则二月份的天数改为29.应注意12月31日以及每月的最后一天的下一天、同时也要注意题目规定的年份的范围,以及月份的范围1-12月)。
题目集二
l 第五题

本题和上一题的解题思想一样,需要注意的就是前n天月份的变化,以及年份的变化。
判断前n天的月份是不是当前月份,不是则月份减一,判断是不是当前年份,不是,则年份减一,(注意闰年和平年的二月份,以及年份减一后,月份变为12月,还有就是日的变化)。
题目集三
l 第二题


本题就是按题目所给的类图(如上图所示)编写代码。然后就是类的如何创建及使用问题。
具体的思想和前面题目有关年份 的思想是差不多的。
(类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。)https://blog.csdn.net/wei_zhi/article/details/52745268
https://www.runoob.com/java/java-object-classes.html
题目集三
第三题

本题为正则表达式(描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。)的用法。本题我先查找输入字符串中是否有除了“+” “-“ ”*“ “^”等非法字符
(Pattern p = Pattern.compile("[^\\d+x\\*+\\^-]");)如果没有非法字符则删去输入字符串中的空格符(input=input.replaceAll(" ","");)
再去筛查输入字符串中的每一个项
Patterncoefficient=Pattern.compile("([+-]?\\d+)?[*]?x[\\^]?([+-]?\\d+)?")
用group(1)和group(2)函数去筛选系数和指数,将其放入到一个数组中,方便后续输出求导后的表达式。
(通过本题了解到了什么是正则表达式(之前从来没有听说过),也学会了如何运用正则表达式(一点皮毛 xuedezhenfan),不过这题没有得到满分,也没有得到95分,没有找到到底哪个地方还有问题,菜是原罪)。
三、踩坑心得:
做题过程中没有去记录踩过哪些坑,现在去想想不起来了,能回忆多少是多少。
用网上类似的例子来充当:

抛异常:Exception in thread "main" java.lang.IllegalStateException: No match found
原因是用法不对,需要先find,然后group才能有数据,正确写法:

public class A { public static void main(String[] args) {
String s = "";
int a = Integer.parseInt(s);
System.out.println(a);
}
}
结果:会出现异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
编译可以通过,因为s有值,而运行时会出现数字转换异常,空的字符串不能转换为int
在题目集一中的最后一题:判断三角形
本题中应先判断最先判断等边三角形,然后是等腰直角三角形,等腰三角形,直角三角形,最后是一般三角形。当然前提是这三条边可以构成三角形。
还有就是题中用到了过多的if-else语句导致圈复杂度过大。至于解决方案还未得出。
在题目集三的第三题中,在数字较大的情况下,int,long是不能够得出正确的结果的,要使用高精度的相关知识。在这题中有两个测试点是没有通过的——合法综合性测试。还有就是本题的圈复杂度超标了,改进方案不知道。
尽早完成作业,不然时间仓促啊!
四、改进建议:
1、代码要写注释且要全面清楚(写代码时,不仅要写注释而且注释的时候一定要全面,这样才能让你写的代码更加容易被人理解。)
2、计划好了在写,不要想法闪过便开始大手一挥,策马奔腾狂敲代码。
3、尽量少的在循环中执行方法调用
尽量在循环中少做一些可避免的方法调用,如:
for(int
i=0;i<list.size();i++){
System.out.println(i);
}
可以修改为:
for(int i=0,size=list.size();i<size;i++){
System.out.println(i);
}
4、要学会多使用类,不要一个main函数一直到底。
五、综合性总结:
在写题目时,应用学到的新知识点去尝试着完成相应的问题,而不是不断去使用以前 的知识点完成题目,这样永远不会掌握并熟练新的知识点。
在这三次题目集中,学到了Java语言的入门的相关知识点,(源文件的声明规则,)学到了Java中的对象和类之间的关系,在题目集三中了解了相关正则表达式的相关知识点,以及如何使用正则表达式去查找,匹配,捕获相应的字符。对于需要进一步学习与研究的地方有:类的使用,正则表达式。前三次题目集中的代码基本上都是直接一个Main就结束了,没有其他的类,在以后的题目中尝试多用类去解决问题。对于正则表达式还是有点头疼的,所以还要继续学习,以便可以解决后面的题目集。
浙公网安备 33010602011771号