结对同学@王磊

博客园地址:http://www.cnblogs.com/wangl009/

作业要求:

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,博客是分别完成的)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 

(1)功能1和功能2 

这两个功能就要求随机产生20道四则运算题(包含括号),用户输入一个答案与标准答案进行比对并判断对错,最后统计有多少四则运算题被正确解答。

因为功能1 和 功能2 之间只有是否加入括号的区别,而是否加入括号是随机进行决定的,所以只要实现功能2代码,功能1就可以完美解决。

在以前的数据结构学习中,学习过算术表达式的计算,所以和王磊同学商量之后直接使用堆栈实现中缀表达式转化为后缀表达式并进行运算。具体实现参考了严蔚敏主编的《数据结构》以及之前做过的后缀表达式ACM试题,由我确定功能需求,王磊来进行代码编写。

整个功能实现重点在于掌握逆波兰表达式的转化,难点在于随机数生成和转化以及括号的处理。

功能截图:

核心代码如下:

1)表达式求值

复制代码
double EvaluateExpression(char* MyExpression)
{
    SC *OPTR = NULL;
    SF *OPND = NULL;
    char TempData[20];
    double Data, a, b;
    char theta, *c, Dr[] = { '#', '\0' };
    OPTR = Push(OPTR, '#');
    c = strcat(MyExpression, Dr);
    strcpy(TempData, "\0");
    while (*c != '#' || OPTR->c != '#')
    {
        if (!In(*c, OPSET))
        {
            Dr[0] = *c;
            strcat(TempData, Dr);
            c++;
            if (In(*c, OPSET))
            {
                Data = atof(TempData);
                OPND = Push(OPND, Data);
                strcpy(TempData, "\0");
            }
        }
        else
        {
            switch (precede(OPTR->c, *c))
            {
            case '<':
                OPTR = Push(OPTR, *c);
                c++;
                break;
            case '=':
                OPTR = Pop(OPTR);
                c++;
                break;
            case '>':
                theta = OPTR->c;
                OPTR = Pop(OPTR);
                b = OPND->f;
                OPND = Pop(OPND);
                a = OPND->f;
                OPND = Pop(OPND);
                OPND = Push(OPND, Operate(a, theta, b));
                break;
            }
        }
    }
    return OPND->f;
}
复制代码

2)随机数生成以及转化为String以便进行堆栈操作

复制代码
string IntToString(int number)
{
    char str[200];
    itoa(number, str, 10);
    string str_ = str;
    return str_;
}

string NewNum()
{
    int num, num1, num2, fs;
    string str_num, StrNum, StrNum2;
    num = random() % 50 + 1;
    str_num = IntToString(num);

    return str_num;
}
复制代码

 

(2)功能3

可以自定义一个数量进行输入,将输入数量的四则运算题以txt文本形式进行输出。

我们将这部分功能与功能1 2进行了分割,用户可以根据需求选择使用哪个功能,当选择功能3时,就可以进行自定义数目的题目输出。

核心代码与功能1 2相同,主要进行了输出格式控制以及添加了输出到文件的语句,达到了输出到txt文件中时左侧为四则运算题,右侧为标准答案。

功能截图:

 

通过这次结对编程得到的收获是加强了团队协作能力以及沟通能力。

 

(2)结对编程的体会

通过结对编程可以将编写的思路扩大化,有时候王磊可能忽略掉一些细节,或者陷入了某些僵局,我就可以从不同的角度出发给他一些建议。

能够集思广益才是结对编程最大的优势吧。

 

(3)至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。

1)编程语言的选择。王磊一直使用C/C++编程,而由于我最近学习使用了部分Python,想使用Python,最后商议使用C/C++由王磊主要进行编写。

2)编程工具的选择。我本想使用VS进行编程,而王磊要求使用codeblocks,最后商议使用codeblocks。

3)思路不同。由于我第一次进行合作结对编程,所以缺乏一定的合作意识,在编写过程中产生了一定分歧,经过较长时间商议才达到了和解。

4)代码规范问题。由于我本人代码风格放荡不羁,而王磊之前一直进行的是合作编程,所以我按照王磊的要求制定了代码规范。

5)逆波兰表达式转化问题。王磊建议使用之前比赛中用过的逆波兰表达式转化模板,而我建议使用《数据结构》教材中的算法进行改写,最后决定选择根据严蔚敏编写《数据结构》进行改写。

 

要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。

结对同学@王磊

工作地点:宿舍

计算机:编写 MacBook Pro   ,调试 Dell Inspiron 17R

 

要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。

coding地址:https://git.coding.net/137911934/ElementaryArithmetic.git