图书信息管理系统的设计与实现

目录

一、试验任务和要求

二、算法实现方案

1.基于顺序存储结构的图书信息表的创建和输出

2.基于顺序存储结构的图书信息表的修改

3.基于顺序存储结构的图书信息表的最贵图书查找

4.基于顺序存储结构的图书信息表的最爱图书的查找

5.基于顺序存储结构的图书信息表的新书入库

6.基于顺序存储结构的图书信息表的旧书出库

7.基于顺序存储结构的图书信息表的图书去重

三、设计程序的主要功能

1.图书基本信息添加模块

2.图书基本信息查询模块

3.图书基本信息修改模块

4.图书基本信息删除模块

四、程序中所用的数据结构

1.链表操作

2.顺序存储结构

五、算法的伪代码 

 六.算法代码

1.book.cpp

2.book2.cpp

3.book.h



一、试验任务和要求

      设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。该系统至少包含以下功能:

  1. 根据指定图书个数,逐个输入图书信息;
  2. 逐个显示图书表中所有图书的相关信息;
  3. 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
  4. 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
  5. 能统计表中图书个数;
  6. 实现图书信息表的图书去重;
  7. 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
  8. 图书信息表按指定条件进行批量修改;
  9. 利用快速排序按照图书价格降序排序;
  10. 实现最贵图书的查找;

二、算法实现方案

1.基于顺序存储结构的图书信息表的创建和输出

定义一个包含图书信息(书号、书名、价格)的顺序表。读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

输入

输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计 n+1 行,第 1 行是所创建的图书表中的图书个数,后 n 行是 n 本图书的信息(书号、

书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两

位小数。

2.基于顺序存储结构的图书信息表的修改

读入图书信息表,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。

输入

输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

3.基于顺序存储结构的图书信息表的最贵图书查找

读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。

输出

总计 m+1 行,其中,第 1 行是最贵的图书数目,(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

4.基于顺序存储结构的图书信息表的最爱图书的查找

读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。

输入

输入1行,为每次待查找的最爱图书名字。

输出

若查找成功,输出k+1行,对于每次查找,第一行是最爱图书数目,同一书名的图书可能有多本,后K行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。若查找失败:只输出以下提示:抱歉,没有你的最爱!

5.基于顺序存储结构的图书信息表的新书入库

读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。

输入

总计n+1行,首先输入第1行,内容仅为一个整数,代表待入库的新图书的位置序号,然后输入n行,内容为新图书的信息,书号、书名、价格用空格分隔。

输出

若插入成功,输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若插入失败,只输出以下提示:抱歉,入库位置非法!

6.基于顺序存储结构的图书信息表的旧书出库

读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。

输入

输入待出库的旧图书的书号;

输出

若删除成功,输出旧图书出库后所有图书的信息(书号、书名、价格),每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若删除失败,只输出以下提示:出库失败,未找到该图书!

7.基于顺序存储结构的图书信息表的图书去重

出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。

输出

总计输出m+1行(m<=n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

三、设计程序的主要功能

1.图书基本信息添加模块

     首先输入图书录入的编号(不为0)判断是否有重复的编号,若有,则提示用户该书已存在,若无则继续录入书名、作者、出版社、单价。

图书信息管理系统的设计与实现_第1张图片

2.图书基本信息查询模块

     用户先选择图书查询方式(按书名查找或按书号查找)输入图书书名或书号后,查找出该图书是否存在,若存在,则显示该图书信息,若不存在则提示用户无此图书信息。

图书信息管理系统的设计与实现_第2张图片

3.图书基本信息修改模块

    用户输入要修改的书名,判断该书是否存在,若不存在,则提示用户无此图书信息;若存在,则提示用户选择修改项目,然后提示用户图书信息修改完成。

图书信息管理系统的设计与实现_第3张图片

4.图书基本信息删除模块

   读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。

四、程序中所用的数据结构

1.链表操作

搜索:通过简单的线性搜索在给定的链表中找到键为k的第一个元素,并返回指向该元素的指针

插入:在链接列表中插入一个密钥。插入可以通过3种不同的方式完成;在列表的开头插入,在列表的末尾插入,然后在列表的中间插入。

删除:从给定的链表中删除元素x。您不能单步删除节点。删除可以通过3种不同方式完成;从列表的开头删除,从列表的末尾删除,然后从列表的中间删除。

2.顺序存储结构

  • 插入算法的思路:

如果插入位置不合理,抛出异常;

如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;

从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;

将要插入元素填入位置i处;

表长加1。

  • 删除算法的思路:

如果删除位置不合理,抛出异常;

取出删除元素;

从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一 个位置;

表长减1。

五、算法的伪代码 

初始化书本

case 1:   //添加功能 
        输出图书信息的顺序,添加新的图书
                number++;
        for(int i=0;i

case 2:  //删除功能 
         输出要删除的第几本图书信息
                number--;
         if(del_num>number)
         输出没有该图书的信息当前库存共有
                number--;
         for(int i=del_num-1;i                 Book[i]=Book[i+1];
         for(int i=0;i

case 3:  //查询功能 
         输出将要查询的图书信息
         cin>>inspect_num;
         if(inspect_num>number)
         显示本图书信息不存在,请您重新输入

         要么
         输出的图书信息如下

case 4:  //修改功能
         输入需要修改的第几本图书信息

case 5:  //插入功能 
          输出您选择要插入新图书的位置
          if(inset_num<1||inset_num>number)
           输出输入的插入位置超出原有范围请重新输入
           for(int i=number;i>=inset_num;i--)
           Book[i]=Book[i-1];
          要么
           for(int i=number;i>=inset_num;i--)
           Book[i]=Book[i-1];
           输出将要插入新位置的图书相关信息(编号、书名、作者、出版社):
 

 六.算法代码

1.book.cpp

#include "book.h"
#include
#include
using namespace std;

#include"book.h"
#pragma once

SqList::SqList() {
	cout << "请分别输入书号,书名,价格" << endl;
		cout<<"如想结束,请连续输入0" << endl;
	length = 0;
	elem->price = 0;
	Book B[20];
	for (;; length++) {
		cin >> B[length].name;
		cin >> B[length].no;
		cin >> B[length].price;
		if (B[length].name[0] == '0' && B[length].no[0] == '0' && B[length].price == 0.0)
			break;
	}
	for (int i = 0; i < length; i++)
		elem[i] = B[i];
	cout << "请输入最喜欢书目的名字:";
	cin >> MostLove.name;
	MostLove.price = 0;
}

void SqList::Cout() {
	for (int len = 0; len < length; len++) {
		cout.setf(ios::fixed);
		cout << elem[len].name << '\t';
		cout << elem[len].no << '\t' << fixed << setprecision(2) << elem[len].price << endl;
	}
	cout << "~~~~~~~~" << endl;
}

void SqList::getMostExpensive() {
	double MostExpensive = 0.0;
	for (int len = 0; len < length; len++)
		if (MostExpensive < elem[len].price)
			MostExpensive = elem[len].price;

	cout << "~~~~~~~~~" << endl;
	for (int len = 0; len < length; len++)
		if (MostExpensive == elem[len].price)
			cout << "最贵书目为:" << elem[len].no << '\t' << fixed << setprecision(2) << elem[len].price << endl;
	cout << "~~~~~~~~~" << endl;

}

void SqList::getMostLove() {
	bool judge = 0;
	cout << "~~~~~~~~" << endl;
	for (int len = 0; len < length; len++)
		for (int i = 0; i < 13; i++)
		{
			if (MostLove.name[i] == elem[len].no[i] && i == 12)
			{
				cout << "最喜欢的书目为:" << elem[len].no << '\t' << fixed << setprecision(2) << elem[len].price << endl;
				judge = 1;
				break;
			}
			if (len == length - 1 && judge == 0)
			{
				cout << "抱歉,没有你喜欢的" << endl;
				break;
			}
			if (MostLove.name[i] != elem[len].no[i])
				break;
		}
	Cout();
}


void SqList::newBookInput(int place) {
	cout << "~~~~~~~~~~~~" << endl;
	if (place > length || place <= 0)
		cout << "抱歉,输入位置错误!" << endl;
	else {
		length++;
		for (int i = length; i > place; i--)
			elem[i] = elem[i - 1];
		cout << "请分别输入书号,书名,价格" << endl;
		cin >> elem[place].name;
		elem[place].name[13] = '\0';
		cin >> elem[place].no;
		cin >> elem[place].price;
		cout << "~~~~~~~~~~~~" << endl;
	}
	
}

void SqList::outPutOldBook(int place) {
	cout << "~~~~~~~~~~~~" << endl;
	if (place > length || place <= 0)
		cout << "出库失败,未找到该图书!" << endl;
	else {
		for (int i = place; i < length; i++)
			elem[i] = elem[i + 1];
		length--;
		cout << "出库成功!" << endl;
	
	}
}

void SqList::delRepet() {
	int times = 0;
	for (int len = 0; len < length - 1; len++)
		for (int i = len + 1; i < length; i++)
			for (int j = 0; elem[i].no[j] != '\0'; j++) {
				if (elem[i].no[j] != elem[len].no[j])
				{
					break;
				}
				else
					if (j == 12) {
						outPutOldBook(i);
						times++;
					}
			}
	cout << "重复的书目共有:" << times << "本" << endl;
	Cout();
}

2.book2.cpp

#include
#include
using namespace std;
#include"book.h"
int main() {
	SqList Sq;
	for (bool judge = 0; judge == 0;) {
		cout << "请选择:" << '\n' << "1、输出图书信息表" << '\n' << "2、最贵书目查找" << '\n' << "3、最喜欢书目查找" << '\n' << "4、新书入库" << '\n' << "5、旧书出库" << '\n' << "6、查找删除重复书目" << '\n' << "7、退出系统" << '\n';
		int judge_1;
		cin >> judge_1;
		switch (judge_1) {
		case 1:
			Sq.Cout(); break;
		case 2:
			Sq.getMostExpensive(); break;
		case 3:
			Sq.Cout();
			Sq.getMostLove(); break;
		case 4:
			Sq.Cout();
			cout << "请输入入库的书本位置在哪一行:" << endl;
			int place;
			cin >> place;
			Sq.newBookInput(place - 1);
			break;
		case 5:
			Sq.Cout();
			cout << "请输入出库的书本位置在哪一行:" << endl;
			int place_2;
			cin >> place_2;
			Sq.outPutOldBook(place_2 - 1);
			break;
		case 6:
			Sq.delRepet();
			break;
		default:
			break;
		}
		system("pause");
		system("CLS");
		if (judge_1 == 8)
			break;
	}
	cout << "谢谢使用!!!!" << endl;
	system("pause");
	return 0;
}

3.book.h

#ifndef LIST_H
#define LIST_H

typedef struct {
	char no[20];	//13位书号
	char name[40];	//书名
	double price;	//价格 
}Book;

class SqList
{
public:
	SqList();
	void Cout();	//输出所有书目 
	void getMostExpensive();//获取最贵的书目 
	void getMostLove();//最喜欢的书目 
	void newBookInput(int place);//新书入库 
	void outPutOldBook(int place);//旧书出库 
	void delRepet();
private:
	Book elem[100];
	Book MostLove;

};

#endif

你可能感兴趣的:(数据结构)