个人项目互评:中小学数学卷子自动生成程序

题目及基本要求,可参考:

https://blog.csdn.net/qq_44937699/article/details/101034625

本次评价主要基于Google C++ Style Guide,可参考:

https://blog.csdn.net/baishuo8/article/details/81630033

评价主要基于三个方面:

       1.功能完成与扩展性

        2.代码规范与可读性

        3.代码性能(规模,占用空间,执行效率)

       下面感谢受害者陆静同学提供自己的代码供我进行评价(毒舌),提前抱歉保命,话不多说,我们一起来看看代码吧。

 

一.功能完成与扩展性

(1)功能完成

          首先观感就很不好,一进入项目文件,只有孤零零的一个cpp主程序。

         

          看着就很不专业,一看就会出现没有将头文件、函数等与主程序分离的等等问题。Google C++ Style通常每一个 .cc 文件都有一个对应的 .h 文件. 仅有一些常见例外,如单元测试代码和只包含 main() 函数的 .cc 文件。

          接下来进行功能的部分测试。

          登录功能

           退出功能

          生成试卷功能和切换功能

        操作均在操作台实现,我们去看一下生成的文件:

 

        这里发现未生成正确的文件夹及文件,打开代码查看生成路径,陆同学写的是自己电脑的完整地址,程序虽然能运行,但在正确文件夹里生成不了,这里更好的处理方式其实是只包含当前文件夹的短地址,或者再做一个相关程序,这样换一台电脑也能正常运行了。

        更改相关地址后,生成正确题目:

  

        基本功能验证完毕!均已实现。

(2) 扩展性

        1.用户和密码是直接生成的判断语句,较难实现大规模的修改与数据储存,建议最好还是文件流输入或结合数据库。 2.

         2.程序逻辑是小学、初中、高中各自用一个函数去写,里面不但复用的代码很多,而且如果有别的运算符比如大学难度,也要重新写一个大学的......扩展与修改难度大,其实仔细阅读后小学、初中、 高中,三者区别不大,一个判断语句足以......函数的作用更多应该是去实现一个独立的功能,而不是将程序部分代码变成一个函数。

 

 

 

 

二.代码规范与可读性(共同分析)

         首先看开头:

       1.  头文件、函数与主程序混在一起,可读性很差,也容易产生错误。就算属于本程序的函数也最好先前置声明,然后函数定义放到后面,不然略显臃肿,当然这个也是不被google规则所建议的,最好写到头文件里。

              2.  本段代码的一个优点是使用了部分命名空间,而我就直接using namespace std了,这样不太好,会造成命名空间的滥用,但应该在作用域结束后进行声明,本代码也没有这部分的工作。

              3.  基于Google规范头文件最好是按照头文件首字母的英文顺序进行排列。

              4.  基于google代码标准,最好不好有开头的注释和说明,虽然提高了可读性,但可能会导致一定的问题。

                          我们继续看下去,这部分他先写了函数,前面也说了这样做不太好,我们来看一下:

 

   以王五这个函数为例:

                      1. 首先,在google规范中,函数需要在开始进行功能的简要说明与接口的说明

                     2. 局部变量尽可能置于最小作用域内,并在变量声明时进行初始化,像本函数中开头的flag1就写的太前面了。这样规范的好处是增强

                          代码的可读性——尽快知道这个变量生效的地方。

                     3. 所有的大括号应该独占一行,显然本程序并没有这样做。

                     4. 缩进,缩进!我使用的是devc++自带的快捷键ctrl+shift+a,会很大程度上提高代码的可读性。

                     5.接口输入参数如果是常量需要const,保证正确性

                     6.函数名字中文拼音不太好,最好还是单词user_primary类似这样比较好。

                     7.注释较少,虽然google规范中不要求注释的量,但规定了在很多地方需要进行注释。包括但不限于以下方面:

       1) 类定义附带一份注释,描述类的功能和用法,除非它功能相当明显。

       2) 函数声明处描述函数的功能和各个输入输出参数以及返回值。

       3) 如果变量名不能明显让读者明白,就给数据成员加上必要的注释说明。

       4) 代码实现中,给巧妙的,晦涩的,有趣的,重要的地方都加上注释。

       5) 不需描述显而易见的代码,不要用自然语言翻译代码作为注释,除非代码很难懂。

       6) 使用 TODO 注释暂时未完善的代码。

       7) 使用 DEPRECATED 注释标记某个接口已经弃用,它的存在只为了兼容性。

  1. 这里很明显10行左右的代码,可以改为内联函数空间换时间加快运算效率。

        2. 前面说的,这些可以用文件流来进行传输判断,增强了扩展性。

               最后,主函数,主要是做了一些前端的工作,没什么太大的问题:

  

                     1.没有退出方式,只能最多退回登录界面,while(1)内应该设置一个判断退出语句

                    2.逻辑字符较少导致文本量过大,每一个难度的文本基本上重写了一遍,,其实不用全部写三遍,就跟前面说的函数一样,感觉就是分成了

                       小学、初中、高中三个部分,其实基本逻辑差不多,一个判断或者选择语句足够了。

                    3.可以学习的优点:前端界面较好,起码有着相应的说明和提示。像我的代码,就没有一个系统的标题,也没有有些步骤的提示,就会显得对用户很不友好。

                    4.文件命名为了陆静.cpp,其实最好是英文的,因中文可能会导致一些错误,原因是编码方式不同。

 

三.代码性能(规模,占用空间,执行效率)

                                    

 

 

 

 

 

代码规模:446行

评价:有点长了,相关的原因在前面也已经叙述了,主要还是重复的部分太多,基本据我了解,大多数同学在不添加其他有用功能

的情况下300行代码基本可以很好地完成本项目了。

占用空间:仅分析栈堆情况,只有几个一维短数组与20几个变量,占用空间较小,输出大小也较小。

评价:略(没啥好评价的,如有指正,可以评论告诉我)

执行效率:时间复杂度:主要在生成不同难度题的地方利用了双循环,时间复杂度为O(n^2)。编译时间:我拿我的对比了一下慢了0.1s,

可能是由于代码规模不同的原因,可以由陆同学之后去进行改进。

 

总结:

不得不说,看别人代码也是一种学习的过程,在对照google的c++标准时不但更加熟练与清晰的理解了这些规则。也在找到同学的错误的同时也能发现

自己的不足与缺点,也能触发一些代码改进的新的灵感,难怪老师在课堂上说国外有的工作就是一个人写代码另一个人旁边看与检查,这还是有一定道

理的。同时,经过这次个人项目和结对项目前期的互查,也让我改掉了之前写代码胡乱写的坏习惯,逐渐开始尝试规范化的代码了,只能说真不错√

同时,本人在查询资料的过程中,找到了一些宝藏资料,现分享在下方

1.google代码标准化形象图(这个是真牛)

 

                      2.Google代码标准化讲解

                        https://blog.csdn.net/xiaoting451292510/article/details/89377958

 

 

posted @ 2021-09-29 09:02  没好好、  阅读(80)  评论(0)    收藏  举报