관리 메뉴

나구리의 개발공부기록

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

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


21. 이진수를 십진수로 변환하는 C코드의  Ⓐ,Ⓑ에 적합한 코드를 작성

문제 및 풀이

#include <stdio.h>
int main() {
  int input = 101110;
  int di = 1;
  int sum = 0;
  
  while (1){             // 1 == true
    if (input==0) break; // false 면 break;
    
    else {  // 반복문이 진행되면 코드를 실행
      // input의 값을 2진수라고 보고 각 자리의 1의 값을 더하는 코드
      sum = sum + (input Ⓐ Ⓑ) * di; // input % 10 -> 연산 결과가 input의 맨 마지막 자리가 됨
      di = di * 2;
      input = input / 10;      
    }
  }
  
  printf("%d", sum);
  return 0;
}
// Ⓐ : %
// Ⓑ : 10
// &,2 or &,1도 됨

22. 다음 프로그램에서 43215로 출력되도록 밑줄에 들어갈 코드를 보기에서 골라 작성

보기 : n, i, +, %, 1, 5, [, ], (, )

실행결과 : 43215


문제 및 풀이

#include <stdio.h>
int main() {
  int n[5] = {5, 4, 3, 2, 1};
  int i;
  // n의 값을 0부터 순서대로 하나씩 꺼내는 반복문
  for(i=0; i<5; i++){
    // n[(i+1)%5]
    // 1%5==1, 2%5==2, 3%5==3, 4%5==4, 5%5==0,
    // 연산결과의 나머지를 n의 인덱스 값으로 지정
    printf("%d", _____________);
    // 출력결과가 43215 -> 5가 제일 뒤로 가야함,
  }
  return 0;
}
// n[(i+1)%5]

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

문제 및 풀이

#include <stdio.h>

int main() {
  int n[3] = {73, 95, 82};
  int i, sum = 0;
  
  for (i=0; i<3; i++){ // 0 ~ 2까지 반복
    sum += n[i];  // sum의 변수에 꺼낸 값을 합산
  }
  // 73+95+82 = 250
  
  switch(sum/30){  // 250 / 30 연산결과의 case로 이동, case 8로 이동
  case 10:
  case 9: printf("A");
  case 8: printf("B"); // B 출력, break 가 없어서 다음 case문 실행
  case 7: // 아무것도없음 다음 실행
  case 6: printf("C"); // C 출력, 마지막 케이스문,
  default: printf("D"); // case문에 브레이크문이 없었으므로 실행, D출력
  }
  return 0;
}
// BCD 출력

 


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

문제 및 풀이

#include <stdio.h>
#define MAX_SIZE 10 // 상수값 정의

int isWhat[MAX_SIZE]; // MAX_SIZE의 값을 길이로하는 int 배열 선언
int point = -1;       // point라는 변수에 -1값 저장

int isEmpty(){  // isEmpty 함수 정의
  // point의 값이 -1이면 1을 반환하는 함수
  if(point == -1) return 1;
  return 0;
}

int isFull(){  // isFull 함수 정의
  // point의 값이 10이면 1을 반환하는 함수 정의
  if(point==10) return 1;
  return 0;
}

void into(int num){ // into 함수 정의
  // point의 값이 10보다크거나 같으면 Full 이라는 문자열 출력
  if(point>=10) printf("Full");
  // 매개변수로 입력된 num의 값을 int타입 배열 point+1연산 후 isWhat의 인덱스 위치에 저장
  isWhat[++point] = num;
}

int take(){ // take 함수 정의
  // isEmpty함수의 호출 결과가 1이면 Empty라는 문자열 출력
  if(isEmpty()==1) printf("Empty");
  // int 타입 배열 isWhat의 point의 인덱스 위치의 값을 반환하고 point의 값을 1감소
  return isWhat[point--];
}

int main(){
  into(5); // into 함수를 호출, 아규먼트값 5,
           // point는 0, isWhat[0]에 5가 저장됨, isWhat[] = {5}
  
  into(2); // into 함수를 호출, 아큐먼트값 2,
           // point는 1, isWhat[1]에 2가 저장됨, isWhat[] = {5,2}
  
  while(!isEmpty()){  // isEmpty()호출 결과가 1이 아니면 반복 (0 or false이면 반복)
  
    printf("%d", take()); // take함수의 결과를 출력
                          // 2를 출력, point는 0이 됨, isWhat[] = {5}
                          
    into(4);  // into 함수 호출, 아규먼트 값 4
              // point는 1, isWhat[1]에 4가 저장됨, isWhat[] = {5,4}
              
    into(1);  // into 함수 호출, 아규먼트 값 1
              // point는 2, isWhat[2]에 1이 저장됨, isWhat[] = {5,4,1}
    
    printf("%d", take());  // take함수의 결과를 출력
                           // 1을 출력, point는 1이됨, isWhat[] = {5,4}
                           
    into(3);  // into 함수 호출, 아규먼트 값3
              // point는 2, isWhat[2]에 3이 저장됨, isWhat[] = {5,4,3}
              
    printf("%d", take()); // take함수의 결과를 출력
                          // 3을 출력, point는 1이됨, isWhat[] = {5,4}
    
    printf("%d". take()); // take함수의 결과를 출력
                          // 4를 출력, point는 0이됨, isWhat[] = {5}
                          
    into(6);  // into 함수 호출, 아규먼트 값 6
              // point는 1이되고, isWhat[1]에 6이 저장됨, isWhat[] = {5,6}
              
    printf("%d", take()); // take함수의 결과를 출력
                          // 6을 출력, point는 0이됨, isWhat[] = {5}
                          
    printf("%d", take()); // take함수의 결과를 출력
                          // 5를 출력, point는 -1이됨, isWhat[] = {}
  }
  return 0;
}

//213465

25. C프로그램에 홍길동, 김철수, 박영희 순서로 입력시 출력 결과 작성

문제 및 풀이

#include <stdio.h>
char n[30];

char *soojebi(){ // 포인터 함수 soojebi 정의
  gets(n);  // 문자열을 입력받아 n에 저장, 선언된 n의 길이보다 긴 문장을 받으면 스택오버플로우 에러가 발생됨
  return n;
}

int main() {
  char *p1 = soojebi(); // 포인터 변수 p1에 soojebi()함수 반환값의 주소를 저장(배열 n의 주소)
                        // "홍길동" 문자열이 담긴 주소가 저장됨
                        
  char *p2 = soojebi(); // 포인터 변수 p2에 배열 n의 주소를 저장
                        // "김철수" 문자열이 담긴 주소가 저장됨 -> p1도 동일한 주소를 가르킴
                        
  char *p3 = soojebi(); // 포인터 변수 p3에 배열 n의 주소를 저장
                        // "박영희" 문자열이 담긴 주소가 저장됨 -> p1,p2도 동일한 주소를 가르킴
  
  // p1, p2, p3이 같은 문자열 주소를 가지고 있음 -> 셋중에 하나를 수정하면 원래의 문자열이 수정됨
  
  printf("%s\n", p1);  // p1주소가 가르키는 값을 출력 -> 박영희 출력
  printf("%s\n", p2);  // p2주소가 가르키는 값을 출력 -> 박영희 출력
  printf("%s\n", p3);  // p3주소가 가르키는 값을 출력 -> 박영희 출력
  return 0;
}
// 출력결과
// 박영희
// 박영희
// 박영희

26. 잔돈의 개수를 구하는 프로그램, a,b,c,d는 각각 1000,500,100,10원의 개수, ①,②,③,④에 들어갈 코드를 보기에 있는 문자, 숫자, 기호를 이용해 순서대로 작성 (코드의 길이를 최소화해서 구현해야 함)

보기 : m, i, d, %, /, 0~9, (, )

실행결과

  - 1000원 : 4개

  - 500원   : 1개

  - 100원    : 1개

  - 10원       : 2개


문제 및 풀이

#include <sidio.h>
int main(){
  int m = 4620;
  int a, b, d, d;
  
  // m을 1000으로 나눈 몫은 1000의 개수를 뜻함
  a = ①; // m / 1000, a = 4
  
  // 한줄로 표현해야 하기에 추가적인 변수를 선언할 수 없으므로 m의 값을 이용
  // m을 1000으로 나눈 나머지의값은 천의 자리가 제외된 나머지가 반환됨,
  // 해당 값에 구하고자하는 개수의 값을 / 연산하면 몫은 그 개수가 됨
  b = ②; // (m % 1000) / 500, b = 1
  
  // 나머지는 동일한 연산
  c = ③; // (m % 500) / 100, c = 1
  d = ④; // (m % 100) / 10, d = 2
  
  printf("1000원 : %d개\n", a);
  printf("500원 : %d개\n", b);
  printf("100원 : %d개\n", c);
  printf("10원 : %d개\n", d);
  return 0;
}

// ① : m / 1000
// ② : (m % 1000) / 500
// ③ : (m % 500) / 100
// ④ : (m % 100) / 10