作业帮 > 综合 > 作业

C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2

来源:学生作业帮 编辑:灵鹊做题网作业帮 分类:综合作业 时间:2024/04/28 10:05:36
C语言!
1.要求:完成标准中缀算术表达式求值运算.
2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)
3.输入的中缀表达式符合以下要求:
(1) 中缀表达式长度不确定.
(2) 中缀表达式仅出现在一行输入行中.
(3) 中缀表达式中只包含5种2目运算符:+,-,*,/ ,^及两种优先级运算符“(”和“)”.
“^” 为指数运算,如:4^2=16.
(4) 中缀表达式中的运算数由{0,1,…,8,9}中的单个数字组成.
(5) 中缀表达式中不包含多余的空格.
(6) 中缀表达式在逻辑上和结构上如出现错误,程序应能提示错误.
4.你的程序应输出最终运算结果.
5.为确保你的程序的正确性,完备性,健壮性,请提交前自行设计相应的测试实例进行充分的测试检查.
C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2
#include
#include
#include
#include
char str[100];
int p;
typedef struct node
{
char sym;
struct node *lchild,*rchild;
}BTNode;
BTNode *lastNode;
void Initial()
{
scanf("%s",str);
char str2[100];
int len = strlen(str),i;
for(i = 0;i < len;i++)
{
if(str[len-i-1] == ')')
str2[i] = '(';
else if(str[len-i-1] == '(')
str2[i] = ')';
else
str2[i] = str[len-i-1];
}
str2[i] = '\0';
strcpy(str,str2);
p = 0;
}
void Advance()
{
p++;
}
char SYM()
{
return str[p];
}
bool SYMIsDigital()
{
return SYM() = '0';
}
void A();
void B();
void C();
void D();
void A_();
void B_();
void C_();
void A()
{
if(SYM() == '('||SYMIsDigital())
{
B();
A_();
}
else
exit(0);
}
void A_()
{
BTNode *p,*q;
if(SYM() == '+')
{
p = lastNode;
Advance();
B();
A_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '+';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == '-')
{
p = lastNode;
Advance();
B();
A_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '-';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0')
{
}
else
exit(0);
}
void B()
{
if(SYM() == '('||SYMIsDigital())
{
C();
B_();
}
else
exit(0);
}
void B_()
{
BTNode *p,*q;
if(SYM() == '*')
{
p = lastNode;
Advance();
C();
B_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '*';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == '/')
{
p = lastNode;
Advance();
C();
B_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '/';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0'||SYM() == '+'||SYM() == '-')
{
}
else
exit(0);
}
void C()
{
if(SYM() == '('||SYMIsDigital())
{
D();
C_();
}
else
exit(0);
}
void C_()
{
BTNode *p,*q;
if(SYM() == '^')
{
p = lastNode;
Advance();
D();
C_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '^';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0'||SYM() == '+'||SYM() == '-'||SYM() == '*'||SYM() == '/')
{
}
else
exit(0);
}
void D()
{
if(SYMIsDigital())
{
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = SYM();
lastNode->lchild = lastNode->rchild = NULL;
Advance();
}
else if(SYM() == '(')
{
Advance();
A();
if(SYM() == ')')
Advance();
else
exit(0);
}
else
exit(0);
}
double Calculate(BTNode *T)
{
double a,b;
if(T)
{
b = Calculate(T->lchild);
a = Calculate(T->rchild);
if(T->sym sym >= '0')
return (double)(T->sym-'0');
else if(T->sym == '+')
return a+b;
else if(T->sym == '-')
return a-b;
else if(T->sym == '*')
return a*b;
else if(T->sym == '/')
return a/b;
else if(T->sym == '^')
return pow(a,b);
}
}
int main()
{
Initial();
A();
printf("%f\n",Calculate(lastNode));
system("pause");
}
//vs2010下编译通过,使用的是递归下降分析法LL(1)(比较方便实现),在实现过程中翻转了字符串
//如果输入格式不符合直接退出程序(只支持1位的数字)