1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo Cáo Bài Tập Lớn Kĩ Thuật Lập Trình Xây Dựng Chương Trình Quản Lý Thư Viện.pdf

58 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trang 1

ĐẠI HỌC BÁCH KHOA HÀ NỘI

KHOA TOÁN TIN

BÁO CÁO BÀI TẬP LỚNKĨ THUẬT LẬP TRÌNH

Xây dựng

chương trình quản lý thư viện

Giảng viên: Vũ Thành NamSinh viên: Nguyễn Thị Vân

Hà Nội, 20/06/2024

Trang 2

TABLE OF CONTENTS

1.1 Các file Input 1

1.2 Chức năng chính 1

1.2.1 Chức năng cho Admin 1

1.2.2 Chức năng cho Guest 3

1.3 Các file trong project 4

CHƯƠNG 2: MÔ TẢ CẤU TRÚC CHƯƠNG TRÌNH62.1 File safe_stoi 6

Trang 3

3.2 Chức năng của Guest 25

3.2.1 Display detail of every book in the library 25

3.2.2 Find detail of a book by book_id 26

3.3 Chức năng của Admin 27

Trang 4

CHƯƠNG IV: KIẾN THỨC VẬN DỤNG51

4.1 TRONG LẬP TRÌNH 514.2 TRONG KIỂM THỬ 51

Trang 5

LỜI MỞ ĐẦU

Kĩ thuật lập trình là một bộ môn quan trọng giúp tăng khả năng tư duy về thiết kếchương trình cũng như thiết kế hệ thống sao cho tối ưu và hiệu quả nhất Đây là bộ mônkhông thể thiếu trong lĩnh vực công nghệ thông tin Học phần đã cung cấp nhiều kiếnthức quý báu về việc thiết kế giải thuật phù hợp cũng như trình bày mã nguồn hợp.

Sau một thời gian học hỏi em quyết định chọn đề tài "Xây dựng chương trình quảnlí thư viện" để có thể áp dụng tuyệt đối các kiến thức đã học vào thực tiễn Đây là lầnđầu tiên em tự tay một chương trình nên không thể tránh khỏi những sai sót mong thầyvà các bạn đọc bỏ qua và góp ý để có thể hoàn thiện đề tài.

Cuối cùng em xin chân thành cảm ơn thầy Vũ Thành Nam đã tận tình hướng dẫnvà chỉ bảo để em có thể hoàn thiện báo cáo một cách tốt nhất.

Em xin chân thành cảm ơn!!!

Trang 6

CHƯƠNG 1 TỔNG QUAN

1.1Các file Input

Figure 1.1Yêu cầu cơ bản của chương trình

• Xây dựng chương trình để quản lí thư viện với các file In put là:

– BookMarc.csv: Mục đích của file này để quản lí thông tin biên mục sách của

mỗi quyển sách sẽ bao gồm các thông tin cơ bản của một cuốn sách như:Book_id (mã sách), Title (tiêu đề) , Author (tác giả), Publisher (nhà xuất bản),Year (năm phát hành), ISBN.

– Book.csv: Mục đích của file này là quản lí thông tin lưu trữ của mỗi quyển sách

với các thuộc tính là: Book_id (mã sách), Store_id (số nhập kho có dạng làNgayThangNamSTT Ví dụ: 190220221), Quantity (số lượng hiện có), Status(tình trạng: availbable, borrowed).

– Ngoài ra em bổ sung thêm một file bổ trợ là adminaccount.csv bao gồm các tài

khoản của admin Các tài khoản này sẽ được truy cập với vai trò Admin củachương trình, được truy cập những chức năng như: thêm, sửa, xóa các thông tincủa thư viện File bao gồm 2 thông tin chính là: AdminName và Password.

1.2Chức năng chính

Chương trình hướng đến hai đối tượng sử dụng là Amin (quản trị viên) là nhân viêncủa thư viện - người trực tiếp quản lí các thông tin trong thư viện và Guest là khách đếnthư viện Hai đối tượng khi sử dụng chương trình sẽ có những quyền sử dụng các chứcnăng khác nhau.

1.2.1Chức năng cho Admin

Khi muốn sử dụng chương trìnhh với vai trò Admin cần đăng nhập bằng tài khoảnđã có sẵn Các tài khoản này được lưu trữ trong file adminaccount.csv.

Trang 7

Figure 1.2Admin Menu

Giao diện menu của Admin sẽ thể hiện các chức năng cơ bản chính:

• Manage Bookmarc Information: Quản lí thông tin các biên mục sách bao gồm

các chức năng nhỏ sau:

– Display BookMarc: Hiển thị tất cả thông tin biên mục của tất cả cuốn sách hiện

có trong thư viện.

– Add a new BookMarc from console: Thêm mới một biên mục sách từ bàn phím.– Edit BookMarc: Chỉnh sửa thông tin một BookMarc hiện có.

– Delete Bookmarc: Xóa một biên mục sách hiện có.– Exit: Thoát Admin Menu hiện tại.

Figure 1.3Manage BookMarc Information

• Manage Book Storage Information: Quản lí thông tin lưu trữ tất cả cuốn sách

hiện có tại thư viện Bao gồm các chức năng sau:

Trang 8

– Display Book: Hiển thị tất cả thông tin lưu trữ của tất cả cuốn sách hiện có

trong thư viện.

– Add a new Book from console: Thêm mới một thông tin lưu trữ một cuốn sách

từ bàn phím.

– Edit Book: Chỉnh sửa thông tin lưu trữ của một quyển sách hiện có.– Delete Book: Xóa một thông tin lưu trữ của một hiện có.

– Exit: Thoát Admin Menu hiện tại.

Figure 1.4Manage Book Storage Information

• Search Book Detail: Tra cứu thông tin về tất cả cuốn sách hiện có tại thư viện.

Thông tin mỗi quyển sách được kết hợp từ 2 file BookMarc.csv và file Book.csv.Book Detail sẽ được hiểu là bao gồm: Book_id, Store_id, Quantity, Status, Title,Author, Publisher, Year, ISBN Bao gồm các chức năng sau:

– Display all book details: Hiển thị thông tin của tất cả quyển sách hiện có– Find detail of a book by ID: Tìm kiếm thông tin của một quyển sách bằng ID.

Figure 1.5Search Book Detail Information

1.2.2Chức năng cho Guest

Đối với khách khi sử dụng sẽ không cần tài khoản đăng nhập như Admin do đó sẽcó hạn chế về một số chức năng Guest khi sử dụng chương trình sẽ được tra cứu thôngtin các quyển sách hiện có và không được thêm, sửa, xóa các thông tin của thư viện.

Trang 9

Figure 1.6Guest Menu

Giao diện của Guest sẽ thể hiện các chức năng chính:

• Display detail of every book in the library: Hiển thị thông tin của tất cả quyển

sách hiện có giúp người đọc dễ dàng nắm bắt tình hình mượn trả

• Find detail of a book by Book ID: Người đọc hoàn toàn có thể tìm kiếm thông tin

của một quyển sách thông qua ID của quyển sách đó

→ Chức năng của khách tuy hạn chế nhưng cũng đáp ứng đủ nhu cầu đối với một ngườiđọc khi sử dụng dịch vụ của thư viện.

1.3Các file trong project

Chương trình được chia thành các file nhỏ Mỗi file sẽ có chức năng riêng

Figure 1.7Cấu trúc chương trình

• Book.cpp: File này được sử dụng để lưu các thao tác (thêm, sửa, xóa, tìm kiếm) dữ

liệu trong file Book.csv.

• BookMarc.cpp: File này được sử dụng để lưu các thao tác (thêm, sửa, xóa, tìm

kiếm) với dữ liệu trong file BookMarc.csv.

Trang 10

• safe_stoi.cpp: File này được sử dụng để lưu thao tác chuyển an toàn từ string sang

integer Thao tác này được gọi nhiểu lần trong file Book.cpp và BookMarc.cpp nênđược tạo một file riêng để thuận tiện trong việc nhắc lại

• main.cpp: File main được sử dụng để thiết kế giao diện đơn giản và chứa thao tác

với book detail do book detail được kết hợp giữa Book và BookMarc nên được để ởfile main.cpp

• Book.h: File này được sử dụng để chứa cấu trúc dữ liệu của file input Book.csv và

gọi các hàm được viết ở file Book.cpp

• BookMarc.h: File này được sử dụng để chứa cấu trúc dữ liệu của file input

Book-Marc.csv và gọi các hàm được viết ở file BookMarc.cpp

• safe_stoi.h: File này được sử dụng để gọi hàm được viết ở file safe_stoi.cpp

Trang 11

CHƯƠNG 2: MÔ TẢ CẤU TRÚC CHƯƠNG TRÌNH

Phần sau sẽ gọi các hàm được viết trong file BookMarc.cpp

Trang 12

• Cấu trúc của hàm như sau:

– Định nghĩa hàm: hàm này tên là ReadBookMarcFromCSV, hàm này nhận

tham chiếu của chuỗi để chiếu đến tên file sẽ đọc dữ Hàm này trả về vector để

lưu trữ các đối tượng BookMarc.

– Khai báo biến: Khai báo vector để lưu trữ các đối tượng BookMarc được đọc

từ file csv.

– Đọc file CSV: Nếu mở file bị lỗi sẽ trả về BookMarcList.

– Kiểm tra tính duy nhất của Book_id: Sử dụng một tập hợp book_id_set để

kiểm tra tính trùng lặp của book_id nếu có sẽ báo lỗi và book_id trùng lặp sẽđược đưa vào

– Đọc từng dòng của file CSV: Sẽ đọc từ dòng đầu tiên của file csv đến dòng

cuối cùng sau các đối tượng BookMarc được đọc sẽ được thêm vào cList Cuối cùng đóng file và trả về BookMarcList.

BookMar-• Khi đọc dữ liệu từ file BookMarc, file safe_stoi được sử dụng xuyên suốt để có thểchuyển an toàn dữ liệu từ dạng string sang int.

2.3.2Hàm DisplayBookMarc

• Hàm này được sử dụng để in các BookMarc ra màn hình.

• Hàm nhận vào tham chiếu hằng chiếu đến các vector BookMarc và không trả về giá

trị nào nên khai báo kiểu void.

• Sử dụng vòng lặp for để in ra tất cả các thông tin của BookMarc.

2.3.3Hàm DeleteBookMarcFromCSV

Hàm này được sử dụng để xóa một đối tượng BookMar đã có sẵn Cấu trúc củahàm như sau:

• Hàm mở tệp CSV để đọc và một tệp tạm thời để ghi.• Duyệt qua từng dòng của tệp gốc, kiểm tra book_id.• Nếu book_id khớp, dòng đó sẽ bị bỏ qua.

• Các dòng không khớp được ghi vào tệp tạm thời.• Đóng cả hai tệp sau khi hoàn tất.

• Nếu book_id không được tìm thấy, xóa tệp tạm thời và thông báo Nếu book_idđược tìm thấy, xóa tệp gốc và đổi tên tệp tạm thời thành tệp gốc.

• Thông báo thành công.

Trang 13

2.3.4Hàm CheckDuplicate

Hàm này được sử dụng để kiểm tra tính duy nhất của thuộc tính book_id Cấu trúchàm như sau:

• Mở tệp: Hàm mở tệp CSV để đọc Nếu không thể mở tệp, hàm in ra thông báo lỗi

và trả về true để ngăn việc thêm dữ liệu mới.

• Đọc và phân tích cú pháp: Hàm đọc từng dòng của tệp, phân tích cú pháp để tách

các trường và tạo đối tượng BookMarc.

• Kiểm tra trùng lặp: Kiểm tra book_id của đối tượng trong tệp có khớp với book_id

của đối tượng mới hay không Nếu có, in ra thông báo và trả về true.

• Đóng Tệp: Đóng tệp sau khi hoàn tất việc đọc.

• Trả về kết quả: Nếu không tìm thấy đối tượng nào trùng lặp, trả về false.

2.3.5Hàm ValidateInput

Hàm này được sử dụng để kiểm tra định dạng của các thuộc tính của đối tượngBookMarc Hàm được sử dụng để kiểm tra dữ liệu nhập vào khi người dùng sử dụngtính năng Add a new BookMarc Cụ thể như sau:

• book_id: Phải là số nguyên không âm.• title: Không được rỗng.

• author: Không được rỗng.• publisher: Không được rỗng.• year: Là số nguyên không âm.• ISBN: Không được rỗng.

Nếu tất cả các thuộc tính đều hợp lệ, hàm trả về true Nếu có bất kỳ thuộc tính nào khônghợp lệ, hàm in ra thông báo lỗi và trả về false.

2.3.6Hàm AddBookMarcFromConsole

Hàm AddBookMarcFromConsole cho phép người dùng nhập thông tin sách mớitừ bàn phím và lưu thông tin này vào cuối tệp BookMarc.csv Trước khi thêm, hàm kiểmtra tính hợp lệ của dữ liệu và tránh thêm các bản ghi trùng lặp Quá trình nhập dữ liệuđược kiểm soát và xử lý để đảm bảo tính chính xác và đáng tin cậy của dữ liệu trong tệp.Cấu trúc hàm như sau:

Trang 14

• Định nghĩa hàm: Hàm AddBookMarcFromConsole nhận vào một tham số

file-name, đây là tên của tệp CSV mà thông tin sách mới sẽ được thêm vào.

• Mở tệp để ghi: Mở file csv để ghi nếu không mở được sẽ báo lõip và thoát khỏi

• Nhập thông tin sách: Người dùng sẽ được yêu cầu nhập các thông tin: book_id,

title, author, publisher.

• Kiểm tra và nhập năm: Người dùng được yêu cầu nhập year (năm xuất bản) và

hàm sẽ kiểm tra tính hợp lệ của giá trị nhập vào Nếu giá trị không phải là số nguyênkhông âm lớn hơn năm hiện tại sẽ in ra thông báo lỗi và yêu cầu nhập lại.

• Kiểm tra và nhập ISBN: Người dùng được yêu cầu nhập isbn và sau đó kiểm tra

tính hợp lệ của dữ liệu nhập vào bằng cách gọi hàm ValidateInput Nếu dữ liệu nhậpkhông hợp lệ, in ra thông báo lỗi và thoát khỏi hàm.

• Kiểm tra trùng : Kiểm tra xem đối tượng newBook có trùng lặp với bất kỳ đốitượng nào đã có trong tệp CSV hay không, bằng cách gọi hàm CheckDuplicate.Nếu có trùng lặp, in ra thông báo lỗi và thoát khỏi hàm.

• Ghi đối tượng newbook vào tệp: Nếu không có lỗi gì xảy ra và newBook không

trùng lặp, ghi thông tin của newBook vào tệp CSV.

• Đóng tệp và lưu kết quả: In ra thông báo khi đã thêm sách mới thành công Đóng

tệp sau khi ghi dữ liệu.

2.3.7Hàm EditBookMarcInCSV

Hàm EditBookMarcInCSV được thiết kế để chính sửa thông tin của một cuốn sáchtrong file BookMarc.csv dựa trên book_id Dưới đây là phân tích chi tiết về cách hoạtđộng của hàm này:

• Mở file đầu vào và tạo file tạm thời:

– Hàm bắt đầu bằng việc mở file filename để đọc dữ liệu và temp.csv để ghi dữ

liệu sau khi chỉnh sửa.

– Nếu không mở được file đầu vào "filename", thông báo lỗi và thoát khỏi hàm.– Nếu không mở được file tạm thời "temp.csv", đóng file đầu vào và thoát khỏi

• Đọc từng dòng trong file đầu vào:

– Hàm sử dụng vòng lặp while để đọc từng dòng trong file đầu vào inputFile.

Trang 15

– Mỗi dòng được đọc và xử lý thông qua stringstream để trích xuất từng trường

dữ liệu "token".

• Kiểm tra book_id và thực hiện chỉnh sửa:

– Nếu currentBookId (đọc từ trường đầu tiên của dòng) bằng book_id cần chỉnh

sửa, hàm tiến hành hiển thị menu để người dùng lựa chọn trường cần cập nhật.

– Dùng switch để xử lý từng lựa chọn:

* Case 1-5: Mỗi case tương ứng với từng trường cần cập nhật (title, author,publisher, year, isbn).

* Đối với mỗi trường, người dùng được yêu cầu nhập giá trị mới.

* Trước khi cập nhật, hàm kiểm tra xem giá trị mới có trùng với giá trị hiện tạikhông và có hợp lệ hay không (với year và isbn sử dụng hàm ValidateYearvà ValidateISBN).

* Sau khi cập nhật giá trị, thông tin mới được ghi vào tempFile.

• Ghi dữ liệu vào file tạm thời:

– Sau khi xử lý xong mỗi dòng, thông tin được ghi vào tempFile với các trường

đã được cập nhật (nếu có).

• Kiểm tra và xử lý kết quả:

– Nếu không tìm thấy book_id trong file đầu vào, thông báo lỗi và xóa temp.csv.– Sau khi ghi hoàn tất, file gốc (filename) được xóa và file tạm thời (temp.csv)

được đổi tên thành tên file gốc.

– Nếu có lỗi trong quá trình xóa hoặc đổi tên file, thông báo lỗi tương ứng.• Thông báo kết quả:

– Nếu quá trình sửa đổi thành công, thông báo "Book with ID has been updated

2.3.8Hàm SearchBookMarcById

Hàm SearchBookMarcById được thiết kế để tìm kiếm thông tin của một cuốn sáchtrong file BookMarc.csv dựa trên book_id Dưới đây là phân tích chi tiết về cách hoạtđộng của hàm này:

• Mở file và kiểm tra lỗi:

– Hàm bắt đầu bằng việc mở file filename để đọc dữ liệu.

Trang 16

– Nếu không mở được file (file.is_open() trả về false), thông báo lỗi và trả về

• Đọc từng dòng trong file:

– Hàm sử dụng vòng lặp while để đọc từng dòng trong file đầu vào (file).

– Mỗi dòng được đọc và xử lý thông qua stringstream để trích xuất từng trường

dữ liệu (token).

• So sánh book_id và hiển thị thông tin:

– Đọc currentBookId từ trường đầu tiên của dòng (token đầu tiên trước dấu phẩy).– Nếu currentBookId bằng book_id cần tìm, hàm xác nhận đã tìm thấy cuốn sách

và tiến hành hiển thị thông tin chi tiết của cuốn sách này:* Hiển thị Book ID, Title, Author, Publisher, Year, và ISBN.* Đóng file và trả về true, cho biết tìm thấy và hoàn thành tác vụ.

• Đóng file và thông báo kết quả:

– Sau khi xử lý xong vòng lặp, nếu không tìm thấy book_id, hàm thông báo rằng

"Book with ID not found." và trả về false.

– Đảm bảo đóng file trước khi kết thúc hàm.

2.3.9Hàm SearchBookMarcByTitle

Hàm SearchBookMarcByTitle được thiết kế để tìm kiếm thông tin của một cuốnsách trong file BookMarc.csv dựa trên title Dưới đây là phân tích chi tiết về cách hoạtđộng của hàm này:

• Mở file và kiểm tra lỗi:

– Hàm bắt đầu bằng việc mở file filename để đọc dữ liệu.

– Nếu không mở được file (file.is_open() trả về false), thông báo lỗi và trả về

• Đọc từng dòng trong file:

– Hàm sử dụng vòng lặp while để đọc từng dòng trong file đầu vào (file).

– Mỗi dòng được đọc và xử lý thông qua stringstream để trích xuất từng trường

dữ liệu (token).

• So sánh title và hiển thị thông tin:

Trang 17

– Sau khi đọc token đầu tiên (chứa book_id), hàm tiếp tục đọc currentTitle (chứa

title) từ dòng.

– Nếu currentTitle bằng title cần tìm, hàm xác nhận đã tìm thấy cuốn sách và tiến

hành hiển thị thông tin chi tiết của cuốn sách này:

* Hiển thị Book ID, Title, Author, Publisher, Year, và ISBN.* Đóng file và trả về true, cho biết tìm thấy và hoàn thành tác vụ.

• Đóng file và thông báo kết quả:

– Sau khi xử lý xong vòng lặp, nếu không tìm thấy book_id, hàm thông báo rằng

"Book with ID not found." và trả về false.

– Đảm bảo đóng file trước khi kết thúc hàm.

2.3.10Hàm SearchBookMarcByAuthor

Hàm SearchBookMarcByAuthor được thiết kế để tìm kiếm và hiển thị thông tincủa các cuốn sách có cùng tác giả trong file BookMarc.csv Dưới đây là phân tích chitiết về cách hoạt động của hàm này:

• Đọc danh sách BookMarc từ file CSV:

– Hàm bắt đầu bằng việc gọi hàm ReadBookMarcFromCSV(filename) để đọc

toàn bộ dữ liệu từ file CSV và lưu trữ vào vector<BookMarc> bookMarcList.

– Hàm ReadBookMarcFromCSV sẽ trả về một danh sách các đối tượng

• Tìm kiếm sách theo tác giả:

– Khởi tạo biến found để theo dõi xem có sách nào được tìm thấy hay không– Sử dụng vòng lặp for để duyệt qua từng BookMarc trong bookMarcList.– So sánh trường author của mỗi BookMarc với author cần tìm.

– Nếu tìm thấy, đặt found = true và hiển thị thông tin chi tiết của cuốn sách đó:

Hiển thị Book ID, Title, Author, Publisher, Year, và ISBN.

• Thông báo kết quả:

– Sau khi duyệt qua toàn bộ danh sách, nếu không tìm thấy sách nào của tác giả

đó (found == false), hàm sẽ hiển thị thông báo "No books found with author ".

Trang 18

2.3.11Hàm SearchBookMarcByPublisher

Hàm SearchBookMarcByPublisher nhiệm vụ tìm kiếm và hiển thị thông tin sáchtheo nhà xuất bản từ tệp BookMarc.csv Dưới đây là giải thích chi tiết về cách hoạt độngcủa hàm này:

• Đọc danh sách sách từ tệp BookMarc.csv:

– Gọi hàm ReadBookMarcFromCSV(filename) để đọc dữ liệu từ tệp CSV và lưu

trữ vào danh sách (vector<BookMarc> bookMarcList).

• Khởi tạo biến kiểm tra:

– Khởi tạo biến bool found = false; để theo dõi xem có sách nào được tìm thấy

hay không.

• Duyệt qua danh sách sách:

– Sử dụng vòng lặp for để duyệt qua từng cuốn sách trong bookMarcList.

– Kiểm tra nếu nhà xuất bản của cuốn sách (bookMarc.publisher) trùng khớp với

nhà xuất bản cần tìm (publisher).

• In thông tin sách nếu tìm thấy:

– Nếu tìm thấy sách với nhà xuất bản trùng khớp, đặt found = true.

– In thông tin chi tiết của cuốn sách (ID, Tiêu đề, Tác giả, Nhà xuất bản, Năm,

• Thông báo nếu không tìm thấy sách:

– Sau khi duyệt qua toàn bộ danh sách, nếu found vẫn là false, in ra thông báo

"Không tìm thấy sách nào của nhà xuất bản ’publisher’".

2.3.12Hàm SearchBookMarcByYear

Hàm SearchBookMarcByYear có chức năng tìm kiếm và hiển thị thông tin sáchtheo năm xuất bản từ tệp BookMarc.csv Dưới đây là giải thích chi tiết về cách hoạtđộng của hàm này và một tóm tắt các bước thực hiện:

• Gọi hàm đọc tệp BookMarc và lưu danh sách sách vào bookMarcList.• Khởi tạo biến found = false.

• Duyệt qua từng cuốn sách trong bookMarcList

Trang 19

– Chuyển đổi chuỗi bookMarc.year sang số nguyên và so sánh với year.

– Nếu bookMarc.year == year: Đặt found = true, In thông tin chi tiết của cuốn

sách (ID, Tiêu đề, Tác giả, Nhà xuất bản, Năm, ISBN).• Nếu found là false, in thông báo không tìm thấy sách.

2.3.13Hàm SearchBookMarcByISBN

Hàm SearchBookMarcByYear có chức năng tìm kiếm và hiển thị thông tin sáchtheo số từ tệp BookMarc.csv Dưới đây là giải thích chi tiết về cách hoạt động của hàmnày và một tóm tắt các bước thực hiện:

• Gọi hàm đọc tệp CSV và lưu danh sách sách vào bookMarcList.• Khởi tạo biến found = false.

• Duyệt qua từng cuốn sách trong bookMarcList

– Nếu bookMarc.isbn == isbn

– Đặt found = true, in thông tin chi tiết của cuốn sách (ID, Tiêu đề, Tác giả, Nhà

xuất bản, Năm, ISBN), dừng vòng lặp bằng break.• Nếu found là false, in thông báo không tìm thấy sách.

Trang 20

2.5.1Hàm ReadBookFromCSV

Đoạn mã ReadBookFromCSV có nhiệm vụ đọc dữ liệu từ file Book.csv và chuyểnđổi chúng thành các đối tượng Book, sau đó lưu vào một vector Dưới đây là giải thíchchi tiết từng phần của mã:

• Mở tệp CSV:Hàm nhận vào tên tệp CSV (filename) và mở tệp để đọc dữ liệu.

• Kiểm tra mở tệp: Nếu tệp không mở được, hiển thị thông báo lỗi và trả về mộtvector rỗng.

• Đọc từng dòng của tệp: Sử dụng vòng lặp để đọc từng dòng của tệp CSV.

• Phân tích cú pháp và chuyển đổi dữ liệu:

– Sử dụng stringstream để phân tích cú pháp từng dòng.

– Đọc từng giá trị từ dòng, chuyển đổi từ chuỗi thành số nguyên (nếu cần), và gán

vào các thuộc tính của đối tượng Book.

• Thêm đối tượng Book vào danh sách: Thêm đối tượng Book đã được điền đầy đủdữ liệu vào vector bookList.

• Đóng tệp và trả về danh sách sách: Đóng tệp CSV sau khi đọc xong và trả vềvector chứa tất cả các đối tượng Book đã được đọc từ tệp CSV.

2.5.2Hàm DisplayBook

• Hàm này được sử dụng để in các Book ra màn hình.

• Hàm nhận vào tham chiếu hằng chiếu đến các vector Book và không trả về giá trị

nào nên khai báo kiểu void.

• Sử dụng vòng lặp for để in ra tất cả các thông tin của Book.

2.5.3Hàm DeleteBookFromCSV

Hàm DeleteBookFromCSV có nhiệm vụ xóa một cuốn sách dựa trên book_id từmột tệp Book.csv Dưới đây là tóm tắt các bước thực hiện của mã:

• Mở tệp và kiểm tra mở tệp: Mở tệp CSV (filename) để đọc nội dung.

• Tạo tệp tạm: NTạo một tệp tạm (temp.csv) để ghi lại các dòng sách sau khi xóa.

• Đọc từng dòng trong tệp gốc: Sử dụng vòng lặp để đọc từng dòng của tệp CSV.

– Sử dụng while (getline(inputFile, line)) để đọc từng dòng của tệp CSV.

Trang 21

– Sử dụng istringstream để phân tích cú pháp dòng và lấy book_id từ dòng hiện

• Kiểm tra và xóa dòng có book_id tương ứng:

– So sánh currentBookId (lấy từ dòng hiện tại) với book_id.

– Đọc từng giá trị từ dòng, chuyển đổi từ chuỗi thành số nguyên (nếu cần), và gán

vào các thuộc tính của đối tượng Book.

– Nếu tìm thấy book_id, đánh dấu found = true và bỏ qua dòng đó (không ghi

vào tệp tạm).

– Nếu không phải book_id cần xóa, ghi dòng đó vào tempFile.

• Đóng tệp và tệp tạm: Đóng cả tệp gốc và tệp tạm sau khi hoàn thành việc đọc vàghi Nếu thành công, in ra thông báo cho biết book_id đã được xóa thành công.

• Mở tệp và kiểm tra mở tệp:

– Hàm mở tệp CSV (filename) để đọc dữ liệu.

– Nếu không mở được tệp, in ra thông báo lỗi và trả về true, cho rằng có lỗi xảy

ra và không thể kiểm tra.

• Đọc từng dòng trong tệp:

– Sử dụng while (getline(file, line)) để đọc từng dòng của tệp.

– Mỗi dòng sẽ được đưa vào stringstream (ss) để phân tích cú pháp và lấy ra

book_id và store_id.

Trang 22

• Chuyển đổi dữ liệu từ chuỗi thành số nguyên:Sử dụng getline(ss, temp, ’,’) để lấytừng giá trị trong dòng và chuyển đổi từ chuỗi thành số nguyên bằng hàm safe_stoi.

• Kiểm tra trùng lặp:

– So sánh book_id và store_id của từng cuốn sách trong tệp với book_id và

store_id của newBook.

– Nếu tìm thấy book_id hoặc store_id của newBook trùng với một trong các cuốn

sách đã có trong tệp, in ra thông báo và trả về true, cho biết đã có sự trùng lặp.

• Đóng tệp và trả về kết quả:

– Đóng tệp sau khi hoàn thành việc đọc.

– Nếu không tìm thấy trùng lặp, trả về false, cho biết không có cuốn sách nào

trùng lặp với newBook.

2.5.5Hàm AddBookToCSV

Hàm AddBookToCSV có nhiệm vụ cho phép người dùng nhập thông tin của mộtcuốn sách mới và thêm thông tin này vào tệp CSV sau khi kiểm tra tính hợp lệ và sựtrùng lặp của book_id và store_id Dưới đây là phân tích chi tiết từng bước của hàm này:

• Nhập thông tin cuốn sách mới: Người dùng được yêu cầu nhập thông tin của mộtcuốn sách mới bao gồm book_id, store_id, quantity và status.

• Kiểm tra và nhập book ID:

– Sử dụng cin » newBook.book_id để nhập book_id.

– Kiểm tra tính hợp lệ của dữ liệu nhập: Nếu cin » newBook.book_id thất bại

(không phải là số nguyên), in ra thông báo lỗi và quay lại.

• Kiểm tra và nhập store ID:

– Sử dụng cin » newBook.store_id để nhập store_id.

– Kiểm tra tính hợp lệ của dữ liệu nhập: Nếu cin » newBook.store_id thất bại

(không phải là số nguyên hoặc nhỏ hơn 0), in ra thông báo lỗi và quay lại.

• Kiểm tra và nhập quantity:

– Sử dụng cin » newBook.quantity để nhập quantity.

– Kiểm tra tính hợp lệ của dữ liệu nhập: Nếu cin » newBook.quantity thất bại

(không phải là số nguyên hoặc nhỏ hơn 0), in ra thông báo lỗi và quay lại.

Trang 23

• Kiểm tra và nhập status:

– Sử dụng cin » statusInput để nhập status.

– Kiểm tra tính hợp lệ của dữ liệu nhập: Nếu cin » statusInput thất bại (không

phải là 0 hoặc 1), in ra thông báo lỗi và quay lại.

– Dựa vào statusInput, thiết lập giá trị cho newBook.status là "available" nếu

statusInput là 1 và là "borrowed" nếu là 0.

• Kiểm tra sự trùng lặp:

– Gọi hàm CheckDuplicate(filename, newBook) để kiểm tra xem có sự trùng lặp

với book_id hoặc store_id đã có trong tệp không.

– Nếu không có sự trùng lặp (CheckDuplicate trả về false), tiếp tục thực hiện

thêm cuốn sách vào tệp CSV.

– Nếu có sự trùng lặp (CheckDuplicate trả về true), in ra thông báo và không

thêm cuốn sách vào tệp.

• Thêm cuốn sách mới vào tệp CSV:

– Mở tệp CSV (filename) để ghi vào cuối file (ios::app).– Nếu không mở được tệp, in ra thông báo lỗi và thoát.– Sử dụng file « để ghi thông tin của newBook vào tệp.– Đóng tệp sau khi ghi xong và in ra thông báo thành công.

2.5.6Hàm EditBookInCSV

Hàm EditBookInCSV cho phép người dùng chỉnh sửa thông tin của một cuốn sáchtrong tệp CSV, bao gồm cập nhật store_id, quantity, và status Trước khi cập nhật, hàmkiểm tra tính hợp lệ của dữ liệu nhập và thông báo lỗi nếu cần thiết Sau khi cập nhật,hàm xóa tệp gốc và đổi tên tệp tạm thành tên tệp gốc để lưu thay đổi.

• Hàm ValidateStore_id:

– Kiểm tra xem chuỗi store_id có chứa chỉ chữ số không.

– Duyệt từng ký tự trong store_id, nếu có ký tự không phải là số thì trả về false,

ngược lại trả về true.

• Hàm ValidateStatus:

– Kiểm tra xem chuỗi status có bằng "available" hoặc "borrowed" không.– Trả về true nếu status là "available" hoặc "borrowed", ngược lại trả về false.

Trang 24

• Hàm EditBookInCSV:

– Mở tệp để đọc (inputFile) và một tệp tạm (tempFile) để ghi.– Nếu không mở được tệp để đọc, thông báo lỗi và thoát.– Nếu không mở được tệp tạm để ghi, đóng inputFile và thoát.• Vòng lặp while để duyệt từng dòng trong tệp gốc (inputFile):

– Dùng getline để lấy từng dòng, sau đó sử dụng stringstream (ss) để phân tách

các trường dữ liệu.

– Kiểm tra xem currentBookId (là book_id của cuốn sách hiện tại) có bằng

book_id cần sửa không.

– Nếu tìm thấy cuốn sách cần sửa:

* Yêu cầu người dùng chọn trường dữ liệu cần cập nhật (store_id, quantity,status).

* Dựa vào lựa chọn của người dùng, nhập dữ liệu mới và kiểm tra tính hợp lệ.* Nếu dữ liệu không hợp lệ, in ra thông báo lỗi và ghi lại dòng dữ liệu cũ vào

* Nếu hợp lệ, cập nhật dữ liệu mới vào biến tương ứng (store_id, quantity,status).

– Nếu không tìm thấy cuốn sách cần sửa, ghi dòng dữ liệu hiện tại vào tempFile

mà không thay đổi.

• Sau khi duyệt hết tệp gốc:– Đóng inputFile và tempFile.

– Nếu không tìm thấy cuốn sách cần sửa, in ra thông báo và xóa temp.csv.– Xóa tệp gốc (filename) và đổi tên temp.csv thành tên tệp gốc.

– Nếu có lỗi xảy ra trong quá trình xóa hoặc đổi tên tệp, in ra thông báo lỗi.• Thông báo kết quả:In ra thông báo thành công nếu quá trình sửa đổi thành công.

2.5.7Hàm FindBookByID

Hàm FindBookByID được thiết kế để tìm kiếm và hiển thị thông tin của một cuốnsách trong tệp CSV dựa trên book_id Nó sử dụng các thao tác đọc file và xử lý chuỗi đểtruy cập và so sánh dữ liệu Nếu tìm thấy cuốn sách, nó in ra thông tin chi tiết của cuốnsách và trả về true; nếu không tìm thấy, nó in ra thông báo và trả về false.

Trang 25

• Mở tệp để đọc (ifstream file(filename)): Nếu không mở được tệp (!file.is_open()),in ra thông báo lỗi và trả về false.

• Vòng lặp while (getline(file, line))– Duyệt từng dòng trong tệp filename.

– Tạo stringstream ss(line) từ dòng hiện tại để phân tách các trường thông tin của

– Tạo một đối tượng Book (book) để lưu trữ thông tin từ dòng hiện tại.• Phân tách và lưu trữ thông tin từ dòng hiện tại:

– Sử dụng getline(ss, temp, ’,’) để đọc và chuyển đổi các giá trị từ stringstream

sang các thành phần của đối tượng book.

– safe_stoi(temp) được sử dụng để chuyển đổi chuỗi temp sang kiểu số nguyên

an toàn (int).

– Các trường thông tin của book bao gồm book_id, store_id, quantity, và status.• Kiểm tra book_id:

– So sánh book.book_id với book_id truyền vào.

– Nếu trùng khớp (book.book_id == book_id), in ra thông tin của sách và đóng

tệp (file.close()) sau đó trả về true.

• Đóng tệp và thông báo nếu không tìm thấy sách

– Nếu duyệt hết tệp mà không tìm thấy cuốn sách có book_id, đóng tệp (file.close())

và in ra thông báo không tìm thấy sách.

– Trả về false vì không tìm thấy sách có book_id trong tệp.

2.5.8Hàm FindBookByQuantity

Hàm FindBookByQuantity được thiết kế để tìm kiếm và hiển thị thông tin của cáccuốn sách có quantity nhất định từ tệp Book.csv Nó sử dụng vòng lặp để duyệt qua danhsách các sách và kiểm tra điều kiện tìm kiếm Nếu tìm thấy sách, nó in ra thông tin củasách đó; nếu không tìm thấy, nó in ra thông báo là không có sách nào thỏa mãn điều kiệntìm kiếm Cụ thể như sau:

• Đọc danh sách sách từ file CSV (vector<Book> books = ReadBookFromCSV(filename))

Sử dụng hàm ReadBookFromCSV để đọc danh sách sách từ file CSV và lưu vàovector books.

Trang 26

• Khởi tạo biến found để kiểm tra có tìm thấy sách hay không (bool found =false) Biến này được sử dụng để đánh dấu nếu có ít nhất một cuốn sách có quantity

như yêu cầu.

• Vòng lặp for (const auto& book : books) Duyệt qua từng phần tử (cuốn sách)trong vector books.

• Kiểm tra quantity của từng cuốn sách (if (book.quantity == quantity))So sánhquantity của cuốn sách hiện tại với quantity được truyền vào hàm.

• In ra thông tin của sách nếu tìm thấy

– Nếu tìm thấy cuốn sách có quantity như yêu cầu, in ra các thông tin của cuốn

sách bao gồm book_id, store_id, quantity, và status.

– Đánh dấu found = true để biết là đã tìm thấy ít nhất một cuốn sách.• Thông báo nếu không tìm thấy sách

– Sau khi kết thúc vòng lặp, kiểm tra biến found.

– Nếu found vẫn là false, in ra thông báo là không tìm thấy cuốn sách nào có

quantity như yêu cầu.

2.5.9Hàm FindBookByStoreID

Hàm FindBookByStoreID được thiết kế để tìm kiếm và hiển thị thông tin của cáccuốn sách có store_id nhất định từ tệp Book.csv Nó sử dụng vòng lặp để duyệt qua danhsách các sách và kiểm tra điều kiện tìm kiếm Nếu tìm thấy sách, nó in ra thông tin củasách đó; nếu không tìm thấy, nó in ra thông báo là không có sách nào thỏa mãn điều kiệntìm kiếm Cụ thể như sau:

• Đọc danh sách sách từ file CSV (vector<Book> books = ReadBookFromCSV(filename))

Sử dụng hàm ReadBookFromCSV để đọc danh sách sách từ file CSV và lưu vàovector books.

• Khởi tạo biến found để kiểm tra có tìm thấy sách hay không (bool found =false) Biến này được sử dụng để đánh dấu nếu có ít nhất một cuốn sách có quantity

như yêu cầu.

• Vòng lặp for (const auto& book : books) Duyệt qua từng phần tử (cuốn sách)trong vector books.

• Kiểm tra store_id của từng cuốn sách (i f (book.storeid == store_id)) So sánh

store_id của cuốn sách hiện tại với store_id được truyền vào hàm.

Trang 27

• In ra thông tin của sách nếu tìm thấy

– Nếu tìm thấy cuốn sách có store_id như yêu cầu, in ra các thông tin của cuốn

sách bao gồm book_id, store_id, quantity, và status.

– Đánh dấu found = true để biết là đã tìm thấy ít nhất một cuốn sách.• Thông báo nếu không tìm thấy sách

– Sau khi kết thúc vòng lặp, kiểm tra biến found.

– Nếu found vẫn là false, in ra thông báo là không tìm thấy cuốn sách nào có

quantity như yêu cầu.

2.5.10Hàm FindBookByStatus

Hàm FindBookByStatus cho phép người dùng tìm kiếm và hiển thị thông tin củacác cuốn sách dựa trên trạng thái (available hoặc borrowed) từ tệp book.csv Nó sử dụngvòng lặp để duyệt qua danh sách sách và kiểm tra điều kiện tìm kiếm Nếu tìm thấy sáchcó status như yêu cầu, nó sẽ in ra thông tin của sách đó; nếu không tìm thấy, nó sẽ thôngbáo là không có cuốn sách nào thỏa mãn điều kiện tìm kiếm Cụ thể như sau:

• Đọc danh sách sách từ file CSV (vector<Book> books = ReadBookFromCSV(filename))

Sử dụng hàm ReadBookFromCSV để đọc danh sách sách từ file CSV và lưu vàovector books.

• Khởi tạo biến found để kiểm tra có tìm thấy sách hay không (bool found =false) Biến này được sử dụng để đánh dấu nếu có ít nhất một cuốn sách có quantity

như yêu cầu.

• Vòng lặp for (const auto& book : books) Duyệt qua từng phần tử (cuốn sách)trong vector books.

• Chuyển đổi status của sách thành giá trị số (int bookStatus = (book.status== "available") ? 1 : 0) Biến bookStatus sẽ có giá trị 1 nếu sách có status là

"available", và là 0 nếu status là "borrowed".

• In ra thông tin của sách nếu tìm thấy

– Nếu bookStatus của sách bằng status truyền vào hàm, in ra các thông tin của

cuốn sách bao gồm book_id, store_id, quantity, và status.

– Đánh dấu found = true để biết là đã tìm thấy ít nhất một cuốn sách.• Thông báo nếu không tìm thấy sách

Trang 28

– Sau khi kết thúc vòng lặp, kiểm tra biến found.

– Nếu found vẫn là false, in ra thông báo là không tìm thấy cuốn sách nào có

quantity như yêu cầu.

Trang 29

CHƯƠNG III: KIỂM THỬ

Ngày đăng: 22/07/2024, 19:31