溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于C語(yǔ)言如何實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)

發(fā)布時(shí)間:2021-05-28 12:20:08 來(lái)源:億速云 閱讀:170 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)基于C語(yǔ)言如何實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

本文實(shí)例為大家分享了圖書(shū)管理信息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),供大家參考,具體內(nèi)容如下

#include<stdio.h>
#include<string.h>

#define BookSize 100
#define BLHum 50
#define BLHnum 50
#define RRnum 50

/*主數(shù)據(jù)庫(kù)文件*/
typedef struct {
 int bno;
 char bname[21];
 int namenext;
 char author[9];
 int authnext;
 char press[11];
 int prenext;
 char sortno[4];
 int storenum;
 int borrownum;
}BookRecType;
typedef struct {
 BookRecType BookDbase[BookSize];
 int len;
}BookDbaseFile;


/*書(shū)號(hào)索引文件*/
typedef struct {
 int bno;
 int RecNo;
}BidxRecType;
typedef struct {
 BidxRecType BnoIdx[BookSize];
 int len;
}BnoIdxFile;


/*書(shū)名鏈頭索引文件*/
typedef struct {
 char bname[21];
 int lhead;
 int RecNum;
}BNRecType;
typedef struct {
 BNRecType LHFrecl[BLHum];
 int len1;
}LHFile1;


/*作者鏈頭索引文件*/
typedef struct {
 char author[9];
 int lhead;
 int RecNum;
}BARecType;
typedef struct {
 BARecType LHFrec2[BLHnum];
 int len2;
}LHFile2;


/*出版社鏈頭索引問(wèn)件*/
typedef struct {
 char press[11];
 int lhead;
 int RecNum;
}BPRecType;
typedef struct {
 BPRecType LHFrec3[BLHnum];
 int len3;
}LHFile3;


/*讀者文件*/
typedef struct {
 int rno;
 char name[8];
 int bn1;
 int bn2;
}RRecType;
typedef struct {
 RRecType ReadRec[RRnum];
 int len;
}ReadFile;


/*借還書(shū)文件*/
typedef struct {
 int rno;
 int bno;
 char date1[9];
 char date2[9];
}BbookRecType;
typedef struct {
 BbookRecType Bbook[BookSize];
 int len;
}BbookFile;


/*追加一條圖書(shū)記錄建立相關(guān)文件*/
BookDbaseFile AppeDBaseRec(BookDbaseFile df)
{
 int i;
 printf("書(shū)號(hào) 書(shū)名 作者名 出版社 分類(lèi) 藏書(shū)量\n");
 scanf("%d%s", df.BookDbase[i].bno, df.BookDbase[i].bname);
 scanf("%s%s", df.BookDbase[i].author, df.BookDbase[i].press);
 scanf("%s %d", df.BookDbase[i].sortno, &df.BookDbase[i].storenum);
 df.BookDbase[i].borrownum = 0;
 return df;
}

/*修改書(shū)號(hào)索引表的設(shè)計(jì)*/
BnoIdxFile ChangeBnoIdxF(BookDbaseFile df, BnoIdxFile bif)
{
 int i, j, k = 1;
 i = df.len;
 j = bif.len;
 while (j >= 1)
 {
  if (df.BookDbase[i].bno>bif.BnoIdx[j].bno)
  {
   k = j + 1;
   break;
  }
  j--;
 }
 if (bif.len>0)
  for (j = bif.len; j >= k; j--)
   bif.BnoIdx[j + 1] = bif.BnoIdx[j];
 bif.BnoIdx[k].bno = df.BookDbase[i].bno;
 bif.BnoIdx[k].RecNo = i;
 bif.len++;
 return bif;
}


/*修改書(shū)名索引以及書(shū)名鏈頭索引的設(shè)計(jì)*/
LHFile1 ChangeLinkHeadF1(BookDbaseFile *df, LHFile1 lhf1)
{
 int i, j, k, m;
 char sm[21];
 i = df->len;
 strcpy(sm , df->BookDbase[i].bname);
 j = 1;
 k = 0;
 while (j <= lhf1.len1)
 {
  if (strcmp(sm, lhf1.LHFrecl[j].bname) == 0)
  {
   k = j;
   break;
  }
  j++;
 }
 if (k != 0)
 {
  df->BookDbase[i].namenext = lhf1.LHFrecl[k].lhead;
  lhf1.LHFrecl[k].lhead = i;
  lhf1.LHFrecl[k].RecNum++;
 }
 else
 {
  m = ++lhf1.len1;
  df->BookDbase[i].namenext = 0;
  lhf1.LHFrecl[m].lhead = i;
  lhf1.LHFrecl[m].RecNum = 1;
  strcpy(lhf1.LHFrecl[m].bname, sm);
 }
 return lhf1;
}


/*修改作者索引以及作者鏈頭索引表的設(shè)計(jì)*/
LHFile2 ChangeLinkHeadF2(BookDbaseFile *df, LHFile2 lhf2)
{
 int i, j, k, m;
 char zz[9];
 i = df->len;
 strcpy(zz, df->BookDbase[i].author);
 j = 1;
 k = 0;
 while (j <= lhf2.len2)
 {
  if (strcmp(zz, lhf2.LHFrec2[j].author) == 0)
  {
   k = j;
   break;
  }
  j++;
 }
 if (k != 0)
 {
  df->BookDbase[i].authnext = lhf2.LHFrec2[k].lhead;
  lhf2.LHFrec2[k].lhead = i;
  lhf2.LHFrec2[k].RecNum = 1;
  strcpy(lhf2.LHFrec2[m].author, zz);
 }
 return lhf2;
}


/*修改出版社的索引以及出版社鏈頭索引表的設(shè)計(jì)*/
LHFile3 ChangeLinkHeadF3(BookDbaseFile *df, LHFile3 lhf3)
{
 int i, j, k, m;
 char cbs[11];
 i = df->len;
 strcpy(cbs, df->BookDbase[i].press);
 j = 1;
 k = 0;
 while (j <= lhf3.len3)
 {
  if (strcmp(cbs, lhf3.LHFrec3[j].press) == 0)
  {
   k = j;
   break;
  }
  j++;
 }
 if (k != 0)
 {
  df->BookDbase[i].prenext = lhf3.LHFrec3[k].lhead;
  lhf3.LHFrec3[k].lhead = i;
  lhf3.LHFrec3[k].RecNum++;
 }
 else
 {
  m = ++lhf3.len3;
  df->BookDbase[i].prenext = 0;
  lhf3.LHFrec3[m].lhead = i;
  lhf3.LHFrec3[m].RecNum = i;
  strcpy(lhf3.LHFrec3[m].press, cbs);
 }
 return lhf3;
}


/*用二分查找實(shí)現(xiàn)書(shū)號(hào)查詢算法*/
int BinSearch(BnoIdxFile bif, int key)
{
 int low, high, mid;
 low = 1;
 high = bif.len;
 while (low <= high)
 {
  mid = (low + high) / 2;
  if (key == bif.BnoIdx[mid].bno)
   return bif.BnoIdx[mid].RecNo;
  else
   if (key<bif.BnoIdx[mid].bno)
    high = mid - 1;
   else
    low = mid + 1;
 }
 return 0;
}


/*按書(shū)名查詢算法的設(shè)計(jì)*/
int BnameFind(LHFile1 lhf1, char key[])
{
 int i, k = 0;
 for (i = 1; i<=lhf1.len1;i++)
 {
  if (strcmp(key, lhf1.LHFrecl[1].bname) == 0)
  {
   k = lhf1.LHFrecl[i].lhead;
   break;
  }
 }
 return k;
}


/*按作者查詢算法的設(shè)計(jì)*/
int BauthFind(LHFile2 lhf2, char key[])
{
 int i, k = 0;
 for (i = 1; i <= lhf2.len2; i++)
 {
  if (strcmp(key, lhf2.LHFrec2[i].author) == 0)
  {
   k = lhf2.LHFrec2[i].lhead;
   break;
  }
 }
 return k;
}

/*按出版社查詢算法的設(shè)計(jì)*/
int BnameFind(LHFile3 lhf3, char key[])
{
 int i, k = 0;
 for (i = 1; i <= lhf3.len3; i++)
 {
  if (strcmp(key, lhf3.LHFrec3[i].press) == 0)
  {
   k = lhf3.LHFrec3[i].lhead;
   break;
  }
 }
 return k;
}

/*輸出一條圖書(shū)主數(shù)據(jù)庫(kù)記錄的設(shè)計(jì)*/
void ShowRec(BookDbaseFile df, int i)
{
 printf("書(shū)號(hào) 書(shū)名 作者名 出版社 分類(lèi)號(hào) 可借數(shù)\n");
 printf("==============================================\n");
 printf("%d%12s", df.BookDbase[i].bno, df.BookDbase[i].bname);
 printf("%8s%12s", df.BookDbase[i].author, df.BookDbase[i].press);
 printf("%6s", df.BookDbase[i].sortno);
 printf("%4d\n", df.BookDbase[i].storenum - df.BookDbase[i].borrownum);
 printf("==============================================\n");
}

/*圖書(shū)查詢控制程序設(shè)計(jì)*/
void SearchBook(BookDbaseFile df, BnoIdxFile bif, LHFile1 f1, LHFile2 f2, LHFile3 f3)
{
 char sm[21], zz[9],cbs[11];
 int i, k, choose = 1;
 int sh;
 while (choose >= 1 && choose <= 5)
 {
  printf("圖書(shū)查詢子系統(tǒng)\n");
  printf("------------------\n");
  printf("1.書(shū) 號(hào)  2.書(shū) 名\n");
  printf("3.作 者  4.出版社\n");
  printf("5.退 出 查 詢");
  printf("------------------\n");
  printf(" 請(qǐng) 用 戶 選 擇:");
  scanf("%d", &choose);
  switch (choose)
  {
  case 1:
   printf("輸入學(xué)號(hào):");
   scanf("%d", &sh);
   k = BinSearch(bif, sh);
   if (k == 0) {
    printf("沒(méi)有要檢查的圖書(shū),請(qǐng)檢查是否輸入有錯(cuò)\n");
    break;
   }
   ShowRec(df, k);
   break;

  case 2:
   printf("輸入書(shū)名:");
   scanf("%", &sm);
   k = BnameFind(f1, sm);
   if (k == 0) {
    printf("沒(méi)有要檢查的圖書(shū),請(qǐng)檢查是否輸入有錯(cuò)\n");
    break;
   }
   for (i = k; i; i = df.BookDbase[i].namenext)
    ShowRec(df, i);
   break;

  case 3:
   printf("輸入作者名:");
   scanf("%s", &zz);
   k = BauthFind(f2, zz);
   if (k == 0) {
    printf("沒(méi)有要檢查的圖書(shū),請(qǐng)檢查是否輸入有錯(cuò)\n");
    break;
   }
   for (i = k; i; i = df.BookDbase[i].authnext)
    ShowRec(df, i);
   break;

  case 4:
   printf("輸入出版社:");
   scanf("%s", &cbs);
   k = BnameFind(f3,cbs);
   if (k == 0) {
    printf("沒(méi)有要檢查的圖書(shū),請(qǐng)檢查是否輸入有錯(cuò)\n");
    break;
   }
   for (i = k; i; i = df.BookDbase[i].prenext)
    ShowRec(df, k);
   break;

  case 5:
   return;
  }
 }
}


/*借還書(shū)處理算法*/
void BorrowBook(BookDbaseFile *bf, BnoIdxFile bif, BbookFile *bbf, ReadFile *rf)
{
 char jyrq[9];
 int sh, dzh;
 int i, j, k = 0;
 printf("輸入讀者號(hào) 書(shū)號(hào) 借閱日期\n");
 scanf("%d%d%s", &dzh, &sh, jyrq);
 for (i = 1; i <= rf->len; i++)
 {
  if (dzh == rf->ReadRec[i].rno)
  {
   k = i;
   break;
  }
 }
 if (k == 0)
 {
  printf("非法讀者!\n");
  return;
 }
 if (rf->ReadRec[k].bn2 >= rf->ReadRec[k].bn1)
 {
  printf("書(shū)已借滿!\n");
  return;
 }
 j = BinSearch(bif, sh);
 if (j == 0)
 {
  printf("非法書(shū)號(hào)!");
   return;
 }
 if (bf->BookDbase[j].borrownum >= bf->BookDbase[j].storenum)
 {
  printf("圖書(shū)已借出\n");
  return;
 }
 i = ++bbf->len;
 bbf->Bbook[i].rno = dzh;
 bbf->Bbook[i].bno = sh;
 strcpy(bbf->Bbook[i].date1, jyrq);
 rf->ReadRec[k].bn2++;
 bf->BookDbase[j].borrownum++;
 printf("借書(shū)成功!\n");
}

/*還書(shū)處理算法的設(shè)計(jì)*/
void BackBook(BookDbaseFile *bf,BnoIdxFile bif ,BbookFile *bbf, ReadFile *rf)
{
 char hsrq[8];
 int sh, dzh;
 int i, j, k = 0, m = 0;
 printf("讀者號(hào) 書(shū)號(hào) 還書(shū)日期\n");
 scanf("%d%d%s", &dzh, &sh, hsrq);
 for (i = 1; i <= rf->len; i++)
 {
  if (dzh == rf->ReadRec[i].rno)
  {
   k = i;
   break;
  }
 }
 if (k == 0)
 {
  printf("非法讀者!\n");
  return;
 }
 for (i = 1; i <= bbf->len; i++)
  if (sh == bbf->Bbook[i].bno)
  {
   m = i;
   break;
  }
 if (m == 0)
 {
  printf("非法書(shū)號(hào)!\n");
  return;
 }
 j = BinSearch(bif, sh);
 if (j == 0)
 {
  printf("非法書(shū)號(hào)!\n");
  return;
 }
 rf->ReadRec[k].bn2--;
 bf->BookDbase[j].borrownum--;
 strcpy(bbf->Bbook[m].date2, hsrq);
 printf("還書(shū)成功!\n");
}

/*讀者管理子系統(tǒng)*/
ReadFile ReaderManage(ReadFile rf)
{
 int i;
 char yn = 'y';
 i = ++rf.len;
 while (yn == 'y' || yn == 'Y')
 {
  printf("輸入讀者號(hào) 讀者名 可借圖書(shū)數(shù)\n");
  scanf("%d %s", &rf.ReadRec[i].rno, rf.ReadRec[i].name);
  scanf("%d", &rf.ReadRec[i].bn1);
  rf.ReadRec[i].bn2 = 0;
  printf("繼續(xù)輸入嗎?y/n:");
  getchar();
  scanf("%c",&yn);
 }
 rf.len=i-1;
 return rf;
}

/*寫(xiě)各類(lèi)文件*/
void writefile(BookDbaseFile bf, BnoIdxFile bif, LHFile1 f1, LHFile2 f2, LHFile3 f3, ReadFile rf, BbookFile bbf)
{
 FILE *fp;
 int i;
 //圖書(shū)主文件 
 fp = fopen("book", "wb");
 for (i = 1; i <= bf.len; i++)
  fwrite(&bf.BookDbase[i],sizeof(BookRecType), 1, fp);
 fclose(fp);
 //圖書(shū)索引文件 
 fp = fopen("bidx", "wb");
 for (i = 1; i <= bif.len; i++)
  fwrite(&bif.BnoIdx[i], sizeof(BidxRecType), 1, fp);
 fclose(fp);
 //書(shū)名索引鏈頭文件 
 fp = fopen("nidx", "wb");
 for (i = 1; i <= f1.len1; i++)
  fwrite(&f1.LHFrecl[i], sizeof(BNRecType), 1, fp);
 fclose(fp);
 //作者索引鏈頭文件
 fp = fopen("aidx", "wb");
 for (i = 1; i <= f2.len2; i++)
  fwrite(&f2.LHFrec2[i], sizeof(BARecType), 1, fp);
 fclose(fp);
 //出版社索引鏈頭文件
 fp = fopen("pidx", "wb");
 for (i = 1; i <= f3.len3; i++)
  fwrite(&f3.LHFrec3[i], sizeof(BPRecType), 1, fp);
 fclose(fp);
 //讀者文件
 fp = fopen("read", "wb");
 for (i = 1; i <= rf.len; i++)
  fwrite(&rf.ReadRec[i], sizeof(RRecType), 1, fp);
 fclose(fp);
 //借還書(shū)文件
 fp = fopen("bbff", "wb");
 for (i = 1; i <= bbf.len; i++)
  fwrite(&bbf.Bbook[i], sizeof(BbookRecType), 1, fp);
 fclose(fp);
}


/*讀各類(lèi)文件*/
void readfile(BookDbaseFile *bf, BnoIdxFile *bif, LHFile1 *f1, LHFile2 *f2, LHFile3 *f3, ReadFile *rf, BbookFile *bbf)
{
 FILE *fp;
 int i;
 //讀圖書(shū)主文件
 fp = fopen("book", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&bf->BookDbase[i], sizeof(BookRecType), 1, fp);
  i++;
  if (feof(fp))break;
 }
 bf->len = i - 2;
 fclose(fp);
 //讀書(shū)好索引文件
 fp = fopen("bidx", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&bif->BnoIdx[i], sizeof(BidxRecType), 1, fp);
  i++;
 }
 bif->len = i - 2;
 fclose(fp);
 //讀書(shū)名索引文件
 fp = fopen("nidx", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&f1->LHFrecl[i], sizeof(BNRecType), 1, fp);
  i++;
 }
 f1->len1 = i - 2;
 fclose(fp);
 //讀作者索引文件
 fp = fopen("aidx", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&f2->LHFrec2[i], sizeof(BARecType), 1, fp);
  i++;
 }
 f2->len2 = i - 2;
 fclose(fp);
 //讀出版社索引鏈頭文件
 fp = fopen("pidx", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&f3->LHFrec3[i], sizeof(BPRecType), 1, fp);
  i++;
 }
 f3->len3 = i - 2;
 fclose(fp);
 //讀讀者文件
 fp = fopen("read", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&rf->ReadRec[i], sizeof(RRecType), 1, fp);
  i++;
 }
 rf->len = i - 2;
 fclose(fp);
 //讀借還書(shū)文件
 fp = fopen("bbff", "rb");
 i = 1;
 while (!feof(fp))
 {
  fread(&bbf->Bbook[i], sizeof(BbookRecType), 1, fp);
  i++;
 }
 bbf->len = i - 2;
 fclose(fp);
}

/*主控菜單*/
int main(void)
{
 int j, m, k = 1;
 char xz = 'n';
 BookDbaseFile bf;
 BnoIdxFile bif;
 LHFile1 f1;
 LHFile2 f2;
 LHFile3 f3;
 ReadFile rf;
 BbookFile bbf;
 while (k <= 5)
 {
  printf("圖書(shū)管理系統(tǒng)\n");
  printf("============\n");
  printf(" 1.系統(tǒng)維護(hù) \n");
  printf(" 2.讀者管理 \n");
  printf(" 3.圖書(shū)管理 \n");
  printf(" 4.圖書(shū)流通 \n");
  printf(" 5.退出系統(tǒng) \n");
  printf("============\n");
  printf(" 請(qǐng)選擇1-5:");
  scanf("%d", &k);
  switch (k)
  {
   case 1:
    printf("系統(tǒng)維護(hù)\n");
    printf("--------\n");
    printf("1.初始化\n");
    printf("2. 讀 盤(pán)\n");
    printf("--------\n");
    printf("請(qǐng)選擇:\n");
    scanf("%d", &m);
    switch (m)
    {
    case 1:
     printf("初始化只能做一次,需慎重!初始化嗎?y/n:");
     getchar();
     scanf("%c", &xz);
     if ( xz == 'y' || xz == 'Y')
     {
      bf.len = bif.len = f1.len1 = f2.len2 = 0;
      f3.len3 = rf.len = bbf.len = 0;
     }
     break;

    case 2:
     readfile(&bf, &bif, &f1, &f2, &f3, &rf, &bbf);
     break;
    }
    break;

   case 2:
    ReaderManage(rf);
    break;

   case 3:
    printf("圖書(shū)管理子系統(tǒng)\n");
    printf("--------------\n");
    printf("1.圖書(shū)信息輸入\n");
    printf("2.圖書(shū)信息查詢\n");
    printf("--------------\n");
    printf(" 請(qǐng) 選 擇 :");
    scanf("%d", &j);
    if (j == 1)
    {
     char yn = 'y';
     int k = 1;
     while (yn = 'y' || yn == 'Y')
     {
      bf = AppeDBaseRec(bf);
      bif = ChangeBnoIdxF(bf, bif);
      f1 = ChangeLinkHeadF1(&bf, f1);
      f2 = ChangeLinkHeadF2(&bf, f2);
      f3 = ChangeLinkHeadF3(&bf, f3);
      ShowRec(bf, k);
      k++;
      printf("繼續(xù)輸入嗎?y/n:");
      getchar();
      scanf("%c", &yn);
     }
    }
    else
     SearchBook(bf, bif, f1, f2, f3);
    break;

   case 4:
     printf("圖書(shū)流通子系統(tǒng)\n");
     printf("--------------\n");
     printf(" 1. 借書(shū)處理 \n");
     printf(" 2. 還書(shū)處理 \n");
     printf("--------------\n");
     printf(" 請(qǐng) 選 擇 : \n");
     scanf("%d", &j);
     if (j == 1)
      BorrowBook(&bf, bif, &bbf, &rf);
     else if (j == 2)
      BackBook(&bf, bif, &bbf, &rf);
     break;

    case 5:
     printf("系統(tǒng)正在寫(xiě)盤(pán),請(qǐng)稍后......\n");
     writefile(bf, bif, f1, f2, f3, rf, bbf);
     printf("再見(jiàn)!\n");
     return 0;
  }

 }
}

感謝各位的閱讀!關(guān)于“基于C語(yǔ)言如何實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI