结对编程评价队友代码

队友使用C++实现该个人项目,十分地面向过程

1、首先是用户初始化

  

  优点:使用map方便检索

  缺点:增加用户比较麻烦

2、main函数实现 登陆、生成题目、切换题目难度功能

  其中使用while循环来实现各功能界面间切换的功能,第一层while循环是登陆,登陆成功进入第二层循环生成题目,若输入“切换为XX”,但XX不为小学初中高中的任意一个,会进入第三层循环要求输入以上任一难度。

  优点:层次分明,层层递进

  缺点:如果界面数量变多,继续使用该方法会使得代码臃肿,可读性变差

3、使用流水线方式生成一道题目

  操作数的可能性为1~5个,将1个操作数的情况与其余情况分开考虑,其中小学不能生成1个操作数的题目

  只有一个操作数时:

    初中题目会固定生成带有根号或者平方的式子,操作数为1~100

    高中题目会固定生成带有三角函数的式子,不过函数里的数字是从给定的数组中选取,数组如下

    

    然后要保证tan值要存在,即(数字+90°)%180 != 0

  2~5个操作数时,使用流水线的方式生成,即一个一个地生成操作数,在生成操作数的过程中使用随机数不断判断是否插入左右括号、根号、平方,或者判断该操作数是否用三角函数替代。需要保证具体代码如下:

#level是题目难度,其中0代表小学,1代表初中,2代表高中
string GetOneQuestion(int level)
{
    stringstream ss;
    int bracketNum = 0;    //括号的数量,单位为对
    int operateNum;        //操作数
    bool leftBracket;    //判断该操作数前是否有左括号,若有,则在该操作数后不加右括号,因为要避免出现“(?)”的情况
    bool need = false;    //判断是否满足备注要求,初中题目至少一个根号或平方(概率皆为1/2),高中题目至少一个三角函数
    if (level == 0)
    {
        operateNum = 2+rand()%4;    //小学题目2~5个操作数
    }
    else
    {
        operateNum = 1+rand()%5;    //初中和高中题目1~5个操作数
    }

    if (operateNum == 1)
    {
        if (level == 1)
        {
            if (rand()%2 == 0)
            {
                ss << "√" << 1+rand()%100;
            }
            else
            {
                ss << 1+rand()%100 << "^2";
            }
        }
        else if (level == 2)
        {
            string fun;
            int num;
            //tan值要存在
            do
            {
                fun = g_triFun[rand()%3];
                num = g_triNum[rand()%46];
            }
            while (fun == "tan(" && (num+90)%180 == 0);
            ss << fun << num << "°" << ‘)‘;
        }
    }
    else
    {
        //生成第一个操作数
        if (rand()%4 == 0)
        {
            ss << ‘(‘;
            bracketNum++;
        }

        if (level == 1 && rand()%4 == 0)      //根号
        {
            need = true;
            ss <<"√";
        }

        if (level == 2 && rand()%4 == 0)      //操作数,或者sin(?)cos(?)tan(?)
        {
            need = true;
            string fun;
            int num;
            //tan值要存在
            do
            {
                fun = g_triFun[rand()%3];
                num = g_triNum[rand()%46];
            }
            while (fun == "tan(" && (num+90)%180 == 0);
            ss << fun << num << "°" << ‘)‘;
        }
        else
        {
            ss << 1+rand()%100;
        }

        if (level == 1 && rand()%4 == 0)                  //平方
        {
            need = true;
            ss << "^2";
        }

        //生成后续运算符与操作数
        for (int i = 0; i < operateNum; i++)
        {
            char c = g_operators[rand()%4];                                            //运算符
            ss << c;

            if (level == 1 && (rand()%4 == 0 || (!need && i == operateNum-1 && rand()%2 == 0)))      //根号
            {
                need = true;
                ss <<"√";
            }

            leftBracket = false;
            if (rand()%4 == 0 && i != operateNum-1)          //左括号
            {
                ss << ‘(‘;
                leftBracket = true;
                bracketNum++;
            }

            if (level == 2 && (rand()%4 == 0 || (!need && i == operateNum-1)))      //操作数,或者sin(?)cos(?)tan(?)
            {
                need = true;
                string fun;
                int num;
                //不能发生除0的情况,并且tan值要存在
                do
                {
                    fun = g_triFun[rand()%3];
                    num = g_triNum[rand()%46];
                }
                while ((c == ‘/‘ && ((fun == "sin(" && num%180 == 0) || (fun == "cos(" && (num+90)%180 == 0)))
                        ||(fun == "tan(" && (num+90)%180 == 0));
                ss << fun << num << "°" << ‘)‘;
            }
            else
            {
                ss << 1+rand()%100;
            }

            if (level == 1 && rand()%8 == 0)                  //平方在操作数右边
            {
                need = true;
                ss << "^2";
            }
            if (rand()%4 == 0 && bracketNum > 0 && !leftBracket)      //右括号
            {
                ss << ‘)‘;
                bracketNum--;
            }
            if (level == 1 && (rand()%8 == 0 || (!need && i == operateNum-1)))                  //平方有可能在括号右边
            {
                need = true;
                ss << "^2";
            }
        }
        while (bracketNum--)
        {
            ss << ‘)‘;
        }
    }

    ss << ‘=‘;
    if (g_questions.find(ss.str()) != g_questions.end())
    {
        return GetOneQuestion(level);
    }
    else
    {
        g_questions.insert(ss.str());
        return ss.str();
    }
}

  优点:按流程一步步来,清晰明了,有考虑三角函数值能够手算、tan值要存在,当三角函数前一个运算符为除号时,三角函数的值不为0

  缺点:要按流程仔细考虑,根号、平方、左右括号应该有可能在哪出现都得考虑周全,经常会遗漏某些条件

4、题目查重

  使用set容器实现,将该用户文件夹下所有题目都添加到该集合中,当生成一道题目时,判断是否已保存在集合中,若已存在则再生成一道题目,否则将其输出到文件中并加入到集合里

原文地址:https://www.cnblogs.com/ling1527/p/11553134.html

时间: 2024-10-07 02:11:03

结对编程评价队友代码的相关文章

结对编程:队友代码分析

按照结对编程要求,对队友的代码进行分析.在代码中发现的问题可以提醒队友或者警示自己. 优点: 一.代码以外: 1.使用语言为Python,比起JAVA和C++方便许多,而且实现许多功能也方便许多,可以说是从开始就为拓展打好了基础.事实上也的确因为这点,我们选用了他的代码作为核心 2.文件按功能分为几个文件,命名为CreatSymbol.CreatFirst.CreatSecond.CreatThird.Test.各个函数位置明确,命名规范 3.注释详细且明确.文件/函数的开头都有注释,各关键部分

结对编程_队友代码分析

项目需求:完成一个能够根据用户身份和用户请求自动生成小学,初中,高中试卷的程序,具体要求就不细说了. 队友代码的赏析:首先我得说说他的优点,不然你看缺点可能会很累(开个玩笑啦),程序的基本功能可以实现,能够对不同用户的不同需求通过随机数生成相应试卷,同时也能够创建txt文件在个人相对应的文件夹目录下,对于稳健操作的相关代码有一定的了解,实现通过循环输入判断输入是否合法,生成的三个等级的试卷有难度区分度并满足出题的基本要求. 不足: 1.从生成的题目来看,首先漏了两个要求,一个是比较难处理的括号问

结对编程——对队友代码分析

要实现的功能: 1.命令行输入用户名和密码,两者之间用空格隔开(程序预设小学.初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学.初中和高中三个选项中的一个.否则提示“请输入正确的用户名.密码”,重新输入用户名.密码: 2.登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学.初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题.每道题目的

中小学数学卷子自动生成程序-结对编程之队友代码分析

一.编程语言:C++ 二.代码解读与分析: 1. 项目逻辑 通过输入信息与数组中存储账户信息比对完成用户登录.根据不同的类型要求生成相应类型的试卷并查重.将生成题目以指定的形式存放在指定文件夹下.过程中可切换试卷类型. 2.函数功能说明 int main():主函数负责调用各个功能函数,将各个功能模块按照项目实际的使用情况与应用逻辑结合适当的提示性信息进行组织和套用. void SetPrimary(int n):生成小学类型的试卷. void SetMiddle(int n):生成初中类型的试

结对编程之队友代码分析

优点: Java GUI界面: 界面简约,操作简单,实用性强   2 .独特的解题思想(上代码) //生成对应年级的题目     public String getSubject(int type) { Random rand = new Random(); int Num,NumOpe; if(type == 0)   NumOpe = 4; //小学运算符下标取前4个 else if(type == 1)  NumOpe = 12;    //初中运算符取前12个 else NumOpe =

结对编程初体验——代码复审

这一次和室友结对编程,第一项任务就是互看代码.想到上一次这样认真看她的C++代码,是一年前学程序设计这门课时,帮她人工debug.虽然都是从头到尾认真读代码.通逻辑,感觉却是不同的,之前的关注点是bug在哪,而现在却是带着任务的,要关注代码核查表中的项目.结果看着看着,总感觉自己在找茬dbq 回归正题↓ 编译环境:Dev-C++ 5.9.2 程序语言:C++ (一)优点: 能发现的优点,大多都是自己的缺点 1.代码可读性强. 通过详细的注释,即便是我们两个的个人项目使用的不是同一种语言,我看懂她

结对编程之队友篇

我的队友是戴旭文,他的编程能力的确比较强,我们一起讨论这个作业的时候,他的想法比较多,而且我没有想到的他也帮助我引导我怎么去构想,也感谢老师给我安排了一个这么给力的队友. 一开始我们都坚持各自的想法,觉得还是自己的想法好,别人的都不好,争执不下,本想那就自己做自己的,但是如果这样的话,那我们结对编程就没有什么意义了,最后各自让步,俩人一起讨论一个比较适合彼此想法的思路.我们一般约在图书馆六楼研究室一起学习,有时候编程过程中我们有需要翻资料书籍的,就直接可以到图书馆五楼借相关的专业书籍查找资料,这

结对编程-对队友的评价

在结对中,我是和队友何宇明完成的,在整个过程中,我们碰到了一些实际的困难,不太懂java,C语言也不是很好,所以整个项目的质量不高,许多功能没有完善或者说没有做出来,不过我们也有努力去解决这些实际的困难,虽然最后还是不尽人意,但我们也有相互学习,我也看到了对方的优缺点. 一.对方优点 1.做事认真,比较负责,遇到不懂上网去查询相关的资料让我们一起去学习,去弄懂. 2.对时间的把握比我好,在我懒时,会督促我把进度提上来,起到了监督的作用. 3.一些代码的编写比较熟练,一些方面会教导我. 二.需要改

结对编程之队友互评

结对队友-孙玉攀 代码是C++语言编写,分为四部分:三个级别的题目生成和输出,以及主函数. 第一段是小学题目的生成,以字符为单位,依次生成数值和符号,相当精简,能够完成任务. 第二段和第三段代码虽然较长,但是代码格式很好且有详细的注释.(如图,每个部分有详细的分类和注释) 最后主函数部分包含了用户登录和题目数量选择. 代码的优点: 1.结构完整,代码格式整齐 2.注释非常详细且到位 3.没有冗余的部分,很精炼 代码的问题有很多: 1.功能实现不全:括号.查重.创建文件夹及时间戳命名: 2.不能保