post-custom-banner

C언어 > 연산식 / 조건문 / 반복문

정보처리기사 실기 프로그래밍 기출 C언어 연산식 조건문 반복문 문제 풀이

📝 문제풀어보기-1: 연산식 유추

다음은 C언어 코드의 문제이다. 보기의 조건에 맞도록 괄호안에 알맞은 코드를 작성하시오.
보기: 입력값이 54321일 경우 출력값이 43215로 출력되어야 한다.

int main(void) {
    int n[5];
    int i;
    for (i = 0; i < 5; i++) {
        printf("숫자를 입력해주세요 : ");
        scanf("%d", &n[i]);
    }
    for (i = 0; i < 5; i++) {
        printf("%d", (            ) );
    }
  return 0;
}

main()함수 안의 scanf를 보면 &n[i]이므로 주소값을 의미한다.
각 주소에 들어가는 scanf 입력값을 넣어보면 아래와 같다.

54321
주소01234

이런 괄호 문제는 % 또는 / 연산이 답일 경우가 대다수였다고 한다. 이를 참고해서 어느정도 계산식을 유추해봐야 한다.

ex) i % 5 라면?
*나눌 값을 5로 잡은 이유는 for()문 내의 i 제한 값이 5이므로

i = 0을 5로 나누었을 때의 나머지가 0이므로 0번 주소를 가리키면 값 5가 나오는데 보기에서 출력값은 43215 순이어야 한다고 했으므로 조건 불만족한다.

그럼 계산식을 바꿔보자.

ex) ( i + 1 ) % 5 라면?

(0+1)을 5로 나눈 후의 나머지가 1이므로 주소값 1, 값 4

(0+2)를 5로 나눈 후의 나머지가 2이므로 주소값 2, 값 3

… (0+5)를 5로 나눈 후의 나머지가 0이므로 주소값 0, 값 5

보기의 출력값 43215을 만족하는 결과가 나온다.

답안 작성시에는 printf("%d", ( ) );의 괄호에 들어갈 연산식을 넣어야 하므로 아래와 같이 적는다.

n[ ( i + 1 ) % 5 ]


📝 문제풀어보기-2: switch-case문

다음은 C언어의 문제이다. 알맞은 출력값을 작성하시오.

int n[3] = [73, 95, 82] 
sum = 0 
 
for(i=0;i<3;i++){
    sum += n[i];
}
 
switch(sum/30){
    case 10:
    case 9: printf("A");
    case 8: printf("B");
    case 7: 
    case 6: printf("C");
    default: printf("D");
}

일단 for문을 보자.

i가 3 미만일 때까지 i들을 더해서 sum에 저장하라고 한다.

따라서 n의 0, 1, 2번인 73 + 95 + 82 = 250 이 되고, 이 값은 그대로 sum에 들어간다. 즉 sum = 250;

sum값을 구했으니 이걸 가지고 switch()문으로 넘어가자.

switch()문 안의 연산을 수행한다. sum을 30으로 나누면 sum / 30 = 8

참고
정수와 정수의 연산은 정수 결과를 낸다

switch(8)이 되므로 case 8 번부터 수행한다.

case문은 break; 구문이 없을 경우 남은 케이스를 끝까지 수행 후 빠져나간다. 따라서 case 8 부터 default까지 모두 수행하면 된다.

정답은 아래와 같다.

BCD


📝 문제풀어보기-3: 조건문

다음은 소스코드의 알맞은 출력을 작성하시오.

#include <stdio.h>
int main(){
  int c = 0;
  for(int i = 1; i <=2023; i++) { 
    if(i%4 == 0) c++; 
  }
	  printf("%d", c);
}

for문에 조건식 2023? 이걸 언제다해 싶지만 다행히도 그 아래 if 조건문을 보면 문제의 목적이 뚜렷하다.

if(i%4 == 0) c++; == "4의 배수를 찾아 그 갯수를 c에 저장하라."

제한값이 2023이므로 2023을 4로 나눈 몫이 답이 된다.

답은 아래와 같다.

505


📝 문제풀어보기-4: 반복문

다음은 C언어에 관한 소스코드이다. 실행 결과값을 작성하시오.

#include <stdio.h>
int mp(int base, int exp);
int main(){
   int res;
   res = mp(2,10);
   printf("%d",res);
   return 0;
}

int mp(int base, int exp) {
   int res = 1;
   for(int i=0; i < exp; i++){
      res = res * base;
   }
   
   return res;
}

위의 코드는 main()함수에서 mp()라는 함수를 실행 후 그 반환값을 res에 담아 출력하는 프로그램이다.

그럼 수행해야 할 mp(2, 10)함수로 가보자.

mp(2, 10)함수에는 res라는 전역 변수가 1로 초기화되어 있고, for문을 9까지 돌면서 연산식을 수행한다.

res = res * base;

res값이 쌓인다는 것과, base변수는 고정값(=2)이라는 것도 알 수 있다.

그러면 base변수 2에 뭔가가 지속적으로 i++되면서 곱해진다는 건데, 0부터 9까지 총 10번 도니까 2^10 값이 res에 저장되리란 걸 알 수 있다.

정리하면 res = 2^10 = base^esp

정답은 아래와 같다.

1024


📝 문제풀어보기-5: 포인터 연산식

*포인터 개념이 어렵다면 🔗 정보처리기사 C언어 포인터 공부하러가기

다음은 C언어 코드의 실행 결과를 적으시오.

#include <stdio.h>
int main() {
	int ary[3];
	int s = 0;
	*(ary + 0) = 1;
	ary[1] = *(ary + 0) + 2;
	ary[2] = *ary + 3;
	for(int i = 0; i < 3; i++) {
		s = s + ary[i];
	}
	printf("%d", s);
}
  1. int ary[3];

    ary를 초기화하면 기본적으로 0, 1, 2가 각 자리에 쌓인다. 아래 그림을 참고하자.

  1. *(ary + 0) = 1;

    포인터 괄호 안의 ary + 0은 ary[0]을 의미하므로 ary[0] 자리가 0에서 1로 대치된다.

  1. ary[2] = *ary + 3;

    *(ary + 0)은 2번에서 봤던 것과 동일하므로 ary[0]번 자리의 값 1을 의미한다. 즉, 값을 대입해보면 ary[1] = 1 + 2 가 된다.

  2. ary[1] = *(ary + 0) + 2;

    *ary는 대표 주소 ary[0]과 같으므로 ary[0]의 값인 1이 대입되므로 식으로 보면 ary[2] = 1 + 3 이 된다.

    1~4번까지의 과정을 정리하면 아래와 같다.

  1. for문에서 i는 0, 1, 2를 돌게 되므로 각각 ary[0],ary[1],ary[2]를 거치며 값을 더해준다.

    s = s + ary[i];에 실제 값을 대입해서 계산해보자.

    i = 0일 때,
    s = 0 + 1
    s = 1

    i = 1일 때,
    s = 1 + 3
    s = 4

    i = 2일 때,
    s = 4 + 4
    s = 8

    이렇게 s값이 바뀌므로 정답은 아래와 같다.

8


🙋🏻‍ 참고한 곳
🔗 홍달쌤 유튜브 🔗 홍달쌤의 정보처리기사 실기 책

post-custom-banner

0개의 댓글