四则运算

GitHub地址:https://github.com/LYbear/calculate

 

PSP

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

Planning

计划

10

· Estimate

· 估计这个任务需要多少时间

10

Development

开发

655

· Analysis

· 需求分析 (包括学习新技术)

30

· Design Spec

· 生成设计文档

30

· Design Review

· 设计复审 (和同事审核设计文档)

10

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

5

· Design

· 具体设计

40

· Coding

· 具体编码

5h*60

· Code Review

· 代码复审

1h*60

· Test

· 测试(自我测试,修改代码,提交修改)

3h*60

Reporting

报告

290

· Test Report

· 测试报告+博客

4h*60

· Size Measurement

· 计算工作量

10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

40

合计

 

955


项目要求

  •  参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算。操作数必须随机生成。
  •  运算符(operators)为 +, −, ×, ÷ 运算符的种类和顺序必须随机生成。
  •  要求能处理用户的输入,并判断对错,打分统计正确率。
  •  使用 -n 参数控制生成题目的个数。

附加要求

  •  支持带括号的多元复合运算
  •  运算符个数随机生成(考虑小学生运算复杂度,范围在2~10)

解题思路

这个题目可以被划分为以下三个问题:

  1. 运算符号和数字都要随机生成;
  2. 计算所列出四则运算的结果。
  3. 接受用户输入并比较结果是否正确,如不正确还要能自动给出正确结果。并在命令行中表现出来。

如何解决

问题1

  • 随机操作数、随机运算符、随机括号、随机长度等随机变量可以利用random函数编写一个字函数。
  • 需要考虑除数及分母为0时的情况,此时表达式不成立。
  • 需要考虑随机生成括号的位置是否有意义的情况。例如:

expression:  (1+2+5)-(3*4)=

问题2

该种方法一般思路为:

  1. 将中缀表达式转化成后缀表达式。
  2. 通过栈计算后缀表达式的值。
    其中需要考虑运算符优先级问题以及栈的结构。查阅了网上的资料,参考了dragondove的博客以及yichudu的博客。其中都有关于该算法的的具体描述。

问题3

判断用户输入情况只需接受用户输入比较统计得分即可。由于要求采用命令行界面完成,该部分主要需要控制及美化命令行界面。

测试部分

由于四则运算的规则繁杂,随机生成的算式需要判断各种情况的产生,也就无形之中给测试部分增添了很大压力。看过了《构建之法》第二章的所有测试部分之后,利用其中单元测试的部分对项目进行了统一的测试。详细情况见后文测试部分。

#include <iostream>

 #include <stdio.h>

 #include <windows.h>

 #include <string.h>

 #include <time.h>

 

 

int  main()   //主函数

{

         int n,a,right=0;

         double percent;

         cout<<"Please enter the number of the test:";

         cin>> n >>endl;

         for(int i=0;i<n;i++)

         {

                   a=takeTest();

                   right=right+a;

         }

         cout<<"Powerful!"<<endl;

         cout<<"The number of right:%d"+right<<endl;

         percent=((double)right*100.00)/(double)n;

         cout<<"The percent of right:%0.2f %%\n"+percent<<endl;

}

 

 

// 随机获取运算符函数

char getSignal()

{

    char signal[4]={'+','-','*','/'};

    srand((unsigned)time(NULL));

    return signal[rand()%4];

}

 

 

//获取随机数函数

int random(double start, double end)

{

    return (int)(start+(end-start)*rand()/(RAND_MAX+ 1.0));

}

 

 

 

//题目生成函数

int takeTest()

{

    int get;

    int num1,num2,a;

    char signal;

 

    srand((unsigned)time(NULL));

    signal=getSignal();

    num1=random(0,1000);

    num2=random(1,1000);

if(signal=='-')

    {

        if(num1<num2)

        {

            int temp;

            temp=num1;

            num1=num2;

            num2=temp;

        }

    }

    if(signal=='/')

    {

        if(num2==0)

        {

            int temp;

            temp=num1;

            num1=num2;

            num2=temp;

        }

    }

    cout<<num1+signal+num2<<endl;

    cin>>get<<endl;

    fflush(stdin);   //清空输入缓冲区

    if(getResult(num1,num2,signal)==get)

        {

      cout<<"You're right!"<<endl;

        a=1;

        }

    else

    {

        cout<<"It's wrong!\n"<<endl;

        cout<<getResult(num1,num2,signal)<<endl;

        a=0;

    }

    return a;

}

 

 

//获取运算结果函数

int getResult(int num1,int num2,char signal)

{

    int res;

    switch(signal)

    {

    case '+':

        res=num1+num2;break;

    case '-':

        res=num1-num2;break;

    case '*':

        res=num1*num2;break;

    case '/':

        res=num1/num2;break;

    default:

        cout<<"运算符错误!"<<endl;

    }

    return res;

}

 

 

运行结果如图:

 

 

自我测评:

   本程序由c++语言编写而成,在Visual C++6.0版本的编译器上测试执行成功。但是个人能力不够,花费时间也较多。

 

 

 

 

PSP2.1

Personal Software Process Stages

实际耗时(分钟)

Planning

计划

20

· Estimate

· 估计这个任务需要多少时间

0

Development

开发

800

· Analysis

· 需求分析 (包括学习新技术)

120

· Design Spec

· 生成设计文档

30

· Design Review

· 设计复审 (和同事审核设计文档)

15

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

40

· Design

· 具体设计

100

· Coding

· 具体编码

7h*60

· Code Review

· 代码复审

1.5h*60

· Test

· 测试(自我测试,修改代码,提交修改)

2h*60

Reporting

报告

330

· Test Report

· 测试报告+博客

4.5h*60

· Size Measurement

· 计算工作量

10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

50

合计

 

1123


 

posted on 2018-04-19 14:12  梁旖  阅读(297)  评论(2编辑  收藏  举报