반응형
혼자 했던 코드
package com.java.calculator;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
System.out.println("===Java Calculator===");
Scanner input = new Scanner(System.in);
//Y 나 y 입력하면 무한으로 반복
String keepStr;
do {
//한개씩 차례대로 입력
//System.out.println("첫번째 숫자를 입력해 주세요.");
//double firstNum = input.nextDouble();
// input.nextLine();
double firstNum = inputIsNumber("첫번째 숫자를 입력해 주세요.", input);
System.out.println("연산자를 입력해주시요");
String str = input.nextLine();
double lastNum = inputIsNumber("두번째 숫자를 입력해 주세요.", input);
//출력값
double result = 0;
//if 문 boolean 정하기
boolean bool = true;
// 연산자에 따라 계산
if (str.equals("+")) {
result = firstNum + lastNum;
} else if (str.equals("-")) {
result = firstNum - lastNum;
} else if (str.equals("*")) {
result = firstNum * lastNum;
} else if (str.equals("/")) {
if (lastNum != 0) {
result = firstNum / lastNum;
} else {
System.out.println("오류: 0으로 나눌 수 없습니다.");
bool = false;
}
} else {
System.out.println("오류: 잘못된 연산자입니다.");
bool = false;
}
//딱 맞아 떨어지는데 뒤에 0 이 붙어있을때 맨 뒤의 0제거
String removeLastZero = Double.toString(result);
// 소수점 뒤에 0이 있는 경우 제거
if (removeLastZero.contains(".")) {
// 소수점 뒤의 0을 제거하고, 남은 문자열을 반환
removeLastZero = removeLastZero.replaceAll("0*$", "").replaceAll("\\.$", "");
}
//true 면 결과 출력
//한번더 계산 하는 문구 출력
if (bool) {
System.out.println("계산 결과: " + removeLastZero);
System.out.println("한번더 계산하시겠습니까? Y or N");
} else {
System.out.println("한번더 계산하시겠습니까? Y or N");
}
//한번더 원하는지 안원하는지 입력받기
keepStr = input.nextLine();
}
while (keepStr.equals("y") || keepStr.equals("Y"));
}
//입력한게 숫자 인지 아닌지 판별하기
public static Double inputIsNumber(String message, Scanner input) {
double num = 0;
boolean istrue = true;
while(istrue){
System.out.println(message);
try {
num = input.nextDouble();
input.nextLine();
istrue = false;
}catch(Exception e){ //
System.out.println("숫자가 아닙니다. 다시 입력해주세요!");
input.nextLine();
}
}
return num;
}
//다른 방법으로도 가능 -> hasNextDouble 방법으로
public static double firstLastDouble(String message, Scanner input) {
double num = 0;
boolean isTrue = true;
while(isTrue){
System.out.println(message);
if (input.hasNextDouble()) { // 입력값이 Double인지 확인
num = input.nextDouble();
input.nextLine();
isTrue = false;
} else {
System.out.println("숫자가 아닙니다. 다시 입력해주세요!");
input.nextLine();
}
}
return num;
}
}
강사님이랑 같이 한 코드
1. 숫자 검증 하기 전
package com.java.calculator;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
System.out.println("===Java Calculator===");
Scanner input = new Scanner(System.in);
/*
요구 사항에 따라 간단한 계산기를 만들어주세요.
1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두 번째 숫자를 받아야 합니다.
2. 연산자의 종류는 +, -, *, / 입니다.
3. 소수점 연산을 수행할 수 있어야 합니다.
4. 연산 결과를 콘솔에 출력합니다.
*/
//do-while 문을 사용하여 특정 문자열을 입력받기 전까지 계산 반복
String isNone = "";
do{
// 1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두번째 숫자를 받아야 합니다.
System.out.println("첫번째 숫자를 입력해주세요");
double leftOperand = input.nextDouble();
//아직 개행문자가 input 에 남아 있기 때문에, 자원 초기화
input.nextLine();
//출력확인
// System.out.println(leftOperand);
System.out.println("연산자를 입력해주세요");
String operator = input.nextLine();
// System.out.println(operator);
System.out.println("두번째 숫자를 입력해주세요");
double rightOperand = input.nextDouble();
input.nextLine();
//출력확인
// System.out.println(rightOperand);
// 2. 연산자의 종류는 +, -, *, / 입니다.
// 연산자 종류에 따라서 연산 이후 결과값 저장
//저장을 위한 변수 선언 및 초기화
double result = 0;
switch(operator){
case "+":
result = leftOperand + rightOperand;
break;
case "-":
result = leftOperand - rightOperand;
break;
case "*":
result = leftOperand * rightOperand;
break;
case "/":
result = leftOperand / rightOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다.");
continue;
}
System.out.printf("%f %s %f 의 경과는 : %f\n", leftOperand ,operator ,rightOperand ,result);
System.out.println("-".repeat(30));
System.out.println("다시 계산될까요? 아니면 Q 를 눌러주세요");
isNone = input.nextLine().toUpperCase();
}while (!isNone.equals("Q"));
}
}
2. 숫자 검증함 - 오류가 남
package com.java.calculator;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
System.out.println("===Java Calculator===");
Scanner input = new Scanner(System.in);
/*
요구 사항에 따라 간단한 계산기를 만들어주세요.
1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두 번째 숫자를 받아야 합니다.
2. 연산자의 종류는 +, -, *, / 입니다.
3. 소수점 연산을 수행할 수 있어야 합니다.
4. 연산 결과를 콘솔에 출력합니다.
*/
//do-while 문을 사용하여 특정 문자열을 입력받기 전까지 계산 반복
String isNone = "";
do{
// 1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두번째 숫자를 받아야 합니다.
System.out.println("첫번째 숫자를 입력해주세요");
double leftInput = input.nextDouble();
//아직 개행문자가 input 에 남아 있기 때문에, 자원 초기화
// input.nextLine();
//출력확인
// System.out.println(leftOperand);
System.out.println("연산자를 입력해주세요");
String operator = input.nextLine();
// System.out.println(operator);
System.out.println("두번째 숫자를 입력해주세요");
double rightInput = input.nextDouble();
// input.nextLine();
//출력확인
// System.out.println(rightOperand);
//숫자가 아닌 경우 다시 재 입력하도록 검증
double leftOperand, rightOperand;
if(isValidDigitString(leftInput) && isValidDigitString(rightInput)){
leftOperand = Double.parseDouble(leftInput);
rightOperand = Double.parseDouble(rightInput);
}else{
continue;
}
// 2. 연산자의 종류는 +, -, *, / 입니다.
// 연산자 종류에 따라서 연산 이후 결과값 저장
//저장을 위한 변수 선언 및 초기화
double result = 0;
switch(operator){
case "+":
result = leftOperand + rightOperand;
break;
case "-":
result = leftOperand - rightOperand;
break;
case "*":
result = leftOperand * rightOperand;
break;
case "/":
result = leftOperand / rightOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다.");
continue;
}
System.out.printf("%f %s %f 의 경과는 : %f\n", leftOperand ,operator ,rightOperand ,result);
System.out.println("-".repeat(30));
System.out.println("다시 계산될까요? 아니면 Q 를 눌러주세요");
isNone = input.nextLine().toUpperCase();
}while (!isNone.equals("Q"));
}
public static boolean isValidDigitString(String formula) {
//formula = "1234" 순회하며 검증해야 합니다.
// 이 문자열에서 각 하나의 문자가 0,1,2,3,4,5,6,7,8,9 인지 체크
// 아닌것을 만난 순간 false 리턴하고 바로 종료
String digit = "0123456789";
for(char c : formula.toCharArray()){
//문자열이 들어왔을때 ['1','2','3','4', ..... '9'] 이렇게 변환이 됨
if(digit.indexOf(c) == -1){
//c는 현재 돌고 있는 문자
//indexOf -> 가지고 있는지 확인하는 메서드 , 가지고 있지 않을 경우 -1 반환
//즉 -1 이 나오면 포함하고 있지 않기에 숫자가 아닌것을 가지고 있는것을 의미 할수 있음.
return false;
}
}
return true;
}
}
오류 -> 타입이 안맞음
3. 숫자에 . 이 몇개 있는지에 따라 boolean 돌아오는거 확인
package com.java.calculator;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
System.out.println("===Java Calculator===");
Scanner input = new Scanner(System.in);
/*
요구 사항에 따라 간단한 계산기를 만들어주세요.
1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두 번째 숫자를 받아야 합니다.
2. 연산자의 종류는 +, -, *, / 입니다.
3. 소수점 연산을 수행할 수 있어야 합니다.
4. 연산 결과를 콘솔에 출력합니다.
*/
//do-while 문을 사용하여 특정 문자열을 입력받기 전까지 계산 반복
String isNone = "";
do{
// 1. 사용자의 입력으로 첫 번째 숫자, 연산자, 두번째 숫자를 받아야 합니다.
System.out.println("첫번째 숫자를 입력해주세요");
String leftInput = input.nextLine();
//아직 개행문자가 input 에 남아 있기 때문에, 자원 초기화
// input.nextLine();
//출력확인
// System.out.println(leftOperand);
System.out.println("연산자를 입력해주세요");
String operator = input.nextLine();
// System.out.println(operator);
System.out.println("두번째 숫자를 입력해주세요");
String rightInput = input.nextLine();
// input.nextLine();
//출력확인
// System.out.println(rightOperand);
//숫자가 아닌 경우 다시 재 입력하도록 검증
double leftOperand, rightOperand;
if(isValidDigitString(leftInput) && isValidDigitString(rightInput)){
leftOperand = Double.parseDouble(leftInput);
rightOperand = Double.parseDouble(rightInput);
}else{
continue;
}
// 2. 연산자의 종류는 +, -, *, / 입니다.
// 연산자 종류에 따라서 연산 이후 결과값 저장
//저장을 위한 변수 선언 및 초기화
double result = 0;
switch(operator){
case "+":
result = leftOperand + rightOperand;
break;
case "-":
result = leftOperand - rightOperand;
break;
case "*":
result = leftOperand * rightOperand;
break;
case "/":
result = leftOperand / rightOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다.");
continue;
}
System.out.printf("%f %s %f 의 경과는 : %f\n", leftOperand ,operator ,rightOperand ,result);
System.out.println("-".repeat(30));
System.out.println("다시 계산될까요? 아니면 Q 를 눌러주세요");
isNone = input.nextLine().toUpperCase();
}while (!isNone.equals("Q"));
}
public static boolean isValidDigitString(String formula) {
//formula = "1234" 순회하며 검증해야 합니다.
// 이 문자열에서 각 하나의 문자가 0,1,2,3,4,5,6,7,8,9 인지 체크
// 아닌것을 만난 순간 false 리턴하고 바로 종료
String digit = "0123456789";
int dotCount = 0;
for(char c : formula.toCharArray()){
//문자열이 들어왔을때 ['1','2','3','4', ..... '9'] 이렇게 변환이 됨
if(digit.indexOf(c) == -1){
//c는 현재 돌고 있는 문자
//indexOf -> 가지고 있는지 확인하는 메서드 , 가지고 있지 않을 경우 -1 반환
//즉 -1 이 나오면 포함하고 있지 않기에 숫자가 아닌것을 가지고 있는것을 의미 할수 있음.
return false;
}
if(c == '.'){
dotCount++;
}
}
// return true;
if (dotCount <= 1){
return true;
}else {
return false;
}
}
}
작성중.... 다시 만들어보기
혼자 다시 순차적으로 정리 - 계산기 만들기
1. 피연산자와 연산자를 Scanner 로 출력가능하게 만들기
public class Calculator {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//operand = 피연산자
//operator = 연산자
//1. 첫번째 연산자 입력 출력
System.out.println("첫번째 숫자를 입력해주세요.");
double firstOperand = input.nextDouble();
input.nextLine();
//2. 연산자 출력
System.out.println("연산자를 입력해주세요.");
String operator = input.nextLine();
//3. 두번째 피연산자 입력 출력
System.out.println("두번째 숫자를 입력해주세요.");
double secondOperand = input.nextDouble();
input.nextLine();
}
}
2. 연산자 검증하여 계산 가능과 결과값 출력
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해주세요.");
double firstOperand = input.nextDouble();
input.nextLine();
System.out.println("연산자를 입력해주세요.");
String operator = input.nextLine();
System.out.println("두번째 숫자를 입력해주세요.");
double secondOperand = input.nextDouble();
input.nextLine();
double result = 0;
switch (operator){
case "+":
result = firstOperand + secondOperand;
break;
case "-":
result = firstOperand - secondOperand;
break;
case "*":
result = firstOperand * secondOperand;
break;
case "/":
result = firstOperand / secondOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다");
// continue;
}
System.out.printf("%f %s %f 의 결과는 : %f\n" , firstOperand , operator , secondOperand , result);
}
}
*여기서 continue 가 들어가지 못하는 이유는 반복문이 없으니까*
3. 연산식이 끝났을때 문자열을 받아서 연산을 계속 할지 말지 정하는 반복문 만들기
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String isNone = "";
do{
System.out.println("첫번째 숫자를 입력해주세요.");
double firstOperand = input.nextDouble();
input.nextLine();
System.out.println("연산자를 입력해주세요.");
String operator = input.nextLine();
System.out.println("두번째 숫자를 입력해주세요.");
double secondOperand = input.nextDouble();
input.nextLine();
double result = 0;
switch (operator){
case "+":
result = firstOperand + secondOperand;
break;
case "-":
result = firstOperand - secondOperand;
break;
case "*":
result = firstOperand * secondOperand;
break;
case "/":
result = firstOperand / secondOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다");
// continue;
}
System.out.printf("%f %s %f 의 결과는 : %f\n" , firstOperand , operator , secondOperand , result);
System.out.println("-".repeat(30));
System.out.println("다시 계산할까요? 아니면 Q를 눌러주세요");
isNone = input.nextLine().toUpperCase();
}while(!isNone.equals("Q"));
}
}
4. 피연산자에 숫자가 아닌것이 들어가진 않는지 검증
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String isNone = "";
do{
System.out.println("첫번째 숫자를 입력해주세요.");
String firstInput = input.nextLine();
System.out.println("연산자를 입력해주세요.");
String operator = input.nextLine();
System.out.println("두번째 숫자를 입력해주세요.");
String secondInput = input.nextLine();
double firstOperand, secondOperand;
if(isValidNumber(firstInput) && isValidNumber(secondInput)){
firstOperand = Double.parseDouble(firstInput);
secondOperand = Double.parseDouble(secondInput);
}else{
System.out.println("오류 : 숫자가 아닙니다. 다시 입력해주세요.");
continue;
}
double result = 0;
switch (operator){
case "+":
result = firstOperand + secondOperand;
break;
case "-":
result = firstOperand - secondOperand;
break;
case "*":
result = firstOperand * secondOperand;
break;
case "/":
result = firstOperand / secondOperand;
default:
System.out.println("잘못된 연산자를 입력했습니다");
continue;
}
System.out.printf("%f %s %f 의 결과는 : %f\n" , firstOperand , operator , secondOperand , result);
System.out.println("-".repeat(30));
System.out.println("다시 계산할까요? 아니면 Q를 눌러주세요");
isNone = input.nextLine().toUpperCase();
}while(!isNone.equals("Q"));
}
public static boolean isValidNumber(String formula) {
String digit = "0123456789";
for(char c : digit.toCharArray()){
if (formula.indexOf(c) == -1){
return false;
}
}
return true;
}
}
5. 숫자에 . 이 몇개 있는지에 따라 boolean 돌아오는거 확인
public static boolean isValidNumber(String formula) {
String digit = "0123456789";
int dotCount = 0;
for(char c : digit.toCharArray()){
if (formula.indexOf(c) == -1){
return false;
}
if(c == '.'){
dotCount++;
}
}
return dotCount <= 1 ? true : false;
}
*아래에만 추가*
6. 연산자가 ++ 나 1개가 아닌 다른 연산자가 들어오는 경우 boolean 검증 추가
public static boolean isValidOperator(String formula){
String operator = "+-*/";
if(formula.length() != 1) return false;
for(char c : formula.toCharArray()){
if(operator.indexOf(c) != -1){
return false;
}
}
return true;
}
*맨 아래 추가*
반응형