코딩일기/자격증

[정보처리기사] [ C ] 구조체 포인터와 배열 | 정보처리기사 실기 기출문제

jhy_2023 2025. 3. 10. 17:25
728x90
반응형

2021년 3회 정보처리기사 실기 기출문제

문제

다음 C 프로그램의 실행결과를 쓰시오.

#include <stdio.h>

struct jsu {
  char name[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\n", (p+1)->hab + (p+1)->hhab);
}

정답

501

반응형

해설

📌 기본 개념

1️⃣ 구조체(struct)

구조체는 여러 데이터를 하나의 단위로 묶어주는 사용자 정의 자료형입니다. 각 데이터는 멤버 변수로 구성됩니다.

🔸 구조체 선언 형식 : 기본 구조체 선언

struct 구조체이름 {
  데이터타입 멤버이름;
  데이터타입 멤버이름;
};

🔸 예제

struct jsu {
  char name[12]; // 최대 11글자 + NULL 문자 저장 가능
  int os;   // 운영체제 점수
  int db;   // 데이터베이스 점수
  int hab;  // 합계 저장 변수
  int hhab; // 총합 저장 변수
};

2️⃣ 구조체 배열

구조체를 배열로 선언하면 여러 개의 구조체 데이터를 하나의 배열로 관리할 수 있습니다.

🔸 구조체 선언 형식 : 구조체 배열 선언

struct 구조체이름 배열이름[크기] = {초기값1, 초기값2, ...};

🔸 예제

struct jsu st[3] = {{"데이터1", 95, 88}, 
                    {"데이터2", 84, 91}, 
                    {"데이터3", 86, 75}};

위의 배열 st는 다음과 같은 구조를 가집니다. 초기값을 주지 않은 hab와 hhab은 기본적으로 0으로 설정됩니다.

3️⃣ 포인터와 구조체의 관계

포인터를 사용하여 구조체 멤버에 접근할 때는 -> 연산자를 사용합니다.

🔸 포인터와 구조체의 관계

struct 구조체이름 *포인터변수;
포인터변수->멤버이름;

구조체 배열의 포인터는 배열의 각 구조체 요소를 가리킬 수 있습니다. 포인터 연산자를 사용하여 구조체 멤버에 접근할 때는 ->를 사용합니다.

🔸 구조체 포인터 선언 및 사용 예제

struct jsu *p;   // 구조체 포인터 선언
p = st;          // 배열 st의 첫 번째 요소를 가리킴. 배열의 이름은 첫 번째 요소의 주소를 나타냄
p++;             // 다음 요소로 이동 (st[1])
printf("%s", p->name); // 현재 가리키는 구조체의 name 출력

구조체 배열의 포인터는 구조체 배열의 각 요소를 가리킬 수 있습니다. 배열의 이름 자체가 첫 번째 요소의 주소를 나타내므로, 구조체 포인터를 사용하면 배열의 요소를 순차적으로 가리키며 접근할 수 있습니다.

포인터를 통해 구조체 멤버에 접근할 때는 -> 연산자를 사용합니다. 예를 들어, p = students;로 구조체 배열의 첫 번째 요소를 가리킨 후, p->name을 사용하면 students[0].name과 같은 효과를 가집니다. 이후 p++을 하면 다음 구조체 요소(students[1])를 가리키게 됩니다.

728x90

📌 기본 개념

1️⃣ 구조체 선언 및 배열 초기화

struct jsu {
  char name[12];
  int os, db, hab, hhab;
};
  • struct jsu라는 구조체를 정의했습니다.
  • name (문자열), os (운영체제 점수), db (데이터베이스 점수), hab, hhab (총합 관련 변수)로 구성됩니다.
struct jsu st[3] = {{"데이터1", 95, 88}, 
                    {"데이터2", 84, 91}, 
                    {"데이터3", 86, 75}};
  • st라는 구조체 배열을 선언하고, 3개의 요소를 초기화했습니다.
  • 각 요소의 os와 db 값만 초기화되었고, hab, hhab은 자동으로 0이 됩니다.

따라서 초기 상태는 아래와 같습니다.

2️⃣ 구조체 포인터 선언 및 초기화

struct jsu *p;  // 구조체 포인터 p 선언
p = &st[0];     // st[0]의 주소를 p에 저장
  • p라는 구조체 포인터를 선언하고, st[0]의 주소를 가리키도록 설정했습니다.
    • *p는 struct jsu 타입의 포인터 변수입니다.
  • &st[0]은 구조체 배열 st의 첫 번째 요소(st[0])의 주소입니다. 즉, p는 현재 st[0]을 가리키고 있습니다.

3️⃣ 구조체 포인터를 이용한 연산

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

st[1].hab = st[1].os + st[2].db
         = 84 + 75
         = 159
  • p + 1은 st[1]을 가리킵니다.
  • (p + 1)->os는 st[1].os, 즉 84입니다.
  • p + 2는 st[2]을 가리킵니다.
  • (p + 2)->db는 st[2].db, 즉 75입니다.
  • 따라서 st[1].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
          = 159 + 95 + 88
          = 342
  • (p + 1)->hab = st[1].hab = 159
  • p->os = st[0].os = 95
  • p->db = st[0].db = 88
  • 따라서 st[1].hhab = 159 + 95 + 88 = 342

이제 상태는 다음과 같습니다:

4️⃣ 최종 출력값 계산

printf("%d\n", (p+1)->hab + (p+1)->hhab);
  • p는 st[0]을 가리키고 있습니다.. p + 1은 구조체 배열의 다음 요소, 즉 st[1]을 가리킵니다.
  • (p + 1)->hab은 st[1].hab과 동일합니다. 이전 연산에서 st[1].hab = 84 + 75 = 159로 계산되었습니다.
  • (p + 1)->hhab은 st[1].hhab과 동일합니다. 이전 연산에서 st[1].hhab = 159 + 95 + 88 = 342로 계산되었습니다.
  • (p + 1)->hab = 159, (p + 1)->hhab = 342 따라서 printf("%d\n", 159 + 342);가 실행되며 501이 출력됩니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형