图书管理系统(顺序表实现)

这个博客展示了如何实现一个图书管理系统,包括创建图书信息表、排序、修改价格、逆序存储、查找最贵和最爱图书、定位最佳位置、新书入库、旧书出库、去重等功能。通过示例代码详细解释了每个操作的实现过程。

图书信息表包括以下10项常用的基本操作:图书信息表的创建和输出、排序、修改、逆序存储、最贵图书的查找、最爱图书的查找、最佳位置图书的查找、新图书的入库、旧图书的出库、图书去重。

代码:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
//函数结果状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status是函数返回值类型,其值是函数结果状态代码 
typedef int Status; 
#define MAXSIZE 100
struct BOOK
{
	string ib;//isbn
	string name;//名字 
	float price;//价格 
};
typedef struct
{
	BOOK *elem;//存储空间的基地址 
	int length; //当前长度 
} SqList;
//1、创建一个图书信息表 
Status CreateTheList(SqList &L)
{
	L.elem = new BOOK[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间 
	if(!L.elem) exit(OVERFLOW);//存储分配失败退出 
	L.length = 0;//将长度初始化为0 
	return OK;
}
//3.根据图书价格对图书信息表进行降序排序
Status SortTheList(SqList &L)
{
	//让每一个数据与其后面的价格都进行对比,若价格小于其后面的便进行交换,以保证价格小的在后面 
    for(int i=0;i<L.length;++i)
	{
        for(int j=i+1;j<L.length;++j)
		{
            if(L.elem[i].price<L.elem[j].price)
			{
                BOOK temp;
                temp=L.elem[i];
                L.elem[i]=L.elem[j];
                L.elem[j]=temp;
            }
        }
    }
    cout<<"排序成功"<<endl;
}
//4.修改图书信息表
Status ChangeTheList(SqList &L)
{
	//求平均值 
	float total=0;
	for(int i=0;i<L.length;i++)
	{
		total += L.elem[i].price;
	}
	float ave=total/L.length;
	cout<<"平均价格为:"<<ave<<endl; 
	//修改每本图书的价格 
	for(int i=0;i<L.length;i++)
	{
		if(L.elem[i].price>ave)
			L.elem[i].price *= 1.1;
		else
			L.elem[i].price *= 1.2;
	}
	cout<<"修改成功"<<endl; 
}
//5.实现该图书信息表的逆序存储
Status ReverseTheList(SqList &L)
{
	//将第一个元素与最后一个交换位置,第二个与倒数第二个交换,以此类推 
	for(int i=0;i<L.length/2;i++)
	{
		BOOK temp;
		temp = L.elem[i];
		L.elem[i] = L.elem[L.length-1-i];
		L.elem[L.length-i-1] = temp;
	}
	cout<<"逆序存储成功"<<endl;
}
//6.查找图书信息表中最贵的图书
Status TheExpensiveBook(SqList &L)
{
	//先找最贵的价格 
	float max=0;
	int i,number=0;
	for(i=0;i<L.length;i++)
	{
		if(L.elem[i].price>max)
			max=L.elem[i].price;
	}
	cout<<"图书最贵的价格为:"<<max<<endl;
	//再遍历图书表寻找价格等于max的图书并输出 
	for(i=0;i<L.length;i++)
	{
		if(L.elem[i].price == max)
		{
			number++;
			cout<<setiosflags(ios::fixed);//设置小数点的位数 
			cout<<L.elem[i].ib<<" "<<L.elem[i].name<<" "<<setprecision(2)<<L.elem[i].price<<endl;
		}
	}
	cout<<"最贵的图书数量为:"<<number<<endl; 
}
//7.查找最爱的图书
Status TheFavouriteBook(SqList &L)
{
	int x;
	cout<<"请输入要查找的次数:"<<endl;
	cin>>x;//要找的书的数量 
	for(int i=1;i<=x;i++)
	{
		cout<<"请输入要查找的书名:"<<endl;
		string name1;
		cin>>name1;//输入书名
		int number=0;//记录与输入的书名相同的书的数量
		for(int j=0;j<L.length;j++)
		{
			if(L.elem[j].name == name1)
			{
				number++;
				cout<<setiosflags(ios::fixed);//设置小数点的位数 
				cout<<L.elem[j].ib<<" "<<L.elem[j].name<<" "<<setprecision(2)<<L.elem[j].price<<endl;
			}
		}
		if(number==0)
		{
			cout<<"抱歉,没有你的最爱!"<<endl;
		}
		else
		{
			cout<<"第"<<i<<"次输入的书名对应的书有:"<<number<<"本"<<endl; 
		}	
	}
}
//8.查找最佳位置上的图书
Status TheBestPosition(SqList &L)
{
	int x;
	cout<<"请输入要查找的次数:"<<endl;
	cin>>x;//要查找的次数 
	for(int i=1;i<=x;i++)
	{
		cout<<"请输入要查找的位置:"<<endl;
		int pos;
		cin>>pos;//输入位置 
		if(pos<=0 || pos>L.length)
		{
			cout<<"抱歉,最佳位置上的图书不存在!"<<endl;
		}
		else
		{
			cout<<setiosflags(ios::fixed);//设置小数点的位数 
			cout<<L.elem[pos-1].ib<<" "<<L.elem[pos-1].name<<" "<<setprecision(2)<<L.elem[pos-1].price<<endl;
		}
	}
}
//9.新图书入库
Status InsertABook(SqList &L)
{
	cout<<"输入要插入的位置:"<<endl;
	int x;
	cin>>x;//输入要插入的位置
	//判断位置是否合法 
	if(x<1 || x>L.length+1)
	{
		cout<<"抱歉,入库位置非法!"<<endl;
	}
	else
	{
		cout<<"输入要插入的图书信息:"<<endl;
		string ib1;
		cin>>ib1;
		string name1;
		cin>>name1;
		float price1;
		cin>>price1;
		BOOK e;//e包含要插入的书的信息 
		e.ib = ib1;
		e.name = name1;
		e.price = price1;
		//将插入位置之后的元素后移一位 
		for(int j=L.length-1;j>=x-1;j--)
		{
			L.elem[j+1]=L.elem[j]; 
		}
		L.elem[x-1]=e;//插入元素 
		L.length +=1;//表长加一
		cout<<"插入成功"<<endl;  
	}
}
//10.旧图书出库
Status DeleteABook(SqList &L,int x)
{
	//判断位置是否合法 
	if(x<1 || x>L.length)
	{
		cout<<"抱歉,出库位置非法!"<<endl;
	}
	else
	{
		//被删除元素之后的元素前移一位 
		for(int j=x;j<=L.length-1;j++)
		{
			L.elem[j-1]=L.elem[j]; 
		}
		L.length -=1;//表长减一
		cout<<"删除成功"<<endl;  
	}
}
//11.图书信息表去重
Status DeleteTheRepeat(SqList &L)
{
	int i,j;
	for(i=0;i<L.length;i++)
	{
		for(j=i+1;j<L.length;j++)
		{
			if(L.elem[i].ib == L.elem[j].ib)
			{
				DeleteABook(L,j+1);
				j=j-1;
			}
		}
	}
	cout<<"去重完成"<<endl;
	cout<<"(输出删除成功表示信息表中有重复的书籍存在)"<<endl;
}
//12.输出图书信息表 
Status PrintTheList(SqList &L)
{
	int i=0;
	cout<<"图书的数量为:"<<L.length<<endl;
	for(;i<L.length;i++)
	{
		cout<<setiosflags(ios::fixed);//设置小数点的位数 
		cout<<L.elem[i].ib<<" "<<L.elem[i].name<<" "<<setprecision(2)<<L.elem[i].price<<endl;
	}
}
int main()
 {
 	SqList l;
 	while(true){
 		cout<<"欢迎使用图书管理系统"<<endl;
 		cout<<"1.创建一个图书信息表"<<endl;
 		cout<<"2.录入图书信息"<<endl;
 		cout<<"3.根据图书价格对图书信息表进行降序排序"<<endl;
 		cout<<"4.修改图书信息表,修改规则如下:"<<endl; 
		cout<<"计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后打印该表"<<endl;
 		cout<<"5.实现该图书信息表的逆序存储"<<endl;
 		cout<<"6.查找图书信息表中最贵的图书"<<endl;
 		cout<<"7.查找最爱的图书"<<endl;
 		cout<<"8.查找最佳位置上的图书"<<endl;
 		cout<<"9.新图书入库"<<endl;
 		cout<<"10.旧图书出库"<<endl;
 		cout<<"11.图书信息表去重"<<endl;
		cout<<"12.输出图书信息表"<<endl;
		cout<<"13.退出系统"<<endl;
		cout<<"请输入您的选择:"<<endl;
		int x,i=0;
		cin>>x;
		switch(x){
			case 1:
				if(CreateTheList(l))
					cout<<"创建成功"<<endl;
				else
					cout<<"创建失败"<<endl; 
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 2:
				cout<<"请输入图书的信息:"<<endl; 
				while(true){
					//输入图书的信息
					string ib1;
					cin>>ib1;
					string name1;
					cin>>name1;
					float price1;
					cin>>price1;
					//判断是不是输入结束 
					if(ib1 =="0" && name1 =="0" && price1 == 0)
					{
						break;
					}
					//向后插入读入的图书信息 
					l.elem[i].ib = ib1;
					l.elem[i].name = name1;
					l.elem[i].price = price1;
					i++;//图书数量加一 
				}
				l.length = i; 
				cout<<"录入完毕"<<endl;
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 3:
				SortTheList(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 4:
				ChangeTheList(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 5:
				ReverseTheList(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 6:
				TheExpensiveBook(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 7:
				TheFavouriteBook(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 8:
				TheBestPosition(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 9:
				InsertABook(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 10:
				cout<<"输入要删除的书籍的位置:"<<endl;
				int x;
				cin>>x;//输入要删除的位置
				DeleteABook(l,x);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 11:
				DeleteTheRepeat(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 12:
				PrintTheList(l);
				cout<<"-------------------------------------------------------------"<<endl;
				break;
			case 13:
				exit(0);			
		}
	 }
 }

测试数据:

9787302257646  程序设计基础 25.00

9787302164340  程序设计基础第二版 20.00

9787302219972  单片机技术及应用 32.00

9787302219972  单片机技术及应用 32.00

9787302203513  单片机原理与技术应用 26.00

9787810827430  工业计算机控制技术原理与应用 31.00

9787811234923  汇编语言程序设计教程 21.00

9787811234923  汇编语言程序设计教程 21.00

运行结果:

创建与输出

 

对图书价格进行降序排序

 

修改图书价格

 

实现逆序存储

 

查找最贵图书

 

查找最爱的图书

 

查找最佳位置的图书

 

新图书入库

旧图书出库

 

图书信息去重(根据ISBN去重)

去重前书籍信息

 

去重后

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值