일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- IT
- 정보처리기사실기
- python
- Linux
- 코딩
- 리눅스
- 정처기
- 웹개발
- 머신러닝
- 정처기기출
- 정보처리기사
- C
- AI
- 리눅스마스터2급2차
- 리눅스활용
- 정보처리기사기출
- Django
- 정처기실기
- 리눅스마스터2급
- 공부블로그
- 장고
- 리눅스자격증
- 리눅스명령어
- Java
- SW
- 기사자격증
- 프로그래밍
- 리눅스마스터
- 자격증
- IT자격증
- Today
- Total
Tech Trail
[정보처리기사 실기] C언어 프로그래밍 특강(1) 본문
1번 문제
#include <stdio.h>
void main() {
float a = 3 / 2; // 정수 나눗셈 결과를 부동 소수점 변수에 할당
float b = 3.0 / 2; // 부동 소수점 나눗셈 결과를 부동 소수점 변수에 할당
int c = (int)b; // 부동 소수점 변수를 정수로 변환하여 정수 변수에 할당
printf("%7.3f%7.3f%3d\n", a, b, c);
}
(1) #include <stdio.h>
: 이 코드는 표준 입력 및 출력 함수를 사용하기 위해 필요한 헤더 파일을 포함합니다.
(2) void main()
: C 프로그램은 main 함수에서 실행을 시작하므로 main 함수를 정의합니다.
void는 이 함수가 아무 값도 반환하지 않음을 의미합니다.
(3) float a = 3 / 2;
: 변수 a는 3을 2로 나눈 결과를 부동 소수점으로 저장합니다.
그러나 여기서 주의할 점은 나눗셈 연산이 정수 나눗셈으로 수행되므로 결과는 1이 됩니다.
따라서 a는 1.000으로 초기화됩니다.
(4) float b = 3.0 / 2;
: 변수 b는 부동 소수점으로 초기화되며, 이 때 3.0을 2로 나눈 결과는 부동 소수점 형태로 저장됩니다.
따라서 b는 1.500으로 초기화됩니다.
(5) int c = (int)b;
: 변수 c는 b의 값을 정수로 변환하여 저장합니다.
정수로 변환하면 소수 부분은 버려지며, c는 1로 초기화됩니다.
(6) printf("%7.3f%7.3f%3d\n", a, b, c);
: 이 줄은 형식화된 출력을 수행합니다. 각 % 다음에 오는 서식 지정자는 해당하는 변수 값을 출력하는 데 사용됩니다.
- %7.3f: 부동 소수점 숫자를 표시하는데 사용되며, 전체 필드 너비가 7자리이고 소수점 이하 3자리까지 표시하도록 설정됩니다.
- %3d: 정수를 표시하는데 사용되며, 전체 필드 너비가 3자리로 설정됩니다.
<출력>
1.000 1.500 1
- a는 정수로 나눈 결과로 인해 1.000이 출력됩니다.
- b는 부동 소수점 나눗셈 결과로 인해 1.500이 출력됩니다.
- c는 b의 값을 정수로 변환한 결과로 인해 1이 출력됩니다.
2번 문제
#include <stdio.h>
void main() {
int su1 = 16, su2 = 4, mov1, mov2;
mov1 = su1 >> 2;
mov2 = su2 << 4;
printf("%d %d\n", mov1, mov2);
}
(1) int su1 = 16, su2 = 4, mov1, mov2;
: 정수형 변수 su1, su2, mov1, mov2를 선언하고 초기값을 할당합니다.
su1은 16으로 초기화되고, su2는 4로 초기화됩니다.
(2) mov1 = su1 >> 2;
: 비트 오른쪽 시프트 연산자 >>를 사용하여 su1 변수의 비트를 오른쪽으로 2번 이동시키고 그 결과를 mov1에 할당합니다.
비트 오른쪽 시프트는 주어진 수를 2의 거듭제곱으로 나누는 효과를 가지며, 이 경우 su1을 2의 제곱수인 4로 나눈 결과인 4가 mov1에 저장됩니다.
(3) mov2 = su2 << 4;
: 비트 왼쪽 시프트 연산자 <<를 사용하여 su2 변수의 비트를 왼쪽으로 4번 이동시키고 그 결과를 mov2에 할당합니다.
비트 왼쪽 시프트는 주어진 수를 2의 거듭제곱으로 곱하는 효과를 가지며, 이 경우 su2를 2의 제곱수인 16으로 곱한 결과인 64가 mov2에 저장됩니다.
(4) printf("%d %d\n", mov1, mov2);
: 서식 지정자를 사용하여 변수 mov1과 mov2의 값을 출력합니다.
%d는 정수를 표시하는데 사용되며, 두 개의 정수 값이 출력됩니다.
<출력>
4, 64
- mov1은 su1의 값을 오른쪽으로 2번 시프트하여 4가 됩니다.
- mov2는 su2의 값을 왼쪽으로 4번 시프트하여 64가 됩니다.
3번 문제
#include <stdio.h>
void main() {
int a, b, c, r;
a = 4;
b = 2;
c = 3;
r = a++ - ++b * (c << 2);
printf("%d\n", r);
}
(1) int a, b, c, r;
: 정수형 변수 a, b, c, r을 선언합니다.
(2) a = 4;, b = 2;, c = 3;
: 변수 a, b, c에 각각 4, 2, 3을 초기화합니다.
(3) r = a++ - ++b * (c << 2);
: 이 줄은 복합 연산을 수행합니다.
- a++: a 값을 r에 할당한 후에 a를 1 증가시킵니다. 따라서 a는 5가 되고, r에는 4가 할당됩니다.
- ++b: b 값을 1 증가시킨 후에 사용합니다. 따라서 b는 3이 됩니다.
- c << 2: 비트 왼쪽 시프트 연산자 <<를 사용하여 c 변수의 비트를 왼쪽으로 2번 이동시킵니다. 이 경우 c의 이진 표현은 0000 0011이며, 시프트 연산 후에 0000 1100이 됩니다. 이 값을 10진수로 표현하면 12입니다.
- ++b * (c << 2): ++b와 c << 2의 결과를 곱합니다. 따라서 3 * 12는 36이 됩니다.
- a++ - (++b * (c << 2)): 4 - 36은 -32입니다. 이 결과가 r에 할당됩니다.
(4) printf("%d\n", r);
: 서식 지정자를 사용하여 변수 r의 값을 출력합니다.
%d는 정수를 표시하는데 사용되며, -32가 출력됩니다.
<출력>
-32
변수 a, b, c, r의 값과 각 단계의 연산이 설명된 것처럼 -32가 최종 결과로 출력됩니다.
4번 문제
#include <stdio.h>
void main() {
int x = 8;
int y = 9;
printf("%d", !!x);
printf("%d", x && y);
printf("%d", x || y);
}
(1) int x = 8;, int y = 9;: 정수형 변수 x와 y를 선언하고 초기화합니다.
x는 8로, y는 9로 초기화됩니다.
(2) printf("%d", !!x);
: 이 줄에서는 x 변수를 논리 연산자 !를 두 번 사용하여 불리언 값으로 변환한 후 출력합니다.
!!x는 x가 0이 아니면 1로, 0이면 0으로 변환됩니다. 따라서 출력 결과는 1이 됩니다.
(3) printf("%d", x && y);
: 이 줄에서는 x와 y의 논리 AND 연산을 수행한 후 결과를 출력합니다.
x && y는 x와 y가 둘 다 참(0이 아닌 값)일 때 참(1)을 반환하므로 출력 결과는 1이 됩니다.
(4) printf("%d", x || y);
: 이 줄에서는 x와 y의 논리 OR 연산을 수행한 후 결과를 출력합니다.
x || y는 x 또는 y 중 하나만 참이면 참(1)을 반환하므로 출력 결과는 1이 됩니다.
<출력>
111
- 첫 번째 줄에서 x의 불리언 값인 1 출력.
- 두 번째 줄에서 x && y의 논리 AND 결과인 1 출력.
- 세 번째 줄에서 x || y의 논리 OR 결과인 1 출력.
모든 출력 값은 1이 됩니다.
5번 문제
void main(void) {
enum {AA, BB, CC = -100, FF, KK};
printf("%d \n", AA + KK);
}
(1) enum {AA, BB, CC = -100, FF, KK};
: 이 줄에서는 열거형(enum)을 정의합니다.
열거형은 상수 값들의 집합을 나타내며, 각 상수는 순서대로 0부터 1씩 증가하는 값을 가집니다.
그러나 여기서 CC에 -100이 할당되었으므로 CC는 -100 값을 가집니다.
따라서 상수들의 값은 다음과 같습니다
AA=0, BB=1, CC=-100, FF=-99, KK=-98.
(2) printf("%d \n", AA + KK);
: 이 줄에서는 AA와 KK 상수를 더한 결과를 정수 형식으로 출력합니다.
AA는 0이고 KK는 -98이므로 AA + KK는 0 + (-98)이 되어 -98이 출력됩니다.
<출력>
-98
6번 문제
main( ){
int a, b, c;
a = 20, b = 30;
c = (a > b) ? a-- : --b;
printf("%d, %d\n", a, c);
}
() int a, b, c;
: 정수형 변수 a, b, c를 선언합니다.
(2) a = 20, b = 30;: 변수 a에 20을 할당하고, 변수 b에 30을 할당합니다.
여기서 쉼표(,)를 사용하여 변수 초기화를 동시에 수행합니다.
(3) c = (a > b) ? a-- : --b;
: 이 줄에서는 조건 연산자를 사용하여 a와 b를 비교한 후 c에 값을 할당합니다.
- 조건식 (a > b)는 a가 b보다 큰지 여부를 검사합니다. 여기서는 a가 20이고 b가 30이므로 조건은 거짓(false)입니다.
- 따라서 거짓일 때 (a > b)는 --b로 평가됩니다. 이는 b의 현재 값인 30을 c에 할당하기 전에 b를 1 감소시킵니다. 따라서 c에는 29가 할당되고, b는 29가 됩니다.
(4) printf("%d, %d\n", a, c);
: a와 c의 값을 출력합니다. a는 20, c는 29이므로 출력 결과는 다음과 같습니다.
20, 29
7번 문제
#include <stdio.h>
void main() {
int a, b, c;
a = (b = 7, (c = ++b + 2) + 5);
printf("%d, %d, %d\n", a, b, c);
}
(1) int a, b, c;
: 정수형 변수 a, b, c를 선언합니다.
(2) (b = 7, (c = ++b + 2) + 5): 이 부분은 표현식입니다.
여기서 , 연산자는 왼쪽에서 오른쪽으로 표현식을 평가하고 마지막 표현식의 결과를 반환합니다.
- 먼저 b에 7이 할당됩니다. 따라서 b는 7이 됩니다.
- 그 다음에는 (c = ++b + 2) + 5 표현식이 평가됩니다.
- ++b는 b를 1 증가시킨 후의 값을 반환합니다. 따라서 b는 8이 되고, ++b는 8을 반환합니다.
- 그 결과, c에 8 + 2 = 10이 할당됩니다.
- 마지막으로, (c = ++b + 2) + 5 표현식은 10 + 5 = 15를 반환합니다.
- 따라서 a에는 15가 할당됩니다.
(3) printf("%d, %d, %d\n", a, b, c);
: a, b, c의 값을 출력합니다. a는 15, b는 8, c는 10이므로 출력 결과는 다음과 같습니다.
15, 8, 10
8번 문제
#include <stdio.h>
void main() {
int a = 10, b = 0, c = 0;
if (a > 15 && ++b < 12 || c++) {
c++;
}
printf("%d %d %d", a, b, c);
}
(1) int a = 10, b = 0, c = 0;
: 정수형 변수 a, b, c를 선언하고 초기값을 할당합니다.
a는 10, b와 c는 모두 0으로 초기화됩니다.
(2) if (a > 15 && ++b < 12 || c++) { c++; }
: 조건문입니다.
- && 연산자의 왼쪽 조건인 a > 15가 거짓(False)이므로 오른쪽 조건 ++b < 12를 평가하지 않고 바로 넘어갑니다. 따라서 ++b가 실행되지 않고 b의 값은 그대로 0입니다.
- || (논리 OR)는 왼쪽 피연산자가 참(True)이면 오른쪽 피연산자를 평가하지 않고 결과가 참이 됩니다. 따라서 왼쪽 피연산자가 참인 경우, 오른쪽 피연산자는 실행되지 않습니다. 그러나 || 연산자의 왼쪽 조건인 ++b < 12가 거짓(False)이기 때문에 오른쪽 조건 c++를 평가합니다. c++는 실행되어 c의 값을 1 증가시킵니다.
(3) printf("%d %d %d", a, b, c);: a, b, c의 값을 출력합니다.
<출력>
10 0 1
💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.
💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.
틀린 부분이 있다면 언제든 댓글 남겨주세요 :)
💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.
'IT Learning > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] C언어 프로그래밍 특강(3) (2) | 2023.11.16 |
---|---|
[정보처리기사 실기] C언어 프로그래밍 특강(2) (0) | 2023.11.16 |
[정보처리기사 실기] 2022년 3회 기출 : 브로드캐스트 주소 계산 문제 해설 (0) | 2023.11.16 |
[정보처리기사 실기] 2023년 1회 기출 코드 해설 (C언어, Java, Python) (0) | 2023.11.16 |
[정보처리기사 실기] 2022년 3회 기출 코드 해설 (C언어, Java, Python) (0) | 2023.11.16 |