diff --git a/Calculator.class b/Calculator.class new file mode 100644 index 0000000000000000000000000000000000000000..14c2efad78691875193b67cda9d97b92d8c0047e Binary files /dev/null and b/Calculator.class differ diff --git a/Houzhui.class b/Houzhui.class new file mode 100644 index 0000000000000000000000000000000000000000..b35280cffed5b3641eab0ca55d844917cf0f675a Binary files /dev/null and b/Houzhui.class differ diff --git a/MainWindow.class b/MainWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..e70ba23845d3fc2bb018fb0fd2e2e449bbcf394e Binary files /dev/null and b/MainWindow.class differ diff --git a/Zhongzhui.class b/Zhongzhui.class new file mode 100644 index 0000000000000000000000000000000000000000..7e2d8b6e7a4a4756681b229d13f95045154d1d9a Binary files /dev/null and b/Zhongzhui.class differ diff --git a/src/java2022spring/Calculator.java b/src/java2022spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..194bbaa21c62d934c9ef2ced8ae607da47151363 --- /dev/null +++ b/src/java2022spring/Calculator.java @@ -0,0 +1,311 @@ +package java2022spring; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; +import java.math.*; +public class Calculator extends JFrame implements ActionListener{ + JTextArea text1= new JTextArea("0");//用于放置表达式 + JTextArea text2=new JTextArea();//用于放置结果 + JTextArea text3=new JTextArea(); + JTextArea text4=new JTextArea("0"); + JButton button[]=new JButton[24]; //用于设置按键 + Zhongzhui zz=new Zhongzhui(); + Houzhui hz=new Houzhui(); + public Calculator(String s,int x,int y,int w,int h) { //设置窗口 + init(s); + WindowKey(); + setLocation(x,y); + setSize(w,h); + setVisible(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + void init(String s) {//设置菜单 + setTitle(s); + JMenuBar menubar=new JMenuBar(); //创建菜单条 + JMenu menu1=new JMenu("切换模式"); + JMenu menu2=new JMenu("菜单"); + menubar.add(menu2); + menubar.add(menu1); + setJMenuBar(menubar); //插入菜单条 + } + public void WindowKey() { + JSplitPane p1=new JSplitPane(JSplitPane.VERTICAL_SPLIT,text1,text2);//拆分窗格添加文本框 + JPanel p2=new JPanel(); + text1.setPreferredSize(new Dimension(480,40)); + text2.setPreferredSize(new Dimension(480,40));//设置文本框大小 + text3.setPreferredSize(new Dimension(480,40)); + text2.setEditable(false);//设置文本框不可编辑 + text1.setEditable(false); + text3.setEditable(false); + text4.setEditable(false); + text4.setVisible(false); + this.add(text3,BorderLayout.SOUTH); + this.add(p1,BorderLayout.NORTH); //加入p1 + p2.setLayout(new GridLayout(6,4)); //网格布局 + button[0]=new JButton("1/x"); + button[1]=new JButton("rooting"); + button[2]=new JButton("quadratic"); + button[3]=new JButton("C"); + button[4]=new JButton("×"); + button[5]=new JButton("÷"); + button[6]=new JButton("M"); + button[7]=new JButton("CE"); + button[8]=new JButton("7"); + button[9]=new JButton("8"); + button[10]=new JButton("9"); + button[11]=new JButton("←"); + button[12]=new JButton("4"); + button[13]=new JButton("5"); + button[14]=new JButton("6"); + button[15]=new JButton("+"); + button[16]=new JButton("1"); + button[17]=new JButton("2"); + button[18]=new JButton("3"); + button[19]=new JButton("-"); + button[20]=new JButton("%"); + button[21]=new JButton("0"); + button[22]=new JButton("."); + button[23]=new JButton("="); + for(int i=0;i=0) { + number=Math.sqrt(number); + text1.setText(String.valueOf(number)); + } + else { + text3.setText("数学错误"); + } + } + if(str.equals("quadratic")) { + num=text1.getText(); + number= Double.parseDouble(num); + if(number>=0) { + number=Math.pow(number, 2); + text1.setText(String.valueOf(number)); + } + else { + number=-number; + number=Math.pow(number, 2); + text1.setText(String.valueOf(number)); + } + } + if(str.equals("M")) { + if(text4.getText().equals("0")) { + num=text1.getText(); + text4.setText(num); + } + else { + num=text4.getText(); + text1.setText(num); + text4.setText("0"); + } + } + if(str.equals(".")) { + num=text1.getText(); + char lastc=num.charAt(num.length()-1);//lastc为num的最后一个字符 + String lasts=String.valueOf(lastc); + if(lasts.matches(regex)) { + if(!num.contains(".")) { + text1.setText(num+"."); + } + + else { + text3.setText("请勿重复输入小数点"); + } + } + } + if(str.equals("-")) { + num=text1.getText(); + num2=text2.getText(); + String lasts1; + String lasts2; + if(num.length()>=2) { + char lastc1=num.charAt(num.length()-1); + char lastc2=num.charAt(num.length()-2); + lasts1=String.valueOf(lastc1); + lasts2=String.valueOf(lastc2); + } + else if(num.length()==1) { + char lastc1=num.charAt(num.length()-1); + lasts1=String.valueOf(lastc1); + lasts2="a"; + } + else { + lasts1="a"; + lasts2="a"; + } + if(num.equals("0")) { + text1.setText(str); + } + else if(num.contains("-")) { + text2.setText(num2+"(0"+num+")"+str); + text1.setText("0"); + } + else if(lasts1.matches(regex)) {//最后一个字符为数字 + if(lasts2.matches(regex)) {//倒数第二个字符为数字 + text2.setText(num2+num+str); + text1.setText("0"); + } + else if(lasts2.equals("a")) { + text2.setText(num2+num+str); + text1.setText("0"); + } + else { + text3.setText("数学错误"); + } + } + else { + text1.setText(num+str); + } + } + + if(str.equals("+")||str.equals("×")||str.equals("÷")||str.equals("%")) { + num=text1.getText(); + num2=text2.getText(); + char lastc=num.charAt(num.length()-1);//lastc为num的最后一个字符 + String lasts=String.valueOf(lastc);//强制转换类型为String来匹配正则表达式 + if(num.contains("-")) { + text2.setText(num2+"(0"+num+")"+str); + text1.setText("0"); + } + else if(lasts.matches(regex)) {//判断num末尾是否是数字 + text2.setText(num2+num+str); + text1.setText("0"); + } + else {//num末尾不是数字且按键不为"-"则显示数学错误 + text3.setText("数学错误"); + } + } + if(str.equals("C")) {//设置清零键 + text1.setText("0"); + text2.setText(""); + text3.setText(""); + text4.setText("0"); + } + if(str.equals("←")) { + num=text1.getText(); + char[] c=num.toCharArray();//num转化为字符数组c + String newnum=new String(c,0,c.length-1);//用字符数组c的0~倒数第二个字符创建新的字符串,即按下“←”之后的新字符串 + text1.setText(newnum); + } + if(str.equals("=")) { + num=text1.getText(); + num2=text2.getText(); + if(num.contains("-")) + { + text2.setText(num2+"(0"+num+")"); + } + else text2.setText(num2+num);//表达式下移 + num2=text2.getText(); + + List way=zz.zhongzhui(num2); + + List way2=hz.houzhui(way); + double result2=maths(way2); + text1.setText(String.valueOf(result2)); + } + } + public double maths(List list2) { + Stack stack =new Stack(); + for(int i=0;i houzhui(List list){//转化为后缀表达式 + Stack fuzhan=new Stack<>(); + List list2=new ArrayList<>(); + if(!list.isEmpty()) {//若list不为空 + for(int i=0;i=adv(list.get(i))) {//fuzhan顶端的符号等级大于等于此符号 + list2.add(fuzhan.pop()); + if(!fuzhan.isEmpty()) { + if(adv(fuzhan.peek())>=adv(list.get(i))) { + list2.add(fuzhan.pop()); + fuzhan.push(list.get(i)); + } + } + else + fuzhan.push(list.get(i)); + } + else if(adv(fuzhan.peek())=0) {//用indexof查找第一次出现num的第一个字符的位置,若大于0则为数 + return true; + } + else { + return false; + } + } + public static int adv(String f) {//判断符号级别 + int result=0; + switch(f) { + case"+": + result=1;break; + case"-": + result=1;break; + case"×": + result=2;break; + case"÷": + result=2;break; + case"%": + result=2;break; + } + return result; + } + +} diff --git a/src/java2022spring/MainWindow.java b/src/java2022spring/MainWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..1757d4190b0e4a4aff92287dbfb973bdca4c07e9 --- /dev/null +++ b/src/java2022spring/MainWindow.java @@ -0,0 +1,8 @@ +package java2022spring; +import javax.swing.*; +import java.awt.*; +public class MainWindow { + public static void main(String args[]) { + Calculator win=new Calculator("计算器",600,200,500,500);//设置窗口 + } +} 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!"); - } -} diff --git a/src/java2022spring/Zhongzhui.java b/src/java2022spring/Zhongzhui.java new file mode 100644 index 0000000000000000000000000000000000000000..c8375dea7112a9d42027de5e7c33b506dc119339 --- /dev/null +++ b/src/java2022spring/Zhongzhui.java @@ -0,0 +1,34 @@ +package java2022spring; + +import java.util.ArrayList; +import java.util.List; + +public class Zhongzhui { + //使用堆栈实现混合运算(代码参考cdsn浪漫的硝烟“中缀表达式转化为后缀表达式”) + List zhongzhui(String str){//把字符串转化为中缀表达式 + int index=0; + List list=new ArrayList<>(); + do { + char ch=str.charAt(index); + if("+-×÷%()".indexOf(str.charAt(index))>=0) { + index++; + list.add(ch+""); + } + else if("0123456789".indexOf(str.charAt(index))>=0) { + String str1=""; + while(index=0) { + str1+=str.charAt(index); + index++; + } + list.add(str1); + } + } + while(index