728x90
저도 영상을보고 따라만들고 스스로 해석하면서 배우는중이라....
엊그제 작성한 알아온게.. 그렇게 알필요가 없는거같네요 ..
이번에한건 음수를 입력하는것과 사칙연산이 계속 안나오게 만드는거
그리고 우선연산자를 적용한건데 ... 명령어부터 파악하고 다시 공부해봐야겠네요 ..ㅠㅠ
import java.awt.Color; //JFrame 뺴고 자동입력 됌
import java.awt.Font;
import java.awt.GridLayout; // Grid문을 사용하기위해 선언
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame; // import문을 선언 JFrame에 커서올리고 Ctrl + Shift + O 입력시 자동입력
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calculator extends JFrame { // JFrame를 사용하기위해 상속시킴
private JTextField inputSpace;
private String num= "";
private String prev_operation =""; // 누른 변수를 기억해놓을 변수를 선언
private ArrayList<String> equation = new ArrayList<String>();
public Calculator() {
setLayout(null); // GUI 형식을 지정할 수 있다.
inputSpace = new JTextField(); // inputSpace에는 GUI로 텍스트를 입력받는 JTextField로 구현
inputSpace.setEditable(false); // 수정이 불가능하도록 만듬
inputSpace.setBackground(Color.white); // 배경색을 지정
inputSpace.setHorizontalAlignment(JTextField.RIGHT); // 오른쪽으로 정렬한다.
inputSpace.setFont(new Font("Arial", Font.BOLD, 50)); // 폰트 Arial로 지정
inputSpace.setBounds(8,10,270,70); // x : 8 y : 10 의 위치에 270x70의 크기로 설정
//버튼패널
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(4,4,10,10)); // 칸수, 세로 칸수, 좌우간격, 상하간격을 입력 4행 4열로 총 16칸을 만들었다.
buttonPanel.setBounds(8, 90, 270, 235); //가로위치,세로위치,가로길이,세로길이
String button_names[] = {"C","÷","×","=","7","8","9","+","4","5","6","-","1","2","3","0"}; // 16칸에 각 값 입력
JButton buttons[] = new JButton[button_names.length];
for (int i=0; i<button_names.length; i++) {
buttons[i] = new JButton(button_names[i]);
buttons[i].setFont(new Font("Arial",Font.BOLD, 20)); // 1씩 증가하면서 button_names에 있는 값들을 삽입해준다. 폰트사이즈를 지정함
if(button_names[i] =="C" )buttons[i].setBackground(Color.red); // C문자일시 백그라운드 색상을 "RED"로 변경
else if ((i >= 4 && i <= 6) || (i >= 8 && i<= 10) || (i >= 12 && i <= 15)) buttons[i].setBackground(Color.black);
// 숫자는 모두 black로 지정 i는 순번대로 입력된 숫자를 직접 입력했다.
else buttons[i].setBackground(Color.GRAY); // 나머지는 "GRAY"로 지정
buttons[i].setForeground(Color.white); // 폰트는 "Whight"로 지정
buttons[i].setBorderPainted(false); // 테두리 없애기
buttons[i].addActionListener(new PadActionListener()); // 버튼이 클릭될 시 동작하도록 설정
buttonPanel.add(buttons[i]); // 아까만들어둔 버튼판넬에 값을 집 어넣는다.
}
add(inputSpace); // 기본 인터페이스를 불러온다.
add(buttonPanel); // 위에서 만든 버튼들에 값을넣어 불러온다.
setTitle("계산기"); // 창의 제목
setVisible(true); // 창을 보화면에 나타내도록 설정
setSize(300, 370); // 창의 사이즈 설정
setLocationRelativeTo(null); // 창을 한가운데로 나오게 한다.
setResizable(false); // 창의 사이즈 설정이 불가능 하도록 만든다.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 창을 닫을때 실행중인 프로그램도 함께 종료시킨다.
}
class PadActionListener implements ActionListener{ // 선언문 ActionListener을 상속시켜서 사용한다.
public void actionPerformed(ActionEvent e) { // 버튼이 눌려질시 실행
String operation = e.getActionCommand(); // 눌려진 버튼의 값을 operation에 삽입(비교해야함)
if (operation.equals("C")) { // 값이 C 일시 값 패널을 비운다.
inputSpace.setText("");
}else if (operation.equals("=")) { // 값이 = 일시 계산한 값을 넣는다.
String result = Double.toString(calculate(inputSpace.getText())); // result에 숫자값을 해당하는 문자열 표현으로 변환한 후 삽입 ( calculate는 계산식 )
inputSpace.setText(""+result); // Text패널에 값을 삽입한다.
num = ""; // num값은 초기화 시킨다.
//예외적용
}else if (operation.equals("+") || operation.equals("-") || operation.equals("×") || operation.equals("÷")) {
if(inputSpace.getText().equals("") && operation.equals("-")) {
inputSpace.setText(inputSpace.getText() + e.getActionCommand());
// 받아온값이 '사칙연산'일시 이미들어가있는 값이 '공백'이거나 음수'-'일시 inputText에 값을 넣어준다
} else if(!inputSpace.getText().equals("") && !prev_operation.equals("+") && !prev_operation.equals("-") && !prev_operation.equals("×") && !prev_operation.equals("÷")) {
// 받아온값이 '사칙연산'일시 값이 공백이거나 음수가 아닐시 input텍스트가 공백이 아니고 (&&) 들어가있는 값이 사칙연산이 아닌경우 inputText에 값을 넣어준다.
inputSpace.setText(inputSpace.getText() + e.getActionCommand());
}
}else {
inputSpace.setText(inputSpace.getText() + e.getActionCommand()); // = 이 아닐시 원레있던 숫자값에 새로 추가된 숫자 값을 더한다. ( 더하기가 아닌 숫자를 그대로 올린다.)
}
prev_operation = e.getActionCommand();
// 누른 값을 저장해놓을 변수에 누른값을 바로 저장한다.
}
}
private void fullTextParsing(String inputText) { // inputText 호출시 실행됨 ( 클릭이벤트로 입력되는값을 화면에 띄우기위한 식)
equation.clear(); // 변수를 초기화한다.
for(int i=0; i < inputText.length(); i++) { // inputText안에 있는 값들의 수만큼 비교한다.
char ch = inputText.charAt(i); // 변수ch에 배열안에 있는 변수중 i 번째에 있는 값을 ch에 삽입
if(ch == '-' || ch == '+' || ch == '×' || ch == '÷' ) { // ch가 사칙연산인지 확인
equation.add(num); // 사칙연산일시 밑에있는 else에서 넣어놓은 값을 넣어준다(숫자)
num =""; // num값은 다시 초기화
equation.add(ch+ ""); // 사칙연산이 들어가있는 ch값을 넣어준다. ex) 숫자2, + 를 넣으면 우산 if가 else가되서 먼저 2가 equation에 들어간 후 다시 돌아와서 true가 되자마자 num이 먼저 삽입되서 숫자가 들어간 후 사칙연산이 들어가게됌
} else {
num = num + ch; // 숫자면 숫자값을 저장한다.
}
}
equation.add(num); // 마지막 값이 사칙연산이 아닐시 else에 있는 num값을 넣어주며 종료(값이 모두 들어간 상태) '=' 이 입력되면 calculate가 호출됌
equation.remove("");
//음수 입력 시 사칙연산 입력도중 문자열의 변환을 위해 같이 입력한 "" 공백 떄문에 에러가 나게된다. 공백의 제거를 위해 equtaion을 초기화한다.
}
public double calculate(String inputText) { // '='이 입력됐을때 호출됨
fullTextParsing(inputText); // 텍스트에 있는 값을 모두 불러온다.
double prev = 0; // 변수 선언 소수점까지 해야하기에 double 선언
double current = 0;
String mode = ""; // 문자변수 mode 초기화
for (int i = 0; i < equation.size(); i++) {
String s = equation.get(i);
if(s.equals("+")) { // fullTextParsing의 for문 종료 후에 넣어놓은 equation값(모든값)에서 어떤 사칙연산인지 확인한다.
mode = "add";
} else if (s.equals("-")) {
mode = "sub";
} else if (s.equals("×")) {
mode = "mul";
} else if (s.equals("÷")) {
mode = "div"; // 사칙연산은 읽어올 수 없으므로 mode에 변수를 넣어주고 계산식을 넣는다.
}
if((mode.equals("mul") || mode.equals("div")) && !s.equals("+") && !s.equals("-") && !s.equals("×") && !s.equals("÷"))
{ Double one = Double.parseDouble(equation.get(i - 2));
Double two = Double.parseDouble(equation.get(i));
Double result = 0.0;
if (mode.equals("mul")) {
result = one * two;
} else if (mode.equals("div")) {
result = one / two;
}
equation.add(i + 1, Double.toString(result));
for(int j = 0; j < 3; j++) {
equation.remove(i - 2);
}
i -= 2; // 결과값이 생긴 인덱스로 이동
}
}
for (String s : equation) { // for문 ':' 를 사용하면 (대입받을변수 : 배열명)으로 입력, 배열의 길이만큼 for문이 돌아가게된다.
if(s.equals("+")) { // fullTextParsing의 for문 종료 후에 넣어놓은 equation값(모든값)에서 어떤 사칙연산인지 확인한다.
mode = "add";
} else if (s.equals("-")) {
mode = "sub";
} else if (s.equals("×")) {
mode = "mul";
} else if (s.equals("÷")) {
mode = "div"; // 사칙연산은 읽어올 수 없으므로 mode에 변수를 넣어주고 계산식을 넣는다.
} else {
current = Double.parseDouble(s); // 사칙연산이 아니라면 계산할 수 있도록 문자열을 정수형으로 변경한다.
if(mode.equals("add")) {
prev += current;
} else if (mode.equals("sub")) {
prev -= current;
} else {
prev = current; // prev에 current 값을 넣어준다. ( 처음값 )
}
}
prev = Math.round(prev * 100000) / 100000.0;
}
return prev; // 계산된 prev값을 반환한다
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Calculator(); // 위에 있는 클래스를 호출하여 화면이 나온다.
}
}
728x90
'혼자해보는 공부' 카테고리의 다른 글
[React] 에러 모음집 (0) | 2022.07.08 |
---|---|
[javascript.코딩테스트연습] 없는 숫자 더하기 (0) | 2022.05.19 |
java계산기 사칙연산까지 해본 후 .. (0) | 2022.04.03 |
Java 계산기 만들면서 풀이하기(2) (0) | 2022.03.29 |
Java 계산기 만들면서 풀이하기(1) (0) | 2022.03.29 |