#include "Calculation.h"
using namespace std;
Calculation::Calculation(void)
{
}
Calculation::~Calculation(void)
{
}
void Calculation::Read_Expression(string ExpressionCode)//输入表达式函数的实现
{
this->ExpressionCode = ExpressionCode;
Expression .assign(ExpressionCode, 2, 100);
CalculationExpressions();
}
char Calculation::ComparePriority(char Operator_A,char Operator_B)//判断前运算符a和当前运算符B的优先级
{
if( '+' == Operator_A || '-' == Operator_A)
{
switch (Operator_B)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '<';
case '/':
return '<';
case '%':
return '<';
case '(':
return '<';
case ')':
return '>';
case '#':
return '>';
default :;
}
}
else if( '*' == Operator_A || '/' == Operator_A || '%' == Operator_A)
{
switch (Operator_B)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '%':
return '>';
case '(':
return '<';
case ')':
return '>';
case '#':
return '>';
default :;
}
}
else if( '(' == Operator_A )
{
switch (Operator_B)
{
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '%':
return '<';
case '(':
return '<';
case ')':
return '=';
default :;
}
}
else if( ')' == Operator_A )
{
switch (Operator_B)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '%':
return '>';
case ')':
return '>';
case '#':
return '>';
default :;
}
}
else if( '#' == Operator_A )
{
switch (Operator_B)
{
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '%':
return '<';
case '(':
return '<';
case '#':
return '=';
default :
;
}
}
}
void Calculation::Computng()
{
int Priority;
int a = 0;
int f = 0;
Priority = ComparePriority( Operators[Top_Operators], Expression[Current_Character_Of_Expression]);
switch (Priority)
{
case '>':
switch (Operators[Top_Operators])
{
case '+':
Pure_Digital[No_Of_Pure_Digital-1] = Pure_Digital[No_Of_Pure_Digital-1] + Pure_Digital[No_Of_Pure_Digital];
Pure_Digital[No_Of_Pure_Digital] = 0;
No_Of_Pure_Digital--;
break;
case '-':
Pure_Digital[No_Of_Pure_Digital-1] = Pure_Digital[No_Of_Pure_Digital-1] - Pure_Digital[No_Of_Pure_Digital];
Pure_Digital[No_Of_Pure_Digital] = 0;
No_Of_Pure_Digital--;
break;
case '*':
Pure_Digital[No_Of_Pure_Digital-1] = Pure_Digital[No_Of_Pure_Digital-1] * Pure_Digital[No_Of_Pure_Digital];
Pure_Digital[No_Of_Pure_Digital] = 0;
No_Of_Pure_Digital--;
break;
case '/':
Pure_Digital[No_Of_Pure_Digital-1] = Pure_Digital[No_Of_Pure_Digital-1] / Pure_Digital[No_Of_Pure_Digital];
Pure_Digital[No_Of_Pure_Digital] = 0;
No_Of_Pure_Digital--;
break;
case '%':
Pure_Digital[No_Of_Pure_Digital-1] = (int)Pure_Digital[No_Of_Pure_Digital-1] % (int)Pure_Digital[No_Of_Pure_Digital];
Pure_Digital[No_Of_Pure_Digital] = 0;
No_Of_Pure_Digital--;
break;
}
Operators[Top_Operators] = 0;//距离初次制作(数据结构实验)年代久远,已经忘记为什么要将栈顶操作符置为0
Top_Operators = Top_Operators - 1;
break;
case '<':
Operators = Operators + Expression[Current_Character_Of_Expression];
//整理操作符栈
a = Operators.length();
for( ;f < a ; f++)
{
if(0 == Operators[f])
{
Operators[f] = Operators[a-1];
Operators[a-1] = 0;
break;
}
}
Top_Operators++;
d = 1;//将计算操作挂起
break;
case '=':
Operators[Top_Operators] = 0;
Top_Operators = Top_Operators - 1;
d = 1;//将计算操作挂起
break;
}
}
/*所有的Current_Character_Of_Expression++;操作表示处理完当前的字符,
将Current_Character_Of_Expression指针指向下一字符*/
void Calculation::CalculationExpressions()//计算表达式函数的实现
{
int j = 0;
int h = 0;
int a = 0;
//正负数标记,当目前检测到的数字为负数时,将这个标记记为1,否则为O
int Positive_or_Negative_Marking = 0;
Current_Character_Of_Expression = 0;//每次计算表达式之前,重置计数器Current_Character_Of_Expression
Top_Operators = 0;//每次计算表达式之前,重置算符栈顶符号
No_Of_Pure_Digital = -1;//每次计算表达式之前,重置计数器No_Of_Pure_Digital
//初始化操作符栈和数字栈
if(!Operators.empty())
{
Operators = "";
}
for(int i = 0 ;i < 20; i++)
{
Pure_Digital[i] = 0;
}
if(!Expression.empty())
{
while(Current_Character_Of_Expression < Expression.length())
{
//如果操作符栈目前为空,则将起始字符‘#’存入栈
if(Operators.empty())
{
Operators = Operators + Expression[Current_Character_Of_Expression];
Current_Character_Of_Expression++;
}
//读取数字,包括负数、小数,将其存入字符串
while(1)
{
//检测当前是否遇到了负数,若有,将负数字符符号标记为1
//以表达式上一个字符为'(',当前字符为'-'则判定遇到了负数
if('(' == Expression[Current_Character_Of_Expression-1] && '-' == Expression[Current_Character_Of_Expression])
{
Positive_or_Negative_Marking = 1;
Current_Character_Of_Expression++;
}
//检测当前是否遇到了数字字符,若遇到,存入数字字符串中
else if( Expression[Current_Character_Of_Expression] >= '0' && Expression[Current_Character_Of_Expression] <= '9')
{
Numeric_Characters = Numeric_Characters + Expression[Current_Character_Of_Expression];
Current_Character_Of_Expression++;
}
//检测当前是否遇到了小数点,若遇到,则存入数字字符串过程中
else if('.' == Expression[Current_Character_Of_Expression])
{
Numeric_Characters = Numeric_Characters + Expression[Current_Character_Of_Expression];
Current_Character_Of_Expression++;
}
else
{
break;
}
}
/*若数字字符串Numeric_Characters不为空则
将Numeric_Characters中的数字字符转化为相应的整数储存在Pure_Digital中
且重置Numeric_Characters字符串重置为空*/
if( ! Numeric_Characters.empty())
{
int Point_or_end = 0;
No_Of_Pure_Digital++;//Pure_Digital栈中的数据个数加1
j = Numeric_Characters.length();
for(h = 0; h < j ; h++)
{
a = pow((double)10,j-h-1);
Pure_Digital[No_Of_Pure_Digital] = Pure_Digital[No_Of_Pure_Digital] + ( Numeric_Characters[h] - 48 ) * a;
/*如果下一位数字字符存在,判断是否是小数点*/
if((h+1) < j && '.' == Numeric_Characters[h+1])
{
Point_or_end = 1;//将Point_or_end标记为1,表示遇到了小数点
Pure_Digital[No_Of_Pure_Digital] = Pure_Digital[No_Of_Pure_Digital] / 10;//去除小数点对数字位数的影响
break;
}
}
if(1 == Point_or_end)
{
int aa = h;
h = h + 2 ;
for(; h < j ; h++)
{
a = pow((double)10,j-h-1);
Pure_Digital[No_Of_Pure_Digital] = Pure_Digital[No_Of_Pure_Digital] + ( Numeric_Characters[h] - 48 ) * a;
}
a = pow((double)10,j-aa-2);
Pure_Digital[No_Of_Pure_Digital] = Pure_Digital[No_Of_Pure_Digital] / a;//缩小小数点后有效位数倍数,以得到正确位数的值
}
//如果负数标记为1,则将当前的纯数字取反,且重置负数标记
if(1 == Positive_or_Negative_Marking)
{
Pure_Digital[No_Of_Pure_Digital] = - Pure_Digital[No_Of_Pure_Digital];
Positive_or_Negative_Marking = 0;
}
Numeric_Characters = "";//清空Numeric_Characters中的数字字符
}
//Numeric_Characters字符串为空,表示当前遇到算符,则执行计算步骤。
else
{
//如果计算操作没有被挂起(即挂起标记不为1),则执行计算操作。
while(1 != d)
{
Computng();
}
d = 0;
Current_Character_Of_Expression++;
}
}
}
//强制将计算结果保留小数点后4位
Pure_Digital[0] = (int)(Pure_Digital[0] *10000);
Pure_Digital[0] = Pure_Digital[0] /10000;
Compare
- 1
- 2
前往页