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

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

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;
    }
}
时间: 2024-09-29 00:53:40

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

现代软件工程 第一章 概论 第11-15题(白文俊)

11.Software,  Software Engineering 等名词的来源,请问 “软件” 和 “软件工程” 这些词汇是如何出现的 - 何时.何地.何人 在看过给的链接原文之后我得出这样的结论: ”software”即“软件”这一名词的使用最早是在1953年8月由Richard R. Carhart发表的一篇工程性的文章中,收录在Rand公司的研究备忘录中. “software engineering”即“软件工程”这一名词的使用最早是在阿波罗11登月计划由著名的女程序员Margaret

现代软件工程 第一章 概论 第9题——邓琨

我采访了一只开发了天津8890便民服务网站系统的团队. - 当时的项目有多少用户,给用户多少价值? 现在还有人用吗? 答:当时项目有近万用户,为天津市民提供便民服务平台,例如联系修理家电.水电气.咨询服务.中介.邮政服务等各种便民服务,集老百姓生活所需服务为一身,通过各种服务接口,统一为人们提供生生活服务.现在还有很多用户正在使用该系统,每天的访问量一直保持增长趋势. - 这个项目能否给我们团队继续开发,源代码/文档还有么? 答:这个项目可以进行二次开发,当时项目团队进行了缜密的版本控制管理与文

现代软件工程 第一章 概论 第1题——邓琨

题目要求: 第一步: 像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求.下面这些需求都可以用命令行参数的形式来指定: a) 除了整数以外,还要支持真分数的四则运算. (例如:  1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多 10 个运算符,括号的数量不限制):         25 - 3 * 4 -

现代软件工程 第一章 概论 第4题——邓琨

我赞同dijkstra的看法.会一两种编程语言,会写贪吃蛇游戏,会写网站网页,这并不叫会写程序,只能说是管中窥豹,略见一斑.而软件工程是从宏观和微观两个角度教一个人怎么写程序.一是教怎么使用程序语言,怎么设计算法,怎么通过使用语句的组合构成一个可运行的程序:另一方面是怎么进行软件架构,怎么使用设计模式,怎么进行测试,怎么进行运行维护,怎么开发出一个健壮.安全.完善.可靠的软件或系统,它包含多个方面的软件开发技术. 在学校里有的同学算法和数据结构很擅长,例如参加ACM竞赛的同学,他们的编程能力比一

现代软件工程 第一章 概论 第7题——张星星

综合多方面考虑,我认为,”中文编程”并不是一个”银弹”,并不能提高中国程序员的编程效率. 首先,中文编程指的是使用中文书写关键字,如类名.函数名.变量名.常量名等.对编程语言来说,语法关键字其实就是一个符号,和日常语言关系不大.不同的编程语言对应的关键字也不相同,所以中文编程对应的母语优势意义不大,记住几个外语关键字并不会降低开发效率. 另外,中文编程在输入上也没有优势,例如a = 1 和甲 等于 一:而且中文还存在编码问题,运行环境苛刻,使用中文编程要有一系列的支持,如windows中文api

现代软件工程 第一章 【概论】第2题——孙雪莹(还未完成)

2.  软件有很多种,也有各种分类办法: ShrinkWrap (在包装盒子里面的软件,软件在软盘/CD/DVD上):   Web APP (基于网页的软件):   Internal Software (企业或学校或某组织内部的软件): Games (游戏):   Mobile Apps (手机应用):    Operating Systems (操作系统):    Tools (工具软件)      选取对你最相关的一类软件,  请回答: 引用: 1.http://baike.baidu.co

现代软件工程 第一章 【概论】第10题——孙雪莹

10.2: 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下: - 当时的项目有多少用户,给用户多少价值? 现在还有人用吗? - 这个项目能否给我们团队继续开发,源代码/文档还有么? - 项目开发有什么经验和教训 - 对学好软件工程有什么建议 我们小组就这个题目,对可视计算实验室的一位学姐和一位学长进行了线上采访,根据情况,将以上的问题调整了一下顺序.以下是分别的采访内容: 首先,我们采访的是14级硕士学姐,许冰晗学姐. we

现代软件工程 第一章概论习题第1题 李艳薇

实现自动出题功能: 程序并没有实现全部要求,后续将会继续改进. 实现结果: 程序代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <time.h> using namespace std; #define N 100 bool createProblem(){ int i,op,x; char st[100]; int dt[1

现代软件工程第一章 第十五题--刘莞姝

15:请看TED 的演讲, 谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长. 我相信大多数人都不会喜欢跟压力相处,但是在这样的社会环境下,压力是无法避免的,因此我们要学会与压力相处.与压力相处,并不是说一定要把压力变为动力,压力可以是动力的一部分,但绝对不会是动力的来源.压力可以是你做一件事的催化剂,但是不能成为你开始做一件事的主要原因.所谓学会与压力相处,就是要在压力过大时,想办法排解它:不要让压力给你带来过重的思想负担:必要的时候让压力成为你的“