「認識に基づいたJavaのGUIアプリケーション」 - これはフィニッシュしたかった最後の学期12月20日の大仕事Javaプログラム、であるが、今の髪の結果まで、ブログに送信されました。
私は大きな仕事は、より多くの私が開始すると予想よりも複雑であることが発見されたときに実行する計算機です。電卓を行うことはそう簡単ではない、ハハ、本当に簡単無知力にやって考えるします。
私たちは、私は問題は民間することができ持って、それを学び、学生が学ぶ与えることを願っています。
コードが長すぎる、必要なソースコードと実行可能ファイルを受信するネットワークディスクBaiduのことができます。
リンクします。https://pan.baidu.com/s/1KZr7PkqTpv922sCWyScs8g
抽出コード:w434
レンダリング:
メインアルゴリズム:配列、配列こと中置式の配列を渡すようにグラフィカルユーザインタフェース入力、文字列全体の切断列に式を受けます。(括弧)は、特別な文字列を定義する比較演算子スタック技術優先中置式を使用して後置発現アレイに変わります。中置発現アレイは、全てのPostfix発現括弧演算子を有効に括弧オペレータの存在を除去する必要がある、後置表現括弧は優先順に既に存在し、必要とされません。後置表現は、同じ技術スタックを使用して、得られた場合、スタックの要素が計算に入れ。
インターフェイスレイアウト: GUIベースのグラフィカルインタフェース、WindowBuilder、絶対位置するレイアウトモジュールを使用して視覚化ツール。コンポーネントは、ボタン、テキストボックス、入力ボックス、スクロール可能なテキストフィールドなどのインタフェースに使用、また、ベゼルの色、フォントスタイルなどを提供しています。
概要:第二の試みとみなさ電卓を行うには大きな仕事は、また、電卓のウェブ版の前に行われますが、中置表現、後置およびスタック技術を知りませんでした。電卓を完了するために、これらのメソッドの中核であると言うことができます。電卓は、BUGは存在しません。基本的に今ある、完了するまでに3夜を過ごし、2泊のBUGを試験した過ごしました。その最大の困難に達成電卓中置とpostfixの成果サフィックス式を計算するための2つのメソッドをオンにします。これらの2つの方法は、コアコードの電卓の嘘です。コンピュータは、括弧なしで付属の標準電卓の演算子が、累積計算の関数です。累積効果は、私は、累積計算をしたとき始め、以降の操作は累積除去し改善するためにブレースを追加し、計算するのは難しいことではありません。そこブラケット操作は、難易度の計算が増加しています。後置式は、括弧を必要としないので、ターン後置中置式で、私は、後置式内の着信ブラケット演算子を比較することはできませんした後括弧内と外の優先順位を決定する必要があるため。コンピュータと比較すると、標準の電卓が付属して、標準の電卓はそう、、、一部では、表示入力を表示し、実際に二つの表現の一部であり、全体的な表現の一部であり、私は唯一のショー、その式がありましたときオペレータの入力値といくつかの制限があります。例えば:あなたは直接負の数を入力することはできません、あなたはマイナスゼロ値を入力する必要があります。標準ユーザー入力のために、私は、入力制約の多くを行います。例えば、2つ以上のオペレータではなく小数点の値と点に接続することができないがあり、右のブラケットは、左ブラケット等の同じ数である必要があり、これらは、それによってユーザに良好を与え、コード・ロジックで書かれています感覚を体験するだけでなく、着信データの悪用を防ぐために。オペレータのエンドユーザーの乗算、除算、加算と減算式のプレスがに等しい、または右括弧の欠如は大丈夫であればもちろん、それは影響を受けません。全体の収穫を行うには、この電卓は素晴らしいです。
クラスがあります。
電卓クラス: GUIグラフィカルインタフェースの実装クラスは、計算機の全体的なレイアウトを達成するために、通話内容StackToCalculatorクラスを返します。前記監視機能備えるは内部クラスButtonHandlerを達成するため、及び方法(doInit())の初期化。
StackToCalculatorカテゴリ:メインアルゴリズムの計算の実装クラス。この方法は、ストリング回転(toArr(文字列テキスト))、後置中置式転送方法(ToSuffix(文字列[] textArray)のアレイを含む、請求項 )、 この方法は、(isNum(チャーstrNum)の値か否かを判断する、isNum (文字列strNum))、オペレータ優先度比較方法(ToCampare(文字列STR1))と表現の最終的なスタックサフィックス計算方法(ToCacultor(文字列CTEXT))。
コードの場合:
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"));
}
}
コードが長すぎる、必要なソースコードと実行可能ファイルを受信するネットワークディスクBaiduのことができます。
リンクします。https://pan.baidu.com/s/1KZr7PkqTpv922sCWyScs8g
抽出コード:w434
〜一緒に進行、学びます