본문 바로가기

내가 꾸는 꿈

함수 응용 문제 [노베이스 게임개발 5일차]

반응형

오늘은 과제를 스스로 풀어보았다.

 

오늘의 과제

 

*프로젝트를 새로 만들고 사용자로부터 차례대로 input1, input2, operation입력을 받아

operation이 0일 경우 input1 + input2를 계산하고

operation이 1일 경우 input1 - input2를 계산하고

operation이 2일 경우 input1을 input2만큼 거듭제곱하여 출력하는 프로그램을 작성하세요.

operation이 0, 1, 2가 아닐 경우 오류메시지와 함께 종료되어야 합니다.

덧셈과 뺄셈 제곱 모두 함수를 활용하여 계산하세요.

 

 

 

 

먼저 함수를 이용하여 덧셈, 뺄셈, 제곱을 표현하라 했으니

덧셈과 뺄셈은 어렵지 않게 함수를 이용하였는데

제곱의 경우 반복문을 어떻게 이용할지 변수를 어떤 식으로 활용할지 그렇게 해서 만든 함수를 어떻게 출력할지 감이 잡히지 않아 일단 가능한 부분먼저 작성해 보았다.

 

 

 

 

main함수로 시작하여 operation값을 입력받았고

조건문을 통하여 operation이 0,1,2일 때 그리고 그 외일 경우까지 조건을 달았다.

 

먼저 덧셈의 경우 operation이 0일 경우 input1과 2를 입력받은 후 sum함수를 받아 input1과 2를 더해 result에 할당 후 출력하였다.

 

 

그다음 뺄 샘도 덧셈과 마찬가지로 input을 입력받은 후 sub함수에 input1과 2를 넣어 뺄셈을 해주었다.

 

 

마지막 제곱의 경우에는 함수로는 만들어내기 생각이 떠오르지 않아 그림처럼 for구문에 input2만큼 반복되는 함수를 만든 후 input1을 두 번 곱한 것을 다시 input1로 할당하여 제곱을 구현하려 하였다.

그리고 그 외의 operaion값은 오류메시지를 출력하게 하여 마무리하였다.

 

 

그리하여 나온 결과값이다. 덧셈과 뺄셈은 예상대로 잘 출력이 되었다.

문제는 제곱이었다

 

원래대로라면 4*4*4를 하여 64의 값이 나와야 하지만 예상보다 너무 큰 값이 나왔다.

이것 때문에 엄청 머리 싸매고 고민했는데 내 수준에서는 도저히 원인을 알 수 없어 정답 강의를 보았고 그 원인을 찾을 수 있었다.

 

문제의 구문

나는 단순하게 4를 3번 곱하여 주는 줄 알았지만 다시 한번 자세히 보니

처음 4 * 4는 정상적으로 하였을 것이다 하지만 4 * 4 즉 16이 input1에 다시 할당되었고

그다음 반복에서는 16 * 16을, 마지막 세 번째 반복에서는 256 * 256을 한 것이었다.

그러면 위의 결과인 65,536이 딱 나온다.

 

강의에서 나온 해결책은 따로 1의 값을 갖는 value를 설정해 주는 것이었다.

그러면 초기에 입력한 input1에 값이 변동되지 않고 정상적으로 반복해 줄 수 있었고 value값을 그대로 출력하면 되는 것이었다.

 

 

그리고 또 나는 수를 입력받을 때 모든 if문에 일일이 넣어주었는데 이 또한 함수를 이용하여 간단히 입력받을 수 있었다.

이렇게 getInput함수에서 scanf를 받은 후 그 값을 다시 return값을 통해 getInput함수에 할당하면 된다.

이때 fseek(stdin, 0, SEEK_END); 를 scanf 앞에 입력해 주면 간혹 생기는 오류를 막을 수 있다고 한다.

 

그리고 이전에는 복잡하게 모든 조건문에 scanf를 따로 받았는데 그럴 필요 없이 main함수 시작할 때 받아놓고 그 변수들을 각 조건에 넣으면 되는 것이었다.

나는 변수들은 각 브라켓에서만 유효하다는 말을 잘못 이해하고 있었는데 거대한 main 함수 안에서는 그 안에 조건문에서도 변수가 유지되고 있었다. 나는 메인함수의 변수가 if절에서는 작동이 되지 않을 거라 생각하고 있었다.

 

그리하여 제곱을 함수로 표현하는 것도 할 수 있었다.

내가 썼던 것처럼 똑같이 함수에 집어넣고 마지막에 pow함수에 return값을 value로 지정해 주면 pow함수의 a b에 각 input을 넣어서 계산할 수 있게 된다.

 

후기:

생각보다 난도가 있어 진도를 많이 나가지는 못했지만 바로 답을 보려고 하지 않고 스스로 최대한 만들려고 하니 좀 더 체계적으로 공부가 되는 것 같아 안심이 된다.

 

*본 포스팅은 학생의 입장에서 쓴 글로 정확하지 않을 수 있으며 댓글로 피드백해 주시면 감사하겠습니다.

클래스 101 개발자 라라 님의 강의를 통해 학습한 내용을 기반으로 두고 있습니다.

반응형