结对编程实现四则运算

由于时间仓促,本程序距离完全体还有些距离,但完成度已经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;
}

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

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

时间: 2024-08-02 23:08:25

结对编程实现四则运算的相关文章

结对编程项目——四则运算

1. 结对编程项目---四则运算 (10分) 基本功能要求: 1) 实现一个带有用户界面的四则运算.2) 生成的题目不能重复.3) 支持负数,例如-1,-1/2,-3‘4/5等.(达成) 需要支持的基本设定参数 1) 题目的数量  2) 数值的范围  3) 题目中最多几个运算符(目前没有达成)  4) 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽) 5) 题目中是否有乘除法  6) 题目中是否有括号 (目前没有达成) 7) 题目中或运算过程中有无负数         学习感受:

补结对编程(四则运算)

结对编程(四则运算)结对伙伴:刘芳芳.于淼主要用java实现编码内容:给小学生出题的四则运算四种运算1-加法2-减法3-乘法4-除法0-退出 四则运算PSP 类别 开始时间 结束时间 间隔时间 累计净时间 四则运算分析 7:30 8:00 0 30分 编码 8:00 10:43 0 2小时43分 总结 10:43 10:50 0 7分 补充代码函数进度 代码如下:循环遍历运算字符串: 1 private static String interceptOperation(String operat

20165223 结对编程之四则运算

目录 一.结对对象 二.需求分析 三.设计思路 四.UML类图 五.功能截图 六.结对感受 一.结对对象 担任角色 驾驶员(Driver):20165223 蔡霓(是控制键盘输入的人) 领航员(Navigator):20165218 赵冰雨(起到领航.提醒的作用) 搭档本次结对博客: 本次结对码云链接: 二.需求分析 取自<结对编程项目-四则运算> 题目内容(week1) 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符

20165206 结对编程项目-四则运算 阶段一总结

20165206 结对编程项目-四则运算 阶段一总结 一.需求分析 通过命令行输入生成题目的数量,随机生成题目. 生成的题目不重复. 生成的四则运算题目支持整数.支持多运算符. 能够根据作答情况统计正确的个数. 二.设计思路 设计一个类来实现整数的四则运算. 用一个循环结构来生成随机数,生成题目. 设计一个类来比较输入的答案与正确答案是否一致. 判断做的题是否正确,并返回正确的个数. 设计单元测试,对代码进行测试及修改 UML图: 三.核心代码 生成随机数: while(true){ a=new

20165227 结对编程项目-四则运算 第一周

20165227 结对编程项目-四则运算 第一周 需求分析 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计题目完成数并计算正确率 设计思路 设计一个计算器能够实现简单的+.-.*./运算 通过编程实现多运算符计算.整数运算.真分数运算.判断结果等 进行junit检测 设计一个程序主类,达到生成随机数.题目.并判断正误 测试 UML类图 功能截图 结对感受 因为同为室友,所以结对起来更轻松方便,讨论的时间也更加地充足,对于队

20165318 结对编程项目-四则运算 阶段总结

20165318 结对编程项目-四则运算 阶段总结 一.需求分析 能随机生成n道四则运算题目,n由使用者输入 支持整数和分数 支持多运算符 能够判断正误,错误时能提醒并输出正确答案 能计算出正确率 能多次生成题目,直到使用者选择退出 后续拓展的可能 题目去重 文件: 处理生成题目并输出到文件 完成题目后从文件读入并判题 多语言支持:简体中文, 繁體中文, English 二.设计思路(同时输出UML类图) 首先考虑生成题目. 随机生成题目,用到Random函数,生成题目应该是同时随机生成数字和四

20165230 结对编程项目-四则运算 整体总结

20165230 结对编程项目-四则运算 整体总结 一.需求分析 随机生成题目 生成的题目个数从命令行输入 用户可选择生成不同难度的题目,比如通过参数指定: (1) 运算符个数范围 (2) 运算符限定(小学一年级题目只生成 + - 题目) 能多次生成题目 题目运算(判题) 支持多运算符 支持整数 支持真分数 题目合法性判断 可独立使用 可用于测试生成题目的正确性 扩展需求 题目去重 支持多语言 处理生成题目并输出到文件 完成题目后从文件读入并判题 二.设计思路 设计一个IntNumber类,用来

20165202 结对编程项目-四则运算 第二周

一.码云链接 二.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 三.设计思路(同时输出UML类图) 这周的总体设计要在上周的基础上深化,上周我们的代码没有用到中缀表达式转后缀表达式,没有用到栈,所以这周不仅要对上一周的代码进行修改,而且还要在此基础上完成更深层的对真分数的要求. 实现四则运算中后缀转换类 实现四则运算后缀表达式计算类 实现四则运算真分数计算类 实现四则运算生成题

20165330 结对编程项目-四则运算 第二周

需求分析 实现一个命令行程序,要求:自动生成小学四则运算题目(加.减.乘.除) 可实现多个运算符一起运算 可以真分数形式输出结果 测试结果的正确性 统计题目完成数并计算正确率 设计思路 实验首先是完成一个计算器的功能,可以实现简单的+.-.*./运算,在这里设计一个主类生成随机数,生成题目,并判断正确率 实现多运算符,编入四个类分别实现整数运算.真分数运算.判断结果正确并计算正确率 利用JUnit检测非法输入 设计测试类,利用JUnit测试整数类与分数类的四则运算 UML类图 功能截图 Juni

20165235 结对编程项目-四则运算 整体总结

20165235 结对编程项目-四则运算 整体总结 一.需求分析 本次实验需要产生随机数然后对其进行相应的计算.产生随机数可以直接在主类中进行,四则运算可以通过堆栈实现,可能会出现分母为零的bug,也要对其进行相应的修复.可以将字符序列装换成字符数组,在对字符数组中"/"符号之后的数字进行判断,如果是0就返回-1. 二.设计思路 本次实验总共分为两个思路:(1)是通过类Operate中的calculate方法进行计算,计算的数值由主类Main给出.并对其修复了分母为零的bug(在Mai