본문 바로가기
카테고리 없음

Java - 계산기 실습

by 삐약 개발자 2024. 11. 25.
반응형

혼자 했던 코드

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;
}

*맨 아래 추가*

반응형