前言

虽然之前接触过java,也写过一些1000行左右的程序。可以说面向对象的思想和java的一些基本语法对我来说是没有难度的,但是这学期的面向对象依然给了我一个下马威。这几次的作业每次都很让我头疼。因为不仅要保证针对正确的输入要反馈出正确的输出,还要把错误的输入分辨出来。这样一来,譬如正则表达式和异常处理等新知识和小细节的不熟悉就会让每一次作业变成让人头疼的对象。

  其实抽象出来,我们现在完成的三个小任务,每一个都可以抽象成三个步骤。

  1. 检查输入的字符串是不是满足要求,如果不满足要求则报错;
  2. 对满足要求的字符串,将我们所需的数据从里面提取出来;
  3. 根据需求编写算法,代入数据,输出结果。

我将逐次分析我的三次作业失误出现在哪个步骤。

第一次作业

  度量结果

  类图

  第一次作业的算法实现还是很简单的,在没有时间复杂度限制的情况下,计算的时候只需要遍历两个需要计算的多项式,把次数相同的项的系数相加减,然后去除系数为0的项。最后输出得到的多项式就可以。那么问题主要出现在第一个步骤。

因为我们的多项式输入时以字符串的方式输入,而且格式十分复杂,为了防止正则表达式匹配时爆栈。我只好采用分阶段逐次匹配的模式。就是先看字符串是不是满足最基本的几个式子加减的形式。如果满足,看进行加减的式子是不是满足多项式的形式。如果满足,看多项式的每一项是否满足指导书中对系数项数的规定。只有这三个层次都满足的情况下才能算作是满足输入的要求。而且在检查格式的时候自然用到了多项式格式的划分,下一步提取成分也就是自然而然的结果了。

  我的问题主要出现在在分层次的过程中对格式的检查不太熟练,包括正则和java的字符串函数,在这个过程中忙于拆东补西,产生了可观的bug。而且第一次作业也对指导书的重要性认识不够。忽略了指导书上明确提出需要满足的要求,比如先导零和最多50项等等。

第二次作业

  度量结果

  类图

  第二次作业是我完成的最满意的一次作业。读指导书,写伪代码和算法,写了满满两张纸(可惜纸因为被我涂涂抹抹的太乱了给扔了。。。)。

  由于细心的准备,一二三步骤我都完成的不错。但是这次作业我犯了一个可以说是只有计算机系同学才会犯的错误。那就是大楼的层数是从一开始算的,但我在写算法和敲代码的过程中都很自然的认为大楼的层数是从零开始的,毕竟平时从零开始的时候太多了。然后是电梯的状态转移,我定义了一个Stage类用来表示电梯的状态,然后用Stage的数组来保存电梯从一开始的状态变化历史。包括执行请求更新状态和查询某条请求是否无效,都通过对这个状态数组的操作实现,虽然算法没问题,由于自己的考虑不周到,在代码实现的时候,在某些指令上下搜索状态的情况下会产生数组越界错误。这个反映了我另一个薄弱的知识点,那就是对抛出异常方法掌握的不熟练。

  顺便说一句,第三次作业是我唯一一次在互测中找出别人bug来的作业,因为自己的基础不怎么好,分到的作业又几乎都是AK了所有的公测点,所以互测找bug找的很辛苦。每次找bug的时候基本都是尽力去看别人的源代码,然后尝试有目的地去爆破错误。这一次的bug应该是对方对java中的大数类不熟练造成的。在判断一个字符串是否是数字(4字节)的时候,我的思路是先判断是不是整数,然后直接转化成bigDecimal类与那个最大的数字4294967295进行比较。那位同学判断整数之后,就开始先比较位数,然后在一位一位的开始与4294967295比较(常见的C语言风格),这样就造成了有先导零的时候字符串位数大而产生的判断失误。bug+1!

第三次作业

  类图

 

  这一次作业的失误完全是第三步算法的失误,在改正了第二次的可笑bug后,公测互测都没有找出格式方面的bug。因为第三次作业几乎继承了第二次作业的绝大多数内容。所以我本想在第二次的基础上进行修改,然后发现因为请求不一定按照发出请求的顺序执行的特点几乎和我的状态数组更新的方法完全冲突,然后就是无休止的出bug改bug,作业量超出了我的预计,直到ddl也没有完全改正,所以公测报了一堆bug。直到截至之后我才反应过来,不应该迷信继承的方法,应该直接重新实现和第三次指导书兼容的调度方法。算是痛定思痛吧,截至这篇文章发表前,结合多线程的指导书,第三次的坑已经基本填完,期待下一次的表现。

反馈

  希望助教或者其他大神能发一篇异常try-catch的教程,这方面自学看书看的迷迷糊糊的,几乎不敢使用,只能靠if-else维持程序的正常运行。感觉并没有发挥java这门语言的特性。如果能有这样的教程的话,一定会点100个赞的。

