자바 로 단순 계산기 기능 구현

19798 단어 자바계산기
이 프로젝트 는 자바 가 간단 한 계산기 기능 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
항목 설명

실습 목적:자바 GUI 개발 중의 레이아웃 관리 와 이벤트 처리 메커니즘 을 파악 한다.
실습 요구:
(1)자바 의 GUI 를 사용 하여 계산기 인 터 페 이 스 를 설계 해 야 한다.
(2)인터페이스 단 추 를 통 해 정수 나 부동 소수점 의 네 가지 연산 을 실현 하고 결 과 를 인터페이스 에 표시 할 수 있다.
(3)계산 은 소수점 과 양음 정수 로 계산 할 수 있다.
(4)청산 기능 이 있어 야 한다.
디자인

접두사 식 의 계산 solution(String str)
접미사 표현 식 의 값 을 계산 하고 결 과 를 되 돌려 줍 니 다.숫자 스 택,연산 자 스 택 을 준비 하 세 요.대체적인 사고방식 은 숫자 가 직접 디지털 창고 에 들 어가 고 연산 자 는 우선 순 위 를 보고 처리 하 는 것 이다.연산 자 창고 에 들 어 갈 연산 자 와 창고 꼭대기 의 연산 자 를 비교 하고 창고 꼭대기 연산 자의 우선 순위 가 비교적 높 으 면 창고 꼭대기 의 연산 자 를 튕 기 고 디지털 창고 의 두 숫자 를 튕 겨 서 연산 을 하고 결 과 를 다시 디지털 창고 에 넣는다.마지막 남 은 게 최종 결과 야.연산 자 우선 순위 가 연산 자 스 택 꼭대기 보다 작 으 면 연산 자 를 스 택 에 넣 고 마지막 으로 연산 자 를 모두 스 택 에서 나 옵 니 다.
계산 가감 곱 하기 나머지 caculate Result(char optemp,double num 1,double num 2)
들 어 오 는 optemp(표현 식 기호)인 자 를 통 해 들 어 옵 니 다.어떤 기호 인지 어떤 연산 을 한다.
판단 기호의 우선 순위 getOperlevel(char c)
먼저 곱 하기 나 누 기 후 가감 하고 0,1,2 를 통 해 연산 자의 우선 순 위 를 표시 합 니 다.
세 가지 프로젝트 가 설 계 를 실현 하 다.
먼저 GUI 인 터 페 이 스 를 설계 하고 JFrame 용 기 를 설정 합 니 다.용기 에 두 개의 패 널 과 몇 개의 단 추 를 만 들 고 단추 에 표시 할 문 자 를 문자열 배열 에 저장 한 다음 몇 개의 단 추 를 순서대로 만 듭 니 다.사용자 가 입력 한 내용 을 받 아들 일 텍스트 상 자 를 설정 합 니 다.center Panel.setLayout(new GridLayout(4,4,12,16);중간 판 넬 의 레이아웃 을 격자 레이아웃 으로 설정 하고 이 용기 의 줄 수 와 열 수,구성 요소 간 의 수평,수직 간격 을 지정 합 니 다.centerPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));판 넬 에 상 자 를 만 듭 니 다.상자 의 머리 는 5 픽 셀 이 고 왼쪽 은 5 픽 셀 이 며 밑 은 5 픽 셀 이 고 오른쪽 은 5 픽 셀 너비 입 니 다.단일 텍스트 필드 의 크기,글꼴,스타일,글꼴 번 호 를 설정 한 다음 각 단 추 를 위 한 모니터 를 설정 합 니 다.트리거 가 발생 하 는 내용 을 저장 하기 위해 StringBuffer 클래스 를 정의 합 니 다.txt.setText(r.toString()를 사용 합 니 다.방법 은 텍스트 상자 에 내용 을 출력 하고 clear 단 추 를 누 르 면 r.delete(0,r.length()를 사용 합 니 다.방법 은 문자열 의 내용 을 비우 고 결 과 를 텍스트 상자 에 표시 합 니 다."="단 추 는 트리거 가 트리거 한 숫자 를 StringBuffer 에 저장 한 다음,이러한 toString()방법 으로 StringBuffer 버퍼 의 문자 대상 을 되 돌려 줍 니 다.String 형식의 변수 로 받 습 니 다.이 문자열 은 접두사 표현 식 으로 종 류 를 만 듭 니 다.이 종 류 는 입력 한 접두사 표현 식 을 계산 하 는 데 사 용 됩 니 다.계산 결 과 를'='단추 트리거 의 result 변 수 를 되 돌려 주 고 이 변 수 를 문자열 로 텍스트 상자 에 출력 합 니 다.
4.실행 및 테스트









다섯 가지 분석 과 총 결
먼저,저 는 이 문제 의 첫 번 째 반응 을 보 았 습 니 다.이 인터페이스의 구 조 는 격자 구 조 를 사용 해 야 한 다 는 것 입 니 다.처음에 저 는 트리거 에서 해당 하 는 가감 승제 기능 을 직접 실현 하고 싶 었 습 니 다.만약 에 사 칙 연산 을 계산 하려 면 약간 어렵 고 하나의 가감 승제 가 쉬 운 것 을 발 견 했 습 니 다.그 다음 에 코드 를 쓴 후에 과감하게 다시 썼 습 니 다.데이터 구조 에 있 는 접두사 식 의 계산 알고리즘(스 택 을 사용 해 야 합 니 다)을 사 용 했 습 니 다.그러나 그 때 사용 하 는 언어 는 C 언어 였 기 때문에 스 택 에 관 한 글 씨 는 바 이 두 로 갈 수 밖 에 없 었 습 니 다.그 후에 저 는 스 택 과 그의 관련 방법 을 알 게 되 었 습 니 다.저도 이 코드 를 써 서 테스트 를 했 고 스 택 의 용법 을 더욱 능숙 하 게 익 혔 습 니 다.
그리고 많은 네티즌 들 의 코드 와 알고리즘 을 살 펴 보 았 는데 모두 대동소이 하 다 는 것 을 알 게 되 었 습 니 다.저도 그들 이 쓴 알고리즘 을 바탕 으로 코드 를 썼 고 소수 사 칙 연산 을 실현 하 는 기능 을 추 가 했 습 니 다.그 중에서 연산 자 를 판단 하 는 우선 순위 코드 는 네트워크 의 코드 를 직접 옮 겼 습 니 다.
테스트 를 통 해 정밀도 에 약간의 문제 가 있 음 을 발견 했다.연산 의 결 과 는 때로는 정확 하고 때로는 무한 하 게 정확 한 결과 에 가깝다(소수점 뒤의 작은 숫자 가 너무 많다).그리고 음수 의 연산 을 실현 하지 못 하지만 부동 소수점 의 사 칙 연산 을 실현 할 수 있다.나의 현재 수준 으로 는 이 bug 는 아직 해결 할 수 없다.그래서 수정 하지 않 고 대상 의 호출 을 이용 하여 연산 결 과 를 텍스트 상자 에 출력 합 니 다.한동안 이 프로그램의 화면 이 계속 표시 되 지 않 았 습 니 다.콘 솔 console 에서 자꾸 깜빡 거 리 며 꺼 졌 습 니 다.저도 궁금 합 니 다.예전 에 제 가 표시 할 수 있 었 는데 지금 은 왜 이 렇 습 니까?바 이 두 는 오랫동안 답 을 찾 지 못 했 습 니 다.나중에 친구 들 에 게 물 어 보 니 제 채 팅 창 이 보 이 는 frame.setVisible(true)로 설정 되 어 있 지 않 았 습 니 다.그래서 보통 용 기 를 설치 할 때 그의 뒤에 그의 모든 속성 을 다 쓰 고 실행 오류 가 발생 하지 않도록 해 야 쓰 지 않 은 것 을 발견 할 수 있 습 니 다.
Calculater:

package com.itcase_eight;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;

/**
 * @author    
 * @date 2020/12/16 22:09
 */
public class Calculater {
    public static void createAndShowGUI() {
        Date date=new Date();
        DateFormat format=DateFormat.getDateInstance(DateFormat.SHORT);
        //            start
        JFrame f = new JFrame("   ");//   
        JPanel centerPanel = new JPanel(); //     
        JPanel startPanel=new JPanel();
        //       
        JButton  left=new JButton("(");
        JLabel  data=new JLabel(format.format(date),JLabel.CENTER);
        data.setFont(new Font("Times New Roman",Font.BOLD,17));
        JButton clear=new JButton("Clear");
        JButton  right=new JButton(")");
        String button[] = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", ".", "0", "=", "+"};
        JButton but0 = new JButton(button[0]);
        JButton but1 = new JButton(button[1]);
        JButton but2 = new JButton(button[2]);
        JButton but3 = new JButton(button[3]);
        JButton but4 = new JButton(button[4]);
        JButton but5 = new JButton(button[5]);
        JButton but6 = new JButton(button[6]);
        JButton but7 = new JButton(button[7]);
        JButton but8 = new JButton(button[8]);
        JButton but9 = new JButton(button[9]);
        JButton but10 = new JButton(button[10]);
        JButton but11 = new JButton(button[11]);
        JButton but12 = new JButton(button[12]);
        JButton but13 = new JButton(button[13]);
        JButton but14 = new JButton(button[14]);
        JButton but15 = new JButton(button[15]);
        //        
        JTextField txt = new JTextField();
        //         
        centerPanel.setLayout(new GridLayout(5, 4, 12, 16)); //       
        centerPanel.add(left);
        centerPanel.add(clear);
        centerPanel.add(right);
        centerPanel.add(data);
        centerPanel.add(but0);
        centerPanel.add(but1);
        centerPanel.add(but2);
        centerPanel.add(but3);
        centerPanel.add(but4);
        centerPanel.add(but5);
        centerPanel.add(but6);
        centerPanel.add(but7);
        centerPanel.add(but8);
        centerPanel.add(but9);
        centerPanel.add(but10);
        centerPanel.add(but11);
        centerPanel.add(but12);
        centerPanel.add(but13);
        centerPanel.add(but14);
        centerPanel.add(but15);
        centerPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        //       
        txt.setPreferredSize(new Dimension(465, 40));
        //     ,     
        txt.setFont(new Font("  ", Font.PLAIN, 28));
        f.add(startPanel);
        f.add(txt, BorderLayout.NORTH); //                
        f.add(centerPanel, BorderLayout.SOUTH); //              
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//  X    
        f.setLocation(400, 200); //       
        f.setSize(500, 300);
        //   JFrame  
        f.setVisible(true);
        f.setResizable(false); //           
        f.pack(); //          
        //            end
        //              start
        StringBuffer r=new StringBuffer();
        but0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("7");
                txt.setText(r.toString());
            }
        });
        but1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("8");
                txt.setText(r.toString());
            }
        });
        but2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("9");
                txt.setText(r.toString());
            }
        });
        but4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("4");
                txt.setText(r.toString());
            }
        });
        but5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("5");
                txt.setText(r.toString());
            }
        });
        but6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("6");
                txt.setText(r.toString());
            }
        });
        left.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("(");
                txt.setText(r.toString());
            }
        });
        right.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append(")");
                txt.setText(r.toString());
            }
        });
        but8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("1");
                txt.setText(r.toString());
            }
        });
        but9.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("2");
                txt.setText(r.toString());
            }
        });
        but10.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("3");
                txt.setText(r.toString());
            }
        });
        but13.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("0");
                txt.setText(r.toString());
            }
        });
        but15.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("+");
                txt.setText(r.toString());
            }
        });
        but3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("/");
                txt.setText(r.toString());
            }
        });
        but7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("*");
                txt.setText(r.toString());
            }
        });
        but12.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append(".");
                txt.setText(r.toString());
            }
        });
        but11.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("-");
                txt.setText(r.toString());
            }
        });
        clear.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.delete(0,r.length());   //         
                txt.setText(r.toString());  //          
            }
        });
        but14.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                r.append("=");
                String str=r.toString();
                txt.setText("");
                double result= Computer.solution(str);
                String string=String.valueOf(result);
                r.delete(0,r.length());
                r.append(string);
                txt.setText(string);
            }
        });
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(Calculater::createAndShowGUI);
    }
}
컴퓨터 종류:

package com.itcase_eight;

import java.util.Stack;

/**
 * @author    
 * @date 2020/12/16 22:05
 */
public class Computer {
    public static double solution(String str) {
        Stack<Double> numStack = new Stack<>();
        Stack<Character> signalStack = new Stack<>();
        int index = 0;//           
        int len = str.length();
        while (index < len) {
            char c = str.charAt(index); //         
            if (c == '(') {
                signalStack.push(c);//         
            }
            //          
            else if (c == '+' || c == '-' || c == '*' || c == '/') {
                int currOperLevel = getOperlevel(c);//         
                while (true) {
                    int stackOperLevel = 0;//         
                    if (!signalStack.isEmpty()) {
                        Object obj = signalStack.peek();
                        stackOperLevel = getOperlevel((char) obj);
                    }
                    //                      
                    if (currOperLevel > stackOperLevel) {
                        signalStack.push(c);
                        break;//                          
                    } else {//          
                        try {
                            char optemp = '0';
                            double num1 = 0;
                            double num2 = 0;
                            if (!signalStack.isEmpty()) {
                                optemp = (char) signalStack.pop();//            
                            }
                            if (!numStack.isEmpty()) {
                                num1 = (double) numStack.pop();
                                num2 = (double) numStack.pop();//           
                            }
                            numStack.push(caculateResult(optemp, num2, num1));//                 
                        } catch (Exception e) {
                            // TODO: handle exception
                            e.printStackTrace();
                        }
                    }
                }
            } else if (c == ')') {//           ,        
                while (true) {
                    char theop = (char) signalStack.pop();
                    if (theop == '(') {
                        break;
                    } else {
                        try {
                            double num1 = (double) numStack.pop();
                            double num2 = (double) numStack.pop();
                            numStack.push(caculateResult(theop, num2, num1));//         
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } else if (c >= '0' && c <= '9') {
                int tempIndex = index + 1;
                while (tempIndex < len) {
                    char temp = str.charAt(tempIndex);//                
                    if ((temp >= '0' && temp <= '9') || temp == '.') {
                        tempIndex++;//           
                    } else {
                        break;//       
                    }
                }
                String numstr = str.substring(index, tempIndex);//                   
                try {
                    double numnum = Double.parseDouble(numstr);//             
                    numStack.push(numnum);
                    index = tempIndex - 1;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            index++;
        }
        //          
        while (true) {
            Object obj = null;
            if (signalStack.isEmpty() == false) {
                obj = signalStack.pop();
            }
            if (obj == null) {
                break;//          
            } else {//         
                char opterTemp = (char) obj;
                double num1 = (double) numStack.pop();
                double num2 = (double) numStack.pop();
                numStack.push(caculateResult(opterTemp, num2, num1));
            }
        }
        double result = 0;
        try {
            result = (double) numStack.pop();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return result;
    }

    //       
    private static Double caculateResult(char optemp, double num1, double num2) {

        switch (optemp) {
            case '+':
                return num1 + num2;
            case '-':
                return num1 - num2;
            case '*':
                return num1 * num2;
            case '/':
                return num1 / num2;
        }
        return 0.0;
    }

    //       
    private static int getOperlevel(char c) {

        switch (c) {
            case '(':
                return 0;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return 0;
        }
    }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기