计算器2计算存在大量bug,全部删除后重写:
计算器的全部零件:四则运算,字符串拆分器,括号补全,字符串最终加工
总体思路就是运用字符串拆分器将用户按键输入的字符串按照括号分别存入字符数组中,存入时放入字母作为标记,然后将他们变为long型数据进行四则运算,先运算最后一层,运算结果作为上一层标记地方的数值,列如:
1+(2+3+(4+5->括号补全->1+(2+3+(4+5))->字符串拆分器->1+a,2+3+b,4+5->四则运算->1+a,2+3+9->1+14->15
最后加工成与开始字符串相同的格式
经过计划拆分后的运算部分得到了极大优化,再一次说明了做一件事情之前整理思路的重要性(笑)
各个部分代码:
括号补全:
int round=0;
for(int ho=0;ho<x;ho++) {
if(t.charAt(ho)=='(')
round++;
if(t.charAt(ho)==')')
round--;
}
if(round>0) {
int ho=0;
while(true) {
if(t.charAt(t.length()-1)!=' ') {
t=t+" ";
}
if(t.charAt(ho)==' ') {
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(ho,')');
strBuilder.toString();
t=strBuilder.toString();
x++;
round--;
}
if(round==0)
break;
ho++;
}
}
字符串拆分器:
String []part= {"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
};
char []target= {'a','b','c','d','e','f','g','h','i','j'};
int num=0,base=0;
if(t.charAt(x-1)=='('||t.charAt(x-1)=='+'||t.charAt(x-1)=='-'||t.charAt(x-1)=='×'||t.charAt(x-1)=='÷') {
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x-1,' ');
strBuilder.toString();
t=strBuilder.toString();
}
part[0]=t;
int i=0,c=0;
while(true) {
c=0;
if(part[base].charAt(i)=='(') {
i++;
int j=i,k=0;
while(true) {
if(part[base].charAt(j)==')'||j==x||part[base].charAt(j)=='(') {
if(part[base].charAt(j)=='(') {
k=1;
c=1;
int t=i;
while(true){
if(part[base].charAt(t)=='(') {
k++;
}
if(part[base].charAt(t)==')') {
k--;
}
if(k==0||t==x) {
j=t-1;
break;
}
t++;
}
}
for(int v=i;v<j;v++) {
StringBuilder strBuilder = new StringBuilder(part[num+1]);
strBuilder.setCharAt(v-i,part[base].charAt(v));
strBuilder.toString();
part[num+1]=strBuilder.toString();
}
if(c==1)
j++;
for(int p=i;p<=j;p++) {
part[base]=removeCharAt(part[base],i)+" ";
}
StringBuilder strBuilder = new StringBuilder(part[base]);
strBuilder.setCharAt(i-1,target[num]);
strBuilder.toString();
part[base]=strBuilder.toString();
num++;
if(c==1) {
base=num;
}
i=0;
break;
}
j++;
}
continue;
}
i++;
if(i==x)
break;
}
long []sum=new long[10];
long []number=new long[10];
char []sign= {'/','/','/','/','/','/','/','/','/','/'};
int o=0,jk=0;
while(true) {
String str="0 ";
for(int f=0;f<part[num].length();f++) {
if(part[num].charAt(f)>='0'&&part[num].charAt(f)<='9') {
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.setCharAt(jk,part[num].charAt(f));
strBuilder.toString();
str=strBuilder.toString();
jk++;
}
else if(part[num].charAt(f)=='+'||part[num].charAt(f)=='-'||part[num].charAt(f)=='×'||part[num].charAt(f)=='÷'){
jk=0;
for(int g=0;g<str.replace(" ","").length();g++) {
long m=(int)Math.pow(10, str.replace(" ","").length()-g-1);
number[o]=number[o]+m*Long.valueOf(str.charAt(g)+"");
}
sign[o]=part[num].charAt(f);
o++;
str="0 ";
}else if(part[num].charAt(f)==target[num]) {
number[o]=sum[num+1];
}
}
for(int g=0;g<str.replace(" ","").length();g++) {
long m=(long)Math.pow(10, str.replace(" ","").length()-g-1);
number[o]=number[o]+m*Integer.parseInt(str.charAt(g)+"");
}
四则运算:
sum[num]=number[0];
for(int s=0;s<o;s++) {
//加法
if(sign[s]=='+'&&sign[s+1]!='×'&&sign[s+1]!='÷') {
sum[num]=sum[num]+number[s+1];
}
if(sign[s]=='+'&&(sign[s+1]=='×'||sign[s+1]=='÷')) {
long zan=number[s+1];
while(sign[s+1]=='×'||sign[s+1]=='÷') {
if(sign[s+1]=='×')
zan=zan*number[s+2];
if(sign[s+1]=='÷')
zan=zan/number[s+2];
s++;
}
s++;
sum[num]=sum[num]+zan;
}
//减法
if(sign[s]=='-'&&sign[s+1]!='×'&&sign[s+1]!='÷') {
sum[num]=sum[num]-number[s+1];
}
if(sign[s]=='-'&&(sign[s+1]=='×'||sign[s+1]=='÷')) {
long zan=number[s+1];
while(sign[s+1]=='×'||sign[s+1]=='÷') {
if(sign[s+1]=='×')
zan=zan*number[s+2];
if(sign[s+1]=='÷')
zan=zan/number[s+2];
s++;
}
s++;
sum[num]=sum[num]-zan;
}
//乘法
if(sign[s]=='×')
sum[num]=sum[num]*number[s+1];
//除法
if(sign[s]=='÷')
sum[num]=sum[num]/number[s+1];
}
number=new long[10];
for(int z=0;z<10;z++) {
sign[z]='/';
}
o=0;
jk=0;
num=num-1;
if(num==-1)
break;
}
字符串最终加工:
t=String.valueOf(sum[0]);
x=t.replace(" ", "").length();
for(int h=0;h<16-(x-1);h++) {
t=t+" ";
}
t=t.replace("+","");
t=t.replace("-","");
t=t.replace("×","");
type=t.length();
l=0;r=0;
全部代码:
package gouzao;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
import org.omg.CORBA.TCKind;
public class computer extends JFrame implements ActionListener{
String[] str= {"7","8","9","DEL","Replay","4","5","6","×","÷","1","2","3","+","-","0","(",")","=","boom"};
JPanel p = new JPanel();
static int boom=0;
DecimalFormat df = new DecimalFormat("0");
int round=0,round1=0;
char un=' ';
int x=1,o=0,r=0,l=0,d=0,kl=0,type=0;//开关:x表示字符长度,o判断用户在输入运算符之前是否按了0键(o为0时其他数字键可以替代0)
//s,y,m,w判断用户是否输入了+,-,×,÷键(控制用户防止用户输入两次同样的运算符及其他非法操作),r判断用户是否输入加减乘除;
double k=0;
char c[]= {'/','/','/','/','/','/','/','/','/','/','/','/','/','/','/'};
static JTextField textA;
static String t="0 ";
static String f="flag",l1="{",a="M1necraft",g="}";
public computer() {
setLayout(new BorderLayout());
setFont(new Font("Arial",Font.PLAIN,14));
textA = new JTextField("",5);
textA.setFont(new Font("Arial",Font.PLAIN,30));
textA.disable();
getContentPane().add("North",textA);
p.setLayout(new GridLayout(4,5));
for(int i=0;i<20;i++) {
JButton b = new JButton(str[i]);
b.addActionListener(this);
b.setActionCommand(str[i]);
p.add(b);
}
getContentPane().add("Center",p);
}
static public void execute(int sec){
long t1 = System.currentTimeMillis();
boom=2;
while(true){
long t2 = System.currentTimeMillis();
if(t2-t1 > sec*1000){
System.exit(0);
break;
}else{
}
}
}
public static String removeCharAt(String s, int pos) {
return s.substring(0, pos) + s.substring(pos + 1);
}
public static void main(String[] agrs) {
computer c = new computer();
c.setTitle("计算器");
c.pack();
c.setVisible(true);
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.setLocationRelativeTo(null);
while(true) {
if(boom==1){
execute(10);
}
c.textA.setText(c.t);
if(t.equals("666")) {
t=f+l1+a+g;
}
}
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("7")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0') {
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'7');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("8")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'8');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("9")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'9');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("4")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'4');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("5")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'5');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("6")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'6');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("1")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'1');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("2")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格//为0时退格
x=x-1;
}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'2');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("3")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'){//为0时退格
x=x-1;}
if(o==1) {
x=x-1;
o=0;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'3');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
l=0;
r=0;
type++;
}else if(e.getActionCommand().equals("0")) {
if(x==15||d==1||type==10) {
return;
}else if(t.charAt(0)=='0'&&r==0){
return;
}else if(o==1){
return;
}else
{
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'0');
strBuilder.toString();
t=strBuilder.toString();
if(r==1)
o=1;
x=x+1;
l=0;
r=0;
type++;
}
}else if(e.getActionCommand().equals("+")) {
if(x==15) {
return;
}else if(l==1) {
return;
}else {
if(r==1){
x=x-1;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'+');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
d=0;
o=0;
r=1;
type=0;
}
}else if(e.getActionCommand().equals("-")) {
if(x==15) {
return;
}else if(l==1) {
return;
}else
{
if(r==1){
x=x-1;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'-');
strBuilder.toString();
t=strBuilder.toString();
d=0;
x=x+1;
o=0;
r=1;
type=0;
}
}else if(e.getActionCommand().equals("=")) {
int round=0;
for(int ho=0;ho<x;ho++) {
if(t.charAt(ho)=='(')
round++;
if(t.charAt(ho)==')')
round--;
}
if(round>0) {
int ho=0;
while(true) {
if(t.charAt(t.length()-1)!=' ') {
t=t+" ";
}
if(t.charAt(ho)==' ') {
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(ho,')');
strBuilder.toString();
t=strBuilder.toString();
x++;
round--;
}
if(round==0)
break;
ho++;
}
}
String []part= {"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
"0 ",
};
char []target= {'a','b','c','d','e','f','g','h','i','j'};
int num=0,base=0;
if(t.charAt(x-1)=='('||t.charAt(x-1)=='+'||t.charAt(x-1)=='-'||t.charAt(x-1)=='×'||t.charAt(x-1)=='÷') {
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x-1,' ');
strBuilder.toString();
t=strBuilder.toString();
}
part[0]=t;
int i=0,c=0;
while(true) {
c=0;
if(part[base].charAt(i)=='(') {
i++;
int j=i,k=0;
while(true) {
if(part[base].charAt(j)==')'||j==x||part[base].charAt(j)=='(') {
if(part[base].charAt(j)=='(') {
k=1;
c=1;
int t=i;
while(true){
if(part[base].charAt(t)=='(') {
k++;
}
if(part[base].charAt(t)==')') {
k--;
}
if(k==0||t==x) {
j=t-1;
break;
}
t++;
}
}
for(int v=i;v<j;v++) {
StringBuilder strBuilder = new StringBuilder(part[num+1]);
strBuilder.setCharAt(v-i,part[base].charAt(v));
strBuilder.toString();
part[num+1]=strBuilder.toString();
}
if(c==1)
j++;
for(int p=i;p<=j;p++) {
part[base]=removeCharAt(part[base],i)+" ";
}
StringBuilder strBuilder = new StringBuilder(part[base]);
strBuilder.setCharAt(i-1,target[num]);
strBuilder.toString();
part[base]=strBuilder.toString();
num++;
if(c==1) {
base=num;
}
i=0;
break;
}
j++;
}
continue;
}
i++;
if(i==x)
break;
}
long []sum=new long[10];
long []number=new long[10];
char []sign= {'/','/','/','/','/','/','/','/','/','/'};
int o=0,jk=0;
while(true) {
String str="0 ";
for(int f=0;f<part[num].length();f++) {
if(part[num].charAt(f)>='0'&&part[num].charAt(f)<='9') {
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.setCharAt(jk,part[num].charAt(f));
strBuilder.toString();
str=strBuilder.toString();
jk++;
}
else if(part[num].charAt(f)=='+'||part[num].charAt(f)=='-'||part[num].charAt(f)=='×'||part[num].charAt(f)=='÷'){
jk=0;
for(int g=0;g<str.replace(" ","").length();g++) {
long m=(int)Math.pow(10, str.replace(" ","").length()-g-1);
number[o]=number[o]+m*Long.valueOf(str.charAt(g)+"");
}
sign[o]=part[num].charAt(f);
o++;
str="0 ";
}else if(part[num].charAt(f)==target[num]) {
number[o]=sum[num+1];
}
}
for(int g=0;g<str.replace(" ","").length();g++) {
long m=(long)Math.pow(10, str.replace(" ","").length()-g-1);
number[o]=number[o]+m*Integer.parseInt(str.charAt(g)+"");
}//最后一位数
//四则运算
sum[num]=number[0];
for(int s=0;s<o;s++) {
//加法
if(sign[s]=='+'&&sign[s+1]!='×'&&sign[s+1]!='÷') {
sum[num]=sum[num]+number[s+1];
}
if(sign[s]=='+'&&(sign[s+1]=='×'||sign[s+1]=='÷')) {
long zan=number[s+1];
while(sign[s+1]=='×'||sign[s+1]=='÷') {
if(sign[s+1]=='×')
zan=zan*number[s+2];
if(sign[s+1]=='÷')
zan=zan/number[s+2];
s++;
}
s++;
sum[num]=sum[num]+zan;
}
//减法
if(sign[s]=='-'&&sign[s+1]!='×'&&sign[s+1]!='÷') {
sum[num]=sum[num]-number[s+1];
}
if(sign[s]=='-'&&(sign[s+1]=='×'||sign[s+1]=='÷')) {
long zan=number[s+1];
while(sign[s+1]=='×'||sign[s+1]=='÷') {
if(sign[s+1]=='×')
zan=zan*number[s+2];
if(sign[s+1]=='÷')
zan=zan/number[s+2];
s++;
}
s++;
sum[num]=sum[num]-zan;
}
//乘法
if(sign[s]=='×')
sum[num]=sum[num]*number[s+1];
//除法
if(sign[s]=='÷')
sum[num]=sum[num]/number[s+1];
}
number=new long[10];
for(int z=0;z<10;z++) {
sign[z]='/';
}
o=0;
jk=0;
num=num-1;
if(num==-1)
break;
}
t=String.valueOf(sum[0]);
x=t.replace(" ", "").length();
for(int h=0;h<16-(x-1);h++) {
t=t+" ";
}
t=t.replace("+","");
t=t.replace("-","");
t=t.replace("×","");
type=t.length();
l=0;r=0;
}else if(e.getActionCommand().equals("Replay")) { //重置
t="0 ";
x=1;
un=' ';
round=0;
k=0;
r=0;
d=0;
l=0;
}else if(e.getActionCommand().equals("×")) {
if(x==15) {
return;
}else if(l==1) {
return;
}else
{
if(r==1){
x=x-1;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'×');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
o=0;
r=1;
d=0;
type=0;
}
}else if(e.getActionCommand().equals("÷")) {
if(x==15) {
return;
}else if(l==1) {
return;
}else
{
if(r==1){
x=x-1;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'÷');
strBuilder.toString();
t=strBuilder.toString();
x=x+1;
o=0;
d=0;
r=1;
type=0;
}
}else if(e.getActionCommand().equals("(")) {
if(x==15) {
return;
}else if(r==0) {
return;
}else{
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'(');
strBuilder.toString();
t=strBuilder.toString();
round=round+1;
l=1;
x=x+1;
o=0;
r=1;
type=0;
}
}
else if(e.getActionCommand().equals(")")){
if(x==15){
return;
}else if(round==0||t.charAt(x-1)=='(') {
return;
}else if(r==1){
x=x-1;
}
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,')');
strBuilder.toString();
t=strBuilder.toString();
d=1;
round=round-1;
l=0;
x=x+1;
o=0;
r=0;
type=0;
}
else if(e.getActionCommand().equals("DEL")) {
if(x!=0&&x!=1) {
x=x-1;
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,' ');
strBuilder.toString();
t=strBuilder.toString();
}else if(x==1&&t.charAt(1)!=0) {
x=x-1;
StringBuilder strBuilder = new StringBuilder(t);
strBuilder.setCharAt(x,'0');
strBuilder.toString();
t=strBuilder.toString();
x++;
}
if(t.charAt(x-1)=='+'||t.charAt(x-1)=='-'||t.charAt(x-1)=='×'||t.charAt(x-1)=='÷') {
r=1;
}else if (t.charAt(x-1)=='('||t.charAt(x-1)==')') {
l=1;
}else{
type--;
}
}
else if(e.getActionCommand().equals("boom")){
if(boom==2)
return;
JFrame framel= new JFrame("bomb");
framel.setLocationRelativeTo(null);
framel.setSize(800,800);
framel.setBackground(Color.WHITE);
framel.setLayout(new BorderLayout());
JTextField textB,textC,txtD;
textB = new JTextField("你为什么要点这个?",10);
textB.setFont(new Font("宋体",Font.BOLD,60));
textB.disable();
// textB.setText("你为什么要点这个?");
textC = new JTextField("距离炸弹爆炸还有:10秒",12);
textC.setFont(new Font("宋体",Font.BOLD,60));
textC.disable();
// textC.setText("距离炸弹爆炸还有:");
// JPanel contentPane = new JPanel();
// JPanel contentPane1 = new JPanel();
framel.getContentPane().add("North",textB);
framel.getContentPane().add("Center",textC);
// framel.setContentPane(contentPane);
framel.setVisible(true);
boom=1;
}
}
}