码迷,mamicode.com
首页 > 其他好文 > 详细

四则运算

时间:2018-03-31 19:35:36      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:measure   ali   stack   string   sign   code   代码结构   目录   代码   

四则运算(C++)

目录

[TOC]


【注】后缀表达式参考博客:https://blog.csdn.net/geekcoder/article/details/6829386,但后缀表达式计算有改动


1、需求分析:

  • 使用 -n 参数控制生成题目的个数,使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
  • 每道题目中的运算符个数不超过3个
  • 题目和运算结果中如果出现假分数应用真分数表示
  • 将生成的题目存入Exercise.txt,题目答案存入Answer.txt,用户做题结果存入Grade.txt
  • 程序支持1万道题目的生成
  • 对生成的题目进行查重

2、整体思路

  • 步骤一:运算式子生成:先随机生成数字,在随机生成运算符,最后随机生成括号。
  • 步骤二:中缀转后缀
  • 步骤三:进行后缀

3、设计实现

  • 代码结构
    Arithmetic :生成四则运算、转后缀、计算后缀、保存
    MyStack:封装栈
    Posifit:中缀转后缀
    Tool:工具函数
    技术分享图片
  • 重要代码
    思路:照常是在后缀表达式过程中全部按照真分数来计算,但是有一点不同是采用两个栈,其中一个是分子栈,另一个是分母栈,初始情况下分母栈全为1。这样中缀转后缀的过程就不用特意考虑真分数,所以中缀转后缀的过程还是按常规操作。

    string Postfit::postfix_value(const char post[])
    {
    MyStack<double> stack;    // 操作数栈  
    stack.init();
    MyStack<double> denominatorStack;   // 操作数对应的分母站
    denominatorStack.init();
    
    double numerator = 0.0; // 分子
    double denominator = 1.0; // 分母
    double newNumerator = 0.0;
    double newDenominator = 1.0;
    
    int i = 0;
    double x1, x2;
    double x1D, x2D;    // 对应的分母
    
    while (post[i] != ‘#‘)
    {
        if (post[i] >= ‘0‘ && post[i] <= ‘9‘) {
            double num = read_number(post, &i);
            stack.push(num);
            denominatorStack.push(1.0);
        } else if (post[i] == ‘ ‘)
            i++;
        else {
            x2 = stack.pop();
            x1 = stack.pop();
            x2D = denominatorStack.pop();
            x1D = denominatorStack.pop();
    
            switch (post[i])
            {
            case ‘+‘:
                denominator = getLCM(x1D, x2D);
                // 通分
                if (denominator == x1D) {
                    numerator = x1 + x2 * denominator;
                }
                else if (denominator == x2D) {
                    numerator = x1 * denominator + x2;
                }
                else {
                    numerator = x1 * denominator + x2 * denominator;
                }
                break;
            case ‘-‘:
                denominator = getLCM(x1D, x2D);
                // 通分
                if (denominator == x1D) {
                    numerator = x1 - x2 * denominator;
                }
                else if (denominator == x2D) {
                    numerator = x1 * denominator - x2;
                }
                else {
                    numerator = x1 * denominator - x2 * denominator;
                }
                break;
            case ‘*‘:
                denominator = x1D * x2D;
                numerator = x1  * x2;
                break;
            case ‘/‘:
                denominator = x1D * x2;
                numerator = x1 * x2D;
                break;
            default:
                break;
            }
    
            // 约分
            double gcd = 1.0;
            if (denominator != 0 && numerator != 0) {
                gcd = getGCD(denominator, numerator);
            }
            newDenominator = denominator / gcd;
            newNumerator = numerator / gcd;
    
            stack.push(newNumerator);
            denominatorStack.push(newDenominator);
    
            i++;
        }
    }
    
    if (numerator == denominator) {
        return "1";
    }
    else if (denominator == 1.0) {
        return double2str(numerator);
    } 
    else if (numerator > denominator) {
    
        int n = (int)numerator % (int)denominator;
        double m = (numerator - (double)n) / denominator;
        return double2str(m) + "‘" + int2str(n) + "/" + double2str(denominator);
    }
    else {
        return double2str(numerator) + "/" + double2str(denominator);
    }
    }

4、PSP

PSP2.1 Personal Software Process Stages Time
Planning 计划 1
Estimate 估计这个任务需要多少时间 22
Development 开发 1
Analysis 需求分析 3
Design Spec 生成设计文档 1
Design Review 设计复审 1
Coding Standard 代码规范 1
Design 具体设计 2
Coding 具体编码 7
Test 测试 1
Reporting 报告 1
Test Report 测试报告 1
Size Measurement 计算工作量 1
合计 20

5、结果

技术分享图片
技术分享图片

6、代码地址:

https://gitee.com/mingpukj/Arithmetic

7、总结

  • 算法是非常重要的,还是希望自己能提高。
  • 希望自己能不断进步,不仅在代码质量,也在代码思维。
  • 博客是很好的记录方式。
  • 看了其他同学的作业,虚心学习。:)

四则运算

标签:measure   ali   stack   string   sign   code   代码结构   目录   代码   

原文地址:https://www.cnblogs.com/mingpu-kj/p/8683397.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!