首页 > 代码库 > 结对编程实现四则运算

结对编程实现四则运算

由于时间仓促,本程序距离完全体还有些距离,但完成度已经90%。剩下的就是优化下用户友好性之类的。

主要完成功能:1,实现了四则运算算式的随机产生。

       2,实现了将随机产生的四则综合运算算式计算出结果。

待完成功能:1,增加积分系统,生成的随机算式是有分值的,例如1+2+3+4这种运算式肯定和99*98*97*96这种运算式不一样,分值由两方面决定,一是数的大小,一方面是运算符。比如数又大乘除法又多那么分就高。

      2,增加点奖励,比如分数达到多少就说一句鼓励的话或出个图案。

以下是程序部分:

1,itos函数,将整形转换为String型。

1 string itos(int i) 2 {3      stringstream s;4      s << i;5      return s.str();6  }

2,num函数,生成100以内随机数。

int num(){    return rand()%100;    }

3,fh函数,生成4以内随机数,用来随机运算符。

int fh(){    return rand()%4;}

4,convert2RPN函数,将字符型的算式有中缀表达式转换为后缀表达式,用来进行后续的计算,是非常重要的函数,承载着极大的工作量。

void convert2RPN(string &s) {    stringstream ss;    stack<char> stk;    for (size_t i = 0; i < s.length(); i++) {        if (isdigit(s.at(i))) {            ss << s.at(i);            // 如果下一位不是数字,或者已经是最后一位,就加上空格            if ((i < s.length() - 1 && !isdigit(s.at(i + 1)))                    || i == s.length() - 1) {                ss <<  ;            }        }        else {            if (stk.empty()) {                stk.push(s.at(i));            }            else {                switch (s.at(i)) {                case (:                    stk.push(s.at(i));                    break;                case ):                    // 把配套的‘(‘和之上的符号出栈                    while (stk.top() != () {                        ss << stk.top();                        stk.pop();                    }                    stk.pop();                    break;                case +:                case -:                    // ‘+‘ ‘-‘ ‘*‘ ‘/‘都出栈                    while (!stk.empty() && stk.top() != () {                        ss << stk.top();                        stk.pop();                    }                    stk.push(s.at(i));                    break;                case *:                case /:                    // ‘*‘和‘/‘出栈                    while (!stk.empty() && (stk.top() == * || stk.top() == /)) {                        ss << stk.top();                        stk.pop();                    }                    stk.push(s.at(i));                    break;                }            }        }    }    // 运算完了,此时把栈的元素都pop出来    while (!stk.empty()) {        ss << stk.top();        stk.pop();    }    s = ss.str();}

5,calculateRPN函数,用来计算后缀表达式。

float calculateRPN(const string &s) {    stack<float> stk;    for (size_t i = 0; i < s.length(); i++) {        // 如果是数字,就和之前的数字组合起来        if (isdigit(s.at(i))) {            int e = atoi(&s.at(i));            int t = e / 10;            while (t > 0) {                i++;                t /= 10;            }            i++;            stk.push(e);        }        else {            float r = stk.top();            stk.pop();            float l = stk.top();            stk.pop();            float result;            switch (s.at(i)) {            case +:                result = l + r;                break;            case -:                result = l - r;                break;            case *:                result = l * r;                break;            case /:                result = l / r;                break;            }            stk.push(result);        }    }    return stk.top();}  
 

 


6,主函数

int main(){    char ope[4]={+,-,*,/};        srand(time(NULL));    string s;    s = itos(num())+ope[fh()]+itos(num())+ope[fh()]+itos(num())+ope[fh()]+itos(num());    cout << s+" "+"=";     convert2RPN(s);    cout << calculateRPN(s) << endl;    return 0;}

程序结果截图,虽然比较简单,但是还是有些技术含量的,经过后面更新一定会更用户友好。

技术分享

技术分享

技术分享

 

只做了一点微小的工作,恳请老师和同学批评,谢谢大家。

 

结对编程实现四则运算