Basado interfaz gráfica GUI de Java implementa la calculadora

"Las aplicaciones Java GUI basada en una realización" - este es el último semestre el 20 de diciembre de grandes programas Java de trabajo, quería terminar fue enviado al blog, hasta ahora los resultados de un cabello.

El gran trabajo que hago es una calculadora para hacer cuando se encuentra a ser más complicado de lo que esperaba para empezar. Calculadora no es tan fácil de hacer, ja, ja, muy fácil de pensar en hacer de la fuerza ignorante.

Esperamos dar a los estudiantes a aprender, aprender con ella, tengo un problema puede ser privado.


El código es demasiado largo, se necesita el código fuente y los archivos ejecutables pueden Baidu disco de red para recibir:

Link: https: //pan.baidu.com/s/1KZr7PkqTpv922sCWyScs8g 
código de extracción: w434

representaciones:

Principal Algoritmo: recibir una expresión en la entrada de la interfaz gráfica de usuario, toda la cadena de corte de cadena como pasar una matriz, una matriz de la matriz sea infija expresiones. (Paréntesis) se convierten en expresión gama de sufijo utilizando una tecnología de pila de expresión infija prioridad operador de comparación que define cadena especial. array expresión Infijo, es necesario eliminar la presencia de operador paréntesis, a su vez todo el postfix operador paréntesis de expresión, no se requieren los paréntesis de expresión postfix, ya presente en el orden de prioridad. Cuando la expresión postfix obtiene, utilizando el mismo conjunto de tecnología, los elementos de la pila tomados en cálculo.

 

diseño de interfaz: interfaz gráfica basada en GUI, herramientas de visualización utilizando módulos de disposición WindowBuilder, ser absolutamente posicionado. Los componentes usados para botones de la interfaz, cuadros de texto, cuadros de entrada, campos de texto desplazable, etc., también se proporcionan bisel de colores, estilo de fuente y similares.

 

Resumen: El trabajo grande para hacer calculadora considerado como segundo intento, también se hace antes de la versión web de la calculadora, pero no sabía expresión infija, Postfix y la tecnología de pila. Se puede decir es el núcleo de estos métodos para completar la calculadora. La calculadora pasó tres noches para completar, y pasó dos noches fueron probados ERROR, ERROR es ahora, básicamente, no existe. Logrado en que la mayor dificultad calculadora infija y Postfix girar los dos métodos de cálculo de la expresión sufijo resultado. Estos dos métodos son los principales mentiras Calculadora código. Equipo viene sin paréntesis es el operador calculadora estándar, pero la función de cálculo acumulativo. El efecto acumulativo no es difícil de calcular, comenzó a hacer cuando hice un cálculo acumulativo, y más tarde añadió un aparato ortopédico para mejorar la operación elimina acumulativo. Hay operación de soporte, se incrementa la calculadora dificultad. Debido a su vez la expresión infija de sufijo, que necesito para determinar las prioridades dentro y fuera de los corchetes, después de no poder comparar operador de soporte de entrada dentro de una expresión de sufijo, porque la expresión de sufijo no necesita paréntesis. En comparación con el sistema se proporciona con una calculadora estándar, calculadora estándar es en realidad parte de dos expresiones mostrar, en parte, entrada de la pantalla, es parte de la expresión global, y sólo tenía un espectáculo que la expresión, por lo cuando los valores de entrada de operador y hay algunas limitaciones. Por ejemplo: No puede introducir directamente un número negativo, se debe introducir un valor de menos cero. Para la entrada de usuario estándar, hago un montón de restricciones de entrada. Por ejemplo: hay dos o más no se pueden conectar para el operador, no el valor del punto decimal y el punto, soporte derecho debe ser el mismo número de soporte izquierdo y similares, éstas se han escrito en la lógica de código, lo que da al usuario una mejor experimentar una sensación, sino también para prevenir el mal uso de los datos entrantes. Por supuesto, si los usuarios finales operador de multiplicación y adición división y resta expresiones prensa es igual a, o la falta de un paréntesis derecho está bien, que no se verá afectado. En general, esta calculadora para hacer la cosecha es grande.


Clase tiene:

clase del calculador: la clase de implementación gráfica interfaz gráfica de usuario, para lograr la disposición general de la calculadora, y la llamada devuelve la clase contenidos StackToCalculator. En el que los comprende función de supervisión lograr ButtonHandler clase interna, y un método (doInit ()) inicializar.

StackToCalculator categorías: clase principal calculadora algoritmo de aplicación. Donde el método comprende una matriz de cadenas revoluciones (toArr (texto String)), postfix infija método de transferencia de expresión (ToSuffix (String [] TextArray) ), el procedimiento determina si el valor de (ISNUM (char strNum), ISNUM (String strNum)), el operador método de comparación de prioridad (ToCampare (String str1)) y un método de cálculo pila sufijo final del expresiones (ToCacultor (String cText)).

 

En el código:

package work7;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.JLabel;

/** 
* @author YoungIT
* @version 2019年12月18日 下午11:12:14 
* @tips 计算器
*/ 
public class Cacultor extends JFrame {

	private JPanel contentPane;
	private JTextArea textArea;
	private JButton btnNewButton,btnNewButton_1,btnNewButton_2,btnNewButton_3,
	btnNewButton_4,btnNewButton_5,btnNewButton_6,btnNewButton_7,button,button_1,
	button_2,button_3,button_4,button_5,button_6,button_7,
	button_8,button_9,button_10,button_11,button_12;
	private String textA = "";
	private String cString = "";
	private JTextField textField;
	private int count = 0;//"+-x/"
	private int cleft = 0;//标记  "("
	private int cright = 0;//标记  ")"
	private int point = 0;//标记  "."
	private int cnum = 0;//标记  数字
	private int flag = 0;//1-数字,2-运算符,3-点,4-左括,5-右括
	private int fsum = 0;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Cacultor frame = new Cacultor();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Cacultor() {
		super("超智能计算器");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(700, 500, 620, 430);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(null);
		setContentPane(contentPane);
		
		btnNewButton = new JButton("C");
		btnNewButton.setBounds(10, 78, 83, 44);
		contentPane.add(btnNewButton);
		
		btnNewButton_1 = new JButton(".");
		btnNewButton_1.setBounds(92, 78, 83, 44);
		contentPane.add(btnNewButton_1);
		
		btnNewButton_3 = new JButton("BackSace");
		btnNewButton_3.setBounds(174, 78, 200, 44);
		contentPane.add(btnNewButton_3);
		
		btnNewButton_4 = new JButton("7");
		btnNewButton_4.setBounds(10, 129, 83, 44);
		contentPane.add(btnNewButton_4);
		
		btnNewButton_5 = new JButton("8");
		btnNewButton_5.setBounds(92, 129, 83, 44);
		contentPane.add(btnNewButton_5);
		
		btnNewButton_6 = new JButton("9");
		btnNewButton_6.setBounds(174, 129, 83, 44);
		contentPane.add(btnNewButton_6);
		
		btnNewButton_7 = new JButton("+");
		btnNewButton_7.setBounds(256, 129, 118, 44);
		contentPane.add(btnNewButton_7);
		
		button = new JButton("4");
		button.setBounds(10, 182, 83, 44);
		contentPane.add(button);
		
		button_1 = new JButton("5");
		button_1.setBounds(92, 182, 83, 44);
		contentPane.add(button_1);
		
		button_2 = new JButton("6");
		button_2.setBounds(174, 182, 83, 44);
		contentPane.add(button_2);
		
		button_3 = new JButton("1");
		button_3.setBounds(10, 236, 83, 44);
		contentPane.add(button_3);
		
		button_4 = new JButton("2");
		button_4.setBounds(92, 236, 83, 44);
		contentPane.add(button_4);
		
		button_5 = new JButton("3");
		button_5.setBounds(174, 236, 83, 44);
		contentPane.add(button_5);
		
		button_6 = new JButton("(");
		button_6.setBounds(10, 288, 83, 44);
		contentPane.add(button_6);
		
		button_7 = new JButton("0");
		button_7.setBounds(92, 288, 83, 44);
		contentPane.add(button_7);
		
		button_8 = new JButton(")");
		button_8.setBounds(174, 288, 83, 44);
		contentPane.add(button_8);
		
		button_9 = new JButton("-");
		button_9.setBounds(256, 182, 118, 44);
		contentPane.add(button_9);
		
		button_10 = new JButton("x");
		button_10.setBounds(256, 236, 118, 44);
		contentPane.add(button_10);
		
		button_11 = new JButton("/");
		button_11.setBounds(256, 288, 118, 44);
		contentPane.add(button_11);
		
		button_12 = new JButton("=");
		button_12.setBounds(10, 337, 364, 44);
		contentPane.add(button_12);
		
		textField = new JTextField();
		textField.setBounds(10, 10, 364, 44);
		textField.setEditable(false);
		textField.setFont(new Font("华文彩云",Font.BOLD, 18));
		textField.setHorizontalAlignment(JTextField.RIGHT);
		contentPane.add(textField);
		textField.setColumns(10);
		
		JLabel lblByYoungit = new JLabel("by: YoungIT");
		lblByYoungit.setBounds(309, 56, 75, 22);
		contentPane.add(lblByYoungit);
		
		textArea = new JTextArea();
		textArea.setBounds(380, 10, 194, 371);
		textArea.setEditable(false);
		textArea.setLineWrap(true);
		textArea.setFont(new Font("华文彩云",Font.BOLD, 18));
		Color b = new Color(194,214,233);
		Color c = new Color(238,238,238);
		textArea.setBackground(c);
		textArea.setBorder(BorderFactory.createMatteBorder(2,2,2,2,b));
		JScrollPane scrollpane = new JScrollPane(textArea);
//		scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollpane.setBounds(384, 10, 210, 371);
		contentPane.add(scrollpane);
		
		ButtonHandler handler = new ButtonHandler();
		button.addActionListener(handler);
		button_1.addActionListener(handler);
		button_2.addActionListener(handler);
		button_3.addActionListener(handler);
		button_4.addActionListener(handler);
		button_5.addActionListener(handler);
		button_6.addActionListener(handler);
		button_7.addActionListener(handler);
		button_8.addActionListener(handler);
		button_9.addActionListener(handler);
		button_10.addActionListener(handler);
		button_11.addActionListener(handler);
		button_12.addActionListener(handler);
		btnNewButton.addActionListener(handler);
		btnNewButton_1.addActionListener(handler);
		btnNewButton_3.addActionListener(handler);
		btnNewButton_4.addActionListener(handler);
		btnNewButton_5.addActionListener(handler);
		btnNewButton_6.addActionListener(handler);
		btnNewButton_7.addActionListener(handler);
	}
	
