软件工程个人作业03

本文介绍了一种算法,能够生成包含指定范围内的随机数和四种基本运算符的算式,并实现计算功能,同时提供了主函数以实现按需输出算式判断正误的功能。

 

Planning

Development

•       Design

     1. 开辟两个数组一个为double类型另一个为char类型用于存放生成的随机数和随机运算符

     2.编写两个方法分别用于生成指定范围数内的随机数和加减乘除四种运算符

     3.调用这两个函数将生成的随机数和运算符分别存到事先设定好的数组中(存放的个数可以人为设定)

     4.为避免出现除数为零的情况设定一个函数检验并修改生成的为零的随机数

     5.调用以上编写好的函数和已经存放数据的数组编写output函数用于输出生成的算式

     6.编写计算算式的方法并返回一个计算结果(具体方法参见代码方法Calculate(int number);)

     7.变写主函数并在函数体中实现按需输出算式判断正误的功能。

•       Coding

 

#include<iostream>
using namespace std;
double Date[10];//存放数据的数组
char Operator[11];//存放运算符的数组

char OperatorGo()//生成运算符的方法
{
    double a;
    a = rand() % 4;
    if (a == 0)
    {
        return'+';
    }
    if (a == 1)
    {
        return'-';
    }
    if (a == 2)
    {
        return'*';
    }
    if (a == 3)
    {
        return'/';
    }
    /*if (a == 4)
    {
        return'(';
    }*/
}
void Cun(int number, int scope)//将生成的数据存到数组内,scope为数据范围
{
    for (int i = 0; i < number; i++)
    {
        Date[i] = rand() % scope;
    }
    for (int j = 0; j < number - 1; j++)
    {
        Operator[j] = OperatorGo();
    }
}
void ChangeDate(int scope)
{
    for (int i = 0; i < 10; i++)
    {
        if (Date[i]==0)
        {
            Date[i] = rand()%scope;
        }
    }
}
/*void ChangeOpreator(double number)
{
    for (double i = 0; i < number; i++)
    {
        if (Operator[i] == '('&&i<number-2)
        {
            Operator[i+1] = ')';
        }
        if (Operator[i] == '('&&i >= number - 2)
        {
            Operator[i] = '+';
        }
    }
}*/
void Output(int number, int scope)//输出计算式
{
    //ChangeOpreator( number);
    ChangeDate(scope);
    for (int i = 0; i < (number - 1); i++)
    {
        cout << Date[i] << Operator[i];
        //ChangeOpreator(number);
        ChangeDate(scope);
    }
    cout << Date[number - 1];
    cout <<"="<< endl;
}
//以上为生成算式部分
//下面是计算方法
double Calculate(int number)
{
    /*double **couter;
    couter = new double*[number - 2];
    for (double j = 0; j < number - 2; j++)
    {
        couter[j] = new double[number];
    }//创建动态数组用于存储中间步骤的计算结果
    char **couterOperator;
    couterOperator = new char *[number - 2];
    for (double k = 0; k < number - 2; k++)
    {
        couterOperator[k] = new char[number - 1];
    }
    for (double i = 0; i < number - 1; i++)
    {
        if (Operator[i] == '*')
        {
            couter[0][0] = Date[i] * Date[i + 1];
        }
    }*/
    for (int i = 0; i < number-1; i++)
    {
        if (Operator[i] == '*')
        {
            Date[i+1] = Date[i] * Date[i + 1];
            Date[i] = 0;
            Operator[i] = '+';
            //cout << "Date[" << i + 1 << "]=" << Date[i + 1] << endl;
        }
        if (Operator[i] == '/')
        {
            Date[i+1] = Date[i] / Date[i + 1];
            Date[i] = 0;
            Operator[i] = '+';
            //cout << "Date[" << i + 1 << "]=" << Date[i + 1] << endl;
        }
        
    }
    for (int j = 0; j < number - 1; j++)
    {
        if (Operator[j] == '+')
        {
            Date[j + 1] = Date[j] + Date[j + 1];
            Date[j] = 0;
            //cout << "Date[" << j + 1 << "]=" << Date[j + 1] << endl;
        }
        if (Operator[j] == '-')
        {
            Date[j + 1] = Date[j] - Date[j + 1];
            Date[j] = 0;
            //cout << "Date[" << j + 1 << "]=" << Date[j + 1] << endl;
        }
    }
    return Date[number - 1];

}


