数据结构课程设计——计算器
一、课程设计内容描述
1.问题描述
在我们的日常生活中,会经常遇到计算比较的数目的问题的时候,这是一个计
算器就由为重要,可提供方便。因此设计一个可实现计算四则混合运算的简单
计算器是必要的。
2.需求分析
计算四则混合运算的简单计算器的基本功能是:
1、输入数学表达式(数字、加、减、乘、除和括号);
2、输出表达式结果;
3.、计算器的仿真界面;
4、对此计算器功能的扩展。
二、实现思想,算法描述
使用语言:JAVA
编译环境:Eclispe SDK 3.0.2
1.概要设计
简单计算器(仿真界面)的实现功能(扩展功能):
1、用户输入表达式,可选择输入方式鼠标点击按键输入/键盘输入;
2、计算四则混合运算表达式,输出结果;
3、实现简单科学计算,如求正弦,余弦,正切,自然对数,常用对数等;
4、实现数制转换,十进制数转换为二进制数,八进制数,十六进制数,二进制
数转换为十进制数,八进制数转化为十六进制数;
5、友好的界面交互,对错误输入的提示,及帮助选项;
6、可获取当前时间。
与用户交互过程大致如图 2.1
程序的大体构架,主要模块如图 2.2
用户
使用鼠标
按键输入
使用键盘
直接输入
数制转化 四 则 混 合 运
算
简 单 科 学 运
算
将中缀表达式
变为后缀表达
式
计算表达式
结果
表达式
显示结果
表 达 式 合
法
提示用户
合法
不合法
图 2.1
图 2.2
2.主要函数设计思想及伪代码
1)函数 calculate(String s)
所用数据结构:堆栈(java.util.Stack)
列表(java.util.ArrayList)
中缀表达式→后缀表达式部分
思想:从左到右依次扫描中缀表达式,每读到一个操作数即把它作为后缀表达
式的一部分输出;设置一个用于存放运算符的堆栈,初始时,栈顶预置
一分界符(例如#),并把分界符也看作运算符;每当读到一个运算符 ,
就将其与栈顶运算符进行优先级比较,以决定扫描运算符是进栈,还是
将栈顶运算符出栈,作为后缀表达式的一部分输出。
伪代码:
{ 表达式 s 追加分界符#和结束符&
类 Calculator extends JFrame
JButton b1…;各功能键
JTextField text;文本显示区
JMenuBar,JMenu,JMenuItem…;菜单栏,菜单
Calculator();构造方法,GUI 设计
actionPerformed (ActionEvent e);响应各 button 及
menuItem
calculate(String str);获得文本区表达式,计算结
果
change(String s, int n); 获得文本区数据,做
十
进制到 n 进制转换
getStr(int a);用于数制转换时,10 到 15 转换为
A 到 F
类 Priority
Char[][] table;存储优
先级表
Priotiry();
getPri (String top,
String cur); 获 取
top 与 cur 的优先
级;
类 WindowDestroyer
Windowclosing()
类 MyKeyListener
keyPressed (KeyEvent)
keyRelessed(KeyEvent)
keyTyped (KeyEvent)
定义游标 i;//扫描位置
j;//操作数起始位置
k;//操作数终止位置+1
Stack <Character> s1;栈顶放分界符#;
while(表达式扫描未结束){
if(该字符是 0-9 或是小数点)
i++;
else if(表达式的第一个字符是-或是该字符为(,后一个字符为-)
输出 0 至 ArrayList<Object> a;
if(该字符是+,-,*,/,)或#){
k=i;
取字符串(j,k)作为操作数输出至 ArrayList<Object> a;;
j=k=i+1;
}
else if(该字符是“)”)
j=k=i+1;
else if(当前扫描到的运算符优先级>栈顶优先级){
运算符入栈;
i++;}
else if(当前扫描到的运算符优先级<栈顶优先级)
栈顶运算符出栈,输出至 ArrayList<Object> a;
else if(当前扫描到的运算符为“)”且栈顶运算符为“(” ){
“(”出栈;
i++;}
else if(当前字符为分界符#)
i++;//结束扫描
else if (当前字符为“)”且栈顶运算符为#
||当前字符为#且栈顶运算符不是#) 抛出异
常;}
}