	public void doInit() {
		textA = "";
		textField.setText(textA);
		count = 0;//"+-x/"
		cleft = 0;//标记  "("
		cright = 0;//标记  ")"
		point = 0;//标记  "."
		cnum = 0;//标记  数字
		flag = 0;
		fsum = 0;
	}
	
	private class ButtonHandler implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			String Ename = e.getActionCommand();
			switch (Ename) {
			case "C":
				doInit();
				break;
			case "BackSace":
				if(fsum==1) {
					doInit();
				}
				try {
					if(textA.length()>0) {
						String laString = textA.substring(textA.length() - 1);
						if(laString.equals(")")) {
							cleft++;
						}else if(laString.equals("0")) {
							cnum = 0;
						}
						textA = textA.isEmpty()?"":textA.substring(0,textA.length() - 1);
						textField.setText(textA);
					
						char c = textA.charAt(textA.length()-1);
							switch (c) {
							case '0':
							case '1':
							case '2':
							case '3':
							case '4':
							case '5':
							case '6':
							case '7':
							case '8':
							case '9':
								flag = 1;break;
							case '+':
							case '-':
							case 'x':
							case '/':
								flag = 2;break;
							case '.':
								flag = 3;break;
							case '(':
								flag = 4;break;
							case ')':
								flag = 5;
								break;
							default:
								break;
							}
					}
				}catch (Exception e2) {
					System.err.println("不要再删啦~已无内容!");
				}
				break;
			case "0":
				if(fsum==1) {
					doInit();
				}
				if(flag == 2 || flag == 0){//1-数字,2-运算符,3-点,4-左括,5-右括
					cnum = 1;
					textA = textA + Ename;
					textField.setText(textA);
					flag = 1;
				}else if(flag == 1 || flag == 3|| flag == 4) {
					textA = textA + Ename;
					textField.setText(textA);
					flag = 1;
				}
				break;
			case "1":
			case "2":
			case "3":
			case "4":
			case "5":
			case "6":
			case "7":
			case "8":
			case "9"://右括) 后不能输数字
				if(fsum==1) {
					doInit();
				}
				if(flag != 5&&cnum == 0){//1-数字,2-运算符,3-点,4-左括,5-右括
					textA = textA + Ename;
					textField.setText(textA);
					flag = 1;
				}
				break;
			case "+":
			case "-":
			case "x":
			case "/"://不能输入:空,(,.,运算符
				if(fsum==1) {
					doInit();
					break;
				}
				if(flag == 1||flag == 5){//0-空,1-数字,2-运算符,3-点,4-左括,5-右括
					textA = textA + Ename;
//					count = 1;//+-x/
					point = 0;
					cnum = 0;
					textField.setText(textA);
					flag = 2;
				}
				break;
			case "."://前面只能是数字
				if(fsum==1) {
					doInit();
					break;
				}
				if(flag == 1&&point == 0) {
					textA = textA + Ename;
					point = 1;//标记.
					textField.setText(textA);
					cnum = 0;
					flag = 3;
				}
				break;
			case "("://不能输入:(,),.,数字
				if(fsum==1) {
					doInit();
				}
				if(flag == 0 || flag == 2) {//空 运算符
					textA = textA + Ename;
					cleft++;
//					cright = 0;
					textField.setText(textA);
					flag = 4;
				}
				System.out.println("cleft:"+cleft);
				break;
			case ")"://不能输入:(,.,运算符,空
				if(fsum==1) {
					doInit();
					break;
				}
				if(((flag == 1 || flag == 4) && cleft > 0)||(flag == 5 && cleft > 0)) {//数字 右括号
					textA = textA + Ename;
//					cright = 0;
					cleft--;
					textField.setText(textA);
					flag = 5;
				}
				System.out.println("cleft2:"+cleft);
				break;
			case "=":
				if(fsum==1) {
					doInit();
					break;
				}
				try {
					System.out.println("****************************");
					System.out.println("输入的表达式:"+textA);
					StackToCacultor stackToCacultor = new StackToCacultor();
					String lastStr = String.valueOf(textA.charAt(textA.length()-1));
					if(!stackToCacultor.isNum(lastStr)&&!lastStr.equals(")")) {//删去最后位是运算符
						textA = textA.isEmpty()?"":textA.substring(0, textA.length() - 1);
					}
					int i = 0,ckey = 0;
					char c; 
					while (i<textA.length()) {//为了补上")"
						c = textA.charAt(i);
						if(c=='(') {
							ckey++;
						}else if(c==')') {
							ckey--;
						}
						i++;
					}
					if(ckey > 0) {
						for(int j=0;j<ckey;j++) {
							textA = textA+")";
						}
					}
					System.out.println("传入计算的表达式:"+textA);
					cString += textA;
					String text2 =  String.valueOf(stackToCacultor.ToCacultor(textA));
					textField.setText(text2);
					cString += " = "+text2 + '\n'+"******************"+ '\n';
					textArea.setText(cString);
					textA = text2;
					fsum = 1;
				}catch (Exception e2) {
					System.err.println("请输入!");
				}
					break;
			default:
				break;
			}
		}
	}
}
package work7;

