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
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] [ Python ] 비교 연산자 ==| 파이썬 vs C vs Java 참/거짓 출력 차이 | 정보처리기사 실기 기출문제 (0) | 2025.03.04 |
---|---|
[정보처리기사] SQL | CROSS JOIN과 LIKE 연산자 활용 | 정보처리기사 실기 기출문제 (0) | 2025.02.25 |
[정보처리기사] 파일 구조 개념과 종류 | 정보처리기사 실기 기출문제 (0) | 2025.02.14 |
[정보처리기사] SQL | 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL) 총정리 (0) | 2025.01.23 |
[정보처리기사] AAA(Triple-A) : Authentication, Authorization, Accounting 개념 정리 | 정보처리기사 실기 기출문제 (0) | 2025.01.22 |