oop第一次博客总结
OOP第一次博客总结
一、 第一次实验总结
1、第一次实验
(1)知识点总结 :题目集一主要考察书中前七章的知识点 为了让同学更好掌握基本程序设计,掌握熟悉利用字符串、数组、选择语句以及循环语句来编写一些简单的编程语言 掌握编写程序的基本语法知识
(2)题量:虽然本次题目有七道题,但由于考察的内容都很简单所以题量并不是很多 主要是督促学生学会一些基本的编程
(3)难度:如果将难度等级分为五颗星 此次题目集难度为一颗星 在编程题7-8中稍稍提升了难度
2、设计与分析(本次分析题目题目集一的7-8)
(1)因为这是第一次题目集 对类的使用还没有什么概念 因此并没有设计类 只有一个类写到底 并且运用了大量的 if else语句 因为本题考察的是构成三角形 所以要先判断输入数据是否合法 合法之后三个数据是否能构成三角形 这里要先进行判断三角形是什么三角形是等腰三角形还是普通三角形 如果是等腰三角形再进行判断是等腰直角三角形还是等边三角形还是正常的等腰三角形 分别判断后进行相应的输出 如果是普通三角形应该判断是普通直角三角形还是普通三角形 在分别对应输出

(2)分析 :大量的使用if else语句 并且嵌套使用 导致圈复杂度过高 在后续深入学习java后如果掌握更好的改进方法会进行改进
3、采坑心得:
(1)不要在大意了 因为着急完成pta忽略了一些判断是否能构成三角形的条件比如一开始只写了两边之和大于第三边并没有考虑完整的判断条件导致一部分测试点无法通过
(2)截止至目前为止仍然没有找到类似于1 1 √2 的点通过的办法 题目集结束后也参考了一部分同学的代码 但关于类似于1 1 √2 的点仍然没有得到解决
4、改进建议:自己的源码只是在主方法里一个类写到底 但现在经过一个月的学习 我认为应该设计类 不同的类用来执行不同的工作 执行单一职责原则
二、第二次实验总结
1、第二次实验
(1)知识点总结:第二次题目集主要考察对字符串的应用,布尔的检测 第六章方法的内容(但这里考察的并不是很明显,因为在题目开头已经给出了相应的签名,只需要在其中填入算法就可以),还考察了第七章一维数组的知识 掌握了简单的数组应用
(2)题量:题量不算特别大,虽然题目中从7-3开始稍有难度 但个人认为他们三道题属于一个类型的题 如果做出其中一道其他两道的思想与与第一道并不差什么,只要换一下算法即可 尤其7-4 7-5 属于同一类型的题 7-5属于7-4的升级版而7-4又在7-3的思想基础上进行改动 只要掌握其中的精髓 题目就不会很难
(3)难度:我认为难度属于一星半 本次实验的难度不再像第一次实验一样不需要太动脑筋就能编出,在写代码时需要思考如何能让代码最大程度上进行复用
2、设计与分析
㈠ 对7-4题目进行分析
(1)设计 本次题目老师已经给出设计思路通过方法的调用来实现 在每一个函数里调用自己的算法即可 在nextDate函数里我采用了数组方式 因为闰年与非闰年在2月份的天数上不同 所以利用数组储存每个月的天数如果是闰年那么天数就发生改变 下一天分为 是十二月 是否为十二月的最后一天 是不是普通月份 是不是普通月份的最后一天 利用嵌套循环完成。

