관리 메뉴

나구리의 개발공부기록

Chapter 02 - C언어(기출 문제_5) 본문

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


27. 다음의 선택정렬 코드의 밑줄에 알맞는 코드를 작성

실행 결과 : 11 12 22 25 64


문제 및 풀이

#includ <stdio.h>
int main() {
  int arr[] = {64, 25, 12, 22, 11};
  // 배열 arr의 사이즈의 값을 arr[0]의 길이로 나눈 몫을 저장
  int n = sizeof(arr)/sizeof(arr[0]);
  int i = 0, j, tmp;
  
  do{ // 아래코드는 무조건 1번 실행됨
    j = i + 1;
    
    do {
    // arr[0]의 값이 arr[1]의 값보다 크면 자리를 바꾸는 코드가 완성되야함
      if(arr[i]________arr[j]){
        tmp = arr[i];
        arr[i] = arr[j];
        arr[i] = tmp;
      }
      j++;
    } while (j<n);
    j++;
  } while (i < n-1);
  for(i=0; i<=4; i++)
    printf("%d ", arr[i]);
  return 0;
}

// > 
// 선택 정렬은 비교할 값이 비교대상의 값보다 크면 자리를 바꿔서 오름차순으로 만드는 알고리즘

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

문제 및 풀이

#include <stdio.h>
int main(){
  int c = 0;
  int i;
  
  // 1 ~ 2023까지 반복
  for (i=1; i<=2023; i++) {
    // i가 4의 배수이면 c의 값을 1증가
    // 1 ~ 2023까지 수중 4의 배수가 몇개있는지 구하는 코드
    // 2023 / 4를 하면 4의 배수의 개수가 구해짐
    if(i%4 == 0) c++;
  }
  printf("%d", c); // 505출력
  return 0;
}
// 505

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

문제 및 풀이

#include <stdio.h>
// n의 값이 sum과 같으면 1 아니면 0을 반환하는 함수
// 자기 자신을 제외한 약수의 합이 자기 자신과 같은 수 == 완전수.. 검색해서 처음암ㅋㅋ
// 자기 자신보다 작으면 부족수, 크면 과잉수라고 한다고 함
// 가장 작은 완전수들은 6, 28, 496, 8128 이다 -> 이런문제 나올때를 대비해서 어느정도 외워두자
int perfect_number(int n){
  int i, sum = 0;
  // 매개변수인 n의 값을 2로 나누어서 반복문을 실행
  for (i = 1; i <= n/2; i++) {
  // 1. 2가 매개변수로 들어옴, 1 <= 1까지 반복
  // 5. 3이 매개변수로 들어옴, 1 <= 1까지 반복 -> 동일하므로 연산 생략
  // 6. 4가 매개변수로 들어옴, 1 <= 2까지 반복
 // 10. n == 5, 1 <= 2까지 반복 -> 동일하므로 생략
 // 11. n == 6, 1 <= 3까지 반복 
  
    if(n % i == 0)  // n을 i로 나눈 나머지가 0이면 i를 sum에 누적 덧셈 연산
  // 2. 2 % 1 == 0, 이므로 다음 코드 실행
  // 7. 4 % 1 == 0, 4 % 2 == 0,
 // 12. 6 % 1, 6 % 2, 6 % 3 == 0
  
      sum += i;
  // 3. i를 sum에 누적 연산, sum = 1
  // 8. sum = 1 + 2, sum = 3
 // 13. sum = 1 + 2 + 3, sum =6
  }
  
  if (n == sum)
  // 4. n과 sum이 같지 않음으로 0을 반환
  // 9. n != sum 이므로 0을 반환
   
    return 1;
    // 14. n == sum이므로 1을 반환
    
    
  return 0;
}
int main() {
  int i, sum = 0;
  // 2부터 100까지 반복, 99회
  for (i = 2; i<=100; i++){
   
    // perfect_number함수 호출 결과가 1이면 i의 값을 sum에 누적 덧셈 연산
    if(perfect_number(i))
    // 15. i가 6일때 1(true)이므로 아래 코드 실행
      sum += i;
      // 16. sum = 6
      // 100 이하의 완전수들(6, 28)의 합을 구하는 코드임을 확인,
      // sum = 6 + 28 
  }
  printf("%d", sum); // 34
  return 0;
}
// 34

30. C언어에서 구조체의 포인터로 멤버에 접근하기 위한 기호를 작성

정답 : ->

#include <stdio.h>
struct Student{
  char gender;
  int age;
};

int main() {
  struct Student s = {'F', 20};
  struct Student *p = &s;
 
  printf("%c %d", (&s)->gender, (&s)->age);
  printf("%c %d", p->gender, p->age);
  
  return 0;
}

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

문제 및 풀이

#include <stdio.h>
int soojebi(int n) { // 매개변수의 값 7
  // 재귀 함수
  if(n<=1) { 
  // 1. n의 값이 1보다 크므로 else문 진행
  // 3. n의값이 6 , 4, 각각 else문 진행
  // 6. 4번의 n은 5, 3, 각각 else문 진행
  // 7. 5번의 n은 3, 1, 3은 else문, 1은 값을 return
 // 12. 9번의 n은 4, 2, 각각 else문 진행
 // 13. 10번의 n은 2, 1, 2는 else문 1은 값을 return
 // 14. 11번의 n은 2. 0, 2는 else문 0은 값을 return
 // 19. 15번의 n은 3, 1, 3은 else문 1은 값을 return
 // 21. 20번의 n은 2 else문 진행
  
    return n;
    // 8. 5번의 joojebi(4-3)의 결과를 반환 
  }
  else {
    return soojebi(n-1) + soojebe(n-3);
    // 2. soojebi(7-1) + soojebi(7-3) 둘다 다시 호출
   // 30.   + 1 (soojebi 함수의 7-3의 반환값은 1)
   // 37. 1 (joojebi 함수의 7-3의 반환값은 1) + 1 = 2, 최종 반환값은 2
   
    // 4. soojebi(6-1) + soojebi(6-3) 둘다 다시 호출, 2번의 soojebi(n-1)
   // 33.   + 1
   // 36. 0 + 1 = 1 return
   
    // 5. soojebi(4-1) 다시호출 + soojebi(4-3) 1 return, 2번의 soojebi(n-3)
   // 29. 0 + 1 = 1 return
    
    // 9. soojebi(5-1) + soojebi(5-3) 둘다 다시 호출, 4번의 soojebi(n-1)
   // 26. 1 + 
   // 35. 1 + 0 = 1 return
    
   // 10. soojebi(3-1) 다시호출 + soojebi(3-3) 0 return, 4번의 soojebi(n-3)
   // 32. 0 + 0 = 0 return
   
   // 11. joojebi(3-1) 다시호출 + soojebi(3-3) 0 return, 5번의 soojebi(n-1)
   // 28. 0 + 0 = 0 return
   
   // 15. soojebi(4-1) 다시호출 + soojebi(4-3) 1 return, 9번의 soojebi(n-1)
   // 25. 0 + 1 = 1 return
   
   // 16. soojebi(2-1) 1 return + soojebi(2-3) -1 return, 9번의 soojebi(n-3)
   // 34. 1 + -1 = 0 return
   
   // 17. soojebi(2-1) 1 return + soojebi(2-3) -1 return, 10번의 soojebi(n-1)
   // 31. 1 + -1 = 0 return
   
   // 18. soojebi(2-1) 1 return + soojebi(2-3) -1 return, 11번의 soojebi(n-1)
   // 27. 1 + -1 = 0 return
   
   // 20. soojebi(3-1) 다시호출 + soojebi(3-3) 0 return, 15번의 soojebi(n-1) 
   // 24. 0 + 0 = 0 return
   
   // 22. soojebi(2-1) 1 return + soojebi(2-3), -1 return, 20번의 soojebi(n-1), 재귀 끝
   // 23. 1 + -1 = 0 return
   
  }
}

int main() {
  // 아규먼트 값이 7인 soojebi 함수의 반환값을 출력
  printf("%d", soojebi(7)); // 2
  return 0;
}
// 2

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

문제 및 풀이

#include <stdio.h>
int main() {
  char *p = "KOREA";  // 문자타입 포인터 변수 p에 문자열"KOREA"의 주소를 저장
  // p[0] = K ... p[4] = A, p[5] = \0
  
  // p == 문자열의 주소, 모두 출력 
  printf("%s\n", p);
  
  // p+1 == 문자열의 주소 +1, 'O'부터 끝까지 툴력
  printf("%s\n", p+1);
  
  // *p == p[0], K 출력
  printf("%c\n", *p);
  
  // p[3]의 *(값)을 출력, E 출력
  printf("%c\n", *(p+3));
  
  // *p == p[0], K에 + 4를한 아스키코드의 문자 값을 출력, K L(+1) M(+2) N(+3) O(+4), O 출력
  printf("%c\n", *p+4);
  return 0;
}

// KOREA
// OREA
// K
// E
// O