diff --git a/.classpath b/.classpath deleted file mode 100644 index ac9ce57c2f4d3a99eb1868e101f3060156474663..0000000000000000000000000000000000000000 --- a/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ae3c1726048cd06b9a143e0376ed46dd9b9a8d53..0000000000000000000000000000000000000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..35410cacdc5e87f985c93a96520f5e11a5c822e4 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..07115cdf15dd408d3affb9240e112578e04abf68 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea25cb6475b9409a6cd5868ef50ea0cdc7ce9a84 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000000000000000000000000000000000000..e96534fb27b68192f27f985d3879e173ec77adb8 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index b7e8a74e9dd98bfb5b42b70cd6033510d6823948..0000000000000000000000000000000000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - java2022spring - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index dbc27c5dc60ef7094a88953087ea0294b6c44a38..0000000000000000000000000000000000000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,14 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=17 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..495ec59c596a96006c83019fc3dc902d1358960f --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# 帮助 +欢迎使用本计算器,本计算器为开源项目,全程序基于JAVA实现。
为了便于说明,我们将运算区分为两侧,上侧显示表达式(即运算过程),下侧是结果框(也用于暂时展示用户输入的数字)。 +![表达式框和结果框示意](https://images.gitee.com/uploads/images/2022/0601/201315_6c133c6b_10920581.png "01.png") +## 1. 基础运算功能 +主要包括加减乘除四则运算,支持连续的混合四则运算,但水平有限,在未输入等于的情况下,直接按下下一个运算符会计算上一步的结果并显示(这使得在某些情况下不符合先乘除再加减的连续混合运算规则,实际上是分步隔离计算)。
+不过,Windows 10的标准模式计算器也会有这个问题。
请注意,在进行除法运算时,除数为零将触发错误提示。 +## 2. 其他运算操作 +包括百分号(%)、算术平方根(√)、平方(²)、倒数(1/x)、相反数(±)。
+百分号:会将结果框中的数字转换为百分之几对应的小数(如80→0.08),在输入时,请保证先输入了一个数字,否则将触发提示。
+算数平方根:会将结果框的数字进行开平方根运算,众所周知,负数的算数平方根不存在,因此如果结果框为负数,将触发错误提示。
+平方:会将结果框的数字进行平方运算。
+倒数:会将结果框的数字进行倒数运算,因为0不能作为分母,因此如果结果框是0,将触发错误提示。
+相反数:会将结果框的的数字转换为相反数,但如果结果框为0,则不会发生变化。
+## 3. 功能按键 +包括C、CE、退格键(←)。
+C:按下后将清除所有已输入的数字,清空运算区。
+CE:按下后将清除当前在结果框输入的数。
+退格键:按下后会从结果框开始逐个删除数字、小数点等,删空后,可以继续删除运算符和第一个运算数,在已经按下等于号并且有运算结果时,将跳过第二个运算数,直接删除运算符。
\ No newline at end of file diff --git a/java2022spring.iml b/java2022spring.iml new file mode 100644 index 0000000000000000000000000000000000000000..c90834f2d607afe55e6104d8aa2cdfffb713f688 --- /dev/null +++ b/java2022spring.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/readme.md b/readme.md deleted file mode 100644 index 4af16add33b576d095308a1888db35774618715d..0000000000000000000000000000000000000000 --- a/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -# ѧ -0103 \ No newline at end of file diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..04cb354fbeedf7f5816148d2ceae9b981b5f7887 --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,567 @@ +package java2022spring; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Objects; +import static java.lang.Math.pow; +import static java.lang.Math.sqrt; + +public class Calculator extends JFrame implements ActionListener { + //布局(使用GridBagLayout) + GridBagLayout all = new GridBagLayout(); + GridBagConstraints g = new GridBagConstraints(); + //文本框(用于显示表达式和结果) + JTextField expression = new JTextField(); + JTextField result = new JTextField("0"); + //文本框字符串初始化 + String res = ""; + //菜单选项 + JMenuBar menus = new JMenuBar(); + JMenu menu1 = new JMenu("菜单"); + String[] str_menuItems= {"帮助","关于","退出","清空所有"}; + JMenu menu2=new JMenu("编辑"); + JMenuItem[] menuItems=new JMenuItem[4]; + //按钮 + JButton[] buttons = new JButton[24]; + String[] keys = {"%", "√", "²", "1/x", "CE", "C", "←", "÷", "7", "8", "9", "×", "4", "5", "6", "-", "1", "2", "3", "+", "±", "0", ".", "="}; + //存放操作数,为double型 + double num1; + double num2; + double num3; + int operate;//状态标识 + //操作符标识:0表示无,1表示+,2表示-,3表示×,4表示÷ + int operator; + //创建一个boolean变量,用于多位数输入判断 + boolean mix = true; + //创建font对象,用于调整字体大小 + Font exp_font=new Font("等线",Font.BOLD,24); + Font res_font=new Font("等线",Font.BOLD,40); + Font bt_font=new Font("等线",Font.BOLD,22); + public Calculator(String s, int x, int y, int w, int h) { + //设置窗口大小和位置 + setBounds((x - 500) / 2, (y - 500) / 2, w, h); + setTitle(s); + //布局配置 + setLayout(all); + g.weightx = 0.01; + g.weighty = 0.01; + g.fill = GridBagConstraints.BOTH; + //设置文本框 + g.gridwidth = 4; + g.gridheight = 1; + expression.setEditable(false);//不可编辑 + expression.setHorizontalAlignment(JTextField.RIGHT);//居右 + result.setEditable(false); + result.setHorizontalAlignment(JTextField.RIGHT); + expression.setFont(exp_font); + result.setFont(res_font); + add(expression, g); + g.gridy = 2; + add(result, g); + //添加菜单(及其监听器) + menus.add(menu1); + menus.add(menu2); + setJMenuBar(menus); + for (int i = 0; i < 3; i++) { + menuItems[i]=new JMenuItem(str_menuItems[i]); + menuItems[i].addActionListener(this); + menu1.add(menuItems[i]); + } + menuItems[3]=new JMenuItem(str_menuItems[3]); + menuItems[3].addActionListener(this); + menu2.add(menuItems[3]); + //添加按钮(设置组件宽高均为1) + g.gridwidth = 1; + g.gridheight = 1; + //利用for批量添加按钮 + for (int j = 0; j <= 5; j++) { + g.gridy = j + 3; + for (int k = 0; k <= 3; k++) { + g.gridx = k; + buttons[4 * j + k] = new JButton(keys[4 * j + k]); + buttons[4 * j + k].addActionListener(this);//顺便添加监听器 + buttons[4 * j + k].setFont(bt_font); + all.setConstraints(buttons[4 * j + k], g); + add(buttons[4 * j + k], g); + } + } + } + + @Override + public void actionPerformed(ActionEvent e) { + String str = e.getActionCommand(); + //点击后在文本框显示数字 + if (str.equals("1") || str.equals("2") || str.equals("3") || str.equals("4") || str.equals("5") || str.equals("6") || str.equals("7") || str.equals("8") || str.equals("9") || str.equals("0")) { + res = result.getText(); + if (!mix&&!Objects.equals(res,"0")) {//判断是否为重新输入的数字 + result.setText(res + str);//不是则放在前数的后面 + } + else { + result.setText(str);//是则将数字放入文本框 + mix = false;//并将判断符改为false,后续输入数字都会放置在原文本框的数后面 + } + return; + } + //小数点 + if(str.equals(".")){ + res = result.getText(); + //如果不包含点且结果框不为空,则在后面加上点 + if(!res.contains(".")&&!Objects.equals(res,"")){ + result.setText(res+"."); + mix=false; + } + //如果不包含点且结果框为空,则自动补0并加点 + else if(!res.contains(".")&&Objects.equals(result.getText(),"")){ + result.setText("0"+"."); + mix=false; + } + } + //正负号±,会将结果框的数字变为相反数 + if(str.equals("±")){ + try { + if (!Objects.equals(result.getText(), "0")) { + double change = Double.parseDouble(result.getText()); + change = -change; + result.setText(String.valueOf(change)); + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + //百分号%,用户点击后会将结果框的数字除以100,如果数字为0则无变化 + if(str.equals("%")){ + try { + if (Double.parseDouble(result.getText()) != 0) { + double temp; + temp = Double.parseDouble(result.getText()) / 100; + result.setText(String.valueOf(temp)); + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + //根号 + if(str.equals("√")){ + //结果框为空,提示用户先输入需要进行算数平方根的数 + if(Objects.equals(result.getText(),"")){ + JOptionPane.showMessageDialog(this,"请先输入需要算数平方根的数。","提示",JOptionPane.INFORMATION_MESSAGE); + } + try { + //表达式框为空,则直接将结果框的数进行算数平方根运算 + if (Objects.equals(expression.getText(), "") && Double.parseDouble(result.getText()) > 0) { + num3 = sqrt(Double.parseDouble(result.getText())); + expression.setText("sqrt(" + result.getText() + ")="); + result.setText(String.valueOf(num3)); + } + //表达式不为空 + else if (!Objects.equals(expression.getText(), "") && Double.parseDouble(result.getText()) > 0) { + if(!(expression.getText()).contains("=")){ + //表达式框没有等于号的时候,运算结果框数字的算数平方根 + double temp; + temp = sqrt(Double.parseDouble(result.getText())); + result.setText(String.valueOf(temp));} + else { + //表达式框有等于号的时候,运算结果框的数字的算术平方根并展示 + num3 = sqrt(Double.parseDouble(result.getText())); + expression.setText("√"+result.getText()+"="); + result.setText(String.valueOf(num3)); + } + } + //如果用户键入了负数,则提示负数不能进行平方根 + else if (Double.parseDouble(result.getText()) < 0) { + JOptionPane.showMessageDialog(this, "负数的算数平方根不存在。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE);} + } + //平方(²)的功能 + if(str.equals("²")){ + try { + //表达式框为空,则直接将结果框的数平方并展示 + if (Objects.equals(expression.getText(), "") ) { + num3 = pow(Double.parseDouble(result.getText()), 2); + expression.setText(result.getText()+"²="); + result.setText(String.valueOf(num3)); + } + //表达式不为空 + else if (!Objects.equals(expression.getText(), "") ) { + if(!(expression.getText()).contains("=")){ + //表达式框没有等于号的时候,只将结果框的数字平方 + double temp; + temp = pow(Double.parseDouble(result.getText()),2); + result.setText(String.valueOf(temp));} + else { + //表达式框有等于号的时候,将结果框的数字进行平方并展示 + num3 = pow(Double.parseDouble(result.getText()), 2); + expression.setText(result.getText()+"²="); + result.setText(String.valueOf(num3)); + } + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + //求倒数(功能为将结果框的数变为倒数) + if(str.equals("1/x")) { + //表达式框为空时 + res = result.getText(); + try { + if (Objects.equals(expression.getText(), "")) { + handleReciprocal(); + } + //不为空时 + else { + //已经有运算式了,直接运算结果框数字的倒数并展示 + if (expression.getText().contains("=")) { + handleReciprocal(); + } + //没有运算式,则改变结果框的数字为原来的倒数 + else { + if(Double.parseDouble(res)!=0){ + double temp = 1 / Double.parseDouble(res); + result.setText(String.valueOf(temp)); + } + else { + JOptionPane.showMessageDialog(this, "倒数:分母不能为0!请重新输入。", "数学错误", JOptionPane.ERROR_MESSAGE); + } + } + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + //C和CE功能,菜单的清除所有功能 + if (str.equals("CE")) { + //清空当前输入的数字 + result.setText("0"); + num2 = 0; + mix = true; + } + if (str.equals("C")||e.getSource()==menuItems[3]) { + //清空所有 + expression.setText(""); + result.setText("0"); + num1 = 0; + num2 = 0; + num3 = 0; + operate=0; + operator=0; + mix=true; + } + //backspace退格(可以删除运算符直至恢复至起始状态) + if(str.equals("←")){ + String text=result.getText(); + int i=text.length(); + if(i>0) + { //截取前面的一段字符串返回 + text=text.substring(0,i-1); + result.setText(text); + } + //如果点击时结果框已经被删空了,但表达式框有内容,则删除运算符,结果框显示前一个操作数 + else if(Objects.equals(result.getText(),"")&&!Objects.equals(expression.getText(),"")) + { + operator=0; + operate=0; + result.setText(String.valueOf(num1)); + expression.setText(""); + mix=false; + } + //如果点击后结果框已经被删空了,且表达式框无内容,删除所有操作数,结果框显示0 + if(Objects.equals(result.getText(),"")&&Objects.equals(expression.getText(),"")){ + num1=0; + num2=0; + num3=0; + result.setText("0"); + mix=true; + } + } + //加减乘除表达式的显示和处理多步计算 + if (str.equals("+")) { + mix = true;//保证可以正确输入第二个数(已修复) + try { + //已有其他运算符且没输入第二个数,则只改变操作符 + if(operator!=1&&operate==1&&Objects.equals(result.getText(), "")){ + expression.setText(num1 + "+"); + operator = 1; + } + //已有其他运算符但输入了第二个数,则根据上一个运算符先计算然后再修改运算符 + else if(operator!=1&&operate==1&&!Objects.equals(result.getText(), "")){ + num2 = Double.parseDouble(result.getText()); + result.setText(""); + switch (operator) { + case 2 -> {num3 = sub(num1, num2);num1 = num3;expression.setText(num1 + "+");operator = 1;} + case 3 -> {num3 = multi(num1, num2);num1 = num3;expression.setText(num1 + "+");operator = 1;} + } + //对于上一步的除法需要单独判断,如果除数为零,则清空结果框,不进行除法运算,触发错误对话框并清空结果框 + if(operator==4) { + if(num2!=0){num3 = division(num1, num2);num1 = num3;expression.setText(num1 + "+"); operator = 1;} + else { + JOptionPane.showMessageDialog(this, "除法:除数不能为0!请重新输入。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + } + else if (operate == 0) { + operate = 1; + operator = 1; + num1 = Double.parseDouble(result.getText()); + expression.setText(num1 + "+"); + result.setText(""); + } + else if (operate == 1) { + num2 = Double.parseDouble(result.getText()); + result.setText(""); + num3 = plus(num1, num2); + expression.setText(num3 + "+"); + num1 = num3; + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + if (str.equals("-")) { + mix = true; + try { + if(operator!=2&&operate==1&&Objects.equals(result.getText(), "")) { + expression.setText(num1 + "-"); + operator=2; + } + else if(operator!=2&&operate==1&&!Objects.equals(result.getText(), "")){ + num2 = Double.parseDouble(result.getText()); + result.setText(""); + switch (operator) { + case 1 -> {num3 = plus(num1, num2);num1=num3;expression.setText(num1 + "-");operator = 2;} + case 3 -> {num3 = multi(num1, num2);num1=num3;expression.setText(num1 + "-");operator = 2;} + } + if(operator==4) { + if(num2!=0){num3 = division(num1, num2);num1 = num3;expression.setText(num1 + "-"); operator = 2;} + else { + JOptionPane.showMessageDialog(this, "除法:除数不能为0!请重新输入除数。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + } + else if (operate == 0) { + operator=2; + num1 = Double.parseDouble(result.getText()); + expression.setText(num1 + "-"); + result.setText(""); + operate=1; + } + else if(operate==1) { + num2 = Double.parseDouble(result.getText()); + result.setText(""); + num3 = sub(num1, num2); + expression.setText(num3 + "-"); + num1 = num3; + } + } catch (NumberFormatException exp1) { + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + if (str.equals("×")) { + mix = true; + try { + if(operator!=3&&operate==1&&Objects.equals(result.getText(), "")){ + expression.setText(num1 + "×"); + operator = 3; + } + else if(operator!=3&&operate==1&&!Objects.equals(result.getText(), "")){ + num2 = Double.parseDouble(result.getText()); + result.setText(""); + switch (operator) { + case 1 -> {num3 = plus(num1, num2); num1 = num3;expression.setText(num1 + "×"); operator = 3;} + case 2 -> {num3 = sub(num1, num2);num1 = num3;expression.setText(num1 + "×"); operator = 3;} + } + if(operator==4) { + if(num2!=0){num3 = division(num1, num2);num1 = num3;expression.setText(num1 + "×"); operator = 3;} + else { + JOptionPane.showMessageDialog(this, "除法:除数不能为0!请重新输入除数。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + } + else if (operate == 0) { + operate = 1; + operator = 3; + num1 = Double.parseDouble(result.getText()); + expression.setText(num1 + "×"); + result.setText(""); + } + else if (operate == 1) { + num2 = Double.parseDouble(result.getText()); + result.setText(""); + num3 = multi(num1, num2); + expression.setText(num3 + "×"); + num1 = num3; + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + if (str.equals("÷")) { + mix = true; + try { + if(operator!=4&&operate==1&&Objects.equals(result.getText(), "")){ + expression.setText(num1 + "÷"); + operator = 4; + } + else if(operator!=4&&operate==1&&!Objects.equals(result.getText(), "")){ + num2 = Double.parseDouble(result.getText()); + result.setText(""); + switch (operator) { + case 1 -> num3 = plus(num1, num2); + case 2 -> num3 = sub(num1, num2); + case 3 -> num3 = multi(num1, num2); + } + num1 = num3; + expression.setText(num1 + "÷"); + operator = 4; + } + else if (operate == 0) { + operate = 1; + operator = 4; + num1 = Double.parseDouble(result.getText()); + expression.setText(num1 + "÷"); + result.setText(""); + } + //需要判断除数是否为零 + else if (operate == 1&&Double.parseDouble(result.getText())!=0) { + num2 = Double.parseDouble(result.getText()); + result.setText(""); + num3 = division(num1, num2); + expression.setText(num3 + "÷"); + num1 = num3; + } + //增加除数为零时的提示 + else if (operate == 1&&Double.parseDouble(result.getText())==0) { + JOptionPane.showMessageDialog(this, "除法:除数不能为0!请重新输入除数。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + catch (NumberFormatException exp){ + JOptionPane.showMessageDialog(this,"当你看到这一提示,请保证下方的文本框包含数字。","提示",JOptionPane.INFORMATION_MESSAGE); + } + } + //等于后的操作 + if(str.equals("=")){ + mix=true; + //结果框已输入,且具有运算符,先获取第二个数 + if(!Objects.equals(result.getText(), "")&&operate==1&&!Objects.equals(expression.getText(), "")) + { + num2= Double.parseDouble(result.getText()); + } + //有运算符但没输入第二个数,清空表达式框,将第一个数放回结果框 + if(Objects.equals(result.getText(), "")&&operate==1){ + res=String.valueOf(num1); + expression.setText(""); + result.setText(res); + operator=0; + operate=0; + } + //运算符已经清除,但仍然留有表达式 + if(operator==0&&!Objects.equals(expression.getText(), "")){ + res= String.valueOf(num3); + result.setText(res); + } + //根据运算符判断需要执行的加、减、乘、除 + if(operator==1) { + num3=plus(num1,num2); + expression.setText(num1+"+"+num2+"="); + res= String.valueOf(num3); + result.setText(res); + operate=0; + operator=0; + } + if(operator==2){ + num3=sub(num1,num2); + expression.setText(num1+"-"+num2+"="); + res= String.valueOf(num3); + result.setText(res); + operate=0; + operator=0; + } + if(operator==3){ + num3=multi(num1,num2); + expression.setText(num1+"×"+num2+"="); + res= String.valueOf(num3); + result.setText(res); + operate=0; + operator=0; + } + if(operator==4){ + if(num2!=0) { + num3 = division(num1, num2); + expression.setText(num1 + "÷" + num2 + "="); + res = String.valueOf(num3); + result.setText(res); + operate = 0; + operator = 0; + } + else{ + JOptionPane.showMessageDialog(this, "除法:除数不能为0!请重新输入除数。", "数学错误", JOptionPane.ERROR_MESSAGE); + result.setText("0"); + } + } + } + //菜单1(帮助) + if(e.getSource()==menuItems[0]){ + Help.help(); + } + //菜单2(关于) + if(e.getSource()==menuItems[1]){ + JOptionPane.showMessageDialog(this, "作者:XT Lee\n参考了部分往届同类其他项目,完善了运算功能。\n学号:202125710113\n班级:信息管理与信息系统1班\n版本:v1.2 Release", "关于", JOptionPane.INFORMATION_MESSAGE); + } + //菜单3(退出) + if(e.getSource()==menuItems[2]){ + System.exit(0); + } + } + //处理倒数 + private void handleReciprocal() { + if(Double.parseDouble(res)!=0) + { + double temp = 1 / Double.parseDouble(res); + result.setText(String.valueOf(temp)); + expression.setText("1/" + res); + } + else{ + JOptionPane.showMessageDialog(this, "倒数:分母不能为0!请重新输入。", "数学错误", JOptionPane.ERROR_MESSAGE); + } + } + //加法 + private double plus (double num1, double num2){ + double result; + result = num1 + num2; + return result; + } + //减法 + private double sub (double num1, double num2){ + double result; + result = num1 - num2; + return result; + } + //乘法 + private double multi(double num1,double num2){ + double result; + result = num1 * num2; + return result; + } + //除法 + private double division(double num1,double num2){ + double result; + result = num1 / num2; + return result; + } + +} + diff --git a/src/java2022spring/Help.java b/src/java2022spring/Help.java new file mode 100644 index 0000000000000000000000000000000000000000..4ff76be3abe02bc7b3fc10723160935837058f8d --- /dev/null +++ b/src/java2022spring/Help.java @@ -0,0 +1,42 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; + +public class Help extends JFrame { + public static void help() { + //居中窗口 + Toolkit kit=Toolkit.getDefaultToolkit(); + Dimension ScreenSize=kit.getScreenSize(); + int ScreenWidth=ScreenSize.width; + int ScreenHeight=ScreenSize.height; + JFrame helpWindow=new JFrame("帮助"); + helpWindow.setBounds((ScreenWidth - 500) / 2, (ScreenHeight - 500) / 2, 500, 500); + JTextArea HelpText=new JTextArea(""" + 欢迎使用本计算器,本计算器为开源项目,全程序基于JAVA实现。 + 为了便于说明,我们将运算区分为两侧,上侧显示表达式(即运算过程),下侧是结果框(也用于暂时展示用户输入的数字)。 + 1. 基础运算功能 + 主要包括加减乘除四则运算,支持连续的混合四则运算,但水平有限,在未输入等于的情况下,直接按下下一个运算符会计算上一步的结果并显示(这使得在某些情况下不符合先乘除再加减的连续混合运算规则,实际上是分步隔离计算)。 + 不过,Windows 10的标准模式计算器也会有这个问题。请注意,在进行除法运算时,除数为零将触发错误提示。 + 2. 其他运算操作 + 包括百分号(%)、算术平方根(√)、平方(²)、倒数(1/x)、相反数(±)。 + 百分号:会将结果框中的数字转换为百分之几对应的小数(如80→0.08),在输入时,请保证先输入了一个数字,否则将触发提示。 + 算数平方根:会将结果框的数字进行开平方根运算,众所周知,负数的算数平方根不存在,因此如果结果框为负数,将触发错误提示。 + 平方:会将结果框的数字进行平方运算。 + 倒数:会将结果框的数字进行倒数运算,因为0不能作为分母,因此如果结果框是0,将触发错误提示。 + 相反数:会将结果框的的数字转换为相反数,但如果结果框为0,则不会发生变化。 + 3. 功能按键 + 包括C、CE、退格键(←)。 + C:按下后将清除所有已输入的数字,清空运算区。 + CE:按下后将清除当前在结果框输入的数。 + 退格键:按下后会从结果框开始逐个删除数字、小数点等,删空后,可以继续删除运算符和第一个运算数,在已经按下等于号并且有运算结果时,将跳过第二个运算数,直接删除运算符。"""); + HelpText.setLineWrap(true);//自动换行 + Font help_font=new Font("等线",Font.BOLD,15); + HelpText.setFont(help_font); + JScrollPane Scroll=new JScrollPane(HelpText);//创建具有滚动条的面板 + helpWindow.add(Scroll); + HelpText.setEditable(false); + helpWindow.setVisible(true); + helpWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);//仅关闭窗体,释放窗体资源 + } +} diff --git a/src/java2022spring/MainApp.java b/src/java2022spring/MainApp.java new file mode 100644 index 0000000000000000000000000000000000000000..ab4d9225385a9e6d93ed70546001ccfecbe68c48 --- /dev/null +++ b/src/java2022spring/MainApp.java @@ -0,0 +1,20 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; +public class MainApp { + //程序入口 + public static void main(String[] args) { + //居中窗口 + Toolkit kit=Toolkit.getDefaultToolkit(); + Dimension ScreenSize=kit.getScreenSize(); + int ScreenWidth=ScreenSize.width; + int ScreenHeight=ScreenSize.height; + //传相关参数(窗口标题、居中) + Calculator MainWindow=new Calculator("计算器",ScreenWidth,ScreenHeight,500,500); + MainWindow.setVisible(true); + MainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + MainWindow.setResizable(false); + } + } + diff --git a/src/java2022spring/Test.java b/src/java2022spring/Test.java deleted file mode 100644 index 24deb29bfc0e5f50fdedcd21b504e77b529d48b6..0000000000000000000000000000000000000000 --- a/src/java2022spring/Test.java +++ /dev/null @@ -1,7 +0,0 @@ -package java2022spring; - -public class Test { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -}