일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 리눅스
- python
- 리눅스마스터
- 정처기실기
- AI
- 리눅스마스터2급
- 기사자격증
- 장고
- 리눅스마스터2급2차
- 공부블로그
- 코딩
- 웹개발
- Django
- IT
- 자격증
- 정처기기출
- 정보처리기사
- SW
- Linux
- IT자격증
- C
- 리눅스명령어
- 머신러닝
- 정처기
- 프로그래밍
- 리눅스자격증
- 정보처리기사실기
- Java
- 리눅스활용
- 정보처리기사기출
- Today
- Total
Tech Trail
[정보처리기사 실기] C언어 프로그래밍 특강(2) 본문
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 반복문:
- i와 j를 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 += i로 j에 현재 i의 값인 3을 더하고, j는 6이 됩니다.
- 이제 i는 3이 되어 루프 비교 조건 i++ < 3이 거짓(False)이 됩니다. 그러나 후위 증가 연산자 i++는 현재 값을 사용한 후에 증가시키므로, 비교 조건에서는 이전 값을 비교하고, 그 후에 i가 1 증가하여 루프가 종료됩니다.
- 따라서 for 루프가 종료된 후에 i는 4가 됩니다.
(3) printf("i = %d, j = %d\n", i, j);
: i와 j의 값을 출력합니다. 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 >= a와 1 != 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) x와 y를 정수로 선언하고, x를 10으로 초기화하고, y는 ++x를 통해 11이 됩니다.
여기서 ++x는 x를 1 증가시킨 후, 그 값을 y에 할당하는 것을 의미합니다.
(3) i를 정수로 선언하고, --x / 2를 계산하여 i는 5가 됩니다.
--x는 x를 1 감소시킨 후, 그 값을 사용하는 것을 의미합니다.
(4) j를 정수로 선언하고, y % 7은 11을 7로 나눈 나머지인 4를 반환하며, j는 4 (나머지) + 5 (현재 i 값)로 계산되어 9가 됩니다.
i++는 현재 i의 값을 사용한 후에 1을 증가시키므로, i는 5로 사용된 후에 6으로 증가합니다.
(5) f(y, j) 함수를 호출합니다. 이때 실매개변수 y와 j가 함수 f의 인수로 전달됩니다.
(6) f 함수가 시작됩니다. 함수 내부에서 형식 매개변수 a, b, 그리고 s를 정수로 선언합니다.
(7) s에 a + 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 Learning > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] C언어 프로그래밍 특강(4) (0) | 2023.11.16 |
---|---|
[정보처리기사 실기] C언어 프로그래밍 특강(3) (2) | 2023.11.16 |
[정보처리기사 실기] C언어 프로그래밍 특강(1) (1) | 2023.11.16 |
[정보처리기사 실기] 2022년 3회 기출 : 브로드캐스트 주소 계산 문제 해설 (0) | 2023.11.16 |
[정보처리기사 실기] 2023년 1회 기출 코드 해설 (C언어, Java, Python) (0) | 2023.11.16 |