代码改变世界

第四次作业—四则运算

2017-10-11 16:02  李圆圆  阅读(186)  评论(0编辑  收藏  举报

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

1功能一

重点:判断符号的优先性。因为这是给中学生出的题目,所以在试题的编写上,不能过于简单雨不能太困难。

void check(char c, stack<char>& coll2, deque<char>& coll3)
{
    if (coll2.empty())
    {
        coll2.push(c);
        return;
    }

    if (isPra(c))
    {
        if (c == '(')
            coll2.push(c);
        else
        {
            while (coll2.top() != '(')
            {
                char ch = coll2.top();
                coll3.push_back(ch);
                coll2.pop();
            }
            coll2.pop();
        }
    }
    else   
    {
        
        char sym = coll2.top();

               if (getPri(c) <= getPri(sym))
        {
                        coll2.pop();
            
            coll3.push_back(sym);
            check(c, coll2, coll3);
        }
        else
        {
       
            coll2.push(c);
        }
    }
}

2.功能二

重点:括号的添加,因为四则运算的运算规则,要先计算括号里的算式,所以要使括号先执行。

void sz2(){
    int a, b, c, d, k1, k2, k3, count;
    char c1, c2, c3;
    double e, f;
    int k;
    count = 0;
    string str;
    for (int i = 0; i < 20; i++) {
        k1 = rand() % 4;
        if (k1 == 0)
            c1 = '+';
        else if (k1 == 1)
            c1 = '-';
        else if (k1 == 2)
            c1 = '*';
        else if (k1 == 3)
            c1 = '/';

        k2 = rand() % 4;
        if (k2 == 0)
            c2 = '+';
        else if (k2 == 1)
            c2 = '-';
        else if (k2 == 2)
            c2 = '*';
        else if (k2 == 3)
            c2 = '/';

        k3 = rand() % 4;
        if (k3 == 0)
            c3 = '+';
        else if (k3 == 1)
            c3 = '-';
        else if (k3 == 2)
            c3 = '*';
        else if (k3 == 3)
            c3 = '/';
        a = rand() % 10;
        b = rand() % 10;
        c = rand() % 10;
        d = rand() % 10;
        if (c1 == '/') {
            a = a*1.0;
            b = 2;
        }
        if (c2 == '/') {
            b = b*1.0;
            c = 2;
        }
        if (c3 == '/') {
            c = c*1.0;
            d = 2;
        }
        stringstream ss1;
        stringstream ss2;
        stringstream ss3;
        string s1;
        string s2;
        string s3;
        ss1 << "(" << a << c1 << b << ")" << c2 << c << c3 << d;
        ss2 << a << c1 << "(" << b << c2 << c << ")" << c3 << d;
        ss3 << a << c1 << b << c2 << "(" << c << c3 << d << ")";
        s1 = ss1.str();
        s2 = ss1.str();
        s3 = ss1.str();
        k = rand() % 3;
        if (k == 0)
            str = s1;
        else if (k1 == 1)
            str = s2;
        else if (k1 == 2)
            str = s3;
        cout << str << "=" << endl;
        deque<char> coll1;  
stack<char> coll2; deque<char> coll3; stack<int>coll4; for (int i = 0; i != str.size(); ++i) { coll1.push_back(str[i]); } allocate(coll1, coll2, coll3); calculate(coll3, coll4); f = coll4.top(); cout << "?"; cin >> e; if (e == f) { cout << "答对啦,你真是个天才!" << endl; count++; } else if (e != f) { cout << "再想想吧,答案似乎是" << f << "喔!" << endl; } } cout << "...(一共20道题)" << endl; cout << endl; cout << "你一共答对" << count << "道题,共20道题。" << endl; }

3.功能三

重点:命令行的字符判断。对于输入的题目必须是正整数,不能是英文,负数,浮点数。

void main(int argc, char *argv[])
{


    if (argc == 1) {
        sz2();
    }
    else {
        int b1;
        float b2 = atof(argv[2]);
        if ((b2 - (int)b2) > 0){
            cout << "题目数量必须是 正整数。";
            exit(0);
        }
        else {
            b1 = atoi(argv[2]);
            if (!(*argv[2] == '+' || (*argv[2] > '0'&& *argv[2] <= '9') || *argv[2] == '.')) {
                cout << "题目数量必须是 正整数。";
                exit(0);
            }
            sz3(b1);
        }

    }

}

 重点:把算式输出到文件中,方便打印。

ofstream fout;
fout.open("f4.txt");
fout << str << "=" << "\t" << "\t" << std::left << f << endl;
fout.close();

 

结对编程体会:经过结对编程的这次作业,我收获颇大,因为向我的结对成员学到了非常多,发现结对编程非常适合知识的分享与传递,快速熟悉自己所不了解不熟悉的领域。结对编程需要天时地利人和,首先保证工作地点的获得,队友两人的时间安排,以及最重要的是双方的工作习惯,技术观点相近,效率会明显提高,否则,将导致进度停滞不前,效率降低,以及保证双方的精力充沛,因为结对编程很累。结对编程的形式处于不断审查过程中,每一句代码都由一个人编写,另一个人检查,从而大大降低了bug的出现。

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

1.在制定代码规范时,由于双方的编程习惯和审美观点不同,在制定规范出现了分歧,通过初步的在线讨论和面对面交谈,双方都进行妥协,最大限度的满足两个人的要求,这样在接下来的编程过程中互相提醒和进步,对于结对编程来说是一个好的开始。

2.编程初期,我的队友提出四则运算想采用穷举的方法进行实现,我提出这个方法会不会代码量过大,工作时间过长,但也同意用这个方法试试看,但接下来的工作过程中,代码量过于庞大,.无法再往下进行,果真印证了这个猜想。

3.在编码过程中,对于命令行的字符判断的实现进行长时间的讨论。

4.在结对编程中,一个人在写,一个人在检查,在某个小问题上可能也要争论半天,有时候队友的提醒,虽然是是无心之举,可能就打扰了正在编程工作者的思路,大大降低了效率。不过,既然是两个人,能快速在别人身上学到自己不太熟悉的知识,认识到队友指出自己的缺点,共同进步。

5.功能四的实现问题进行了讨论,因为功能四的实现遇到困难,以至于两个人在到底是否进行实现的问题上,出现分歧。最后由于各自时间安排,没有实现功能四

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

结对成员:王伟东、李圆圆

工作地点:计算机楼107教室

计算机:联想电脑,操作系统为64位,内存为8g

编程经历:应老师的要求,结对编程需在物理空间下,相距一两米的距离,所以在选用了在无人上课的教室进行实际操作,因为工作地点的不稳定因素,所以要随时更换工作地点,打断工作进程,效率降低,其次因为事先工作习惯的原因,在电源突然切断的情况下,对所完成的代码进行提前保存,避免大量工作的重复进行。

照片:

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

 地址:https://git.coding.net/lyy181/count.git

 

 运行截图: