관리 메뉴

나구리의 개발공부기록

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

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


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

#include <stdio.h>
int Soojebi(int base, int exp) {
  int i, result = 1;
  for (i = 0; i<exp; i++)
    result *= base;
  return result;

}

int main() {
  printf("%d", Soojebi(2,10));
  return 0;
}

 

풀이

#include <stdio.h>
int Soojebi(int base, int exp) {   // 매개변수가 2개인 사용자 정의 함수
  int i, result = 1;
  for (i = 0; i<exp; i++)  // 0부터 2번재 매개변수의 값미만 까지 1씩 증가시키며 반복
                           // 0 ~ 9까지(10번)
                           
    result *= base; // 첫번째 매개변수와 result의 값을 곱한 값을 10번 누적 연산
                    // 1 * 2 = 2
                    // 2 * 2 = 4
                    // 4 * 2 = 8 .... 이런식으로 10번
                    // 16, 32, 64, 128, 256, 512, 1024 (2의 10제곱)
  return result;  // 1024를 반환

}

int main() {
  // 아규먼트 값을 2, 10으로 한 Soojebi 함수의 호출 연산 결과를 출력
  printf("%d", Soojebi(2,10));  // 1024 출력
  return 0;
}

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

#include <stdio.h>
int main() {
  int *arr[3];
  int a = 12, b = 24, c = 36;
  arr[0] = &a; 
  arr[1] = &b;
  arr[2] = &c;
  printf("%d\n", *arr[1] + **arr + 1);
  return 0;
}

 

풀이

#include <stdio.h>
int main() {
  int *arr[3]; // 길이가 3인 인트형 포인트 배열 선언
  int a = 12, b = 24, c = 36;
  arr[0] = &a; // a의 주소값 저장
  arr[1] = &b; // b의 주소값 저장
  arr[2] = &c; // C의 주소값 저장
  
  // *arr[1] == *(&b), *과 & 연산은 서로 반대로 상쇄되여 b가 됨, 24
  // **arr == *arr[0], 즉 *(&a), 위와 마찬가지로 a가됨, 12
  // 24 + 12 + 1, 37이 출력됨
  printf("%d\n", *arr[1] + **arr + 1);
  return 0;
}

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

#include <stdio.h>
struct Soojebi {
  char name[20];
  int os, db, hab1, hab2;
};
int main() {
  struct Soojebi s[3] = {{"데이터1", 95, 88},
                         {"데이터2", 84, 91},
                         {"데이터3", 86, 75}};
  
  struct Soojebi *p;
  p = &s[0];
  (p+1)->hab1 = (p+1)->os+(p+2)->db;
  (p+1)->hab2 = (p+1)->hab1 + p->os + p->db;
  printf("%d\n", (p+1)->hab1 + (p+1)->hab2);
  return 0;
}

 

풀이

#include <stdio.h>
struct Soojebi {  // 구조체 선언
  char name[20];
  int os, db, hab1, hab2;
};
int main() {
  // 구조체 배열에 각 데이터를 저장
  struct Soojebi s[3] = {{"데이터1", 95, 88},
                         {"데이터2", 84, 91},
                         {"데이터3", 86, 75}};
  
  struct Soojebi *p;  // 구조체 포인터 변수 선언
  p = &s[0]; // p는 구조체 변수 s[0]의 주소를 저장
  
  // p+1 == s[1], s[1]의 구조체의 hab1에 연산결과를 저장
  // s[1]의os값과 s[2]의db값을 더한 값을 저장, 84 + 75 = 159
  (p+1)->hab1 = (p+1)->os+(p+2)->db;
  
  // s[1]의 hab2에 연산결과를 저장
  // 위에서 연산한 s[1]의 hab1과 s[0]의 os와 db값을 덧셈 연산, 159 + 95 + 88
  (p+1)->hab2 = (p+1)->hab1 + p->os + p->db;
  printf("%d\n", (p+1)->hab1 + (p+1)->hab2); // 159 + 342 = 501 출력
  return 0;
}

11. 다음 소스 코드에 입력값이 5가 들어왔을 때 출력값을 작성

#include <stdio.h>
int fn(int a) {
  if (a <= 1) return 1;
  return a * fn(a-1);
}
int main() {
  int a;
  scanf("%d", &a);
  printf("%d", fn(a));
  return 0;
}

 

풀이

 

#include <stdio.h>

int fn(int a) {
  // a 가 1보다 작거나 같으면 1을 반환하고 아니면 a * fn(a-1);의 연산을함, 재귀함수
  // 2. 5 * fn(4) 10. 5 * 24 = 120(반환값)
  // 3. 4 * fn(3) 9.  4 * 6  = 24
  // 4. 3 * fn(2) 8.  3 * 2  = 6
  // 5. 2 * fn(1) 7.  2 * 1  = 2, 2는 fn(2)의 값
  // 6. if문에 걸려서 1을 반환함 -> 이제 역순으로 올라감(스택구조)
  if (a <= 1) return 1;
  return a * fn(a-1);   // 최종으로 120을 return함
}

int main() {
  int a;
  scanf("%d", &a);     // 1. a = 5,
  printf("%d", fn(a)); // 12. fn(5) = 120을 정수형으로 출력
  return 0;
}

12. 빈칸에 연산자를 써서 정수를 역순으로 출력하는 프로그램을 완성

  • ex) 1234의 역순 = 4321이며 1230처럼 0으로 끝나는 정수는 고려하지 않는다
#include <stdio.h>
int main(){
  int number = 1234;
  int div = 10;
  int result = 0;
  while (number  [빈칸1]  0) {
    result = result * div;
    result = result + number    [빈칸2]   div;
    number = number    빈칸    div;
  }
  printf("%d", result);
  return 0;
}

 

풀이

#include <stdio.h>
int main(){
  // 정수를 역순으로 뒤집기
  int number = 1234; 
  int div = 10;
  int result = 0;
  
  // number > 0, number가 0이 될때까지 while문 진행, 0이되면 반복문 종료
  // number != 0 이것도 됨
  while (number  [빈칸1]  0) {
    
    // 1. result = 0
    // 4. 40 = 4 * 10,     result = 40    
    // 7. 430 = 43 * 10,   result = 430
    // 10.4320 = 432 * 10, result = 4320
    result = result * div;
    
    // 2.  4 = 0 + 1234 % 10,    result = 4
    // 5.  43 = 40 + 123 % 10,   result = 43
    // 8.  432 = 430 + 12 % 10,  result = 432
    // 11. 4321 = 4320 + 1 % 10, result = 4321
    result = result + number    [빈칸2]   div;
    
    
    // 3.  123 = 1234 / 10, number = 123
    // 6.  12 = 123 / 10,   number = 12
    // 9.  1 = 12 / 10,     number = 1
    // 12. 0 = 1 / 10,      number = 0, while문 종료
    number = number    [빈칸3]    div;

  }
  printf("%d", result);  // 4321 출력
  return 0;
}

// 빈칸1 : > or !=
// 빈칸2 : %
// 빈칸3 : /

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

#include <stdio.h>
int isPrime(int number) {
  int i;
  for (i=2; i<number; i++) {
    if (number % i ==0) return 0;
  }
  return 1;
}
int main() {
  int number = 13195, max_div=0, i;
  for (i=2; i<number; i++)
    if (isPrime(i) == 1 && number % i == 0)
      max_div = i;
    printf("%d", max_div);
    return 0;
}

 

풀이

#include <stdio.h>
// 가장 큰 소수를 찾는 문제

int isPrime(int number) {
  int i;
  // 2부터 13194까지 들어옴,
  for (i=2 i<number; i++) {
    // 13195를 i로 나눈 값이 0일때는 0을 반환 (소수가 아니면)
    if (number % i == 0) return 0;
  }
  // 그 외에는 1을 반환(소수이면)
  return 1;
}

int main() {
  int number = 13195, max_div=0, i;
  // 2부터 13194까지 1씩 증가면서 반복, 13193번 반복
  for (i=2; i<number; i++)
    // isPrime(i) == 1의 뜻은 i는 소수라는 뜻,
    // number % i == 0 의 뜻은, i는 number를 나눌 수 있는 인수라는뜻
    // 둘의 조건이 &&조건으로 묶여있으므로 i는 소수이며 인수, 즉 i는 소인수,
    if (isPrime(i) == 1 && number % i == 0)
      max_div = i; // 13195를 소수로 나누었을 때 0이 되면 해당 값을 max_div에 저장
      // 처음 소인수를 찾으면 구해진 몫을 소수로 나누면서 다음 소인수를 찾음
      // 5, 7, 13, 29(29가 최대 소인수)
    printf("%d", max_div);  // 29를 출력
    return 0;
}

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

#include <stdio.h>
struct student {
  int n, g;
};
int main() {
  struct student st[2];
  int i = 0;
  for (i; i < 2; i++){
    st[i].n = i;
    st[i].g = i + 1;
  }
  printf("%d", st[0].n + st[1].g);
  return 0;
}

 

풀이

 

#include <stdio.h>
struct student {
  int n, g;
};

int main() {
  struct student st[2];  // 길이가 2인 구조체 배열
  int i = 0;
  // 0부터 2까지 반복문 진행
  for (i; i < 2; i++){
  
    // 1. st[0].n = 0, st[0].g = 1(0 + 1)
    // 2. st[1].n = 1, st[1].g = 2(1 + 1)
    st[i].n = i;
    st[i].g = i + 1;
  }
  printf("%d", st[0].n + st[1].g); // 0 + 2 = 2, 2출력
  return 0;
}

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

#include <stdio.h>
int len(char* p);
int main() {
  char *p1 = "2022";
  char *p2 = "202207";
  printf("%d", len(p1) + len(p2));
  return 0;
}

int len(char *p) {
  int r = 0;
  while (*p != '\0'){
    p++;
    r++;
  }
  return r;
}

 

풀이

 

#include <stdio.h>
// 구조체 포인터의 길이 구하기
int len(char* p);

int main() {
  // 구조체 포인터 변수 p1은 "2022"의 주소를 저장함
  char *p1 = "2022";
  
  // 구조체 포인터 변수 p2은 "202207"의 주소를 저장함
  char *p2 = "202207";
  printf("%d", len(p1) + len(p2)); // 4 + 6 = 10, 10 출력
  return 0;
}

int len(char *p) {
  int r = 0;
  while (*p != '\0'){ // *p의 값이 널이면 반복문 종료
    p++; // 입력받은 포인터변수의 값을 1씩 증가
         // 주소값의 자리를 1씩 늘림
    r++; // r값을 1씩 증가 : 반복 횟수
  }
  return r; // r값을 반환
}