#include <iostream>
using namespace std;
#include <fstream>
#include <cstring>
#include "interface.h"
#include "reader.h"
//图书管理模块
//图书类函数实现
void book::setno(int n) {
no = n;
}
int book::getno() {
return no;
}
void book::setname(char na[]) {
strcpy_s(name, na);
}
char* book:: getname() {
return name;
}
void book::borbook() {
b_flag = 2; //借书标志
}
void book::delbook() {
b_del = 2; //删除标志
}
void book::addbook(int no, char na[]) {
setno(no);
setname(na);
b_flag = 1;
b_del = 1;
}
//图书数据库类
bdatabase::bdatabase() {
book b; //建立book类对象并b
top = -1; //数组下标从0开始,此处top值置为-1可保证从数组第一个元素开始存储信息
fstream file("book.txt", ios::in);//打开文件进行读操作,若文件不存在则出错.输入输出指:内存与硬盘间的信息传递
while (1) {
file.read((char*)&b, sizeof(b));//从文件中读取b个字符到char*指向的缓存中(book类对象b的地址)
if (!file) //若读取到文件尾EOF,返回非0值(一般为1),结束书本数量的计数,关闭文件
break;
top++;
btarray[top] = b;
}
file.close();
}
bdatabase::~bdatabase() {
fstream file("book.txt", ios::out);//输出:内存->硬盘
for (int i = 0; i <= top; i++) {
if (btarray[i].b_del == 1)
file.write((char*)&btarray[i], sizeof(btarray[i]));
}
file.close();
}
void bdatabase::addbooks() {
book bk; //创建book类对象bk
int no; //书号
char bname[20]; //书名 用数组存放
cout << "请输入书号:";
cin >> no;
cout << endl << "请输入书名:";
cin >> bname;
cout << endl;
bk.b_flag = 1;
bk.addbook(no, bname); //类中成员函数addbook(),设置书号与书名 修改标志
top++;
btarray[top] = bk;
return; //返回上个操作界面
}
int bdatabase::findbooks(int suffix) {
int no;
cout << "请输入书号:";
cin >> no;
for (int i = 0; i <= top; i++) {
if (btarray[i].no == no && btarray[i].b_del == 1) {
return i;
}
}
return -1;
}
int bdatabase::findbooks() {
int no;
char value[6];
cout << "请输入书号:";
cin >> no;
for (int i = 0; i <= top; i++) {
if (btarray[i].no == no && btarray[i].b_del == 1) {
if (btarray[i].b_flag == 1)
strcpy_s(value, "在架");
if (btarray[i].b_flag == 2)
strcpy_s(value, "借出");
cout << "书号:" << btarray[i].no << " " << "书名:" << btarray[i].name << " " << "图书状态:" << value << endl;
return i;
}
}
return -1;
}
void bdatabase::editbooks() {
int cur;
cur = findbooks();
if (cur == 1) {
cout << "该书不存在" << endl;
return;
}
cout << "当前图书信息--" << "书号:" << btarray[cur].no << " " << "书名:" << btarray[cur].name << endl;
cout << endl;
cout << "请继续操作以修改图书信息" << endl;
cout << endl << "书名:";
cin >> btarray[cur].name;
return;
}
void bdatabase::delbooks() {
int cur;
cur = findbooks();
if (cur == 1) {
return;
}
if (btarray[cur].b_flag == 2) { //删除时判断图书是否借出
cout << "该图书已经借出,请归还后删除!" << endl;
return;
}
btarray[cur].b_del = 2;
return;
}
void bdatabase::listbooks() {
char value[6];
for (int i = 0; i <= top; i++) {
if (btarray[i].b_del == 1) {
if (btarray[i].b_flag == 1)
strcpy_s(value, "在架");
if (btarray[i].b_flag == 2)
strcpy_s(value, "借出");
cout << "书号:" << btarray[i].no << "书名:" << btarray[i].name << "图书状态:" << value << endl;
}
}
return;
}
void borrow_or_return(char br) { //借书、还书函数,参数br:判断 “借书”,“还书”. 1 借书 2 还书
int reader_ID = 0; //读者id
int book_ID = 0; //书的id
int rsuffix, bsuffix;
bdatabase t_bd;
rdatabase t_rd;
if (br == '1') { //借书
rsuffix = t_rd.findreaders(reader_ID);
bsuffix = t_bd.findbooks(book_ID);
if (rsuffix == -1 || bsuffix == -1)
return;
if (t_bd.btarray[bsuffix].b_flag == 2) {
cout << "图书已经借出,请选择其它图书" << endl;
return;
}
t_bd.btarray[bsuffix].b_flag = 2;
t_rd.rdarray[rsuffix].r_bor = 1;
t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
return;
}
if (br == '2') {
rsuffix = t_rd.findreaders(reader_ID);
bsuffix = t_bd.findbooks(book_ID);
if (rsuffix == -1 || bsuffix == -1)
return;
if (t_rd.rdarray[rsuffix].brbook.no == t_bd.btarray[bsuffix].no) {
t_bd.btarray[bsuffix].b_flag = 1;
t_rd.rdarray[rsuffix].r_bor = 2;
t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
}
else {
cout << "请重新输入,读者借阅图书书号错误" << endl;
return;
}
return;
}
}
void booksmanage() {
char in;
bdatabase bd;
do {
system("pause");
system("cls");//切换UI时,刷新缓冲区当前内容,完成下次更新
UI();
Book_Maintenance_Interface();
cin >> in;
switch (in) {
case'1':
bd.addbooks();
break;
case'2':
bd.editbooks();
break;
case'3':
bd.delbooks();
break;
case'4':
bd.findbooks();
break;
case'5':
bd.listbooks();
break;
case'6':
break;
default:
cout << "In Put Error!!! Please try again!!!" << endl;
}
} while (in != '6');
return;
}
1124905257887411C++图书管理系统.zip
需积分: 0 108 浏览量
更新于2024-05-11
收藏 7KB ZIP 举报
《C++图书管理系统》是一个基于C++编程语言开发的软件应用,主要用于图书馆的日常管理,如书籍信息的录入、查询、借阅与归还等操作。这个系统的设计和实现涉及了C++的基础语法、面向对象编程(OOP)概念、文件操作以及可能的数据结构和算法。下面将详细探讨这些知识点:
1. **C++基础语法**:C++是C语言的扩展,具有丰富的语法结构。在图书管理系统中,会用到变量定义、条件语句(if-else)、循环语句(for, while)、函数定义等基本元素,以便处理数据和控制程序流程。
2. **面向对象编程(OOP)**:C++支持面向对象编程,通过类(Class)和对象(Object)来封装数据和行为。在图书管理系统中,可以定义如“书籍类”、“读者类”等,包含各自的属性(如书名、作者、ISBN号,读者姓名、借书证号)和方法(如借书、还书)。
3. **文件操作**:系统需要持久化存储图书和读者信息,这就需要用到C++的文件流(fstream)库。文件操作包括读取已有的书籍和读者信息,以及写入新的交易记录。
4. **数据结构**:为了高效地管理和检索信息,系统可能使用各种数据结构,如数组、链表、哈希表或二叉树。例如,书籍信息可以存储在一个动态数组中,根据书名或作者进行快速查找可能需要哈希表。
5. **字符串处理**:图书管理系统会涉及到大量的文本操作,比如比较书名、处理作者名等,这需要熟悉C++的字符串类(std::string)及其成员函数。
6. **异常处理**:为了提高程序的健壮性,需要对可能出现的错误情况进行处理,如文件不存在、内存不足等,这时会用到try-catch块进行异常处理。
7. **输入/输出流(I/O流)**:用户交互是系统的重要部分,通过标准输入输出(cin, cout)或其他I/O流,系统可以接收用户的命令,显示反馈信息。
8. **设计模式**:如果系统较为复杂,可能会应用一些设计模式,如工厂模式用于创建对象,单例模式确保类只有一个实例,策略模式用于定义一组可互换的算法。
9. **编译与链接**:理解C++的编译过程(预处理、编译、汇编、链接)对于调试和优化代码至关重要。
10. **测试与调试**:为确保系统的正确运行,需要进行单元测试、集成测试和性能测试,并使用调试工具(如GDB)定位并修复问题。
以上是《C++图书管理系统》项目中涉及的主要知识点,每个点都值得深入学习和实践。通过这个项目,开发者不仅可以巩固C++的基础,还能提升面向对象编程和实际软件开发的能力。
莫圈渔
- 粉丝: 0
- 资源: 1
最新资源
- python入门-17.最大子段和-团结!.py
- python入门-test-18.车厢重组.py
- 第56课 枚举2-20241227131043.pdf
- 基于 Flask 和 React 的前后端分离论坛全部资料+详细文档.zip
- 基于 Flask 和 WebSocket 实现的聊天室程序全部资料+详细文档.zip
- 基于 Scrapy 的新闻智能分类微信小程序,目的是打造出一个可以对新闻进行智能分类的微信小程序。技术栈:Python + Scrapy + MongoDB +
- 基于Flask 与Material Design的博客全部资料+详细文档.zip
- 基于bert4keras的命名实体识别flask展示全部资料+详细文档.zip
- 基于bert4keras关系抽取的flask展示全部资料+详细文档.zip
- 基于flask+MySQL的日程管理系统全部资料+详细文档.zip
- 基于Flask、MySQL和Bootstrap开发的图片分享社交网站。全部资料+详细文档.zip
- 基于Flask+Python3.6的电影网站项目全部资料+详细文档.zip
- 基于flask的web端三维模型重建系统-毕业设计全部资料+详细文档.zip
- 基于Flask的自然语言处理Web应用:人物观点提取,文本摘要,点评情感分类全部资料+详细文档.zip
- 基于Flask构建的无人机物流管理系统全部资料+详细文档.zip
- 基于flask框架的轻量级新闻资讯网站全部资料+详细文档.zip