1、数据结构课程设计报告计算机科学与信息工程学院数据结构课程设计设计题目:简单计算器 专 业 计算机软件 班 级 计软2班 小组成员 蔡松佐 陈吉院 王希 刘军 符锦柏 曾祖滨 刘一霖 指导教师 张显全 2010 年 12 月 25 日数据结构分工情况组长:蔡松佐组员:曾祖滨、陈吉院、符锦柏、刘军、刘一霖、王希王希:负责设计程序的整体框架(定义数据结构,编写主函数)评分:90分符锦柏:负责编写栈的代码评分:95分蔡松佐:负责编写计算算术表达式的代码评分:95分陈吉院:负责编写比较符号优先级的代码评分:90分曾祖滨:负责将所有代码整合成一个完整的程序评分:88分刘军:负责写实验报告评分:90分刘一霖
2、:负责测试程序,看其是否具有良好的健壮性评分:88分简单计算器一 基本功能描述 简单的计算器的功能是对基本的加、减、乘、除、四则运算,可对输入的操作数,包括整数,小数等进行运算。二 设计思路 本程序主要是采用栈的理论知识,主要用到两个结构体栈,一个用来转化表达式,一个用来计算表达式。区别就在于一个存储字符,一个存储浮点。首先,用一个字符数组来存储用户输入的中缀表达式。然后用栈来把这个表达式转化为后缀表达式,转化时要进行符号优先级比较,这里将*/的优先级定为2,+-定为1,括号和=定为0。具体思想如下:例如用户输入了1+2*3=,将其存放入一个字符数组中。先在栈的底部存放一个=号符,用作符号优先
3、级比较。首先将1存放到另外一个字符数组s1中,再将+号入栈。入栈的同时与底部的=比较优先级,+的优先级高于=,所以不出栈,之后将2存放入s2中,然后再将*入栈,入栈的同时与+比较符号优先级,*比+高,所以不出栈。再将3存入s2中。之后将栈中不是=的运算符都弹出栈,并依次存入s2中。所以s2中的表达式为123*+。之后进行计算,计算时用到浮点栈。首先将s2中的字符依次入栈,遇到运算符时进行计算。所以将123入栈后,再将*入栈的同时,将前面两个数字进行运算,算出结果为6并存入栈中,之后再将+入栈,再与1进行运算,结果即为7,然后输出结果。三 概要设计1,子函数功能struct Stack用来转化表
4、达式的机构体栈。Struct FStack用来计算表达式的结构体栈void InitStack(Stack &s)初始化结构体栈void InitFStack(FStack &s)初始化结构体栈char GetTop(Stack s)获取栈顶数据void IncrementStackSize(Stack &s)为栈扩充ncrementsize个存储空间void IncrementFStackSize(FStack &s)为栈扩充ncrementsize个存储空间void Push(Stack &s,char e)第一个栈入栈操作void PushF(FStack &s,float e)第二个栈
5、入栈操作bool Empty(Stack s)判断第一个栈是否为空。bool EmptyF(FStack s)判断第二个栈是否空char Pop(Stack &s)表达式出栈float PopF(FStack &s)计算的数据出栈int Precede(char op)确定优先级的函数void Change(char *s1,char *s2)改变两个字符串的储存位置float Compute(char *s2)实现数据的运算2 函数的调用 3 测试数据及测试结果(1)测试 1+2+3=6(2) 测试2*4=8(3)测试 3/2=1.5(4)测试(1+2)*3=9四 程序代码 #include
6、 #include #include #include #include #include struct Stack /转换表达式 char *elem; int top; int stacksize; int incrementsize;struct FStack /计算 float *elem; int top; int stacksize; int incrementsize;void InitStack(Stack &s) s.elem=new char100; s.top=-1; s.stacksize=100; s.incrementsize=10;void InitFStack(
7、FStack &s) s.elem=new float100; s.top=-1; s.stacksize=100; s.incrementsize=10;char GetTop(Stack s) return s.elems.top;void IncrementStackSize(Stack &s) char *a=new chars.stacksize+s.incrementsize; for(int i=0;i=s.top;i+) ai=s.elemi; delete s.elem; s.elem=a; s.stacksize+=s.incrementsize;void Incremen
8、tFStackSize(FStack &s) float *a=new floats.stacksize+s.incrementsize; for(int i=0;i Precede(ch) /优先级()函数返回运算符形参的优先级 s2j+ = w; Pop(R); w = GetTop(R); Push(R,ch); ch = s1+i; else /此处为数字或小数点字符的处理 while (isdigit(ch) | ch = .) s2j+ = ch; ch = s1+i; s2j+ = ; /被转换后的每个数值后放一个空格 /- ch = Pop(R); while (ch != =
9、) s2j+ = ch; ch = Pop(R); s2j+ = =; /加入字符串结束符 s2j+ = 0;float Compute(char *s2) FStack S; /用S栈存储操作数和中间计算结果 InitFStack(S); istrstream ins(s2); /把s2定义为输入字符串流对象ins char ch; /用于输入字符 float x; /用于输入浮点数 insch; while (ch != =) switch (ch) case +: x = PopF(S) + PopF(S); break; case -: x = PopF(S); x = PopF(S)
10、 - x; break; case *: x = PopF(S) * PopF(S); break; case /: x = PopF(S); x = PopF(S) / x; break; default: ins.putback(ch); insx; PushF(S,x); insch; if (!EmptyF(S) x = PopF(S); if (EmptyF(S) /如果栈中只有一个值那一定是结果 return x; void main()/主程序 FStack s; char a10; float b,c; char str150,str250; /暂时存储表达式 char j=y
11、; cout *欢迎使用本计算器*endlendl;haha: while(j=Y|j=y) int i=0,m=0,n=0,k=0,l=0,q=0,p=0; cout 请输入一个以=字符结束的中缀算术表达式:endlendl; cin.getline(str1,sizeof(str1); while(str1i!=0) i+; if(str1i-1!=) cout表达式错误.请重新输入.endlendl; goto haha; i=0; while(str1i!=0) if(str1i=0&str1i-1=/) cout表达式错误.请重新输入.endlendl; goto haha; i+;
12、 i=0; while(str1i!=0) if(str1i=() m+; if(str1i=) n+; if(str1i=) k+; if(str1i=) l+; if(str1i=) q+; if(str1i=) p+; i+; if(m!=n | k!=l | q!=p) cout表达式错误.请重新输入.endlendl; goto haha; Change(str1,str2); /处理结果 coutn求值结果为: str1Compute(str2)endl; cout是否继续 :(Y/N)j; cin.getline(str1,2); coutendl *感谢使用本计算器*endl;
13、五 课程设计总结1 收获 通过这次课程设计,更进一步了解了栈的原理和应用,同时也锻炼了数据结构在实际中的熟练运用。2 心得体会 在这次数据结构设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题要不断地更正以前的错误思维。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名计科专业的学生,这次课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着学习,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。