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.应注意1231日以及每月的最后一天的下一天、同时也要注意题目规定的年份的范围,以及月份的范围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分,没有找到到底哪个地方还有问题,菜是原罪)。

https://regexr-cn.com/

https://blog.csdn.net/qq_23853743/article/details/109267876?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161735291216780266233234%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161735291216780266233234&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~hot_rank-6-109267876.first_rank_v2_pc_rank_v29&utm_term=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

 

 

三、踩坑心得:

做题过程中没有去记录踩过哪些坑,现在去想想不起来了,能回忆多少是多少。

用网上类似的例子来充当:

抛异常: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就结束了,没有其他的类,在以后的题目中尝试多用类去解决问题。对于正则表达式还是有点头疼的,所以还要继续学习,以便可以解决后面的题目集。

 

posted @ 2021-04-04 19:51  赵默一  阅读(71)  评论(0)    收藏  举报