首页 > 代码库 > 现代软件工程 第一章 【概论】第1题——孙雪莹、张功

现代软件工程 第一章 【概论】第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 -2typedef 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;    }}

 

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