diff --git "a/src/\350\256\241\347\256\227\345\231\250/CalculatorFrame.java" "b/src/\350\256\241\347\256\227\345\231\250/CalculatorFrame.java" new file mode 100644 index 0000000000000000000000000000000000000000..4b6749bfc85d8bb586d676c4cc17df2ee89ef19a --- /dev/null +++ "b/src/\350\256\241\347\256\227\345\231\250/CalculatorFrame.java" @@ -0,0 +1,315 @@ +package 计算器; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.*; +import javax.swing.*; +public class CalculatorFrame extends JFrame implements ActionListener{ + JTextArea text=new JTextArea("",5,30);//输入框 + JTextArea text1=new JTextArea("",5,30);//显示框 + String num1="";//运算数1 + String num2="";//运算数2 + String ope="";//运算符 + String num3=""; + String result="";//结果 +double n,m,r,flag=0;; + + public CalculatorFrame() { + JPanel p0, p1,p2,p3,p4; + p1=new JPanel(); //放置文本框的面板 + p1.setLayout(new BorderLayout()); + p1.setBackground(new Color(250,255,240)); + JFrame window=new JFrame("科学计算器"); + Container con=window.getContentPane(); + window.setVisible(true); + window.setBounds(500,100,400,500); + window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + window.setLayout(new BorderLayout()); + window.add(p1,BorderLayout.NORTH); + p1.add(text,BorderLayout.CENTER); + p1.add(text1,BorderLayout.NORTH); + text.setBounds(500, 500, 400, 5); + text.setBackground(new Color(250,255,240)); + text1.setBounds(500, 100, 400, 10); + text1.setBackground(new Color(250,255,240)); + + p0=new JPanel();//主面板 + p2=new JPanel();//中部按钮面板 + p3=new JPanel();//北部按钮的面板 + p4=new JPanel();//西部按钮的面板 + p0.setLayout(new BorderLayout()); + p0.setBackground(new Color(240, 255, 240)); + p2.setLayout( new GridLayout(5,4)); + p3.setLayout( new GridLayout(3,4)); + p4.setLayout( new GridLayout(5,1)); + window.add(p0,BorderLayout.CENTER); + p0.add(p3,BorderLayout.NORTH ); + p0.add(p2,BorderLayout.CENTER ); + p0.add(p4,BorderLayout.WEST); + String btn_text="%÷C⇐789×456-123+e0.="; + String north[]= {"change","sin","cos","tan","x²","xⁿ","lg","ln","±"}; + String west[]= {"³√x","√x","x!","¹/x","Π"}; + p2.setBackground(new Color(240, 255, 240)); + for(int i=0;i<20;i++) { + String temp=btn_text.substring(i,i+1); + JButton btn=new JButton(); + p2.add(btn); + btn.setText(temp); + btn.addActionListener(this); + btn.setSize(1,1); + btn.setBackground(new Color(250,255,240)); + btn.setFont(new Font("宋体",Font.BOLD,20)); + if(temp.equals("=")||temp.equals("C")||temp.equals("⇐")) + btn.setFont(new Font("粗体",Font.BOLD,20)); + } + for(int i=0;i<9;i++) { + JButton btn=new JButton(north[i]); + p3.add(btn); + btn.setSize(3,2); + btn.addActionListener(this); + btn.setFont(new Font("宋体",Font.BOLD,15)); + btn.setBackground(new Color(250,255,240)); + if(north[i]=="change") + btn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new Standard(); + }}); + } + for(int i=0;i<5;i++) { + JButton btn=new JButton(west[i]); + p4.add(btn); + btn.setSize(2,2); + btn.addActionListener(this); + btn.setFont(new Font("宋体",Font.BOLD,20)); + btn.setBackground(new Color(250,255,240)); + } + + } + + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + if(".0123456789".indexOf(e.getActionCommand())!=-1) + { + num1=num1+e.getActionCommand(); + text.setText(num1); + text.setFont(new Font("黑体", Font.PLAIN, 20)); + text1.setFont(new Font("黑体", Font.PLAIN, 20));} + + else if(e.getActionCommand().matches("⇐")) { + + num1=num1.substring(0,num1.length()-1); + text.setText(num1); + } + else if(e.getActionCommand().matches("[×÷+-]{1}")) + {ope=e.getActionCommand(); + num2=num2+num1+ope; + text1.setText(num2); + num1=""; + num3=""; + text.setText(num3); + } + else if(e.getActionCommand().matches("³√x")) { + m=Double.parseDouble(num1); + n=Math.cbrt(m); + num1=n+""; + text1.setText(num1); + } + else if(e.getActionCommand().matches("√x")) { + m=Double.parseDouble(num1); + n=Math.sqrt(m); + num1=""+n; + text1.setText(num1); + } + else if(e.getActionCommand().matches("x!")) { + m=Double.parseDouble(num1); + if(m>=0) {//0的阶乘为1 + n=1; + for(int i=1;i<=m;i++) n=n*i; + num1=n+""; + text1.setText(num1); + }} + else if(e.getActionCommand().matches("¹/x")) { + if(num1=="0")text1.setText("除数不能为0"); + else if(Double.parseDouble(num1)!=0) { + m=Double.parseDouble(num1); + n=1/m; + num1=""+n; + text1.setText(num1); + } + } + else if(e.getActionCommand().matches("sin")) { + m=Double.parseDouble(num1); + n=Math.sin(m); + num1=n+""; + text1.setText(num1); + } + else if(e.getActionCommand().matches("cos")) { + m=Double.parseDouble(num1); + n=Math.cos(m); + num1=n+""; + text1.setText(num1); + } + else if(e.getActionCommand().matches("tan")) { + m=Double.parseDouble(num1); + n=Math.tan(m); + num1=n+""; + text1.setText(num1); + } + else if(e.getActionCommand().matches("xⁿ")) { + ope="^"; + num2=num1+ope; + m=Double.parseDouble(num1); + text1.setText(num2); + num1=""; + text.setText(num3); + flag=1; + } + else if(e.getActionCommand().matches("=")&&flag==1) { + n=Double.parseDouble(num1); + r=Math.pow(m, n); + text1.setText(num2+n+"="); + text.setText(r+""); + + } + else if(e.getActionCommand().matches("lg")) { + ope="lg"; + num2=ope+"("; + text1.setText(num2); + flag=2; + } + else if(e.getActionCommand().matches("=")&&flag==2) { + n=Double.parseDouble(num1); + if(n>0) { + r=Math.log10(n); + text1.setText(num2+n+"="); + text.setText(r+""); + } + else text1.setText("请输入>0的数"); + } + else if(e.getActionCommand().matches("ln")) { + ope="ln"; + num2=ope+"("; + text1.setText(num2); + flag=3; + } + else if(e.getActionCommand().matches("=")&&flag==3) { + n=Double.parseDouble(num1); + if(n>0) { + r=Math.exp(n); + text1.setText(num2+n+"="); + text.setText(r+""); + } + else text1.setText("请输入>0的数"); + } + else if(e.getActionCommand().matches("x²")) { + m=Double.parseDouble(num1); + n=m*m; + num1=""+n; + text1.setText(num1); + } + else if(e.getActionCommand().matches("±")) { + n=Double.parseDouble(num1); + n=-n; + result=n+""; + text.setText(result); + num2=result; + num1=""; + result=""; + } + else if(e.getActionCommand().equals("=")) { + text1.setText(text1.getText()+text.getText()); + Scanner scanner=new Scanner(text1.getText()); + num2=saveNumberAndCalculator(scanner.next()); + text.setText(num2); + num1=""; + } + else if(e.getActionCommand().equals("%")) { + m=Double.parseDouble(num1); + n=m/100; + num1=""+n; + text1.setText(num1); + } + else if(e.getActionCommand().equals("C")) { + num1=""; + num2=""; + text.setText(num2); + text1.setText(num1); + } + else if(e.getActionCommand().equals("e")) { + num1="2.718281828"; + text.setText(num1); + } + else if(e.getActionCommand().equals("Π")) { + num1="3.141592653"; + text.setText(num1); + } + + } + private String saveNumberAndCalculator(String str) { + if(str.startsWith("-")) { + StringBuffer s1=new StringBuffer(str); + s1.insert(0, "0"); + str=s1.toString(); + } + //加上“#”用于获取分割最后一个数字 + str=str+"#"; + char[]strChar=str.toCharArray(); + LinkedListfuhaolist=new LinkedList<>();//存储符号的列表 + LinkedListnumberlist=new LinkedList<>();//存储数字的列表 + StringBuffer buffer=new StringBuffer(); + for(char fuhao:strChar) { + if(fuhao=='+'||fuhao=='-'||fuhao=='×'||fuhao=='÷') { + fuhaolist.add(String.valueOf(fuhao)); + numberlist.add(buffer.toString()); + buffer.delete(0, buffer.length()); + }//判断是不是最后一个数,是的话加到数字列表里 + else if(fuhao=='#') { + numberlist.add(buffer.toString()); + }else { + buffer.append(fuhao); + } + } + return calculateOrder(fuhaolist,numberlist); + }//加减乘除优先级 + private String calculateOrder(LinkedList calculate, LinkedList number) { + if(calculate.size()>0){ + int multiply=calculate.indexOf("×"); + int except=calculate.indexOf("÷"); + if((multiply!=-1&&except!=-1&&multiply0) { + calculateResult(calculate.get(0),calculate,number); + } + } + return number.get(0);//返回最终链表的第一个元素即结果 + } + //通过location找到运算符的位置,并根据位置获得number中对应符号前后的位置 + private String calculateResult(String location, LinkedList calculate, LinkedList number) { + // TODO Auto-generated method stub + int position=calculate.indexOf(location); + double a=Double.parseDouble(number.get(position+1)); + double b=Double.parseDouble(number.get(position)); + String calculateNumber=""; + switch(location) { + + case"×":calculateNumber=String.valueOf(a*b); break; + case"÷": + if(b!=0)calculateNumber=String.valueOf(a/b); + else text1.setText("除数不能为0");break; + case"+":calculateNumber=String.valueOf(a+b); break; + case"-":calculateNumber=String.valueOf(a-b); break; + + } + number.set(position,calculateNumber);//两个数算完把结果给前一个数字 + calculate.remove(position);//在calculate中每算完一个一个符号就删掉一个符号 + number.remove(position+1);//在number中两个数算完后删掉后面那个数 + return calculateOrder(calculate,number);//一直算到没有符号为止 + }} + + diff --git "a/src/\350\256\241\347\256\227\345\231\250/Standard.java" "b/src/\350\256\241\347\256\227\345\231\250/Standard.java" new file mode 100644 index 0000000000000000000000000000000000000000..77c4d12e64c92e038b95bad8e004e3e7aaacbec0 --- /dev/null +++ "b/src/\350\256\241\347\256\227\345\231\250/Standard.java" @@ -0,0 +1,185 @@ +package 计算器; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.*; +import javax.swing.*; +public class Standard extends JFrame implements ActionListener{ + JTextArea text=new JTextArea("",5,30);//输入框 + JTextArea text1=new JTextArea("",5,30);//显示框 + String num1="";//运算数1 + String num2="";//运算数2 + String ope="";//运算符 + String num3=""; + String result="";//结果 +double n,m,r,flag=0; +public static void main(String args[]) { + Standard calculator1=new Standard(); +} +public Standard() { + JPanel p0, p1,p2,p3,p4; +p1=new JPanel(); //放置文本框的面板 +p1.setLayout(new BorderLayout()); + p1.setBackground(new Color(250,255,240)); + JFrame window=new JFrame("标准计算器"); + Container con=window.getContentPane(); + window.setVisible(true); + window.setBounds(500,100,400,500); + window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + window.setLayout(new BorderLayout()); + window.add(p1,BorderLayout.NORTH); + p1.add(text,BorderLayout.CENTER); + p1.add(text1,BorderLayout.NORTH); + text.setBounds(500, 500, 400, 5); + text.setBackground(new Color(250,255,240)); + text1.setBounds(500, 100, 400, 5); + text1.setBackground(new Color(250,255,240)); + + p0=new JPanel();//主面板 +p2=new JPanel();//中部按钮面板 +p3=new JPanel();//北部按钮的面板 +p0.setLayout(new BorderLayout()); +p0.setBackground(new Color(240, 255, 240)); +p2.setLayout( new GridLayout(5,4)); +p3.setLayout( new GridLayout(1,1)); +window.add(p0,BorderLayout.CENTER); +p0.add(p3,BorderLayout.NORTH ); +p0.add(p2,BorderLayout.CENTER ); +String btn_text="%÷C⇐789×456-123+e0.="; +String btn2[]= {"change"}; + p2.setBackground(new Color(240, 255, 240)); + for(int i=0;i<20;i++) { + String temp=btn_text.substring(i,i+1); + JButton btn=new JButton(); + p2.add(btn); + btn.setText(temp); + btn.addActionListener(this); + btn.setSize(1,1); + btn.setBackground(new Color(250,255,240)); + btn.setFont(new Font("宋体",Font.BOLD,15)); + if(temp.equals("=")||temp.equals("C")||temp.equals("⇐")) + btn.setFont(new Font("粗体",Font.BOLD,20)); + } + for(int i=0;i<1;i++) { + JButton btn=new JButton(btn2[i]); + p3.add(btn); + btn.setSize(3,2); + btn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new CalculatorFrame(); + }}); + btn.setBackground(new Color(250,255,240));}} +@Override +public void actionPerformed(ActionEvent e) { +// TODO Auto-generated method stub +if(".0123456789".indexOf(e.getActionCommand())!=-1) +{ +num1=num1+e.getActionCommand(); +text.setText(num1); +text.setFont(new Font("黑体", Font.PLAIN, 20)); +text1.setFont(new Font("黑体", Font.PLAIN, 15));} + +else if(e.getActionCommand().matches("⇐")) { + +num1=num1.substring(0,num1.length()-1); +text.setText(num1); +} +else if(e.getActionCommand().matches("[×÷+-]{1}")) +{ope=e.getActionCommand(); +num2=num2+num1+ope; +text1.setText(num2); +num1=""; +num3=""; +text.setText(num3); +} + +else if(e.getActionCommand().equals("=")) { +text1.setText(text1.getText()+text.getText()); +Scanner scanner=new Scanner(text1.getText()); +num2=saveNumberAndCalculator(scanner.next()); +text.setText(num2); +num1=""; +} +else if(e.getActionCommand().equals("%")) { + m=Double.parseDouble(num1); + n=m/100; + num1=""+n; + text1.setText(num1); +} +else if(e.getActionCommand().equals("C")) { +num1=""; +num2=""; +text.setText(num2); +text1.setText(num1);} + +else if(e.getActionCommand().equals("e")) { + num1="2.718281828"; + text.setText(num1); +}} +private String saveNumberAndCalculator(String str) { + if(str.startsWith("-")) { + StringBuffer s1=new StringBuffer(str); + s1.insert(0, "0"); + str=s1.toString(); + } + //加上“#”用于获取分割最后一个数字 + str=str+"#"; + char[]strChar=str.toCharArray(); + LinkedListfuhaolist=new LinkedList<>();//存储符号的列表 + LinkedListnumberlist=new LinkedList<>();//存储数字的列表 + StringBuffer buffer=new StringBuffer(); + for(char fuhao:strChar) { + if(fuhao=='+'||fuhao=='-'||fuhao=='×'||fuhao=='÷') { + fuhaolist.add(String.valueOf(fuhao)); + numberlist.add(buffer.toString()); + buffer.delete(0, buffer.length()); + }//判断是不是最后一个数,是的话加到数字列表里 + else if(fuhao=='#') { + numberlist.add(buffer.toString()); + }else { + buffer.append(fuhao); + } + } + return calculateOrder(fuhaolist,numberlist); + }//加减乘除优先级 +private String calculateOrder(LinkedList calculate, LinkedList number) { +if(calculate.size()>0){ +int multiply=calculate.indexOf("×"); +int except=calculate.indexOf("÷"); +if((multiply!=-1&&except!=-1&&multiply0) { +calculateResult(calculate.get(0),calculate,number); +} +} +return number.get(0);//返回最终链表的第一个元素即结果 +} +//通过location找到运算符的位置,并根据位置获得number中对应符号前后的位置 +private String calculateResult(String location, LinkedList calculate, LinkedList number) { +// TODO Auto-generated method stub +int position=calculate.indexOf(location); +double a=Double.parseDouble(number.get(position+1)); +double b=Double.parseDouble(number.get(position)); +String calculateNumber=""; +switch(location) { + +case"×":calculateNumber=String.valueOf(a*b); break; +case"÷": + if(b!=0)calculateNumber=String.valueOf(a/b); + else text1.setText("除数不能为0");break; +case"+":calculateNumber=String.valueOf(a+b); break; +case"-":calculateNumber=String.valueOf(a-b); break; + +} +number.set(position,calculateNumber);//两个数算完把结果给前一个数字 +calculate.remove(position);//在calculate中每算完一个一个符号就删掉一个符号 +number.remove(position+1);//在number中两个数算完后删掉后面那个数 +return calculateOrder(calculate,number);//一直算到没有符号为止 +}} + + +