【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;
1429

被折叠的 条评论
为什么被折叠?



