🍉 2023년 1회 2번
출력 결과
#include <stdio.h>
int main() {
char a[] = "Art";
char *p = NULL;
p = a;
int i = 0;
printf("%s\n", a);
printf("%c\n", *p);
printf("%c\n", *a);
printf("%s\n", p);
for(int i = 0;a[i] != '\0';i++) {
printf("%c", a[i]);
}
}
답 :
Art
A
A
Art
Art
p = a에서 배열 변수 a의 주소값을 포인터 변수 p가 가리키게 된다.
printf("%s\n", a) => a의 주소값에서 문자열을 출력한다. 즉, Art
printf("%c\n", *p) => *p는 a의 실제값에 대한 문자를 출력한다. 즉, A
printf("%c\n", *a) => 배열명은 그 자체로 시작 주소값이기에, 배열의 실제값인 *a를 문자로 출력한다. 즉, A
printf("%s\n", p) => 배열 시작 주소값의 실제 값부터 문자열을 출력한다. 즉, Art
printf("%c", a[i]) => for 반복문으로 배열의 모든 요소를 한 문자씩 출력한다. 즉, Art
🍉 2023년 1회 3번
출력 결과
#include <stdio.h>
int main() {
char* a = "qwer";
char* b = "qwtety";
int i, j;
for(int i = 0;a[i] != '\0';i++) {
for(int j = 0;b[j] != '\0';j++) {
if(a[i] == b[j]) {
printf("%c", a[i]);
}
}
}
}
답 : qwe
char a[] = "qwer"과 같이 배열을 기반으로 하는 변수 형태의 문자열 선언과 달리,
char* a = "qwer", char* b = "qwtety"와 같이 포인터 기반의 문자열을 선언하는 변수가 있다.
두 변수는 아래와 같은 값을 가진다.
a[0] | q |
a[1] | w |
a[2] | e |
a[3] | r |
a[4] | \0 |
b[0] | q |
b[1] | w |
b[2] | t |
b[3] | e |
b[4] | t |
b[5] | y |
b[6] | \0 |
이러한 상황에서 이중 반복문을 이용하여 두 변수의 각 요소를 하나씩 비교하여 서로 값이 일치할 때 출력을 한다.
반복문은 각 배열의 값이 문자열의 끝인 '\0'일 때까지 반복한다.
🍉 2023년 1회 9번
빈 칸
// 이진수를 십진수를 변환하는 코드
#include <stdio.h>
int main() {
int input = 101110;
int di = 1;
int sum = 0;
while (1) {
if(input == 0) {
break;
} else {
sum = sum + (input ① ②) * di;
di = di * 2;
input = input / 10;
}
}
printf("%d", sum);
}
① : %
② : 10
이진수를 십진수로 변환하는 코드이다.
이진수 값을 10으로 나눴을 때의 나머지 값에 2의 n승을 곱해준 뒤 총합 변수에 더해준다.
n을 2배로 곱해준다.
이진수 값을 10으로 나눠준다.
이러한 과정을 반복해주는 것이다.
🍉 2023년 2회 1번
빈 칸
// 입력값이 54321일 경우, 출력값이 43215로 출력되어야 함
#include <stdio.h>
int main() {
int n[5];
int i;
for(i = 0;i < 5;i++) {
printf("숫자를 입력해주세요. : ");
scanf("%d", &n[i]);
}
for(i = 0;i < 5;i++) {
printf("%d", ____);
}
return 0;
}
답 : n[(i + 1) % 5]
입력값이 54321일 때, 43215가 출력되어야 한다.
즉, a[1], a[2], a[3], a[4], a[0]이 순차적으로 출력되어야 하는 것이다.
이런 산술 연산자가 빈 칸에 들어가는 문제는 보통 /와 %가 중요하다.
i / 5, i % 5, i % 5 + 1 등... 여러 가지를 시도하면서 찾아가야 한다.
a[1], a[2], a[3], a[4], a[0]이 순차적으로 출력되는 부분과 a[0]이 마지막에 출력되는 부분에 초점을 맞추며 푼다.
- 우선 i에 0, 1, 2 ,3이 들어갈 때에는 1만큼 큰 수가 나오는 수식
- i에 4가 들어갈 때에는 0이 나오는 수식
우선 첫 번째 조건을 만족하는 수식은 n[i + 1]이다.
해당 수식에서 두 번째 조건을 만족하는 수식을 /, % 등을 이용해 만들보자.
i + 1란 수식에서 i의 값에 4가 들어가면 5가 된다.
5가 0이 되려면? 5로 나눈 나머지 값을 구하면 된다.
즉, n[(i + 1) % 5]이다.
🍉 2023년 2회 3번
출력 결과
// 입력값은 홍길동, 김철수, 박영희 순서로 주어진다.
#include <stdio.h>
char n[30];
char *test() {
printf("입력하세요 : ");
gets(n);
return n;
}
int main() {
char *test1;
char *test2;
char *test3;
test1 = test();
test2 = test();
test3 = test();
printf("%s\n", test1);
printf("%s\n", test2);
printf("%s\n", test3);
}
답 :
박영희
박영희
박영희
문자열을 입력받아 사용자가 전달한 메모리에 저장하는 함수인 gets() 함수가 사용되었다.
test1 = test();
test2 = test();
test3 = test();
위 코드에서 gets() 함수를 통해 각각 홍길동, 김철수, 박영희를 입력받았다.
이 때, test() 함수를 호출하여 해당 함수 내에서 gets()를 호출하였는데, 전역 변수로 선언한 문자형 배열 n에 대해 문자열을 저장하였다.
즉, tes1, test2, test3가 각각 따로 test() 함수를 호출하여 다른 문자열을 입력받았지만, 모두 전역 변수 n의 주소값을 할당받은 것이다.
따라서 가장 마지막에 입력받은 박영희가 변수 n에 초기화되었고 test1, test2, test3는 모두 n을 가리킨다.
이를 출력하면 모두 박영희를 출력한다.
(요점은 포인터 변수 3개가 1개의 변수를 가리킨다는 것이다.)
🍉 2023년 2회 5번
출력 결과
int n[3] = {73, 95, 82};
sum = 0;
for(int i = 0;i < 3;i++) {
sum += n[i];
}
switch(sum / 30) {
case 10:
case 9:
printf("A");
case 8:
printf("B");
case 7:
case 6:
printf("C");
default:
printf("D");
}
답 : BCD
sum = 250
switch(sum / 30) => switch(8)
따라서 case 8을 실행한다.
switch문은 항상 break문 유무를 신경쓰면서 풀자.
🍉 2023년 2회 7번
출력 결과
#include <stdio.h>
int main() {
int c = 0;
for(int i = 0;i <= 2023;i++) {
if(i % 4 == 0) {
c++;
}
}
printf("%d", c);
}
답 : 505
0부터 2023까지의 수 중에서 4의 배수의 개수를 출력하는 문제이다.
🍉 2023년 2회 9번
출력 결과
#include <stdio.h>
#define MAX_SIZE 10
int isWhat[MAX_SIZE];
int point = -1;
void into(int num) {
if(point >= 10) printf("FULL");
isWhat[++point] = num;
}
int take() {
if(isEmpty() == 1) printf("Empty");
return isWhat[point--];
}
int isEmpty() {
if(point == -1) return 1;
return 0;
}
int isFull() {
if(point == 10) return 1;
return 0;
}
int main(int argc, char const *argv[]) {
int e;
into(5);
into(2);
while(!isEmpty()) {
printf("%d", take());
into(4);
into(1);
printf("%d", take());
into(3);
printf("%d", take());
printf("%d", take());
into(6);
printf("%d", take());
printf("%d", take());
}
return 0;
}
답 : 213465
FILO(First-In Last-Out) 또는 LIFO(Last-In First-Out)를 코드로 출력되게끔 한 문제이다.
실수만 하지 않으면 잘 풀 수 있다.
🍉 2023년 2회 18번
빈 칸
// 선택 정렬 구현 문제
#include <stdio.h>
int main() {
int E[] = {64, 25, 12, 22, 11};
int n = sizeof(E) / sizeof(E[0]);
int i = 0;
do {
int j = i + 1;
do {
if(E[i] ___ E[j]) {
int temp = E[i];
E[i] = E[j];
E[j] = temp;
}
j++;
} while(j < n);
i++
} while(i < n - 1);
for(int i = 0;i <= 4;i++) {
printf("%d", E[i]);
}
}
답 : >
sizeof(E) / sizeof(E[0]) = n = 5이다.
오름차순 선택 정렬을 위해서 인접 요소를 비교하면 된다.
즉 i보다 1이 큰 j에 대해서, E[i] > E[j]로 비교하면 된다.
'정보처리기사 > 기출' 카테고리의 다른 글
[정보처리기사] 기출문제_DB (2021년 실기) (1) | 2024.04.27 |
---|---|
[정보처리기사] 기출문제_DB (2020년 실기) (0) | 2024.04.27 |
[정보처리기사] 기출문제_C언어 (2022년 실기) (0) | 2024.04.18 |
[정보처리기사] 기출문제_C언어 (2021년 실기) (0) | 2024.04.18 |
[정보처리기사] 기출문제_C언어 (2020년 실기) (0) | 2024.04.18 |