import java.util.Stack;
import java.util.Vector;

/** 
* @author YoungIT
* @version 2019年12月18日 下午1:01:18 
* @tips 使用堆栈计算
*/ 
public class StackToCacultor{
	private static String[] textArr = new String[50];
	private static String[] textArr2 = new String[50];
	private final static int sizeofSum = 2;//优先级
	private final static int sizeofSub = 2;
	private final static int sizeofMul = 3;
	private final static int sizeofDiv = 3;
	private final static int sizeofLbra = 1;
	private final static int sizeofRbra = 0;
	
	public StackToCacultor() {
		for(int i = 0; i<textArr.length; i++) {
			textArr[i] = null;
			textArr2[i] = null;
		}
	}
	//最终计算
	public static double ToCacultor(String Ctext) {
		int numkey = 0;
		int strkey = 0;
		String[] strArr = ToSuffix(toArr(Ctext));
		Stack<String> stack = new Stack<String>();
		double sum = 0;
		try {
			for(int i=0;i<strArr.length-1;i++) {
				numkey = 0;
				strkey = 0;
				if(strArr[i]==null) {
					while(!stack.isEmpty()) {
						String top = stack.pop();
						if(isNum(top)) {
							sum = Double.parseDouble(top);//*********//						
						}
					}
					break;
				}	// 2x(3+2)
				System.out.println("ToCacultor-后缀:"+strArr[i]);
				if(stack.empty()) {
					stack.push(strArr[i]);
				}else {
					for (String x : stack) { 
	                    if(isNum(x)) {
	                    	numkey++;
	                    }else {
	                    	strkey++;
	                    }
					}
					if(isNum(strArr[i])) {
						if(numkey==1&&strkey==1) {
							String str = stack.pop();
							double num3 = Double.parseDouble(stack.pop());
							double s2 = Double.parseDouble(strArr[i]);
							double sum2 = 0;
							switch (str) {
							case "+":
								sum2 = num3 + s2;
								break;
							case "-":
								sum2 = num3 - s2;
								break;
							case "x":
								sum2 = num3 * s2;
								break;
							case "/":
								sum2 = num3 / s2;
								break;
							}
							stack.push(String.valueOf(sum2));
						}else {
							stack.push(String.valueOf(strArr[i]));
						}
					}else {
						if(numkey>=2) {
							double num1 = Double.parseDouble(stack.pop());
							double num2 = Double.parseDouble(stack.pop());
							double s = 0;
							switch (strArr[i]) {
								case "+":
									s = num2 + num1;
									break;
								case "-":
									s = num2 - num1;
									break;
								case "x":
									s = num2 * num1;
									break;
								case "/":
									s = num2 / num1;
									break;
							}
							stack.push(String.valueOf(s));
						}else {
							stack.push(String.valueOf(strArr[i]));
						}
					}
				}
			}
		}catch (Exception e) {
			System.err.println("计算出错!请重启~");
		}
		System.out.println("计算结果:"+sum);
		return sum;

		
	}