void main()
{
    int numbers, scopes, number2;
    double result;
    int R=0, E=0;
    char chooce;
    double returnnumbers;
  o:cout << "                  <><><><><><><><><><><><><><><><><><>" << endl;
    cout << "                  <>        请输入您的选择          <>" << endl;
    cout << "                  <>         1.运行程序             <>" << endl;
    cout << "                  <>         2.结束程序             <>" << endl;
    cout << "                  <><><><><><><><><><><><><><><><><><>" << endl;
    cin >> chooce;
if (chooce != '1'&&chooce != '2')
    {
        cout << "              输入错误请重新输入。。。" << endl;
        goto o;
    }
if (chooce == '1')
{
    
m:cout << "                   请输入参加计算的数据的个数(个数小于10个)" << endl;
    cin >> numbers;
    if (numbers > 10|| numbers<2)
    {
        cout << "             输入错误(不符合计算规范)请重新输入!!!" << endl;

        goto m;
    }
n:cout << "                   请输入参加计算的数据范围" << endl;
    cin >> scopes;
    if (scopes <= 1)
    {
        cout << "             输入错误(不符合计算规范)请重新输入!!!" << endl;
        goto n;
    }
b:cout << "                   请输入生成运算式的个数" << endl;
    cin >> number2;
    if (number2 < 0)
    {
        cout << "             输入错误(不符合计算规范)请重新输入!!!" << endl;
        goto b;
    }
    for (int k = 0; k < number2; k++)
    {
        Cun(numbers,scopes);
        Output(numbers,scopes);
        cout << endl;
        cout << "             请输入您的计算结果:" << endl;
        cin >> result;
        returnnumbers=Calculate(numbers);
        if (returnnumbers!= result)
        {
            cout << "很遗憾,计算错误!%>_<%" << endl;
            cout << "正确答案为:" << returnnumbers << endl;
            E = E + 1;
        }
        else

        {
            cout << "        回答正确,真棒!^_^" << endl;
            R = R + 1;
        }
    }
    cout << "您一共计算了" << number2 << "道算式,其中回答正确" << R << "道,回答错误" << E << "道" << endl;
    goto o;
}
if (chooce = '2')
{
        return;
}

}

 

•       Test

实验运行结果截图:

如上图支持各种符号多个数据的计算;

Postmortem:

1.输出的计算结果有误;

解决方法:在计算代码部分添加中间数值的结果输出,从而找出代码的出错原因;

2. 在回答计算结果正确的情况下即(输入的结果等于计算结果)报错;

解决方法:

目前不知道原因

但是:

将if与else的条件调换以后问题就解决了。。。

周总结进度表:

日期

任务

 

听课

编程

阅读

准备考试

 

 

日总计

周日

 

 

 

 

 

 

 

周一

120

300

0

0

 

420

100

周二

0

120

0

0

 

 

120

周三

0

0

0

0

 

 

0

周四

0

0

0

0

 

 

0

周五

0

0

0

0

 

 

0

周六

0

120

100

0

 

 

220

周总计

120

540

100

0

 

 

340

 

 

 

总计

120+120

220+540

210+100

0

 

 

530+340

平均

120

335

155

0

 

 

435

最大

120

540

210

0

 

 

530

最小

120

220

100

0

 

 

340

以前各周的累计时间

总计

240

760

310

0

 

 

870

平均

120

335

155

0

 

 

435

最大

120

540

210

0

 

 

530

最小

120

220

100

0

 

 

340

 

 

 

事件记录日志表:

日期

开始时间

结束时间

中断时间

净时

活动

备注

C

U

3/21

8:00

10:00

0

120

听课

 

 

 

 

14:30

18:00

90

300

编程序

 

 

 

 

19:00

22:00

30

270

预习复习课本知识

 

 

 

3/22

15:00

18:00

未知

约200

编程,思考

思考加编程

 

 

3/23

15:00

16:00

10

50

阅读

《构建之法》

 

 

 

19:00

20:00

10

50

编程

 

 

 

3/24

14:30

16:30

0

120

Web

 

 

 

3/25

15:00

18:00

50

250

编程,作业

《软件工程概论》进度表

 

 

 

 

 

 

 

 

 

 

 

3/26

NULL

NULL

NULL

NULL

NULL

NULL

 

 

缺陷记录日志表:

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/21

01

正确计算结果为非整数,但是比较进行整数比较(数据类型错误)

编译阶段

重新编译阶段

20

 

3/23

02

运算符出错

编译阶段

断点检查阶段

60

存放运算符的数组开辟内存不够出现溢出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/aishangtaxuefeihong/p/5308047.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值