C语言表达式求值.docx

上传人:苏美尔 文档编号:9676679 上传时间:2021-03-16 格式:DOCX 页数:16 大小:37.39KB
返回 下载 相关 举报
C语言表达式求值.docx_第1页
第1页 / 共16页
C语言表达式求值.docx_第2页
第2页 / 共16页
C语言表达式求值.docx_第3页
第3页 / 共16页
C语言表达式求值.docx_第4页
第4页 / 共16页
C语言表达式求值.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《C语言表达式求值.docx》由会员分享,可在线阅读,更多相关《C语言表达式求值.docx(16页珍藏版)》请在三一文库上搜索。

1、实验四算术表达式求值运算器一、实验目的帮助学生熟练掌握栈的基本操作,并通过用算符优先法对表达式求值的过程深刻领会用栈解决实际问题的基本方法。二、实验内容编写程序实现从键盘终端输入语法正确的算术表达式,计算出表达式的值。为了避免算符的二义性,可以假设表达式中只包含实型正常数运算符包括加、减、乘、除四种基本运算,可以包含圆括号。三、实验仪器微型计算机实验用编程语言:Turbo C 2.0 , Borland C 3.0 等以上版本四、实验原理1、算术四则运算法则:先乘除后加减从左至右先括号内后括号外2 、方法:对运算符建立优先关系矩阵,按优先关系对表达式进行处理。算符:运算符和界符。根据法则 1:

2、对于两个相邻运算符,乘除优先于加减。根据法则 2:乘除优先级相同,加减优先级相同。相邻两个同级运算符左优先。根据法则 3:“(”前面的运算符优先级低于“(”的优先级。“(”的优先级低于右边相邻算符。“)”左边的算符高于“)”的优先级。由于“(”和“)”必须成对出现,令它们的优先性相同。为了处理的方便,假设表达式以“”开始和结束,输入表达式的一般形式为:#表达式 #如:#5.3+4.2*(7.6+4.5)#规定开始的“”的优先性低于所有其它算符,所有其它算符的优先性高于结束的“”。根据假设,表达式开始的“#”和结束的“ #”必须成对出现,所以也令它们的优先性相同。对于一个正确的表达式,“) ”不

3、可能与“ (”相邻,“(”不可能与结束的“#”相邻,开始的“ #”不可能与“) ”相邻,它们之间没有优先性,程序应具有这种判断能力。根据上面的讨论,可用表1 所示的算符优先关系矩阵来描述算符之间的优先关系,其中,用“”表示表达式中前一个算符的优先性高于后一个算符的优先性,用“-*/(#=0 & strpp=0 & strpp=0 & strpp=0 & strpp=9) /处理实数的小数部分 number=number+(strpp-48)/temp; temp=temp*10;pp+;七、思考题1 、若表达式中的数据带有正负号的实数字符串该怎样进行转换?2、对于指数形式的实数字符串该怎样进行

4、转换?八、部分函数代码#include#include #include #define PLUS 0#define MINUS 1#define POWER 2#define DIVIDE 3#define LEFTP 4#define RIGHP 5#define STARTEND 6#define DIGIT 7#define POINT 8#define NUM 7#define NO 32767#define STACKSIZE 20/ 运算符char a=+,-,*,/,(,),#;/ 优先关系矩阵,规定: =为 0, 为 1, 为 -1, 空为 NO int PriorityTa

5、ble77= 1, 1,-1,-1,-1, 1, 1, 1, 1,-1,-1,-1, 1, 1, 1, 1, 1, 1,-1, 1, 1, 1, 1, 1, 1,-1, 1, 1,-1,-1,-1,-1,-1, 0, NO, 1, 1, 1, 1,NO, 1, 1, -1,-1,-1,-1,-1,NO, 0;int menu(void) ;/*int n;printf(nn);printf(MENUn);printf(*n);printf(operationsn);printf(1.输入表达式 n);printf(2.计算表达式 n);printf(3.输出计算结果 n);printf(4.退

6、出 n);printf(*n);printf(choice(1,2,3,4):);scanf(%d,&n);return n;*/*/*输入表达式函数*/*/void InputExpression(char str) int len;printf(Input expression string:n); scanf(%s,str); len=strlen(str);strlen=#;strlen+1=0;/*/*确定当前字符类型*/*/*若为运算符,则返回运算符在运算符数组中的序号*/*若为数字字符,则返回 DIGIT*/*若为小数点字符 , 则返回 POINT*/*否则为非法字符 , 返回

7、-1*/*/int GetCharType(char ch) int i;for(i=0;i=0 & ch=0 & strpp=0 & strpp=0 & strpp=9) number=number+(strpp-48)/temp; temp=temp*10;pp+;OPNDtopNd=number;topNd+;break;case PLUS:/+case MINUS:/-case POWER:/*case DIVIDE: /while(PriorityTableOPTRtopTr-1CharType=1)if(OPTRtopTr-1=PLUS)number=OPNDtopNd-2+OPN

8、DtopNd-1;else if(OPTRtopTr-1=MINUS)number=OPNDtopNd-2-OPNDtopNd-1;else if(OPTRtopTr-1=POWER)number=OPNDtopNd-2*OPNDtopNd-1;else if(OPTRtopTr-1=DIVIDE)number=OPNDtopNd-2/OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;OPTRtopTr=CharType;topTr+;pp+;break;case LEFTP:/(OPTRtopTr=L

9、EFTP;topTr+;pp+;break;case RIGHP: /)while(OPTRtopTr-1!=LEFTP)if(OPTRtopTr-1=PLUS)number=OPNDtopNd-1+OPNDtopNd-2;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;else if(OPTRtopTr-1=MINUS)number=OPNDtopNd-2-OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;else if(OPTRt

10、opTr-1=POWER)number=OPNDtopNd-2*OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;else if(OPTRtopTr-1=DIVIDE)number=OPNDtopNd-2/OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;topTr-;pp+;break;case STARTEND:/遇到表达式结束符while(OPTRtopTr-1!=STARTEND)if(OPTRtopTr

11、-1=PLUS)number=OPNDtopNd-1+OPNDtopNd-2;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;else if(OPTRtopTr-1=MINUS)number=OPNDtopNd-2-OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;else if(OPTRtopTr-1=POWER)number=OPNDtopNd-2*OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopN

12、d=number;topNd+;return number;else if(OPTRtopTr-1=DIVIDE)number=OPNDtopNd-2/OPNDtopNd-1;topNd-;topNd-;topTr-;OPNDtopNd=number;topNd+;return number;pp+;break;if(topNd=1) *Result=OPND0; return(1);else return(0);return(1);void main() int num,flag; double result; char str256; str0=0; while(1) num=menu()

13、; switch(num)case 1: /输入表达式flag=0;printf(%sn,str);getchar();break;case 2: /计算表达式if(str0=0) printf(Expresson is Empty!); getchar();break;if(!EXCUTE(str,&result) printf(The expression has error!n); getchar();else printf(calulation has finished!n); getchar();flag=1;break;case 3:/打印计算结果if(flag) printf(#

14、%s=%lfn,str,result); getchar();break;case 4:/退出系统break;if(num=4) break;int menu(void) int num; /clrscr();printf(%20c1-input expressionn, ); printf(%20c2-calculation expressionn, );printf(%20c3-print resultn, );printf(%20c4-Quitn, );printf(please select 1,2,3,4:);doscanf(%d,&num);while(num4);return(num);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1