目录
(一)实验内容
(二)实验目的
(三)实验主要数据类型定义
(四)系统功能概述
(五)实验代码
(六)实验内容展示
(一)实验内容
设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
- 根据指定图书个数,逐个输入图书信息;
- 逐个显示图书表中所有图书的相关信息;
- 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
- 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
- 能统计表中图书个数;
- 实现图书信息表的图书去重;
- 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
- 图书信息表按指定条件进行批量修改;
- 利用快速排序按照图书价格降序排序;
- 实现最贵图书的查找
(二)实验目的
- 了解并掌握数据结构和算法设计的方法,具备初步的独立分析和设计能力
- 初步掌握软件开发过程的问题分析分析、系统设计、程序编码和测试等基本方法和技能。
- 提高综合运用所学的理论知识和方法,独立分析和解决问题的能力。
- 训练用系统的观点和软件开发一般规范进行软件的开发,培养软件工作着所具备的科学工作方法和作风。
(三)实验主要数据类型定义
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*/
(六)实验内容展示