创建一个 Library类,包含一个 Book向量和一个Patron向量。定义一个名为Transaction 的 struet,包含一个Book对象、一个Patron对象和一个本章中定义的Date对象,表示借阅记录。在 Library 类中定义一个Transaction向量。定义向图书馆添加图书、添加读者以及借出书籍的函数。当一个读者借出一本书时,保证Library对象中有此读者和这本书的记录,否则报告错误。然后检查读者是否欠费,如果欠费就报告一个错误,否则创建一个Transaction对象,将其放人Transaction向量中。定义一个返回包含所有欠费读者姓名的向量的函数。多文件程序,按文件给出代码,测试文件用户手动录入信息的操作,用户可以手动添加信息
时间: 2024-02-13 07:03:15 浏览: 14
这是一个多文件程序,需要分别创建 Library.h,Library.cpp,Transaction.h,Transaction.cpp,Book.h,Book.cpp,Patron.h 和 Patron.cpp 这些文件。
首先是 Book.h 文件:
```c++
#pragma once
#include <string>
class Book {
private:
std::string title;
std::string author;
std::string isbn;
bool checkedOut;
public:
Book(std::string title, std::string author, std::string isbn);
std::string getTitle();
std::string getAuthor();
std::string getISBN();
bool isCheckedOut();
void checkOut();
void checkIn();
};
```
然后是 Book.cpp 文件:
```c++
#include "Book.h"
Book::Book(std::string title, std::string author, std::string isbn) {
this->title = title;
this->author = author;
this->isbn = isbn;
checkedOut = false;
}
std::string Book::getTitle() {
return title;
}
std::string Book::getAuthor() {
return author;
}
std::string Book::getISBN() {
return isbn;
}
bool Book::isCheckedOut() {
return checkedOut;
}
void Book::checkOut() {
checkedOut = true;
}
void Book::checkIn() {
checkedOut = false;
}
```
接下来是 Patron.h 文件:
```c++
#pragma once
#include <string>
class Patron {
private:
std::string name;
double fees;
public:
Patron(std::string name);
std::string getName();
double getFees();
void addFee(double fee);
void payFees(double payment);
};
```
然后是 Patron.cpp 文件:
```c++
#include "Patron.h"
Patron::Patron(std::string name) {
this->name = name;
fees = 0.0;
}
std::string Patron::getName() {
return name;
}
double Patron::getFees() {
return fees;
}
void Patron::addFee(double fee) {
fees += fee;
}
void Patron::payFees(double payment) {
fees -= payment;
}
```
接下来是 Transaction.h 文件:
```c++
#pragma once
#include "Book.h"
#include "Patron.h"
#include "Date.h"
struct Transaction {
Book book;
Patron patron;
Date date;
};
```
然后是 Transaction.cpp 文件:
```c++
#include "Transaction.h"
// 空文件,不需要实现
```
接下来是 Library.h 文件:
```c++
#pragma once
#include <vector>
#include "Book.h"
#include "Patron.h"
#include "Transaction.h"
class Library {
private:
std::vector<Book> books;
std::vector<Patron> patrons;
std::vector<Transaction> transactions;
public:
void addBook(Book book);
void addPatron(Patron patron);
void checkOutBook(Book book, Patron patron, Date date);
std::vector<std::string> getOutstandingFees();
};
```
然后是 Library.cpp 文件:
```c++
#include "Library.h"
#include <algorithm>
void Library::addBook(Book book) {
books.push_back(book);
}
void Library::addPatron(Patron patron) {
patrons.push_back(patron);
}
void Library::checkOutBook(Book book, Patron patron, Date date) {
auto bookIter = std::find(books.begin(), books.end(), book);
auto patronIter = std::find(patrons.begin(), patrons.end(), patron);
if (bookIter == books.end() || patronIter == patrons.end()) {
throw std::runtime_error("Book or patron not found in library");
}
if (patron.getFees() > 0.0) {
throw std::runtime_error("Patron has outstanding fees");
}
book.checkOut();
transactions.push_back({book, patron, date});
}
std::vector<std::string> Library::getOutstandingFees() {
std::vector<std::string> names;
for (auto patron : patrons) {
if (patron.getFees() > 0.0) {
names.push_back(patron.getName());
}
}
return names;
}
```
最后是 Date.h 文件:
```c++
#pragma once
class Date {
private:
int day;
int month;
int year;
public:
Date(int day, int month, int year);
};
```
然后是 Date.cpp 文件:
```c++
#include "Date.h"
Date::Date(int day, int month, int year) {
this->day = day;
this->month = month;
this->year = year;
}
```
这些文件都是需要编译的,然后在测试文件中包含 Library.h,Date.h,Book.h 和 Patron.h 即可使用 Library 类。
下面是一个示例的测试文件:
```c++
#include "Library.h"
#include <iostream>
int main() {
Library library;
Book book1("The Great Gatsby", "F. Scott Fitzgerald", "978-3-16-148410-0");
Book book2("To Kill a Mockingbird", "Harper Lee", "978-3-16-148410-1");
Book book3("1984", "George Orwell", "978-3-16-148410-2");
Patron patron1("John Smith");
Patron patron2("Jane Doe");
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.addPatron(patron1);
library.addPatron(patron2);
try {
library.checkOutBook(book1, patron1, Date(1, 1, 2022));
std::cout << "Book checked out successfully" << std::endl;
} catch (std::runtime_error& e) {
std::cout << e.what() << std::endl;
}
try {
library.checkOutBook(book3, patron2, Date(1, 1, 2022));
std::cout << "Book checked out successfully" << std::endl;
} catch (std::runtime_error& e) {
std::cout << e.what() << std::endl;
}
try {
library.checkOutBook(book2, patron1, Date(1, 1, 2022));
std::cout << "Book checked out successfully" << std::endl;
} catch (std::runtime_error& e) {
std::cout << e.what() << std::endl;
}
std::vector<std::string> fees = library.getOutstandingFees();
if (fees.size() == 0) {
std::cout << "No outstanding fees" << std::endl;
} else {
std::cout << "Outstanding fees:" << std::endl;
for (auto name : fees) {
std::cout << "- " << name << std::endl;
}
}
return 0;
}
```
这个测试文件会将三本书和两个读者添加到图书馆中,然后尝试借阅这些书。如果读者有未支付的费用,就无法借阅书籍。最后输出所有有未支付费用的读者的姓名。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)