如何实现20本图书信息数组的输入输出及基于OOP的图书类定义
解决你的图书管理代码问题:输出信息 + 面向对象重构
先来帮你搞定第一个问题:输出已输入的图书信息,顺便先修正你原代码里的几个小bug——比如你用char books[20]这种单个char数组根本存不了书名(只能存一个字符),应该用std::string类型;还有输入时写的book[x]是笔误,变量名明明是books。
一、修正基础代码并实现信息输出
先把原代码改成可运行的版本,同时添加输出逻辑:
#include <iostream> #include <string> // 必须包含这个头文件才能使用std::string int main(int argc, char** argv) { int x; // 把char数组换成string,才能存储完整的书名、ISBN、类型(支持带空格的内容) std::string books[20], isbn[20], type[20]; int printingTime[20]; // 变量名time会和标准库的time函数冲突,换个更清晰的名字 double price[20]; // 价格用double更合理,毕竟可能有小数(比如39.9元) // 循环输入20本图书信息 for(x = 0; x < 20; x++) { std::cout << "=== 输入第" << x+1 << "本图书信息 ===" << std::endl; std::cout << "书名: "; std::cin.ignore(); // 忽略之前输入留下的换行符,避免getline直接跳过输入 std::getline(std::cin, books[x]); // 用getline可以输入带空格的书名(比如"哈利·波特与魔法石") std::cout << "ISBN: "; std::cin >> isbn[x]; std::cout << "类型: "; std::cin >> type[x]; std::cout << "出版时间: "; std::cin >> printingTime[x]; std::cout << "价格: "; std::cin >> price[x]; } // 循环输出所有图书信息 std::cout << "\n=== 已输入的20本图书信息汇总 ===" << std::endl; for(x = 0; x < 20; x++) { std::cout << "\n第" << x+1 << "本:" << std::endl; std::cout << "书名: " << books[x] << std::endl; std::cout << "ISBN: " << isbn[x] << std::endl; std::cout << "类型: " << type[x] << std::endl; std::cout << "出版时间: " << printingTime[x] << std::endl; std::cout << "价格: " << price[x] << std::endl; std::cout << "-------------------------" << std::endl; } return 0; }
这里几个关键细节要注意:
- 用
std::string代替char数组,才能存储带空格的书名; - 变量名
time换成printingTime,避免和标准库的std::time冲突; - 价格用
double类型,支持小数价格; - 输入书名时用
std::getline,但之前要加std::cin.ignore()清理换行符,不然会直接跳过输入; - 输出时用循环遍历所有数组元素,逐个打印每本图书的信息。
二、用面向对象(OOP)重构代码
现在把图书封装成类,让代码结构更清晰、扩展性更强。我们定义一个Book类,把图书的所有属性(书名、ISBN、类型等)作为私有成员,再提供专门的方法来处理输入和输出操作。
实现代码:
#include <iostream> #include <string> #include <vector> // 用vector比固定数组更灵活,也可以用Book books[20]; // 定义Book类,封装图书的属性和操作 class Book { private: // 私有成员:图书的核心属性,外部不能直接修改 std::string name; std::string isbn; std::string type; int printingTime; double price; public: // 空构造函数,用于创建空的Book对象 Book() {} // 带参数的构造函数(可选),方便直接初始化图书信息 Book(std::string n, std::string i, std::string t, int pt, double p) : name(n), isbn(i), type(t), printingTime(pt), price(p) {} // 输入图书信息的方法 void inputInfo() { std::cout << "书名: "; std::cin.ignore(); std::getline(std::cin, name); std::cout << "ISBN: "; std::cin >> isbn; std::cout << "类型: "; std::cin >> type; std::cout << "出版时间: "; std::cin >> printingTime; std::cout << "价格: "; std::cin >> price; } // 输出图书信息的方法(加const表示不会修改类成员) void outputInfo() const { std::cout << "书名: " << name << std::endl; std::cout << "ISBN: " << isbn << std::endl; std::cout << "类型: " << type << std::endl; std::cout << "出版时间: " << printingTime << std::endl; std::cout << "价格: " << price << std::endl; } }; int main() { const int BOOK_COUNT = 20; // 用vector存储20本图书,比数组更易扩展(比如后期要动态添加图书) std::vector<Book> library(BOOK_COUNT); // 输入每本图书的信息 std::cout << "=== 开始输入20本图书信息 ===" << std::endl; for(int i = 0; i < BOOK_COUNT; i++) { std::cout << "\n第" << i+1 << "本图书:" << std::endl; library[i].inputInfo(); } // 输出所有图书信息 std::cout << "\n=== 图书馆所有图书信息汇总 ===" << std::endl; for(int i = 0; i < BOOK_COUNT; i++) { std::cout << "\n第" << i+1 << "本:" << std::endl; library[i].outputInfo(); std::cout << "-------------------------" << std::endl; } return 0; }
面向对象的核心优势:
- 封装性:把图书的属性和操作(输入、输出)打包在一起,避免了零散的数组,代码更整洁;
- 扩展性:以后要加新属性(比如作者、页数),只需要在
Book类里添加成员,修改inputInfo和outputInfo即可,不用改动主逻辑; - 可读性:代码结构清晰,一看就知道
Book类负责图书的所有相关操作,维护起来更方便。
如果想更优雅,还可以重载std::ostream和std::istream运算符,这样就能直接用cin >> book和cout << book来输入输出图书信息,代码会更简洁。
内容的提问来源于stack exchange,提问作者Maad
相关产品推荐
相关产品推荐

