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

(一)实验内容

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

  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 本图书的信息(书号、

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

位小数。

输入样例:

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;
}

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I 摘要 随着计算机的普及和网络的出现,对信息的需求日益增加,图书馆业务受到 了强烈的冲击,传统的手工管理方式已不能适应现在的信息化社会。如何利用现 有的科学技术条件提高图书信息的管理效率是我们当下要考虑的问题。图书信息 管理系统是典型的信息管理系统,其开发主要包括前端应用程序的设计和后台数 据库的建立及维护两方面。对于前者,要求应用程序功能完备,易于使用;而对于 后者,则要求数据库具有一致性、完整性、安全性等特点。 本课题的研究方法是采取实地考察,调查本市各高校图书馆和市图书馆的图 书管理系统,同时结合大量的参考资料。在图书信息管理系统中,因为涉及内容 比较多,所以在初步的数据库设计中会存在着遗漏的地方,对于这种问题主要通 过查看参考书来解决问题。另外一个存在问题比较多的地方是数据库的实现,比 如编程,对于这个问题只能通过多练习一些简单的编程,同时积极地利用图书馆 和网络资源,多查阅一些相关资料,多和老师、同学交流讨论。 本文对系统的开发工具Delphi7.0及数据库开发语言MS SQL Server2000、SQL 语言原理等知识进行深入的探讨之后,主要阐述了图书信息管理系统的开发背景 和发展趋势、需求分析、功能模块划分、数据库设计、各功能模块的实现方法及 过程等,并对所开发系统中的用户信息和图书信息的添加、删除、修改、查询等 功能界面的设计实现作了详细阐述。本系统能够满足基本图书信息管理的需求, 保证图书管理的安全性。 但是该系统还有许多不尽人意的地方,比如用户界面设计不够美观,系统实 现的功能安排也不够合理。系统的统计设计也只有单一时间的统计等,这些都有 待改进。从系统维护与运行上讲,该系统不能在线对功能进行升级,只适用于单 机运行。 图书信息管理系统的开发是一项细腻而又复杂的工作,所以它要求设计者要 有总体规划的能力,还要有百倍的耐心去做,在设计方面一点都不能马虎。图书 信息管理系统的发展趋势就是从单机版向网络版发展,逐步进入数字化管理。 关键词:图书信息管理系统,Delphi7.0开发工具,数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值