图书管理系统
一、系统功能
图书管理系统要求实现图书管理的基本功能,包括图书的录入、删除、查找和导入/导出等。图书的属性包括书号、书名、第一作者、版次、出版社、出版年等信息。
功能要求:
1.创建:创建图书管理系统,用逐条输入的方式;
2.显示:分屏显示图书管理系统中的所有记录;
3.插入:向图书管理系统中插入一条记录;
4.删除:删除一条已经存在的记录项;
5.排序:以编号为依据升序排列所有记录项;
6.查找:根据用户输入的属性值查找符合条件的记录项;
7.导入/导出:可以从文件读入已有的图书管理系统,也可将系统中的图书信息导出到文件;
8.反序:以编号为依据将按序排列的记录项反序排列;
9.删除相同记录。
构建如图菜单系统,程序执行过程为:循环显示主菜单,用户在Give your choice:处输入选项,即按照功能列表输入0~10中的任意一个数字,按回车后,执行相应的功能。功能执行完毕,返回菜单。
二、菜单功能
各菜单项功能如下:
(1)Input Records(建立有序表)
从键盘上一次输入一条图书记录(书号、书名、第一作者、版次、出版社、出版年),以“书号”为序建立有序表。插入一条记录后,显示提示信息:确认是否输入下一条记录,如确认,继续输入,否则,退出输入功能。
(2)Display All Records(显示所有结点记录)
按顺序显示表中所有记录,每屏显示10条记录,按
(3)Insert a Record(插入一条结点记录)
在以“书号”为序排列的表中插入一条记录,插入后,表仍有序。输出插入成功的信息。
(4)Delete a Record(按“书号”查找,找到后删除该条结点记录)
输入待删除记录的“书号”,显示提示信息,让用户再次确认是否要删除。确认后,将该“书号”的记录删除。
(5) Sort(排序)
以“书号”为升序排列表中的记录。
(6)Query(查找并显示一个结点记录)
输入“书号”,查找该记录,找到后显示记录信息。
(7)Add Records from a Text File(从文件中添加数据到系统中)
用户可事前建立一个文件data.txt,存放多条待加入的记录。提示输入文件的文件名,然后从该文件中一次性加入多条图书记录。文件data.txt格式如下(可以使用英文或拼音表示中文信息):
注意:该文件中第一行的数字表示待添加的记录数,下面每行为图书记录。
(8)Write to a Text File(将系统中记录写入文件)
将图书管理系统中的全部记录写入文件records.txt,要求文件格式和文件data.txt相同。
(9)Reverse List(将表反序)
将表中的所有结点按“书号”反序存放。
(10)Delete the Same Records(删除相同记录)
删除书名、第一作者、版次、出版社、出版年均相同的记录。
(0)Quit(退出图书管理系统程序)
退出图书管理系统程序。
三、实现要求
1. 数据结构
用结构体数组实现图书信息的记录和管理。每个数组元素为一个结构体变量
在主函数中定义结构体数组Bookinfo books[NUM];用作记录存储,也可采用动态链表实现。
2. 各函数功能
以下函数原型说明中出现的函数为本课程设计的基本要求。请不要更改函数原型。
(1)数据输入
int Input(Bookinfo dictList[],int n);
从键盘输入若干条记录,依次存放到结构体数组dictList中,n为数组原有记录数,函数返回最后的记录数。
(2)输出数据
void Diplay(Bookinfo dictList[],int n);
显示所有图书信息,每10本暂停一次,n为数组元素个数。
(3)插入一条结点记录
int Insert(Bookinfo dictList[],int n, Bookinfo *s);
按书号序插入记录s,返回记录个数。
int Insert_a_record(Bookinfo dictList[],int n);
输入待插入的图书书号、书名、作者、版本号、出版社名、出版年等图书信息,调用Insert函数按书号作有序插入,输出插入成功信息,返回记录个数。
(4)删除一条结点记录
int Delete(Bookinfo dictList[],int n, char *book);
删除书名为book的第一条图书记录,返回数组中的记录数。
int Delete_a_record(Bookinfo dictList[],int n);
输入待删除的书名,经确认后调用Delete函数,同时列出同一书名的所有书目,输入待删除书目的书号,提示是否删除,确认后,输出删除成功与否的信息,返回数组中的记录数。
(5)排序
void Sort_by_ISBN(Bookinfo dictList[],int n);
数组按书号升序排列。
(6)查询数据
int Query(Bookinfo dictList[],int n, char *book);
查找并显示书名为book的所有记录,查找成功返回该书名记录个数,否则返回-1。
void Query_a_record(Bookinfo dictList[], int n);
输入待查找的书名,调用Query函数查找该书的记录,输出查找成功与否的信息和该书名的所有记录。
(7)从文件中整批输入数据
int AddfromText(Bookinfo dictList[],int n, char *filename);
从文件filename添加一批记录到数组中,调用Insert()函数作有序插入,返回添加记录后的新记录数。
(8)将记录写到文件
void WriteText(Bookinfo dictList[],int n,char *filename);
将数组中的记录全部写入文件filename中。
(9)将表反序存放
void Reverse(Bookinfo dictList[]);
按书号反序存放表。
(10)删除雷同记录
int DeleteSame(Bookinfo dictList[], int n);
删除数组中书名、作者、版本号、出版社名、出版年均相同的记录,n为数组原有记录数,函数返回最后的记录数。
(0)退出管理系统
void Quit(Bookinfo dictList[]);
退出系统时,释放动态存储空间。
其他函数
void Display_Main_Menu();
显示主菜单。
实验过程中可以根据需要适当增加函数,以使程序算法更清晰明了。
其中部分函数是我补充添加的(具体看代码标注)。
#include
#include
#include
typedef struct //定义数据类型
{
char ISBN[10]; //书号
char book[30]; //书名
char author[20]; //作者
int edition; //版本号
char press[50]; //出版社名
int year; //年份
}Bookinfo;
int Input(Bookinfo dictList[],int n) // 从键盘输入若干条记录,依次存放到结构体数组dictList中,返回最后的记录数
{
int m,i; //m:要输入的本数,i循环控制量
printf("请输入要输入图书的本数\n");
scanf("%d",&m);
getchar();
printf("\n");
for(i=0;i0) p=j; //当左边的大,则保持原来排序
}
if(p!=i) //当右边的大,则进行替换
{
ls=dictList[i];
dictList[i]=dictList[p];
dictList[p]=ls;
}
}
printf("排序完成\n");
}
void Sort_by_name(Bookinfo dictList[],int n) //数组按书名升序排列,同书号排序的逻辑
{
int i,j,p,bj;
Bookinfo ls;
for(i=0;i0) p=j;
}
if(p!=i)
{
ls=dictList[i];
dictList[i]=dictList[p];
dictList[p]=ls;
}
}
printf("排序完成\n");
}
int Insert(Bookinfo dictList[],int n,Bookinfo *s) //有序插入
{
int i,j,p;
for(i=0;i<=n;i++)
{
p=strcmp(dictList[i].book,(*s).book); //将插入数据的放到第i个
if(i=n) //如果插入的在最后,则直接插入
{
dictList[i]=*s;
i=n+1;
j=n+1;
}
if(p>0)
{
for(j=n;j>i;j--) dictList[j]=dictList[j-1]; //如果插入的在中间,则将插入点之后的数据向右挪动一个位置
dictList[i]=*s;
i=n+1;
}
}
return(n+1);
}
int Insert_a_record(Bookinfo dictList[ ],int n) //有序插入
{
Bookinfo mmp,*s;
s=&mmp;
getchar();
printf("书号:");
gets(mmp.ISBN);
printf("书名:");
gets(mmp.book);
printf("作者:");
gets(mmp.author);
printf("版本号:");
scanf("%d",&mmp.edition);
getchar();
printf("出版社名:");
gets(mmp.press);
printf("出版年份:");
scanf("%d",&mmp.year);
getchar();
n=Insert(dictList,n,s);
Sort_by_ISBN(dictList,n);
printf("插入成功");
return n;
}
int Query(Bookinfo dictList[],int n,Bookinfo *book) //查找并显示书名为book的所有记录,查找成功返回该书记录个数,失败则返回0
{
int i,p,t,m=0;
for(i=0;i0)
printf("找到了%d本名为%s的书!",a,cz.book);
else
printf("没有找到名称为%s的书",cz.book);
}
void WritetoText(Bookinfo dictList[],int n,char *filename) //将记录写到文件里
{
int i;
FILE *fp;
fp=fopen(filename,"w");
if(fp==NULL)
{
printf("不能打开文件\n");
exit(1); //没打开成功就exit
}
fprintf(fp,"%d\n",n);
//fprintf(fp,"书号 书名 作者 版本号 出版社 出版年份\n");
//fprintf(fp,"--------------------------------------------------------------\n");
for(i=0;iauthor,b.author); //这个是将后面的赋给前面的a
strcpy(a->book,b.book);
a->edition = b.edition;
strcpy(a->ISBN,b.ISBN);
strcpy(a->press,b.press);
a->year = b.year;
}
int SameBook(Bookinfo a, Bookinfo b) //这个是判断是否为重复书籍的函数,删除同书的函数循环调用此函数
{
return !strcmp(a.author, b.author) //如果找到了作者、书名、出版社、出版编号、日期相同的书,则该书为相同书
&& !strcmp(a.book, b.book)
&& (a.edition == b.edition)
&& !strcmp(a.press, b.press)
&& (a.year == b.year);
}
int DeleteSame(Bookinfo dictList[], int n) //删除相同的书籍
{
int i, j;
int newLen = n;
for (i = 0; i < newLen - 1; i++)
{
for (j = i + 1; j < newLen; j++)
{
if (SameBook(dictList[i], dictList[j]))
{
for (int k = j; k < n - 1; k++)
{
dictList[k] = dictList[k + 1]; //向左挪动一个位置
}
--newLen,--j;
}
}
}
printf("已删除相同的书籍数据,返回记录数为: %d", newLen);
return newLen;
}
int menu_select() //我设计的菜单
{
int sn;
system("cls"); //清屏
printf(" The Book Manangement Systemm \n");
printf(" |--------------------------------------------------------------------|\n");
printf(" | Menu |\n");
printf(" |--------------------------------------------------------------------|\n");
printf(" | 1 Input Records |\n");
printf(" | 2 Display All Records |\n");
printf(" | 3 Insert a Record |\n");
printf(" | 4 Delete a Record |\n");
printf(" | 5 Sort |\n");
printf(" | 6 Query |\n");
printf(" | 7 Add Records from a Text File |\n");
printf(" | 8 Write to a Text File |\n");
printf(" | 9 Correct a record |\n");
printf(" | 10 Search author |\n");
printf(" | 11 Reverse |\n");
printf(" | 12 Delete The Same Records |\n");
printf(" | 13 Sort by name |\n");
printf(" | 0 Quit |\n");
printf(" |--------------------------------------------------------------------|\n");
printf(" Please enter your choice(0~13): ");
for(; ;) //用死循环判断用户是否输入的是13的数字,如果输入14则提示错误重输
{
scanf("%d",&sn);
if(sn<0||sn>13)
printf("\n输入错误,重选0~13:");
else
break;
}
return sn;
}
void Correct(Bookinfo dictList[],int n) //显示所有记录,并对其中某一个进行修改
{
char xg[30];
int i,bj,m;
Display(dictList,n);
system("pause");
printf("请输入所要修改图书记录的书号:\n");
scanf("%s",xg);
for(i=0;i6)
printf("\n输入错误,重选1~6:");
else
break;
}
}
}
}
void search_author(Bookinfo dictList[],int n) //查询作者在该管理系统有多少本书
{
int i,t,p,count=0;
char sm[30],*author;
printf("Input author_name\n");
getchar();
gets(sm);
author=&sm[0];
for(i=0;i-1.5f; y-=0.1f)
{
for(x=-1.5f; x<1.5f; x+=0.05f)
{
a = x*x+y*y-1;
char c = a*a*a-x*x*y*y*y<=0.0f?'*':' ';
putchar(c);
}
printf("\n");
}
return 0;
}
int main()
{
system("color B5"); //将菜单变为浅紫色
int n=0;
char i;
Bookinfo dictList[50];
Bookinfo favorites[50];
for(;;)
{
switch(menu_select()) //老师给的交互系统
{
case 1:
{
n=Input(dictList,n);
system("pause");
break;
}
case 2:
{
Display(dictList,n);
system("pause");
break;
}
case 3:
{
n=Insert_a_record(dictList,n);
system("pause");
break;
}
case 4:
{
n=Delete_a_record(dictList,n);
system("pause");
break;
}
case 5:
{
Sort_by_ISBN(dictList,n);
system("pause");
break;
}
case 6:
{
Query_a_record(dictList,n);
system("pause");
break;
}
case 7:
{
char *filename,s[30];
printf("请输入文件名\n");
scanf("%s",s);
filename=s;
n=AddfromText(dictList,n,filename);
system("pause");
break;
}
case 8:
{
char *filename,s[30];
printf("请输入文件名\n");
scanf("%s",s);
filename=s;
WritetoText(dictList,n,filename);
system("pause");
break;
}
case 9:
{
Correct(dictList,n);
system("pause");
break;
}
case 10:
{
search_author(dictList,n);
system("pause");
break;
}
case 11:
{
Reverse(dictList,n);
system("pause");
break;
}
case 12:
{
n = DeleteSame(dictList,n);
system("pause");
break;
}
case 13:
{
Sort_by_name(dictList,n);
system("pause");
break;
}
case 0:
{
play();
printf(" Goodbye!");
printf("\n\n\n");
system("pause");
exit(0);
}
}
}
}