• Homework(3)

    2021. 6. 21.

    by. 와트


    ※. 문제. 정수 두개를 입력 받고, 연산자(+,-,*,/)를 입력받은 다음 계산한 뒤 결과를 출력하는 계산기 프로그램을 만들어보세요. (음수가 입력되거나 +,-,*,/ 이외의 문자가 입력되면 "잘못 입력 하셨습니다. 프로그램을 종료합니다." 라는 문구 출력)

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        public void calculator() {
            Scanner sc = new Scanner(System.in);
            System.out.println("정수1을 입력하시오 > ");
            int num1 = sc.nextInt();
            System.out.println("정수2를 입력하시오 > ");
            int num2 = sc.nextInt();
            
            if(num1 <= 0 || num2 <= 0) {
                System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
                return;
            }
            
            System.out.println("연산자를 입력하시오 > ");
            char op = sc.next().charAt(0);
            
            if(op != '+' && op != '-' && op != '*' && op != '/') {
                System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
                return;
            }
            
            System.out.printf("입력 %d, %d, %c%n", num1, num2, op);
            if(op == '+') {
                System.out.printf("%d %c %d = %d",num1, op, num2, num1+num2);
            }
            else if(op == '-') {
                System.out.printf("%d %c %d = %d",num1, op, num2, num1-num2);
            }
            else if(op == '*') {
                System.out.printf("%d %c %d = %d",num1, op, num2, num1*num2);
            }
            else if(op == '/') {
                System.out.printf("%d %c %d = %d",num1, op, num2, num1/num2);
            }
            
        }
    cs

    조기 리턴을 이용해서 사칙연산 계산 전에 잘못된 값은 모두 중간에 멈추는 쪽으로 프로그래밍했다.

    계산기는 간단한 만큼 결과를 내는 방법도 다양한데 여기서는 char형으로 사칙연산 기호를 받는 방법을 이용했다.

     

    여기서 조기 리턴 값을 boolean으로 정리하고 결괏값을 int로 정리하면 더 깔끔한 코드가 나온다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        public void calculator2() {
            Scanner sc = new Scanner(System.in);
            System.out.println("정수1을 입력하시오 > ");
            int num1 = sc.nextInt();
            System.out.println("정수2를 입력하시오 > ");
            int num2 = sc.nextInt();
            
            System.out.println("연산자를 입력하시오 > ");
            char op = sc.next().charAt(0);
            
            boolean bool1 = num1 <= 0 || num2 <= 0;
            boolean bool2 = op == '+' && op == '-' && op == '*' && op == '/';
            
            if(!bool1 || !bool2) {
                System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
                return//조기 리턴
            }
            
            System.out.printf("입력 %d, %d, %c%n", num1, num2, op);
            int result = 0;
                
            if(op == '+') {
            result = num1 + num2;
            }
            else if(op == '-') {
            result = num1 - num2;
            }
            else if(op == '*') {
            result = num1 * num2;
            }
            else if(op == '/') {
            result = num1 / num2;
            }
            System.out.printf("%d %c %d = %d",num1, op, num2, result);
        }
    cs

     

    그리고 오늘 배운 switch문을 if문 대신 활용해도 좋을 듯하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
        public void calculator3() {
            Scanner sc = new Scanner(System.in);
            System.out.println("정수1을 입력하시오 > ");
            int num1 = sc.nextInt();
            System.out.println("정수2를 입력하시오 > ");
            int num2 = sc.nextInt();
            
            System.out.println("연산자를 입력하시오 > ");
            char op = sc.next().charAt(0);
            
            boolean bool = num1 <= 0 || num2 <= 0;
            
            if(!bool) {
                System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
                return//조기 리턴
            }
            
            System.out.printf("입력 %d, %d, %c%n", num1, num2, op);
            int result = 0;
                
            switch(op) {
            case '+' : result = num1 + num2;
            break;
            case '-' : result = num1 - num2;
            break;
            case '*' : result = num1 * num2;
            break;
            case '/' : result = num1 / num2;
            break;
            default : System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
            return;
            }
            System.out.printf("%d %c %d = %d",num1, op, num2, result);
        }
    cs

    이건 개인 취향 문제인 듯. 나는 switch문이 봤을 때 더 깔끔해 보여서 마음에 든다.

     

    +) 연산자를 String으로 받았을 때는 해당 값의 비교가 참조형이기 때문에 equals 메소드를 이용해야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        public void calculator4() {
            Scanner sc = new Scanner(System.in);
            System.out.println("정수1을 입력하시오 > ");
            int num1 = sc.nextInt();
            System.out.println("정수2를 입력하시오 > ");
            int num2 = sc.nextInt();
            
            System.out.println("연산자를 입력하시오 > ");
            String op = sc.next();
            
            boolean bool1 = num1 <= 0 || num2 <= 0;
            boolean bool2 = op.equals("+"|| op.equals("-"|| op.equals("*"|| op.equals("/");
            
            if(!bool1 || !bool2) {
                System.out.println("잘못 입력하셨습니다. 프로그램을 종료합니다.");
                return//조기 리턴
            }
            
            System.out.printf("입력 %d, %d, %c%n", num1, num2, op);
            int result = 0;
                
            if(op.equals("+")) {
            result = num1 + num2;
            }
            else if(op.equals("-")) {
            result = num1 - num2;
            }
            else if(op.equals("*")) {
            result = num1 * num2;
            }
            else if(op.equals("/")) {
            result = num1 / num2;
            }
            System.out.printf("%d %s %d = %d",num1, op, num2, result);
        }
    cs

     

    ※문제. 두 메뉴를 순서대로 제시하고, 각각 사용자 선택 번호를 받아 계산 결과를 도출하세요.

    *********주메뉴*********
    a. 불고기버거 ------------5000
    b. 새우버거 --------------4000
    c. 치킨버거 --------------4500
    d. 한우버거 -------------10000
    e. 디버거 ----------------7000
    ***********************

    *******사이드메뉴********
    1. 콜라 -------------------1500
    2. 사이다 -----------------1500
    3. 밀크쉐이크-------------2500
    4. 레드불------------------3000
    *********************** 

    예) 주메뉴에서 a, 선택후 사이드메뉴에서 4 선택시
    "불고기버거, 레드불은 총 8000원입니다" 출력.
    메뉴 선택시 다른문자를 입력하면 "번호를 잘못 누르셨습니다. 영업을 종료합니다." 출력
    더보기

    너무 길어져서 메소드를 메인메뉴 입력 메소드 하나, 사이드 입력 메소드 하나, 토탈 메소드 하나 이렇게 만들었다.

    근데 굳이 나눌 필요 없었던 것 같다... 오히려 더 번잡스러워진 것 같기도.

    return값으로 돌려받을 수 있는 값이 어차피 하나라서 더 많은 정보를 넣을 수가 없다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public char mainMenuInput() {
            System.out.println("**********주메뉴**********");
            System.out.println("a. 불고기버거 ----------5000");
            System.out.println("b. 새우버거 -----------4000");
            System.out.println("c. 치킨버거 -----------4500");
            System.out.println("d. 한우버거 ----------10000");
            System.out.println("e. 디버거 -------------7000");
            System.out.println("************************\n");
            
            Scanner sc = new Scanner(System.in);
            System.out.println("주메뉴를 선택하시오 > ");
            char mainNum = sc.next().charAt(0);
            return mainNum;
        }
    cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public int sideMenuInput() {
            System.out.println("*********사이드메뉴*********");
            System.out.println("1. 콜라 --------------1500");
            System.out.println("2. 사이다 -------------1500");
            System.out.println("3. 밀크쉐이크 ----------2500");
            System.out.println("4. 레드불 -------------3000");
            System.out.println("************************\n");
            
            Scanner sc = new Scanner(System.in);
            System.out.println("사이드메뉴를 선택하시오 > ");
            int sideNum = sc.nextInt();
            return sideNum;
        }
    cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
        public void total() {
     
            String mainName = "";
            String sideName = "";
            int mainPrice = 0;
            int sidePrice = 0;
            char mainChoice = mainMenuInput();
     
            if(mainChoice == 'a') {
                mainName = "불고기버거";
                mainPrice = 5000;
            }
            else if(mainChoice == 'b') {
                mainName = "새우버거";
                mainPrice = 4000;
            }
            else if(mainChoice == 'c') {
                mainName = "치킨버거";
                mainPrice = 4500;
            }
            else if(mainChoice == 'd') {
                mainName = "한우버거";
                mainPrice = 10000;
            }
            else if(mainChoice == 'e'){
                mainName = "디버거";
                mainPrice = 7000;
            }
            else{
                System.out.println("번호를 잘못 누르셨습니다. 영업을 종료합니다.");
                return;
            }
            
            int sideChoice = sideMenuInput();
     
            if(sideChoice == 1) {
                sideName = "콜라";
                sidePrice = 1500;
            }
            else if(sideChoice == 2) {
                sideName = "사이다";
                sidePrice = 1500;
            }
            else if(sideChoice == 3) {
                sideName = "밀크쉐이크";
                sidePrice = 2500;
            }
            else if(sideChoice == 4){
                sideName ="레드불";
                sidePrice = 3000;
            }
            else{
                System.out.println("번호를 잘못 누르셨습니다. 영업을 종료합니다.");
                return;
            }
     
            System.out.printf("%s, %s은(는) 총 %d원입니다.",mainName, sideName, mainPrice + sidePrice);
        }
    cs

     

    그리고 복합대입연산자를 쓰면 이렇게 코드가 깔끔해지는 것을...

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
        public void test1() {
            String userSelectMenuStr = "";
            int total = 0;
            
            System.out.println("**********주메뉴**********");
            System.out.println("a. 불고기버거 ----------5000");
            System.out.println("b. 새우버거 -----------4000");
            System.out.println("c. 치킨버거 -----------4500");
            System.out.println("d. 한우버거 ----------10000");
            System.out.println("e. 디버거 -------------7000");
            System.out.println("************************\n");
            
            Scanner sc = new Scanner(System.in);
            System.out.println("주메뉴를 선택하시오 > ");
            char mainSelect = sc.next().charAt(0);
            if(mainSelect == 'a') {
                userSelectMenuStr += "불고기버거, ";
                total += 5000;
            }
            else if(mainSelect == 'b') {
                userSelectMenuStr += "새우버거, ";
                total += 4000;
            }
            else if(mainSelect == 'c') {
                userSelectMenuStr += "치킨버거, ";
                total += 4500;
            }
            else if(mainSelect == 'd') {
                userSelectMenuStr += "한우버거, ";
                total += 10000;    
            }
            else if(mainSelect == 'e') {
                userSelectMenuStr += "디버거, ";
                total += 7000;
            }
            else{
                System.out.println("번호를 잘못 누르셨습니다. 영업을 종료합니다.");
                return;
            }
            
            
            System.out.println("*********사이드메뉴*********");
            System.out.println("1. 콜라 --------------1500");
            System.out.println("2. 사이다 -------------1500");
            System.out.println("3. 밀크쉐이크 ----------2500");
            System.out.println("4. 레드불 -------------3000");
            System.out.println("************************\n");
            
            System.out.println("사이드메뉴를 선택하시오 > ");
            int sideSelect = sc.nextInt();
            
            if(sideSelect == 1) {
                userSelectMenuStr += "콜라";
                total += 1500;
            }
            else if(sideSelect == 2) {
                userSelectMenuStr += "사이다";
                total += 1500;
            }
            else if(sideSelect == 3) {
                userSelectMenuStr += "밀크쉐이크";
                total += 2500;
            }
            else if(sideSelect == 4) {
                userSelectMenuStr += "레드불";
                total += 3000;
            }
            else{
                System.out.println("번호를 잘못 누르셨습니다. 영업을 종료합니다.");
                return;
            }
            
            System.out.printf("%s은(는) 총 %d원입니다.",userSelectMenuStr, total);
        }
    cs

     

    위 문제와 마찬가지로 switch문도 사용 가능하다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
        public void test() {
            String menu = "";
            int price = 0;
            
            System.out.println("**********주메뉴**********");
            System.out.println("a. 불고기버거 ----------5000");
            System.out.println("b. 새우버거 -----------4000");
            System.out.println("c. 치킨버거 -----------4500");
            System.out.println("d. 한우버거 ----------10000");
            System.out.println("e. 디버거 -------------7000");
            System.out.println("************************\n");
            
            Scanner sc = new Scanner(System.in);
            System.out.println("주메뉴를 선택하시오 > ");
            char mainNum = sc.next().charAt(0);
     
            switch(mainNum){
            case 'a' : 
                menu += "불고기버거, ";
                price += 5000;
                break;
            case 'b' :
                menu += "새우버거, ";
                price += 4000;
                break;
            case 'c' :
                menu += "치킨버거, ";
                price += 4500;
                break;
            case 'd' :
                menu += "한우버거, ";
                price += 10000;
                break;
            case 'e' :
                menu += "디버거, ";
                price += 7000;
                break;
            default : System.out.println("번호를 잘못 누르셨습니다. 영업을 종료합니다."); return;
            }
            
            System.out.println("*********사이드메뉴*********");
            System.out.println("1. 콜라 --------------1500");
            System.out.println("2. 사이다 -------------1500");
            System.out.println("3. 밀크쉐이크 ----------2500");
            System.out.println("4. 레드불 -------------3000");
            System.out.println("************************\n");
     
            System.out.println("사이드메뉴를 선택하시오 > ");
    //        int sideNum = sc.nextInt(); //1. 문자열을 읽어와서, 2. int형으로 형변환
            
            String sideSelectStr = sc.next(); //1. 문자열을 읽어와서
            //이게 숫자인지 검사
            char ch = sideSelectStr.charAt(0);
            if(!Character.isDigit(ch)) {
                System.out.println("숫자를 입력하셔야 합니다.");
                return;
            }
            int sideNum = Integer.parseInt(sideSelectStr); //2. int형으로 형변환
            
            switch(sideNum) {
            case 1 : 
                menu += "콜라";
                price += 1500;
                break;
            case 2 : 
                menu += "사이다";
                price += 1500;
                break;
            case 3 :
                menu += "밀크쉐이크";
                price += 2500;
                break;
            case 4 :
                menu += "레드불";
                price += 3000;
                break;
            default : System.out.println("번호를 잘못 누르셨습니다. 프로그램을 종료합니다."); return;
            }
            
            System.out.printf("%s는 %d원입니다.", menu, price);
        }
    cs

    사이드 메뉴에서 문자가 숫자가 아닌 경우에는 nextInt()로 자동 int형변환이 되는 메소드를 사용하지 않고 이를 직접 단계를 나누어야 한다.

     

    ※ 문제. 가위바위보 게임

     =======가위 바위 보 게임======
     숫자를 선택하세요(1. 가위/ 2. 바위/ 3. 보) : 1
     ======= 결과 =======
     당신은 가위를 냈습니다.
     컴퓨터는 보를 냈습니다.
     ===================
     당신이 이겼습니다. ㅠ.ㅠ
    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
        public void result() {
            String player = "";
            String computer = "";
            System.out.println("==========가위 바위 보 게임=========");
            int play = player();
            int com = computer();
            
            if(play == 1) {
                player = "가위";
            }
            else if(play == 2) {
                player = "바위";
            }
            else if(play == 3) {
                player = "보";
            }
            else {
                System.out.println("잘못 입력하셨습니다.");
                return;
            }
     
            if(com == 1) {
                computer = "가위";
            }
            else if(com == 2) {
                computer = "바위";
            }
            else if(com == 3) {
                computer = "보";
            }
            System.out.println("========== 결과 ==========");
            System.out.printf("당신은 %s를 냈습니다.%n컴퓨터는 %s를 냈습니다.%n",player, computer);
            System.out.println("========================");
     
            if(play != com) {
                if((play == 1 && com == 3|| (play == 2 && com == 1|| (play == 3 && com == 2)) {
                System.out.println("당신이 이겼습니다. ㅠ.ㅠ");
            }
                else {
                System.out.println("당신이 졌습니다. ^.^");
                }
            }else {
                System.out.println("비겼습니다. ~.~");
            }
        }
        
        public int player() {
            Scanner sc = new Scanner(System.in);
            System.out.println("숫자를 선택하세요(1. 가위/ 2. 바위/ 3. 보) : ");
            int play = sc.nextInt();
            return play;
        }
        
        public int computer() {
            Random rnd = new Random();
            int com = rnd.nextInt(3)+1;
            return com;
        }
    cs

    이 문제도 컴퓨터와 플레이어 각각 1, 2, 3이 나왔을 때 이를 가위, 바위, 보로 치환하기가 반복이 되니 보기가 별로였다.

    다른 방법이 있을 것 같았지만 모르겠어서 일단은 이렇게 만들었었다.

     

    여기선 삼항연산자를 활용하면 답이 더 깔끔하다.

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        public void rockPaperScissors() {
            Scanner sc = new Scanner(System.in);
            Random rnd = new Random();
            
            System.out.println("=== 가위 바위 보 게임 ===");
            System.out.print("숫자를 선택하세요(1.가위/2.바위/3.보) : ");
            
            int userNo = sc.nextInt();
            int comNo = rnd.nextInt(3+ 1;
            
            String user = userNo == 1 ? "가위" : (userNo == 2 ? "바위" : "보"); 
            String com = comNo == 1 ? "가위" : (comNo == 2 ? "바위" : "보"); 
            
            System.out.println("======= 결과 =======");
            System.out.println("당신은 " + user + "를 냈습니다");
            System.out.println("컴퓨터는 " + com + "를 냈습니다");
            
            System.out.println("===================");
            
            //실행결과
            if (comNo == userNo)
                System.out.print("비겼습니다.");
            else if ((comNo == 1 && userNo == 2)||(comNo == 2 && userNo == 3)||(comNo == 3 && userNo == 1))
                System.out.print("당신이 이겼습니다."); 
            else if ((comNo == 1 && userNo == 3)||(comNo == 2 && userNo == 1)||(comNo == 3 && userNo == 2))
                System.out.print("당신이 졌습니다."); 
        }    
    cs

    '혼자 있는 방 > Java' 카테고리의 다른 글

    Homework(5)  (0) 2021.06.23
    Homework(4)  (0) 2021.06.22
    Homework(2)  (0) 2021.06.18
    Homework(1)  (0) 2021.06.17
    자바 라이브러리  (0) 2021.06.07

    댓글

Designed by Nana