(2)分析:由图可知 圈复杂度为17 虽然代码不长但是由于运用了大量的if else语句 以及嵌套的使用 导致圈复杂度过高 由于是题目给出了限定方法 所以也没有想过构造类
㈡ 对7-5题目进行分析
(1)设计与分析 : 同7-4一样 本题老师也给了方法以及提示思路 求下n天其实大致思路与下一天是一样的 所以我将7-4的大部分代码移过来 但与7-4不同的是这里对n的取值有正有负 一开始我想的非常简单 将7-4的代码复制过来 简单的把1改为n 结果只通过了部分测试点 重新思考以后我把它分为12月份和1月份并且在其中分为n>0和n<0两种情况 对应不同的算法 日期还是原来数组的方法 也算是我的一部分采坑心得 但就放在这里说了 如下图代码所示
import java.util.Scanner; public class Main{ public static void main(String[]agrs){ Scanner input = new Scanner(System.in); int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); int n = input.nextInt(); nextDate(year,month,day,n); } public static boolean isLeapYear(int year) { boolean isLeapYear = (year%400==0)||(year%100!=0&&year%4==0); return isLeapYear; } public static boolean checkInputValidity(int year,int month,int day,int n) { boolean checkInputValidity = (year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31&&Math.abs(n)<=10&&Math.abs(n)>=0); return checkInputValidity; } public static void nextDate(int year,int month,int day,int n) { int a=0; int b=0; int c=0; int flag = 0; if(isLeapYear(year) == false && month==2 && day==29){ flag = 1; } int []d = new int []{31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year) == true){ d[1]=29; flag = 0; } if(flag==0){ if(checkInputValidity(year,month,day,n) == true){ if (n==0) { a = year; b = month; c = day; } if(month==12&&n<0){ if(day==d[month-1]){ a = year+1; b = 1; c = 0-n; } else if(day>0&&day-n<=d[month-1]){ a = year; b = month; c = day - n; } else if(day>0&&day-n>d[month-1]){ a = year+1; b = 1; c = day-n-d[month-2]; } } else if(month<12&&n<0){ if(day==d[month-1]){ a = year; b = month+1; c = 0-n; } else if(day>0&&day-n>d[month-1]){ a = year; b = month + 1; c = day - n - d[month-1]; } else if(month==1){ if(day==d[month-1]){ a = year; b = month+1; c = 0-n; } else if(day>0&&day-n>d[month-1]){ a = year; b = month + 1; c = day - n - d[month-1]; } else if(day>0&&day-n<=d[month-1]){ a = year; b = month; c = day-n; } } } if(month==1&&n>0){ if(day==d[month-1]){ a = year-1; b = 12; c = d[month-2]-n; } else if(day>0&&day-n>0){ a = year; b = month; c = day - n; } else if(day>0&&day-n==0){ a=year-1; b=12; c=31; } } else if(month>1&&n>0&&month<=12){ if(day==d[month-1]){ a = year; b = month; c = d[month-1]-n; } else if(day>0&&day-n>0){ a = year; b = month; c = day-n; } else if(day>0&&day-n<0){ a = year; b = month - 1; c = d[month-2]+(day-n); } else if(day>0&&day-n==0){ a = year; b = month -1; c = d[month-2]; } } System.out.println(n+" days ago is:"+a+"-"+b+"-"+c); } else System.out.println("Wrong Format"); } else if(flag==1){ System.out.println("Wrong Format"); } } }
但是经过检测有两个点始终不过 一个是跨年另一个是在闰年的12月 在无数次的调试中发现了自己跨年时输入12-31输入-1时总会变成12-30 然后改了一下算法 这两个问题就解决掉了
(2)圈复杂度如下图 同样的老问题 大量的 if else 以及嵌套的使用 极大降低了代码的可读性增大了他的圈复杂度

3、采坑心得 :
(1)在写方法nextDate的时候 没有设置检测点 没有考虑到如果用户输入了平年29号是不合理的 由于没有设置检测点导致这一个点没有正常通过 但这是因为老师给出了测试点的样例 如果老师没给出检测点样例的话 以自己的思维能力未必会考虑到这一点
(2)写完nextDate后直接运行程序 并没有在主方法里调用该方法 导致程序无法运行,调用方法之后有没有传参进去 犯了一个经常犯的简单而又愚蠢的错误
(3)因为代码的删删改改 总是会出现花括号缺失的现象 写进博客里希望提醒自己 注意这个问题
(4)第一次在eclipse上编写的程序是把每个月份单独列出来成为一条if语句 导致代码过长且效率极低
4、改进建议:不要大量使用if else语句 可以尝试使用以下switch语句 不要把代码写的过于墨迹
三、第三次实验总结
一、第三次实验
1、知识点总结:考察了对对象和类面向对象思考 考察了正则表达式 对字符串的一些操作
2、题量:此次题目一共有三道题但一共给了十天时间 虽然题目难度上升 但是实际那还是很充裕
3、题目难度:两颗星 7-2给了类参考示意图 7-3给了解题报告 都有相应的提示
二、设计与分析
㈠对7-2题目进行分析
(1)设计:本题目老师给了类设计图 也给了类中要用到的方法 个人认为是属于题目集二中7-4的强化版 不是简单的利用方法来编写程序 而是采用对象和类的方式 算得上是真正意义上的java 但由于给定了类设计 核心算法也是一样的 所以不需要怎么设计
(2)分析
① 类图(老师给的提示类图)

②圈复杂度检测 圈复杂度为15 老问题了 还是if else的使用

3、采坑心得:
(1)重复了题目集二7-4的错误 没有检测平年29号
(2)在主方法里面没有调用类里的方法就直接进行计算和输出 主方法根本不输出
(3)在Date类里判断是否是闰年时 主方法当中的判断并没有获取输入的年份 而且自己检查错误有检查不出来 询问了同学才知道自己大意了 特意把这行代码标注下来 用来提醒自己
date.isLeapYear(date.getYear());
(4)在类里对变量进行操作时 直接进行操作就好了 因为有getter setter可以直接返回改变后的值不需要一直set去返回值
4、改进建议:
(1)因为是按照所给的判断是否是闰年当中输入了年份 但其实在类里 已经定义的变量不需要在从外部获取 可以将isLeapYear中参数去掉
㈡7-3的设计与分析
(1)设计与分析:一开始的设计是先把整个式子筛选出来 判断是否正确 在判断正确的前提下 将系数和指数分别放到类里进行计算 实际操作时发现如果这样做没办法进行计算 因此第二次设计时 一共写了两个正则表达式 一个是含有指数与系数的式子 另一个是没有指数的式子进行正则表达式 如果符合就将其group取出来 将取出的group放入一个新的字符串进行操作 然后输出 我将两个正则表达式判断放入同一个求导类里,只要用find()函数就出现了令牌预判错误 没有弄懂其中的原因 于是换了一条路径 代码如下 但不知道为什么find函数没有办法实现 一开始以为是软件电脑问题 后来询问同学问题也未得到解决 打算周一晚上去求助一下同学
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String str = input.nextLine(); Check check = new Check(str); check.checkInputValidity(); if(check.checkInputValidity() == false) { System.out.println("Wrong Format"); } } } class Check { private String str = ""; Dervation dervation = new Dervation(); public Check() { super(); // TODO Auto-generated constructor stub } public Check(String str) { super(); this.str = str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; dervation.setStr(str); } Pattern p = Pattern.compile("([+-]?[[\\s]*]?[+-]?[[0-9]*]?[\\*]?[[\\s]*]?x?[\\^]?[+-]?[[0-9]*]?)+" + "([+-]?[[\\s]*]?[+-]?[[0-9]*]?[\\*]?[[\\s]*]?x?[\\^]?[+-]?[[0-9]*]?)+" + "([+-]?[[\\s]*]?[+-]?[[0-9]*]?[\\*]?[[\\s]*]?x?[\\^]?[+-]?[[0-9]*]?)"); Matcher m = p.matcher(this.str); public boolean checkInputValidity() { boolean checkInputValidity = m.matches(); return checkInputValidity; } } class Dervation { private String str = null; List list1 = new ArrayList(); List list2 = new ArrayList(); public Dervation() { super(); // TODO Auto-generated constructor stub } public Dervation(String str) { super(); this.str = str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } Pattern p1 = Pattern.compile("([+-]?[\\s]*?[1-9]*)(\\*)([\\s]*)?x(\\^)([+-]?[1-9]*)"); Pattern p2 = Pattern.compile("([+-]?[\\s]*?[1-9]*)(\\*)([\\s]*)?x"); Matcher m1 = p1.matcher(this.str); Matcher m2 = p2.matcher(this.str); while(m1.find()) { list1.add(m1.group()); } while(m2.find()) { list2.add(m2.group()); } } }

没有办法实现find函数
3、采坑心得 :
(1)将group里面的字符串取出来以后觉得取出来的是数字直接进行计算更方便 但其实不可以对字符串进行操作 结果一直编译错误
(2)在编译器当中 正则表达式要有转义字符 都没加结果报错
(3)正则表达式当中不加入括号把项括起来 一开始根本是一团乱麻 还喜滋滋的贴上去 无语
4、改进建议 :因为这道题没有在规定时间内做完 因此不断地在改进 所以我已经能把我自己掌握的操作写了上去 可能做题比较混淆的点是动态数组的应用 但是老师给的雨刷的样例给了我很大的参考
对前三次实验进行的一个总体的总结
1、前三次的题目并不是很难 是对基础编程 对象和类 方法 以及面向对象思考的一个考察 最重要的收获就是终于知道了字符串是如何操作的 一开始看书中第四章 单纯的以为字符串的操作只有哪几类
2、大量的循环嵌套 条件语句嵌套会降低代码可读性 圈复杂度过高 应该尝试使用switch语句等 来降低圈复杂度
3、虽然只是学习了一部分正则表达式 但是正则表达式对于表达式正确与否的检验真的超级方便
4、在写程序的过程中 比如题目集三的7-3 虽然我想出了大致思路 但是落实到写代码时候却发现自己有好多地方不会实现 比如利用动态数组的时候完全是在照搬雨刷的样例 但没有理解到底是什么意思
5、对于类的单一职责原则 实现的还是不到位 有很多时候不能将我设想的两个类的功能关系连在一起 导致一个类干了好多件事 应该加强联系
6、发现自己写代码没什么注释 但写的代码可读性又不强 要加强代码的可读性减少圈复杂度 以及要学会注释

浙公网安备 33010602011771号