목표
1. 덧셈 뺄셈 곱셈 나눗셈을 할 수 있어야한다.
2. 나눗셈할 때 소숫점까지도 도출하기 위해 모든 값에 소숫점을 추가한다.
3. Scanner로 수식을 적으면 바로 계산이 되어야한다
4. 곱셈과 나눗셈을 먼저 계산하도록한다
설계 과정
입력값은 숫자와 문자로 받기 때문에 숫자와 문자열을 각각 배열값에 저장해주는 작업을 하였다
매개변수값은 scan으로 받는 단어인 input으로 작성하였다
예시로 Scanner로 받은값을 아래라고 한다면
-3+4*5.2+8
1) 숫자 배열 뽑아내기
public double[] number(String input) {
input = input.replaceAll("[^(.-9)]", " ").trim().replace("/", " ");
String[] strNum = input.split(" ");
double[] number = new double[strNum.length];
for (int i = 0; i < strNum.length; i++) {
number[i] = Double.parseDouble(strNum[i]);
}
return number;
}
[3.0, 4.0, 5.2, 8.0]
2) 문자 배열 뽑아내기 (+ 0)
public String[] sign(String input) {
input = input.replaceAll("[0-9]", " 0 ").trim().replace(" . 0", "");
String[] sign = input.split(" ");
return sign;
}
[-, 0, +, 0, *, 0, +, 0]
0으로 출력된 값은 반복문에서 숫자 값을 연산하기 위해 넣었다.
3) 부호 -
public double[] subNum(String input) {
String[] sign = sign(input);
double[] number = number(input);
int cur = 0;
for (int i = 0; i < sign.length - 1; i++) {
if (sign[i].equals("-")) {
number[cur] *= -1.0;
} else if (sign[i].equals("0") && sign[i + 1].isEmpty()) {
continue;
} else if (sign[i].equals("0")) {
cur++;
}
}
return number;
}
[-3.0, 4.0, 5.2, 8.0]
-부호일 때는 -부호 숫자 뒤에오는 숫자에 -1을 곱하여 추후 계산을 원활하게 한다.
숫자배열의 인덱스를 cur에 넣어서 0일때 순서가 바뀌도록하였으며
숫자가 10자리수 부터는 0갯수가 늘어나 인덱스 범위가 넘어서기 때문에 배열 사이에 공백이 들어간다는 점을 착안해 isEmpty 함수를 써서 함께 일치하는 조건은 반복문을 다음으로 넘어가게 작업
4) 곱셈과 나눗셈 선행 계산
public double[] mulDiv(String input) {
String[] sign = sign(input);
double[] subNum = subNum(input);
int cur = 0;
for (int i = 0; i < sign.length - 1; i++) {
if (sign[i].equals("*")) {
subNum[cur] = subNum[cur - 1]*subNum[cur];
subNum[cur - 1] = 0;
}
if (sign[i].equals("/")) {
subNum[cur] = subNum[cur - 1] / subNum[cur];
subNum[cur - 1] = 0;
if (subNum[cur] == 0) {
error = true;
break;
} else {
}
} else if (sign[i].equals("0") && sign[i + 1].isEmpty()) {
continue;
} else if (sign[i].equals("0")) {
cur++;
}
}
return subNum;
}
[-3.0, 0, 20.8, 8.0]
곱셈과 나눗셈은 일단 목표로 한 것은 ( )를 사용하지 않는 전제가 있기 때문에 계산은 순서대로 이어져 곱셈이나 나눗셈한 값을 뒤에값에 저장하고 앞에 값을 0에 대입하는 것으로 결과를 도출해낼 수 있었다.
허나 이때 0을 나눠주면 에러가 발생하기 때문에 Class 내부에 boolean값을 하나 설정하여 출력시 true값이 나올 때 오류가 뜨도록 설정하였다.
나머지 연산을 하여 모든 값을 더해주면 연산작업이 완료가 된다.
5) 계산한 값 모두 더하기
public double result(String input) {
double result = 0;
double[] mulDiv = mulDiv(input);
for (double num : mulDiv) {
result += num;
}
return result;
}
25.8
결과
package Calculator;
import java.util.Arrays;
import java.util.Scanner;
public class Calculator {
boolean error = false;
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.process();
}
public void process() {
while (true) {
error = false;
System.out.println("┌───────────────┐");
System.out.println("| 계산기 |");
System.out.println("|---------------|");
System.out.println("| 1 사용하기 |");
System.out.println("| 2 종료하기 |");
System.out.println("└───────────────┘");
int sel = sc.nextInt();
if (sel == 1) {
System.out.println("┌───────────────────────┐");
System.out.println("| 계산할 값을 입력해주세요 |");
System.out.println("| 계산할 값은 공백없이 기술해주세요 |");
System.out.println("| 덧셈 뺄셈 곱셈 나눗셈만 가능합니다 |");
System.out.println("| 숫자와 + - * /만 사용해주세요 |");
System.out.println("|-----------------------|");
System.out.println("| ex -3+4*5.2+8 |");
System.out.println("└───────────────────────┘");
String input = sc.next();
double result = result(input);
input = input.replace("=", "");
if (error == true) {
System.out.println("┌──────────────────────┐");
System.out.println("| 오 류 |");
System.out.println("| 0값으로 나눌 수 없습니다 |");
System.out.println("└──────────────────────┘");
} else {
System.out.println("┌────────────────────────────────────┐");
System.out.println("| 계산이 완료되었습니다 |");
System.out.println("=============== 결과값 =================");
System.out.println(" "+input + " = " + result);
System.out.println("=====================================");
System.out.println("└────────────────────────────────────┘");
}
} else if (sel == 2) {
System.out.println("┌────────────────┐");
System.out.println("| 알 림 |");
System.out.println("| 계산기가 종료됩니다 |");
System.out.println("└────────────────┘");
break;
}
}
}
// 계산할 값 숫자 배열을 리턴하는 메소드 ex [3.0, 4.0, 5.2, 8.0]
public double[] number(String input) {
input = input.replaceAll("[^(.-9)]", " ").trim().replace("/", " ");
String[] strNum = input.split(" ");
double[] number = new double[strNum.length];
for (int i = 0; i < strNum.length; i++) {
number[i] = Double.parseDouble(strNum[i]);
}
return number;
}
// 문자배열을 리턴하는 메소드 ex [-, 0, +, 0, *, 0, +, 0]
public String[] sign(String input) {
input = input.replaceAll("[0-9]", " 0 ").trim().replace(" . 0", "");
String[] sign = input.split(" ");
return sign;
}
// -부호일 때 뒷자리 숫자에 -를 붙이는 결과 리턴
public double[] subNum(String input) {
String[] sign = sign(input);
double[] number = number(input);
int cur = 0;
for (int i = 0; i < sign.length - 1; i++) {
if (sign[i].equals("-")) {
number[cur] *= -1.0;
} else if (sign[i].equals("0") && sign[i + 1].isEmpty()) {
continue;
} else if (sign[i].equals("0")) {
cur++;
}
}
return number;
}
// 곱셈과 나눗셈을 먼저 계산한 배열 리턴 만약 0을 나누는 계산이 나왔을 때는 Error 메세지 호출 > error=true
// 곱셈을 한 값은 뒤에 숫자에 저장된다
public double[] mulDiv(String input) {
String[] sign = sign(input);
double[] subNum = subNum(input);
int cur = 0;
for (int i = 0; i < sign.length - 1; i++) {
if (sign[i].equals("*")) {
subNum[cur] = subNum[cur - 1]*subNum[cur];
subNum[cur - 1] = 0;
}
if (sign[i].equals("/")) {
subNum[cur] = subNum[cur - 1] / subNum[cur];
subNum[cur - 1] = 0;
if (subNum[cur] == 0) {
error = true;
break;
} else {
}
} else if (sign[i].equals("0") && sign[i + 1].isEmpty()) {
continue;
} else if (sign[i].equals("0")) {
cur++;
}
}
return subNum;
}
// 결과값
public double result(String input) {
double result = 0;
double[] mulDiv = mulDiv(input);
for (double num : mulDiv) {
result += num;
}
return result;
}
}
해결해야될 문제
( )나 다른 수식들을 사용하지 못하는 문제도 존재하고
숫자나 문자 배열로 바꾸는 코드도 복잡하여 다른 방법을 찾고 이후에 더 나은 계산기를 만들어보고자
열심히 공부를 해야될 것같다.
'Project' 카테고리의 다른 글
ERP 프로젝트 - 최저가 표 (0) | 2024.10.11 |
---|---|
ERP 프로젝트 - 오라클 함수 FN (0) | 2024.10.11 |
ERP 프로젝트 - 크롤링/정렬 (0) | 2024.10.11 |
[Project] 학사관리 프로젝트 (0) | 2024.07.08 |
[Project] db를 활용해 콘솔 통해 구현하는 도서관 시스템 (0) | 2024.04.20 |