第一单元总结

一、作业分析

  第一次作业

  与后两次作业相比,第一次作业非常简单,仅要求对由常数项和幂函数组成的多项式求导。但由于缺少面向对象编程经验,我在这次作业中栽了不少跟头。

  (1)度量分析

    在第一次作业中,我还没有适应JAVA语言面向对象的coding风格。可以看到,我的第一次作业只有一个主类One,所有方法都堆在一个类中。这也导致了我的程序的各类复杂度都相当爆炸,总之是一次惨痛的教训。

    

     

  (2)bug分析

    首先,最重要的一点:

    不要特判!!

    不要特判!!

    不要特判!!

    由于寒假摸鱼的缘故,我对JAVA的很多功能都不甚了解,这个问题在这次作业中充分暴露出来了。

    

String matchB =str.replaceAll("[\\t ]*[\\+-][\\t ]*[\\+-][\\t ]+\\d", "w");matchB = matchB.replaceAll("[\\+-][\\t ]*[\\+-][\\t ]*[\\+-]", "w");matchB = matchB.replaceAll("\\d[\\t ]*x", "w");matchB = matchB.replaceAll("x[\\t ]*\\d", "w");matchB = matchB.replaceAll("\\^[\\t ]*[\\+-][\\t ]*[\\+-]", "w");matchB = matchB.replaceAll("\\d[\\t ]+\\d", "w");matchB = matchB.replaceAll("[\\+-][\\t ]*\\*", "w");matchB = matchB.replaceAll("x[\\t ]*\\*", "w");matchB = matchB.replaceAll("(xx)|(\\^[ \\t]*x)", "w");matchB = matchB.replaceAll("\\^[ \\t]*[\\+-][ \\t]+\\d", "w");matchB = matchB.replaceAll("\\^[ \\t]*[+-]*[ \\t]*\\d*\\*", "w");matchB = matchB.replaceAll("[\\t ]", "");if (matchB.length() == 0) {matchB = "w";}String matchC = matchB.replaceAll("\\*x\\^", "");String matchD = matchC.replaceAll("\\d\\*x", "1");String matchE = matchD.replaceAll("[\\+-][\\+-]?(\\d|(x\\^?))", "");matchE = matchE.replaceAll("x\\^?", "");

    这是我第一次作业checkstyle部分的代码,当时我还不能熟练使用正则表达式来检查代码格式。

    特判最大的弊端就是对编程者提取错误信息的能力提出了很高要求,一旦编程者考虑的错误情况不全,就极易在检查格式这一步上栽跟头。 

    此外,由于第一次作业中采用了朴素的特判处理作为checkstyle的方法,我的这一次作业程序的扩展性极差,第二次作业只能推倒重来,这也需要引以为戒。

   第二次作业

  第二次作业的内容是对包含简单幂函数和简单正余弦函数的导函数的求解,在这次作业中,我将上一次作业的代码推倒重建,代码风格开始逐渐偏向面向对象而不是面向过程。

  (1)度量分析

    在第二次作业中,我开始尝试使用多个类处理不同任务,但是有部分类依旧显得过于臃肿。这是我还没有面向对象化的体现。

    我的整体思路是在CheckStyle类中完成格式检查,在Poly类中完成求导计算和输出,Main类的功能则是整体调度。可以发现,我的思路依旧是将类作为一个大型函数来使用,其本质还是面向过程而非面向对象。各个部分也没有做到高度分工,尤其是Poly类,同时需要完成求导计算、化简和输出这三个任务。这也导致了Poly类的复杂度特别大。

  

   

  (2)bug分析

    我吸取了第一次作业的教训,采用了正则表达式作为checkstyle的工具,在提取项的过程中也将正则表达式作为搜索关键词使用。

Pattern p = Pattern.compile("^[ \\t]*[+-]?[ \\t]*[+-]?[ \\t]*" +"((([+-]?\\d+)|(x([ \\t]*+\\^[ \\t]*[+-]?\\d+)?)" +"|(sin[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|(cos[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?))" +"([ \\t]*\\*[ \\t]*(([+-]?\\d+)" +"|([ \\t]*x([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|([ \\t]*sin[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|([ \\t]*cos[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)))*)" +"([ \\t]*[+-][ \\t]*[+-]?[ \\t]*" +"((([+-]?\\d+)|(x([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|(sin[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|(cos[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?))" +"([ \\t]*\\*[ \\t]*(([+-]?\\d+)" +"|([ \\t]*x([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|([ \\t]*sin[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)" +"|([ \\t]*cos[ \\t]*\\([ \\t]*x[ \\t]*\\)" +"([ \\t]*\\^[ \\t]*[+-]?\\d+)?)))*))*+[ \\t]*$");

    这是我checkstyle时使用的超大正则,经过实际检验并不会爆栈。大正则的好处是比较直观,缺点则是编写和debug时会比较痛苦,只能说要慎用。

 

private String strin;private Map<String,String> match = new HashMap<String,String>();private Map<String,String> result = new HashMap<String,String>();

    我新建了两个hashmap变量用来保存项的内容,第一个保存求导前的内容,第二个保存求导结果。这样做的好处是便于合并同类项,可以把项的内容作为保存的关键词,项的系数作为保存的内容。

    我的这次作业中并没有出现bug,但由于我未考虑诸如sin(x)^2+cos(x)^2这类情况的化简,导致我的性能分比较低。

  第三次作业

    第三次作业在前两次作业的基础上加入了嵌套函数的定义,尽管这类嵌套仅限定在正余弦函数中,但这仍给编程带来了相当大的挑战。

  (1)度量分析

    在这次作业中,我使用CheckStyle类检查代码格式,Calculator类完成求导计算,Print类完成化简和输出,Poly类作为存储,Main类整体调度。可以看到,代码复杂度相较前两次有了明显降低。部分类的复杂度较高的原因可能是我定义了比较多的正则表达式变量的原因。

    

    

  (2)bug分析

    我这次作业的bug主要来自于正则表达式的编写错误。由于本次作业的结构与之前有较大差异,我重构了之前的正则表达式,不慎有一处括号写错了地方,导致在checkstyle部分产生了很严重的误判。

二、debug经验

    我debug的主要方法还是人工查bug(不会写评测机的泪),效率很低,但对我个人编程能力有很大的提升。尤其是在阅读代码风格很好的代码时,会让人有眼前一亮的感觉。

    我习惯先顺着别人的思路将他的程序按流程过一遍,从而分析他的程序在哪一步可能会出问题。这种方法对于找bug而言效率很低,但是在阅读学习他人程序时可以排上用场,靠人眼评测机来理解作者想要表达的意图,并将其1转化为自己的知识。

三、反思

    第一单元的三次作业,主要目的是给我们“练手”,逐渐培养面向对象的编程风格。因此,模块化编程就十分重要了,我现在习惯在coding前先理一遍整体思路,将各个部分需要实现的功能规划清楚,在一步步完善各个部分,最后将这些部件“组装”成一个完整的程序。

转载于:https://www.cnblogs.com/DoubleRider/p/10609120.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客16426 玩具谜题

题目描述 南有一套可爱的玩具小人&#xff0c;它们各有不同的职业。 有一天&#xff0c;这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈&#xff0c;它们有的面朝圈内&#xff0c;有的面朝圈外&#xff0c;如下图&#xff1a; 这时 singer 告诉小南一个谜…

牛客16438 回文日期

date1 input() date2 input()""" 判断是否是闰年 """ def isLeap(year):if (year%4 0 and year%100 ! 0) or (year%400 0):return 1else:return 0""" 判断是否是回文数 """ def isPalindrome(year):for i in …

Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树

Dish Shopping 将每个物品拆成p 和 s 再加上人排序。 然后问题就变成了&#xff0c; 对于一个线段(L - R)&#xff0c; 问有多少个(li, ri)满足 L > li && R > ri&#xff0c; 这个东西可以直接树状数组套平衡树维护。 但是这个题目有个特殊性&#xff0c;因为排…

牛客16494 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏&#xff1a;石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头剪刀布游戏的基础上&#xff0c;…

codeforces 1073E

题解&#xff1a; 考虑数位DP,状压出现过的数字集合S&#xff0c;f ( l , x , S , pz , lim )表示到第 l 位&#xff0c;数字为x&#xff0c; 数字集合为S &#xff0c;是否为前导0&#xff0c;是否贴上界 然后同时定义g为该状态下的数字和&#xff0c;利用 10^(l-1) * f(l , x…

时空AI技术:深度强化学习在智能城市领域应时空AI技术:深度强化学习在智能城市领域应用介绍...

来源&#xff1a;海豚数据科学实验室作者&#xff1a;京东科技 时空AI团队深度强化学习是近年来热起来的一项技术。深度强化学习的控制与决策流程必须包含状态&#xff0c;动作&#xff0c;奖励是三要素。在建模过程中&#xff0c;智能体根据环境的当前状态信息输出动作作用于环…

牛客16500 珠心算测试

题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练&#xff0c;既能够开发智力&#xff0c;又能够为日常生活带来很多便利&#xff0c;因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成…

读书笔记007:《伤寒论》- 手少阴心经

手少阴脉起心中&#xff0c;下膈直与小肠通&#xff0c;支者还从肺系走&#xff0c;直上喉咙系目瞳。直者上肺出腋下&#xff0c;臑后肘内少海从&#xff0c;臂内后廉抵掌中&#xff0c;锐骨之端注少冲。多气少血属此经&#xff0c;是动心脾痛难任&#xff0c;渴欲饮水咽干燥&a…

牛客16585 统计单词数

题目描述 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#xff0c;请你编程实现这一功能&#xff0c;具体要求是&#xff1a;给定一个单词&#xff0c;请你输出它在…

牛客21312 神秘餐馆

题目描述 一家神秘餐馆准备开放N天&#xff0c;牛牛 和 牛妹听到这个消息后&#xff0c;准备尽可能多的一起去吃午饭 餐馆有M道菜&#xff0c;牛牛和牛妹每次来只允许点一道菜&#xff0c;如果在第i天买了第j道菜 那么第i7天也只能买第j道菜 第i天第j道菜的价格为price[i][j] …

牛客21297 手机号码

题目描述 给你一个整数n表示手机号码的位数 再给你m个字符串表示保留的号码,比如911 110 120等 问你一共有多少的手机号码不以保留号码开头 n, m map(int, input().split()) s [] for _ in range(m):s.append(input())sum pow(10, n) num 0for i in range(m):flag Falsefo…

牛客16785 Cantor表

先找到第N个数在第几行第几列&#xff0c;然后根据规律进行计算 N int(input())t 1 while N-t > 0:N N-tt 1if t%2 0:print("%d/%d"%(N,t-N1)) else:print("%d/%d"%(t-N1,N))

Echarts富文本rich及格式化工具formatter的使用

Echarts官网上说&#xff0c;ECharts&#xff0c;一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xff0c;Firefox&#xff0c;Safari等&#xff09;&a…

国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...

来源&#xff1a;科技部科技部关于发布科技创新 2030 —“脑科学与类脑研究”重大项目 2021年度项目申报指南的通知国科发资〔2021〕265号各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff0c;国务院各有关部…

牛客16662 津津的储蓄计划

题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随时把整百的钱存在她那里&#xff0c;到了年末她…

Hinton获2021迪克森科学奖:他改变了AI,改变了世界

来源&#xff1a;AI科技评论作者&#xff1a;维克多编辑&#xff1a;青暮据卡内基梅隆大学&#xff08;CMU&#xff09;官方消息&#xff0c;Geoffrey Hinton 获得了2021年的迪克森科学奖&#xff08;The Dickson Prize in Science&#xff09;。此奖项设立于1969年&#xff0c…

牛客21783 牛牛的星际旅行

题目描述 在一个遥远的星球上&#xff0c;每周有N天&#xff0c;牛牛去了这个星球旅游&#xff0c;他恰好只带了N件不同的衣服&#xff0c;编号为1到N 每一天他会穿其中的某一件衣服&#xff0c;一周之内不能穿同一件衣服两次&#xff0c;而且假如某件衣服是在第x天穿的&#x…

国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南

来源&#xff1a;科技部科技部关于发布科技创新 2030 —“脑科学与类脑研究”重大项目 2021年度项目申报指南的通知国科发资〔2021〕265号各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff0c;国务院各有关部…

牛客21805 字符串编码与解码

链接&#xff1a;https://ac.nowcoder.com/acm/problem/21805 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 给你两个长度相同的字符串a&#xff…

数学有什么用处?看完后恍然大悟!

来源&#xff1a;算法数学俱乐部编辑&#xff1a;nhyilin高等数学有什么用&#xff1f;很多人问过我这个问题。其实大多数人在问这个问题的时候&#xff0c;心里已经预设了否定的答案。确实&#xff0c;对于大多数人来说&#xff0c;已经发展到了连数字都基本很少用了的一些高等…