数据结构课程设计实验一:图书信息管理系统的设计与实现

2023-11-13

目录

(一)实验内容

(二)实验目的

(三)实验主要数据类型定义

(四)系统功能概述

(五)实验代码

(六)实验内容展示


(一)实验内容

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

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

(二)实验目的

  1. 了解并掌握数据结构和算法设计的方法,具备初步的独立分析和设计能力
  2. 初步掌握软件开发过程的问题分析分析、系统设计、程序编码和测试等基本方法和技能。
  3. 提高综合运用所学的理论知识和方法,独立分析和解决问题的能力。
  4. 训练用系统的观点和软件开发一般规范进行软件的开发,培养软件工作着所具备的科学工作方法和作风。

(三)实验主要数据类型定义

1.图书信息的定义:

typedef struct {

    char no[8];   //8位书号

    char name[20]; //书名

    int price;     //价格

}Book;

2.顺序表的定义:

typedef  struct {

  Book  *elem;     //指向数据元素的基地址

  int  length;       //线性表的当前长度                                                           

 }SqList;

3.链表的定义:

typedef struct LNode{

     Book   data;       //数据域

     struct LNode  *next;   //指针域

}LNode,*LinkList;  

(四)系统功能概述

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行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

(五)实验代码

LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H

#include <iostream>
#include <stdlib.h>
#include"string.h"
#include <string>
using namespace std;

typedef struct 
{
	char no[20];   
	char name[100];
	double price;   
}Book;

struct Node
{
	Node* Next;
	Book Data;
};

class LinkList
{
public:
	Node* H;
	LinkList();
	LinkList(Book* p, int n);
	LinkList(LinkList& l);
	int GetLen();
	Book GetData(int Pos);
	Node* MoveTo(int Pos);
	void Insert(Book Data, int Pos);
	~LinkList();
	void Cout();
	void Delete(int Pos);
	void Input();
	void duplicateRemoval();
	int findFavorite();
	void prisort();
	int getTheMostExpensive();
	int findTheBook();
};

#endif

LinkList.cpp

#include "LinkList.h"
#include<iostream>
using namespace std;

//默认构造函数 
LinkList::LinkList()
{
	H = new Node[1];
	H->Next = NULL;
}
//带参构造函数 
LinkList::LinkList(Book* p, int n)
{
	H = new Node[1];
	H->Next = NULL;

	for (int i = 0; i < n; i++)
		Insert(p[i], i + 1);
}
//拷贝构造函数 
LinkList::LinkList(LinkList& l)
{
	H = new Node[1];
	H->Next = NULL;

	int Len = l.GetLen();

	for (int i = 0; i < Len; i++)
	{
		Book Data = l.GetData(i + 1);
		Insert(Data, i + 1);
	}
}

LinkList::~LinkList()
{
	while (H->Next != NULL)
		Delete(1);

	delete[]H;
	H = NULL;
}

void LinkList::Insert(Book Data, int Pos)
{
	Node* p = new Node;
	p->Data= Data;
	Node* q = MoveTo(Pos - 1);

	p->Next = q->Next;
	q->Next = p;
}

Node* LinkList::MoveTo(int Pos)
{
	Node* p = H;
	for (int i = 0; i < Pos; i++)
		p = p->Next;
	return p;
}

Book LinkList::GetData(int Pos)
{
	Node* p = H;
	for (int i = 0; i < Pos; i++)
		p = p->Next;
	return p->Data;
}

int LinkList::GetLen()
{
	Node* p = H->Next;
	int Len = 0;
	while (p != NULL)
	{
		Len++;
		p = p->Next;
	}
	return Len;
}

void LinkList::Cout()
{
	for (Node* p = H->Next; p != NULL; p = p->Next)
	{
		cout << "书号为:";
		cout << p->Data.no << endl;
		cout << "书名为:";
		cout << p->Data.name << endl;
		cout << "价格为:";
		cout << p->Data.price << endl;
		cout << endl;
	}
}

void LinkList::Delete(int Pos)
{
	Node* p = MoveTo(Pos - 1);
	Node* q = p->Next;

	p->Next = q->Next;

	delete[]q;
}

