Java实现简易计算器
2020.6.11完成
1 内容提要
- 《Java程序设计基础》这门课程是数据科学与大数据技术专业的重要的专业实践课。Java期末大作业通过实践环节可以巩固所学的理论知识、提高程序设计能力。
- Java期末大作业需要综合应用Java基础知识和基础方法,编写出高效率的应用程序,体会软件设计全过程,提高软件设计能力,为今后进行系统软件和应用软件的开发研究打下坚实的基础,培养刻苦专研和严谨的编程精神,为今后从事项目开发和撰写毕业论文积累经验。
- 本项目选择题目类型中得一类型,介绍了本人完成简单的计算机程序这一基于Java语言项目的主要思路以及相关的源代码。完成Java语言项目制作的目的是增强我们对Java语言程序相关内容的熟练掌握,也为了加强同学们的动手实践能力,增加对使用程序解决实际问题的分析能力,以及加深Java语言的基本知识内容的进一步理解。
2 项目设计内容
本次项目要求设计一个程序,能够在图形界面,实现计算器加、减、乘、除等运算。
基本要求:
- 图形计算器界面
- 在图形界面中,实现加、减、乘、除等运算
- 通过点击计算器按键,将运算显示在图形界面
- 等于号得出结果,C清除运算
满足基本要求,本人在该项目中附加额外功能设计,运算增加求幂次方、开根、求阶乘、百分号运算,并进行异常处理。
3 整体流程
4 本设计所使用的Java基础知识
- 所用组件及事件处理:JFrame容器,面板组件JPanel,本文JTextField,按钮JButtion()
- 事件监听:button.addActionListener按钮的事件监听
5 功能模块详细设计
5.1 图形用户界面绘制
- 图形用户界面绘制:使用JFrame()创建一个500X400尺寸窗口,窗口标题是Calculator,在该窗体中,添加了1个长30的文本框,20个按钮,分别是"","!","(1/2)","/",“7”,“8”,“9”,"*",“4”,“5”,“6”,"-",“1”,“2”,“3”,"+","%",“0”,“C”,"=",五行4列按钮间距15,文本框用于显示输入运算公式和显示运算结果且文本内容靠右,按钮用于输入数字和运算符,界面如图5.1所示:
- 在5.1中在界面文本框中,通过点击按钮可在文本框显示,该内容是字符串格式,点击”=”按钮后,文本内容将进行运算得出结果,点击”C”按钮后,文本内容清除,重新进行运算。如图5.2运算图所示:
public class MyCalculator extends JFrame{
private JTextField textField;
private String input;
private String operator;
public MyCalculator() {
input = "";
operator = "";
JPanel panel = new JPanel();
textField = new JTextField(30);
textField.setEditable(false);
textField.setHorizontalAlignment(JTextField.RIGHT);
textField.setPreferredSize(new Dimension(200,80));
this.add(textField, BorderLayout.NORTH);
String[] name= {"^","!","^(1/2)","/","7","8","9","*","4","5","6","-","1","2","3","+","%","0","C","="};
panel.setLayout(new GridLayout(5,4,15,15));
for(int i=0;i<name.length;i++) {
JButton button = new JButton(name[i]);
button.addActionListener(new MyActionListener());
panel.add(button);
}
this.add(panel,BorderLayout.CENTER);
}
}
5.2 按钮处理
- 内部类实现按钮响应,获取按钮上的字符串,进行判断,如果字符串是"","!","(1/2)","/","*","-","+","%",将数字和运算符号组合成字符串input通过空格将数字和运算符号隔开,如果按钮上字符串为"C"时,input为空清零,如果按钮上字符串为”=”时,出现异常抛出异常,当cnt=1进行计算。
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
int cnt=0;
String actionCommand = e.getActionCommand();
if(actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*")
|| actionCommand.equals("/") || actionCommand.equals("^") || actionCommand.equals("!")
|| actionCommand.equals("%") || actionCommand.equals("^(1/2)")) {
input += " " + actionCommand + " ";
}
else if(actionCommand.equals("C")) {
input = "";
}
else if(actionCommand.equals("=")) {
try {
input+= "="+calculate(input);
}
catch (MyException e1) {
if(e1.getMessage().equals("被除数不能为0"))
input = e1.getMessage();
else
input = e1.getMessage();
}
textField.setText(input);
input="";
cnt = 1;
}
else
input += actionCommand;
if(cnt == 0)
textField.setText(input);
}
}
5.3 运算处理
- 运算有+ - * / ! % ^ sqrt分为三层,通过" “将数字与运算符分开,同理,通过” "也可以将整个运算字符串切分成字符型数组comput和count,第一层为! % ^ sqrt,如果count字符数组中存在! % ^ sqrt则与count[k-1](k为字符数组中出现某字符的索引)进行运算并更新count字符数组;第二层为+ - * /,用到了栈,count字符数组中存在+ -,则count[i+1](或者 -count[i+1])进栈,count字符数组中存在* /,则栈顶元素出栈与count[i+1]进行运算完进栈;第三层,将栈中元素求和即为运算结果。
5.4 主函数
- 主函数先创建一个窗口,并设置窗口标题,设定关闭窗口。
public static void main(String[] args) {
JFrame f = new MyCalculator();
f.setTitle("Calculator");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBounds(400, 200, 500, 400);
f.setVisible(true);
}
6 收获与感想
- 在编写此次课程设计时,复习了Java的基础内容和GUI编程,学习了栈的使用。
- 借助栈来完成表达式的计算,将字符串分割成字符串数组,由中缀的定义知数组奇数位为运算符(从第0位开始),偶数位为操作数,因此可将偶数为操作数进栈,遇见+(-)运算符,则将下一个数以正(负)的形式压人栈中,遇见*(/)运算符,则将栈顶元素出栈与数组后一元素进行计算,并将其结果重新压入栈中,直至遍历至数组最后一个元素。
- 还遇到一点小问题,用" “分割字符串数组,原本代码是String[] count = input.split(” “);在遇到 25%^(1/2)时遇到了问题,因为两个运算符挨着,中间多了一个” “,而 String[] count = input.split(”\s+");解决了这个问题。String的split方法支持正则表达式;正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次。
如有疑问请联系(私信或者vx15935848048)