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实现。
为了便于说明,我们将运算区分为两侧,上侧显示表达式(即运算过程),下侧是结果框(也用于暂时展示用户输入的数字)。
+
+## 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!");
- }
-}