본문 바로가기

카테고리 없음

과제 계산기2

6.

연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 
저장될 수 있도록 소스 코드를 수정합니다.
현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고 새로운 결과 값이 
마지막 index에 저장될 수 있도록 구현합니다.
Hint : 결과 값들이 한칸씩 앞으로 이동되면 되지 않을까?
public class App {
    public static void main(String[] args) {
        ...
        System.out.println("결과: " + result);
        ...
        /* 위 요구사항에 맞게 구현 */
        ...
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

이것은

 

// 연산 결과를 배열에 저장.
if (index < intArray.length) {//이걸로 인트어레이가 인덱스보다 많은지 검사
    intArray[index] = result;//이 문장은 연산의 결과를 intArray의 index 위치에 저장 예를 들어, index가 0이면, result는 배열의 첫 번째 위치에 저장
    index++;//저장하면 1증가
    System.out.println("현재 저장된 결과의 수: " + index);//얼마나 저장했는지 보여줌
} else {
    System.out.println("저장 공간이 차서 첫번째 결과값을 지우고 이번 결과 값을 넣었습니다.");//그냥 안내용

    for (int i = 0; i < intArray.length - 1; i++) {
        intArray[i] = intArray[i + 1];//10개다 차면 -1하고 뒤에게 앞으로 한칸씩 이동
    }
    intArray[intArray.length - 1] = result;//마지막 배열에 현재 결과값 입력
}

 

이렇게 10개 이상부턴 하나씩지워지고 최신걸로 하나씩 밀어내는걸 만들수 있었다.

 

7.

결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)
“remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.

public class App {
    public static void main(String[] args) {
		    /* 적합한 컬렉션 타입의 변수 선언 */
        ...
        System.out.println("결과: " + result);
        /* 배열에서 컬렉션으로 변경됨으로써 변경해야하는 부분 구현 */
        System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
        /* 위 요구사항에 맞게 구현 */
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

이건 이렇게

 

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Objects;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //jcf는 list, set, map이 있는데 list 사용
        ArrayList<Integer> resultList = new ArrayList<>();//이건 크기가 정해지지 않아서 맘대로 추가, 삭제 가능
//        int[] intArray = new int[10];
        // 배열의 마지막 인덱스를 저장하는 변수를 선언합니다.
        int index = 0;

        while (true) {//반복을 시작하기위해 추가
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1;
            try {
                num1 = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
                return;
            }

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);// 사칙연산은 한글자니 char, 연산자는 operator를 써야한다.
            //charAt(0) 메서드는 문자열에서 첫 번째 문자를 추출하는 역할을 한다.사용자가 "+" 문자열을 입력하면 sc.next()는 "+" 문자열을 반환하고, charAt(0)은 이 문자열의 첫 번째 문자인 '+'를 추출하고 이렇게 추출된 문자는 char 타입으로 처리된다.


            System.out.print("두 번째 숫자를 입력하세요: ");
            int num2;
            try {
                num2 = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
                return;
            }//InputMismatchException으로 한 이유는 숫자를 안넣었을때 뜨는에러가 InputMismatch였기 때문이다.

            int result = 0;//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
            if (operator == '+') {
                result = num1 + num2;
            } else if (operator == '-') {
                result = num1 - num2;
            } else if (operator == '*') {
                result = num1 * num2;
            } else if (operator == '/') {
                if (num2 == 0) {
                    System.out.println("0으로 나눌 수 없습니다.");//이걸로 두번째 숫자가 0이면 나누기가 안되게 설정
                    return;
                }
                result = num1 / num2;
            } else {
                System.out.println("잘못된 연산자입니다.");
                return;
            }

            System.out.println("결과: " + result);




//            if (index < intArray.length) {//이걸로 인트어레이가 인덱스보다 많은지 검사
//                intArray[index] = result;//이 문장은 연산의 결과를 intArray의 index 위치에 저장 예를 들어, index가 0이면, result는 배열의 첫 번째 위치에 저장
//                index++;//저장하면 1증가
//                System.out.println("현재 저장된 결과의 수: " + index);//얼마나 저장했는지 보여줌
//            } else {
//                System.out.println("저장 공간이 차서 첫번째 결과값을 지우고 이번 결과 값을 넣었습니다.");//그냥 안내용
//
//                for (int i = 0; i < intArray.length - 1; i++) {
//                    intArray[i] = intArray[i + 1];//10개다 차면 -1하고 뒤에게 앞으로 한칸씩 이동
//                }
//                intArray[intArray.length - 1] = result;//마지막 배열에 현재 결과값 입력
//            }

            System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
            String text = sc.next();//밑에 있던걸 옮긴거뿐
            if (Objects.equals(text, "remove")) {
                if (!resultList.isEmpty()) {//결과가 비었는지 확인
                    resultList.remove(0);//차있으면 첫번째(0)를 삭제
                    System.out.println("첫번째 결과가 삭제되었습니다.");
                } else {
                    System.out.println("저장된 결과가 없습니다.");
                }
            } else {
                resultList.add(result);
                System.out.println("현재 저장된 결과의 수: " + resultList.size());
            }

            //반복의 끝의 시작
            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            /* exit을 입력 받으면 반복 종료 */
            if (Objects.equals(text, "exit")) {
                break;// 반복의 끝
            }
        }
    }
}

 

