此题和接下来的几道题要求你设计并实现一个Book类,你可以设想这是图书馆软件系统的一部分。Book类应包含表示ISBN号、书名、作者和版权日期以及表示是否已经借出的成员。创建能返回这些成员的值的函数,以及借书和还书的函数。对于输人Book对象的数据进行简单的有效性检查,例如,只接受n-n-n-x形式的ISBN号,其中n是一个整数,x是一个数字或一个字母。 为Book类添加运算符。添加==运算符,用于检查两本书的 ISBN 号是否相等。定义!=运算符,比较ISBN号是否不等。定义<<,分行输出书名、作者和ISBN号。 为Book类创建一个名为Genre的枚举类型,用以区分书籍的类型:小说(fiction)、非小说类文学作品(nonfiction)、期刊(periodical)、传记(biography)、儿童读物(children)。为每本书赋予一个Genre值,适当修改Book的构造函数和成员函数。要在测试文件图书的录入操作由用户可以手动添加,多文件程序,按文件给出代码

时间: 2024-02-13 14:01:20 浏览: 20
以下是一个示例代码,实现了题目要求的Book类及其相关功能,包括输入输出、借书还书、ISBN号的有效性检查、运算符重载等。请注意,在实际项目中,可能需要根据具体需求做出适当修改。 Book.h文件: ```cpp #ifndef BOOK_H #define BOOK_H #include <string> class Book { public: enum Genre { fiction, nonfiction, periodical, biography, children }; Book(const std::string& isbn, const std::string& title, const std::string& author, const std::string& copyright); std::string getISBN() const; std::string getTitle() const; std::string getAuthor() const; std::string getCopyRight() const; bool isBorrowed() const; void borrow(); void returnBook(); friend bool operator==(const Book& lhs, const Book& rhs); friend bool operator!=(const Book& lhs, const Book& rhs); friend std::ostream& operator<<(std::ostream& os, const Book& book); private: std::string isbn; std::string title; std::string author; std::string copyRight; bool borrowed; Genre genre; }; #endif // !BOOK_H ``` Book.cpp文件: ```cpp #include "Book.h" #include <iostream> Book::Book(const std::string& isbn, const std::string& title, const std::string& author, const std::string& copyRight) :isbn(isbn), title(title), author(author), copyRight(copyRight), borrowed(false), genre(fiction) { // 检查ISBN号是否有效 if (isbn.size() != 13 || isbn[1] != '-' || isbn[5] != '-' || isbn[9] != '-') { throw std::invalid_argument("Invalid ISBN format"); } for (int i = 0; i < 13; i++) { if (i == 1 || i == 5 || i == 9) { continue; } if (!isdigit(isbn[i])) { throw std::invalid_argument("Invalid ISBN format"); } } } std::string Book::getISBN() const { return isbn; } std::string Book::getTitle() const { return title; } std::string Book::getAuthor() const { return author; } std::string Book::getCopyRight() const { return copyRight; } bool Book::isBorrowed() const { return borrowed; } void Book::borrow() { if (borrowed) { throw std::runtime_error("The book has been borrowed"); } borrowed = true; } void Book::returnBook() { if (!borrowed) { throw std::runtime_error("The book has not been borrowed"); } borrowed = false; } bool operator==(const Book& lhs, const Book& rhs) { return lhs.isbn == rhs.isbn; } bool operator!=(const Book& lhs, const Book& rhs) { return !(lhs == rhs); } std::ostream& operator<<(std::ostream& os, const Book& book) { os << "Title: " << book.title << std::endl; os << "Author: " << book.author << std::endl; os << "ISBN: " << book.isbn; return os; } ``` Test.cpp文件: ```cpp #include "Book.h" #include <iostream> #include <vector> #include <algorithm> #include <fstream> void addBook(std::vector<Book>& books); void borrowBook(std::vector<Book>& books); void returnBook(std::vector<Book>& books); void showBooks(const std::vector<Book>& books); int main() { std::vector<Book> books; std::cout << "Welcome to the library system" << std::endl; while (true) { std::cout << "Menu:" << std::endl; std::cout << "1. Add a book" << std::endl; std::cout << "2. Borrow a book" << std::endl; std::cout << "3. Return a book" << std::endl; std::cout << "4. Show all books" << std::endl; std::cout << "5. Exit" << std::endl; int choice; std::cin >> choice; switch (choice) { case 1: addBook(books); break; case 2: borrowBook(books); break; case 3: returnBook(books); break; case 4: showBooks(books); break; case 5: std::cout << "Goodbye" << std::endl; return 0; default: std::cout << "Invalid choice" << std::endl; break; } } } void addBook(std::vector<Book>& books) { std::cout << "Please enter the ISBN:"; std::string isbn; std::cin >> isbn; std::cout << "Please enter the title:"; std::string title; std::cin.ignore(); std::getline(std::cin, title); std::cout << "Please enter the author:"; std::string author; std::getline(std::cin, author); std::cout << "Please enter the copyright:"; std::string copyRight; std::getline(std::cin, copyRight); try { books.emplace_back(isbn, title, author, copyRight); std::cout << "The book has been added successfully" << std::endl; } catch (const std::exception& e) { std::cout << e.what() << std::endl; } } void borrowBook(std::vector<Book>& books) { std::cout << "Please enter the ISBN of the book to borrow:"; std::string isbn; std::cin >> isbn; auto it = std::find_if(books.begin(), books.end(), [isbn](const Book& book) {return book.getISBN() == isbn; }); if (it == books.end()) { std::cout << "The book is not found" << std::endl; return; } try { it->borrow(); std::cout << "The book has been borrowed successfully" << std::endl; } catch (const std::exception& e) { std::cout << e.what() << std::endl; } } void returnBook(std::vector<Book>& books) { std::cout << "Please enter the ISBN of the book to return:"; std::string isbn; std::cin >> isbn; auto it = std::find_if(books.begin(), books.end(), [isbn](const Book& book) {return book.getISBN() == isbn; }); if (it == books.end()) { std::cout << "The book is not found" << std::endl; return; } try { it->returnBook(); std::cout << "The book has been returned successfully" << std::endl; } catch (const std::exception& e) { std::cout << e.what() << std::endl; } } void showBooks(const std::vector<Book>& books) { if (books.empty()) { std::cout << "There is no book" << std::endl; return; } for (const auto& book : books) { std::cout << book << std::endl; } } ``` 在该实现中,可以通过菜单选择添加、借书、还书和显示所有书籍的功能。具体实现中,借阅和归还书籍时需要检查书籍是否已经被借出或归还,以及书籍是否存在。在输入ISBN号时,需要按照格式n-n-n-x输入。在输出书籍信息时,不同的书籍类型可以通过枚举类型Genre来区分。在测试程序中,可以通过手动输入添加书籍,也可以通过从文件中读取书籍信息进行添加。

相关推荐

zip
卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

最新推荐

recommend-type

定义一个Book类,实现简单操作实验报告

定义一个Book类,在该类定义中包括: 类与对象实现书类的简单操作 (1)数据成员:bookname(书名)、price(价格)、number(存书数量)。 (2)成员函数:display()显示图书的情况;borrow()将存书数量减1,并显示当前存书量...
recommend-type

基于springboot开发的前后端分离的简易进销存后台管理系统.zip

基于springboot的java毕业&课程设计
recommend-type

基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统.zip

基于springboot的java毕业&课程设计
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这