2013년 12월 14일 토요일

놀먹 C언어 능력 시험 문제

모양이 다릅니다. 제대로 된 모양으로 보시려면 이곳으로 이동해주세요.

2013학년도 12월 놀먹 C언어 능력시험 문제지
C언어 영역

1. 다음 중 입출력 방향이 가장 다른 함수는? [2점]
① printf
② scanf
③ puts
④ fprintf
⑤ putchar

2. 16진수 0x1234를 10진수로 표현한 값은? [2점]
① 1234
② 2947
③ 4660
④ 6762
⑤ 11064

3. 다음 중 존재하지 않는 특수 문자(escape sequence)는? [2점]
① \c
② \\
③ \v
④ \r
⑤ \'

4. sizeof("String") + sizeof('\n')의 값은? [3점]
① 7
② 8
③ 9
④ 10
⑤ 11

5. 다음 소스의 입력한 값이 2일 때 출력한 값은? [3점]
int x;
scanf("%d", &x);
printf("%d\n", x^x);

① 0
② 1
③ 2
④ 3
⑤ 4

6. a = 20일 때, 8 + a >> 2의 값은? [3점]
① 7
② 9
③ 11
④ 13
⑤ 15

7. 주어진 a, b 값에 따른 다음 소스의 출력 값이 다른 하나는? (단, double의 유효 자리는 10진법 소수 12자리까지이다) [3점]
int a, b;
double c;
scanf("%d %d", &a, &b);
c = a / b;
printf("%lf\n", c);

① a=2, b=1
② a=4, b=3
③ a=6, b=5
④ a=8, b=7
⑤ a=10, b=9

8. 주어진 입력 값에 따른 출력 값이 다른 하나를 고르시오. (단, sizeof(int) = 4이다.) [3점]
int a;
scanf("%d", &a);
printf("%d", (a >> 31));

① -3
② 0
③ 1
④ 3
⑤ 16

9. 010 - 2의 값은? [3점]
① 0
② 2
③ 4
④ 6
⑤ 8

10. 주어진 입력 값에 따른 출력 값이 다른 하나를 고르시오. [3점]
#include <stdio.h>

int main(void) {
    int n;

    scanf("%d", &n);

    if (n % 3 == 0) printf("+");
    else if (n % 4 == 0) printf("-");
    else printf("%d", n);

    return 0;
}

① 3
② 8
③ 21
④ 54
⑤ 84

11. 주어진 입력 값에 따른 두 소스의 출력 값이 다른 하나를 고르시오. [3점]
int n;
scanf("%d", &n);
if (n % 6 == 1) printf("OK");
int n;
scanf("%d", &n);
if (n % 7 == 1) printf("OK");

① 43
② 127
③ 169
④ 253
⑤ 378

12. nolmuck(999)의 값은? [3점]
int nolmuck(int n) {
    int result;

    result = n / 100;
    result += (n % 100) / 10;
    result += n % 10;

    return result;
}

① 9
② 10
③ 27
④ 81
⑤ 90

[13~14] 아래의 소스에 대하여 13번과 14번의 두 물음에 답하시오.
int i, n, result = 1;

scanf("%d", &n);
for (i=1; i<=n; i++) result *= i;

13. (result % 10)의 결과가 다른 n의 값은? [3점]
① 4
② 5
③ 6
④ 7
⑤ 8

14. (result % 100)의 값이 (n^n)의 값과 같아지는 최소의 n의 값은? [4점]
① 1
② 2
③ 4
④ 5
⑤ 10

15. 다음 중, 반복의 횟수가 다른 하나는? [4점]
① for (i=0; i<10; i++);
② for (i=1; i<=10; i++);
③ for (i=20; i>0; i-=2);
④ for (i=0; i<=10; i++);
⑤ for (i=10; i>=1; i--);

16. 아래의 소스에 대하여 올바른 설명만을 <보기>에서 있는 대로 고른 것은? [4점]
int array[7] = {78, 79, 76, 77, 85, 67, 75};
int i;
for (i=0; i<7; i++)
    printf("%c", array[i]);


ㄱ. 출력 결과는 "NOLMUCK"이다.
ㄴ. array[2]의 값과 sizeof(array[5]) * 19의 값은 같다.
ㄷ. array[7]의 값은 75이다.

