zoukankan      html  css  js  c++  java
  • 现代软件工程 第一章 【概论】第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;
        }
    }
  • 相关阅读:
    各种工具类
    Mybatis各种查询
    struts配置
    spring配置和映射文件
    hibernate配置和映射文件
    mybatis配置和映射文件
    hibernate步骤和配置
    单选框,复选框和下拉框回显赋值问题
    struts2之使用oracle分页(10)
    用Spire.PDF提取PDF里的PNG图片
  • 原文地址:https://www.cnblogs.com/hahalovejava20160905/p/5863375.html
Copyright © 2011-2022 走看看