개발자 되기/자격증

[정보처리기사] C언어 필기 기출 문제 해설

발전하는 개발자 2022. 4. 13. 22:29
728x90
반응형

1. 2020년 8월 22일, 78번 문제

main(void) {
int i;
int sum = 0;
for(i=1; i<=10; i=i+2)
	sum = sum + i;
printf("%d", sum);
}

for반복문에서 i의 초기값은 1, i가 10보다 같거나 작을 때까지 반복, i는 2씩 증가

i=1, 3, 5, 7, 9까지 진행

i=1일 때 sum=0+1=1;

i=3일 때 sum=1+3=4;

i=5일 때 sum=4+5=9;
i=7일 때 sum=9+7=16;

i=9일 때 sum=16+9=25;

i=11이면 i<=10이라는 조건에 위배되므로 반복문을 빠져나온다.

sum의 값을 정수로 출력하는 문제이므로 답은 25

 

2. 2021년 5월 15일, 63번 문제

#include <stdio.h>
int main(int argc, char *argv[]) {
    int a = 4;
    int b = 7;
    int c = a | b;
    
    printf("%d", c);
    return 0;
}

a=4, 4를 2진수로 표현하면 00000100

b=7, 7을 2진수로 표현하면 00000111

c=a|b, a|b연산은 a와 b를 자리수끼리 비교해서 1이 하나라도 포함되어 있다면 1로 표기→00000111

00000111을 2진수로 표기하면 7이므로 정답은 7

3. 2021년 5월 15일, 72번 문제

#include <stdio.h>
int main(int argc, char *argv[]_ {
    char a;
    a = 'A' + 1;
    printf("%d", a);
    return 0;
}

char a; 는 문자열 a라고 선언

a = 'A' + 1;  A는 아스키코드번호로 65, 65+1=66;

a를 정수형으로 출력하라는 문제이므로 답은 66

 

4. 2021년 5월 15일, 73번 문제

#include <stdio.h>
int main(int argc, char *argv[]) {
    int a[2][2] = {{11, 22}, {44, 55}};
    int i, sum = 0;
    int *p;
    p = a[0];
    for(i=1; i<4; i++)
    sum += *(p + i);
    printf("%d", sum);
    return 0;
}

a[2][2]는 a의 2행 2열 배열이다.

주소는 임의로 100부터 시작

배열은 연속된 물리적 공간이므로 주소도 연속적으로 생성

a의 주소 : 100

a[0]의 대표 주소 : 100

a[1]의 대표 주소 : 102

a[0] 11 22
주소 100 101
a[1] 44 55
주소 102 103

*p는 포인터 변수

p=a[0]은 a[0]의 주소인 100이 들어가 있다.

for문 시작 : i의 초기값 1, i가 1~3까지 반복, i는 1씩 증가

sum= sum+*(p+i)

i=1일 때

sum=0+*(100+1)

*101은 주소101이 가리키는(point) 값 22

sum=0+22=22

i=2일 때

sum=22+*(100+2)

*102는 주소102가 가리키는(point) 값 44

sum=22+44=66    

i=3일 때

sum=66+*(100+3)

*103은 주소103이 가리키는(point) 값 55

sum=66+55=121

따라서 답은 121

 

5. 2021년 8월 14일, 64번 문제

#include <stdio.h>
#include <string.h>
int main(void) {
    char str[50] = "nation";
    char *p2 = "alter";
    strcat(str, p2);
    printf("%s", str);
    return 0;
}

strcat : 문자열 이어붙이기

str에 있는 "nation"과 p2에 있는 "alter"를 합치면 "nationalter"라는 단어가 된다.

6. 2021년 8월 14일, 66번 문제

#include <stdio.h>
int main(void) {
int a = 3, b = 4, c = 2;
int r1, r2, r3;

r1 = b <= 4 || c == 2;
r2 = (a > 0) && (b < 5);
r3 = !c;

printf("%d", r1+r2+r3);
return 0;
}

r1 = b<=4 || c == 2 ;

b<=4 -> 4<=4(참)

c==2 -> 2==2(참)

참 || 참 = 참(1)

r1 = 1

 

r2 = (a>0) && (b<5) ;

a>0 -> 3>0(참)

b<5 -> 4<5(참)

참 && 참 = 참(1)

r2 = 1

 

r3 = !c; 

!는 반대, c는 값이 들어있어 참이므로 참의 반대는 거짓(0)

r3 = 0

 

r1+r2+r3 = 1+1+0 = 2

 

7. 2021년 8월 14일, 71번 문제

#include <stdio.h>
int main(void) {
    int n = 4;
    int *pt = NULL;
    pt = &n;
    
    printf("%d", &n + *pt - *&pt + n);
    return 0;
}
n 4=*pt
주소 100(임의)=&n=pt
pt 100=*&pt
주소 200(임의)=&pt

&은 주소, *은 ~가 가리키는(point) 값

&n + *pt - *&pt + n = 100 + 4 - 100 + 4 = 8

728x90
반응형