### 第四次作業之四則運算

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();`

5項在編碼、爭論、復審等活動中花費時間較長，給你較大收獲的事件：

1.在制定代碼規范時，由於雙方的編程習慣和審美觀點不同，在制定規范出現了分歧，通過初步的在，線討論和面對面交談，雙方都進行妥協，最大限度的滿足兩個人的要求，這樣在接下來的編程過程中互相提醒和進步，對於結對編程來說是一個好的開始。

2.編程初期，我的隊友提出四則運算想采用窮舉的方法進行實現，我提出這個方法會不會代碼量過大，工作時間過長，但也同意用這個方法試試看，但接下來的工作過程中，代碼量過於龐大，.無法再往下進行，果真印證了這個猜想。

3.進行單元測試的時候 ，我的隊友認為應該所有的功能塊應該全部測試，我認為應該找重點的測試，在接下來的工作中，我的想法得到了認可。

4.在結對編程中，一個人在寫，一個人在檢查，在某個小問題上可能也要爭論半天，有時候隊友的提醒，雖然是是無心之舉，可能就打擾了正在編程工作者的思路，大大降低了效率。不過，既然是兩個人，能快速在別人身上學到自己不太熟悉的知識，認識到隊友指出自己的缺點，共同進步。

5.功能四的實現問題進行了討論，因為功能四的實現遇到困難，以至於兩個人在到底是否進行實現的問題上，出現分歧。最后由於各自時間安排，沒有實現功能四

git 地址：

https://git.coding.net/wangwd/SecondAssignment.git