정보처리기사 실기 프로그래밍 기출 C언어 연산식 조건문 반복문 문제 풀이
다음은 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
입력값을 넣어보면 아래와 같다.
값 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|
주소 | 0 | 1 | 2 | 3 | 4 |
이런 괄호 문제는 %
또는 /
연산이 답일 경우가 대다수였다고 한다. 이를 참고해서 어느정도 계산식을 유추해봐야 한다.
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 ]
다음은 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
다음은 소스코드의 알맞은 출력을 작성하시오.
#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
다음은 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
*포인터 개념이 어렵다면 🔗 정보처리기사 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);
}
int ary[3];
ary
를 초기화하면 기본적으로 0, 1, 2가 각 자리에 쌓인다. 아래 그림을 참고하자.
*(ary + 0) = 1;
포인터 괄호 안의 ary + 0은 ary[0]을 의미하므로 ary[0] 자리가 0에서 1로 대치된다.
ary[2] = *ary + 3;
*(ary + 0)은 2번에서 봤던 것과 동일하므로 ary[0]번 자리의 값 1을 의미한다. 즉, 값을 대입해보면 ary[1] = 1 + 2 가 된다.
ary[1] = *(ary + 0) + 2;
*ary는 대표 주소 ary[0]과 같으므로 ary[0]의 값인 1이 대입되므로 식으로 보면 ary[2] = 1 + 3 이 된다.
1~4번까지의 과정을 정리하면 아래와 같다.
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
🙋🏻 참고한 곳
🔗 홍달쌤 유튜브 🔗 홍달쌤의 정보처리기사 실기 책