You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:34:06