数据结构--李冬梅老师数据结构数据结构先修知识---C语言复习大作业

C语言复习大作业图书信息管理系统★★★★★

【问题描述】

读取给定的图书文件book.txt中的信息(book.txt中部分图书信息如下图所示),完成一个图书信息管理系统,该系统的各个功能模块要求利用菜单选项进行选择。

【系统功能要求】

(1)图书浏览

读取book.txt中的文件信息并依次输出所有图书信息(书号、书名、价格),包括文件前两行的标题说明信息。

(2)图书统计

统计book.txt中的图书总数n并输出。

(3)图书插入

根据指定的位置i(1≤i≤n+1)和给定的一本图书信息,将该图书插入到位置i,并将变化后的图书信息回写到book.txt。

(4)图书删除

根据指定的位置i(1≤i≤n),删除该位置上的图书信息,并将变化后的图书信息回写到book.txt。

(5)图书查找

① 按位置进行查找:根据输入的位置i(1≤i≤n),查找位置i上的图书信息并输出;

② 按书名进行查找:根据输入的书名,查找该图书的信息并输出(如果有多本,则全部输出)。

(6)价格更新

将价格小于45元的图书价格提高20%,价格大于等于45元的图书价格提高10%,将修改后的图书信息重新写入新文件book-newprice.txt中。

(7)价格排序

按图书价格升序排序,将排序后的图书信息重新写入新文件book-newsort.txt中。

(8)逆序存储

将book.txt中的全部图书逆序存储(即最后一本置于原第一本位置)写入新文件book-newinverse.txt中。

【数据结构要求】

图书数据类型的定义需要采用数据结构教材(参考文献[1])24页中的顺序表类型定义方式,如下所示。

【算法实现要求】

(1)正确性:在合理的数据输入下,能够在有限的运行时间内得到正确的结果。

(2)可读性:程序结构清晰,易于理解,程序要求具有规范的缩进格式,关键语句添加适当的注释,变量或函数名等标识符按照见名知义的原则命名。

(3)健壮性:当输入的数据非法时,能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。例如,查找不到时给出“图书不存在,查找失败”的提示,插入或删除位置非法时给出“指定位置非法”的提示等。

(4)高效性:分析每个算法的时间复杂度和空间复杂度,并确保时间高效和空间高效。

