아래는 주어진 도서 대여 관리 프로그램을 한 줄 한 줄 꼼꼼하게 분석하고, 코드와 주석을 포함하여 자세히 정리한 내용입니다.
#define NAME_SIZE 50
#define BOOK_MAX 100
#define
매크로 상수 정의 NAME_SIZE
: 책 이름의 최대 길이를 설정(50바이트). BOOK_MAX
: 등록 가능한 최대 책 수 설정(100권). enum MENU
{
MENU_NONE,
MENU_INSERT,
MENU_RENTAL,
MENU_RETURN,
MENU_LIST,
MENU_EXIT,
};
MENU
열거형: 메뉴를 선택할 때 사용되는 상수를 정의. MENU_NONE
: 초기값 (사용하지 않음). MENU_INSERT
: 책 등록. MENU_RENTAL
: 책 대여. MENU_RETURN
: 책 반납. MENU_LIST
: 책 목록 출력. MENU_EXIT
: 프로그램 종료. struct _tagBook
{
char strBookName[NAME_SIZE]; // 책 이름
int iRentalAmount; // 대여 금액
int iBookNumber; // 책 번호
bool bRental; // 대여 여부
};
_tagBook
구조체: 하나의 책 정보를 저장하기 위한 구조체. strBookName
: 책 이름을 저장하는 문자열 배열. iRentalAmount
: 책 대여 금액. iBookNumber
: 고유 책 번호. bRental
: 대여 여부를 나타내는 논리값. false
: 대여 가능. true
: 대여 중. int main()
{
_tagBook tBookArr[BOOK_MAX] = {}; // 최대 100권의 책 정보를 저장할 배열.
int iBookCount = 0; // 현재 등록된 책 수.
int iBookNumber = 1; // 고유 책 번호 관리용 변수.
char strRentalName[NAME_SIZE] = {}; // 대여/반납할 책 이름을 저장하는 임시 변수.
bool bFind = false; // 책 검색 성공 여부를 저장하는 변수.
tBookArr
: 최대 BOOK_MAX
(100권) 크기의 배열로, 책 정보를 저장. iBookCount
: 등록된 책 수를 저장하는 변수. iBookNumber
: 등록할 때 부여하는 고유 책 번호. strRentalName
: 대여/반납 시 책 이름 임시 저장용. bFind
: 책을 찾았는지 여부를 나타내는 플래그 변수. while (true)
{
system("cls");
while (true)
: 프로그램이 종료될 때까지 무한 루프. system("cls")
: 콘솔 화면을 지움(Windows 환경). cout << "1. 책 등록" << endl;
cout << "2. 책 대여" << endl;
cout << "3. 책 반납" << endl;
cout << "4. 책 목록" << endl;
cout << "5. 종료" << endl;
cout << "메뉴를 선택하세요 : " << endl;
int iMenu;
cin >> iMenu;
cin >> iMenu
: 사용자가 선택한 메뉴 번호를 입력받습니다. if (cin.fail())
{
cin.clear(); // 입력 오류 상태를 초기화.
cin.ignore(1024, '\n'); // 입력 버퍼를 비워 충돌 방지.
continue; // 루프 처음으로 돌아감.
}
cin.fail()
이 true
를 반환. cin.clear()
: 입력 오류 상태를 초기화. cin.ignore()
: 입력 버퍼를 비워 다음 입력에 영향을 주지 않도록 처리. if (iMenu == MENU_EXIT)
{
break;
}
MENU_EXIT
(5번 메뉴)가 선택되면 break
를 통해 루프를 종료. MENU_INSERT
) case MENU_INSERT:
system("cls");
cout << "================ 책 등록================" << endl;
if (iBookCount == BOOK_MAX)
{
cout << "책을 더이상 등록할 수 없습니다." << endl;
break;
}
cin.ignore(1024, '\n');
cout << "책이름 : ";
cin.getline(tBookArr[iBookCount].strBookName, NAME_SIZE);
cout << "대여 금액 : ";
cin >> tBookArr[iBookCount].iRentalAmount;
tBookArr[iBookCount].iBookNumber = iBookNumber;
tBookArr[iBookCount].bRental = false;
++iBookNumber;
++iBookCount;
cout << "책 등록을 성공적으로 수행했습니다." << endl;
break;
책 등록 조건 확인
iBookCount == BOOK_MAX
: 등록 가능한 최대 책 수를 초과하면 등록을 차단. 입력 처리
cin.ignore(1024, '\n')
: 입력 버퍼를 비워 충돌 방지. cin.getline
: 공백 포함 문자열 입력. 책 정보 초기화
tBookArr[iBookCount].iBookNumber
: 현재 책에 고유 번호 부여. tBookArr[iBookCount].bRental
: 대여 여부를 false
로 설정(빌릴 수 있음). 카운터 증가
++iBookNumber
: 다음 책에 부여할 번호 증가. ++iBookCount
: 등록된 책 수 증가. MENU_RENTAL
) case MENU_RENTAL:
system("cls");
cout << "================ 책 대여================" << endl;
cin.ignore(1024, '\n');
cout << "대여하고자 하는 책의 이름을 입력해주세요 : ";
cin.getline(strRentalName, NAME_SIZE);
bFind = false;
for (int i = 0; i < iBookCount; ++i)
{
if (strcmp(strRentalName, tBookArr[i].strBookName) == 0)
{
bFind = true;
if (tBookArr[i].bRental == false)
{
tBookArr[i].bRental = true;
cout << "책을 대여하였습니다." << endl;
}
else
{
cout << "책을 대여할 수 없습니다." << endl;
}
break;
}
}
if (bFind == false)
{
cout << "대여하고자 하는 책을 찾을 수 없습니다." << endl;
}
break;
책 이름 입력
cin.getline(strRentalName, NAME_SIZE)
: 대여할 책 이름을 입력받음. 책 검색
for
루프를 통해 책 배열에서 입력한 이름과 일치하는 책을 찾음. strcmp
: 문자열 비교 함수. 대여 여부 확인 및 처리
tBookArr[i].bRental == false
: 대여 가능 상태면 true
로 변경하고 대여 처리. else
: 이미 대여 중이라면 대여 불가능 출력. MENU_RETURN
) case MENU_RETURN:
system("cls");
cout << "================ 책 반납================" << endl;
cin.ignore(1024, '\n');
cout << "반납하고자 하는 책의 이름을 입력해주세요 : ";
cin.getline(strRentalName, NAME_SIZE);
bFind = false;
for (int i = 0; i < iBookCount; ++i)
{
if (strcmp(strRentalName, tBookArr[i].strBookName) == 0)
{
bFind = true;
tBookArr[i].bRental = false;
cout << "책 반납을 하셨습니다." << endl;
break;
}
}
if (bFind == false)
{
cout << "반납하고자 하는 책의 이름
을 찾을 수 없습니다." << endl;
}
break;
반납할 책 이름 입력
cin.getline
: 책 이름 입력. 책 검색
bRental
을 false
로 변경. MENU_LIST
) case MENU_LIST:
system("cls");
cout << "================ 책 목록================" << endl;
for (int i = 0; i < iBookCount; i++)
{
cout << "책 이름 : " << tBookArr[i].strBookName << endl;
cout << "책 번호 : " << tBookArr[i].iBookNumber << endl;
cout << "대여 금액 : " << tBookArr[i].iRentalAmount << endl;
cout << "대여 여부 : ";
if (tBookArr[i].bRental == false)
{
cout << "가능" << endl;
}
else
{
cout << "불가능" << endl;
}
cout << endl;
}
break;
false
는 "가능", true
는 "불가능"으로 출력. cout << "도서 관리 프로그램을 이용해 주셔서 감사합니다." << endl;
return 0;
cin.fail()
과 cin.ignore
로 입력 오류 방지. bFind
플래그를 통해 검색 결과를 효율적으로 처리. 위 내용은 작성하신 코드에 대한 세부적 분석과 설명으로, 프로그램의 기능과 흐름을 완벽하게 이해할 수 있도록 작성되었습니다. 😊