9장 해설
1분 퀴즈
1. ①
해설_ 구조체는 배열과 다르게 서로 다른 자료형의 변수들로 이루어질 수 있습니다.
2. ②
해설_ 구조체를 정의할 때는 구조체를 나타내는 struct 키워드 뒤에 구조체명을 적습니다.
3. ①
해설_ 구조체는 마침표로 각 변수의 멤버에 접근할 수 있습니다.
4. ③
해설_ 구조체를 정의한 후에도 animals[0].age = 4;와 같은 방법으로 값을 수정할 수 있습니다.
5. ②
해설_ 구조체 포인터는 화살표(->)를 이용해 다른 구조체 변수의 값에 접근할 수 있습니다.
6. ③
해설_ 구조체 포인터인 next를 통해 1호차는 2호차, 2호차는 3호차와 연결되어 있습니다. 승무원은 1호차부터 시작해 구조체 포인터 next를 통해 2호차로, 다시 next를 통해 3호차로 이동하며 이때의 no 변수의 값은 3입니다.
7. ③
해설_ typedef와 상관없이 구조체 변수는 마침표로 접근합니다.
셀프체크
#include <stdio.h>
struct book {
int id; // 번호(ID)
char * title; // 제목
int available; // 0 : 대출 중, 1 : 대출 가능
};
void print_books(struct book * books); // 함수 선언
int main(void) {
struct book books[4] = { // 도서 4권 정의, 처음에는 모두 대출 가능한 상태
{1, "C 입문편", 1},
{2, "파이썬 기본편", 1},
{3, "자바 기본편", 1},
{4, "파이썬 중급편", 1}
};
int input; // 사용자 입력을 저장할 변수
while (1) {
print_books(books); // 전체 도서 정보 출력 함수 호출
printf("대출/반납할 책 번호를 입력하세요.(종료 : -1) : ");
scanf_s("%d", &input); // 사용자 입력
if (input == -1) { // -1을 입력받으면 반복문 탈출 및 프로그램 종료
printf("프로그램을 종료합니다.\n\n");
break;
}
if (input < 1 || input > 4) { // 도서가 4권이므로 1~4 입력받기
printf("잘못된 입력입니다.\n\n");
continue;
}
input -= 1; // 배열은 0부터 시작하므로 입력값에서 1 빼기
if (books[input].available == 0) { // 대출 중인 도서이면 반납 처리
printf("'%s' 반납이 완료됐습니다.\n\n", books[input].title);
books[input].available = 1;
} else { // 대출 가능한 도서이면 대출 처리
printf("'%s' 대출이 완료됐습니다.\n\n", books[input].title);
books[input].available = 0;
}
}
return 0;
}
// 전체 도서 정보 출력, books 배열은 구조체 포인터로 처리
void print_books(struct book * books) { // 함수 정의
char * available = "대출 가능";
char * unavailable = "대출 중";
printf("전체 도서 목록입니다.\n");
printf("===============================\n");
for (int i = 0; i < 4; i++) {
printf("%d. %-16s ", books[i].id, books[i].title); // 도서 번호, 도서 제목 출력
// 대출 여부 출력
if (books[i].available) {
printf("[%s]\n", available);
} else {
printf("[%s]\n", unavailable);
}
}
printf("===============================\n");
}