课程作业一
重构四则运算器
这次作业是重写的,上次运用了模板,这次审视了一下题目,要将上次的代码模块化,函数分离。模块化和函数分离可以使代码的可读性更强,使整个代码更加紧凑有条理。但很明显如果利用了上次的模板化的运算器就不能有题目这样要求的函数分离。所以决定重写代码。期间遇到许多问题。在上次组队同伴宏岩写的速度比我快的情况下,讨教了他,解决了不少问题。另外注明我的计算结果的算法出现了问题,不能在deadline之前完成,所以现在的很大一部分是在别人的帮助下完成的。自己的那段代码会在后续加上。
此次作业的感想
前一次作业没用利用足够的随机性,这样的运算器的局限性使之若要谈实用性,必将大打折扣,所以在紧凑的时间里决定重新写这个代码,困难是先比于上次合作作业来说多很多的。其中一个原因便是合作的情况下能更高效的完成任务。另外个人能力有限,不能很好快速的解决所遇到的问题,其中包括思路和完成。在讨教完思路的情况下,打完代码后,更难得的问题在于调试bug,会遇到许多问题,在一个较长的代码里排错是很需要耐心的事,所以也锻炼了查错能力。
函数分离部分代码展示:
class Problem
{
public:
Problem();
void init(); //初始化
void scan(); //该函数用于与用户交互,获取输入数据
void DisPlayAnswer(); //输出正确答案
void print(); //将统计结果输出给用户
//生成算式部分----------------------------------------------------------------------
int randomNumber(); //用于随机生成数字
char randomOperation(); //用于随机生成运算符
template<typename T> string Tostring(T i);
void generateExpression(); //用于生成运算式
//----------------------------------------------------------------------------------
//算式计算部分----------------------------------------------------------------------
float calculateResult(); //计算结果
float caculate(float Operand1, float Operand2, char Operator);
//----------------------------------------------------------------------------------
其中借鉴同伴优先级的那段代码:
void InitPriorities()
{
Priorities['+']['-'] = '>';
Priorities['+']['+'] = '>';
Priorities['+']['*'] = '<';
Priorities['+']['/'] = '<';
Priorities['+']['('] = '<';
Priorities['+'][')'] = '>';
Priorities['-']['-'] = '>';
Priorities['-']['+'] = '>';
Priorities['-']['*'] = '<';
Priorities['-']['/'] = '<';
Priorities['-']['('] = '<';
Priorities['-'][')'] = '>';
Priorities['*']['-'] = '>';
Priorities['*']['+'] = '>';
Priorities['*']['*'] = '>';
Priorities['*']['/'] = '>';
Priorities['*']['('] = '<';
Priorities['*'][')'] = '>';
Priorities['/']['-'] = '>';
Priorities['/']['+'] = '>';
Priorities['/']['*'] = '>';
Priorities['/']['/'] = '>';
Priorities['/']['('] = '<';
Priorities['/'][')'] = '>';
Priorities['(']['+'] = '<';
Priorities['(']['-'] = '<';
Priorities['(']['*'] = '<';
Priorities['(']['/'] = '<';
Priorities['(']['('] = '<';
Priorities['('][')'] = '=';
}
昨天重写了很久没写出来,所以没在deadline之前交上。
作业后续会继续修改
目前没完成的想法:
void calculateResult()//用于计算生成的运算式的结果
{
stack<char> signal;
stack<float> number;
for (int i = 0; i < expression.size(); i++)
{
if (expression[i] == '1'&&i != expression.size() - 1 && expression[i + 1] == '0')
{
printf("push %lf
",10);
number.push(10);
i++;
}
else if (expression[i] <= '9'&&expression[i] >= '1')
{
number.push(expression[i]-'0');
printf("push %lf
", number.top());
}
else
{
if (signal.empty())
{
signal.push(expression[i]);
printf("push %c
",signal.top());
}
else if (expression[i] == '('||signal.top()=='('||signal.top()==')')
{
if (expression[i] == ')' && signal.top() == '(')
{
printf("pop %c
", signal.top());
signal.pop();
continue;
}
signal.push(expression[i]);
printf("push %c
", signal.top());
}
else if (GetPriority(signal.top(), expression[i]) == true)
{
signal.push(expression[i]);
printf("push %c
", signal.top());
}
else if (GetPriority(signal.top(), expression[i]) == false)
{
//while ( !signal.empty() && GetPriority(signal.top(), expression[i]) == false)
{
printf("in
");
float num1 = number.top();
number.pop();
if (signal.top() == '+')
{
printf("+
");
number.top() += num1;
signal.pop();
}
else if (signal.top() == '-')
{
number.top() -= num1;
signal.pop();
}
else if (signal.top() == '*')
{
printf("*
");
number.top() *= num1;
signal.pop();
}
else if (signal.top() == '/')
{
number.top() /= num1;
signal.pop();
}
}
}
}
}
while (!signal.empty())
{
float num2 = number.top();
number.pop();
if (signal.top() == '+')
{
number.top() += num2;
signal.pop();
}
else if (signal.top() == '-')
{
number.top() -= num2;
signal.pop();
}
else if (signal.top() == '*')
{
number.top() *= num2;
signal.pop();
}
else if (signal.top() == '/')
{
number.top() /= num2;
signal.pop();
}
else if (signal.top() == ')')
{
signal.pop();
signal.pop();
}
}
//answer = ((float)(int)(number.top()*100))/100;
answer = number.top();
}
调试了很多次错误还没找到。所以只好先放一放。