Tech Trail

[정보처리기사 실기] C언어 프로그래밍 특강(2) 본문

Learning/정보처리기사

[정보처리기사 실기] C언어 프로그래밍 특강(2)

_밍지_ 2023. 11. 16. 10:19
728x90
반응형
SMALL

9번 문제

int main() {
    int a = 1, b = 2, c = 3, d = 4;
    if ((a == b) && (c++ == d)) c++;
    printf("%d", c);
}

(1) int a = 1, b = 2, c = 3, d = 4;

: 네 개의 정수형 변수 a, b, c, d를 선언하고 각각 1, 2, 3, 4로 초기화합니다.

(2) if ((a == b) && (c++ == d)) c++;

: 조건문입니다. 조건식은 (a == b) && (c++ == d)로 이루어져 있습니다.

&&: 논리 AND 연산자는 양쪽 피연산자가 모두 참일 때만 전체 표현식이 참이 됩니다.

  • 먼저, (a == b)는 거짓입니다. a와 b는 각각 1과 2로 다르기 때문입니다.
  • (c++ == d)는 거짓입니다. c와 d의 값은 각각 3과 4로 다릅니다.

비교 연산자 ==는 값이 같으면 참을 반환하므로, 거짓입니다.

따라서 조건문 내부의 c++는 실행되지 않고, c의 값은 그대로 3입니다.

(3) printf("%d", c);

: c 변수의 값을 출력합니다. 이때 c는 위에서 조건문을 통과하면서 변경되지 않았으므로 여전히 3입니다.

따라서 출력 결과는 3이 됩니다.

3

조건문 내에서 c 변수가 증가하지 않았기 때문에 3이 그대로 유지되고 출력됩니다.

 

10번 문제

#include <stdio.h> 

int main(void) {
    int i, j, a = 0, b = 1;
    
    for (i = 1, j = 1; i++ < 3;) {
        j += i;
    }
    
    printf("i = %d, j = %d\n", i, j);
    
    if (a == b >= a != b) {
        printf("True\n");
    } else {
        printf("False\n");
    }
}

(1) int i, j, a = 0, b = 1;

: 정수형 변수 i, j, a, b를 선언하고 초기값을 할당합니다. a는 0, b는 1로 초기화됩니다.

for (i = 1, j = 1; i++ < 3;) {
    j += i;
}

(2) for 반복문:

  • ij를 1로 초기화하고, for 루프는 i가 3보다 작을 때까지 실행됩니다.
  • 첫 번째 반복에서 i는 1이며, i++로 인해 2가 되기 전에 비교가 이루어지므로 참(True)입니다. 따라서 루프 본문이 실행되고, j += i j=j+i과 동일하게 작동하므로 j에 현재 i의 값인 2를 더합니다. 그 결과 j는 3이 됩니다.
  • 다음 반복에서, i는 2가 되며 다시 비교가 이루어집니다. i++로 인해 i는 3이 되기 전에 비교가 이루어지므로 참(True)입니다. 다시 j += ij에 현재 i의 값인 3을 더하고, j는 6이 됩니다.
  • 이제 i는 3이 되어 루프 비교 조건 i++ < 3이 거짓(False)이 됩니다. 그러나 후위 증가 연산자 i++는 현재 값을 사용한 후에 증가시키므로, 비교 조건에서는 이전 값을 비교하고, 그 후에 i가 1 증가하여 루프가 종료됩니다.
  • 따라서 for 루프가 종료된 후에 i는 4가 됩니다.

(3) printf("i = %d, j = %d\n", i, j);

: ij의 값을 출력합니다. i는 반복문을 빠져나오면 4가 되고, j는 반복문 내에서 계산된 후 6이 됩니다.

if (a == b >= a != b) {
    printf("True\n");
} else {
    printf("False\n");
}

(4) if 조건문:

  • b >= a (1 >= 0)가 먼저 평가되어 참(True)입니다.
  • 그 다음으로 a == 1 (0 == 1)이 평가되며 거짓(False)입니다.
  • 마지막으로 1 != b (1 != 0)가 평가되어 참(True)입니다.
  • 논리 연산자 && (AND)가 사용되지 않았으므로 이 조건문은 각 조건을 순서대로 평가하고, b >= a1 != b가 참(True)이기 때문에 True가 출력됩니다.

<출력>

i = 4, j = 6
True

괄호: () (가장 높은 우선순위)

후위 증가/감소 연산자: ++, --

단항 연산자: - (음수 부호), + (양수 부호), ! (논리 NOT), ~ (비트 NOT)

산술 연산자: * (곱셈), / (나눗셈), % (나머지), + (덧셈), - (뺄셈)

시프트 연산자: << (왼쪽 시프트), >> (오른쪽 시프트)

관계 연산자: <, >, <=, >=

등호 연산자: ==, !=

비트 AND: &

비트 XOR: ^

비트 OR: |

논리 AND: &&

논리 OR: ||

조건 연산자 (삼항 연산자): ? :

대입 연산자: =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=

콤마 연산자: , (가장 낮은 우선순위)

C언어 연산자들의 우선순위 목록

 

11번 문제

#include <stdio.h>

int f(int a, int b) {
    int s;
    s = a + b + 1;
    return s;
}

void main() {
    int x, y, i, j;
    x = 10;
    y = ++x;
    i = --x / 2;
    j = y % 7 + i++;
    printf("%d\n", f(y, j));
}

(1) main 함수가 시작됩니다.

(2) xy를 정수로 선언하고, x를 10으로 초기화하고, y++x를 통해 11이 됩니다.

여기서 ++xx를 1 증가시킨 후, 그 값을 y에 할당하는 것을 의미합니다.

(3) i를 정수로 선언하고, --x / 2를 계산하여 i는 5가 됩니다.

--xx를 1 감소시킨 후, 그 값을 사용하는 것을 의미합니다.

(4) j를 정수로 선언하고, y % 7은 11을 7로 나눈 나머지인 4를 반환하며, j는 4 (나머지) + 5 (현재 i 값)로 계산되어 9가 됩니다.

i++는 현재 i의 값을 사용한 후에 1을 증가시키므로, i는 5로 사용된 후에 6으로 증가합니다.

(5) f(y, j) 함수를 호출합니다. 이때 실매개변수 yj가 함수 f의 인수로 전달됩니다.

(6) f 함수가 시작됩니다. 함수 내부에서 형식 매개변수 a, b, 그리고 s를 정수로 선언합니다.

(7) sa + b + 1을 계산하여 값을 할당합니다. 여기서 a는 11, b는 9이므로 s는 11+9+1=21이 됩니다.

f 함수에서 계산된 결과값인 21이 반환됩니다.

(8) main 함수에서 printf 함수를 사용하여 21을 출력합니다.

21

 

12번 문제

#include <stdio.h>
#define PRE(x) x * x

int main() {
    int a;
    a = 100 / PRE(3 + 7);
    printf("%d", a);
}

매크로 PRE(x)가 사용되었지만, 매크로는 단순히 텍스트 치환이 일어나므로 PRE(x)x * x로 치환됩니다. 다음은 치환된 식을 포함한 전체 표현식입니다.

a = 100 / 3 + 7 * 3 + 7;

매크로 확장은 연산자 우선순위를 변경하지 않으므로 여전히 곱셈과 나눗셈이 먼저 수행합니다.

(1) 100 / 3은 정수 나눗셈으로 33이 됩니다.

(2) 7 * 3은 21이 됩니다.

그런 다음, 이 계산된 값들을 더하고:

(3) 33 + 21은 54가 됩니다.

(4) 54 + 7은 61이 됩니다.

<출력>

61

13번 문제

#include <stdio.h>
#define sum1(a, b) a + b

int sum2(int a, int b) {
    return a + b;
}

void main() {
    int s1, s2;
    s1 = 3 * sum1(2, 7);
    s2 = 3 * sum2(2, 7);
    printf("%d, %d\n", s1, s2);
}

(1) main 함수가 시작됩니다.

(2) s1 변수에 3 * sum1(2, 7)을 대입합니다.

여기서 sum1(2, 7)은 매크로로 정의된 sum1(a, b)이므로 단순한 텍스트 치환으로 2 + 7이 됩니다.

따라서 s1 = 3 * 2 + 7으로 계산되고 s1에는 13이 저장됩니다.

(3) s2 변수에 3 * sum2(2, 7)를 대입합니다.

이번에는 함수 sum2(int a, int b)를 호출하게 됩니다.

이 함수는 두 정수를 더하여 반환하는 함수이므로 2 + 7 계산 결과인 9를 반환합니다.

따라서 s2 = 3 * 9로 계산되고 s2에는 27이 저장됩니다.

(4) printf 함수를 사용하여 s1과 s2의 값을 출력합니다.

결과적으로 프로그램은 "13, 27"을 출력합니다.

13, 27

14번 문제

#include <stdio.h>

void main() {
    int i, j, k = 0;
    for (i = 0; i <= 10; i++) {
        for (j = 0; j < 10; ++j) {
            if (i > 7)
                continue;
            k = k + 1;
            if (j >= 3)
                break;
        }
    }
    printf("%d\n", k);
}

i=0, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=1이 됩니다.

i=0, j=1: 동일한 이유로 k가 1 증가하여 k=2가 됩니다.

i=0, j=2: 동일한 이유로 k가 1 증가하여 k=3이 됩니다.

i=0, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=4가 됩니다.

i=1, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=5가 됩니다.

i=1, j=1: 동일한 이유로 k가 1 증가하여 k=6이 됩니다.

i=1, j=2: 동일한 이유로 k가 1 증가하여 k=7이 됩니다.

i=1, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=8이 됩니다.

i=2, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=9가 됩니다.

i=2, j=1: 동일한 이유로 k가 1 증가하여 k=10이 됩니다.

i=2, j=2: 동일한 이유로 k가 1 증가하여 k=11이 됩니다.

i=2, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=12가 됩니다.

i=3, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=13이 됩니다.

i=3, j=1: 동일한 이유로 k가 1 증가하여 k=14이 됩니다.

i=3, j=2: 동일한 이유로 k가 1 증가하여 k=15이 됩니다.

i=3, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=16이 됩니다.

i=4, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=17이 됩니다.

i=4, j=1: 동일한 이유로 k가 1 증가하여 k=18이 됩니다.

i=4, j=2: 동일한 이유로 k가 1 증가하여 k=19가 됩니다.

i=4, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=20이 됩니다.

i=5, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=21이 됩니다.

i=5, j=1: 동일한 이유로 k가 1 증가하여 k=22가 됩니다.

i=5, j=2: 동일한 이유로 k가 1 증가하여 k=23이 됩니다.

i=5, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=24가 됩니다.

i=6, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=25가 됩니다.

i=6, j=1: 동일한 이유로 k가 1 증가하여 k=26이 됩니다.

i=6, j=2: 동일한 이유로 k가 1 증가하여 k=27이 됩니다.

i=6, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=28이 됩니다.

i=7, j=0: i가 7보다 작고 j가 3보다 작으므로 k가 1 증가하여 k=29가 됩니다.

i=7, j=1: 동일한 이유로 k가 1 증가하여 k=30이 됩니다.

i=7, j=2: 동일한 이유로 k가 1 증가하여 k=31이 됩니다.

i=7, j=3: j가 3보다 크므로 안쪽 루프가 종료되기 전에 k가 1 증가하여 k=32가 됩니다.

최종적으로 i가 7이 될 때까지 진행되며, k는 32가 됩니다.

32

 

15번 문제

#include <stdio.h>

void main() {
    int i, j, k = 0;
    for (i = 0; i <= 10; i++) {
        for (j = 0; j < 10; ++j) {
            if (j >= 3)
                break;
            k = k + 1;
            if (i > 7)
                continue;
        }
    }
    printf("%d\n", k);
}

바깥쪽 for 루프 (i 루프)에서 i는 0부터 10까지 11번 반복됩니다.

안쪽 for 루프 (j 루프)에서 j는 0부터 9까지 10번 반복됩니다.

이제 각 단계별로 설명하겠습니다.

(1) i = 0:

  • i가 0이므로 안쪽 for 루프가 실행됩니다.
  • j가 0, 1, 2일 때 if (j >= 3) 조건이 거짓이므로 안쪽 for 루프는 3번 반복됩니다.
  • k는 매 반복에서 1씩 증가하므로 k = 3이 됩니다.

(2) i = 1:

  • i가 1이므로 안쪽 for 루프가 실행됩니다.
  • j가 0, 1, 2일 때 if (j >= 3) 조건이 거짓이므로 안쪽 for 루프는 3번 반복됩니다.
  • k는 매 반복에서 1씩 증가하므로 k = 6이 됩니다.

(3) i = 2:

  • i가 2이므로 안쪽 for 루프가 실행됩니다.
  • j가 0, 1, 2일 때 if (j >= 3) 조건이 거짓이므로 안쪽 for 루프는 3번 반복됩니다.
  • k는 매 반복에서 1씩 증가하므로 k = 9가 됩니다.

매 반복에서 안쪽 for 루프는 항상 j가 0, 1, 2일 때 if (j >= 3) 조건이 거짓이므로 3번씩 반복됩니다.

따라서 총 반복 횟수는 11 (i 루프) * 3 (j 루프) = 33번이 됩니다.

k는 매 반복에서 1씩 증가하므로 최종적으로 k = 33이 됩니다. 따라서 printf에서 33이 출력됩니다.

33

16번 문제

#include<stdio.h>

void main() {
    int i, j, k = 0;
    for (i = 0; i <= 10; i++) {
        for (j = 0; j < 10; ++j) {
            if (j >= 5)
                break;
            k = k + 1;
        }
        if (i > 6)
            continue;
    }
    printf("%d\n", k);
}

(1) i, j, k 변수가 정의되고, k는 0으로 초기화됩니다.

(2) 외부 반복문에서 i가 0부터 10까지 증가합니다.

(3) 내부 반복문에서 j가 0부터 4까지 증가하고, 만약 j가 5 이상이면 내부 반복문을 빠져나옵니다.

(4) 각 내부 반복에서 k가 1 증가합니다.

(5) 외부 반복문에서 i가 6을 초과하면 continue를 사용하여 외부 반복문의 다음 반복으로 넘어갑니다.

주어진 코드에서 외부 반복문의 실행은 i가 0부터 10까지 11번 반복되고, 내부 반복문은 j가 0부터 4까지 5번 반복됩니다. 각 내부 반복에서 k가 1씩 증가하므로 총 11 * 5 = 55번의 증가가 있습니다.

55

따라서 printf 함수를 통해 출력된 결과는 55입니다.

 

 

 

💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.

💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.

틀린 부분이 있다면 언제든 댓글 남겨주세요 :)

💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.

IT 자격증 1위 에듀윌 (eduwill.net)

728x90
반응형
LIST