중간고사 때, 학교에서 프로그래밍(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와 동일하다. 즉,
♡♡♡♡★
♡♡♡★♡
♡♡★♡♡
♡★♡♡♡
★♡♡♡♡★♡♡♡★
♡★♡★♡
♡♡★♡♡
♡★♡★♡
★♡♡♡★'code > misc' 카테고리의 다른 글
타이젠 스튜디오(sdb)와 워치 연결하기 (0) | 2020.07.17 |
---|---|
Sublime Text 3와 TDM-GCC로 Windows에서 C 개발 환경 구축하기 (0) | 2018.04.02 |