编译原理一个简单的计算器程序

  • 格式:docx
  • 大小:44.65 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.实验目的

设计、实现一个简单的计算器程序

2.实验原理

2.1 多项式计算器的实现,采用后缀表达式来对输入的计算表达式进行计算。

2.2 对后缀表达式进行符号识别、词法分析、语法分析。

3.主要仪器设备

操作系统:WindowsXP

开发语言:Visual Studio C++6.0

4. 主要内容和步骤

将表达式转换为后缀表达式,编写程序源代码。

5.软件编程与设计

#include

#include

#define MaxSize 99

void translate(char str[],char exp[]) /*将算术表达式转换成后缀表达式*/

{

struct

{

char data[MaxSize];

int top; /*top为栈顶*/

}op; /*定义一个含data和top的结构体*/

charch;

inti = 0,t = 0;

op.top = -1;

ch = str[i]; /*将str的每一个数转换成ch*/

i++;

while(ch != '\0') /*ch对应不同的符号的时候对应的转换情况*/

{

switch(ch)

{

case '(': /*当是(的时候,将此括号存入栈op*/

op.top++;op.data[op.top]=ch;

break;

case ')':

while(op.data[op.top] != '(') /*括号内的转换优先级最高,故先提取表达式*/

{

exp[t]=op.data[op.top];

op.top--;

t++;

}

op.top--;

break;

case '+':

case '-':

while(op.top != -1&&op.data[op.top] != '(')

{

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++; /*恢复可插入位置*/

op.data[op.top] = ch;

break;

case '*':

case '/':

while(op.top == '/'||op.top == '*') /*优先级*/

{

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++;

op.data[op.top] = ch;

break;

case ' ': /*忽略空格,排除误操作*/ break;

default:

while(ch>= '0'&&ch<= '9')

{

exp[t] = ch;t++;

ch = str[i];i++;

}

i--;

exp[t] = '#'; /*分隔操作数,为了美观,也为了以后好分隔操作数*/ t++;

}

ch = str[i];

i++;

}

while(op.top != -1) /*得到剩下的部分*/

{

exp[t] = op.data[op.top];

t++;

op.top--;

}

exp[t] = '\0'; /*表达式结束*/

}

floatcal_value(char exp[])

{

struct

{

float data[MaxSize];

int top;

}st; /*操作数栈*/ float d;

charch;

int t = 0;

st.top = -1;

ch = exp[t];

t++;

while(ch != '\0')

{

switch(ch) /*运算主体*/

{

case '+':

st.data[st.top-1] = st.data[st.top-1]+st.data[st.top];

st.top--;

break;

case '-':

st.data[st.top-1] = st.data[st.top-1]-st.data[st.top];

st.top--;

break;

case '*':

st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];

st.top--;

break;

case '/':

if(st.data[st.top] != 0)

st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];

else

{

printf("\n\t除0是错误的");

}

st.top--;

break;

default:

d=0;

while(ch>= '0'&&ch<= '9') /*从后缀表达式中获取操作数,#作用在此体现*/

{

d = 10*d+ch-'0';

ch = exp[t];

t++;

}

st.top++;

st.data[st.top] = d;

}

ch = exp[t];

t++;

}

returnst.data[st.top];

}

int main() /*可以提到前面去*/

{

char str[MaxSize],exp[MaxSize]; /*str为算术表达式,exps为后缀表达式*/ printf("请输入一个求值表达式\n");

gets(str); /*输入一个算术表达式*/

printf("原表达式是:%s\n",str);

translate(str,exp); /*将算术表达式转换成后缀表达式*/ printf("后缀表达式:%s\n",exp);

printf("计算结果:%g\n",cal_value(exp));/*通过后缀表达式来求值*/

// system("pause");

return 0;

}

6.运行结果