数据结构:实现图书信息管理系统

数据结构:顺序表实现图书信息管理系统

大一的数据结构实验拖延了相当长一段时间,最近老师终于让我们实验形式完成一次数据结构作业,我把自己的渣程序放在这里,希望能对肝实验的同学提供帮助,也希望各位大神路过的时候能指出我的不足

实验要求

一、基本要求

1、基于顺序存储结构的图书信息表的创建和输出定义一个包含图书信息(书号、书名、价格等)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

2、将图书按照价格降序排序,逐行输出排序后每本图书的信息。

3、将所有低于平均价格的图书价格提高 20%,所有高于或等于平均价格的图书价格提高 10%,最后逐行输出价格修改后的图书信息。

4、输出逆序存储后每本图书的信息。

5、查找价格最高的图书,输出相应图书的信息。

6、根据指定的最爱图书的名字,查找最爱的图书,输出相应图书的信息。

7、根据指定的最佳位置的序号,查找该位置上的图书,输出相应图书的信息。

8、将新图书插入到图书表中指定的位置上。

9、根据指定的待出库的旧图书的位置,将该图书从图书表中删除,最后输出
该图书出库后的所有图书的信息。

二、老师要求

1、尽量用同一个表实现上述功能

2、可自行增加该系统功能

三、个人附加功能

1、以彩色界面呈现该系统

2、可一键清空所有数据

3、可按作者查找书籍(作者名需完整)

4、读取文件中的书籍信息并存入系统

5、可临时输入数据

6、以保留两位小数形式显示价格(怎么感觉这么多余。。。)

实现代码

头文件以及定义顺序表和书籍结构

#include
#include
#include 
#include 
#include
#include
#include
#include
#define maxsize 30
using namespace std;
typedef struct {                                //定义结构体:book
	int num;                                    //序号
	char name[maxsize];                         //书名
    float price;                                //价格
    char writer[maxsize];                       //作者
    char time[11];                              //出版时间
}book;
typedef struct{
	book *data;                                 //数据存储域
	int length;                                 //长度域
}linklist;

创建空表

void init(linklist &L)           
{
	L.data=(book*)malloc(maxsize*sizeof(book));
	L.length=0;               //开创空间后再设置长度为0 
}

输出信息

void printflist(linklist &L)
{
	int i;
	for(i=0;i<L.length;i++)
	{
		cout<<L.data[i].num<<" 《"<<L.data[i].name<<"》 ¥"<<setiosflags(ios::fixed)<<setprecision(2)<<L.data[i].price;
		cout<<" 作者:"<<L.data[i].writer<<" 出版时间:"<<L.data[i].time;
		cout<<"\n";
	}
}

删除指定信息

bool deletelist(linklist &L,int i) 
{      
	int k;
	if(i<1||i>L.length+1)                   //指定元素位置过于奇特
	return false;
	for(k=i;k<=L.length;k++) 
	{
		L.data[k-1]=L.data[k];              //将后面元素依次前移 
	}
	L.length--;
	return true;
}

根据价格降序排列

void pricejiang(linklist &L)			//把*位置的‘<’改一下就是换一种顺序排列
{
	int i,j;
	int n=L.length; 
	linklist t; 
	for(i=0;i<n-1;i++)													
	{
		for(j=i+1;j<n;j++)
		{
			if(L.data[i].price<L.data[j].price)//*
			{
			t.data[0]=L.data[i];
			L.data[i]=L.data[j];
			L.data[j]=t.data[0];
			}
		}
	}
	cout<<"已完成排序:";
	printflist(L);
}

批量更改价钱(这功能。。。)

void moneychange(linklist &L)
{
	double sum=0;
	int i;
	for(i=0;i<L.length;i++)
	{
		sum+=L.data[i].price;
	}
	sum/=L.length;
	i=0;
	while(i<L.length)
	{
		if(L.data[i].price<sum)
		{L.data[i].price=L.data[i].price*6/5;}
		else
		{L.data[i].price=L.data[i].price*11/10;}
	}
	cout<<"已完成价格改动\n";
	printflist(L);
}

逆转排序

void blacktowhite(linklist &L)
{
	linklist S;
	init(S);
	int i,n=L.length;
	for(i=0;i<n;i++)
	{S.data[i]=L.data[i];}
	for(i=0;i<n;i++)
	{L.data[i]=S.data[n-i-1];
	deletelist(S,n-i);
	L.length++;}
	cout<<"逆置成功\n"; 
}

根据书名查找信息

void chaname(linklist &L)		//根据书名查找信息 
{
	int i,n=0; 
	char bookname[20];
	cout<<"请输入需要查找图书的书名:";
	cin>>bookname;
	int num=L.length;
	for(i=0;i<num;i++)
	{
		if(strcmp(L.data[i].name,bookname)==0)
		{
			n++;
			cout<<"查找成功! 该图书的信息为:\n"<<endl;
			cout<<L.data[i].num<<" ";
			cout<<" 《"<<L.data[i].name<<"》  "<<setiosflags(ios::fixed)<<setprecision(2)<<L.data[i].price<<"  "<<L.data[i].writer<<"  "<<L.data[i].time; 
		}
	}	
	 if(n==0)
	 	cout<<"查找失败!"<<endl;
}

