본문 바로가기

📜✏️노트 자리없어서 적는 IT 지식📜✏️

[오답노트] 정처산기 프로그래밍 언어 문제풀이

1. C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

 

#include <stdio.h>
main(){
    char *p = "KOREA";
    printf("%s\n" , p);
    printf("%s\n" , p + 3);
    printf("%c\n" , *p);
    printf("%c\n" , *(p + 3));
    printf("%c\n" , *p + 2);
   
}

 

풀이 :

char로 문자열 저장 *p 에 K(0)  O(1)  R(2)  E(3)  A(4)  \0  을 저장한다. (여기서 문자열을 저장하면 마지막은 0이 들어간다고한다.)

하지만 출력하면 \0은 출력 안된다고함

이제 %s\n < 얘는 그냥 출력하고 다음줄로 넘어간다고 보면된다.

p = KOREA를 출력

p + 3 = KOREA에서 문자열 위치 3부터 마지막까지 출력 = EA

*p는 *가 붙으면 문자 1개만 출력하고 *p 처럼 조건이 없으면 문자열 0번의 위치를 출력한다고함 = K

*(p+3)은 *가 붙었으므로 문자열 1개를 출력함 p+3위치는 E이므로 E만 출력

*p + 2는 ( ) 가 없는 점을 유의해야한다. *p 는 문자 K인데 메모리에 저장될 때 문자가 아닌 해당 문자의 아스키 코드값 이 저장된다. K의 아스키 코드는 75 여기서 + 2를 하게 되면 M이 된다. 즉 값은 : M

KOREA

EA

K

E

M

이 정답이 된다.

 

 

 

2. 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번을 풀면 간단하다.

여기서 헷갈리는 곳은   ary[2] = *ary + 3

*ary + 3이라고 해서 아스키 코드 값을 넣어야되나? 생각했지만 1번은 문자열 값이여서 아스키코드가 사용되고 2번은 int형 정수형이여서 아스키코드 값은 사용되지 않는다!

 

ary[3] = 3자리의 빈 공간 생성

s= 0

*(ary+0) = 1 이건 ary빈공간 + 0 즉, 0번째 *(주소)에는 1을 넣는다. ary[0] = 1

ary[1] = *(ary+0) + 2 이건 ary에서 1번째 주소에 *(ary+0) 얘는 ary의 0번째 주소 즉 1 에다가 +2를 해서 [1]주소는 3를 갖게된다. ary[1] = 3

ary[2] = *ary + 3 이건 [2]에는 *ary [0]번째 주소 1에다가 +3을해서 [2]는 4를 갖게된다. ary[2] = 4

 

이제 반복문 i = 0     i<3 (0 , 1 , 2 반복)   i++ 끝나면 i가 1개씩 올라감.

s = 0 이므로

 

i가 0 일때,

s = 0 + ary[0]  s는 1이 된다.

i=1

s = 1 + ary[1] s는 4가 된다.

i=2

s = 3 + ary[2] s는 8이 된다.

정답 : 8

 

구조체

자료의 종류가 다른 변수의 모임이라고 할 수 있다. 이름, 직위 , 급여 등의 필드가 필요한 사원 자료를 하나의 단위로 관리하려면 문자와 숫자가 횬용되므로 배열로는 처리할 수 없다. 이럴때 구조체를 사용한다.

 

구조체의 정의

struct sawon{

      char  name[10];

      char  jikwi[10];

      int pay;

};

 

로 사원 이라는 자료형에 name jikwi 멤버를 넣었다.

 

구조체 변수의 선언

struct sawon ansan, *seoul;

 

구조체 멤버의 지정

 

ansan.name = "감한국"

ansan.jikwi = "대리"

ansan.pay = 40000;

 

" . " 의 의한 지정 : 구조체 일반 변수를 이용해 구조체 멤버를 지정한다.

 

seoul -> name ="홍길동"

seoul->jikwi = "과장"

 

"->" : 구조체 포인터 변수를 이용해 구조체 멤버 지동

 

(*seoul).name = "홍길동"

(*ansan).jikwi = "과장"

 

구조체의 포인터 변수는 일반 포인터 변수처럼 *를 사용하여 멤버를 지정할 수 있다.

 

 

3. C언어로 구현된 프로그램의 실행 결과를 확인하시오.

 

#include <stdio.h>
struct jsu
{
    char nae[12];
    int os, db, hab, hhab;
};

int main()
{
    struct jsu st[3] = { {"데이터 1" , 95 , 88},{"데이터 2" , 84 , 91}, {"데이터 3", 86 , 75}};
    struct jsu* p;
    p = &st[0];
    (p + 1)->hab = (p+1)->os + (p+2)-> db;
    (p + 1)->hhab = (p+1)->hab + p->os + p->db;
    printf("%d" , (p+1)->hab + (p+1)->hhab);
   
}

// 실행키는 컨 + 쉬 + r

 

이렇게 표가 된다.

 

nae[12] 

정수형 os, db, hab, hhab을 지정

 

jsu st[3]을 지정하고 {"데이터 1" , 95 , 88},{"데이터 2" , 84 , 91}, {"데이터 3", 86 , 75} 값을 넣음

데이터 1 ~ : st[0]

데이터 2 ~ : st[1]

데이터 3 ~ : st[2] 로 이해하면된다.

 

jsu* p로 p를 지정해준다.

p = &st[0];

p는 st[0]번의 주소로 저장된다.

 

(p + 1)->hab = (p+1)->os + (p+2)-> db;

p가 st[0]이니까 (p+1)은 st[1]번 즉, 데이터 2에서 hab 부분은 st[1] os + st[2] db가 된다.

그럼 hab = os + db가 되는데 여기서 표를 정리해줘야 이해가 된다.

이렇게 hab = 84 + 75를 해주면 159가 된다.

 

(p + 1)->hhab = (p+1)->hab + p->os + p->db;

여기는 st[1] hhab = st[1] hab + st[0] os + st[0] db 가 된다.

hhab = 159 + 95 + 88 즉, 342가 된다.

 

마지막, printf("%d" , (p+1)->hab + (p+1)->hhab);

st[1] hab + st[1] hhab를 덧셈하면 된다.

159 + 342 즉 501이 정답이된다.

문제만 보면 이해가 안되서 문제의 내용을 머리로 정리하고 위의 표를 그려야 차근차근 풀 수 있다.

 

문자열 데이터 1 ~3 은 nae로 저장,

정수형 95, 88 , 84 ... 는  os db hab hhab으로 저장된다.

 

*TMI

주소값 p ++ 로 되어있으면 p = p +1 과 동일하다.