* 위 게시글을 바탕으로 코드 정리를 하였습니다.
C
1. 다음 C언어로 구현된 프로그램에서 괄호 (1)에 해당되는 가장 적합한 변수(Variable)나 조건식을 C언어 코드 형식으로 쓰시오. (2017년 1회)
#include <stdio.h>
main()
{
int num[10];
int min = 9999;
int i;
for (i = 0; i < 10; i++)
{
scanf("%d", &num[i]);
}
for (i = 0; i < 10; i++)
{
if (min > ( 1 ) )
{
min = num[i];
}
}
printf("가장 작은 값은 %d이다.", min);
}
답안
num[i]
*답안 작성 시 C언어 코드 형식으로 쓰라는 조건이 있으므로 C언어 코드 형식에 맞게 답안을 작성해야 한다. 예를 들어 C언어 변수명은 대소문자를 구분하므로 num[i]를 NUM[I]와 같이 대문자로 작성하면 오답으로 처리된다.
2. 다음은 C언어로 구현된 100을 넘지 않는 소수의 개수를 구하는 프로그램에서 괄호 (1)에 해당하는 가장 적합한 변수나 조건식을 C언어 코드 형식으로 쓰시오. (2017년 2회)
#include <stdio.h>
int isprime(int number){
int i;
for(i=2; i<number; i++)
if( ( 1 ) )
return 0;
return 1;
}
int main(void) {
int number = 100, cnt = 0, i;
for(i=2; i<number; i++)
cnt = cnt +isprime(i);
printf("%d를 넘지 않는 소수는 %d개입니다.\n", number, cnt);
return 0;
}
동작 설명
- 소수 판별 함수 (isprime):
- 숫자 1 이하는 소수가 아니다.
- 숫자 2는 소수이다.
- 짝수는 2를 제외하고 소수가 아니므로 바로 0을 반환한다.
- 3부터 시작하여 홀수만 검사. 만약 나누어 떨어지면 소수가 아님. (효율성을 위해 i * i <= number 조건 사용)
- 메인 함수 (main):
- 2부터 99까지의 수를 검사한다.
- cnt 변수에 소수의 개수를 누적한다.
- 결과 출력
이 코드가 올바르게 컴파일되고 실행되면, 100 이하의 소수를 정확하게 계산하고 출력할 수 있다. 소수는 2, 3, 5, 7, 11, 13, 17, 19, ..., 97이며, 25개가 있다.
답안
number % i == 0
3. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. (2017년 3회)
#include <stdio.h>
int res10(void) {
return 4;
}
int res30(void) {
return 30 + res10();
}
int res200(void) {
return 200 + res30();
}
int main(void) {
int result;
result = res200();
printf("%d\n", result);
}
동작설명
- main 함수가 실행
- res200 함수가 호출.
- res200 함수에서 res30 함수가 호출.
- res30 함수에서 res10 함수가 호출.
- res10 함수는 4를 반환.
- res30 함수는 30 + 4 = 34를 반환.
- res200 함수는 200 + 34 = 234를 반환
출력 결과
234
4. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. (2017년 3회)
#include <stdio.h>
int power(int data, int exp) {
int i, result = 1;
for(i = 0; i<exp; i++)
result = result * data;
return result;
}
int main(void) {
printf("%d\n", power(2, 10));
return 0;
}
동작설명
- main 함수에서 power(2, 10)을 호출.
- power 함수가 실행:
- result를 1로 초기화.
- i가 0부터 exp (여기서는 10)보다 작을 때까지 반복.
- 각 반복에서 result에 data를 곱합.
- 최종적으로 result는 2의 10제곱인 1024.
출력 결과
1024
5. 다음은 C언어의 <출력>과 <코드>를 보고 괄고 (1), (2), (3), (4)에 적용될 수 있는 가장 적합한 답을 쓰시오. (2018년 1회)
<출력> statck's status value = 40 value = 30 value = 20 |
#include <stdio.h>
#define MAX_STACK_SIZE 10
int stack[MAX_STACK_SIZE];
int top = -1;
void push(int item) {
if(top >= ( 1 ) ){
printf("stack is full\n");
}
stack[++top] = ( 2 );
}
int pop(void){
if(top == ( 3 )) {
printf("stack is empty\n");
} return stack[( 4 )];
}
int isempty(void){
if(top == ( 3 )){
return 1;
}else
return 0;
}
int isfull(void){
if(top >= ( 1 ))
return 1;
else
return 0;
}
int main(void) {
int e;
push(20); push(30); push(40);
printf("stack's status\n");
while (!isempty()){
e = pop();
printf("value = %d\n", e);
}
}
동작설명
- push 함수 - 스택에 새로운 요소 추가
- if 문에서 top이 MAX_STACK_SIZE-1 또는 최대 크기인 9보다 크거나 같으면, 스택이 가득 찼음을 의미하며 stack is full 메시지를 출력한다.
- 그렇지 않으면 top을 1 증가시키고 그 위치에 item을 저장한다.
- pop 함수 - 스택에서 최상위 요소 제거 후 반환
- top이 -1이면 비어 있는 상태이므로 , stack is empty 메시지를 출력한다.
- 그렇지 않으면 top 위치의 요소를 반환하고 top 을 1 감소시킨다.
- isempty 함수 - 스택이 비어 있는지 확인
- top 이 -1이면 스택이 비어 있는 상태이므로 1을 반환하고 그렇지 않으면 0을 반환한다.
- isfull 함수 - 스택이 가득 찼는지 확인
- top이 9이상이면 스택이 가득 찼음을 의미하여 1을 반환하고 그렇지 않으면 0을 반환한다.
- push(20) 호출: 스택에 20을 추가. top은 0
- push(30) 호출: 스택에 30을 추가. top은 1
- push(40) 호출: 스택에 40을 추가. top은 2
- "stack's status"
- while (!isempty()) 루프: 스택이 비어 있지 않은 동안 반복한다.
- pop() 호출: 스택에서 최상위 요소 40을 제거하고 반환한다. top은 1이 됩니다. e는 40이 되고, 이를 출력한다.
- pop() 호출: 스택에서 최상위 요소 30을 제거하고 반환한다. top은 0이 됩니다. e는 30이 되고, 이를 출력한다.
- pop() 호출: 스택에서 최상위 요소 20을 제거하고 반환한다. top은 -1이 됩니다. e는 20이 되고, 이를 출력한다.
- 이제 스택이 비어 있으므로 isempty()가 1을 반환하여 루프를 종료한다.
답안
1 MAX_STACK_SIZE-1 또는 9
2 item
3 -1
4 top--
6. 다음은 5개의 정수를 입력받아 그 중 홀수의 개수를 구하여 출력하는 알고리즘을 C언어로 구현한 <코드>이다. 프로그램을 분석하여 괄호①에 가장 적절한 답을 쓰시오. (2018년 2회)
#include <stdio.h>
int main(void){
int i, a[5], cnt = 0;
for(i = 0; i < 5; i++)
scanf("%d", &a[i]);
for(i = 0; i < 5; i++) {
if(a[i] % 2 ( ① ) 0)
cnt = cnt + 1;
}
printf("홀수의 개수: %d개", cnt);
}
*답안 작성 시 주의 사항: C언어에서 사용하는 형식에 맞게 정확히 작성해야 한다. "같지 않다"는 표현을 '<>'으로 하지 않도록 주의한다.
동작설명
배열 a에 차례대로 1, 2, 3, 4, 5가 입력되었다고 가정하고 두 번째 for 문부터 디버깅한 결과이다.
i | a[i] | a[i]%2 | cnt | 출력 |
0 | 1 | 1 | 0 | 홀수의 개수: 3개 |
1 | 2 | 0 | 1 | |
2 | 3 | 1 | 2 | |
3 | 4 | 0 | 3 | |
4 | 5 | 1 | ||
5 |
답안
!= 또는 >
7. 다음은 C언어의 출력과 코들르 보고 괄호 ①에 가장 적합한 답을 쓰시오. (2018년 2회)
출력 1의 약수 : 1 2의 약수 : 1 2 3의 약수 : 1 3 4의 약수 : 1 2 4 5의 약수 : 1 5 |
#include <stdio.h>
int main(void) {
int i, j;
for(i = 1; i <= 5; i++) {
printf("%d의 약수 : ", i);
for (j = 1; j <= 5; j++) {
if( ( ① ) )
printf("%d", j);
}
printf("\n");
}
return 0;
}
동작설명
- 외부 for 문: 1부터 5까지 증가하며 i에 대해 약수를 출력하기 위한 메시지 출력
- 내부 for 문: 1부터 5까지 j에 대해 조건을 검사하며 i가 j로 나누어 떨어지면 약수이므로 j 를 출력
답안
i % j == 0
8. 다음은 6면 주사위를 100번 굴려서 나온 각 면의 수를 배열에 저장하여 출력하는 알고리즘을 C언어로 구현한 코드이다. 프로그램을 분석하여 괄호 ①, ②에 가장 적합한 답을 쓰시오. (2018년 3회)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int hist[6] = {0, };
int n, i = 0;
srand(time(NULL));
do {
i++;
n = rand() % 6 + 1;
hist[( ① )] += 1;
} while (i < 100);
for(i = 0; i < 6; i++)
printf("[%d] = %d\n", i+1, ( ② ));
}
동작설명
- srand(time(NULL))를 통해 난수 생성기를 초기화
- do-while 루프가 100번 반복.
- 난수로 생성된 주사위 면 n을 hist[n-1]에 기록합니다.
- for 루프를 통해 hist 배열의 값을 출력합니다.
- main 함수 종료
*srand(): 난수를 발생시킬 초기 값인 시드(seed)를 설정한다. 매 초마다 난수를 발생시키는 경우에는 보통 현재 시간 값을 사용한다.
*time(NULL): 1970년 1월 1일 이후부터 현재까지의 시간을 초 단위로 반환한다.
답안
① n-1 ② hist[i]
9. 다음은 연결 리스트를 활용하여 스택 구조를 C언어로 구현한 것이다. 출력과 코드를 보고 괄호 ①, ②에 가장 적합한 답을 쓰시오. (2018년 3회)
<출력> 30 20 10 |
#include <stdio.h>
#include <stdlib.h>
struct NODE {
int data;
struct NODE *Next;
};
struct NODE *head;
void Push(int data){
struct NODE *end = malloc(sizeof(struct NODE));
end->( ① ) = head -> ( ① );
end->data = data;
head->( ① ) = end;
}
int Pop(void) {
int a;
struct NODE *del = head -> ( ① );
head->( ① ) = del -> ( ① );
a = del -> data;
free(del);
return a;
}
int main(void) {
int r;
head = malloc(sizeof(struct NODE));
head->( ① ) = NULL;
Push(10);
Push(20);
Push(30);
r = ( ② );
printf("%d\n", r);
r = ( ② );
printf("%d\n", r);
r = ( ② );
printf("%d\n", r);
}
동작설명
- head 노드를 생성하고 스택을 초기화한다.
- Push(10)을 호출하여 스택에 10을 추가한다.
- Push(20)을 호출하여 스택에 20을 추가한다.
- Push(30)을 호출하여 스택에 30을 추가한다.
- Pop()을 호출하여 스택의 맨 앞 노드인 30을 제거하고, 이를 출력한다.
- Pop()을 호출하여 스택의 맨 앞 노드인 20을 제거하고, 이를 출력한다.
- Pop()을 호출하여 스택의 맨 앞 노드인 10을 제거하고, 이를 출력한다.
답안
① Next ② Pop()
10. 다음은 C언어로 구현된 프로그램을 분석하여 괄호 (①)~(②)에 가장 적합한 답을 쓰시오. (2019년 1회)
예) 1234567을 입력받으면 결과 1+2+3+4+5+6+7=28 출력
#include <stdio.h>
int main(void) {
int input, sum = 0;
scanf("%d", &input);
while(1) {
if( ( ① ) == 0)
break;
sum = sum + input % 10;
input = input / ( ② );
}
printf("%d\n", sum);
}
동작설명
1.사용자로부터 정수를 입력받는다.
2. while 문
- input이 0이 될 때까지 반복한다.
- input의 마지막 자리를 sum에 더한다.
- input의 마지막 자리를 제거한다.
3. while 문이 종료되면 sum를 출력한다.
input | sum | input%10 | 출력 |
1234 | 0 | 4 | 10 |
123 | 4 | 3 | |
12 | 7 | 2 | |
1 | 9 | 1 | |
0 | 10 |
답안
① input ② 10
11. 다음 C언어로 구현한 프로그램을 분석하여 괄호 ( )에 가장 적합한 답을 쓰시오. (2019년 2회)
#include <stdio.h>
int main(void) {
char ch, str[] = "12345000";
int i, j;
// 처음으로 '0'이 나오는 위치 찾기
for(i = 0; i < 8; i++){
ch = str[i];
if(( ))
break;
}
i--; // '0' 이전의 마지막 유효 인덱스로 이동
// 부분 문자열 뒤집기
for (j = 0; j < i; j++) {
ch = str[j];
str[j] = str[i];
str[i] = ch;
i--;
}
printf("%s\n", str); // 뒤집힌 문자열 출력
return 0;
}
실행 결과 : 54321000 |
동작설명
1. 처음 등장하는 '0'을 찾는다.
2. '0' 이전의 부분 문자열은 뒤집는다.
- i를 0이전의 마지막 유효 인덱스로 이동한다.
- j와 i를 사용하여 부분 문자열을 뒤집는다.
- j가 증가하고 i가 감소하면서 문자열의 양 끝에서부터 문자를 교환한다.
3. 수정된 문자열 출력
답안
ch == '0'
'[실기] 정보처리기사 > 프로그래밍 언어 활용' 카테고리의 다른 글
2020-2021 프로그래밍 문제 모음 (1) | 2024.07.17 |
---|---|
[SQL] 2017-2019 프로그래밍 문제 모음 (0) | 2024.07.15 |
[JAVA] 2017-2019 프로그래밍 문제 모음 (0) | 2024.07.13 |