目录
实验一:图书信息管理系统的设计与实现
1.1实验内容
设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
- 根据指定图书个数,逐个输入图书信息;
- 逐个显示图书表中所有图书的相关信息;
- 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
- 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
- 能统计表中图书个数;
- 实现图书信息表的图书去重;
- 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
- 图书信息表按指定条件进行批量修改;
- 利用快速排序按照图书价格降序排序;
- 实现最贵图书的查找;
1.2算法实现方案
1.2.1实验流程图
1.2.2结构体定义
typedef struct {
char no[8]; //8位书号
char name[20]; //书名
int price; //价格
}Book;
typedef struct LNode{
Book data; //数据域
struct LNode *next; //指针域
}*LinkList;
1.2.3函数实现
1.菜单函数
void meau()
{
cout << " 欢迎来到图书管理系统 \n";
cout << "----------------------------------------------------\n";
cout << " * 1.录入图书 *\n";
cout << " * 2.显示所有图书的信息 *\n";
cout << " * 3.插入图书 *\n";
cout << " * 4.删除图书 *\n";
cout << " * 5.统计数量 *\n";
cout << " * 6.图书去重 *\n";
cout << " * 7.查找最喜欢图书 *\n";
cout << " * 8.图书价格修改 *\n";
cout << " * 9.图书价格排序 *\n";
cout << " * 10.最贵图书的查找 *\n";
cout << " * 11.退出系统 *\n";
cout << " * 0.退出 *\n";
cout << "----------------------------------------------------\n";
cout << " 请输入选择:";
}
2.基于链式存储的图书信息表的图书去重
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。
总计输出m+1行(m<=n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。
void deleteRepetitionBook(LinkList Head,LinkList Rear) { //图书去重
LinkList p = Head->next,q; //前后指针遍历链表
while (p) {
q = p;
while (q->next ) {
if (strcmp(p->data.no, q->next->data.no) == 0) { //判断图书书名是否相同
if (q->next == Rear)Rear = q;
q->next = q->next->next;
}
else q = q->next;
}
p = p->next;
}
numBook(Head);
printBook(Head);
}
3.基于链式存储结构的图书信息表的旧书出库
读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。输入待出库的旧图书的书号;若删除成功,输出旧图书出库后所有图书的信息(书号、书名、价格),每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。若删除失败,只输出以下提示:出库失败,未找到该图书!
void deleteBook(LinkList Head,LinkList Rear) { //删除某一书号的图书
LinkList p = Head;
char ch;
char num[8];
bool t = true;
int tag = 0;
while (t) {
if (Head->next == NULL) {
cout << "暂无图书,删除失败!" << endl;
return;
}
cout << "请输入待删除图书的书号:";
cin >> num;
while (p->next != NULL) {
if (strcmp(p->next->data.no,num) == 0) {//等于0,则俩相同
tag = 1;
if (p->next == Rear)Rear = p;//图书在最后一本的删除操作
p->next = p->next->next;//删除操作
}
else p = p->next;
}
if (tag == 1) {
tag = 0;
printBook(Head);
}
else cout << "出库失败,未找到该图书!"<<endl;
cout << "是否继续删除?(Y为继续,其它退出)";
cin >> ch;
if (ch != 'y')t = false; //输入y表示继续删除,否则结束删除
}
}
4.基于链式存储结构的图书信息表的新书入库
读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。总计n+1行,首先输入第1行,内容仅为一个整数,代表待入库的新图书的位置序号,然后输入n行,内容为新图书的信息,书号、书名、价格用空格分隔。
输出若插入成功,输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。若插入失败,只输出以下提示:抱歉,入库位置非法!
void inputBook(LinkList Head, LinkList &Rear) { //录入图书
LinkList temp;
char ch;
int n = 1;//计数用
while (true) {
temp=getpch(LNode);
cout<<"请输入第"<<n<<"本书的书号:";
cin>>temp->data.no;
cout<<"请输入第"<<n<<"本书的书名:";
cin>>temp->data.name ;
cout<< "请输入第" << n << "本书的价格:";
cin>> temp->data.price ;
temp->next = NULL;
Rear->next = temp;
Rear = temp;//尾插法
n++;
cout << "是否继续录入?(Y为继续,其它退出)";
cin >> ch;
if (ch != 'y')break;
}
}
5.基于链式存储结构的图书信息表的最爱图书的查找
读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。输入1行,为每次待查找的最爱图书名字。若查找成功,输出k+1行,对于每次查找,第一行是最爱图书数目,同一书名的图书可能有多本,后K行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。若查找失败:只输出以下提示:抱歉,没有你的最爱!
void favoriteBook(LinkList Head) { //按书名查找
LinkList p = Head->next;
int n = 0, tag = 0;
char num[21];
cout << "请输入最爱图书的书名:";
cin >> num;
while (p) {
if (strcmp(p->data.name, num) == 0) {
printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ', p->data.price, '\n');
tag = 1;
n++;
}
p = p->next;
}
if (tag == 0)
cout << "抱歉,没有你的最爱!" << endl;
cout<<n<<endl;
}
6.基于链式存储结构的图书信息表的最贵图书查找
读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。输出总计 m+1 行,其中,第 1 行是最贵的图书数目,(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
void expensiveBook(LinkList Head) { //最贵图书的查找
LinkList p = Head->next;
double maxprice = 0; //最贵图书的价格
while (p) {//第一次遍历找出最贵图书
if (p->data.price > maxprice)
maxprice = p->data.price;
p = p->next;
}
p = Head->next;
while (p) {//第二次遍历找出和最贵图书相等的图书
if (p->data.price == maxprice) //若价格与最贵价格相等则打印信息
printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ',
p->data.price, '\n');
p = p->next;
}
}
7.基于链式存储结构的图书信息表的修改
读入图书信息表,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。输出总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
void changepriceBook(LinkList Head) { //图书信息表价格的修改
LinkList p = Head->next;
double allprice = 0; //平均价格
while (p) {//第一遍遍历,得到平均价格
allprice += p->data.price;
p = p->next;
}
allprice /= numBook(Head);
p = Head->next;
while (p) {//第二遍价格,价格改动
if (p->data.price < allprice)p->data.price *= 1.2; //小于平均价格价格上涨20%
else p->data.price *= 1.1; //大于等于平均价格上涨10%
p = p->next;
}
printBook(Head);
}
1.3完整代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define getpch(type) (type*)malloc(sizeof(type))
typedef struct {
char no[8]; //书号
char name[20]; //书名
double price; //价格
}Book;
//链表的定义:
typedef struct LNode{
Book data; //数据域
struct LNode *next; //指针域
}*LinkList;
int numBook(LinkList Head) {//链表长度
int n=0;
LinkList temp=Head->next;
if(temp==NULL) return 0;
while(temp!=NULL) {
n++;
temp=temp->next;
}
cout << "当前存有" << n << "本书" << endl;
return n;
}
void inputBook(LinkList Head, LinkList &Rear) { //录入图书
LinkList temp;
char ch;
int n = 1;//计数用
while (true) {
temp=getpch(LNode