⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 书籍管理系统.txt

📁 不错的书籍管理系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
 /*                                           */
                  /*             书籍管理系统                  */
                  /*                                           */
                  /* 内容:实现图书管理基本业务活动    */
                  /* 功能:          */
                  /*       采编入库:添加新书      */
                  /*       清除库存:删除旧书      */
                  /* 检索:通过书目编号检索著者,书名等信息  */
                  /*      通过书名检索书目编号,著者等信息  */
                  /*      通过著者检索书名,书目编号等信息    */
                  /*********************************************/
                  #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 + -