根据作者查找信息

void chawriter(linklist &L)		//根据作者查找信息 
{
	int i,n=0; 
	char bookname[20];
	int num=L.length;
	cout<<"请输入需要查找图书的作者:";
	cin>>bookname;
	cout<<"查找结果"; 
	for(i=0;i<num;i++)
	{
		if(strcmp(L.data[i].writer,bookname)==0)
		{
			n++;
			cout<<L.data[i].num<<" ";
			cout<<L.data[i].name<<" "<<L.data[i].name<<"  价格:"<<L.data[i].price<<"  "<<L.data[i].time<<"出版  作者:"<<L.data[i].writer; 
		}
	}	
	 if(n==0)
	 	cout<<"查找失败!"<<endl;
}

插入元素

bool insert(linklist &L,int i,book &e)
{
	
	int j;
	if(i<1||i<L.length+1)//位置不合法,返回失败 
	{return false;}
	i--;//对应下标状态;
	for(j=L.length;j>i;j--)
	{L.data[j]=L.data[j-1];}//i后所有元素在顺序表上向后移动一位 
	strcpy(L.data[i].name,e.name);
	L.data[i].price=e.price;
	strcpy(L.data[i].writer,e.writer);//将e放入第i位 
	strcpy(L.data[i].time,e.time);
	L.length=L.length+1;
	return true;   
}

查找最贵的书

bool findmax(linklist &L)
{
	if(L.length=0)
	{return false;}
	int i=1,index=0;
	float exp=L.data[0].price;
	while(i<L.length)
	{
		if(L.data[i].price>exp)
		{
			exp=L.data[i].price;
			index=i;
		}
	}
	cout<<"最贵的图书信息如下:";
	cout<<L.data[index].num<<" 《"<<L.data[index].name;
	cout<<"》 ¥"<<L.data[index].price<<" 作者:"<<L.data[index].writer<<" 出版时间:"<<L.data[index].time;
}

输入信息

 bool input(linklist &L)
{
	cout<<"输入信息"; 
	char i;
	int y;
	int j,k;
	if(L.length>maxsize)
	{cout<<"库存已满";return false;}    
	else
	{for(;;y++){
		L.data[L.length].num=L.length+1;
		cout<<L.data[L.length].num<<"\n";
		cout<<"输入书籍名称:";cin>>L.data[L.length].name;
		cout<<"输入价格:";cin>>L.data[L.length].price;
		cout<<"输入作者:";cin>>L.data[L.length].writer;
		cout<<"输入出版时间:";cin>>L.data[L.length].time; 
		L.length++;
		cout<<"结束输入?\n 是(Y)   否(other)\n选择:";
		cin>>i;
		if(i=='y'||i=='Y') 
		{break;}
		if(L.length>maxsize)
		{
			cout<<"库存已达上限!";
			return false;
		}
	}
	}
	return true;
}

菜单函数与主函数

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<<"                    -12.输入数据-                    \n";
	cout<<"                       -0.退出-                      \n";
	cout<<"                  |请输入选择:";
}
int main()
{
	linklist L;
	book e;
	init(L);
	int choice;
	do{
		char a;
		system("cls");                  //刷屏函数,用于返回主菜单,保持页面整洁
		system("color E0");             //页面颜色为黄底黑字
		meau();
		cin>>choice;
		switch(choice){
			case 1:init(L); input(L); break;
			case 2:cout<<"分别输入书名、价格、作者、出版时间:"; cin>>e.name>>e.price>>e.writer>>e.time;
			       cout<<"想插入到第几个位置?"; 
				   cin>>e.num; 
				   insert(L,e.num,e); break;
			case 3:printflist(L);
			       cout<<"输入需要删除数据的编号:";
			       int z; cin>>z;
			       if(deletelist(L,z)==1)
			       cout<<"删除成功!";
			       else 
				   cout<<"数据非法!!!";cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 4:for(int i1=1;i1<=L.length;i1++)
			      {deletelist(L,i1);}
			       cout<<"已删除所有数据";
			       cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 5:
			       break;
			case 6:printflist(L); 
			       cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 7:moneychange(L); cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 8:chaname(L); cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 9:chawriter(L); cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 10:blacktowhite(L); cout<<"按b键退出\n"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 11:pricejiang(L);  cout<<"按b键退出"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
			case 12:input(L);   cout<<"按b键退出"; cin>>a;
				   if(a=='b'||a=='B'){
				   	break;
				   }
		}
	}while(choice!=0);	
	return 0; 
}

运行结果
数据结构:实现图书信息管理系统_第1张图片
上述界面按Y之后
数据结构:实现图书信息管理系统_第2张图片
数据结构:实现图书信息管理系统_第3张图片

实验结果与分析

该程序历时3小时完成,其中我遇到了较多困难,如文件无法读入、程序运行时崩溃、显示信息时只显示了乱码等情况,程序前期运行过程中有很多的失误,导致了效率低下;但最终我还是通过询问老师,查阅书籍等方式改正了错误,实验结果的正确性也得到了验证。虽说可能仍存在一些不足之处,我也会虚心接受,在过程中力求做到尽可能的完善

你可能感兴趣的:(数据结构,算法,c++)