도서 관리 프로그램

Jaemyeong Lee·2024년 11월 23일
0

어소트락2017

목록 보기
19/20

아래는 주어진 도서 대여 관리 프로그램을 한 줄 한 줄 꼼꼼하게 분석하고, 코드와 주석을 포함하여 자세히 정리한 내용입니다.


1. 전처리기 및 매크로 정의

#define NAME_SIZE 50
#define BOOK_MAX 100
  1. #define 매크로 상수 정의
    • NAME_SIZE: 책 이름의 최대 길이를 설정(50바이트).
    • BOOK_MAX: 등록 가능한 최대 책 수 설정(100권).

2. 메뉴 열거형 정의

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: 프로그램 종료.

3. 책 구조체 정의

struct _tagBook
{
	char strBookName[NAME_SIZE];	// 책 이름
	int iRentalAmount;				// 대여 금액
	int iBookNumber;				// 책 번호
	bool bRental;					// 대여 여부
};
  • _tagBook 구조체: 하나의 책 정보를 저장하기 위한 구조체.
    • strBookName: 책 이름을 저장하는 문자열 배열.
    • iRentalAmount: 책 대여 금액.
    • iBookNumber: 고유 책 번호.
    • bRental: 대여 여부를 나타내는 논리값.
      • false: 대여 가능.
      • true: 대여 중.

4. 메인 함수

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: 책을 찾았는지 여부를 나타내는 플래그 변수.

5. 프로그램 실행 루프

	while (true)
	{
		system("cls");
  1. while (true): 프로그램이 종료될 때까지 무한 루프.
  2. system("cls"): 콘솔 화면을 지움(Windows 환경).

5.1 메뉴 출력

		cout << "1. 책 등록" << endl;
		cout << "2. 책 대여" << endl;
		cout << "3. 책 반납" << endl;
		cout << "4. 책 목록" << endl;
		cout << "5. 종료" << endl;

		cout << "메뉴를 선택하세요 : " << endl;
		int iMenu;
		cin >> iMenu;
  • 사용자에게 메뉴를 출력하고 입력받습니다.
  • cin >> iMenu: 사용자가 선택한 메뉴 번호를 입력받습니다.

5.2 입력 오류 처리

		if (cin.fail())
		{
			cin.clear();                // 입력 오류 상태를 초기화.
			cin.ignore(1024, '\n');     // 입력 버퍼를 비워 충돌 방지.
			continue;                   // 루프 처음으로 돌아감.
		}
  • 잘못된 입력(예: 정수가 아닌 값)이 발생하면 cin.fail()true를 반환.
  • cin.clear(): 입력 오류 상태를 초기화.
  • cin.ignore(): 입력 버퍼를 비워 다음 입력에 영향을 주지 않도록 처리.

5.3 종료 조건 확인

		if (iMenu == MENU_EXIT)
		{
			break;
		}
  • MENU_EXIT(5번 메뉴)가 선택되면 break를 통해 루프를 종료.

6. 메뉴 기능 구현


6.1 책 등록 (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;
  1. 책 등록 조건 확인

    • iBookCount == BOOK_MAX: 등록 가능한 최대 책 수를 초과하면 등록을 차단.
  2. 입력 처리

    • cin.ignore(1024, '\n'): 입력 버퍼를 비워 충돌 방지.
    • cin.getline: 공백 포함 문자열 입력.
  3. 책 정보 초기화

    • tBookArr[iBookCount].iBookNumber: 현재 책에 고유 번호 부여.
    • tBookArr[iBookCount].bRental: 대여 여부를 false로 설정(빌릴 수 있음).
  4. 카운터 증가

    • ++iBookNumber: 다음 책에 부여할 번호 증가.
    • ++iBookCount: 등록된 책 수 증가.

6.2 책 대여 (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;
  1. 책 이름 입력

    • cin.getline(strRentalName, NAME_SIZE): 대여할 책 이름을 입력받음.
  2. 책 검색

    • for 루프를 통해 책 배열에서 입력한 이름과 일치하는 책을 찾음.
    • strcmp: 문자열 비교 함수.
  3. 대여 여부 확인 및 처리

    • tBookArr[i].bRental == false: 대여 가능 상태면 true로 변경하고 대여 처리.
    • else: 이미 대여 중이라면 대여 불가능 출력.

6.3 책 반납 (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;
  1. 반납할 책 이름 입력

    • cin.getline: 책 이름 입력.
  2. 책 검색

    • 이름이 일치하는 책을 찾아 bRentalfalse로 변경.

6.4 책 목록 출력 (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는 "불가능"으로 출력.

7. 프로그램 종료

	cout << "도서 관리 프로그램을 이용해 주셔서 감사합니다." << endl;
	return 0;
  • 프로그램 종료 메시지를 출력하고 정상 종료합니다.

프로그램 주요 특징

  • 기능별 구현: 책 등록, 대여, 반납, 목록 출력, 종료 기능.
  • 구조체 활용: 책 정보를 효율적으로 관리.
  • 입력 오류 처리: cin.fail()cin.ignore로 입력 오류 방지.
  • 플래그 활용: bFind 플래그를 통해 검색 결과를 효율적으로 처리.

개선 가능성

  • 파일 입출력 추가: 프로그램 종료 후에도 데이터를 저장/불러올 수 있도록 구현.
  • 동적 메모리: 고정 배열 대신 동적 할당으로 책 수를 유연하게 조정.
  • UI 개선: 콘솔 출력 대신 GUI나 웹 기반 인터페이스 활용.

위 내용은 작성하신 코드에 대한 세부적 분석과 설명으로, 프로그램의 기능과 흐름을 완벽하게 이해할 수 있도록 작성되었습니다. 😊

profile
李家네_공부방

0개의 댓글