结对队友个人项目代码分析

项目要求

项目名称:中小学数学卷子自动生成程序

用户:

  小学、初中和高中数学老师。

功能:

  1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

  2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量:”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

  3、题目数量的有效输入范围是“10-30”(含10,30),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

  4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

  5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

附表-1:账户、密码


账户类型


账户


密码


备注


小学


张三1


123


张三2


123


张三3


123


初中


李四1


123


李四2


123


李四3


123


高中


王五1


123


王五2


123


王五3


123

附表-2:小学、初中、高中题目难度要求


小学


初中


高中


难度要求


+,-,*./


平方,开根号


sin,cos,tan


备注


只能有+,-,*./和()


题目中至少有一个平方或开根号的运算符


题目中至少有一个sin,cos或tan的运算符

 

代码分析

·优点

  1、变量名、函数名命名准确,符合代码规范要求,通俗易懂无歧义;

    

  2、语句书写符合规范要求;

   3、总体结构较清楚,包括小学、初中和高中的三个出题函数,以及最后的主函数。

    

·缺点

 队友之前因个人原因导致完成项目时间较少,项目结束的仓促,故留下了许多问题,在此正好进行分析,希望大家以后不要再犯。

  1、代码无注释

   虽然原则上是应尽量减少程序体内代码的注释,应该保持代码本身的直接可读性,但是完全没有注释是非常不好的习惯, 程序员枪击了解一下。良好的代码注释习惯,不仅增强了代码的可读性,提高编程效率,还可以增强自己本身对代码的理解,不管多久之后还是能够快速上手自己的代码。

   

  2、代码重复

   判断语句中的代码重复性非常高,完全可以替换成带参数的函数,使代码更加简洁美观,拷代码可是程序可维护性的杀手。

