北航OO第一单元

????第①单元

知道要写博客实在太开心啦,因为我就喜欢写些奇奇怪怪的东西,然后沉迷于把它变得越来越??里胡哨(雾

杂谈 废话 和 心路历程 废话

大二下是来6系的第二个学期了,依然频繁地为同学们的强大感慨不已(同时觉得自己菜的不行)

开学不满一周,就能分明地看出来OO这门课和别的课不太一样。

起初在寒假的时候,我以为这有是一门类似于c语言或数据结构的课,教你一些语言或以语言为载体教你一些初级算法。后来寒假的pre2,3一出来我懵了,我以为要学的东西竟然已经要求你在寒假自学完成了?!于是本人承受了来自OO的第一波打击。不过这波打击后劲不够足,它只使我在寒假奋发图强了一天,一天之后我就想通了:),我必是追不上大佬们的进度了,那我还是慢慢来吧,于是我又享受老年生活了??

慢慢悠悠写完pre后,我了解了JAVA关于面向对象的特点和常用概念,感到疑惑,这不就是面向对象吗,这要学一学期吗。于是本人在开学后承受了来自OO的第二波打击。打击主要来自全世界最可爱的诸彤宇老师??虽然到现在还没见过诸老师本人,但本人小心求证、大胆推测诸老师打字速度一定很快,一定是一个十分认真负责的人,坚持每天鼓励我们熬夜勤奋学习,偶尔还教教我们地理啥的,让我奇怪的知识又增加了。

正如标题所说,以上都是废话(显然),诸老师一再强调这门课的难度,我方收到持续性伤害。再加上评论区的大佬们层出不穷的智慧结晶,让我深深地意识到我too young too simple,触发了被动技能【我太菜了,再不学就挂了】

第一次作业--简单多项式导函数的求解

  • 创建了两个类 Expression 以及 Item 并没有考虑到扩展性,只考虑到本次作业中表达式一定由指数幂的项组成,故创建了 指数幂 以及由其组成的 表达式 两个类。但事实上在阅读讨论区后(在此由衷表扬讨论区机制同时赞美耕耘奉献的大佬们)意识到我该重构了,但是怕这次互测出事子,决定下次再重构吧。反思自身是对接口的相关知识仍然过于薄弱。

知识点杂

我的输入法告诉我“杂技”比“杂记”更合适,我仔细这么一想,有道理!这些在实践中零碎摘取的小知识点不就像在OO大舞台上展演的绝活一般嘛???♀?!

  • BigInteger 类是JAVA中用来处理大数运算的有力武器,但注意它与String类一样属于不可变类型,对其做的任何修改都会产生新的对象,即不能通过调用它的方法来改变自身的属性
  • 在用matcher.group()之前一定要先用matcher.find(),否则报错 No match found
  • 调用split()的时候一定要注意会不会split()出空的数组,防止越界
  • 在迭代容器的过程中如果对容器进行修改就会导致java.util.ConcurrentModificationException异常,具体分析https://www.cnblogs.com/dolphin0520/p/3933551.html,在补充接口知识后进行探究
  • 构建自动评测姬?????
    • 黑盒评测姬

      比较常规的评测方法,借助python语言灵活实现(当年测p6用c语言写又臭又长的数据生成器用掉的时间比p6本身还长,反思得出:“菜的人总是瞎忙活“的结论,比如我现在在这自言自语、自娱自乐)

      1. 数据生成

        使用python中的xeger第三方库生成数据

        耗费了大量时间研究输出到文件里查看为什么会乱码——当python写入文件时,默认使用的utf-8编码,在win上打开会乱码,因为win默认编码是gbk。反正一会要用脚本实现自动化,于是直接改为print()结果并> in.txt解决了这个问题。

        之后编写bat文件编译运行.py文件并输出到in.txt,vscode每次执行python文件都显示了向终端输入的命令,并没有明白是什么意思,直接copy过来用了。(vscode的各种配置真实把我搞懵了,东西太多了)

      2. 编译运行java

        需要用bat文件逐行读入in.txt的内容并且输入给java文件,需要掌握批处理循环读入以及编译运行java的相关操作

        读了一篇博文,发现真正的强者初学java是不用eclipse、idea这种开发工具的??感谢OO课程组还没有变态到这个程度

        中文注释会让事情变得更麻烦,还是默认gbk的问题

        对java的文件流还是很陌生,光输出到文件这个动作就不停被卡。最后用了输出重定向,注意这里三个点:

        • 文件名最好是绝对路径具体到文件而不是文件夹
        • append=true
        • autoflush=true 典型it can run, but why? 但模模糊糊知道大概什么意思吧,似乎存在缓冲区的东西不flush就会被下次覆盖掉?
        System.setOut(
                new PrintStream(
                        new BufferedOutputStream(
                                new FileOutputStream("E:\\Java\\OO-hom1\\src\\out.txt",true)),true));
      3. 代值计算结果

        分总结上图指导书中给出的判定方法,在测试正误过程中主要有以下几个方面需要考虑:

        • 圈定数据范围
        • 数据量/每次
        • 测试方法 指导书采用为表达式赋值的方式检验表达式运算是否正确
        • 判据 指导书这里为什么这么判断我怎么不太明白。我们知道浮点数的计算是不精确的,但是为什么要除以这样一个
        • 对错误测试数据的处理 本例中考虑的十分深远,如果仅限于第一次作业应该没有人不用表达式正常求导做,因此不会出现不可导的点。但这一步仍十分重要。有时错误的数据会使程序陷入死循环中,此时如果在程序中加入检测模块,并且重新生成数据,制定一定的判断标准(如本例中的最多重试五次)会使测试程序健全很多!
      4. 对拍

        这一步和上一步在一个.py文件里实现

      5. 生成bat文件

        批处理你会了吗???

    • 白盒评测姬
    • 总结分析:
      • 黑盒评测机使用的是过程式编程,我们可以把任务明晰地分成几步,每一步单独编写一个过程函数来实现。那么为什么不用c语言实现?那当然是因为python灵活且有丰富的库(但用不熟python的本人写起来这叫一个费劲,什么东西都是现查,哎我太菜了)到这里我不禁在想,对于自动化测试这种应用向的程序,我们是不是也能用面向对象的编程方式实现呢?

        我们可以将每个数据点(在本例中是一行表达式)都包裹成一个类,其成员变量有自己的表达式,求导式;方法根据正则表达式构造表达式,计算求导式,输出表达式,代值计算求导式并返回结果。大体上他与我们程序中写的类区别在于表达式自动生成而不是由读入产生,计算求导式使用默认正确的第三方库。我们可以由后者生成数据输给前者,后二者一起计算、代值、比较。回过头来一看,这根本就是又写了一个实现方式然后左手和右手对拍,看起来不大行。

        个人认为面向对象思想下的程序很重要一部分就是实现对象过程中对类的部署,如果你的测试程序也用一样的方法部署,只是计算方法不一样,或许并不能测出来架构中存在的问题(本例中它只能测出来你用java写的求导是不是写对了),这完全就是上上学期和上上上学期的考察内容(自动加密,如果是间谍就看不懂?????)

        还有一个原因,在于我们现在借用的是python的第三方库,你在python和java两种语言里 左 右 为 男,难免要用到批处理调停,先编译运行哪个,谁的输出给谁做输入,都是你必须要思考的问题,自然而然地映射到了“流程”之上,这时候你在用python再面向对象一下至少在本题中显得没有必要。

        ?爱情也是一样的道理?,如果你是一个bat(您是个电商巨头? 只有奶茶妹妹这种的才配得上您!)想要找对象,在两个追求者之间左 右 为 男,那你最好只选一个当对象,另一个当作流程化的工具人就行(???为了自圆其说已经没有三观了)但如果你实在精力旺盛、闲的没事干,那你两个都当对象也不是不行(?)

        这时候你可能要想了,小孩子才做选择题,大人我都要!

        说的不无道理(根本就是在自言自语啊喂!)

        那我能不能让这俩人合个体(...),这样我看似只有一个对象,却拥有有两个对象的极致体验??这就引出了我们的白盒评测姬(原来黑盒评测姬变身之后美白了!!我的魔仙彩石呢??)

        以上又有一大堆废话(显然),我发现我废话的产出速度远大于正经话。讲废话的时候我高产似母猪,讲正经话的时候我是一位思维枯竭的程序员。这个故事告诉我们:

        今天讲废话,明天变母猪??做人,要从说人话开始


      • 由此我们过渡到在java内部实现评测(没想到吧,我讲这些是为了过渡)毕竟跨语言对我这种语言知识贫瘠的人来说很不友好,小脑瓜转不起来。thanks to 评论区大佬(再次感慨及感谢)为我们介绍了一种叫JUnit的工具 (大佬总是把我一些听都没听说过的东西玩的贼溜)


未 完 待 续

原文地址:https://www.cnblogs.com/hello-code/p/12381078.html

时间: 2024-11-05 20:45:23

北航OO第一单元的相关文章

oo第一单元总结

(1)    基于度量来分析自己的程序结构 方法和类的复杂度分析图片中ev(G),iv(G),v(G),OCavg,WMC含义如下: ev(G)即Essentail Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]之间,值越大则程序的结构越“病态”,其计算过程和图的“缩点”有关. iv(G)即Design Complexity,用来表示一个方法和他所调用的其他方法的紧密程度,范围也在[1,v(G)]之间,值越大联系越紧密. v(G)即循环复杂度,可以理解为穷尽程序流程每

2019年北航OO第三单元(JML规格任务)总结

一.JML简介 1.1 JML与契约式设计 说起JML,就不得不提到契约式设计(Design by Contract).这种设计模式的始祖是1986年的Eiffel语言.它是一种限定了软件中每个元素所必需的责任与义务的开发模式,程序设计中的每个元素都需要用规范的语言精准地限定其前置条件(Preconditions).后置条件(Postconditions)和不变式(Invariants).通过这三项限定,我们可以清晰地获得对一个函数功能的刻画,从而达成设计与实现的分离,便于优化.测试和生成文档.

OO第二单元单元总结

总述 OO的第二单元主题是电梯调度,与第一单元注重对数据的输入输出的处理.性能的优化不同,第二单元的重心更多的是在线程安全与线程通信上.这此次单元实验之前,我并未对线程有过了解,更谈不上“使用经验”,整体上第二单元三个实验也做的较为吃力.三次实验,也算是对线程的一步步入门吧,以及由于对于线程不是很熟悉,所以我总是下意识的把程序分割,尽量减少通信量. 第一次实验 基本需求:单电梯.无捎带要求.基本无性能要求. 基本实现:一个主线程或者一个主线程与一个电梯线程 我采用的方法是使用一个主线程,因为实际

面向对象第一单元总结

目录 一.任务需求 二.实现方案 多项式数据结构的设计 多项式解析与WRONG FROMAT判断 表达式求导 表达式简化 三.基于OO度量的程序分析 四.程序bug分析 五.对象创建模式 六.对比和心得体会 第一单元通过三次迭代的表达式求导任务建立对面向对象程序的初步认识,并熟悉面向对象的思维和编程方法. 一.任务需求 三次作业的需求如下: 第一次作业:求解简单多项式导函数 第二次作业:求解包含简单幂函数和简单正余弦函数的表达式的导函数 第三次作业:求解包含简单幂函数和可嵌套因子的正余弦函数的表

第一单元总结

登录vnc ip:172.25.254.250:7 ############虚拟机相关操作############## [[email protected] Desktop]$ rht-vmctl start desktop ###开启 Starting desktop. [[email protected] Desktop]$ rht-vmctl view desktop##显示 [[email protected] Desktop]$ rht-vmctl stop desktop##正常关闭

第一单元练习题

<<<第一单元练习题>>> 1.用student用户登陆系统图形界面 2.打开一个bash 3.修改student的密码,把密码更新成"T3st1ngtlme"(主机字母和数字) psaawad student 4.显示当前系统时间 date 5.显示当前系统时间,显示格式为:"小时:分钟:秒 AM/PM"(AM/PM为上下午标识) date +%X%p 6.显示"/usr/bin/clean-binary-files&

运维第一单元练习题

<<<第一单元练习题>>> 1.用student用户登陆系统图形界面 点击student user - 输入password 2.打开一个bash 右键--open in terminal application--utilities--terminal gnome-terminal 3.修改student的密码,把密码更新成"T3st1ngtlme"(主机字母和数字) passwd student -更改密码T3st1ngtlme 4.显示当前系统

第一单元. &nbsp; &nbsp; &nbsp; &nbsp; Linux 系统登录及部分基础命令

第一单元 1. 用student用户登陆系统图形界面 [[email protected] Desktop]$ rht-vmctl start desktop  ####打开虚拟机#### Starting desktop.                                      #####虚拟机开启中### [[email protected] Desktop]$ rht-vmctl view desktop    #####显示desktop#### [[email pro

.C#认证考试试题汇编:第一单元:1,11 第二单元:1,11

第一单元1,11 好久没用异或都快忘了,就让我们一起来了解哈啥子事异或 说的这个,就不经意让我想起书上的几种交换值得方法了 我这儿说的交换的方法是,不使用第三个变量来交换,而是两个 实现条件是C a=100,b=10;第一种 缺点可能会如果超出范围溢出a=a+b; a=110,b=10b=a-b; b=100,a=110a=a-b; a=-10,b=100b=100,a=10;第二种 缺点可能会如果超出范围溢出a=a*b;a=1000,b=10b=a/b;b=100,a=1000a=a/b;a=