图书信息管理系统

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string>
using namespace std;
typedef struct BOOK{
	string ISBN;
	string name;
	int rate;
}BOOK;
typedef struct BOOK* ElemType;
typedef struct BookSystem* LinkBook;
typedef struct BookSystem{
	ElemType data;
	LinkBook next;
}BookSystem;
//初始化
void InitBook(LinkBook &B){
	B = new BookSystem;
	B->data = new BOOK;
	B->next = NULL;
	return;
}
//查找(名字)
LinkBook LocateBook(LinkBook B, string name){
	while (B){
		if (B->data->name == name)return B;
		B = B->next;
	}
	return NULL;
}
//插入(递归)
void InsertBook(LinkBook &B, BOOK e){
	if (!B){
		InitBook(B);
		*B->data = e;
	}
	else{
		InsertBook(B->next, e);
	}
	return;
}
//删除(名字)(递归)
void DeleteBook(LinkBook &B, string name,LinkBook f){
	//f是B父亲用来挂接
	if (!B)return;//未找到边界
	if (B->data->name == name){
		LinkBook q = B;
		B = B->next;
		if (f)
		f->next = B;
		delete q;
		return;
	}
	else{
		f = B;
		DeleteBook(B->next, name,f);
	}
	return;
}
//修改(名字)
void ChangeBook(LinkBook &B, string OLD,string NEW){
	LinkBook change = (LocateBook(B, OLD));
	if (change)
		change->data->name = NEW;
	else
		cout << "没有该书目"<<endl;
	return;
}
//找链尾
LinkBook LocateRear(LinkBook B){
	while (B->next)
		B = B->next;
	return B;
}
void swap(BOOK &a, BOOK &b){
	BOOK t = a;
	a = b;
	b = t;
	return;
}
//找枢轴
LinkBook GetPrivot(LinkBook start,LinkBook end){
	LinkBook p=start, q=p->next;
	BOOK t, key = *start->data;
	while (q!=end){
		while (q->data->ISBN.compare(key.ISBN) ==1&& q != end)
			q = q->next;
		if (q->data->ISBN.compare(key.ISBN)==-1){
			p = p->next;
			swap(*p->data,* q->data);
		}
	}
	swap(*start->data, *p->data);
	return p;
}
//排序
void QuickSortBook(LinkBook start,LinkBook end){
	if (start != end){
		LinkBook privot = GetPrivot(start, end);
		if (privot)
			QuickSortBook(start, privot);
		if (privot->next)
			QuickSortBook(privot->next, end);
	}
}
//计数
int LengthBook(LinkBook B){
	int len = 0;
	for (; B; len++)
		B = B->next;
	return len;
}
//输出
void OutPut(LinkBook B){
	if (!B){ cout << "空" << endl; return; }
	while (B){
		cout << B->data->ISBN << " " << B->data->name << " " << B->data->rate << endl;
		B = B->next;
	}
	return;
}
//菜单
void menu(LinkBook B){
	printf("1.Locate;2.Insert;3.Delete;4.Change;5.QuickSort;6.Length;7.OutPut;8.end\n");
	char op;
	ElemType temp=new BOOK,result=new BOOK;
	while (1){
		fflush(stdin);
		op = getchar();
		fflush(stdin);
		switch (op)
		{
		case '1':
			printf("查找(名字):");
			cin >> temp->name;
			if (LocateBook(B, temp->name)){
				*result = *LocateBook(B, temp->name)->data;
				cout << result->ISBN << " " << result->name << " " << result->rate << endl;
			}
				else
				cout << "未找到\n";
			break;
		case '2':
			printf("插入(IBSN/name/rate):");
			cin >> temp->ISBN >> temp->name >> temp->rate;
			InsertBook(B, *temp);
			break;
		case '3':
			printf("删除(name):");
			cin >> temp->name;
			DeleteBook(B, temp->name,NULL);
			break;
		case '4':
			printf("修改(名字 OLD/NEW):");
			cin >> temp->name>>result->name;
			ChangeBook(B, temp->name, result->name);
			break;
		case '5':
			printf("排序:\n");
			QuickSortBook(B, LocateRear(B));
			OutPut(B);
			break;
		case '6':
			printf("表长:%d\n", LengthBook(B));
			break;
		case '7':
			OutPut(B);
			break;
		case '8':
			return;
		default:
			cout << "WRONG\n";
			break;
		}
	}
}

