题目介绍
定义图书类,属性有:书名、出版社、ISBN号、作者、库存量、价格等信息和相关的对属性做操作的行为。 主要完成对图书的销售、统计和图书的简单管理。
(1)销售功能。购买书籍时,输入相应的ISBN号,并在书库中查找该书的相关信息。如果有库存量,输入购买的册数,进行相应计算。如果库存量不够,给出提示信息,结束购买。
(2)添加功能:主要完成图书信息的添加, 要求ISBN号准一。当添加了重复的编号时,则提示数据添加重复并取消添加。
(3)查询功能:可按书名、ISBN号、作者、出版社进行查询。若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该标题不存在!”。
(4)修改功能:可根据查询结果对相应的记录进行修改,修改时注意ISBN号的唯一性。
(5)删除功能:主要完成图书信息的除。输入要删除的ISBN 号,根据编号删除该物品的记录,如果该编号不在物品库中,则提示“该编号不存在”。
(6)统计功能:输出当前书库中所有图书的总数及详细信息:可按书的价格、库存量、作者、出版社进行统计,输出统计信息时,要按从大到小进行排序。
(7)图书存盘:将当前程序中的图书信息存入文件中。
(8)读出信息:从文件中将图书信息读入程序。
以下,是此程序的代码
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include<iomanip>
#define max 200
using namespace std;
class book
{
public:
string name;
string pub;
int isbn;
string author;
double price;
int astore;
void input();
void output();
};
book b[max];
static int btop;
void book::input()
{
cout << "请输入ISBN号" << endl;
cin >> isbn;
cout << "请输入书名" << endl;
cin >> name;
cout << "请输入出版社" << endl;
cin >>pub;
cout << "请输入作者" << endl;
cin >>author;
cout << "请输入价格" << endl;
cin >> price;
cout << "请输入总库存" << endl;
cin >> astore;
}
void book::output()
{
cout << setw(10) << isbn
<< setw(10) << name
<< setw(10) << pub
<< setw(10) << author
<< setw(10) << price
<< setw(10) << astore
<< endl;
}
class manage:public book
{
public:
int add();
int search();
int edit();
int Delete();
int sell();
int sta();
int save();
int read();
};
int manage::add()
{
system("cls");
book b1;
int i, n;
bool isbnExists = false;
cout << "请输入ISBN号,以校验是否重复" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if (n == b[i].isbn)
{
isbnExists = true;
break;
}
}
if (!isbnExists)
{
b1.input();
btop++;
b[btop] = b1;
cin.get();
return 0;
}
else
{
cout << "已有此编号,请重新添加"<<endl;
cin.get();
return 0;
}
}
int manage::search()
{
system("cls");
int i,a;
double c;
string n;
bool f = 0;
cout << "*****欢迎查询图书信息*****" << endl;
cout << " 1.按书名查询" << endl;
cout << " 2.按ISBN号查询" << endl;
cout << " 3.按作者查询" << endl;
cout << " 4.按出版社查询" << endl;
cout << "请按照需求,选择您的查询方式(1~4)" << endl;
cin >> a;
switch (a)
{
case 1:cout << "请输入书名" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if ((b[i].name).compare(n) == 0)
{
cout << setw(10) << "ISBN号"
<< setw(10) << "书名"
<< setw(10) << "出版社"
<< setw(10) << "作者"
<< setw(10) << "价格"
<< setw(10) << "总库存"
<< endl;
b[i].output();
f = 1;
cin.get();
break;
}
}
if (f == 0)
{
cout << "没有找到该书" << endl;
cin.get();
return 0;
}
break;
case 2:cout << "请输入ISBN号" << endl;
cin >> c;
for (i = 0; i < btop; i++)
{
if (c== b[i].isbn)
{
cout << setw(10) << "ISBN号"
<< setw(10) << "书名"
<< setw(10) << "出版社"
<< setw(10) << "作者"
<< setw(10) << "价格"
<< setw(10) << "总库存"
<< endl;
b[i].output();
f = 1;
cout << "按下enter返回主菜单";
cout << endl;
cin.get();
break;
}
}
if (f == 0)
{
cout << "没有找到该书" << endl;
cin.get();
return 0;
}
break;
case 3:cout << "请输入作者" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if ((b[i].author).compare(n)==0)
{
cout << setw(10) << "ISBN号"
<< setw(10) << "书名"
<< setw(10) << "出版社"
<< setw(10) << "作者"
<< setw(10) << "价格"
<< setw(10) << "总库存"
<< endl;
b[i].output();
f = 1;
cout << "按下enter返回主菜单";
cout << endl;
cin.get();
break;
}
}
if (f == 0)
{
cout << "没有找到该书" << endl;
cin.get();
return 0;
}
break;
case 4:cout << "请输入出版社" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if ((b[i].pub).compare(n)==0)
{
cout << setw(10) << "ISBN号"
<< setw(10) << "书名"
<< setw(10) << "出版社"
<< setw(10) << "作者"
<< setw(10) << "价格"
<< setw(10) << "总库存"
<< endl;
b[i].output();
f = 1;
cin.get();
break;
}
}
if (f == 0)
{
cout << "没有找到该书" << endl;
cin.get();
return 0;
}
break;
default:cout << "请输入正确的数字" << endl;
cin.get();
return 0;
break;
}
}
int manage::edit()
{
system("cls");
book b1;
int i, n;
bool found = false;
cout << "请输入ISBN号" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if (n == b[i].isbn)
{
cout << "开始修改信息" << endl;
b1.input();
b[i] = b1;
cout << "编辑成功" << endl;
cin.get();
found = true;
break;
}
}
if (!found)
{
cout << "该编号不存在" << endl;
cin.get();
return -1; // 返回-1表示需要跳回主菜单
}
return 0;
}
int manage::Delete()
{
system("cls");
int i, n;
cout << "请输入ISBN号" << endl;
cin >> n;
bool found = false;
for (i = 0; i < btop; i++)
{
if (n == b[i].isbn)
{
found = true;
break;
}
}
if (!found)
{
cout << "该编号不存在" << endl;
return 0;
}
for (i; i < btop - 1; i++)
{
b[i] = b[i + 1];
}
btop--;
cout << "删除成功" << endl;
cin.get();
return 0;
}
int manage::sell()
{
system("cls");
book b1;
int i, n,a;
cout << "请输入ISBN号" << endl;
cin >> n;
for (i = 0; i < btop; i++)
{
if (i == btop)
{
cout << "该编号不存在" << endl;
cin.get();
return 0;
}
if (n == b[i].isbn)
break;
}
b[i].output();
cout << "请输入你要购买的书本数" << endl;
cin >> a;
if (a <= astore)
cout << "总金额为:" << a * b[i].price << endl;
if (a > astore)
{
cout << "库存不足" << endl;
cout << "剩余库存为:" << b[i].astore << endl;
cin.get();
return 0;
}
}
int manage::sta()
{
system("cls");
book b1;
int i,a;
cout << "可按四种类型进行统计,按价格为1,按库存量为2,按作者为3,按出版社为4" << endl;
cin >> a;
switch (a)
{
case 1:
// 按价格排序
for (i = 0; i < btop - 1; i++)
{
for (int j = 0; j < btop - 1 - i; j++)
{
if (b[j].price < b[j + 1].price)
{
b1 = b[j];
b[j] = b[j + 1];
b[j + 1] = b1;
}
}
}
for (i = 0; i < btop - 1; i++)
{
}
break;
case 2:
// 按库存量排序
for (i = 0; i < btop - 1; i++)
{
for (int j = 0; j < btop - 1 - i; j++)
{
if (b[j].astore < b[j + 1].astore)
{
b1 = b[j];
b[j] = b[j + 1];
b[j + 1] = b1;
}
}
}
break;
case 3:
// 按作者排序
for (i = 0; i < btop - 1; i++)
{
for (int j = 0; j < btop - 1 - i; j++)
{
if (b[j].author > b[j + 1].author)
{
b1 = b[j];
b[j] = b[j + 1];
b[j + 1] = b1;
}
}
}
break;
case 4:
// 按出版社排序
for (i = 0; i < btop - 1; i++)
{
for (int j = 0; j < btop - 1 - i; j++)
{
if (b[j].pub > b[j + 1].pub)
{
b1 = b[j];
b[j] = b[j + 1];
b[j + 1] = b1;
}
}
}
break;
}
// 输出排序后的图书信息
cout << setw(10) << "ISBN号"
<< setw(10) << "书名"
<< setw(10) << "出版社"
<< setw(10) << "作者"
<< setw(10) << "价格"
<< setw(10) << "总库存"
<< endl;
for (i = 0; i < btop; i++)
{
b[i].output();
}
cin.get();
return 0;
}
int manage::save()
{
system("cls");
int i;
ofstream outfile; // 向文件中写入
string filename = "books_data.data"; // 自动生成的文件名
outfile.open(filename, ios::binary); // 打开文件并设置为二进制模式
if (!outfile)
{
cerr << "无法打开文件" << endl;
return 0;
}
for (i = 0; i < btop; i++)
outfile.write((char*)&b[i], sizeof(b[i]));
outfile.close();
cout << "保存成功" << endl;
}
int manage::read()
{
system("cls");
int i;
ifstream infile; // 从文件读出
string filename = "books_data.data"; // 自动生成的文件名
infile.open(filename, ios::binary); // 打开文件并设置为二进制模式
if (!infile)
{
cerr << "无法打开文件" << endl;
return 0;
}
for (i = 0; i < btop; i++)
infile.read((char*)&b[i], sizeof(b[i]));
infile.close();
cout << "读取成功" << endl;
}
int main()
{
int a;
manage m;
do
{
cout << "************************************" << endl;
cout << "********欢迎使用图书管理系统********" << endl;
cout << " 1. 添加图书" << endl;
cout << " 2. 搜索图书" << endl;
cout << " 3. 编辑图书" << endl;
cout << " 4. 删除图书" << endl;
cout << " 5. 销售图书" << endl;
cout << " 6. 统计图书" << endl;
cout << " 7. 保存图书信息" << endl;
cout << " 8. 读取图书信息" << endl;
cout << " 0. 退出" << endl;
cout << "************************************" << endl;
cout << "请输入您的选择: ";
cin >> a;
switch (a)
{
case 1:
m.add();
break;
case 2:
m.search();
break;
case 3:
m.edit();
break;
case 4:
m.Delete();
break;
case 5:
m.sell();
break;
case 6:
m.sta();
break;
case 7:
m.save();
break;
case 8:
m.read();
break;
case 0:
cout << "谢谢使用,再见!" << endl;
break;
default:
cout << "无效的选择,请重新输入!" << endl;
break;
}
} while (a != 0);
}