#include<iostream>
#include<fstream>				//读写文件的头文件
#include<iomanip>				//输出格式控制的函数setw的头文件
#include<string.h>				//需要用到strcmp函数
using namespace std;
#define SIZE 200				//用来存放图书数组的最大空间
int flag=0;						//为使程序具有健壮性,当图书数据输入后flag为1
int n;							//用来记录图书个数
typedef struct
{
	char no[15];
	char name[50];
	float price;
}Book;							//图书信息定义
void Input(Book BK[])
{//从键盘上输入图书数据
	int i=0;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>BK[i].no>>BK[i].name>>BK[i].price;
	flag=1;	
	cout<<"图书输入成功"<<endl;
	return;						//为使程序具有健壮性,图书数据读入后flag为1,当进行其他操作时通过flag可以判断是否已读入数据
								//如果不通过flag控制,程序一运行就选择2或3,此时没	有读入图书数据,无法输出或排序
} 
void Output(Book BK[])
{//逐个显示图书信息
	if(flag==0)
	{//程序健壮性的体现,通过flag判断是否读入图书信息
		cout<<"还没有读取图书信息,请选择(1)输入图书信息\n"<<endl;
		return;
	}
	for(int i=0;i<n;i++)		//逐行左对齐输出图书信息
	cout<<left<<setw(15)<<BK[i].no<<"\t"<<left<<setw(50)<<BK[i].name<<"\t"<<left<<BK[i].price<<endl;
	cout<<"\n信息显示完毕\n"<<endl; 
}
void Search(Book BK[])
{//查找满足条件的图书
	char bk_name[50];
	if(flag==0)
	{//程序健壮性的体现,通过flag判断是否读入图书信息
			cout<<"还没有读取图书信息,请选择(1)输入图书信息\n"<<endl;
			return;
	}
	cout<<"请输入要查找的书名:\n"<<endl;
	cin>>bk_name;
	int i=0;
	for(i=0;i<n;i++)
	{
		if(strcmp(bk_name,BK[i].name)==0)
		{//字符数组比较大小,相等时返回0
			cout<<"查找的图书信息为:\n"<<endl;
			cout<<BK[i].no<<"\t"<<BK[i].price<<endl;
			break;									//假设书名没有重复,所以找到一本后即可退出循环不必继续查找。如果												书名有重复,如何修改程序?
		}
	} 
	if(i==n)	cout<<"查找失败\n"<<endl;
}
void Max(Book BK[])
{													//输出价格最高图书信息
	Book b,BKNEW[SIZE];
	if(flag==0)
	{//程序健壮性的体现,通过flag判断书否读入图书信息
		cout<<"还没有读取图书信息,请选择(1)输入图书信息\n"<<endl;
		return;
	}
//下面是另一种求解最大值的方法,将最大数交换到数组的最后位置BK[n-1],比较此方法与e02.cpp的方法
	for(int i=0;i<n;i++)							//因为后面要对原来图书信息逆序存放,为不破坏原始数据,将原始数据复制到新数组BKNEW中
		BKNEW[i]=BK[i];
	for(int j=0; j<n-1;j++)
	{
		if(BKNEW[j].price>BKNEW[j+1].price)
		{
			b=BKNEW[j];
			BKNEW[j]=BKNEW[j+1];
			BKNEW[j+1]=b;
		}
	}
	cout<<"价格最高的图书信息为:\n"<<endl;
	cout<<BKNEW[n-1].no<<"\t"<<BKNEW[n-1].name<<"\t"<<BKNEW[n-1].price<<endl;
}
void Sort(Book BK[])
{
	Book b,BKNEW[SIZE];
	if(flag==0)
	{//按价格从低到高排序
		cout<<"还没有读取图书信息,请选择(1)输入图书信息\n"<<endl;
		return;	
	}
	for(int i=0;i<n;i++)
		BKNEW[i]=BK[i];
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(BKNEW[j].price>BKNEW[j+1].price)
			{
				b=BKNEW[j];
				BKNEW[j]=BKNEW[j+1];
				BKNEW[j+1]=b;
			}
		}
	}
	for(int i=0;i<=n-1;i++)
		cout<<left<<setw(15)<<BKNEW[i].no<<"\t"<<left<<setw(50)<<BKNEW[i].name<<"\t"<<left<<setw(5)<<BKNEW[i].price<<endl;
}
void Inverse(Book BK[])
{
	Book b;
	if(flag==0)
	{
		cout<<"还没有读取到图书信息,请选择(1)输入图书信息\n"<<endl;
		return;
	}
	for(int i=0;i<n/2;i++)
	{
		b=BK[i];
		BK[i]=BK[n-1-i];
		BK[n-1-i]=b;
	}
	for(int i=0;i<=n-1;i++)
	cout<<left<<setw(15)<<BK[i].no<<"\t"<<left<<setw(50)<<BK[i].name<<"\t"<<left<<setw(5)<<BK[i].price<<endl;
}
int main()
{
	char no;
	Book BK[SIZE];
	while(1)
	{
		cout<<"(1)图书输入"<<endl;
		cout<<"(2)图书输出"<<endl;
		cout<<"(3)书名查找"<<endl;
		cout<<"(4)价格最高"<<endl;
		cout<<"(5)升序排序"<<endl;
		cout<<"(6)逆序存放"<<endl;
		cout<<"(0)退出系统"<<endl; 
		cout<<endl;
		cout<<"请选择您需要的服务:";
		cin>>no;
		switch(no)
		{
			case '1':
				Input(BK);break;
			case '2':
				Output(BK);break;
 			case '3':
				Search(BK);break;
			case '4':
				Max(BK);break;
			case '5':
				Sort(BK);break;
			case '6':
				Inverse(BK);break;
			case '0':
			cout<<"欢迎再次使用~bye bye~"<<endl;
			exit(0);
			default:
				cout<<"请选择正确的操作!"<<endl;
				break;
				
		}
	}
	return 0;
}

【任务选做要求】

基于链式存储结构实现上述所有功能,即将图书数据类型的定义改为数据结构教材(参考文献[1])29页中的链表类型定义方式,如下所示。

具体实现时需要将上述定义中的ElemType改为如下定义的Book类型取可,即每一本图书作为链表的一个结点。

typedef struct //图书信息定义

{

   char no[20]; //图书ISBN

   char name[50]; //图书名字

   float price; //图书价格

}Book;

别害怕写代码,学会分析问题别眉毛胡子一把抓,多练习向别人学习看问题如何分析的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值