void LinkList::Input()
{
	cout << "请按顺序输入图书号、图书名与图书价格(三项均为0时表示输入结束)" << endl;
	char a[20], b[100];
	double c;
	cin >> a >> b >> c;

	while (a != "0" && b != "0" && c != 0)
	{
		Book temp;
		strcpy_s(temp.no,a);
		strcpy_s(temp.name,b);
		temp.price = c;
		Insert(temp, GetLen()+1);
		cin >> a >> b >> c;
	}

}

void LinkList::duplicateRemoval()
{
	for (int i = 1; i <= GetLen(); i++)
	{
		for (int j = i+1; j <= GetLen(); j++)
		{
			double num1 = strtod(MoveTo(i)->Data.no, NULL);
			double num2 = strtod(MoveTo(j)->Data.no, NULL);
			if (num1==num2 )
			{
				Delete(j);
			}
		}
	}
}

void LinkList::findFavorite()
{
	int number= GetLen() / 2;
	char Name[100];
	cout << "请输入喜爱书籍书名" << endl;
	cin >> Name;
	int left, right;
	int mid;
	left = 1;
	right = GetLen();
	while (left <= right)
	{
		mid = left + (right - left) / 2;
		for (int i = left; i < mid; i++)
		{
			if (strcmp(Name, MoveTo(i)->Data.name) == 0)
			{
				right = mid - 1;
			}
		}
		if (strcmp(Name, MoveTo(mid)->Data.name) == 0)
		{
			cout << endl;
				cout << "喜爱书籍书号为" << MoveTo(mid)->Data.no << endl;
				cout << "喜爱书籍价格为" << MoveTo(mid)->Data.price << endl;
				return 1;
		}
		for (int i=right; i > mid; i--)
		{
			if (strcmp(Name, MoveTo(i)->Data.name) == 0)
			{
				left = mid + 1;
			}
		}
	}
}

void LinkList::prisort()
{
	Book key;
	int i, j;
	for (i = 1; i <= GetLen(); i++)
	{
		key = MoveTo(i)->Data;
		for (j = i - 1; j >= 0; j--)
		{
			if (MoveTo(j)->Data.price < key.price)
			{
				MoveTo(j+1)->Data = MoveTo(j)->Data;
			}
			else
				break;
		}
		MoveTo(j+1)->Data = key;//直到找到已排序的元素大于或者等于新元素的位置,将新元素插入到该位置后
	}
	Cout();
	cout << "排序完成!" << endl << endl;
	}



int LinkList::getTheMostExpensive()
{
	Node* p = H->Next;
	int Price = p->Data.price;
	while (p != NULL)
	{
		if (p->Data.price > Price)
		{
			Price = p->Data.price;
		}
		p = p->Next;
	}
	return Price;
}

int LinkList::findTheBook()
{
	Node* p = H->Next;
	int pos=1;
	while (p != NULL)
	{
		if (p->Data.price == getTheMostExpensive())
		{
			return pos;
		}
		p = p->Next;
		pos++;
	}
}

DataStructure1.cpp

#include <iostream>
#include"LinkList.h"
#include <stdlib.h>
#include <string>
using namespace std;