① ㄱ
② ㄷ
③ ㄱ, ㄴ
④ ㄴ, ㄷ
⑤ ㄱ, ㄴ, ㄷ

17. <보기>는 Ellipse 함수에 대한 설명이다. Ellipse 함수를 사용하여 다음과 같은 모양의 두 타원(동심원)을 그리는 소스로 가장 적절한 것은? [4점]

void Ellipse(int, int, int, int);
Ellipse 함수는 타원을 그리는 함수이다.

첫 번째 인수는 그려지는 타원의 경계 사각형의 왼쪽 위 모서리의 X 좌표이며,
두 번째 인수는 그려지는 타원의 경계 사각형의 왼쪽 위 모서리의 Y 좌표이며,
세 번째 인수는 그려지는 타원의 경계 사각형의 오른쪽 아래 모서리의 X 좌표이며,
네 번째 인수는 그려지는 타원의 경계 사각형의 오른쪽 아래 모서리의 Y 좌표이다.

사용 예) Ellipse(100, 100, 200, 200);

① Ellipse(100, 100, 200, 200); Ellipse(125, 125, 175, 175);
② Ellipse(100, 100, 200, 200); Ellipse(150, 150, 250, 250);
③ Ellipse(150, 150, 200, 200); Ellipse(100, 100, 150, 150);
④ Ellipse(100, 150, 150, 200); Ellipse(150, 100, 200, 200);
⑤ Ellipse(100, 150, 200, 200); Ellipse(100, 150, 150, 200);

18. secondmk 함수가 다음과 같을 때, 다음 중 가장 큰 값은? [4점]
int secondmk(int a, int b, int c) {
    int result = (a > b) ? a : b;
    result = (result > c) ? result : c;
    return result;
}

① secondmk(10, 20, 30);
② secondmk(15, 25, 35);
③ secondmk(35, 15, 25);
④ secondmk(50, 50, 50);
⑤ secondmk(12, 34, 56);

19. 항상 옳은 것만을 <보기>에서 있는 대로 고른 것은? [4점]
ㄱ. 임의의 양의 정수 a, n에 대하여 (a & n) <= a이다.
ㄴ. 임의의 양의 정수 a, n에 대하여 (a | n) >= a이다.
ㄷ. 임의의 양의 정수 a, n에 대하여 (a & n) <= (a | n) <= a + n이다.

① ㄱ
② ㄷ
③ ㄱ, ㄴ
④ ㄴ, ㄷ
⑤ ㄱ, ㄴ, ㄷ

20. 다음은 1부터 1 이상의 입력받은 수까지의 합을 출력하는 소스의 일부이다.
int n, i;
int sum = (가);
scanf("%d", &n);
for (i=(나); i<=n; i++) sum += i;
printf("%d", sum);

위의 (가)에 알맞은 양의 정수를 f, (나)에 알맞은 양의 정수를 g라 할 때, (11 * f + 12 * g)의 값은? (단, f와 g는 100,000 미만의 수이다.) [4점]
① 11
② 12
③ 24
④ 33
⑤ 35

21. 항상 옳은 것만을 <보기>에서 있는 대로 고른 것은? [4점]
ㄱ. 임의의 양의 정수 a에 대하여 a ^ 0 == a이다.
ㄴ. 임의의 양의 정수 a, b에 대하여 a ^ b == b ^ a이다.
ㄷ. 임의의 양의 정수 a, b, c에 대하여 a ^ (b ^ c) == (a ^ b) ^ c이다.
① ㄱ
② ㄴ
③ ㄱ, ㄷ
④ ㄴ, ㄷ
⑤ ㄱ, ㄴ, ㄷ

22. (5 ^ k) * 4 + (8 % 2)의 값이 0이 되는 k의 값은? [3점]

23. 임의의 양의 정수 a에 대하여, (a & (b - 5)) ^ a와 a | (b2-2b-15)의 값을 같게 하는 양의 정수 b는? [3점]

24. 다음 소스는 10개의 값을 입력받아, 입력받은 값들의 합을 출력하는 소수의 일부이다. 이때, (A)에 알맞은 임의의 정수를 p, (B)에 알맞은 임의의 정수를 q라고 할 때, q - p의 값을 구하시오. [3점]
int input;
int sum = 0, i;
for (i=(A); i<(B); i++) {
    scanf("%d", &input);
    sum += input;
}
printf("sum: %d", sum);

25. 아래의 소스를 실행하였을 때에, 최종적으로 화면에 보이는 문자의 개수를 구하시오. (공백 포함) [3점]
printf("Hello, world!\rHello\0 World!");

26. 다음은 보기의 지문을 참고하여 만든, 연도를 입력받아 윤년을 판별하는 코드의 일부이다. 이때, (A), (B), (C)에 알맞은 양의 정수를 각각 p, q, r이라고 할 때, p+q+r의 값은? [4점]

<보기> 윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어 떨어지지 않고, 달의 공전주기와 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다.

태양력에서는 보통 윤일이 들어 있는 해를 말하는데, 이 경우 1년은 366일이 되며 이것이 바로 윤년이다. 지구가 태양을 한 바퀴 도는 데에는 365일 5시간 48분 46초가 걸리므로 365일을 제외한 시간들을 모아 태양력에서는 4년마다 한 번 2월 29일을 두어 하루를 늘리고, 태음력에서는 평년이 354일이므로 계절과 역월(曆月)을 조절하기 위하여 19년에 7번의 비율로 윤달을 끼워 1년을 13개월로 한다.[1] 윤년이 아닌 해는 평년이라고 한다.
.... (생략) ...
현재 전세계 대부분의 나라에서 쓰는 그레고리력은 4년에 반드시 하루씩 윤날(2월 29일)을 추가하는 율리우스력을 보완한 것으로, 태양년과의 편차를 줄이기 위해 율리우스력의 400년에서 3일(세 번의 윤년)을 뺐다.

그레고리력의 정확한 윤년 규칙은 다음과 같다.
서력 기원 연수가 4로 나누어 떨어지는 해는 윤년으로 한다.(2004년, 2008년, 2012년…)
이 중에서 100으로 나누어 떨어지는 해는 평년으로 한다.(2100년, 2200년, 2300년…)
그 중에 400으로 나누어 떨어지는 해는 윤년으로 둔다.(1600년, 2000년, 2400년 …)
즉, 400년에 97년은 윤년이 되며, 1년은 평균 365.2425일이 된다. 이는 춘분점을 기준으로 한 태양년보다 0.0003일(26초)이 길기 때문에, 약 3,300년마다 1일의 편차가 난다. (출처 : 위키백과)

int year;
printf("연도 입력: ");
scanf("%d",&year);

if(year%(A)==0) {
 if(year%(B)==0) {
  if(year%(C)==0) printf("윤년");
  else printf("평년");
 } else {
  printf("윤년");
 }
} else {
 printf("평년");
}

27. 다음은 달(月)을 입력받아 그 달의 날 수를 출력하는 소스의 일부이다. (A), (B), (C)에 알맞은 양의 정수를 각각 p, q, r이라 할 때, p+q+r의 값을 구하세요. (단, 윤년 처리는 무시하고 모두 평년으로 처리합니다.) [4점]

int month;

scanf("%d", &month);
switch(month) {
    case 2: printf("%d", (A)); break;
    case 1: case 3: case 5: case 7: case 8: case (B): case 12: printf("31"); break;
    case 4: case 6: case 9: case 11: printf("%d", (C)); break;
}

28. 다음은 임의의 정수를 입력받아, 그 정수의 약수를 출력하는 소스의 일부이다. 이 때, (A)와 (B)에 알맞은 양의 정수를 각각 p, q라 할 때, (p ^ q) | (p & q)의 값을 구하시오. [4점]

int input, i;
scanf("%d", &input); /* 1 이상의 정수를 입력 받는다. */

printf("1 ");
for (i=(A); i<=input; i++) {
    if (input % i == (B)) printf("%d ", i);
}

29. 50 미만의 임의의 양의 정수 a, b에 대하여 a | b = a + b를 만족하는 (a, b)의 순서쌍의 개수를 구하시오. [4점]

30. 1, 1, 2, 3, 5, 8, 13, 21, ... 과 같이 나열되는 수가 있다. 이때, 14930352는 몇 번째 수인지 구하세요. [4점]

댓글 1개: