2013 중등임용 기술 디지털논리회로 1차 35번 C 언어와 C++ 프로그램 기출문제 풀이

2013 기술임용 디지털 논리회로 1차 35번
2013년 기술 임용 디지털논리회로 1차 35번 기출문제 썸네일

2013학년도 중등교사 임용시험 · 기술

디지털 논리회로·1차·C 언어와 C++ 프로그램

문 352.5점

다음은 C 언어와 C++ 언어로 작성된 프로그램이다. 실행 후의 출력 결과로 옳은 것은? (단, 두 프로그램의 출력 결과는 같다.)

C 언어로 작성된 프로그램

#include <stdio.h>
int sub_main(int);
void main(void)
{
    sub_main(5);
    printf("\n");
}
int sub_main(int i)
{
    int s = 0;
    if (i < 2) return s;
    if (i == 2){
        s = 1;
    }
    else {
        s = sub_main(i - 1) + i - 1;
    }
    printf("%3d", s);
    return(s);
}

C++ 언어로 작성된 프로그램

#include <iostream.h>
int sub_main(int);
void main(void)
{
    sub_main(5);
    cout << endl;
}
int sub_main(int i)
{
    int s = 0;
    if (i < 2) return s;
    if (i == 2){
        s = 1;
    }
    else {
        s = sub_main(i - 1) + i - 1;
    }
    cout.width(3);
    cout << s;
    return(s);
}
1258
13610
124711
1491625
235813
정답과 해설 보기
정답

1  3  6  10

출력은 폭 3으로 오른쪽 맞춤되므로 실제 화면에는 “  1  3  6 10” 으로 한 줄에 이어 찍힙니다.

해설

① 먼저 함수의 뼈대를 읽습니다. i가 2보다 작으면 아무것도 찍지 않고 0을 돌려주고, i가 2이면 s = 1, 그 밖에는 s = sub_main(i − 1) + i − 1 입니다. 값을 정한 뒤에야 s를 출력하고 돌려줍니다.

② 이 문제의 핵심은 출력문이 재귀 호출보다 뒤에 있다는 점입니다. sub_main(5)는 s를 정하려면 sub_main(4)의 값이 필요하고, 그것은 다시 sub_main(3), sub_main(2)를 필요로 합니다. 그래서 호출은 5 → 4 → 3 → 2 순서로 내려가지만, 출력은 가장 깊이 들어간 sub_main(2)부터 거슬러 올라오며 2 → 3 → 4 → 5 순서로 일어납니다.

호 출i수행하는 식s출력 차례
sub_main(2)2s = 11첫째
sub_main(3)3s = sub_main(2) + 3 − 13둘째
sub_main(4)4s = sub_main(3) + 4 − 16셋째
sub_main(5)5s = sub_main(4) + 5 − 110넷째

③ 값은 아래에서부터 채워집니다. sub_main(2) = 1, sub_main(3) = 1 + 2 = 3, sub_main(4) = 3 + 3 = 6, sub_main(5) = 6 + 4 = 10 입니다. 출력 차례와 겹쳐 놓으면 1, 3, 6, 10 이 되어 ②가 됩니다.

④ 식을 정리하면 sub_main(i) = sub_main(i − 1) + (i − 1) 이고 sub_main(2) = 1 이므로 sub_main(i) = 1 + 2 + … + (i − 1) = i(i − 1) / 2 입니다. 곧 삼각수이고, i = 2, 3, 4, 5를 넣으면 1, 3, 6, 10이 그대로 나옵니다.

⑤ 두 프로그램의 출력이 같은 이유는 서식 지정이 같기 때문입니다. C의 printf("%3d", s)는 폭 3으로 오른쪽 맞춤해 찍고, C++의 cout.width(3) 뒤의 cout << s도 같은 폭으로 찍습니다. width는 한 번 출력하면 초기화되므로 값마다 다시 지정한 것도 printf와 맞아떨어집니다.

void main(void)와 #include <iostream.h>는 출제 당시 표기를 그대로 옮긴 것으로, 답에는 영향이 없습니다.

선택지 좁히기 — 첫 값이 1인 것은 ①·②·③·④이고 그중 둘째 값이 3인 것은 ②뿐이므로, sub_main(3) = sub_main(2) + 2 = 3 만 계산해도 답이 정해집니다. 출력이 일어나는 호출은 i = 2, 3, 4, 5의 네 번뿐이니 값이 다섯 개인 ③·④·⑤는 개수부터 맞지 않습니다.

키워드프로그래밍언어재귀호출호출과복귀순서점화식출력서식지정

2013학년도 중등교사 임용시험 · 기술디지털 논리회로 1차 35번

댓글

이 블로그의 인기 게시물

2008년 국가직 9급 기계일반 기출문제 풀이

2007년 국가직 9급 기계일반 기출문제 풀이

2009년 국가직 9급 기계일반 기출문제 풀이