string s;
    while(cin>>s)
    {
        if(s=="切换为小学")
        {
            cout<<"准备生成小学数学题目,请输入生成题目数量"<<endl;
            cin>>count;
            time_t t=time(0);
            char buffer[128];
            struct tm *timeinfo;
            timeinfo= localtime (&t);
            strftime(buffer, sizeof(buffer), "%Y-%m-%d-%H-%M-%S", timeinfo);
            string a="/Users/jamesruio/Desktop/试卷集/";
            string path=a+username+‘/‘+buffer;
            string filename=path+".txt";
            for(int i=0;i<count;i++)
            {
                ofstream out1;
                out1.open(filename,ios::app);
                out1<<"第"<<i+1<<"题:";
                out1.close();
                PrimarySchool(filename);
                out1.open(filename,ios::app);
                out1<<endl;
                out1.close();
            }
        }
        else if(s=="切换为初中")
        {
            cout<<"准备生成初中数学题目,请输入生成题目数量"<<endl;
            cin>>count;
            time_t t=time(0);
            char buffer[128];
            struct tm *timeinfo;
            timeinfo= localtime (&t);
            strftime(buffer, sizeof(buffer), "%Y-%m-%d-%H-%M-%S", timeinfo);
            string a="/Users/jamesruio/Desktop/试卷集/";
            string path=a+username+‘/‘+buffer;
            string filename=path+".txt";
            for(int i=0;i<count;i++)
            {
                ofstream out1;
                out1.open(filename,ios::app);
                out1<<"第"<<i+1<<"题:";
                out1.close();
                JuniorHighSchool(filename);
                out1.open(filename,ios::app);
                out1<<endl;
                out1.close();
            }
        }
        else if(s=="切换为高中")
        {
            cout<<"准备生成高中数学题目,请输入生成题目数量"<<endl;
            cin>>count;
            time_t t=time(0);
            char buffer[128];
            struct tm *timeinfo;
            timeinfo= localtime (&t);
            strftime(buffer, sizeof(buffer), "%Y-%m-%d-%H-%M-%S", timeinfo);
            string a="/Users/jamesruio/Desktop/试卷集/";
            string path=a+username+‘/‘+buffer;
            string filename=path+".txt";
            for(int i=0;i<count;i++)
            {
                ofstream out1;
                out1.open(filename,ios::app);
                out1<<"第"<<i+1<<"题:";
                out1.close();
                SeniorHighSchool(filename);
                out1.open(filename,ios::app);
                out1<<endl;
                out1.close();
            }
        }

  3、过长函数

   主函数有百多行代码,大大提高了程序的理解难度,建议Extract Method(提炼函数) 适用于 99% 的过长函数情况, 只要将函数中冗长的部分提取出来, 放到另外一个函数中即可。小函数具有更强的解释能力, 共享能力, 选择能力, 小函数维护性比较好, 拥有小函数的类活的比较长。

    

     如时间获取完全可以写为一个函数而不是多次插入在主函数中

    time_t t=time(0);
    char buffer[128];
    struct tm *timeinfo;
    timeinfo= localtime (&t);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d-%H-%M-%S", timeinfo);

  4、部分代码效率低

   代码中还有许多可以优化的地方,如以下代码可以修改成switch()语句以提高程序效率。

    if(nandu==1)
    {
        for(int i=0;i<count;i++)
        {
            ofstream out1;
            out1.open(filename,ios::app);
            out1<<"第"<<i+1<<"题:";
            out1.close();
            PrimarySchool(filename);
            out1.open(filename,ios::app);
            out1<<endl;
            out1.close();
        }
    }
    else if(nandu==2)
    {
        for(int i=0;i<count;i++)
        {
            ofstream out1;
            out1.open(filename,ios::app);
            out1<<"第"<<i+1<<"题:";
            out1.close();
            JuniorHighSchool(filename);
            out1.open(filename,ios::app);
            out1<<endl;
            out1.close();
        }
    }
    else{
        for(int i=0;i<count;i++){
            ofstream out1;
            out1.open(filename,ios::app);
            out1<<"第"<<i+1<<"题:";
            out1.close();
            SeniorHighSchool(filename);
            out1.open(filename,ios::app);
            out1<<endl;
            out1.close();
        }
    }

switch(nandu)
{
    case 1:
        statements;
         break;
    case 2:
        statements;
        break;
    case 3:
        statements;
        break;
}

  5、代码逻辑不清晰

   有可以放入函数的部分,不应该写在主函数中引起逻辑混乱,如下代码打开关闭文件多次,其实可以写在PrimarySchool(filename)中,只需打开一次即可,提高效率同时也使代码更加简洁美观。

    if(nandu==1)
    {
        for(int i=0;i<count;i++)
        {
            ofstream out1;
            out1.open(filename,ios::app);
            out1<<"第"<<i+1<<"题:";
            out1.close();
            PrimarySchool(filename);
            out1.open(filename,ios::app);
            out1<<endl;
            out1.close();
        }
    }

  6、缺少项目要求功能

   项目要求同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复,而代码中缺少题目查重功能的实现。

总结

  编程习惯是编程非常重要的一部分,好的习惯能够大大提升程序效率,使得代码规模小,简洁美观,可读性强,也提升了代码扩展性。最后希望在结对编程中能够与队友互相学习,使得自身都能得到最大的提升。

原文地址:https://www.cnblogs.com/jiangjiangjiang/p/9708410.html

时间: 2024-10-17 13:39:54

结对队友个人项目代码分析的相关文章

队友个人项目代码分析

总体分析:其代码基本实现了要求的全部功能,即能完成登录.打印所需数目的试题.试题储存在txt文档中,且能以出题时间为文档命名,文档存在所对应的账户文件夹中,还可以识别账户和账户类型是否对应. 编译界面: 结果: 缺点: 1.在题目中,不论操作数多少个,每次都只出现一对,但其实在操作数更多的时候,括号其实可以出现3对,这里明显有不足. 2.代码中有两处需要判断账户与账户类型(小学.初中.高中)的关系,其实可以共用同一个函数来实现,但该代码将共用部分重复写了两次,增加了不必要的麻烦. 3.代码中有一

[Asp.net 5] DependencyInjection项目代码分析4-微软的实现(3)

这个系列已经写了5篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [Asp.net 5] DependencyInjection项目代码分析3-Ninject [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(1) [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2) 如果想

[Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable&lt;&gt;补充)

Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableService与ClosedIEnumerableService抛下没讲,现在我们就将该部分补充完整. 我们回忆ServiceProvider类的构造函数(对外部使用的)中,注册了IEnumerable<>.new OpenIEnumerableService(_table)的关系. public Se

[Asp.net 5] DependencyInjection项目代码分析4-微软的实现(中)

在 DependencyInjection项目代码分析4-微软的实现(上)中介绍了“ServiceTable”.“ServiceEntry”.“IGenericService”.“IService”.“IServiceCallSite”,这篇介绍下“IGenericService."IService"."IServiceCallSite"实现类 GenericService类 做为IGenericService的唯一实现类,该类言简意赅,请看代码: internal

[Asp.net 5] DependencyInjection项目代码分析-目录

微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [Asp.net 5] DependencyInjection项目代码分析3-Ninject [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(1) [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2) [Asp.net

[Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)

这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [Asp.net 5] DependencyInjection项目代码分析3-Ninject [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(1) [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2) [As

个人项目代码分析

需求分析: 该个人项目基本完成项目要求,可以随机出题,出卷查重功能都有; 代码分析: 优点: 1.逻辑清晰有条理,代码整体风格简洁明了,没有让人有太多的困惑; 2.合理的使用了goto语句,使得代码变得更简洁; 缺点: 1.代码不够结构化,没有使用面向对象的思维;没有将数据与方法归类进行封装,这样在移植代码或升级代码时往往会遇到难以预料的麻烦; 2.方法体内部内容过于庞大,一个函数方法里实现的功能太多,这样代码的维护和升级过于麻烦,可以分化各个功能为不同方法,这样整个结构会更清晰; 优化建议:

结对编程队友的个人项目代码分析

他的代码是用java在eclipse中编写的,基本实现了老师所要求的功能先说一下优点,优点就是代码精简,一百三十行完成,与我自己的代码相比,尤其是在生成题目的函数上,无疑更加精简并且算法巧妙,其函数只用一个n作为参数用来调控三种不同难度的题目转换,但精简的部分缺点就是生成题目方式比较单一,比如在括号的应用上,无法生成对整个括号进行乘方开方的题目.综合来说其整篇代码都是这种高效的风格,其中思路让我这种脑子不好且水平不高的人有所受益,但他的代码缺点也很明显,写代码的习惯有些差,比较杂乱且没有注释,通

结对编程队友个人项目优缺点分析

程序运行结果截图(如下) 首先说一下对方的优点: (1)该程序输出的题目很整齐,每道题都有题号,数字和符号之间都有空格,每行题目之间一行空行,让人看起来不会有密密麻麻的感觉: (2)他的代码写了一个teacher类,一个老师账户对应类的一个实例,teacher类里有一个做试卷的函数: (3)生成题目的算法使用了二分法和递归,从而使得代码很简单,很清晰. 缺点在于: (1)分层不够明确,teacher类里面有很多函数并不属于老师的行为,比如有一个将整数转化为字符串的函数,这样的函数并不是老师的行为