int main()
{
	LinkList Libirary;
	int push_botton = 1;
	while (push_botton)
	{
		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 << "9.按照图书价格降序排序" << endl;
		cout << "10.查找最贵图书" << endl;
		cout << "0.退出程序" << endl;
		cin >> push_botton;

		if (push_botton == 1)
		{
			Libirary.Input();
		}

		if (push_botton == 2)
		{
			Libirary.Cout();
		}

		if (push_botton == 3)
		{
			int a;
			char b[20], c[100];
			double d;
			cout << "请按顺序输入插入位置、图书号、图书名与图书价格" << endl;
			cin >> a >> b >> c>>d;
			Book temp;
			strcpy_s(temp.no, b);
			strcpy_s(temp.name, c);
			temp.price = d;
			Libirary.Insert(temp, a);
		}

		if (push_botton == 4)
		{
			int pos;
			cout << "请输入删除书籍位置" << endl;
			cin >> pos;
			Libirary.Delete(pos);
		}

		if (push_botton == 5)
		{
			cout << "图书馆书籍总数为" << Libirary.GetLen() << endl;
		}

		if (push_botton == 6)
		{
			Libirary.duplicateRemoval();
			cout << "以下为去重后的图书数据" << endl;
			Libirary.Cout();
		}

		if (push_botton == 7)
		{
			Libirary.findFavorite();
		}

		if (push_botton == 8)
		{
			int aver=0;
			for (int i = 1; i <= Libirary.GetLen(); i++)
			{
				aver = aver + Libirary.MoveTo(i)->Data.price;
			}
			aver = aver / Libirary.GetLen();
			Node* p = Libirary.H->Next;
			while (p != NULL)
			{
				if (p->Data.price < aver)
				{
					p->Data.price = p->Data.price * 1.2;
				}
				else
				{
					p->Data.price = p->Data.price * 1.1;
				}
				p = p->Next;
			}
			cout << "修改前平均价格为 " << aver << endl;
			Libirary.Cout();
		}

		if (push_botton == 9)
		{
			Libirary.prisort();
		}

		if (push_botton == 10)
		{
			cout << "最贵书籍为" << Libirary.MoveTo(Libirary.findTheBook())->Data.name << endl;
		}
	}

	return 0;
}
/*9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 32.00
0 0 0*/

