Library Book Management
Problem Description
Manage library: add books, issue, return, check availability, fine calculation.
Expected Output
Complete library system
Hints
Track book status, issue date, calculate overdue fines.
Solution
IDENTIFICATION DIVISION.
PROGRAM-ID. LIBRARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-BOOKS.
05 WS-BOOK OCCURS 20 TIMES.
10 WS-BOOK-ID PIC 9(5).
10 WS-BOOK-TITLE PIC X(30).
10 WS-BOOK-AUTHOR PIC X(20).
10 WS-STATUS PIC X(1).
10 WS-MEMBER-ID PIC 9(5).
10 WS-ISSUE-DATE PIC 9(8).
01 WS-BOOK-COUNT PIC 9(2) VALUE 0.
01 WS-CHOICE PIC 9.
01 WS-IDX PIC 9(2).
01 WS-SEARCH-ID PIC 9(5).
01 WS-FOUND PIC 9.
01 WS-DAYS PIC 9(3).
01 WS-FINE PIC 9(5)V99.
01 WS-FINE-RATE PIC 9(2) VALUE 5.
01 WS-MAX-DAYS PIC 9(2) VALUE 14.
01 WS-DISP PIC ZZ,ZZ9.99.
PROCEDURE DIVISION.
PERFORM INIT-BOOKS.
PERFORM UNTIL WS-CHOICE = 6
DISPLAY " "
DISPLAY "=== LIBRARY MANAGEMENT ==="
DISPLAY "1. ADD BOOK"
DISPLAY "2. ISSUE BOOK"
DISPLAY "3. RETURN BOOK"
DISPLAY "4. SEARCH BOOK"
DISPLAY "5. LIST AVAILABLE"
DISPLAY "6. EXIT"
ACCEPT WS-CHOICE
EVALUATE WS-CHOICE
WHEN 1 PERFORM ADD-BOOK
WHEN 2 PERFORM ISSUE-BOOK
WHEN 3 PERFORM RETURN-BOOK
WHEN 4 PERFORM SEARCH-BOOK
WHEN 5 PERFORM LIST-AVAILABLE
END-EVALUATE
END-PERFORM.
STOP RUN.
ADD-BOOK.
ADD 1 TO WS-BOOK-COUNT.
MOVE WS-BOOK-COUNT TO WS-BOOK-ID(WS-BOOK-COUNT).
DISPLAY "TITLE: ".
ACCEPT WS-BOOK-TITLE(WS-BOOK-COUNT).
DISPLAY "AUTHOR: ".
ACCEPT WS-BOOK-AUTHOR(WS-BOOK-COUNT).
MOVE "A" TO WS-STATUS(WS-BOOK-COUNT).
DISPLAY "BOOK ADDED. ID: " WS-BOOK-ID(WS-BOOK-COUNT).
ISSUE-BOOK.
DISPLAY "BOOK ID: ".
ACCEPT WS-SEARCH-ID.
PERFORM FIND-BOOK.
IF WS-FOUND = 1
IF WS-STATUS(WS-IDX) = "A"
DISPLAY "MEMBER ID: "
ACCEPT WS-MEMBER-ID(WS-IDX)
MOVE 20240115 TO WS-ISSUE-DATE(WS-IDX)
MOVE "I" TO WS-STATUS(WS-IDX)
DISPLAY "BOOK ISSUED. DUE IN 14 DAYS."
ELSE
DISPLAY "BOOK NOT AVAILABLE"
END-IF
ELSE
DISPLAY "BOOK NOT FOUND"
END-IF.
RETURN-BOOK.
DISPLAY "BOOK ID: ".
ACCEPT WS-SEARCH-ID.
PERFORM FIND-BOOK.
IF WS-FOUND = 1
IF WS-STATUS(WS-IDX) = "I"
DISPLAY "DAYS KEPT: ".
ACCEPT WS-DAYS
IF WS-DAYS > WS-MAX-DAYS
COMPUTE WS-FINE = (WS-DAYS - WS-MAX-DAYS) * WS-FINE-RATE
MOVE WS-FINE TO WS-DISP
DISPLAY "OVERDUE FINE: Rs." WS-DISP
ELSE
DISPLAY "NO FINE. RETURNED ON TIME."
END-IF
MOVE "A" TO WS-STATUS(WS-IDX)
MOVE 0 TO WS-MEMBER-ID(WS-IDX)
ELSE
DISPLAY "BOOK WAS NOT ISSUED"
END-IF
ELSE
DISPLAY "BOOK NOT FOUND"
END-IF.
SEARCH-BOOK.
DISPLAY "BOOK ID: ".
ACCEPT WS-SEARCH-ID.
PERFORM FIND-BOOK.
IF WS-FOUND = 1
DISPLAY "TITLE: " WS-BOOK-TITLE(WS-IDX)
DISPLAY "AUTHOR: " WS-BOOK-AUTHOR(WS-IDX)
IF WS-STATUS(WS-IDX) = "A"
DISPLAY "STATUS: AVAILABLE"
ELSE
DISPLAY "STATUS: ISSUED TO " WS-MEMBER-ID(WS-IDX)
END-IF
ELSE
DISPLAY "BOOK NOT FOUND"
END-IF.
LIST-AVAILABLE.
DISPLAY "AVAILABLE BOOKS:".
DISPLAY "ID TITLE AUTHOR".
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > WS-BOOK-COUNT
IF WS-STATUS(WS-IDX) = "A"
DISPLAY WS-BOOK-ID(WS-IDX) " " WS-BOOK-TITLE(WS-IDX)
" " WS-BOOK-AUTHOR(WS-IDX)
END-IF
END-PERFORM.
FIND-BOOK.
MOVE 0 TO WS-FOUND.
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > WS-BOOK-COUNT
IF WS-BOOK-ID(WS-IDX) = WS-SEARCH-ID
MOVE 1 TO WS-FOUND
END-IF
END-PERFORM.
INIT-BOOKS.
MOVE 3 TO WS-BOOK-COUNT.
MOVE 1 TO WS-BOOK-ID(1).
MOVE "COBOL PROGRAMMING" TO WS-BOOK-TITLE(1).
MOVE "STERN" TO WS-BOOK-AUTHOR(1).
MOVE "A" TO WS-STATUS(1).
MOVE 2 TO WS-BOOK-ID(2).
MOVE "MAINFRAME BASICS" TO WS-BOOK-TITLE(2).
MOVE "IBM" TO WS-BOOK-AUTHOR(2).
MOVE "A" TO WS-STATUS(2).
MOVE 3 TO WS-BOOK-ID(3).
MOVE "JCL REFERENCE" TO WS-BOOK-TITLE(3).
MOVE "BROWN" TO WS-BOOK-AUTHOR(3).
MOVE "A" TO WS-STATUS(3).
Explanation:
Library with issue/return tracking, availability check, fine calculation.