code/misc

C 테스트 오답노트 外

devstdio 2018. 5. 2. 20:44

중간고사 때, 학교에서 프로그래밍(C) 시험을 봤다.


역시나 모든 것을 제대로 해도 마지막에 무언가를 빼먹지 않는 것이 중요하다고 생각하게 된 또 한 번의 계기가 아닐까 생각한다..



Q. 다음 알고리즘의 실행 결과는?

[단계 1] 변수 n=1, sum=0을 선언한다.

[단계 2] n이 9보다 크면, [단계 6]으로 이동한다.

[단계 3] sum+n을 계산하여 sum에 기억시킨다.

[단계 4] n+1을 계산하여 n에 기억시킨다.

[단계 5] [단계 2] 로 이동한다.

[단계 6] sum%5를 계산하여 sum에 기억시킨다.

[단계 7] sum을 출력한다.


생각보다는 수월하게 풀었다고 생각했는데 급하게 푼 탓에 놀랍게도 1+2+3+4+5+6+7+8+9+10을 했어야 하는 과정에서 5를 더하지 않았다.

단계별로 풀어서 문제를 풀어보도록 한다.


1. n=1, sum=0 선언.

2. sum=sum+n. 여기서 새로운 sum은 0+1=1.

3. n+=1.

4. sum=sum+n. 여기서 새로운 sum은 1+2=3.

5. n+=1.

6. sum=sum+n. 여기서 새로운 sum은 3+3=6.

7. n+=1.

8. sum=sum+n. 여기서 새로운 sum은 6+4=10.

9. n+=1.

10. sum=sum+n. 여기서 새로운 sum은 10+5=15.

11. n+=1.

12. sum=sum+n. 여기서 새로운 sum은 15+6=21.

13. n+=1.

14. sum=sum+n. 여기서 새로운 sum은 21+7=28.

15. n+=1.

16. sum=sum+n. 여기서 새로운 sum은 28+8=36.

17. n+=1.

18. sum=sum+n. 여기서 새로운 sum은 36+9=45.

19. n+=1.

20. 9보다 크므로 [단계 6]으로 이동.

21. sum=sum%5. 55를 5로 나눴을 때 나머지가 없으므로,

22. 출력 결과는 0이다.


이 외에도, 살짝 헷갈릴 만하다고 생각된 문제들도 정리해봤다.

해당 순서도를 보자.


Q. 해당 순서도를 프로그램으로 작성했을 때, 적절하지 않은 것은?

* s=0, n=1으로 이미 선언된 것을 기준으로 한다.


1.

for( ; s<50; n++){
 n++;
 s=s+n;
}


2.

while (s<50){
 s=s+n;
 n=n+2;
}


3.

for ( ; s<50; ){
 s=s+n;
 n=n+2;
}


4.

while (s<50){
 s=s+n;
 n+=2;
}


5.

for ( ; s<50; n=n+2){
 s=s+n;
}


해당 질문은 필자에게도 꽤나 헷갈렸고 C를 접해본 사람들에게도 헷갈릴 것이라고 생각한다. 이 질문의 본질적인 의미는 반복문의 종료 조건이라고 생각된다.


상단 코드 중에서, 반복문 종료시 정상적으로 값이 더해지지 않는 코드가 있다. 바로 1번. 2~5번 모두 출력되는 N의 값은 17이다. 하지만, 1의 경우 예외적으로 15가 출력된다.


우선, 2~5번 코드가 반복문을 돌면서 나오는 값을 살펴보자.

S

N

1

1

3

4

5

9

7

16

9

25

11

36

13

49

15

64

(최종) 17

 


이렇게, 반복문을 8번 돌면서 S의 값은 17이 되어야 정상이다. 그러나 1번 코드의 경우는,

S

N

2

2

4

6

6

12

8

20

10

30

12

42

14

56

(최종) 15

 


의도와는 상당히 다른 15가 출력된다. 이는 시작값은 n이나 처음에 n++를 해버리는 바람에 S가 사실상 2부터 시작하기 떄문이다. 즉, 1번이 틀렸다고 볼 수 있다.


Q. 다음 프로그램의 실행 결과는?

int i, j, n=5; for (i=0; i<n; i++) { for (j=0; j<n; j++) { if ((i==j)||(i+j==n-1)) printf("★"); else printf("♡"); } printf("\n");

우선 하트와 별로 채워진 5*5의 정사각형이 출력될 것이고, 여기서는 별이 나오는 조건이 중요하다.

별은 i가 j와 동일할 때와, i+j가 n-1일때 출력된다.


i==j를 일차함수로 표현하면 사실상 y=-x와 동일하다. 즉,

★♡♡♡♡

♡★♡♡♡

♡♡★♡♡

♡♡♡★♡

♡♡♡♡★

과 같이 출력될 것이다.


i+j==n-1의 조건을 생각해보면, 일차함수 y=x와 동일하다. 즉,

♡♡♡♡★

♡♡♡★♡

♡♡★♡♡

♡★♡♡♡

★♡♡♡♡
과 같이 출력될 것이다.

조건문에서 OR 연산자를 사용했기에, 두 선들이 합쳐져서 출력될 것이다. 실행 결과는,

★♡♡♡★

♡★♡★♡

♡♡★♡♡

♡★♡★♡

★♡♡♡★
이다.



반응형