	//字符转数组
	public static String[] toArr(String text) {
		int i = 0,j = 0;
		char c;
		while (i<text.length()) {
			c = text.charAt(i);
			if(c=='('||c==')'||c =='+'||c =='-'||c =='x'||c =='/') {
				textArr[j++] = String.valueOf(c);
				i++;
			}else {//	数字
				String num = "";
				while (true) {
					if(i>=text.length()) {
						break;
					}
					c = text.charAt(i);
					if(c==')'||c =='+'||c =='-'||c =='x'||c =='/') {
						break;
					}
					num += c;
					i++;
				}
				textArr[j++] = num;
			}
		}
		return textArr;
	}
	
	//中缀表达式 转 后缀
	public static String[] ToSuffix(String[] textArray) {
		int k=0;
		Stack stack = new Stack();
		for(int i=0;i<textArray.length-1;i++) {
			if(textArray[i]!=null) {
				System.out.println("ToSuffix中缀:"+textArray[i]);
				int priority = ToCampare(textArray[i]);  //2x(3+2)
				if(isNum(textArray[i])) {//读取到数字
					textArr2[k++] = textArray[i];
				}else {
					if(!stack.empty()) {
						if(textArray[i].equals("(")) {
							stack.push(textArray[i]);
							continue;
						}else if(textArray[i].equals(")")){
							System.out.println(String.valueOf(stack.peek()));
							while (!String.valueOf(stack.peek()).equals("(")) {
								textArr2[k++] = String.valueOf(stack.pop());
							}
							stack.pop();
							continue;
						}else if(priority>ToCampare(String.valueOf(stack.peek()))) {//优先级大于 栈顶
							stack.push(textArray[i]);
							continue;
						}else {
							while (priority<=ToCampare(String.valueOf(stack.peek()))) {
								textArr2[k++] = String.valueOf(stack.pop());
								if(stack.isEmpty()) {
									break;
								}
							}
							stack.push(textArray[i]);
							continue;
						}
					}else {
						stack.push(textArray[i]);
					}
				}
			}else {
				while (!stack.empty()) {
					textArr2[k++] = String.valueOf(stack.pop());
				}
			}
		}//for
		
		return textArr2;
	}
	
