📄 evaluate.cpp
字号:
/*______________________________________________________________________________________________________________
________________________________________________________________________________________________________________
算术表达式求值
[问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,
运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符"#",如:#(7+15)*(23-28/4)#。
引入表达式起始、结束符是为了方便。编程利用"算符优先法"求算术表达式的值。
[基本要求]
(1) 从键盘读入一个合法的算术表达式,输出正确的结果。
(2) 显示输入序列和栈的变化过程。
(3) 考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。
________________________________________________________________________________________________________________
________________________________________________________________________________________________________________*/
#include "stdio.h"
#include "string.h"
#include "Evaluate.h"
void main(){
char again;
char string[30];
do{
printf("请输入算术表达式(以'#'起始和结束):\n");
scanf("%s",string);
int length;
length=strlen(string);
/**************************************************************************************************************
判断表达式的几种错误
***************************************************************************************************************/
/**************************未以'#'开始和结束********************************************/
if(string[0]!='#'||string[length-1]!='#')
{
printf("表达式出错! 表达式应以'#'起始和结束。请重新输入表达式。\n\n");
again='y';
continue;
}
/********************************表达式出现无意义符号************************************/
char str[]={'+','-','*','/','(',')','0','1','2','3','4','5','6','7','8','9'};
int j=1;
int k;
while(j<length-1){
k=0;
while(string[j]!=str[k]) {k++; if(k==16)break;}
if(k!=16) j++;
else break;
}
if(j!=length-1)
{
printf("表达式出错! 出现无意义符号。请重新输入表达式。\n\n");
again='y';
continue;
}
/**************************除数为零*****************************************************/
for(j=1;j<length-1;j++){
if(string[j]=='/'&&string[j+1]=='0')
{
printf("表达式出错! 除数不能为零。请重新输入表达式。\n\n");
break;
}
}
if(j!=length-1) {again='y';continue;}
/**********************************括号不匹配*******************************************/
int n1,n2;
n1=n2=-1;
for(j=1;j<length-1;j++){
if(string[j]=='(') n1=j;
else if(string[j]==')') n2=j;
}
if(n1==-1&&n2!=-1 || n2==-1&&n1!=-1 || n1!=-1&&n2!=-1&&n1>n2)
{
printf("表达式出错! 括号不匹配。请重新输入表达式。\n\n");
again='y';
continue;
}
/**************************************************************************************************************
计算算术表达式
***************************************************************************************************************/
int result;
result=EvaluteExpression(string);
printf("运算结果: ");
printf("%d\n\n",result);
printf("请问还要继续计算吗?\n");
getchar();
scanf("%c",&again);
printf("\n");
}while(toupper(again)=='Y');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -