관리 메뉴

나구리의 개발공부기록

Chapter 02 - C언어(예상문제) 본문

2024년도 수제비 정보처리기사 실기책(6판) 내용 정리


1. C코드의 출력 결과 작성

문제 및 풀이

#include <stdio.h>

int Soojebi(int num) {
  int i;
  // 1. 2 < 2, 1반환
  for(i=2; i<num; i++){ // 2부터 매개변수의 수까지 반복문 실행
  // 2. 2 < 3, 3 % 2 == 1, 1반환
  // 3. 2 < 4, 4 % 2 == 0, 0반환
  // 4. 2 < 5, ... 5 % 4 == 1, 1반환
  // 5. 2 < 6, 6 % 2 == 0, 0반환
  // 6. 2 < 7, ... 7 % 6 == 1, 1반환
  // 7. 2 < 8, 8 % 2 == 0, 0반환
  // 8. 2 < 9, ... 9 % 3 == 0, 0반환
    if(num % i == 0)
      return 0;
  }
  return 1;
}
int main(){
  int num = 10, cnt=0, i;
  // 2 ~ 9까지 반복문 실행 (8번)
  for(i=2; i<num; i++)
    cnt += Soojebi(i); // 반복문 진행 되는 동안 함수의 결과를 cnt에 저장
    // Soojebi(2) == 1
    // Soojebi(3) == 1
    // Soojebi(4) == 0
    // Soojebi(5) == 1
    // Soojebi(6) == 0
    // Soojebi(7) == 1
    // Soojebi(8) == 0
    // Soojebi(9) == 0
    
  printf("%d\n", cnt); // cnt 반환
}

// 4

2. 1에서 6사이에 숫자를 10번 임의로 생성한 값을 hist라는 배열에 저장, 1 ~ 6까지 몇 번 발생했는지 출력하는 코드를  ①, ② 에 코드를 입력하여 완성

문제 및 풀이

#include <stdio.h>
#include <stdlib.h> # srand함수 사용을 위함
#include <time.h> # 시간함수사용을 위함

int main(){
  int hist[6] = {0,};
  int n, i = 0;
  srand(time(NULL));
  
  // 1 ~ 6 숫자를 임의로 생성한다, 길이가 6인 배열의 인덱스번호는 0 ~ 5
  // 임의로 생성한 숫자에서 -1을 하면 인덱스 번호가 됨
  do {
    i++;
    n = rand()%6 + 1;  // 1 ~ 6 숫자를 임의로 생성하는 코드
    hist[①] += 1;      // 생성한 값을 배열에 넣는 코드, 5를 넘어가면 에러가 발생함
  } while(i<10);
  
  for(i=0; i<6; i++)
    printf("h[%d]=%d\n.", i, ②); // 2번에서는 배열의 값을 출력하면됨
}
// ① : n-1
// ② : hist[i]

3.  값을 10개 입력받아 가장 작은값을 출력하는 C코드의 밑줄친 곳에 적합한 답을 작성

문제 및 풀이

#include <stdio.h>
int 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 > _______){ // min값과 num[i]값을 비교해서 min이 더 크면 num[i]의 값을 min에 저장
      min = num[i]
    }
  }
  printf("%d", min);
}
// num[i]

4. 숫자 5개를 입력받아 짝수가 몇개인지 구하는 코드의  밑줄에 들어갈 가장 적합한 답을 작성

문제 및 풀이

#include <stdio.h>
int main() {
  int i, cnt=0;
  int arr[5];
  
  for (i=0; i<5; i++) {
    scanf("%d", &arr[i]);
  }
  
  for (i=0;i<5;i++){
    if(arr[i] % 2 ______ 0) // 2로 나눈 나머지가 0일때 카운트를 증가시키면 됨
      cnt = cnt + 1;
  }
  
  printf("%d", cnt);
}
// ==

5. C언어 코드의 밑줄에 들어갈 가장 적합한 답을 작성

출력결과 : value = 40

                  value = 30

                  value = 20


문제 및 풀이

#include <stdio.h>
#define MAX_SIZE 10
int stack[MAX_SIZE];
int top = -1;   // 스택의 top을 뜻함

void push(int item) {
  if(top >= ___①___)    // stack 배열이 꽉참, 마지막 인덱스보다 크거나 같을때 문구 출력
    printf("stack is full\n");
  else  
    stack[++top] = item;
}

int pop() {
  if(top == ___②___) {  // stack 배열이 비어있음, stack의 값을 다 꺼냈지만 또 꺼내려고할때 문구 출력
    printf("stack is empty\n");
    return -1;
  }
  return stack[top--];
}

int is_empty(){
  if(top == -1)
    return 1;
  else
    return 0;
}

int main() {
  push(20);
  push(30);
  push(40);
  while(!is_empty()) {
    printf("value = %d\n", pop());
  }
}

// ① MAX_SIZE-1 or 9
// ② -1

6. C언어 코드의 밑줄에 들어갈 가장 적합한 답을 작성

출력 결과 : 54321000


문제 및 풀이

#include <stdio.h>
int main() {
  char ch, str[] = "12345000";
  int i, j;
  
  for (i=0; i<8; i++){
    ch = str[i];
    if (_______) // ch의 값이 문자 0이면 break;
      break;
  }
  
  for(j=0; j<i; j++) {
    j--;
    ch = str[j];
    str[j] = str[i];
    str[i] = ch;
  }
  
  printf("%s", str);
}

// ch == '0'

7. C코드의 실행 결과작성

문제 및 풀이

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
  char str1[20] = "KOREA";
  char str2[20] = "LOVE";
  char* p1 = NULL;
  char* p2 = NULL;
  p1 = str1; // 포인터 변수 p1에 str1의 주소를 저장 (&str[0])
  p2 = str2; // 포인터 변수 p2에 str2의 주소를 저장 (&str[0])
  str1[1]=p2[2];  // p2[2] == str2[2], str2[2]에 저장된 값을 str1[1]에 저장, KVREA
  str2[3]=p1[4];  // p1[4] == str1[4], str1[4]에 저장된 값을 str2[3]에 저장, LOVA
  strcat(str1, str2);  // str1 문자열 뒤에 str2 문자열을 붙힘, KVREALOVA
  printf("%c", *(p1+2)); // p1[2]의 값을 출력, R
  return 0;
}
// R

8. C코드의 실행 결과작성

문제 및 풀이

#include <stdio.h>
int main(int argc, char *argv[]) {
  int arr[2][3] = {1,2,3,4,5,6};  // 123
                                  // 456
                                  
  int (*p)[3] = NULL; // 길이가 3인 int타입 포인터 배열 선언, p[x][3]인 크기의 배열을 가리킬 수 있음
  p=arr;  // 포인터 배열 p에 arr의 주소를 저장
 
  printf("%d", *(p[0]+1) + *(p[1]+2)); // p[0][1] + p[1][2] == arr[0][1] + arr[1][2]
  printf("%d", *(*(p+1)+0) + *(*(p+1)+1)); // p[1][0] + p[1][1] == arr[1][0] + arr[1][1]
  return 0;
}

// 89

9. C코드의 실행 결과작성

문제 및 풀이

#include <stdio.h>
int main(int argc, char *argv[]) {
  int n1=1, n2=2, n3=3;
  int r1, r2, r3;
  
  r1=(n2<=2)||(n3>3);  // r1 = 1
  r2=!n3;              // r2 = 0
  r3=(n1>1)&&(n2<3);   // r3 = 0
  
  printf("%d", r3-r2+r1);  // 0 - 0 + 1
  return 0;
}

// 1

10. C코드의 출력 결과 작성

문제 및 풀이

#include <stdio.h>

int fn(char* a){
  int i = 0;
  for (i=0; a[i] != '\0'; i++); // 'H','e','l','l','o','\0' 문자 타입 배열의 마지막 인덱스값 반환
    return i;
}

int main() {
  char a[10] = "Hello";  // 문자 배열로 입력
  printf("%d", fn(a));   // 출력 결과 반환(정수)
}

// 5

11. C코드의 출력 결과 작성

문제 및 풀이

#include <stdio.h>
struct st{
  int a;
  int c[10];
};

int main(int argc, char *argv[]){
  int i = 0;
  struct st ob1;  // 구조체 변수1 선언
  struct st ob2;  // 구조체 변수2 선언
  ob1.a = 0;
  ob2.a = 0;
  
  for(i=0; i<10; i++){ // 구조체의 배열 c 변수에 값을 저장
    ob1.c[i] = i;  // 그냥 인덱스 값을 저장
                   // 0,1,2,3,4,5,6,7,8,9
    ob2.c[i] = ob1.c[i] + i; // 인덱스 + ob1.c[i]값을 더해서 저장
                             // 0, 2, 4, 6, 8, 10, 12, 14, 16, 18
  }
  
  for(i=0; i<10; i=i+2){
    ob1.a = ob1.a + ob1.c[i]; // 0, 2, 4, 6, 8을 더하기
    ob2.a = ob2.a + ob2.c[i]; // 0, 4, 8, 12, 16을 더하기
  }
  
  printf("%d", ob1.a + ob2.a); // 위의 연산결과들을 더하기 연산
  return 0;
}

// 60

12. C코드의 출력 결과 작성

문제 및 풀이

#include <stdio.h>
int f(int i);
int main() {
  printf("%d %d %d", f(1), f(5), f(-2));
}

int f(int i) {
  if(i<=2)     // f(1), f(-2)는 각각 1을 반환
    return 1;
  else
    return f(i-1)+f(i-2);
    // 3(2.번의 연산결과 반환) + 2(3.번의 연산 결과 반환)
    
    // 1. f(5-1) 재귀 + f(5-2) 재귀
    // 2. f(4-1) 재귀 + f(4-2) 1반환 -> f(5-1)에 3반환
    // 3. f(3-1) 1반환 + f(3-2) 1반환 -> f(5-2)에 2 반환
    // 4. f(3-1) 1반환 + f(3-2) 1반환 -> f(4-1)에 반환
}

// 1 5 1