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 |
存放运算符的数组开辟内存不够出现溢出 |