文档介绍:需求分析
问题描述
通过模拟一个简单的计算器来进行+、-、*、/、%、^(乘方)等运算,从键盘上输入一算术表达式,计算出表达式的值。
具体要求
输入中缀表达式,例如:2*(3+4);
包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、')'、’^’;
输出的形式:表达式+运算结果,例如2*(3+4)=14;
注:
输入为空时进行提示。
自动屏蔽错误符号。
概要设计
各模块说明
栈模块
函数:pOperatorS push(pOperatorS s, char c);
功能:将操作符压栈
函数:pOperandS push(pOperandS s, float f);
功能:将操作数压栈
函数:pOperatorS pop(pOperatorS s);
功能:将操作符出栈
函数:pOperandS pop(pOperandS s);
功能:将操作数出栈
优先级比较模块
函数:int getPosition(char opor,char * testOptr);
功能:返回操作符在操作符容器中的位置
函数:char precede(char optrA, char optrB):
功能:比较两个操作符的优先级(通过查表实现)
运算模块
函数:float eValuateExpression(char * myExpression);
功能:计算表达式的值
函数:float operate(float a, unsigned char theta, float b);
功能:求a operator b的值
详细设计
栈模块
//操作符栈
typedef struct operatorStack{
char c;
struct operatorStack * next;
}operatorS, * pOperatorS;
//操作数栈
typedef struct operand{
float f;
struct operand * next;
}operandS, * pOperandS;
//将操作符压栈
pOperatorS push(pOperatorS s, char c) //operatorS类型的指针push,返回p
{
pOperatorS p = (pOperatorS)malloc(sizeof(operatorS));
p->c = c;
p->next = s;
return p;
}
//将操作数压栈
pOperandS push(pOperandS s, float f) //operandS类型的指针push,返回p
{
pOperandS p = (pOperandS)malloc(sizeof(operandS));
p->f = f;
p->next =s;
return p;
}
//将操作符出栈
pOperatorS pop(pOperatorS s) //operatorS类型的指针pop
{
pOperatorS q = s;
s = s->next;
free(q);
return s;
}
//将操作数出栈
pOperandS pop(pOperandS s) //operandS类型的指针pop
{
pOperandS q = s;
s = s->next;
free(q);
return s;
}
优先级比较模块
// 操作符优先级表
unsigned char prior[8][8] = {
////// '+' '-' '*' '/' '(' ')' '#' '^'
/*'+'*/'>','>','<','<','<','>','>','<',
/*'-'*/'>','>','<','<','<','>','>','<',
/*'*'*/'>','>','>','>','<','>','>','<',
/*'/'*/'>','>','>','>','<','>','>','<',
/*'('*/'<','<','<','<','<','=',' ','<',
/*')'*/'>','>','>','>',' ','>','>','>',
/*'#'*/'<','<','<','<','<',' ','=','<',
/*'^'*/'>','>','>','>','<','>','>','>'
};
//返回操作符在操作符容器中的位置
int getPosit