• 现代软件工程 第一章 【概论】第1题——孙雪莹、张功


    第一步: 像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求。下面这些需求都可以用命令行参数的形式来指定:

        a) 除了整数以外,还要支持真分数的四则运算。 (例如:  1/6 + 1/8 = 7/24)

        b) 让程序能接受用户输入答案,并判定对错。 最后给出总共 对/错 的数量。

        c) 逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多 10 个运算符,括号的数量不限制):
            

     

          我们首先的想法是将整数和分数统一,建立一个数类number。它包含分子和分母,当数是整数的时候,分母为1,这样便于后面运算的进行。这样我们就减少了一种除法运算,只剩下加法、减法和乘法。我们定义在类中的公有函数里。这样以后我们计算的单位就变成了类。

    class number{
    private:
        int numerator;//分子
        int denominator;//分母
    
    public:
        number(){}
    
        number(int a){
            numerator = a;
            denominator = 1;
        }
    
        number(int a, int b){
            numerator = a;
            denominator = b;
        }
    
        void prin_number(){
            if (numerator == 0)
            {
                printf("0");
            }
            else{
                if (denominator == 1){
                    printf("%d", numerator);
                }
                else{
                    printf("%d/%d", numerator, denominator);
                }
            }
        }
    
        number plus(number n1, number n2){
            number re;
            int divisor;//最大公约数
    
            re.denominator = n1.denominator * n2.denominator;
            re.numerator = n1.numerator * n2.denominator + n2.numerator * n1.denominator;
            divisor = greatest_common_divisor(re.denominator, re.numerator);
            re.denominator = re.denominator / divisor;
            re.numerator = re.numerator / divisor;
    
            return re;
        }
    
        number minus(number n1, number n2){
            number re;
            int divisor;//最大公约数
    
            re.denominator = n1.denominator * n2.denominator;
            re.numerator = n1.numerator * n2.denominator - n2.numerator * n1.denominator;
            if (re.numerator != 0){
                divisor = greatest_common_divisor(re.denominator, re.numerator);
                re.denominator = re.denominator / divisor;
                re.numerator = re.numerator / divisor;
            }
    
            return re;
        }
    
        number mul(number n1, number n2){
            number re;
            int divisor;//最大公约数
    
            re.denominator = n1.denominator * n2.denominator;
            re.numerator = n1.numerator * n2.numerator;
            if (re.numerator != 0){
                divisor = greatest_common_divisor(re.denominator, re.numerator);
                re.denominator = re.denominator / divisor;
                re.numerator = re.numerator / divisor;
            }
    
            return re;
        }
    
    };

          定义了类以后,我们知道四则运算的符号特别的多,于是我们这时候要使用“栈”这种数据结构。下面是“栈”数据结构的基本函数。

    #include"stdafx.h"
    #include"iostream"
    using namespace std;
    #include"Caculating.h"
    
    #define STACK_INIT_SIZE 100
    #define STACKINCREMENT 10
    #define ERROR 0
    #define OK 1
    #define OVERFLOW -2
    
    typedef number Status;
    typedef char SElemType;
    typedef struct{
        SElemType * base;
        SElemType * top;
        SElemType stacksize;
    }SqStack;
    
    Status InitStack(SqStack & S){
        S.base = new SElemType[STACK_INIT_SIZE];
        if (!S.base){
            return ERROR;
        }
        S.top = S.base;
        S.stacksize = STACK_INIT_SIZE;
        return OK;
    }
    
    Status GetTop(SqStack S, SElemType &e){
        if (S.top == S.base)return ERROR;
        e = *(S.top - 1);
        return OK;
    }
    
    Status Push(SqStack & S, SElemType e){
        if (S.top - S.base >= S.stacksize){
            S.base = new SElemType[STACK_INIT_SIZE + STACKINCREMENT];
            if (!S.base)return OVERFLOW;
            S.top = S.base + S.stacksize;
            S.stacksize += STACKINCREMENT;
        }
        *S.top++ = e;
        return OK;
    }
    
    Status Pop(SqStack & S){
        SElemType e;
        if (S.top == S.base)return ERROR;
        e = *--S.top;
        return e;
    }
    
    Status Print(SqStack S){
        SElemType *p = S.top;
        while (p != S.base){
            cout << *--p;
        }
        cout << endl;
        return OK;
    }
    
    Status Destroy(SqStack &S){
        delete S.base;
        S.top = NULL;
        S.base = NULL;
        S.stacksize = 0;
        return OK;
    }
    View Code

         之后我们要借助两个栈来进行运算,一个栈是数栈,另一个是符号栈。这时,我们首先要定义符号的优先级。

    int Judgement(char ch){
        switch (ch){
        case'#':return 0; break;
        case'+':case'-':return 1; break;
        case'*':return 2; break;
        case'/':return 3; break;
        case')':return 4; break;
        case'(':return 5; break;
        default:return 6; break;
        }
    }
  • 相关阅读:
    IIS7.5 HTTP 错误 500 调用loadlibraryex失败的解决方法
    VB6.0 excel 导入和导出
    SQL 实现 成绩表形式的转换
    计算月初和月末,年初和年末的日期
    一篇文章学LINQ(原创)
    浙江省仙居县发现罕见丹霞地貌大型“天坑”
    浙江省仙居县发现特大型丹霞地貌洞穴
    EFUpdate
    163邮件出错:不允许使用邮箱名称。 服务器响应为: authentication is required,smtp7,C8CowEDpS0+Uke9VvSmXBg--.546S2 1441763733
    vmware 安装dos注意
  • 原文地址:https://www.cnblogs.com/hahalovejava20160905/p/5863375.html
Copyright © 2020-2023  润新知