diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b92412c95717973685c8ba307a4e2ebdf45ca549 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../:\kqrGitee\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000000000000000000000000000000000000..0e124206de2d87620445e3c6d129e5de6504af30 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +java2022spring \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..84da703c3b6737ae27e4c89f3e04cb1712cf3a17 --- /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/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/java2022spring.iml b/java2022spring.iml new file mode 100644 index 0000000000000000000000000000000000000000..8e7b6cd32f7565fba6b210ff3a62cf40d1a27086 --- /dev/null +++ b/java2022spring.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..42850d36f270172b39dc96ac3e92c39d9ed7a0fb --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,296 @@ +package java2022spring; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Objects; + +import javax.swing.*; + +//Calculator类,继承JFrame框架,实现事件监听器接口 +public class Calculator extends JFrame implements ActionListener { + private final String[] KEYS = { "7", "8", "9", "AC", "4", "5", "6", "-", "1", "2", "3", "+", "0", "e", "pi", "/", "sqrt", + "%", "x*x", "*", "(", ")", ".", "=" }; + private JButton keys[] = new JButton[KEYS.length]; + private JTextArea resultText = new JTextArea("0.0");// 文本域组件TextArea可容纳多行文本;文本框内容初始值设为0.0 + private JTextArea History = new JTextArea();// 历史记录文本框初始值设为空 + private JPanel jp2=new JPanel(); + private JScrollPane gdt1=new JScrollPane(resultText);//给输入显示屏文本域新建一个垂直滚动滑条 + private JScrollPane gdt2=new JScrollPane(History);//给历史记录文本域新建一个垂直滚动滑条 + // private JScrollPane gdt3=new JScrollPane(History);//给历史记录文本域新建一个水平滚动滑条 + private JLabel label = new JLabel("历史记录"); + private String b = ""; + + // 构造方法 + public Calculator() { + super("Caculator");//“超”关键字,表示调用父类的构造函数,此处参考了网上部分代码 + resultText.setBounds(20, 18, 255, 115);// 设置文本框大小 + resultText.setAlignmentX(RIGHT_ALIGNMENT);// 文本框内容右对齐 + resultText.setEditable(false);// 文本框不允许修改结果 + History.setBounds(290, 40, 250,370);// 设置文本框大小 + History.setAlignmentX(LEFT_ALIGNMENT);// 文本框内容右对齐 + History.setEditable(false);// 文本框不允许修改结果 + label.setBounds(300, 15, 100, 20);//设置标签位置及大小 + jp2.setBounds(290,40,250,370);//设置面板窗口位置及大小 + jp2.setLayout(new GridLayout()); + JPanel jp1 = new JPanel(); + jp1.setBounds(20,18,255,115);//设置面板窗口位置及大小 + jp1.setLayout(new GridLayout()); + resultText.setLineWrap(true);// 激活自动换行功能 + resultText.setWrapStyleWord(true);// 激活断行不断字功能 + resultText.setSelectedTextColor(Color.RED); + History.setLineWrap(true);//自动换行 + History.setWrapStyleWord(true); + History.setSelectedTextColor(Color.blue); + gdt1.setViewportView(resultText);//使滚动条显示出来 + gdt2.setViewportView(History); + gdt1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//设置让垂直滚动条一直显示 + gdt2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//设置让垂直滚动条一直显示 + gdt2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//设置让水平滚动条一直显示 + jp1.add(gdt1);//将滚动条添加入面板窗口中 + jp2.add(gdt2); + this.add(jp1);//将面板添加到总窗体中 + this.add(jp2);//将面板添加到总窗体中 + this.setLayout(null); + this.add(label);// 新建“历史记录”标签 + + + // 放置按钮 + int x = 20, y = 150; + for (int i = 0; i < KEYS.length; i++) + { + keys[i] = new JButton(); + keys[i].setText(KEYS[i]); + keys[i].setBounds(x, y, 60, 40); + if (x < 215) { + x += 65; + } else { + x = 20; + y += 45; + } + this.add(keys[i]); + } + for (int i = 0; i < KEYS.length; i++)// 每个按钮都注册事件监听器 + { + keys[i].addActionListener(this); + } + this.setResizable(false); + this.setBounds(500, 200, 567, 480); + this.setDefaultCloseOperation(EXIT_ON_CLOSE); + this.setVisible(true); + } + + // 事件处理 + public void actionPerformed(ActionEvent e) + { + //History.setText(b);//使输入的表达式显示在历史记录文本框中 + String label=e.getActionCommand();//获得事件源的标签 + if(Objects.equals(label, "="))// + { + resultText.setText(this.b); + History.setText(History.getText()+resultText.getText()); + if(label.equals("="))//调用计算方法,得出最终结果 + { + String[] s =houzhui(this.b); + String result=Result(s); + this.b=result+""; + //更新文本框,当前结果在字符串b中,并未删除,下一次输入接着此结果以实现连续运算 + resultText.setText(this.b); + History.setText(History.getText()+"="+resultText.getText()+"\n"); + } + } + else if(Objects.equals(label, "AC"))//清空按钮,消除显示屏文本框前面所有的输入和结果 + { + this.b=""; + resultText.setText("0");//更新文本域的显示,显示初始值; + } + else if(Objects.equals(label, "sqrt")) + { + String n=kfys(this.b); + resultText.setText("sqrt"+"("+this.b+")"+"="+n);//使运算表达式显示在输入界面 + History.setText(History.getText()+"sqrt"+"("+this.b+")"+"=");//获取输入界面的运算表达式并使其显示在历史记录文本框 + this.b=n; + } + else if(Objects.equals(label, "x*x")) + { + String m=pfys(this.b); + resultText.setText(this.b+"^2"+"="+m);//使运算表达式显示在输入界面 + History.setText(History.getText()+this.b+"^2"+"=");//获取输入界面的运算表达式并使其显示在历史记录文本框 + this.b=m; + } + else if(Objects.equals(label, "e") || Objects.equals(label, "pi")) + { + if(label.equals("e")) + { + String m=String.valueOf(2.71828);//将e的值以字符串的形式传给m + this.b=this.b+m;//保留显示m之前输入的运算符或数字字符继续下一步运算 + resultText.setText(this.b); + // History.setText(History.getText()+this.b); + } + if(label.equals("pi")) + { + String m=String.valueOf(3.14159265); + this.b=this.b+m; + resultText.setText(this.b); + // History.setText(History.getText()+this.b); + } + } + else + { + this.b=this.b+label; + resultText.setText(this.b); + // History.setText(History.getText()+this.b); + + + } + //History.setText(History.getText()+this.b);//使输入的表达式显示在历史记录文本框中 + } + + private String[] houzhui(String str) { + String s = ""; + char[] opStack = new char[100]; + String[] postQueue = new String[100]; + int top = -1, j = 0; + for (int i = 0; i < str.length(); i++) + // indexof函数,返回字串首次出现的位置;charAt函数返回index位置处的字符; + { + if ("0123456789.".indexOf(str.charAt(i)) >= 0) + { + s = "";// 作为承接字符,每次开始时都要清空 + for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) { + s = s + str.charAt(i); + + } + i--; + postQueue[j] = s;// 数字字符直接加入后缀表达式 + j++; + } + else if ("(".indexOf(str.charAt(i)) >= 0) {// 遇到左括号 + top++; + opStack[top] = str.charAt(i); + } + else if (")".indexOf(str.charAt(i)) >= 0) {// 遇到右括号 + for (;;) + { + if (opStack[top] != '(') { + postQueue[j] = opStack[top] + ""; + j++; + top--; + } else { + top--; + break;// 循环结束 + } + } + } + else if ("*%/+-".indexOf(str.charAt(i)) >= 0)// 遇到运算符 + { + if (top == -1) + { + top++; + opStack[top] = str.charAt(i); + } + else if ("*%/".indexOf(opStack[top]) >= 0) + { + postQueue[j] = opStack[top] + ""; + j++; + opStack[top] = str.charAt(i); + } + else + { + top++; + opStack[top] = str.charAt(i); + } + } + } + while (top != -1) { + postQueue[j] = opStack[top] + ""; + j++; + top--; + } + return postQueue; + } + + //开方运算方法 + public String kfys(String str) { + String result = ""; + double a = Double.parseDouble(str), b = 0; + b = Math.sqrt(a); + result = String.valueOf(b);//将运算结果转换为string类型并赋给类型为string的变量result + return result; + } + + //平方运算方法 + public String pfys(String str) { + String result = ""; + double a = Double.parseDouble(str), b = 0; + b = Math.pow(a, 2); + result = String.valueOf(b); + return result; + } + + // 计算后缀表达式,并返回最终结果 + public String Result(String[] str) { + String[] Result = new String[100];// 数据类型为字符串 + int Top = -1; + for (int i = 0; str[i] != null; i++) { + if ("+-*%/".indexOf(str[i]) < 0) { + Top++; + Result[Top] = str[i]; + } + if ("+-*%/".indexOf(str[i]) >= 0) + { + double x, y, n; + x = Double.parseDouble(Result[Top]); + Top--; + y = Double.parseDouble(Result[Top]); + Top--; + if ("*".indexOf(str[i]) >= 0) { + n = y * x; + Top++; + Result[Top] = String.valueOf(n); + + } + if ("/".indexOf(str[i]) >= 0) + { + if (x == 0)// 被除数不允许为0,避免产生运算错误 + { + String s = "error!"; + return s; + } else { + n = y / x; + Top++; + Result[Top] = String.valueOf(n); + } + } + if ("%".indexOf(str[i]) >= 0) + { + if (x == 0)// 被除数不允许为0,同上 + { + String s = "error!"; + return s; + } else { + n = y % x; + Top++; + Result[Top] = String.valueOf(n); + } + } + if ("-".indexOf(str[i]) >= 0) { + n = y - x; + Top++; + Result[Top] = String.valueOf(n); + } + if ("+".indexOf(str[i]) >= 0) { + n = y + x; + Top++; + Result[Top] = String.valueOf(n); + } + } + } + return Result[Top];// 返回最终结果 + } + + // Main函数 + public static void main(String[] args) { + Calculator a = new Calculator(); + } +} + diff --git a/src/java2022spring/Test.java b/src/java2022spring/Happy.java similarity index 52% rename from src/java2022spring/Test.java rename to src/java2022spring/Happy.java index 24deb29bfc0e5f50fdedcd21b504e77b529d48b6..722c4a738b5d748ac80a153bfa080007da027a0b 100644 --- a/src/java2022spring/Test.java +++ b/src/java2022spring/Happy.java @@ -1,7 +1,7 @@ -package java2022spring; - -public class Test { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} +package java2022spring; + +public class Happy{ + public static void main(String[] args) { + System.out.println("kqr"); + } +}