用C语言编写程序“算术表达式求值”

一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含+、-、*、/等四种运算符,界限符有左右圆括号和表达式结束符“#”,如:(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程按照算术运算规则,求算术表达式的值。
要求:
(1) 从键盘读入一个合法的算术表达式,输出正确的结果。
(2) 显示输入序列和栈的变化过程。

第1个回答  2012-06-14
#include <stdio.h>
#include <math.h>
enum state
;
int ctoi( char c)
bool isNum( char a)
bool isOp(char op)
{
switch(op)
{
case '+':
return true;
break;
case '-':
return true;
break;
case '*':
return true;
break;
case '/':
return true;
break;
default:
return false;
break;
}
}
bool isDot(char dot)
int checkString( char str[], double *a, double * b, char* op, int num)
{
enum state s = BEGIN;
int a_i = 0;
int b_i = 0;

double num1 = 0;
double num2 = 0;
int pointNum = 0;
for( int i = 0; i < num; ++i)
{
if(str[i] == ' ')continue;
switch(s)
{
case BEGIN:
if(isNum(str[i]))

elses = ERROR;
break;
case P2:
if(isNum(str[i]))

else if(isDot(str[i]))
{
s = P3;
}
else if(isOp(str[i]))
{
*op = str[i];
s = P5;
}
else
s = ERROR;
break;
case P3:
if(isNum(str[i]))
{
num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum) ;
s = P4;
}
else
s = ERROR;
break;
case P4:
if(isNum(str[i]))
{
num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P4;
}
else if(isOp(str[i]))
{
*op = str[i];
s = P5;
}
else
s = ERROR;
break;
case P5:
if(isNum(str[i]))
{
num2 = num2 * 10 + ctoi(str[i]);
s = P6;
}
else
s = ERROR;
break;
case P6:
pointNum = 0;
if(isNum(str[i]))
{
num2 = num2 * 10 + ctoi(str[i]);
s = P6;
}
else if(isDot(str[i]))
{
s = P7;
}
else
s = END;
break;
case P7:
if(isNum(str[i]))
{
num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P8;
}
else
s = END;
break;
case 8:
if(isNum(str[i]))
{
num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P8;
}
else if(isOp(str[i]))
{
s = END;
}
else
s = END;
break;
case ERROR:
printf("express error. \n");
break;
}
if (s == END || s == ERROR)
break;
}
if(s==END)
else
}
int main()
{
char op;
double a;
double b;

char string[128] = ;
scanf("%s", &string);
printf("the expression you input is : %s. \n", string);
getchar();

if (-1 == checkString(string, &a, &b, &op, 128))
{
printf("error occur while checking expression. Be sure no space in your expression when input\n");
getchar();
return 0;
}

double result;
switch(op)
{
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if(b != 0)
result = a / b;
else
{
printf(" error! %d/%d", a, b);
return -1;
}
break;
default:
printf("undefined expression.\n");
break;
}

printf("%f %c %f = %f\n", a, op, b, result);
return 0;
}
第2个回答  2009-12-28
第3个回答  2009-12-28
看的晕晕的

算术表达式求值 C语言
clude<iostream.h> \/\/#define MaxLen 100\/\/存储空间 int tran(char str[], char expr[]) \/\/将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)\/\/原来表达式,后缀表达式 { int st[100]; \/\/转化过程使用的过度栈 char ch;int i=0,exindex=0,stindex=-1; \/\/i是str下标,...

c语言表达式求值
\/\/若栈不为空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top==S.base)return ERROR;e=*(--S.top);return OK;}\/\/Pop char Precede(char t,char c){ switch(c){ case '+':if(t=='+'||t=='-'||t=='*'||t=='\/'||t==')')return '>';else ret...

怎样用c语言编一个简单的计算器?最简单的
default:printf("表达式错误!\\n");exit(0); }}\/\/OperateStatus EvaluateExpression(){ \/\/算术表达式求值 char c,x,theta,prec; \/\/c是每次读取的字符,x是存放脱括号后的多余的括号,theta是运算符,prec是c的前一个字符 float a,b,result;\/\/a、b是每次从运算数栈中取出的要进行运算的数,result存放最终结果...

怎样用c语言编一个简单的计算器?
if(flag==0)cc=cc*10+c-48;\/\/小数点之前 else if(flag==1){cc=cc+(c-48)\/ii;ii*=10;}\/\/小数点之后 else {printf("小数点错误!\\n");exit(0);}\/\/小数点有错 } else if(c=='.')flag++;\/\/读到小数点 else {printf("表达式错误!\\n");exit(0);} prec=c;scanf("%c",&c); } cc...

《数据结构 课程设计》表达式求值 实验报告
在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。二、 系统分析 1. 以...

c语言计算中缀表达式
int j=0;while(input[j]!=NULL) j++;try { cout<<getnumber(0,j-1);} catch(int x){ switch(x){ case 1:cout<<"部分括号缺失";break;case 2:cout<<"部分操作数缺失";break;case 3:cout<<"部分操作数以0开头";break;default:cout<<"运算式无错";} } } 用C++写的 ...

C语言一个作业,运用栈设计一个计算器,VC++6.0的
include "string.h"\/\/网上找的,在VC下测试通过,还改了一个显示的小错。include "ctype.h"include "math.h"\/\/expression evaluate define iMUL 0 define iDIV 1 define iADD 2 define iSUB 3 define iCap 4 \/\/#define LtKH 5 \/\/#define RtKH 6 define MaxSize 100 void iPush(float);fl...

使用链表完成一个整数计算器,该计算器需包含整数的加法、减法、乘法功...
我们使用链表来模拟单元多项式的常见运算。当中,加法是其他运算的基础。减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2。可用poly1乘以poly2的每一项,相加其乘积结果。单元多项式的节点结构类型是这种:typedef struct node { float coef; \/\/系数 int expn; \/\/指数 struct node *next...

java中什么表达式不可以作为循环条件?求解释。。QQ928488929
只要表达式的计算结果是true或者false就可以作为循环条件,其他的一概不可以。 aglx623 | 发布于2011-11-07 举报| 评论 3 1 boolean b; while(b = true) JAVA不推荐这么写的这个里面有2步操作1) b = true;将b赋值为true2) while(b),最终判断是根据boolean类型的b来判断的。所以这个循环等同于死循环...

相似回答