关闭

图书管理系统C语言课程设计2

937人阅读 评论(0) 收藏 举报
分类:

#include <stdio.h> 

#include <string.h>

#include <stdlib.h>

#define Max 3     

typedef struct book

{

char book_num[10];

char book_name[20];

char book_writer[10];

int book_kc;

int book_xy;

struct book *next;

}BK;

typedef struct borrow

{

char borrow_book_num[10];

char limit_date[8];

}BO;

typedef struct reader

{

char reader_num[10];

char reader_name[10];

int right;

BO borrow[Max];

struct reader *next;

}RD;

BK *h_book;

RD *h_reader;

void Login();              /*登陆*/

int Menu();                /*主菜单*/

void Menu_select();        /*主菜单选择函数*/

void Init();               /*初始化*/

void Init_reader();       /*初始化读者*/

void Init_book();         /*初始化图书*/

void Insert_New_Book();    /*新书入库*/

int Find();                /*查找菜单*/

void Find_Select();       /*查找菜单选择函数*/

void Find_Reader();       /*查找读者信息*/

void Find_Book();         /*查找图书信息*/ 

void Print_reader();      /*打印读者信息*/

void Print_book();        /*打印图书信息*/

void Borrow_Book();        /*借书函数*/

void Return_Book();        /*还书函数*/

void Save();               /*保存信息*/

void Save_Reader();       /*保存读者信息*/

void Save_Book();         /*保存图书信息*/ 

void Load();               /*加载信息*/

void Load_Reader();       /*加载读者信息*/

void Load_Book();         /*加载图书信息*/

void Login()/*登陆*/

{

system("cls");

printf("\n\n\n\t\t\t欢迎登陆本系统\n");

printf("\n\n\t\t      系统版权所有\n\n\n\n\n\n\n");

printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");

getchar(); system("cls");

}

int Menu() /*主菜单*/

{ int sn;

printf("\n\t\t图书管理系统主菜单\n");

printf("=================================================\n");

printf("*\t0----退出系统     *\n");

printf("*\t1----新书入库     *\n");

printf("*\t2----   查询      *\n");

printf("*\t3----借书登记     *\n");

printf("*\t4----还书管理     *\n");

printf("=================================================\n");

printf("请选择相应代码:"); 

for(;;) 

{ scanf("%d",&sn); 

   fflush(stdin); 

   if(sn<0||sn>4)

      printf("\n错误!请重新输入:");

   else break;

}

return sn; 

}

void Menu_select()/*主菜单选择函数*/

{

for(;;) /*循环调用模式,保证能进行重复操作*/

{

switch(Menu()) /*功能选择*/

{ case 0:

     system("cls");/*清楚屏幕先前的显示内容*/

     Save();

printf("\n\n\t文件保存成功!\n"); 

printf("\n\n\t欢迎下次使用本系统!\n"); 

   getchar(); 

exit(0);

   case 1:Insert_New_Book();break; 

   case 2:Find_Select();break;

   case 3:Borrow_Book();break;

   case 4:Return_Book();break;

   default:printf("\n错误!");exit(0);

   }

}

}

void Init() /*初始化*/

   Init_reader();

   Init_book();

}

 

void Init_reader() /*初始化读者信息*/

    RD *p0;

    int i;

    printf("\n读者初始化开始,请输入读者信息..\n包括编号.姓名..\n");

    p0=(RD*)malloc(sizeof(RD));

    h_reader=p0;

    printf("\n请输入读者的信息:\n");

    printf("ReaderNo.:");            /*输入读者编号(唯一)*/

    scanf("%s",p0->reader_num);

    printf("ReaderName:");           /*输入读者姓名(不唯一)*/

    scanf("%s",p0->reader_name);

    p0->right=0;

    for(i=0;i<Max;i++)

    {

strcpy(p0->borrow[i].borrow_book_num,"0"); /*所借图书直接置为0(即没有借书)*/

     strcpy(p0->borrow[i].limit_date,"0"); 

     }

      p0->next=NULL;

     printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n"); 

   getchar();

      system("cls");

}

 

void Init_book() /*初始化图书信息*/

{

BK *p0;

printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");

p0=(BK*)malloc(sizeof(BK));

h_book=p0;

   printf("\n请输入图书信息:\n");

   printf("BookNo.:");            /*输入图书编号(唯一)*/

    scanf("%s",p0->book_num);

   printf("BookName:");           /*输入图书名称*/

    scanf("%s",p0->book_name);

printf("BookWriter:");           /*输入图书作者*/

    scanf("%s",p0->book_writer);

   printf("Number:");             /*输入图书数量*/

    scanf("%d",&p0->book_kc);

     p0->book_xy=p0->book_kc;     /*开始时图书现有量和库存量相等*/

    p0->next=NULL;

   printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");

   getchar();

      system("cls");

}

 

void Insert_New_Book()/*新书入库*/

{

BK *p,*p0,*p1; 

p=p1=h_book;

printf("\n新书入库模块...\n");

printf("\n请输入新书信息..\n包括书号.书名.数量..\n");

p0=(BK *)malloc(sizeof(BK));

   printf("BookNo.:");

    scanf("%s",p0->book_num);

    while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)

     p1=p1->next;

    if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/

    {

     printf("\n此编号图书已存在!!直接入库!\n"); 

           printf("Number:");

        scanf("%d",&p0->book_kc);

     p1->book_kc+=p0->book_kc;

    p1->book_xy+=p0->book_kc;

    }

    else/*若不存在,则需要输入其他的信息 ,然后在进行插入操作*/

    {

printf("BookName:");

     scanf("%s",p0->book_name);

printf("BookWriter:");

     scanf("%s",p0->book_writer);

     printf("Number:");

     scanf("%d",&p0->book_kc);

while(p->next) 

    {

      p=p->next;

    }

     if(h_book==NULL) h_book=p0;   /*此处分两种情况,链表中没有数据,head直接指向p0*/

     else p->next=p0;               /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0*/

      

p0->next=NULL;

    p0->book_xy=p0->book_kc; 

   }

    printf("\n新书入库完毕!按任意键继续下一步操作..\n");

   getchar();

      system("cls");

}

int Find() /*查找菜单*/

{

int sn;

printf("\n\t\t信息查询菜单\n");

printf("=================================================\n");

printf("*\t0----返回上级                    \t*\n");

printf("*\t                                 \t*\n");

printf("*\t1----查找图书     2----查找读者 \t*\n");

printf("*\t                                 \t*\n");

printf("*\t3----打印图书     4----打印读者 \t*\n");

printf("=================================================\n");

printf("请选择相应代码:");

for(;;)   /*循环调用模式,保证能进行重复操作*/

   scanf("%d",&sn); 

   fflush(stdin); 

   if(sn<0||sn>4)

    printf("\n错误!请重新输入:");

   else break;

}

   return sn; 

}

void Find_Select() /*查找菜单选择函数*/

{

system("cls");

for(;;)           /*循环调用模式,保证能进行重复操作*/

{

   switch(Find()) /*功能选择*/

   case 0:system("cls"); Menu_select(); break; 

   case 1:Find_Book();break;

   case 2:Find_Reader();break;

   case 3:Print_book();break;

   case 4:Print_reader();break;

    default:printf("\n错误!");exit(0);

   }

}

}

void Find_Reader() /*查找读者信息*/

{

RD *p;

int i;

char find_reader[10];

p=h_reader;

printf("\n读者信息查询模块\n");

printf("\n请输入你要查询读者编号:");

scanf("%s",find_reader);

while(strcmp(p->reader_num,find_reader)!=0&&p->next)

   p=p->next;

if(strcmp(p->reader_num,find_reader)==0)

{

    printf("\n读者编号:%s的信息为:\n",find_reader);

    printf("ReaderNo.\tReaderName"); /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/  

     printf("\n");

printf("\t%s\t\t%s",p->reader_num,p->reader_name);

   for(i=0;i<Max;i++)

{

   printf("\n");

   printf("BorrowBookNum%d",i+1); 

   printf("\tReturn%dLimitDate",i+1); 

   printf("\n");

      printf("\t%s",p->borrow[i].borrow_book_num);

   printf("\t\t%s",p->borrow[i].limit_date); 

}

   printf("\n");

}

else

   printf("\n此读者编号不存在,请核对!按任意键返回...");

getchar(); 

system("cls");

}

void Find_Book() /*查找图书信息*/

{

BK *p;

char find_book[10]; /*功能很简单,读者编号唯一,查找只须一次遍历*/

p=h_book;

printf("\n图书信息查询模块\n");

printf("\n请输入你要查询图书编号:");

scanf("%s",find_book);

while(strcmp(p->book_num,find_book)!=0&&p->next)

   p=p->next;

if(strcmp(p->book_num,find_book)==0)   

/*找到了就打印,否则提示不存在,或出错*/

{

   printf("\n图书编号:%s的信息为:\n",find_book);

   printf("\nBookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");

   printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

}

   else

   printf("\n此图书编号不存在,请核对!按任意键返回...");

getchar(); system("cls");

}