int main(){
	LinkBook book=NULL;
	menu(book);
	system("PAUSE");
	return 0;
}

0.结构体

typedef struct BOOK{
	string ISBN;
	string name;
	int rate;
}BOOK;
typedef struct BOOK* ElemType;
typedef struct BookSystem* LinkBook;
typedef struct BookSystem{
	ElemType data;
	LinkBook next;
}BookSystem;

1.初始化

//初始化
void InitBook(LinkBook &B){
	B = new BookSystem;
	B->data = new BOOK;
	B->next = NULL;
	return;
}

2.查找(按名字)

//查找(名字)
LinkBook LocateBook(LinkBook B, string name){
	while (B){
		if (B->data->name == name)return B;
		B = B->next;
	}
	return NULL;
}

3.插入(递归)

注意

1.可以利用初始化函数
利用该节点空时就初始化然后填数来递归实现插入
2.用递归和引用传递的好处是
用next递归:InsertBook(B->next, e);
递归完函数后B也发生了变化且B的根不变

//插入(递归)
void InsertBook(LinkBook &B, BOOK e){
	if (!B){
		InitBook(B);
		*B->data = e;
	}
	else{
		InsertBook(B->next, e);
	}
	return;
}

4.删除(名字)(递归)(删除的是链表中先出现符合条件的的那个名字)

注意

1.被删除节点的父亲->next需要重新挂接到被删除节点的后导;若为根节点则无父亲,不需挂接
2.在改接了之后,要把被删除的节点的存储空间释放
3.找完未找到时需要一个边界if (!B)return;
4.用递归和引用传递的好处是
用next递归:DeleteBook(B->next, name,f);
递归完函数后B也发生了变化且B的根不变(若是根被删根就是变成next)
5.不能利用查找,因为直接查找并不知道其父亲是谁,无法挂接

void DeleteBook(LinkBook &B, string name,LinkBook f){
	//f是B父亲用来挂接
	if (!B)return;//未找到边界
	if (B->data->name == name){
		LinkBook q = B;
		B = B->next;
		if (f)
		f->next = B;
		delete q;
		return;
	}
	else{
		f = B;
		DeleteBook(B->next, name,f);
	}
	return;
}

5.修改(名字)(修改的是链表中先出现符合条件的的那个名字)

注意

可以利用查找函数:若NULL则是没有该数目,否则就直接修改

//修改(名字)
void ChangeBook(LinkBook &B, string OLD,string NEW){
	LinkBook change = (LocateBook(B, OLD));
	if (change)
		change->data->name = NEW;
	else
		cout << "没有该书目"<<endl;
	return;
}

6.排序(快排)

学习于

https://blog.csdn.net/otuhacker/article/details/10366563

6.1注意

1.string字符串的比较若><=不能用时就用A.compare(B):大于就是1;等于就是0;小于就是-1

6.2原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.3链表可以做单边的快排

1即q=start,p=q->next;其中p,q之间的数大于关键字,p之前的数小于关键字,最后把start的值和p交换让p作为枢轴
2按照枢轴分成左右表递归执行快排直到左右表空结束

6.4其中子函数的作用

1.找链尾:为了一开始的start和end
2.找枢轴:就是一次快排,再通过枢轴分成左右表递归执行快排
3.swap:交换两个的值

//找链尾
LinkBook LocateRear(LinkBook B){
	while (B->next)
		B = B->next;
	return B;
}
void swap(BOOK &a, BOOK &b){
	BOOK t = a;
	a = b;
	b = t;
	return;
}
//找枢轴
LinkBook GetPrivot(LinkBook start,LinkBook end){
	LinkBook p=start, q=p->next;
	BOOK t, key = *start->data;
	while (q!=end){
		while (q->data->ISBN.compare(key.ISBN) ==1&& q != end)
			q = q->next;
		if (q->data->ISBN.compare(key.ISBN)==-1){
			p = p->next;
			swap(*p->data,* q->data);
		}
	}
	swap(*start->data, *p->data);
	return p;
}
//排序
void QuickSortBook(LinkBook start,LinkBook end){
	if (start != end){
		LinkBook privot = GetPrivot(start, end);
		if (privot)
		QuickSortBook(start, privot);
		if (privot->next)
		QuickSortBook(privot->next, end);
	}
}

7.计数

//计数
int LengthBook(LinkBook B){
	int len = 0;
	for (; B; len++)
		B = B->next;
	return len;
}

8.输出

//输出
void OutPut(LinkBook B){
	if (!B){ cout << "空" << endl; return; }
	while (B){
		cout << B->data->ISBN << " " << B->data->name << " " << B->data->rate << endl;
		B = B->next;
	}
	return;
}

9.菜单

注意

1.fflush(stdin);是清空键盘缓存区stdin的

fflush(stdin);
		op = getchar();
		fflush(stdin);

这样之前多余的键盘缓存区的内容不会被getchar()吸收,之后的多余输出也不会影响操作中输入的数据,确保了op吸收了输出的一串字符中的第一个,其他的都被清空了(包括\n)
2.赋值注意一定要加星号键,以免把地址赋出去,因为temp,result是所有操作暂存数的地方,但是地址都不变

//菜单
void menu(LinkBook B){
	printf("1.Locate;2.Insert;3.Delete;4.Change;5.QuickSort;6.Length;7.OutPut;8.end\n");
	char op;
	ElemType temp=new BOOK,result=new BOOK;
	while (1){
		fflush(stdin);
		op = getchar();
		fflush(stdin);
		switch (op)
		{
		case '1':
			printf("查找(名字):");
			cin >> temp->name;
			if (LocateBook(B, temp->name)){
				*result = *LocateBook(B, temp->name)->data;
				cout << result->ISBN << " " << result->name << " " << result->rate << endl;
			}
				else
				cout << "未找到\n";
			break;
		case '2':
			printf("插入(IBSN/name/rate):");
			cin >> temp->ISBN >> temp->name >> temp->rate;
			InsertBook(B, *temp);
			break;
		case '3':
			printf("删除(name):");
			cin >> temp->name;
			DeleteBook(B, temp->name,NULL);
			break;
		case '4':
			printf("修改(名字 OLD/NEW):");
			cin >> temp->name>>result->name;
			ChangeBook(B, temp->name, result->name);
			break;
		case '5':
			printf("排序:\n");
			QuickSortBook(B, LocateRear(B));
			OutPut(B);
			break;
		case '6':
			printf("表长:%d\n", LengthBook(B));
			break;
		case '7':
			OutPut(B);
			break;
		case '8':
			return;
		default:
			cout << "WRONG\n";
			break;
		}
	}
}
图书管理系统其实是一个很复杂的信息管理系统,它包括很多分类、检索等方面的内容。因为其复杂性,建立这样一个系统更加能体现出运用SQL Server数据库进行数据处理的优越性。本课题将实现一个简化的图书管理系统的功能。 1.系统功能设计 (1)信息录入功能 1)添加新图书信息。当图书馆收藏新图书时,系统向用户提供新图书信息录入功能,由于同一种书可能会有多本,因此,新图书的信息有两类:某一个ISBN类别的图书信息,包括:ISBN书号、图书类别、书名、作者、出版社、出版日期、价格、馆藏数量、可借数量、图书简介;另一个具体到每一本书的信息,包括:ISBN书号、图书书号、是否可借。每一个ISBN书号和同一个ISBN书号的多本书之间是一对多的关系,每一本书的图书书号是唯一的。 2)添加者信息。用于登记新者信息。包括:借书证号、姓名、性别、身份证号、职称、可借数量、已借数量、工作部门、联系电话等。 3)借阅信息。用于登记者的借阅情况信息。包括:借书证号、借阅书号、借出日期、借阅期限、归还日期等信息。归还日期为空值表示该图书未归还。 (2)数据修改和删除功能 1)修改和删除图书信息。图书被借出时,系统需要更新图书信息的可借数量,当可借数量为0时,表示该图书都已被借出。当输入的图书信息有错误或需要进行必要更新时,可以修改图书信息;当一种图书所有馆藏图书都已损毁或遗失并且不能重新买到时,该图书信息需要删除。 2)修改和删除者信息。当者的自身信息发生变动,如部门间调动或调离本单位,或违反图书馆规定需要限制其可借阅图书数量时,需要修改者信息。 3)还书处理。者归还图书时,更新图书借阅信息表中的归还日期,者信息表中的已借数量及ISBN类别信息表中该图书的可借数量。 (3)查询和统计功能 1)图书查询功能。根据图书的各种已知条件来查询图书的详细信息,如书名、作者、出版社、ISBN书号等支持模糊查询。 2)者信息查询。输入者的借书证号、姓名、工作部门等信息,查询者的基本信息。对查询到的每一个者,能够显示其未归还的图书编号和书名。 3)查询所有到期未归还的图书信息。要求结果显示图书编号、书名、者姓名、借书证号码、借出日期等信息。 4)统计指定者一段时间内的某类图书或所有类别图书借阅次数及借阅总次数。 2.数据表的创建 根据功能要求的说明创建下列数据表: (1)图书ISBN类别信息表 图书ISBN类别信息表包括以下字段: ISBN书号、图书类别、书名、作者、出版社、出版日期、价格、馆藏数量、可借数量、图书简介。 (2)图书信息表 图书信息表包括以下字段: ISBN书号、图书书号、是否可借。 (3)者信息表 者信息表包括以下字段: 借书证号、姓名、性别、出生年月、身份证号、职称、可借数量、已借数量、工作部门、家庭地址、联系电话。 (4)借阅信息表(图书-者关系) 借阅信息表包括以下字段: 借书证号、借阅书号、借出日期、借阅期限、归还日期。 3.数据库完整性设计 设计者应认真分析和思考各个表之间的关系,合理设计和实施数据完整性原则。 1) 给每个表实施主键及外键约束。 2) 设定缺省约束。如性别。 3) 设置非空约束如图书信息表中的书名。 4) 实施CHECK约束。如ISBN类别表中的可借数量小于馆藏数量。 5) 实施规则。如身份证号码必须为15为或18位。 4.SQL Server数据库对象设计 1)设计一个存储过程,以图书编号为输入参数,返回借阅该图书但未归还的者姓名和借书证号。 2)者资料查询:设计一个有多个输入参数的存储过程,返回者的详细信息。设计另一存储过程并以者借书证号为输入参数,返回该者未归还的图书名称和图书编号。 3)到期图书查询:设计一个视图,返回所有逾期未归还的图书的编号、书名、者姓名等信息。 4)统计图书借阅次数:设计一个以两个日期作为输入参数的存储过程,计算这一段时间内各类别图书被借阅的次数,返回图书类别、借阅次数的信息。 5)加快数据检索速度,用图书编号为图书信息表建立索引。 6)为者信息表创建一个删除触发器,当一个者调出本单位时,将此者的资料从者信息表中删除。注意实施业务规则:有借阅书的者不得从者信息表中删除。 7)借阅处理:为借阅信息表设计INSERT触发器,在者借阅时更改ISBN类别信息表,且可借数量减1,图书信息表是否可借列的值变为“不可借”,者信息表中该类者已借阅数加1。 8)还书处理:为借阅信息表设计UPDATE触发器,在该表的归还日期列被更改后,将图书信息表的是否可借列的值变为“可借”,者信息表中已借数量减1及ISBN类别信息表中可借数量加1。
图书管理系统设计” 1、问题描述 定义图书类,属性有:书名、出版社、ISBN 号、作者、库存量、价格等信息和相关的 对属性做操作的行为。 主要完成对图书的销售、统计和图书的简单管理。 2、功能要求 (1)销售功能。购买书籍时,输入相应的 ISBN 号,并在书库中查找该书的相关信息。 如果有库存量,输入购买的册数,进行相应计算。如果库存量不够,给出提示信息,结束购 买。 (2)图书简单管理功能。 添加功能:主要完成图书信息的添加,要求 ISBN 号唯一。当添加了重复的编号时,则 提示数据添加重复并取消添加。 查询功能:可按书名、ISBN 号、作者、出版社进行查询。若存在相应信息,输出所查 询的信息,若不存在该记录,则提示“该标题不存在! ” 。 修改功能:可根据查询结果对相应的记录进行修改,修改时注意 ISBN 号的唯一性。 删除功能:主要完成图书信息的删除。输入要删除的 ISBN 号,根据编号删除该物品的 记录,如果该编号不在物品库中,则提示“该编号不存在” 。 (3)统计功能。 输出当前书库中所有图书的总数及详细信息;可按书的价格、库存量、作者、出版社进 行统计,输出统计信息时,要按从大到小进行排序。 (7)图书存盘:将当前程序中的图书信息存入文件中。 (8)出信息:从文件中将图书信息入程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deosiree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值