본문 바로가기

카테고리 없음

과제 계산기

먼저 새로 프로젝트를 만든다. 밑에 제너레이터는 건들면 안된다. 그냥 계산기니까.

 

  1. Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있습니다.
    • 양의 정수는 각각 하나씩 전달 받습니다.
      • 양의 정수는 적합한 타입으로 선언한 변수에 저장합니다.
public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력하세요: ");
        // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
		    System.out.print("두 번째 숫자를 입력하세요: ");
        // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
    }
}

 

이걸 완료 하려면,

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

        System.out.print("첫 번째 숫자를 입력하세요: ");
        int num1 = sc.nextInt(); // Scanner를 사용하여 양의 정수를 입력받고 int 타입의 변수 num1에 저장합니다.
        System.out.print("두 번째 숫자를 입력하세요: ");
        int num2 = sc.nextInt(); // Scanner를 사용하여 양의 정수를 입력받고 int 타입의 변수 num2에 저장합니다.
    }
}

이렇게 해서 숫자를 하나씩 두번 입력하고 적절히 저장이 되도록 한다.

 

2. Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있습니다.

  • 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다. (charAt(0))
public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ...
        System.out.print("사칙연산 기호를 입력하세요: ");
        // 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다. 
    }
}

이것은 

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

        System.out.print("첫 번째 숫자를 입력하세요: ");
        int num1 = sc.nextInt(); // Scanner를 사용하여 양의 정수를 입력받고 int 타입의 변수 num1에 저장합니다.

        System.out.print("사칙연산 기호를 입력하세요: ");
        char operator = sc.nextLine().charAt(0);

        System.out.print("두 번째 숫자를 입력하세요: ");
        int num2 = sc.nextInt(); // Scanner를 사용하여 양의 정수를 입력받고 int 타입의 변수 num2에 저장합니다.
    }
}

이렇게 숫자 사이에 charAt(0)와 그 밑에 연산자를 의미하는 operator, 숫자가 아니라서 nextline을 써봤는데,

첫 숫자를 입력하면 

 

사칙연산 기호를 입력하세요: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
at java.base/java.lang.String.charAt(String.java:1517)
at App.main(App.java:12)

 

이러길레

next()로 바꾸자

 

첫 번째 숫자를 입력하세요: 1
사칙연산 기호를 입력하세요: -
두 번째 숫자를 입력하세요: 2 이렇게 잘된다.

 

charAt(0)을 쓰냐면

charAt(0) 메서드는 문자열에서 첫 번째 문자를 추출하는 역할을 한다.

 

예를 들어, 사용자가 "+" 문자열을 입력하면 sc.next()는 "+" 문자열을 반환하고, charAt(0)은 이 문자열의 첫 번째 문자인 '+'를 추출하고 이렇게 추출된 문자는 char 타입으로 처리된다.

라는 능력을 가지기 때문

 

디음 과제는

 

3. 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력합니다.

  • 사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행합니다.
  • 입력받은 연산 기호를 구분하기 위해 제어문을 사용합니다. (e.g.if, switch)
  • 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력합니다.
    • e.g. “나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다. “

우선 이걸 위해서 

 

 

import java.util.InputMismatchException;
import java.util.Scanner;

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

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

 

 

잣업할때, 배웠던 operator.equals을 쓰려니까 빨갛게 오류가 뜨는걸 알아보니, char인지라 그걸 쓸수없다는걸 알고 ==로 바꿨다.

 

그리고 연산오류를 나타내기 위해 잘못된 숫자를 입력할경우를 위해 try catch를 사용, 결과가 0이면 나누기를 못하도록 출력, 연산자에도 관련 설정을 추가했다.

 

다음과제인

 

4. 반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정합니다.
반복문을 사용합니다. (e.g. for, while …) //2주차

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        /* 반복문 사용 해서 연산을 반복 */
        ...
        System.out.println("결과: " + result);
        
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
        /* exit을 입력 받으면 반복 종료 */
    }
}

이걸수행하기 위하여 

while (true) {//반복을 시작하기위해 추가
...
 System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            /* exit을 입력 받으면 반복 종료 */
            String text = sc.next();
            if (Objects.equals(text, "exit")) {
                break;// 반복의 끝
            }
        }

 

를 추가하여

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

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

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

 

이렇게 하면 해결!

 

5.

연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다.
연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다.
연산의 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count 합니다.

public class App {
    public static void main(String[] args) {
        /* 연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다. */
        /* 연산의 결과가 저장된 배열의 마지막 index를 저장하는 변수를 선언 */
        Scanner sc = new Scanner(System.in);
        ...
        System.out.println("결과: " + result);
        /* 연산의 결과를 배열에 저장합니다. */
        /* index를 증가 시킵니다. */
        ...
    }
}

 

먼저 배열은// 2주차

 

```java
// 배열 선언

// 일반적인 선언방식
int[] intArray;    // 정수 배열
long[] longArray;
double[] doubleArray;  // 실수 배열 
char[] charArray;  // 문자 배열
String[] stringArray; // 문자열 배열
```

```java
// 배열 선언

// 2번째 선언방식
int intArray[];    // 정수 배열
long longArray[];
double doubleArray[];  // 실수 배열 
char charArray[];  // 문자 배열
String stringArray[]; // 문자열 배열

```


String 배열 선언과 생성
// String 배열을 아래와 같이 선언과 생성할 수 있습니다.
String[] stringArray = new String[3];
​
String 배열의 초기화
// 선언 후 하나씩 초기화 할 수 있습니다.
String[] stringArray = new String[3];
stringArray[0] = "val1";
stringArray[1] = "val2";
stringArray[2] = "val3";

// 선언과 동시에 초기화 할 수 있습니다.
String[] stringArray1 = new String[]{"val1", "val2", "val3"};
String[] stringArray2 = {"val1", "val2", "val3"};

 

 

이런식으로 나타낼수 있는데

숫자니까 int[] intArray;  를 쓴다.

 

 

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

        // 연산 결과를 저장할 배열을 선언하고 생성합니다.
        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("결과를 더 이상 저장할 수 없습니다.");
            }

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

 

 

  // 연산 결과를 저장할 배열을 선언하고 생성합니다.
        int[] intArray = new int[10];
        // 배열의 마지막 인덱스를 저장하는 변수를 선언합니다.
        int index = 0; 이걸로 10개를 만들고

 


            // 연산 결과를 배열에 저장합니다.
            if (index < intArray.length) {//이걸로 인트어레이가 인덱스보다 많은지 검사
                intArray[index] = result;//이 문장은 연산의 결과를 intArray의 index 위치에 저장 예를 들어, index가 0이면, result는 배열의 첫 번째 위치에 저장
                index++;//저장하면 1증가
                System.out.println("현재 저장된 결과의 수: " + index);//얼마나 저장했는지 보여줌
            } else {
                System.out.println("결과를 더 이상 저장할 수 없습니다.");
            }

이것으로 결과를 하나씩 저장해서 10개에서 멈추도록 한다.

 

 

6.

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