JCF로 list인  ArrayList<Integer> resultList = new ArrayList<>();를 사용해 문한히 배열이 이어지도록 하고

remove 입력하면 맨 처음걸 삭제하도록 변경

 

8.

“inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
foreach(향상된 for문)을 활용하여 구현 해봅니다.
public class App {
    public static void main(String[] args) {
        ...
        System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
        ...
        System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
        /* 위 요구사항에 맞게 구현 */
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

이것을 구현하기 위해

 

 

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Objects;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //jcf는 list, set, map이 있는데 list 사용
        ArrayList<Integer> resultList = new ArrayList<>();
        int index = 0;

        while (true) {//반복을 시작하기위해 추가
            try {// 틀려도 종료되지 않기 위해 이거 전체를 try catch로 감싸기 그래서 하나씩 감싼것도 없앴다.
                System.out.print("첫 번째 숫자를 입력하세요: ");
                int num1 = sc.nextInt();

                System.out.print("사칙연산 기호를 입력하세요: ");
                char operator = sc.next().charAt(0);// 사칙연산은 한글자니 char, 연산자는 operator를 써야한다.
                //charAt(0) 메서드는 문자열에서 첫 번째 문자를 추출하는 역할을 한다.사용자가 "+" 문자열을 입력하면
                // sc.next()는 "+" 문자열을 반환하고, charAt(0)은 이 문자열의 첫 번째 문자인 '+'를 추출하고 이렇게 추출된
                // 문자는 char 타입으로 처리된다.

                System.out.print("두 번째 숫자를 입력하세요: ");
                int num2 = sc.nextInt();

                int result = 0;
                if (operator == '+') {//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
                    result = num1 + num2;
                } else if (operator == '-') {
                    result = num1 - num2;
                } else if (operator == '*') {
                    result = num1 * num2;
                } else if (operator == '/') {
                    if (num2 == 0) {
                        System.out.println("0으로 나눌 수 없습니다.");
                        continue;
                    }
                    result = num1 / num2;
                } else {
                    System.out.println("잘못된 연산자입니다.");
                    continue;
                }
                // 결과를 위로 옮긴 이유는, 밑으로 하니까 inquiry 입력시 최근걸 저장하기전에 출력을 해서 바로 전 결과물은 출력을 못해서 먼저 자장하도록 옮김
                System.out.println("결과: " + result);
                resultList.add(result);
                System.out.println("현재 저장된 결과의 수: " + resultList.size());

                System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? 아니면 결과들을 보시겠습니까? (remove 입력 시 삭제, inquiry 입력시 결과 출력)");
                String text = sc.next();
                if (Objects.equals(text, "remove")) {
                    if (!resultList.isEmpty()) {//결과가 비었는지 확인
                        resultList.remove(0);//차있으면 첫번째(0)를 삭제
                        System.out.println("첫번째 결과가 삭제되었습니다.");
                    } else {
                        System.out.println("저장된 결과가 없습니다.");
                    }
                } else if (Objects.equals(text, "inquiry")) {//remove처럼 똑같이 입력 가능 비어있지 않으면 결과출력
                    if (!resultList.isEmpty()) {
                        System.out.println("저장된 연산 결과:");
                        resultList.forEach(System.out::println);//향상된 for인 foreach 사용
                    } else {
                        System.out.println("저장된 결과가 없습니다.");
                    }
                }

                System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                text = sc.next();
                if (Objects.equals(text, "exit")) {
                    break;
                }
            } catch (InputMismatchException e) {
                System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
                sc.next();// 이걸로 틀린거 입력시에도 다시 입력가능
            }
        }
    }
}
            
        }
    }
}

 

먼저 실수로 입력할때마다 재실행 되는게 버거워서 try catch로 전체를 감싼뒤 catch (InputMismatchException e) {
                System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
                sc.next();// 이걸로 틀리면 재실행이 아니라 다시 입력하도록 했고

 

else if (Objects.equals(text, "inquiry")) {//remove처럼 똑같이 입력 가능 비어있지 않으면 결과출력
    if (!resultList.isEmpty()) {
        System.out.println("저장된 연산 결과:");
        resultList.forEach(System.out::println);//향상된 for인 foreach 사용
    } else {
        System.out.println("저장된 결과가 없습니다.");
    }

 

이걸로 inquiry 입력시 저장한 결과들이 출력되게 했다.

과제대로 foreach를 썻으며 원래 remove같은 문자 입력 밑에 저장을 놓으니 문자 입력시엔 최근게 저장되지않아서

inquiry 쓰면 최근것을 출력하지 않아서

 

System.out.println("결과: " + result);
resultList.add(result);
System.out.println("현재 저장된 결과의 수: " + resultList.size());

System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? 아니면 결과들을 보시겠습니까? (remove 입력 시 삭제, inquiry 입력시 결과 출력)");
String text = sc.next();
if (Objects.equals(text, "remove")) {
    if (!resultList.isEmpty()) {//결과가 비었는지 확인
        resultList.remove(0);//차있으면 첫번째(0)를 삭제
        System.out.println("첫번째 결과가 삭제되었습니다.");
    } else {
        System.out.println("저장된 결과가 없습니다.");
    }

 

이렇게 결과를 먼저 저장하게 했다.

 

그리고 따로 나뉘어진 try catch를 전체를 감싸게 바꾸고 

 catch (InputMismatchException e) {
    System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
    sc.next();// 이걸로 틀린거 입력시에도 다시 입력가능

이걸로 틀렸을때 칼터럼 종료되 다시실행을 안해도 되게 고쳤다.

 

 

양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(+,-,*,/) 기능을 수행한 후 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
나눗셈에서 분모에 0이 들어오거나 연산자 기호가 잘 못 들어온 경우 적합한 Exception 클래스를 생성하여 throw 합니다. (매개변수로 해당 오류 내용을 전달합니다.)
public class Calculator {
    /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */

    public 반환타입 calculate(...매개변수) {
        /* 위 요구사항에 맞게 구현 */
        /* return 연산 결과 */
    }

 

 

import java.util.ArrayList;

public class Calculator {
    private ArrayList<Integer> resultList = new ArrayList<>();

    public int calculate(int num1, int num2, char operator) throws IllegalArgumentException {
        int result;
        if (operator == '+') {
            result = num1 + num2;
        } else if (operator == '-') {
            result = num1 - num2;
        } else if (operator == '*') {
            result = num1 * num2;
        } else if (operator == '/') {
            if (num2 == 0) {
                throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
            }
            result = num1 / num2;
        } else {
            throw new IllegalArgumentException("잘못된 연산자입니다.");
        }
        resultList.add(result);
        return result;
    }


}
import java.util.ArrayList;
import java.util.List;

public class Calculator {
    private List<Double> results = new ArrayList<>();

    public double calculate(double num1, double num2, String operator) throws IllegalArgumentException, ArithmeticException {
        double result;
        switch (operator) {
            case "+":
                result = num1 + num2;
                break;
            case "-":
                result = num1 - num2;
                break;
            case "*":
                result = num1 * num2;
                break;
            case "/":
                if (num2 == 0) {
                    throw new ArithmeticException("Division by zero");
                }
                result = num1 / num2;
                break;
            default:
                throw new IllegalArgumentException("Invalid operator: " + operator);
        }
        results.add(result);
        return result;
    }

    public List<Double> getResults() {
        return results;
    }
}

우선은 이렇게 해봤다.

 

2.

2. Level 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정합니다.
    - 연산 수행 역할은 Calculator 클래스가 담당합니다.
        - 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장됩니다.
    - 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다.
    
    ```java
    public class App {
        public static void main(String[] args) {
            /* Calculator 인스턴스 생성 */
    
            Scanner sc = new Scanner(System.in);
    
            /* 반복문 시작 */
                System.out.print("첫 번째 숫자를 입력하세요:");
                int num1 = sc.nextInt();
                System.out.print("두 번째 숫자를 입력하세요:");
                int num2 = sc.nextInt();
    
                System.out.print("사칙연산 기호를 입력하세요: ");
                char operator = sc.next().charAt(0);
    
                /* 위 요구사항에 맞게 소스 코드 수정 */
    
                System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                ...
            /* 반복문 종료 */
        }
    }

 

이걸하려면, 아까만든 계산기 클래스에 게산을 넘기고 app클래스는 결과 출력만 하면 된다.

 

 

 

 

public ArrayList<Integer> getResultList() {
    return resultList;// 이게있어야 계산기가 결과를 저장할수있다.
}

 

이걸 계산기에 추가해서 계산 결과가 Calculator 클래스의 연산 결과를 저장하는 필드에 저장되도록 한다.

//                int result = 0;
//                if (operator == '+') {//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
//                    result = num1 + num2;
//                } else if (operator == '-') {
//                    result = num1 - num2;
//                } else if (operator == '*') {
//                    result = num1 * num2;
//                } else if (operator == '/') {
//                    if (num2 == 0) {
//                        System.out.println("0으로 나눌 수 없습니다.");
//                        continue;
//                    }
//                    result = num1 / num2;
//                } else {
//                    System.out.println("잘못된 연산자입니다.");
//                    continue;
//                }

                int result = calculator.calculate(num1, num2, operator);// 계산기에 접속해 계산

이렇게  앱 클래스가 하고있던 계산기능을 없애고 int result = calculator.calculate(num1, num2, operator); 이걸로 계산을 떠넘긴다.