数据结构课程设计报告设计题目:算术表达式院系:经济管理学院专业班级:电子商务2010-1学生姓名:孙建、王斌、王文崇指导教师:周长虹2012年7月6日指导教师评语指导教师:年月日成绩评定学号姓名任务分工成绩1001060317孙建搜集资料,撰写报告目录1.设计内容.........................................................................................11.1问题描述....................................................................................................11.2设计要求....................................................................................................11.3开发环境....................................................................................................11.4研究思路....................................................................................................12.设计步骤.........................................................................................12.1需求分析....................................................................................................12.2概要设计....................................................................................................22.3详细设计....................................................................................................42.4调试分析..................................................................................................152.5测试结果..................................................................................................163.设计成果展示...............................................................................193.1用户手册..................................................................................................193.2程序运行部分截图..................................................................................194.总结与心得体会...........................................................................21附录................................................................................................24×××××××××××××××××××××11.设计内容1.1问题描述问题描述:当用户输入一个合法的算术表达式后,能够返回正确的结果。能够计算的运算符包括:加、减、乘、除、括号;能够计算的操作数要求在是属于范围内;对于一场表达式能够给出错误提示。1.2设计要求要求:(1)从键盘输入一个表达式;(2)支持运算符的优先级;(3)支持括号的嵌套;(4)支持小数点及其负数;(5)有差错功能,如非法字符,小数点过多(3.44.3),括号不匹配等错误。1.3开发环境C-free5.01.4研究思路当用户输入一个算法表达式,程序在只将表达式扫描一遍的条件下,运用一个能提取出一个数据项和一个符号项的函数,通过循环调用这个函数,并利用栈操作函数,实现对表达式的计算.对括号匹配的处理是用一个计数器变量,出现左括号加1,出现右括号减1,值为0说明括号匹配.2.设计步骤2.1需求分析该程序的主要任务是,当用户输入一个算术表达式的时,该程序能计算出输入表达式的结果;如果输入的表达式有误(字符错误和逻辑错误),该程序能输出算术表达式的具体错误形式。难点在于运算符、括号与数字的出×××××××××××××××××××××2入栈操作。输入形式:由用户输入一个用户认为合法并且合乎逻辑的算术表达式(输入的算数表达式并不一定正确)。输出形式:1、用户输入的算数表达式合法且合乎逻辑,则在用户界面上输出该算数表达式的结果;2、用户输入的算术表达式有语法错误或者不合乎逻辑,则在用户界面上输出算术表达式出错及其具体错误。该程序所能达到的功能为:在用户输入一个合法且误逻辑语法错误的算术表达式时,能给出相应的算术表达式计算结果;在输入的表达式有误时,能给出具体的错误类型,以方便修改。2.2概要设计(1)根据设计思路,首先是对整个程序中变量的定义,其中大致包括:#defineMAX_DATA_BIT100#defineYES1#defineNO0#definePOINT_UNEXIST-15#defineMAXSIZE100(2)对内容的设计,其中各主要过程的函数包括函数getexp这个函数的原型是:intgetexp(double*data,char*);它能够提取出表达式中的数据项和符号项,对这个函数的调用,至少能提取出一个符号项,根据提取的项不同,其返回值从1到8有个;返回负数表示在提取的过程中有错误;对负数的处理是;除了第一项的负数外,其它的负数必须用括号括起来;函数PopData,PushData,PopOprt,PushOprt这四个函数分别实现数据入栈\出栈,操作符入栈\出栈;函数calculat原型是:intcalculat(doubledata1,charoprt,doubledata2);能对两个数据根据oprt进行计算,计算出现错误返回负数,否则返回正数;函数checkgram原型是:intcheckgram(intfsitua,intlsitua);配合getexp的返回值使用,对表达式进行语法检查;×××××××××××××××××××××3函数priority原型是:intpriority(charcal1,charcal2);比较操作符的优先级,为了保持一致性,把'\0'和括号也看作操作符;函数char_to_double原型:doublechar_to_double(charDigitString[],intmarkpot,intmarkend);将字符串转变成双精度数;函数main主函数:(1)调用函数clear()清空栈;(2)调用函数getxp()提取字符;(3)调用函数checkgram()判断字符是否合法;(4)调用函数priority()判断运算符的优先级;(5)调用函数calculat()计算算术表达式;(6)如果以上均未出现错误,输出算术表达式的计算结果;如果任意一步出现错误,调用函数error()输出错误类型。×××××××××××××××××××××42.3详细设计对子函数进行声明部分:intis_calchar(charc);//标识运算符,不包括括号intis_space(charc);//标识空白字符,不包括换行符intis_FIRST_allow(charc);//标识表达式第一个合法字符intis_allowed(charc);//标识表达式的合法字符doublechar_to_double(charDigitString[],intmarkpot,intmarkend);//函数,将字符串转换成双精度数intget_exp(double*data,char*oprt);//得到表达式的项,并检查字符是否合法typedefstruct{charoprt_stack[MAXSIZE];doubledata_stack[MAXSIZE];charoprt_in,oprt_out,*oprt_curp;doubledata_in,data_out,*data_curp;}stack;//关于堆栈的相关操作及声明intPopData(stack*p);//数字的入栈intPushData(stack*p);//数字的出栈intPopOprt(stack*p);//操作符的入栈intPushOprt(stack*p);//操作符的出栈voidclear(stack*p);//清空栈intcheck_grammer(intfsitua,intlsitua);//语法检查函数,返回2表示表达式结束×××××××××××××××××××××5intpriority(charcal1,charcal2);//功能函数,比较两个运算符的优先级voiderror(intstate);//错误处理函数,丢弃出错后所有字符,并打印出错信息intcalculat(doubledata1,charoprt,doubledata2,double*result);//计算函数,有发现简单逻辑错误的功能stackSTK;//创建堆栈;对整个程序的编写,是从一个子函数isoprt()的编写开始的。★intisoprt(charc)//判断是不是运算符{if(c=='+'||c=='-'||c=='*'||c=='/')return1;elsereturn0;}//如果是+、-、*、/四种运算符则返回真值,如果不是则返回假值。★intis_space(charc)//判断是不是空格;{if(c==''||c=='\t'||c=='\v')return1;elsereturn0;}//如果是空格,则返回真值,如果不是,则返回假值。★intis_FIRST_allow(charc)//判断表达式开头是否合法;{if(c=='.'||c=='-'||c=='('||isdigit(c))return1;×××××××××××××××××××××6elsereturn0;}//如果开头是数字、小数点、负号、左括号则返回真值,否则返回假值。★intis_allowed(charc)//判断字符是否合法;{if(c=='.'||isoprt(c)||c=='('||isdigit(c)||c==')')return1;elsereturn0;}//如果是运算符或者小数点、左右括号、负号、数字则返回真值,否则返回假值。★doublechar_to_double(chardata[],intmarkpot,intmarkend)//单精度转换为双精度;{inti;doublesumz=0,sumf=0;if(data[0]!='-'){for(i=0;imarkpot;++i)sumz=sumz*10+(data[i]-'0');for(i=markend-1;imarkpot;--i)s