OO学习第一阶段总结的更多相关文章

  1. JavaWeb学习第一阶段结束

    模仿狂神实现简单的用户增删改查,增加了前端登录时的密码验证 JavaWeb学习第一阶段结束,相较于第一阶段的一味学习,第二阶段想拿出更多的时间来阅读别人的源码以及跟着做简单的小项目,同时进一步深入学习 ...

  2. JAVA学习第一阶段(1)

    java入门第一阶段 1.在java中接受并保存用户输入的值: (1)import java.util.Scanner//引入包 (2)Scanner input=new Scanner (Syste ...

  3. 暑期java(面向对象设计)学习第一阶段总结

    0.前言 本次博客针对的是暑假学习java(面向对象设计)的前三次作业的小结,第一次作业:7-1 对三个整数排序 7-2 对四个整数排序 7-3 对十个整数进行排序 7-4 对多个整数进行排序 第二次 ...

  4. linux学习第一阶段

    最近比较盲目的生活,翻来覆去,总归是为了自己,还是静下心来看看东西吧.好好学习.天天向上

  5. java学习第一阶段——面向对象

    你聪明有人会说你心机重, 你靠的是努力有人会说你运气好, 你说自己天生乐观有人会说你虚假, 有时候, 你明明就是一杯白水, 却被人硬生生逼成了满肚子憋屈的碳酸饮料. 人一生要遇见太多人, 即使有些话字 ...

  6. JAVA学习第一阶段(2)

    21. ArrayList类和LinkList类 注意:add,contains,remove,retain(取交集) 都可以+all表示对集合的操作 ArrayList c = new ArrayL ...

  7. Java学习-第一阶段-第一节:Java概述

    JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...

  8. C#学习第一阶段——语法基础

    C#是一门面向对象的编程语言.在面向对象的程序设计方法中,程序由各种相互交互的对象组成.相同种类的对象具有相同的属性,或者说是在相同的class 中的.       例如,以矩形为例,它具有高(len ...

  9. PHP四个阶段目标以及第一阶段学习内容

    PHP课程体系主要分为四个阶段,第一阶段讲的是网页HTML和数据库MySQL,第一阶段要学会网页制作的基础知识,熟用各种基本标签,对数据库进行操作,各项考核都能够达标,拿出出众的项目展示. 在第二个阶 ...

随机推荐

  1. CANVAS实现调色板 之 我的第一个随笔

    主题代码 <canvas id="color"></canvas> <script> var color=document.getElement ...

  2. easyui div 上下布局 最大化按钮 隐藏标题

    背景:easyui在做上下布局的时候,上面是数据列表,下面是数据图表.如下图 需要在上下面板右上角加上最大化按钮,以便可以全屏显示.逻辑就是当上面点击最大化时候,隐藏下面,主意:此时需要将下面的div ...

  3. php数组 组合排列 笛卡尔积

    function Descartes() { $t = func_get_args(); if (func_num_args() == 1) { return call_user_func_array ...

  4. JOOQ快速上手(基于springboot 和 postgresql)

    是什么 全称Java Object Oriented Querying,基于java开发出来的工具包,主要用于访问关系型数据库. 为什么用 Hibernate对SQL的操作太抽象 JDBC使用太过繁琐 ...

  5. # 20155207王雪纯 实验一 逆向与Bof基础

    20155207王雪纯 实验一 逆向与Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

  6. 四 Hive整合HBase

    安装环境: hbase版本:hbase-1.4.0-bin.tar.gz hive版本:   apache-hive-1.2.1-bin.tar 注意请使用高一点的hbase版本,不然就算hive和h ...

  7. 新建React Native项目步骤

    根据官方环境 https://reactnative.cn/docs/getting-started/ 搭建好之后 1.新建项目 打开React Native 命令行工具,并输入 react-nati ...

  8. 改革春风吹满地,安卓新系统Q上线腾讯WeTest

    “刚要适配安卓派,Q就来了.” 3月14日谷歌推出了期待已久的Android Q的首个测试版本Android Q Beta 1 ,这是Android系统推出以来的第十个大版本. 安卓Q相比之前的版本, ...

  9. 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译

    在使用PDB调试XAF时,发现好多变量都看不到.都被优化掉了. 下面的方法可以解决. 当你在使用Reference Source functionality in VS 2008 调试.Net 的源代 ...

  10. Rmdir方法

    删除现有目录或文件夹. 语法 RmDir路径 所需的_路径_参数标识的目录或文件夹要移除的字符串表达式. _路径_可以包含驱动器. 如果没有指定驱动器, RmDir 将删除当前驱动器上的目录或文件夹. ...