	//是否为数1
	public static boolean isNum(char strNum) {
		if(strNum=='1'||strNum=='2'||strNum=='3'||strNum=='4'
				||strNum=='5'||strNum=='6'||strNum=='7'
				||strNum=='8'||strNum=='9'||strNum=='0') {
			return true;
		}else {	
			return false;
		}
	}
	
	//是否为数2
	public static boolean isNum(String strNum) {
		if(!strNum.equals("+")&&!strNum.equals("-")&&!strNum.equals("x")
				&&!strNum.equals("/")&&!strNum.equals("(")&&!strNum.equals(")")) {
			return true;
		}else {
			return false;
		}
	}
	
	//运算符优先级比较    str1>str2  返回true
	public static int ToCampare(String str1) {
		int key = -1;
		switch (str1) {
		case "(":
			key = 1;
			break;
		case ")":
			key = 0;
			break;
		case "+":
		case "-":
			key = 2;
			break;
		case "x":
		case "/":
			key = 3;
			break;
		}
		return key;
	}
	
	//test
	public static void main(String[] args) {
//		String[] strings = toArr("(1222.2x231+232)/123123.23+(323.2+323)");
//		String[] strings = toArr("2x(3+2)");//10
//		String[] strings = toArr("1+1");
//		for(int i=0;i<strings.length-1;i++) {
//			if(strings[i]!=null) {
//				System.out.println(strings[i]);
//			}
//		}
//		System.out.println("  ");
//		ToSuffix(strings);
//		for(int i=0;i<textArr2.length-1;i++) {
//			if(textArr2[i]!=null) {
//				System.out.println(textArr2[i]);
//			}
//		}
//		System.out.println(ToCacultor("2x(3+2)"));
//		System.out.println(ToCacultor("1+1"));
	}
}

 

El código es demasiado largo, se necesita el código fuente y los archivos ejecutables pueden Baidu disco de red para recibir:

Link: https: //pan.baidu.com/s/1KZr7PkqTpv922sCWyScs8g 
código de extracción: w434

 

Aprender, progresar juntos ~

Publicado cinco artículos originales · ganado elogios 3 · Vistas 319

Supongo que te gusta

Origin blog.csdn.net/Young_IT/article/details/104738028
Recomendado
Clasificación