📄 书籍管理系统.txt
字号:
/* */
/* 书籍管理系统 */
/* */
/* 内容:实现图书管理基本业务活动 */
/* 功能: */
/* 采编入库:添加新书 */
/* 清除库存:删除旧书 */
/* 检索:通过书目编号检索著者,书名等信息 */
/* 通过书名检索书目编号,著者等信息 */
/* 通过著者检索书名,书目编号等信息 */
/*********************************************/
#include <stdio.h> /*输入输出头文件*/
#include <malloc.h> /*数据动态分配头文件*/(这里过不去)这
个库函数去哪里找???)
#include <conio.h> /*最下面这两个头文件之一个与错误退出e
xit(0)函数有关*/
#include <process.h> /*不知道其具体作用,只是照书抄*/
#include <string.h> / *字符串处理头文件*/
typedef struct databaselnode /*定义一个数据库结构,单向不循
环链表构成*/
{int booknumber; /*书目编号,数字*/
char bookname[40]; /*20个字书名*/
char bookauthor[20]; /*10个字作者*/
int queuenumber; /*书的序号,存书时从1开始,
做库存用*/
struct databaselnode *next; /*链表的指针,即下一个数据*
/
}databaselnode,*database;
database head; /*定义本程序唯一一个全局变量head,
作为链表的首指针*/
/*注:C语言中,定义数据变量必须在程序或函数开始的时候定义,不
可以在程序中间定义*/
/*估计如果数据变量如果在程序中间定义,编译器将不能正确分配数
据空间,所以编译时不能通过*/
/*下面这段是把字符串转换为整形数字的函数*/
/*字符串用数组的形式保存,所以可以单个提取,就和数组的用法一样
*/
int chartonum(char temp[40])/*temp作为参数接收变量*/
{int recall=0;/*recall作为返回值*/
int i,j,k;/*i作为取字符个数的变量,j作为循环变量,k作为提取字
符串每个字符的存储变量*/
i=strlen(temp)-1;/*后面减一是因为读入了一个换行符,必须去掉
*/
for(j=0;j<i;j++)/*循环,每次进位并且加上后面的数字*/
{k=temp[j]- 0 ;/*减 0 是把字符转换为数字,只可以单个转换*/
recall=recall*10+k;/*把转换过来的单个数字加起来组成整形数
字*/
}
return recall;
}
/*存放数据的文件*/
void putfile(void)
{database q;/*定义一个数据q来存放临时数据*/
FILE *fp;/*定义一个文件指针*/
q=(database)malloc(sizeof(database));/*为q分配database大小
的数据空间*/
if(head->next==NULL)/*head->next为head的下一个数据。如果head
->next为空,则表明没有数据文件*/
{printf("%s\n","没有数据");
return;
}
/*如果head->next不为空*/
q=head->next;/*则取第一个数据到q*/
if((fp=fopen("data.txt","w"))==NULL)/*创建数据文件*/
{printf("打开文件错误");/*如果文件创建失败,则输出提示并且
退出*/
exit(0);
}
do
{if(q==NULL)/*如果q为空,则其后没有数据,可以退出循环*/
{return;}
printf("%s\n","文件打开完成,正在存数据,请稍后......");
fprintf(fp,"%s\n",q->bookname);/*存放一个变量后换行,以便以
后读取*/
fprintf(fp,"%d\n",q->booknumber);
fprintf(fp,"%d\n",q->queuenumber);
if(q->next==NULL)/*当到最后一个数据的时候,不可以输出换行
符,以便以后读取*/
{
fprintf(fp,"%s",q->bookauthor);
}
else
{
fprintf(fp,"%s\n",q->bookauthor);
}
q=q->next;/*用q的后一个数据替换原来的q,也就是q后移一位*/
if(q==NULL)
{printf("%s\n","数据保存完毕......");
return;
}
}while(q!=NULL);
fclose(fp);/*关闭文件指针*/
}
void readfile(void)
{database q,p;/*定义2个数据变量*/
FILE *fp;
char str[40];
q=(database)malloc(sizeof(database));/*为q动态分配内存空间
*/
p=(database)malloc(sizeof(database));
head->next=q;/*取数据库的第一个值*/
if((fp=fopen("data.txt","r"))==NULL)/*打开数据文件*/
{printf("%s\n","没有数据库文件;请新建数据库");
head->next=NULL;
free(p);/*释放p的空间*/
free(q);/*释放q的空间*/
return;/*当没有数据文件的时候,就不用读取*/
}
do/*这里是下一次的读数据操作*/
{printf("%s\n","正在打开文件;请稍后......");
fgets(p->bookname,40,fp);/*取一行的字符串到p->bookname中*/
p->bookname[strlen(p->bookname)-1]= \0 ;
/*因为最后取了一个换行符,会出错,所以在倒数第二个位置加上一
个字符串结束标志 \0 */
printf("%s\n",p->bookname);/*输出刚才读入的数据,以便观察是否
有错,这句作为调试之用,可以删除*/
fgets(str,40,fp);/*取一行的字符串*/
p->booknumber=chartonum(str);/*因为取的是字符传而需要整形数
据,所以转换一次*/
printf("%d\n",p->booknumber);
fgets(str,40,fp);
p->queuenumber=chartonum(str);
printf("%d\n",p->queuenumber);
fgets(p->bookauthor,40,fp);
if(feof(fp)==0)/*如果不是在文件末尾,才去掉最后的换行符,因为
最后一个数据没有换行符*/
{
p->bookauthor[strlen(p->bookauthor)-1]= \0 ;
}
printf("%s\n",p->bookauthor);
strcpy(q->bookname,p->bookname);/*把p拷贝到q当中,不可以直接用
等号赋值,因为这个是字符串*/
q->booknumber=p->booknumber;/*整形数据可以直接赋值*/
q->queuenumber=p->queuenumber;
strcpy(q->bookauthor,p->bookauthor);
p=(database)malloc(sizeof(database));/*申请新的p存放下一个
数据*/
q->next=p;
if(feof(fp)!=0)/*如果测到文件末尾,则结束*/
{q->next=NULL;
free(p);
fclose(fp);
return;
}
q=q->next;
}while(feof(fp)==0);/*如果没有到文件末尾,则循环上去*/
fclose(fp);
}
void initdatabase(void) /*建立数据库*/
{/*首先约定在head后的第一个next即head->next才放数据,head只
作为指针使用,不存放数据*/
head=(database)malloc(sizeof(database));
head->next=NULL;
readfile();/*调用readfile()函数*/
}
/*新书入库,若书目编号如果相同,则书名必须相同;当书名相同的时
候,书目编号可以不同*/
void inputdata(void)
{database p,q;/*定义2个指针变量来存放临时数据*/
int x=0;/*定义一个x作为中间变量控制程序流程之用*/
p=(database)malloc(sizeof(database));/*分配database大小的空
间*/
q=(database)malloc(sizeof(database));
printf("请输入书名");
scanf("%s",&p->bookname);
printf("请输入书目编号");
scanf("%d",&p->booknumber);
printf("请输入作者的名字");
scanf("%s",&p->bookauthor);
if(head->next==NULL)
{head->next=p;
p->queuenumber=1;/*这个是书的序号,如果书都相同,则序号依次
递增*/
p->next=NULL;
}
else
{q=head->next; /*当前书记录为P*/
do
{if(p->booknumber==q->booknumber)
{if(strcmp(p->bookname,q->bookname)!=0)/*当书目编号相同时书名
不同,不加入新书*/
{x=1;break;
}
else
{x=2;break;
}
}/*if*/
q=q->next;
}while(q!=NULL);
if(x==1)
{printf("已有此书编号,但书名不同,请重新输入");}
else if(x==2)/*书名和书号都相同,在后面加序号*/
{p->queuenumber=q->queuenumber+1;
p->next=q;
head->next=p;
}
else/*新书加入*/
{
q=head->next;
p->queuenumber=1;
p->next=q;/*在前面加入*/
head->next=p;
}
}
}
void deldata(void) /*删除书籍数据*/
{database p,q;
int x=0;
int k=1;
p=(database)malloc(sizeof(database));
q=(database)malloc(sizeof(database));
q=head->next;
printf("请输入要删除的书名");
scanf("%s",&p->bookname); /*若找到则x=1*/
do
{if(q==NULL)
{break;}
/*首先查找是否有这本书*/
if(strcmp(q->bookname,p->bookname)==0)
{x=1;
printf("%s\n","已经找到,书籍信息如下所示");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -