C++ 项目实践课设 图书馆管理系统

一、项目介绍

(1)图书管理
(a)添加图书:在系统中增加图书信息(可自己设计图书的信息:如书号,书名,出版社,等等)
(b)查询图书
(c)编辑图书
(d)删除图书

(2)读者管理
(a)读者注册:在系统中增加读者信息(可自己设计读者信息:如读者姓名、读者性别,联系方式等)
(b)查询读者
(c)编辑读者
(d)删除读者

(3)借阅管理
当输入图书编号,读者编号之后,能对图书馆中现有的图书进行借阅。

(4)还书管理
当输入读者编号和要归还的图书编号,读者能进行还书。

利用文件保存

二、总体代码实现

#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#include <string>
// for std::setw and std::setfillusing namespace std;// 图书类与读者类的声明
class Book;
class Reader;// 管理图书馆的类
class Library {
private:vector<Book> books;vector<Reader> readers;public:// 构造器Library();// 图书操作void addBook();void searchBook();void editBook();void deleteBook();// 读者操作void addReader();void searchReader();void editReader();void deleteReader();// 借阅与归还操作void borrowBook();void returnBook();// 文件操作void saveData();void loadData();
};// 代表图书的类
class Book {
private:int book_id;string title;string publisher;public:// 构造器Book(int id, const string& t, const string& pub) : book_id(id), title(t), publisher(pub) {}// get方法int getBookId() const { return book_id; }string getTitle() const { return title; }string getPublisher() const { return publisher; }// set方法void setTitle(const string& t) { title = t; }void setPublisher(const string& pub) { publisher = pub; }// 方法来显示读取构造器详细信息void display() const {cout << "图书书号: " << setw(5) << setfill('0') << book_id << " | 图书书名: " << title << " | 图书出版社: " << publisher << endl;}
};// 代表读者的类
class Reader {
private:int reader_id;string name;char gender;string contact;public:// 构造器Reader(int id, const string& n, char g, const string& con) : reader_id(id), name(n), gender(g), contact(con) {}// get方法int getReaderId() const { return reader_id; }string getName() const { return name; }char getGender() const { return gender; }string getContact() const { return contact; }// set方法void setName(const string& n) { name = n; }void setGender(char g) { gender = g; }void setContact(const string& con) { contact = con; }// 方法来显示读取构造器详细信息void display() const {cout << "读者编号: " << setw(5) << setfill('0') << reader_id << " | 读者姓名: " << name << " | 读者性别: " << gender << " | 读者联系方式: " << contact << endl;}
};// 类方法的实现Library::Library() {// 创建库对象时从文件加载数据loadData();
}void Library::addBook() {int id;string title, publisher;cout << "请输入图书书号: ";cin >> id;cin.ignore(); // 从缓冲区中清除换行符cout << "请输入图书书名: ";getline(cin, title);cout << "请输入图书出版社: ";getline(cin, publisher);books.push_back(Book(id, title, publisher));cout << "图书添加成功。\n";saveData(); // 添加成功后保存数据
}void Library::searchBook() {int search_id;cout << "请输入要搜索的图书书号: ";cin >> search_id;bool found = false;for (const auto& book : books) {if (book.getBookId() == search_id) {book.display();found = true;break;}}if (!found) {cout << "没有找到该图书: " << search_id << endl;}
}void Library::editBook() {int edit_id;cout << "请输入要编辑的图书书号: ";cin >> edit_id;for (auto& book : books) {if (book.getBookId() == edit_id) {string new_title, new_publisher;cout << "请输入新的书名(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_title);if (!new_title.empty()) {book.setTitle(new_title);}cout << "情输入新的出版社 (输入以保持当前状态): ";getline(cin, new_publisher);if (!new_publisher.empty()) {book.setPublisher(new_publisher);}cout << "图书详细信息更新成功。\n";saveData(); // 更新后保存数据return;}}cout << "没有找到该图书: " << edit_id << endl;
}void Library::deleteBook() {int delete_id;cout << "请输入要删除的图书书号: ";cin >> delete_id;auto it = books.begin();while (it != books.end()) {if (it->getBookId() == delete_id) {it = books.erase(it);cout << "图书删除成功。\n";saveData(); // 删除后保存数据return;}else {++it;}}cout << "没有找到该图书: " << delete_id << endl;
}void Library::addReader() {int id;string name, contact;char gender;cout << "请输入读者编号: ";cin >> id;cin.ignore(); // 从缓冲区中清除换行符cout << "请输入读者姓名: ";getline(cin, name);cout << "请输入读者性别(M/F): ";cin >> gender;cout << "请输入读者联系方式: ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, contact);readers.push_back(Reader(id, name, gender, contact));cout << "读者添加成功。\n";saveData(); // 添加成功后保存数据
}void Library::searchReader() {int search_id;cout << "请输入要查询的读者编号: ";cin >> search_id;bool found = false;for (const auto& reader : readers) {if (reader.getReaderId() == search_id) {reader.display();found = true;break;}}if (!found) {cout << "没有找到该读者: " << search_id << endl;}
}void Library::editReader() {int edit_id;cout << "请输入要编辑的读者编号: ";cin >> edit_id;for (auto& reader : readers) {if (reader.getReaderId() == edit_id) {string new_name, new_contact;char new_gender;cout << "请输入新的姓名(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_name);if (!new_name.empty()) {reader.setName(new_name);}cout << "请输入新的性别 (M/F) (输入以保持当前状态): ";cin >> new_gender;if (new_gender == 'M' || new_gender == 'F') {reader.setGender(new_gender);}cout << "请输入新的联系方式(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_contact);if (!new_contact.empty()) {reader.setContact(new_contact);}cout << "读者详细信息更新完成。\n";saveData(); // 更新后保存数据return;}}cout << "没有找到该读者: " << edit_id << endl;
}void Library::deleteReader() {int delete_id;cout << "请输入要删除的读者编号: ";cin >> delete_id;auto it = readers.begin();while (it != readers.end()) {if (it->getReaderId() == delete_id) {it = readers.erase(it);cout << "读者删除成功。\n";saveData(); // 删除后保存数据return;}else {++it;}}cout << "没有找到该读者: " << delete_id << endl;
}void Library::borrowBook() {int book_id, reader_id;cout << "请输入要借阅图书的图书编号: ";cin >> book_id;cout << "请输入要借阅图书的读者编号: ";cin >> reader_id;// 借用逻辑的占位符实现cout << "图书借阅成功。\n";
}void Library::returnBook() {int book_id, reader_id;cout << "请输入要归还图书的图书编号: ";cin >> book_id;cout << "请输入要归还图书的读者编号: ";cin >> reader_id;// 借用逻辑的占位符实现cout << "图书归还成功。\n";
}void Library::saveData() {ofstream bookFile("books.txt");if (!bookFile.is_open()) {cerr << "无法打开books.txt进行写入。\n";return;}for (const auto& book : books) {bookFile << book.getBookId() << ',' << book.getTitle() << ',' << book.getPublisher() << '\n';}bookFile.close();ofstream readerFile("readers.txt");if (!readerFile.is_open()) {cerr << "无法打开readers.txt进行写入。\n";return;}for (const auto& reader : readers) {readerFile << reader.getReaderId() << ',' << reader.getName() << ',' << reader.getGender() << ',' << reader.getContact() << '\n';}readerFile.close();cout << "数据保存成功。\n";
}void Library::loadData() {ifstream bookFile("books.txt");if (!bookFile.is_open()) {cerr << "无法打开books.txt进行阅读。\n";return;}int id;string title, publisher;while (bookFile >> id) {bookFile.ignore(); // Ignore the commagetline(bookFile, title, ',');getline(bookFile, publisher);books.push_back(Book(id, title, publisher));}bookFile.close();ifstream readerFile("readers.txt");if (!readerFile.is_open()) {cerr << "无法打开readers.txt进行阅读。\n";return;}char gender;string name, contact;while (readerFile >> id) {readerFile.ignore(); // 忽略逗号getline(readerFile, name, ',');readerFile >> gender;readerFile.ignore(); // 忽略逗号getline(readerFile, contact);readers.push_back(Reader(id, name, gender, contact));}readerFile.close();cout << "数据加载成功。\n";
}// 主界面(驱动程序的主要功能)
int main() {Library library;int choice;do {cout << "\n图书管理系统\n";cout << "1. 添加图书\n";cout << "2. 查询图书\n";cout << "3. 编辑图书\n";cout << "4. 删除图书\n";cout << "5. 读者注册\n";cout << "6. 查询读者\n";cout << "7. 编辑读者\n";cout << "8. 删除读者\n";cout << "9. 借阅图书\n";cout << "10.归还图书\n";cout << "0. 退出程序\n";cout << "请输入您的选择: ";cin >> choice;switch (choice) {case 1:library.addBook();break;case 2:library.searchBook();break;case 3:library.editBook();break;case 4:library.deleteBook();break;case 5:library.addReader();break;case 6:library.searchReader();break;case 7:library.editReader();break;case 8:library.deleteReader();break;case 9:library.borrowBook();break;case 10:library.returnBook();break;case 0:cout << "退出程序\n";break;default:cout << "无效选择。请再次输入。\n";}} while (choice != 0);return 0;
}

三、分布介绍

1.主页面展示

通过简单的可视化界面展示

// 主界面(驱动程序的主要功能)
int main() {Library library;int choice;do {cout << "\n图书管理系统\n";cout << "1. 添加图书\n";cout << "2. 查询图书\n";cout << "3. 编辑图书\n";cout << "4. 删除图书\n";cout << "5. 读者注册\n";cout << "6. 查询读者\n";cout << "7. 编辑读者\n";cout << "8. 删除读者\n";cout << "9. 借阅图书\n";cout << "10.归还图书\n";cout << "0. 退出程序\n";cout << "请输入您的选择: ";cin >> choice;switch (choice) {case 1:library.addBook();break;case 2:library.searchBook();break;case 3:library.editBook();break;case 4:library.deleteBook();break;case 5:library.addReader();break;case 6:library.searchReader();break;case 7:library.editReader();break;case 8:library.deleteReader();break;case 9:library.borrowBook();break;case 10:library.returnBook();break;case 0:cout << "退出程序\n";break;default:cout << "无效选择。请再次输入。\n";}} while (choice != 0);return 0;
}

2.代表图书和读者的类

// 图书类与读者类的声明
class Book;
class Reader;// 管理图书馆的类
class Library {
private:vector<Book> books;vector<Reader> readers;public:// 构造器Library();// 图书操作void addBook();void searchBook();void editBook();void deleteBook();// 读者操作void addReader();void searchReader();void editReader();void deleteReader();// 借阅与归还操作void borrowBook();void returnBook();// 文件操作void saveData();void loadData();
};// 代表图书的类
class Book {
private:int book_id;string title;string publisher;public:// 构造器Book(int id, const string& t, const string& pub) : book_id(id), title(t), publisher(pub) {}// get方法int getBookId() const { return book_id; }string getTitle() const { return title; }string getPublisher() const { return publisher; }// set方法void setTitle(const string& t) { title = t; }void setPublisher(const string& pub) { publisher = pub; }// 方法来显示读取构造器详细信息void display() const {cout << "图书书号: " << setw(5) << setfill('0') << book_id << " | 图书书名: " << title << " | 图书出版社: " << publisher << endl;}
};// 代表读者的类
class Reader {
private:int reader_id;string name;char gender;string contact;public:// 构造器Reader(int id, const string& n, char g, const string& con) : reader_id(id), name(n), gender(g), contact(con) {}// get方法int getReaderId() const { return reader_id; }string getName() const { return name; }char getGender() const { return gender; }string getContact() const { return contact; }// set方法void setName(const string& n) { name = n; }void setGender(char g) { gender = g; }void setContact(const string& con) { contact = con; }// 方法来显示读取构造器详细信息void display() const {cout << "读者编号: " << setw(5) << setfill('0') << reader_id << " | 读者姓名: " << name << " | 读者性别: " << gender << " | 读者联系方式: " << contact << endl;}
};

3.相关类方法的实现

// 类方法的实现Library::Library() {// 创建库对象时从文件加载数据loadData();
}void Library::addBook() {int id;string title, publisher;cout << "请输入图书书号: ";cin >> id;cin.ignore(); // 从缓冲区中清除换行符cout << "请输入图书书名: ";getline(cin, title);cout << "请输入图书出版社: ";getline(cin, publisher);books.push_back(Book(id, title, publisher));cout << "图书添加成功。\n";saveData(); // 添加成功后保存数据
}void Library::searchBook() {int search_id;cout << "请输入要搜索的图书书号: ";cin >> search_id;bool found = false;for (const auto& book : books) {if (book.getBookId() == search_id) {book.display();found = true;break;}}if (!found) {cout << "没有找到该图书: " << search_id << endl;}
}void Library::editBook() {int edit_id;cout << "请输入要编辑的图书书号: ";cin >> edit_id;for (auto& book : books) {if (book.getBookId() == edit_id) {string new_title, new_publisher;cout << "请输入新的书名(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_title);if (!new_title.empty()) {book.setTitle(new_title);}cout << "情输入新的出版社 (输入以保持当前状态): ";getline(cin, new_publisher);if (!new_publisher.empty()) {book.setPublisher(new_publisher);}cout << "图书详细信息更新成功。\n";saveData(); // 更新后保存数据return;}}cout << "没有找到该图书: " << edit_id << endl;
}void Library::deleteBook() {int delete_id;cout << "请输入要删除的图书书号: ";cin >> delete_id;auto it = books.begin();while (it != books.end()) {if (it->getBookId() == delete_id) {it = books.erase(it);cout << "图书删除成功。\n";saveData(); // 删除后保存数据return;}else {++it;}}cout << "没有找到该图书: " << delete_id << endl;
}void Library::addReader() {int id;string name, contact;char gender;cout << "请输入读者编号: ";cin >> id;cin.ignore(); // 从缓冲区中清除换行符cout << "请输入读者姓名: ";getline(cin, name);cout << "请输入读者性别(M/F): ";cin >> gender;cout << "请输入读者联系方式: ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, contact);readers.push_back(Reader(id, name, gender, contact));cout << "读者添加成功。\n";saveData(); // 添加成功后保存数据
}void Library::searchReader() {int search_id;cout << "请输入要查询的读者编号: ";cin >> search_id;bool found = false;for (const auto& reader : readers) {if (reader.getReaderId() == search_id) {reader.display();found = true;break;}}if (!found) {cout << "没有找到该读者: " << search_id << endl;}
}void Library::editReader() {int edit_id;cout << "请输入要编辑的读者编号: ";cin >> edit_id;for (auto& reader : readers) {if (reader.getReaderId() == edit_id) {string new_name, new_contact;char new_gender;cout << "请输入新的姓名(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_name);if (!new_name.empty()) {reader.setName(new_name);}cout << "请输入新的性别 (M/F) (输入以保持当前状态): ";cin >> new_gender;if (new_gender == 'M' || new_gender == 'F') {reader.setGender(new_gender);}cout << "请输入新的联系方式(输入以保持当前状态): ";cin.ignore(); // 从缓冲区中清除换行符getline(cin, new_contact);if (!new_contact.empty()) {reader.setContact(new_contact);}cout << "读者详细信息更新完成。\n";saveData(); // 更新后保存数据return;}}cout << "没有找到该读者: " << edit_id << endl;
}void Library::deleteReader() {int delete_id;cout << "请输入要删除的读者编号: ";cin >> delete_id;auto it = readers.begin();while (it != readers.end()) {if (it->getReaderId() == delete_id) {it = readers.erase(it);cout << "读者删除成功。\n";saveData(); // 删除后保存数据return;}else {++it;}}cout << "没有找到该读者: " << delete_id << endl;
}void Library::borrowBook() {int book_id, reader_id;cout << "请输入要借阅图书的图书编号: ";cin >> book_id;cout << "请输入要借阅图书的读者编号: ";cin >> reader_id;// 借用逻辑的占位符实现cout << "图书借阅成功。\n";
}void Library::returnBook() {int book_id, reader_id;cout << "请输入要归还图书的图书编号: ";cin >> book_id;cout << "请输入要归还图书的读者编号: ";cin >> reader_id;// 借用逻辑的占位符实现cout << "图书归还成功。\n";
}void Library::saveData() {ofstream bookFile("books.txt");if (!bookFile.is_open()) {cerr << "无法打开books.txt进行写入。\n";return;}for (const auto& book : books) {bookFile << book.getBookId() << ',' << book.getTitle() << ',' << book.getPublisher() << '\n';}bookFile.close();ofstream readerFile("readers.txt");if (!readerFile.is_open()) {cerr << "无法打开readers.txt进行写入。\n";return;}for (const auto& reader : readers) {readerFile << reader.getReaderId() << ',' << reader.getName() << ',' << reader.getGender() << ',' << reader.getContact() << '\n';}readerFile.close();cout << "数据保存成功。\n";
}void Library::loadData() {ifstream bookFile("books.txt");if (!bookFile.is_open()) {cerr << "无法打开books.txt进行阅读。\n";return;}int id;string title, publisher;while (bookFile >> id) {bookFile.ignore(); // Ignore the commagetline(bookFile, title, ',');getline(bookFile, publisher);books.push_back(Book(id, title, publisher));}bookFile.close();ifstream readerFile("readers.txt");if (!readerFile.is_open()) {cerr << "无法打开readers.txt进行阅读。\n";return;}char gender;string name, contact;while (readerFile >> id) {readerFile.ignore(); // 忽略逗号getline(readerFile, name, ',');readerFile >> gender;readerFile.ignore(); // 忽略逗号getline(readerFile, contact);readers.push_back(Reader(id, name, gender, contact));}readerFile.close();cout << "数据加载成功。\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车零配件行业看板管理系统应用

生产制造已经走向了精益生产&#xff0c;计算时效产出、物料周转时间等问题&#xff0c;成为每一个制造企业要面临的问题&#xff0c;工厂更需要加快自动化&#xff0c;信息化&#xff0c;数字化的布局和应用。 之前的文章多次讲解了企业MES管理系统&#xff0c;本篇文章就为大…

论文er们,YOLO这口饭得趁热吃

不知道各位有没有看出来&#xff0c;从去年开始YOLO相关的论文就处于一个井喷式状态&#xff0c;SCI各区都能见到它的身影。 这是因为YOLO其实是个很好发论文的方向&#xff0c;需求量很大&#xff0c;热度高&#xff0c;并且好入门&#xff0c;能获取的资源也很多。写论文时一…

宾馆酒店电视信号高清改造-广电信号接入数字电视同轴高清传输系统应用

宾馆酒店电视信号高清改造-广电信号接入数字电视同轴高清传输系统应用 由北京海特伟业科技有限公司任洪卓发布于2024年7月12日 一、宾馆酒店广电信号接入数字电视同轴高清传输系统建设背景 在当今数字化快速发展的时代&#xff0c;宾馆酒店作为服务行业的重要组成部分&#x…

idea修改全局配置、idea中用aliyun的脚手架,解决配置文件中文乱码

idea修改全局配置 idea中用aliyun的脚手架&#xff0c;创建springBoot项目 解决配置文件中文乱码

解决fidder小黑怪倒出JMeter文件缺失域名、请求头

解决fidder小黑怪倒出JMeter文件缺失域名、请求头 1、目录结构&#xff1a; 2、代码 coding:utf-8 Software:PyCharm Time:2024/7/10 14:02 Author:Dr.zxyimport zipfile import os import xml.etree.ElementTree as ET import re#定义信息头 headers_to_extract [Host, Conn…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录&#xff1a; 一.Linux权限维持&#xff1a; 1.webshell&#xff1a; 2.定时任务&#xff1a; 3.SUID后门&#xff1a; 4.SSH Key免密登录后门&#xff1a; 5.添加用户后门&#xff1a; 二.Windows权限维持 1.计划任务后门&…

在 Java 中:为什么不能在 static 环境中访问非 static 变量?

在 Java 中&#xff1a;为什么不能在 static 环境中访问非 static 变量&#xff1f; 1、静态&#xff08;static&#xff09;变量2、非静态&#xff08;非static&#xff09;变量3、为什么不能访问&#xff1f;4、如何访问&#xff1f;5、总结 &#x1f496;The Begin&#x1f…

2024年用于在 Python 中构建 API 的 8 个开源框架

什么是API&#xff1f; API是一个软件解决方案&#xff0c;作为中介&#xff0c;使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值&#xff1a; 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码&#xff1b;这些是为移动开…

安装WindowsTerminal并设置默认以管理员身份运行启动终端

安装WindowsTerminal并设置默认以管理员身份运行启动终端 背景&#xff1a;Microsoft Store打不开&#xff0c;且WindowsTerminal没有默认以管理员身份运行。 下载msixbundle类型的安装包&#xff1a;https://github.com/microsoft/terminal/releases 使用管理员运行Windows …

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述 RK3308H 使用8路个模拟麦克风录音&#xff0c;2路用es7243e做回采 解决方案&#xff1a; 首先先调8路模拟麦克风&#xff0c;根据原理图确定使用的是哪路I2S。 以下为dts配置&#xff0c;acodec的属性注释附上。 &acodec {status "okay";rockchip,m…

springBoot(若依)集成camunda

1、下图为项目结构 2、最外层 pom引入依赖 <properties><!--camunda 标明版本&#xff0c;注意要个自己的Spring 版本匹配&#xff0c;匹配关系自行查询官网--><camunda.version>7.18.0</camunda.version> </properties> 3、common模块引入依赖 …

Python 开发植物大战僵尸杂交版辅助【全网最详细_查找 + 代码编写一体化零基础也能学会】

目录 辅助最终展示效果 一、文章介绍 二、工具介绍 三、基址搜索 3.1、寻找阳光基址 3.2、寻找卡槽冷却基址 3.3、寻找僵尸刷新时间基址 3.4、寻找大阳光刷新时间基址 3.5、寻找植物编号基址 3.6、寻找场上僵尸数量基址 3.7、寻找僵尸 X 坐标基址 3.8、通过找到的僵…

《昇思25天学习打卡营第1天|QuickStart》

说在前面 曾经接触过华为的910B服务级显卡&#xff0c;当时基于910B做了一些开发的工作&#xff0c;但是总感觉做的事情太低层&#xff0c;想要能自顶向下的了解下&#xff0c;因此开始了MindSpore的学习。另外也想给予提供的显卡&#xff0c;简单尝试下llm模型的训练&#xf…

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

SpringBootWeb 篇-入门了解 Swagger 的具体使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Swagger 介绍 1.1 Swagger 和 Yapi 的使用场景 2.0 Swagger 的使用方式 2.1 导入 knife4j 的 maven 坐标 2.2 在配置类中加入 knife4j 相关配置 2.3 设置静态资源…

oracle控制文件详解以及新增控制文件

文章目录 oracle控制文件1、 控制文件包含的主要信息如下&#xff1a;2、查看目前系统的控制文件信息&#xff0c;主要是查看相关的字典视图 oracle新增控制文件 oracle控制文件 控制文件是一个很小的二进制文件(10MB左右)&#xff0c;含有数据库结构信息&#xff0c;包括数据…

Open3D 点云Kmeans聚类算法

目录 一、概述 1.1算法介绍 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2聚类后点云 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 1.1算法介绍 聚类是一种将数据集分组的方…

Next.js的静态生成和服务端渲染,你搞懂了吗?

Next.js的静态生成和服务端渲染&#xff0c;你搞懂了吗&#xff1f; 嘿&#xff0c;各位前端小伙伴们&#xff01;今天咱们来聊聊Next.js中那令人又爱又恨的静态生成&#xff08;Static Generation&#xff09;和服务端渲染&#xff08;Server-side Rendering&#xff09;。这…

双语|如何给教授/教职员发送电子邮件

斯坦福大学提出建议&#xff0c;指导学生如何给教授或者教职员发送电子邮件&#xff0c;这些建议对于访问学者、博士后及联合培养博士也很适用&#xff0c;故知识人网小编用双语对照的形式进行节选转发。 Whether youre writing a professor to ask for an extension or to loo…

多平台支持,制作的电子画册随时随地都可以查看

​在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地…