(六)实验内容展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构课程设计实验一:图书信息管理系统的设计与实现 的相关文章

  • 判断字符串非空if(str!=null && str!=""){}

    熟手判断字符串非空一般都会做两次判断 if str null str 或者 if str null str length 0 或者 if str null str equals 为什么要这么麻烦呢 相信大家都遇到过空指针报错的情况 java
  • python异常模块raise的概念以及基本用法

    当程序出现错误 python会自动引发异常 也可以通过raise显示地引发异常 一旦执行了raise语句 raise后面的语句将不能执行 raise 用raise语句来引发一个异常 异常 错误对象必须有一个名字 且它们应是Error或Exc
  • 多视图综述以及图像检索

    1 1 算法分类 1 1 1 协同训练 该方法旨在最大限度地扩展所有观点的相互协议 并达成最广泛的共识 协同训练算法一般过程如图1所示 根据该过程对算法进行交替训练 利用先验信息或相互学习知识 使两种不同视图的一致性最大化 Co train
  • 秦九韶算法详解

    秦九韶算法 秦九韶算法是将一元n次多项式的求值问题转化为n个一次式的算法 比普通计算方式提高了一个数量级 普通算式 a x i 因为多次求幂 消耗了大量的计算时间 我们来分析一下秦九韶算法 例如 求 1 x 2x 2 3x 3 当x 2时的
  • MongoDB 数据库(一):MongoDB的介绍与安装

    目录 一 MongoDB数据库的介绍与安装 1 1 NoSQL数据库简介 1 2 MongoDB 简介 1 2 1 再议业务应用场景 1 2 2 为什么要使用 MongoDB 1 2 3 适用场景 二 安装和使用MongoDB客户端 2 1
  • C++新特性34_递归互斥量recursive_mutex与超时互斥量timed_mutex的使用(递归互斥量解决同一线程重复使用互斥量的需求;超时互斥量设置等待超时机制;解决互斥量阻塞问题)

    接上篇C 新特性33 死锁产生的原因及避免 线程在等待一个永远都不能成功的条件成立 从而进入到陷入休眠 永远不能被唤醒的状态 通过调整锁的使用顺序解决死锁问题 本篇将会学习互斥体的相关知识 C 新特性34 递归互斥量recursive mu
  • 测试开发面试题总结

    测试开发面试题 1 通过列表推导式完成下面数据类型转换 将 a 11 b 2 11 22 33 44 转换为以下格式 li1 a 11 b 2 11 22 33 44 2 Names python java php c c django u
  • 光控照明灯自动开关

    该光控照明灯自动开关电路采用继电器控制方式 可用来控制普通灯泡 日光灯 节能灯等多种照明灯具 可广泛用于车站 码头 机场等夜间需要连续照明的场所 电路结构与特点 如图所示光控照明灯自动开关电路 不仅具有结构简单 稳定可靠和安装方便等优点 而
  • LSTM这一篇就够了

    转自AI大本营https blog csdn net dQCFKyQDXYm3F8rB0 article details 82922386 短时记忆 NN 会受到短时记忆的影响 如果一条序列足够长 那它们将很难将信息从较早的时间步传送到后面
  • (2)Qt中的字符串类型

    字节数组 QByteArray 在Qt中QByteArray可以看做是C语言中 char 的升级版本 我们在使用这种类型的时候可通过这个类的构造函数申请一块动态内存 用于存储我们需要处理的字符串数据 1 构造函数 构造空对象 QByteAr
  • 记录一次合并单元格表格渲染错位问题。

    renderData this mergeSpanArr 系统名称合并的数组 this mergeSpanArrIndex 0 this zuhuSpanArr 租户合并列表 this zuhuSpanArrIndex 0 租户合并索引 l
  • 电脑怎么开启vt_华擎开启VT的方法

    第一步 重启电脑 屏幕亮起后不断按下 F2 键 进入BIOS页面 开机速度太快无法进入BIOS怎么办 第二步 在菜单中找到VT选项并开启 不同型号的主板 BIOS界面不相同 VT的叫法也不相同 1 进入BIOS页面后 找到 Advanced
  • 驾驭AI绘画:《AI魔法绘画》带你秒变顶级画手!

    同学们 抖音买家秀中的那些极具设计感的作品是怎么来的 你还在羡慕别人的绘画天赋 对着空白的画纸发呆吗 有没有想过将生硬的代码和灵动的艺术完美融合 有没有感到现代技术带来了戏剧性改变 从替代马车的汽车 到取代传统影像的数字摄影 再到今天的AI
  • Spring Expression Language(SpEL)实现ABAC鉴权模型, 动态计算实体的属性、操作类型、相关的环境来控制是否有对操作对象的权限

    author changjin wei 魏昌进 since 2022 11 26 ABAC授权模型 常用的授权模型 ABAC的访问控制 表达式语言 SpEL性能 ABAC实践 数据库设计 java程序 crud代码 security上下文
  • 使用jackson实现对象json相互转换(spring boot)

    之前的json转对象 对象转json 总是比较繁琐 不够简洁 自从接触到jackson之后 发现原来对象和json转换可以这么简单 拿一个天气预报的小例子来说明一下 如下图 若是有小误 还望指正 不说 直接上码 首先 在pom xml里弄好
  • 图像分辨率测试ISO12233 - 2017中文翻译

    译者序 目前的摄像头分辨率的测试 大多遵循ISO 12233标准 最近下载一份英文版的文档 和大家一起分享 仅供学习使用 目录 ISO 12233 Third Edition 2017 01 Foreword 前言 Introduction
  • Ant Design pro入门

    Ant Design pro入门 前言 一 了解Ant Design pro 二 使用步骤 1 快速入门 2 ant pro菜单 路由 前言 读此文章需要优先掌握知识 1 React 2 ts 3 Ant Design 一 了解Ant De
  • NLP学习(一)基础篇

    一 前言 2016年3月9日至15日和2017年5月23日至27日 分别在韩国首尔和中国嘉兴乌镇 韩国围棋九段棋手李世石 中国围棋九段棋手柯洁与人工智能围棋程序 阿尔法围棋 AlphaGo 之间的两场比赛 人类均以失败告终 更是激起了各种
  • 深度学习课程设计

    1 安装TensorFlow windows 命令窗口 pip install tensorflow 我之前已经安装过python 可能是因为安装python也安装了pip所以可以直接使用pip命令 之前下载过pycharm 但是没有激活
  • Ubuntu系统下pycharm导入numpy、sklearn等各类包的方法

    本方法适用于无法导入numpy pandas matplotlib sklearn等包 1 打开pycharm 点击左上角file gt setting gt Project gt Python Interpreter 2 点击 号后显示下

随机推荐