void Print_reader()     /*打印读者信息*/ 

{

RD *p;

int i;

p=h_reader;

printf("\n读者信息如下:\n\n");

printf("ReaderNo.\tReaderName");   /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/

     printf("\n");

while(p!=NULL)   /*遍历链表一次就可以了*/

{

   printf("\t%s\t\t%s",p->reader_num,p->reader_name);

   for(i=0;i<Max;i++)

   {

   printf("\n");

   printf("BorrowBookNum%d",i+1); 

   printf("\tReturn%dLimitDate",i+1); 

   printf("\n");

      printf("\t%s",p->borrow[i].borrow_book_num);

   printf("\t\t%s",p->borrow[i].limit_date); 

}

   printf("\n");

   p=p->next;

}

printf("\n读者信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Print_book() /*打印图书信息*/

{

BK *p;

p=h_book;

printf("\n图书信息如下:\n\n");

printf("BookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n"); 

/*直接打印所有图书的信息,遍历链表一次就可*/

while(p!=NULL)

{

   printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

   p=p->next;

}

printf("\n图书信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Borrow_Book() /*借书模块*/

{

BK *p0; RD *p1;

char bo_num[10],rea_num[10],lim_date[8];

int i;

p0=h_book; p1=h_reader;

printf("\n借书模块...\n");

printf("\n请输入借书的读者编号:");   /*先输入借书的读者信息*/

scanf("%s",rea_num);

while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0)     /*遍历一次读者链表,判断读者是否存在*/

   p1=p1->next;

   if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0)      /*如果存在,则继续,不存在就、则提示错误!*/

    { 

      printf("\n此读者编号不存在!按任意键返回..\n");

    goto END;

    } 

   printf("\n请输入你要借的书的编号:"); 

   scanf("%s",bo_num);

   while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL)      /*遍历一次图书链表,判断此图书是否存在*/

    p0=p0->next;

     if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0)      /*如果存在,则继续,不存在就、则提示错误!*/

      {

       printf("\n此图书编号不存在!按任意键返回..\n");

      }

    else if(p0->book_xy<=0) /*判断此图书现在是否还有库存*/    

     {

      printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");

     } 

   else if(p1->right>=Max) /*判断此读者借书权限是否已达最大*/

    {

      printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回....");

     }

     else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0)       /*此读者若已经借书,再判断此读者是否要借两本一样的书*/

     {

      for(i=0;i<Max;i++) /*遍历一次读者所借的书,如果发现有重复,则结束*/

       {

        if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)

         {

           printf("\n抱歉!同一个读者不能同借两本相同的书!\n");

     }

        else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0)     /*如果没有重复*/

           {

            printf("\n请输入你要归还图书的日期:"); 

             scanf("%s",lim_date);

             strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);     /*记录所借书号,并且借书数目加一,现存量减一*/

             strcpy(p1->borrow[p1->right-1].limit_date,lim_date);   

            p0->book_xy--;

             printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

           }

        }

     }

     else      /*此读者从未借过书*/ 

     {

       printf("\n请输入你要归还图书的日期:"); 

       scanf("%s",lim_date);

       strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);    /*记录所借书号,并且借书数目加一,现存量减一*/

       strcpy(p1->borrow[p1->right-1].limit_date,lim_date); 

      p0->book_xy--;

       printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

     }

      END:getchar(); system("cls");

}

void Return_Book() /*还书模块*/

{

BK *p; RD *q;

int i,j,find=0;

char return_book_num[10],return_reader_num[10];

p=h_book; q=h_reader;

printf("\n还书模块...\n");

printf("\n请输入要还书的读者编号:");   /*基本同上*/

scanf("%s",return_reader_num);         /*注意:数组的输入没有&*/

while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0) 

    q=q->next;

if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)

   {

find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,find=2,若借了,find=1,若没借为find=0*/

    printf("\n此读者编号不存在!按任意键返回..\n");

     goto end; 

   }

   printf("\n请输入读者还书的编号:");

    scanf("%s",return_book_num);

   while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)

         p=p->next;

   if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)

    {

    find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,find=2,若借了,find=1,若没借为find=0*/

      printf("\n错误!此图书编号不存在!按任意键返回..\n");

      goto end;

     } 

   for(i=0;i<Max;i++)

    if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0)     /*如果此读者借了此书*/

      {

         find=1;   /*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,find=2,若借了,find=1,若没借为find=0*/

         for(j=i;j<Max-1;j++)

   {

            strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num); 

    strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date); 

   }

          strcpy(q->borrow[Max-1].borrow_book_num,"0");

   strcpy(q->borrow[Max-1].limit_date,"0");

          p->book_xy++;

          q->right--;

          printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);

       }

     if(find==0)      /*为什么有个find==0,因为遍历时循环Max,如循环完毕还没有找到,则说明读者没有借此书,find用来保证只打印一次结果,否则每循环一次就会打印一个结果*/

      printf("\n错误!此读者未借此书!按任意键返回..\n");     /*如果遍历读者所借的书号,发现读者未借此书,则提示错误!*/

      end: getchar(); system("cls");

}

void Save() /*保存信息*/

{

Save_Reader();

Save_Book();

}

void Save_Reader()   /*保存读者信息*/

{

FILE *fp_reader;   /*创建文件型指针*/

RD *p,*p0;

p=h_reader;

if((fp_reader=fopen("Reader.dat","wb"))==NULL)   /*创建文件,进行保存*/

{

   printf("\n文件保存失败!\n请重新启动本系统...\n");

   exit(0);

}

while(p!=NULL) 

{

   if(fwrite(p,sizeof(RD),1,fp_reader)!=1)   /*将链表中的信息写入文件中*/

    printf("\n写入文件失败!\n请重新启动本系统!\n");

   p0=p;

   p=p->next;

   free(p0); /*释放所有结点*/

}

h_reader=NULL;

fclose(fp_reader);    /*关闭文件*/

}

void Save_Book() /*保存图书信息*/

{

FILE *fp_book;     /*创建文件型指针*/

BK *p,*p0;

p=h_book;

if((fp_book=fopen("Book.dat","wb"))==NULL)      /*创建文件,进行保存*/

{

   printf("\n文件保存失败!\n请重新启动本系统...\n");

   exit(0);

}

while(p!=NULL) 

{

   if(fwrite(p,sizeof(BK),1,fp_book)!=1)                /*将链表中的信息写入文件中*/

    printf("\n写入文件失败!\n请重新启动本系统!\n");

   p0=p;

   p=p->next;

   free(p0); 

}

h_book=NULL;

fclose(fp_book);   /*关闭文件*/

}

void Load() /*加载信息*/

{

Load_Reader();

Load_Book();

}

void Load_Reader()   /*加载读者信息*/

{

   RD *p1,*p2,*p3;

   FILE *fp;           /*创建文件型指针*/

   fp=fopen("Reader.dat","rb");       /*打开文件*/

   p1=(RD *)malloc(sizeof(RD));

   fread(p1,sizeof(RD),1,fp);

   h_reader=p3=p2=p1;

   while(! feof(fp))   /*读出信息,重新链入链表*/

   { p1=(RD *)malloc(sizeof(RD));

      fread(p1,sizeof(RD),1,fp);

      p2->next=p1;

   p3=p2;

   p2=p1;

   }

   p3->next=NULL;

   free(p1);

   fclose(fp); /*关闭文件*/

}

void Load_Book() /*加载图书信息*/

{

BK *p1,*p2,*p3;

FILE *fp;            /*创建文件型指针*/

fp=fopen("Book.dat","rb");   /*打开文件*/

    p1=(BK *)malloc(sizeof(BK));

   fread(p1,sizeof(BK),1,fp); 

    h_book=p3=p2=p1;

   while(! feof(fp))   /*读出信息,重新链入链表*/

   { p1=(BK *)malloc(sizeof(BK));

      fread(p1,sizeof(BK),1,fp);

      p2->next=p1;

   p3=p2;

   p2=p1;

   }

   p3->next=NULL;

    free(p1);

   fclose(fp);   /*关闭文件*/

}

void main() 

{

    FILE *fp_book,*fp_reader;              /*创建文件型指针*/

     Login(); 

    if((fp_book=fopen("Book.dat","rb"))==NULL||(fp_reader=fopen("Reader.dat","rb"))==NULL)

      {

            Init();

       }

    else Load();

   Menu_select(); /*调用主菜单*/

}

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:24965次
    • 积分:509
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:4篇
    • 译文:0篇
    • 评论:1条