图书信息管理系统的设计与实现
文章目录
前言
本文主要阐述图书信息管理系统的设计与实现的逻辑和物理设计,主要由算法说明和伪代码组成。
一、实验内容
设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
(1)根据指定图书个数,逐个输入图书信息;
(2)逐个显示图书表中所有图书的相关信息;
(3)能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
(4)根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
(5)能统计表中图书个数;
(6)实现图书信息表的图书去重;
(7)实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
(8)图书信息表按指定条件进行批量修改;
(9)利用快速排序按照图书价格降序排序;
(10)实现最贵图书的查找;
二、程序设计
由于本实验较为简单,没有什么特别的算法说明,将主要以代码说明为主。
1.图书信息的基本结构体定义
代码如下:
typedef struct {
string no; //8位书号
string name; //书名
double price; //价格
}Book;
//顺序表的定义:
typedef struct LNode {
Book data; //数据域
struct LNode* next; //指针域
}LNode;
typedef struct {
LNode* first; //指向数据元素的基地址
int length; //线性表的当前长度
}SqList;
//链表的定义
2.基于链式存储结构的图书信息表的创建和输出
该代码总体基于类Library实现
通过不断循环输入和创建新节点来增加新的数目
实现输入的代码如下:
Library() {
sq.length = 0;LNode* first = new LNode; sq.first = first;
Book book; first->next = NULL; LNode* r =first; LNode* ln = new LNode;
while (1) {
ln = new LNode;
cin >> ln->data.no >> ln->data.name >> ln->data.price;
if (ln->data.no == "0" && ln->data.name == "0"&&ln->data.price==0 ) {
break;
}
else {
r->next = ln; r = ln;
sq.length++;
}
}
r->next = NULL;
}
遍历输出所有书目
实现输出的代码如下:
void ShowBooks() {
LNode* p = sq.first;
cout << "书号 " << "书名 " << "价格" << endl;
while (p->next != NULL) {
p = p->next;
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
}
3.基于链式存储结构的图书信息表的修改
遍历所有书目将小于和大于平均数的分别修改为1.2和1.1倍。(不论大于小于平均数都抬高价格,奸商啊)
代码实现如下:
void ChangePrice() {
int average = 0; LNode* p = sq.first;
while (p->next != NULL) {
p = p->next;
average = average + p->data.price;
}
average = average / sq.length;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price >= average)
p->data.price = p->data.price * 1.1;
else p->data.price = p->data.price * 1.2;
}
cout << "修改价格后的书目为:" << endl;
ShowBooks();
}
4.基于链式存储结构的图书信息表的最贵图书的查找
读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。
代码实现如下:
void FindTheMostexpensive() {
int most = 0; LNode* p = sq.first; int count = 0;
while (p->next != NULL) {
p = p->next;
if (p->data.price > most)
most = p->data.price;
}
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price == most)
count++;
}
cout << "最贵的书共有" << count << "本" << endl;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price == most)
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
}
5.基于链式存储结构的图书信息表的最爱图书的查找
读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。
实现的代码如下:
void FindTheBook() {
cout << "请输入您最爱的图书的名字" << endl;
string book;
cin >> book;
LNode* p = sq.first; int count = 0;
while (p->next != NULL) {
p = p->next;
if (p->data.name==book)
count++;
}
if (count == 0) {
cout << "抱歉,没有你的最爱!" << endl;
return;
}
cout << "您最爱的图书共有" << count << "本" << endl;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.name == book)
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
}
6.基于链式存储结构的图书信息表的新书入库
读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。
实现的代码如下:
void InsertBook() {
LNode* p = sq.first; int x; LNode* ln = new LNode;
cout << "请输入要插入图书的位置" << endl;
cin >> x;
if (x > sq.length + 1 || x <= 0) {
cout << "抱歉,入库位置非法!" << endl;
return;
}
cout << "请输入要插入书目的信息(以0 0 0表示输入完毕)" << endl;
for(int i=0;i<x-1;i++)
p = p->next;
while (1) {
ln = new LNode;
cin >> ln->data.no >> ln->data.name >> ln->data.price;
if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
break;
}
else {
ln->next = p->next;
p->next = ln;
p = ln;
sq.length++;
}
}
cout << "插入图书完成,所有图书信息为:" << endl;
ShowBooks();
}
7.基于链式存储结构的图书信息表的旧书出库
读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。
实现的代码如下:
void DeleteBook() {
LNode* p = sq.first; string s; LNode* ln = new LNode; LNode* q; bool find = 0;
cout<< "请输入要删除书目的书号" << endl;
cin >> s;
while (p->next != NULL) {
p = p->next;
if (p->next->data.no == s) {
q = p->next;
cout << "删除书目的信息如下:" << endl;
cout << q->data.no << " " << q->data.name << " " << q->data.price << endl;
p->next = p->next->next;
delete q;
sq.length--;
find = 1;
}
}
if (find == 0) {
cout << "出库失败,未找到该图书!" << endl;
return;
}
cout << "删除图书完成" << endl;
}
8基于链式存储结构的图书信息表的图书去重
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。
实现的代码如下:
void DeleteDuplicate() {
cout << "将删除重复的书目" << endl;
LNode* p = sq.first; LNode* q = sq.first; LNode* s;
while (p->next != NULL) {
q = p->next;
p = p->next;
while (q->next != NULL) {
if (p->data.no == q->next->data.no) {
s = q->next;
q->next = q->next->next;
delete s;
sq.length--;
continue;
}
q = q->next;
}
}
cout << "去重完毕,去重后图书书目为:" << sq.length << endl;
cout << "去重后的图书信息为:" << endl;
ShowBooks();
}
三、完整代码
#include <iostream>
using namespace std;
typedef struct {
string no; //8位书号
string name; //书名
double price; //价格
}Book;
//顺序表的定义:
typedef struct LNode {
Book data; //数据域
struct LNode* next; //指针域
}LNode;
typedef struct {
LNode* first; //指向数据元素的基地址
int length; //线性表的当前长度
}SqList;
//链表的定义
class Library {
private:
SqList sq;
public:
void Begin() {
char x; bool finish = 1;
while (finish) {
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 << "————————————————————————" << endl;
cin >> x;
switch (x) {
case '1':
ShowBooks();
break;
case '2':
ChangePrice();
break;
case '3':
FindTheMostexpensive();
break;
case '4':
FindTheBook();
break;
case '5':
InsertBook();
break;
case '6':
DeleteBook();
break;
case '7':
DeleteDuplicate();
break;
default:
finish = 0;
cout << "使用结束,感谢您的使用" << endl;
}
}
}
Library(int a) {
cout << "请输入创建图书馆的书目:" << endl;
sq.length = 0; LNode* first = new LNode; sq.first = first;
Book book; first->next = NULL; LNode* r = first; LNode* ln = new LNode;
while (1) {
ln = new LNode;
cin >> ln->data.no >> ln->data.name >> ln->data.price;
if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
break;
}
else {
r->next = ln; r = ln;
sq.length++;
}
}
r->next = NULL;
Begin();
}
void ShowBooks() {
LNode* p = sq.first;
cout << "书号 " << "书名 " << "价格" << endl;
while (p->next != NULL) {
p = p->next;
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
cout << "————————————————————————" << endl;
}
void ChangePrice() {
int average = 0; LNode* p = sq.first;
while (p->next != NULL) {
p = p->next;
average = average + p->data.price;
}
average = average / sq.length;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price >= average)
p->data.price = p->data.price * 1.1;
else p->data.price = p->data.price * 1.2;
}
cout << "修改价格后的书目为:" << endl;
ShowBooks();
}
void FindTheMostexpensive() {
double most = 0; LNode* p = sq.first; int count = 0;
while (p->next != NULL) {
p = p->next;
if (p->data.price > most)
most = p->data.price;
}
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price == most)
count++;
}
cout << "最贵的书共有" << count << "本" << endl;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.price == most)
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
cout << "————————————————————————" << endl;
}
void FindTheBook() {
cout << "请输入您最爱的图书的名字" << endl;
string book;
cin >> book;
LNode* p = sq.first; int count = 0;
while (p->next != NULL) {
p = p->next;
if (p->data.name==book)
count++;
}
if (count == 0) {
cout << "抱歉,没有你的最爱!" << endl;
return;
}
cout << "您最爱的图书共有" << count << "本" << endl;
p = sq.first;
while (p->next != NULL) {
p = p->next;
if (p->data.name == book)
cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
}
cout << "————————————————————————" << endl;
}
void InsertBook() {
LNode* p = sq.first; int x; LNode* ln = new LNode;
cout << "请输入要插入图书的位置" << endl;
cin >> x;
if (x > sq.length + 1 || x <= 0) {
cout << "抱歉,入库位置非法!" << endl;
return;
}
cout << "请输入要插入书目的信息(以0 0 0表示输入完毕)" << endl;
for(int i=0;i<x-1;i++)
p = p->next;
while (1) {
ln = new LNode;
cin >> ln->data.no >> ln->data.name >> ln->data.price;
if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
break;
}
else {
ln->next = p->next;
p->next = ln;
p = ln;
sq.length++;
}
}
cout << "插入图书完成,所有图书信息为:" << endl;
ShowBooks();
}
void DeleteBook() {
LNode* p = sq.first; string s; LNode* ln = new LNode; LNode* q; bool find = 0;
cout<< "请输入要删除书目的书号" << endl;
cin >> s;
while (p->next != NULL) {
p = p->next;
if (p->next->data.no == s) {
q = p->next;
cout << "删除书目的信息如下:" << endl;
cout << q->data.no << " " << q->data.name << " " << q->data.price << endl;
p->next = p->next->next;
delete q;
sq.length--;
find = 1;
}
}
if (find == 0) {
cout << "出库失败,未找到该图书!" << endl;
return;
}
cout << "删除图书完成" << endl;
cout << "————————————————————————" << endl;
}
void DeleteDuplicate() {
cout << "将删除重复的书目" << endl;
LNode* p = sq.first; LNode* q = sq.first; LNode* s;
while (p->next != NULL) {
q = p->next;
p = p->next;
while (q->next != NULL) {
if (p->data.no == q->next->data.no) {
s = q->next;
q->next = q->next->next;
delete s;
sq.length--;
continue;
}
q = q->next;
}
}
cout << "去重完毕,去重后图书书目为:" << sq.length << endl;
cout << "去重后的图书信息为:" << endl;
ShowBooks();
}
};
int main() {
int a = 0;
cout << "欢迎使用图书管理系统^_^" << endl;
Library li(a);
return 0;
}
总结
本次实验以链式实现,目的是提高自己对于链式存储的掌握。
以上就是图书信息管理系统的设计与实现,由于本实验确实没有特别好说明的算法,所以本文以代码实现的说明为主。
感谢您的阅读。