2023년 5급 공채 기술 2차 프로그래밍언어론
문제 5개 · 50점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.
제1문 (10점)
다음 재귀함수(recursive function)에 대한 물음에 답하시오. (총 10점)
int factorial(int n) {
if (n == 0)
return 1;
return n * factorial(n - 1);
}
int main() {
factorial(5);
return 0;
}
if (n == 0)
return 1;
return n * factorial(n - 1);
}
int main() {
factorial(5);
return 0;
}
- (1) 위 재귀함수를 꼬리재귀(tail recursion)로 바꾸기 위해 다음과 같이 변형하고자 한다. 밑줄 (A)에 들어갈 코드를 완성하시오. (3점)int fact_tail(int p, int n) {
if (n == 0)
return p;
return (A) ;
}
int main() {
fact_tail(1, 5);
return 0;
} - (2) 위 fact_tail() 함수와 동일한 결과를 리턴하는 fact_iter() 함수를 반복문을 사용하여 완성하시오. (4점)
int fact_iter(int p, int n) {
}
int main() {
fact_iter(1, 5);
return 0;
} - (3) 1)과 같이 재귀함수를 꼬리재귀로 바꾸었을 때 코드 최적화 관점에서 장점을 서술하시오. (3점)
제2문 (10점)
다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
| struct A { int i; char j; }; struct B { int i; char j; }; struct A x, *p; struct B y, *q; int main() { (가) return 0; } |
| (가) |
- (1) (가)의 문장이 x = y;일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (2점)
- (2) (가)의 문장이 x = (struct A) y;일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (4점)
- (3) (가)의 문장이 p = (struct A*) q;일 때, 컴파일 오류 발생 여부와 그 이유를 설명하시오. (4점)
제3문 (10점)
다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
1 #include <stdio.h>
2
3 int g_NoOfCalls = 0;
4
5 int func(int *n1, int *n2) {
6 g_NoOfCalls++;
7 if ( *n1 <= 0 ) return 0;
8 *n2 = *n2 / 2;
9 printf("%d %d\n", *n1, *n2);
10 return *n1 + func(n1, n2);
11 }
12
13 int main() {
14 int value = 9;
15 printf("1: %d\n", func(&value, &value));
16 printf("2: %d\n", value);
17 printf("3: %d\n", g_NoOfCalls);
18 return 0;
19 }
2
3 int g_NoOfCalls = 0;
4
5 int func(int *n1, int *n2) {
6 g_NoOfCalls++;
7 if ( *n1 <= 0 ) return 0;
8 *n2 = *n2 / 2;
9 printf("%d %d\n", *n1, *n2);
10 return *n1 + func(n1, n2);
11 }
12
13 int main() {
14 int value = 9;
15 printf("1: %d\n", func(&value, &value));
16 printf("2: %d\n", value);
17 printf("3: %d\n", g_NoOfCalls);
18 return 0;
19 }
- (1) 위 코드를 실행할 때 라인 15의 수행 결과로 출력되는 내용을 작성하시오. (4점)
- (2) 위 코드를 실행할 때 라인 16, 17의 수행 결과로 출력되는 내용을 각각 작성하시오. (2점)
- (3) 위 코드에서 main()과 func()가 서로 동일한 주소의 메모리를 접근하기 위해 사용한 기법 두 가지를 설명하시오. (4점)
제4문 (10점)
다음 C 프로그램에 대한 물음에 답하시오. (총 10점)
#include <stdio.h>
int FuncA(int x, int y)
{
return x + y;
}
float FuncA(double x, double y)
{
return x + y;
}
int main()
{
printf("%d \n", FuncA(3, 5));
printf("%f \n", FuncA(3.5, 8.7));
return 0;
}
int FuncA(int x, int y)
{
return x + y;
}
float FuncA(double x, double y)
{
return x + y;
}
int main()
{
printf("%d \n", FuncA(3, 5));
printf("%f \n", FuncA(3.5, 8.7));
return 0;
}
- (1) 위 프로그램을 C 컴파일러로 컴파일 및 실행할 때, 정상적으로 실행되는 경우에는 출력 결과를 작성하고, 오류가 발생하는 경우에는 오류의 원인과 오류를 수정하는 방법을 설명하시오. (3점)
- (2) 위 프로그램을 C++컴파일러로 컴파일 및 실행할 때, 정상적으로 실행되는 경우에는 출력 결과를 작성하고, 오류가 발생하는 경우에는 오류의 원인과 오류를 수정하는 방법을 설명하시오. (3점)
- (3) 위 프로그램에 아래와 같이 동일한 이름의 함수를 추가하고 C++컴파일러로 컴파일 및 실행할 경우 그 결과와 이유를 설명하시오. (4점)float FuncA(double x, double y, int z=0)
{
return x + y - z;
}
제5문 (10점)
다음 Java 프로그램에 대한 물음에 답하시오. (총 10점)
1 class Student {
2 protected int jumSu = 0;
3 public Student(int grade) {
4 jumSu = grade;
5 }
6 public int study() {
7 return jumSu++;
8 }
9 public int study(int grade) {
10 return jumSu + grade;
11 }
12 }
13 class UniversityStudent extends Student {
14 private int grade = 10;
15 public UniversityStudent() {
16 grade = study(grade);
17 }
18 }
19 class University {
20 public static void main(String args[]) {
21 UniversityStudent us = new UniversityStudent();
22 }
23 }
2 protected int jumSu = 0;
3 public Student(int grade) {
4 jumSu = grade;
5 }
6 public int study() {
7 return jumSu++;
8 }
9 public int study(int grade) {
10 return jumSu + grade;
11 }
12 }
13 class UniversityStudent extends Student {
14 private int grade = 10;
15 public UniversityStudent() {
16 grade = study(grade);
17 }
18 }
19 class University {
20 public static void main(String args[]) {
21 UniversityStudent us = new UniversityStudent();
22 }
23 }
- (1) 위 프로그램에서 발생하는 컴파일 오류의 원인을 설명하시오. (5점)
- (2) 위 프로그램에서 컴파일 오류가 발생하지 않도록 Student 클래스를 수정하시오. (5점)