2022年4.4简单LISP算术表达式计算器 .pdf
广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 1 简单 LISP 算术表达式计算器一实验目的问题描述 设计一个简单的LISP 算术表达式计算器。简单 LISP 算术表达式 (以下简称表达式 )定义如下:(1)一个 0.9的整数;或者(2)(运算符 表达式 表达式 ) 例如, 6,(+45),(+(+25)8)都是表达式,其值分别为6,9 和 15。基本要求 实现 LISP 加法表达式的求值。测试数据 6,(+45),(+(+25)8),(+2(+58),(+(+(+12)(+34)(+(+56)(+78) 实现提示 写一个递归函数:int Evaluate(FILE*CharFile) 字符文件 CharFile 的每行是一个如上定义的表达式。每读入 CharFile 的一行,求出并返回表达式的值。可以设计以下辅助函数status isNumber(char ReadInChar) ;/视 ReadInChar是否是数字而返回TRUE 或 FALSE。int TurnToInteger(Chat IntChar) /将字符 0.9转换为 0.9。二实验内容程序源代码1、自定义数据类型typedef struct char *cbase; char *ctop; int istacksize; cstack; / 定义字符型结构体typedef struct int *ibase; int *itop; int istacksize; istack; / 定义整数型结构体名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 2 2、基本操作函数#include #include #define stack_init_size 100 #define stackincrement 10 int initstack (cstack &c) c.cbase = new char100; c.ctop = c.cbase; return 0; /初始化int initstack (istack &i) i.ibase = new int100; i.itop = i.ibase; return 0; /初始化int cpush(cstack &c,char ce) *(c.ctop+) = ce; return 0; /压栈int ipush(istack &i,int ie) *(i.itop+) = ie; return 0; /压栈int cpop(cstack &c,char &ce) ce = *(-c.ctop); return 0; /出栈int ipop(istack &i,int &ie) ie = *(-i.itop); return 0; /出栈void getfun();/把输入的字符串附值给数组int lenth=0;/输入的字符串的长度int result=1; static char array100;/定义数组int display()/打印开始屏信息 for(int p=0;p80;p+) cout=; coutendlendl; for(int q=0;q28;q+) cout ; cout 简单 LISP 算术表达式计算器; coutendl; for(int r=0;r26;r+) cout ; coutendlendl; cout 本程序可以对简单的LISP 算术表达式进行求值,; cout 也能对四则运算表达式进行求 ; cout 值。 同时也支持LISP 算术表达式的语法的检查 . 你可以输入形如下面的式子:endl; cout 6 (+36) (*(+36)6) (+5(*(+12)(-34)endl; cout LISP表达式中只能输入 1 ,2, 3,4,5, 6,7,8,9,0 endlendl; for(int s=0;s80;s+) cout=; coutendl; return 0; void getfun() cout 请输入 LISP 表达式 : ; cin.getline(array,100); lenth = strlen(array); if(lenth=0) cout 你没有输入任何数据!endl; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 3 /* 重要的函数,计算LISP 表达式的函数*/ void compute() char ce; int ie1; int ie; cstack c; istack i; initstack (c); initstack (i); lenth = strlen(array);/求数组的长度的函数for(int n=0;nlenth;n+) if(arrayn=) cpop(c,ce); if(i.ibase=i.itop) coutLISP表 达 式 有 误 !endl; break; else ipop(i,ie); ie1=ie; if(i.ibase=i.itop) coutLISP表 达 式 有 误 !47&arrayn58) ie=(int)(int)arrayn-48);/把字符型 0 , 1转化为整数型0,1,2,ipush(i,ie);/弹出栈顶元素 ipop(i,ie);/弹出栈顶元素, 就是最后结果if(i.ibase=i.itop) coutLISP式计算结果为:; for(int m=0; mlenth; m+) coutarraym; cout = ieendl; /* 判断 LISP 语法的函数 */ int jugde() int lp=0; int rp=0; int oprator=0; int number=0; int lenth=0; getfun(); lenth = strlen(array); /* 统计各操作符和数字的个数*/ 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 6 页 - - - - - - - - - 广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 4 for(int top=0;top47&arraytop47&array058) coutLISP表 达 式 结 果 为 : array0endl; else cout 请正确输入LISP, 你没有输入数字 !endl; /判断是不是一个字符,如果是一个数字的话。就直接打出,如果不是的话,说明语法有问题else if(array0!=() cout 您是否忘记了开始的(,请检查 !endl;/判断括号的匹配else if(arraylenth-1!=) cout 您是否忘记了最后的)!rp) cout 您是否忘记了)了! endl;/判断括号的匹配if(lprp) cout 您是否忘记了(了! endl;/判断括号的匹配if(lp=rp&oprator!=lp) cout 您的运算符有问题! endl; if(lp=rp&rp=oprator&rp!=number-1) cout 您的运算数字有问题,请检查!endl; else for (int i=0;ilenth;i+) if(arrayi=() +i; if (arrayi!=+&arrayi!=-&arrayi!=*&arrayi!=/) cout 你的LISP 有问题, 请检查 !endl; else result=0; i-; return 0; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 5 3、主函数代码三实验步骤为实现上述程序功能,应以字符栈和整型栈两个抽象数据类型表示:1.字符栈的抽象数据类型定义为:ADT cstack 数据对象: D=ai| aicstack,i=1,2,.n, n0 基本操作: initstack(cstack &c) 操作结果:分配100个字符栈空间,将首地址赋给c.cbase, 将 c.cbase 赋给 c.ctop 。 Cpush(cstack &c,char ce) 初始条件:字符栈c 存在。操作结果:将字符ce 加入到字符栈 c 中。 Cpop(cstack &c ,char &ce )初始条件:字符栈c 存在。操作结果:将 ce 从字符栈 c 中删除。 ADT cstackt 2.整型栈的抽象数据类型定义为:ADT istack 数据对象: D=ai| ai为 0 到 9 的数字, i=1,2.,n 基本操作:int main() char loop5; display(); do jugde(); if(result=0) compute(); cout 是否计算下一个LISP ? (y/n)endl; cin.getline(loop,5); while(loop0=y|loop0=Y); return 0; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 广东工业大学实验报告自动化学院网络工程专业( 1) 班学号3111001299 姓名刘源彬成绩评定 _ 教师签名许亮实验4.4 题目简单 LISP 算术表达式计算器课程名称数据结构 A 6 initstack(istack &i) 操作结果:分配100个整数空间,将首地址赋给i.ibase,将 iibase赋给 i.itop。 ipush(istack &i,int ie) 初始条件:整型栈i 存在。操作结果:将整数ie 加入到整型栈 i 中。 ipop(istack &i,int &ie)初始条件:整型栈i 存在。操作结果:将 ie 从整型栈 i 中删除。ADT istack 3. 其他int display()/ 打印开始屏幕信息void getfun() /表达式输入四实验的结果及分析。五实验中出现的问题、解决方法和心得体会写完程序的第 1 步, 先不让机器进行检错, 先自己检查,当修改了较多不是粗心导致的问题后,后面要修改的问题就是自己个人水平技术原因导致的错误了。这个算法感觉逻辑性很强,有时候写着写着就乱了,得从头开始看。当程序初步设计出来后,有很多细节上的错误,有的发现不出来,需要找同学帮忙或者查书籍等通过修改错误,也认识到自己的不足,相当一个查缺补漏的过程,跟一个系统分析的过程,逻辑思维过程, 对程序的认识更加深了一步, 以后还是需要多练习写一下程序,多提高一下自己的动手实践能力,以便以后可以更加熟练的写程序。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 6 页 - - - - - - - - -