(一)实验内容
设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
- 根据指定图书个数,逐个输入图书信息;
- 逐个显示图书表中所有图书的相关信息;
- 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
- 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
- 能统计表中图书个数;
- 实现图书信息表的图书去重;
- 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
- 图书信息表按指定条件进行批量修改;
- 利用快速排序按照图书价格降序排序;
- 实现最贵图书的查找;
(二)实现方案
1.基于顺序存储/链式存储结构的图书信息表的创建和输出
定义一个包含图书信息(书号、书名、价格)的顺序表。读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。
输入
输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计 n+1 行,第 1 行是所创建的图书表中的图书个数,后 n 行是 n 本图书的信息(书号、
书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两
位小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第 2 版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 32.00
0 0 0
2.基于顺序存储/链式存储结构的图书信息表的修改
读入图书信息表,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。
输入
输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第 2 版) 20.00
9787302219972 数据挖掘与机器学习 32.00
9787302203513 模式识别与智能计算 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 操作系统教程 32.00
0 0 0
输出样例:
9787302257646 程序设计基础 30.00
9787302164340 程序设计基础(第 2 版) 24.00
9787302219972 数据挖掘与机器学习 35.20
9787302203513 模式识别与智能计算 28.60
9787810827430 工业计算机控制技术——原理与应用 31.90
9787811234923 操作系统教程 35.20
3.基于顺序存储/链式存储结构的图书信息表的最贵图书查找
读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。
输出
总计 m+1 行,其中,第 1 行是最贵的图书数目,(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
输出样例:
2
9787302219972 数据挖掘与机器学习 35.20
9787811234923 操作系统教程 35.20
4.基于顺序存储/链式存储结构的图书信息表的最爱图书的查找
读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。
输入
输入1行,为每次待查找的最爱图书名字。
输出
若查找成功,输出k+1行,对于每次查找,第一行是最爱图书数目,同一书名的图书可能有多本,后K行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。若查找失败:只输出以下提示:抱歉,没有你的最爱!
输出样例
2
9787302257646 程序设计基础 30.00
9787302164340 程序设计基础(第 2 版) 24.00
5.基于顺序存储/链式存储结构的图书信息表的新书入库
读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。
输入
总计n+1行,首先输入第1行,内容仅为一个整数,代表待入库的新图书的位置序号,然后输入n行,内容为新图书的信息,书号、书名、价格用空格分隔。
输出
若插入成功,输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
若插入失败,只输出以下提示:抱歉,入库位置非法!
输入样例:
2
9787302265436 计算机导论实验指导 18.00
输出样例:
9787302257646 程序设计基础 30.00
9787302265436 计算机导论实验指导 18.00
9787302164340 程序设计基础(第 2 版) 24.00
9787302219972 数据挖掘与机器学习 35.20
9787302203513 模式识别与智能计算 28.60
9787810827430 工业计算机控制技术——原理与应用 31.90
9787811234923 操作系统教程 35.20
6.基于顺序存储/链式存储结构的图书信息表的旧书出库
读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。
输入
输入待出库的旧图书的书号;
输出
若删除成功,输出旧图书出库后所有图书的信息(书号、书名、价格),每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
若删除失败,只输出以下提示:出库失败,未找到该图书!
7.基于顺序存储/链式存储结构的图书信息表的图书去重
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。
输出
总计输出m+1行(m<=n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。
(三)源码(基于顺序存储):
BookList.h
#pragma once
#include<iostream>
#include<iomanip>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int MaxSize = 1000;
struct book
{
char no[8]; //8位书号
char name[20]; //书名
float price; //价格
};
class BookList
{
private:
book list[MaxSize];
int length;
public:
BookList(); //默认构造函数
~BookList(); //析构函数
int getLength(); //获取长度
void printList(); //打印图书信息表
void getExpensive(); //获取最贵图书信息
void findFavourite(); //最爱图书查询
void insertBooks(); //新书入库
void deleteBook(); //旧书出库
void deleteBook(int loc); //删除指定位置图书
void bookDeWeight(); //图书去重
void priceChanged(); //修改价格
void fastSort(int l,int r); //按照价格降序排序
};
BookList.cpp
#include "BookList.h"
BookList::BookList()
{
cout << "当前图书为空,新建一个图书信息表..." << endl << endl;
cout << "依次输入书号、书名、价格,空格隔开,(0,0,0)视为退出" << endl;
int flag = 1, index = 0;
length = 1;
char exit[] = "0";
while (flag && index < MaxSize)
{
//依次输入图书信息
cin >> list[index].no;
cin >> list[index].name;
cin >> list[index].price;
//检测到(0,0,0)时退出
if (!strcmp(list[index].no, exit) && !strcmp(list[index].name, exit) && list[index].price == 0)
{
cout << "输入完成" << endl;
flag = 0;
}
else
{
index++;
length++;
}
}
}
BookList::~BookList()
{
}
void BookList::printList()
{
cout << "输出图书信息表如下:" << endl;
cout << "长度:" << length - 1 << endl;
for (int i = 0; i < length - 1; i++)
cout << list[i].no << " " << list[i].name << " " << fixed << setprecision(2) << list[i].price << endl;
}
void BookList::getExpensive()
{
int max = 0;
vector<int> ExpensiveLoc;
ExpensiveLoc.push_back(max);
for (int i = 1; i < length - 1; i++)
{
if (list[i].price == list[max].price)
ExpensiveLoc.push_back(i);//检测到相同的最大值则存放其位置
if (list[i].price > list[max].price)
{
//检测到更大值,则清空最大位置数组,重新存放
max = i;
ExpensiveLoc.clear();
ExpensiveLoc.push_back(max);
}
}
//输出最贵图书信息
cout << "最贵图书数量为" << ExpensiveLoc.size() << ",具体信息如下:" << endl;
int index = 0;
for (int i = 0; i < ExpensiveLoc.size(); i++)
{
cout << list[ExpensiveLoc[index]].no << " " << list[ExpensiveLoc[index]].name << " " << fixed << setprecision(2) << list[ExpensiveLoc[index]].price << endl;
index++;
}
}
int BookList::getLength()
{
return length;
}
void BookList::findFavourite()
{
char favBookName[20];
cout << "请输入最爱图书名:";
cin >> favBookName;
vector<int> favLoc;
for(int i=0;i<length;i++)
{
if (strcmp(list[i].name, favBookName) == 0)
favLoc.push_back(i);//找到最爱图书则存放其位置
}
int count = favLoc.size();//记录最爱图书数量
if (count == 0)
cout << "抱歉,没有你的最爱!" << endl;
else
{
cout << "已找到,展示如下:" << endl;
cout << count << endl;
int index = 0;
for (int i = 0; i < count; i++)
{
cout << list[favLoc[index]].no << " " << list[favLoc[index]].name << " " << fixed << setprecision(2) << list[favLoc[index]].price << endl;
index++;
}
}
}
void BookList::insertBooks()
{
cout << "请输入插入顶点位置:";
int loc;
cin >> loc;
loc--;
cout << "请输入插入图书的信息:";
char new_no[8], new_name[20];
float new_price;
cin >> new_no;
cin >> new_name;
cin >> new_price;
if (length == MaxSize)
cout << "抱歉,入库位置非法!" << endl;
else
{
for (int i = length - 1; i >= loc; i--)
{
strcpy_s(list[i + 1].no,list[i].no);
strcpy_s(list[i + 1].name, list[i].name);
list[i + 1].price = list[i].price;
}
strcpy_s(list[loc].no, new_no);
strcpy_s(list[loc].name, new_name);
list[loc].price = new_price;
}
length++;
cout << "插入完成" << endl;
printList();
}
void BookList::deleteBook()
{
cout << "请输入删除图书的书号:";
char del_no[8];
cin >> del_no;
for (int i = 0; i < length; i++)
{
if (!strcmp(list[i].no, del_no))
{
for (int j = i; j < length; j++)
{
strcpy_s(list[i].no, list[i + 1].no);
strcpy_s(list[i].name, list[i + 1].name);
list[i].price = list[i + 1].price;
}
length--;
break;
}
if (i == length - 1)
cout << "出库失败,未找到该图书!" << endl;
}
cout << "删除完成" << endl;
printList();
}
void BookList::deleteBook(int loc)//用于去重函数
{
for (int i = loc; i < length - 1; i++)
{
strcpy_s(list[i].no, list[i + 1].no);
strcpy_s(list[i].name, list[i + 1].name);
list[i].price = list[i + 1].price;
}
length--;
}
void BookList::priceChanged()
{
float sumPrice = 0;
for (int i = 0; i < length; i++)
sumPrice += list[i].price;
float ave = sumPrice / (length - 1);
for (int i = 0; i < length; i++)
{
if (list[i].price < ave)
list[i].price += list[i].price / 10;
else
list[i].price += list[i].price / 5;
}
cout << "价格已修改" << endl;
printList();
}
void BookList::fastSort(int l,int r)
{
if (l < r)
{
int i = l, j = r;
float temp_price = list[l].price;
char temp_no[8], temp_name[20];
strcpy_s(temp_no, list[l].no);
strcpy_s(temp_name, list[l].name);
while (i < j)
{
//从右向左找第一个价格大于temp_price的数
while (i < j && list[j].price <= temp_price)
j--;
if (i < j)
{
list[i].price = list[j].price;
strcpy_s(list[i].no, list[j].no);
strcpy_s(list[i].name, list[j].name);
i++;
}
//从左向右找第一个价格小于temp_price的数
while (i<j && list[i].price > temp_price)
i++;
if (i < j)
{
list[j].price = list[i].price;
strcpy_s(list[j].no, list[i].no);
strcpy_s(list[j].name, list[i].name);
j--;
}
}
list[i].price = temp_price;
strcpy_s(list[i].no, temp_no);
strcpy_s(list[i].name, temp_name);
fastSort(l, i - 1);
fastSort(i + 1, r);
}
}
void BookList::bookDeWeight()
{
for (int i = 0; i < length - 1; i++)
for (int j = i + 1; j < length; j++)
if (strcmp(list[i].no, list[j].no) == 0)
deleteBook(j);
cout << endl << "去重已完成" << endl;
printList();
}
BookInf_Management.cpp
#include "BookList.h"
//用户交互界面
void userWindow()
{
BookList demo;
int flag = 1,choose;
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 << "9.退出" << endl;
while (flag)
{
cout << endl;
cout << "请输入序号选择操作:";
cin >> choose;
cout << endl;
switch (choose)
{
case 1:demo.printList(); break;
case 2:demo.priceChanged(); break;
case 3:demo.getExpensive(); break;
case 4:demo.findFavourite(); break;
case 5:demo.insertBooks(); break;
case 6:demo.deleteBook(); break;
case 7:demo.bookDeWeight(); break;
case 8:
{
int len = demo.getLength();
demo.fastSort(0, len - 2);
demo.printList();
break;
}
case 9:flag = 0; break;
default:break;
}
}
}
int main()
{
userWindow();
return 0;
}