zoukankan      html  css  js  c++  java
  • OO第一次博客作业

    OO第一次博客作业

    BUAA_1706_HugeGun

    目录

    关于面向对象

    三次作业遇到的BUG

    代码分析

    互测感想

    一点感想

    关于java&面向对象

    ​ 这学期才接触java,面向对象以前只在C++里面用过一点,所以一开始对于怎么写,以及java语法有点不太适应。

    个人体会:

    关于类:

    1、类似C++中的struct,构造函数、内置方法(函数 )都比较相似

    2、但是无法重载运算符,这是比较难受的一点。

    3、尽量避免代码的重复,把private和public的方法搞清晰。

    4、把我们需要解决的问题进行拆分,拆得好就写得快

    关于java语法:

    1、小心使用运算符,第一次作业用==去比较两个BigInteger调了很久。

    2、慎用clone,(我选择手写copy

    3、注意可变类的赋值是引用

    ​ OO其实我学得不太多,理解也不够深,像继承等等东西,也没怎么用过,等以后再来谈这方面吧。

    三次作业遇到的BUG

    由于公测没有wa过,所以列举一下写作业过程中的bug和互测的bug

    第一次作业:

    1、使用==比较两个BigInteger

    2、全空格/tab

    3、答案为0没输出

    4、特殊符号

    5、大正则爆栈

    6、指数上的空格分隔符号和整数

    第二次作业:

    1、sin (x)判为WF

    2、s in(x)没判为WF

    3、递归使用全局变量

    4、使用引用导致不想改的对象值改了

    第三次作业:

    1、嵌套括号中的空格

    2、替换缩进tab为空格把合法字符集的tab替了

    3、多层嵌套出问题

    总结:

    bug通常来自三种原因:

    1、对题面理解的疏忽

    2、对自己代码架构细节出现问题(使用错误方法

    3、不小心写错

    在经历三次互测之后,我发现, 别人关于1,2产生的bug较多,我关于2,3产生的bug较多。

    当然,关于别人的bug是在强测之后,自己代码的在进入互测时只存在第3种bug,第2种bug在编写时有时出现,这意味着我还需要写作业时更细心,尤其是第三次作业的第二个bug让我非常地伤心555

    代码分析

    第一次作业:

    类图:

    1553580380450

    耦合度:
    calss OCavg WMC
    main.Function 5.25 63.0
    main.Main 3.0 3.0
    Total 66.0
    Average 5.076923076923077 33.0

    第一次作业比较简单,用map记录不同指数对应的系数和,也没有必要为项再建个类,合并同类项和基本的优化输出就能拿够性能分。

    第二次作业:

    类图:

    Package main

    耦合度:
    class OCavg WMC
    main.Function 4.153846153846154 54.0
    main.Main 3.0 3.0
    main.Optimize 4.454545454545454 49.0
    main.Term 2.6666666666666665 48.0
    Total 154.0
    Average 3.5813953488372094 38.5

    没有在第一次作业的基础上扩展,因为项的内容增加了很多,解析字符串的方法不变。

    使用四元组来表示一个项,分别为一个项的系数,x的指数,sin的指数,cos的指数。若干项装进map形成function。

    这次作业优化写了很久也拿到了满分,详情会在优化博客描述。

    第三次作业:

    类图:

    Package main

    耦合度:
    class OCavg WMC
    main.Function 5.071428571428571 71.0
    main.Main 4.0 4.0
    main.Term 3.0952380952380953 65.0
    Total 140.0
    Average 3.888888888888889 46.666666666666664

    递归下降,Term类和Function类互相调用以解决function嵌套,写起来更简单。

    项改为三元组,记录一个项的系数、x的指数和一个String表示一个固定字符串。

    优化改为一层内两两合并同类项,因此没有再开一个类来优化,在课下的随机数据表现很好,长度能做到某些其他架构或者不优化的20%。输出没有一个多余的括号。

    互测感想

    据说代码风格是为了互测别人能看懂自己代码,而三次作业我没有一次看过别人代码(除了帮别人消除warning,这显得很尴尬。

    对于A组的同学,只要是强测数据不水,很难是能通过看代码看出bug来的。

    测试永远是检查一个代码是否有bug的最简洁的方法。

    本地怎么测呢,对拍。

    对于较短的代码,不需要对拍即可检查代码,证明正确性。而对于很长的、含有多个文件的代码,对拍显得更有效率和效果。

    话不多说,附上第三次的互测对拍代码(我是assassin)。

    其中, 每次运行完之后那次调用assassin求二阶导是为了判断那个人的输出是否满足格式要求。比如sin(2*x)之类的,而比较输出正确性是用CPP输出python代码然后调用python的sympy的化简来比较导数是否和我的等价。

    :)
    data.exe 6
    java -cp alterego/src Main < a.in > alterego.out
    java -cp assassin/src main.Main < alterego.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc alterego.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> alterego.out
    	) else (
    		echo ok
    	)
    )
    java -cp archer/src poly.Main < a.in > archer.out
    java -cp assassin/src main.Main < archer.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc archer.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> archer.out
    	) else (
    		echo ok
    	)
    )
    java -cp assassin/src main.Main < a.in > assassin.out
    java -cp assassin/src main.Main < assassin.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> assassin.out
    	) else (
    		echo ok
    	)
    )
    java -cp berserker/src homework.Main < a.in > berserker.out
    java -cp assassin/src main.Main < berserker.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc berserker.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> berserker.out
    	) else (
    		echo ok
    	)
    )
    java -cp caster/src derivation.Main < a.in > caster.out
    java -cp assassin/src main.Main < caster.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc caster.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> caster.out
    	) else (
    		echo ok
    	)
    )
    java -cp lancer/src PolyCal < a.in > lancer.out
    java -cp assassin/src main.Main < lancer.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc lancer.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> lancer.out
    	) else (
    		echo ok
    	)
    )
    java -cp rider/src Main < a.in > rider.out
    java -cp assassin/src main.Main < rider.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc rider.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> rider.out
    	) else (
    		echo ok
    	)
    )
    java -cp saber/src Derivation < a.in > saber.out
    java -cp assassin/src main.Main < saber.out > temp.txt
    fc temp.txt wf.txt
    if errorlevel == 1 (
    	echo  ok
    ) else (
    	fc saber.out wf.txt
    	if errorlevel == 1 (
    		echo "WRONG FORMAT!" >> saber.out
    	) else (
    		echo ok
    	)
    )
    
    
    test.exe assassin.out alterego.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo alterego >> hack.txt
    	)
    )
    test.exe assassin.out archer.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo archer >> hack.txt
    	)
    )
    test.exe assassin.out berserker.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo berserker >> hack.txt
    	)
    )
    test.exe assassin.out caster.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo caster >> hack.txt
    	)
    )
    test.exe assassin.out lancer.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo lancer >> hack.txt
    	)
    )
    test.exe assassin.out rider.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo rider >> hack.txt
    	)
    )
    test.exe assassin.out saber.out
    python test.py > test.out
    fc test.out test.ans
    if errorlevel == 1 (
    	fc assassin.out wf.txt
    	if errorlevel == 1 (
    		copy hack.txt + a.in
    		echo saber >> hack.txt
    	)
    )
    goto )
    
    一点感想

    关于OO,我学习得不够,要抽空多看看菜鸟教程。

    关于作业,我太想做好了,导致花掉很多时间,所以我第三次作业没有花太多心思优化,一方面因为事情太多,无心优化,一方面我的构架上的简单优化对于随机长数据表现太好。对于优化,我会尽量快地把优化博客写出来。锅有点多,这几天快死了

    另外,感谢助教PaParaZz1对我们的指导、建议,感谢niupple、mountvoom、prime21、login256、fafa、wjy、wzm等大佬的帮助和鼓励

    大家一起加油吧

    ps:用的高中建的blog,里面有很多算法题题解和模板,有兴趣的可以玩一玩。

  • 相关阅读:
    代码解析&Filter用户授权例子
    session
    软件工程结对作业2
    软件工程结对作业1
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    KMP算法
    哈希表
    Mysql事物隔离级别
  • 原文地址:https://www.cnblogs.com/HugeGun/p/10597743.html
Copyright © 2011-2022 走看看