當前位置:成語大全網 - 古籍修復 - 借同學百度知道問的,求壹個C語言課程設計,關於圖書館借閱的程序。

借同學百度知道問的,求壹個C語言課程設計,關於圖書館借閱的程序。

這個不是我寫的,但改改就能用。希望對妳能有幫助。。。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

//

#define MAXSIZE 100 //最大值定義為100

#define LIST_INIT_SIZE 100//圖書證使用者最大值定義為100

//借書人的結構體

typedef struct Boro//借書行為

{

char BNum[20];//借書的書號

char RetDate[8];//歸還日期

struct Boro *next;

}Bor;

typedef struct LinkBook

{

Bor *next;//該圖書證的借書行為

char CNum[20];//證號

int Total;//借書的數量

}lend[LIST_INIT_SIZE];//借書人數組

//圖書的結構體信息

typedef struct LNode

{

char CardNum[20];//圖書證號

struct LNode *next;

}LinkList; //借書人

typedef struct book

{//每種圖書需要登記的內容包括書號ISBN、書名、作者、出版社、總庫存量和現庫存量。

char num[20];//書號

char name[20];//書名

char auth[20];//作者

char pub[20];//出版社

int TotNum;//總庫存

int NowNum;//現庫存

LinkList *next;//借了該書的人

}ook[MAXSIZE];

//

int Retotal;//讀者數量

int total; //定義外部變量.書的種類數

//

//結構體初始化

void InitBo(ook &boo) //初始化圖書信息

{

for(int i=0;i<MAXSIZE;i++)

{

boo[i].NowNum=0;

boo[i].TotNum=0;

boo[i].next=NULL;

}

}

void InitRe(lend &Lin) //初始化借閱者信息

{

for(int i=0;i<LIST_INIT_SIZE;i++)

Lin[i].next=NULL;

}

//

int mid=0;//外部函數mid,用來返回查找到的位置

bool BinarySearch(ook boo,char SearchNum[]) //二分法查找比較書號

{ //用bool函數,但由於函數不能有兩個返回值,所以設置壹個外部變量mid,用來返回查找到的位置

int low=0,high=total-1;

int found=0;

while(low<=high)

{

mid=(low+high)/2; //中間點

if(strcmp(boo[mid].num,SearchNum)==0) //書號相同

{

found=1;

return true;

}//查找成功

if(strcmp(boo[mid].num,SearchNum)!=0)//書號不同

high=mid-1;

else low=mid+1;

}

if(found==0)

return false; //查找失敗

}

void Buy(ook &boo, char BuyNum[])

{//1、 采編入庫:新購入壹種書,如果該書在圖書賬目中已經存在,則將其庫存量增加(包

//括總庫存量和現庫存量),如果該書不存在,則在圖書賬目中增加壹種書,總庫存量和現庫存量均為1。

if(BinarySearch(boo,BuyNum)) //如果書庫中有此書

{

boo[mid].TotNum++; //總庫存加1

boo[mid].NowNum++; //現庫存加1

printf("入庫成功.\n");

printf("已更改書庫中該書的信息。編號 %s 的書 %s 作者是 %s ,出版社是 %s ,目前的總庫存是 %d ,現庫存是 %d 。\n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].TotNum,boo[mid].NowNum);

}

if(!BinarySearch(boo,BuyNum))

{

for(int i=total;i>mid&&total;i--) //插在適合位置 保持有序

boo[i]=boo[i-1]; //空出插入位置

printf("該書在書庫中不存在。設立新書目,請補全書的詳細信息。\n");

strcpy(boo[i].num,BuyNum);

printf("該書購入的數量是:");

scanf(" %d",&boo[i].NowNum);

boo[i].TotNum=boo[i].NowNum;

printf("該書的名字是:");

scanf(" %s",&boo[i].name);

printf("該書的作者是:");

scanf(" %s",&boo[i].auth);

printf("該書的出版社是:");

scanf(" %s",&boo[i].pub);//補全信息

boo[i].next=NULL;

total++;//總量+1

printf("已增加該書的信息。編號 %s 的書 %s 作者是 %s ,出版社是 %s ,目前的總庫存是 %d ,現庫存是 %d 。\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);

printf("入庫成功.\n");

}

}

void Delete(ook &boo,char DeleteNum[])

{//2、 清空庫存:某壹種書已無保留價值,將它從圖書賬目中註銷。

if(BinarySearch(boo,DeleteNum)==false||total==0) //如果無此書

printf("書庫中沒有該書.\n");

if(BinarySearch(boo,DeleteNum))//若有

{

if(!boo[mid].next)

{

for(int j=mid;j<total;j++)

boo[j]=boo[j+1];

strcpy(boo[j].num,boo[j+1].num);

strcpy(boo[j].name,boo[j+1].name);

strcpy(boo[j].auth,boo[j+1].auth);

strcpy(boo[j].pub,boo[j+1].pub);

boo[j].TotNum=boo[j+1].TotNum;

boo[j].NowNum=boo[j+1].NowNum;

printf("已成功刪除該書.\n");

}

else printf("該書有借閱者,無法刪除。\n");

}

}

void Borrow(ook &boo,lend &Lin,char BorrowNum[],char CaNum[])

{//3、 借閱:如果壹種書的現庫存量大於零,則借出壹本書,將現庫存量減1,

//並登記借閱者的圖書證號和歸還期限。

Bor *p,*q;

LinkList *m,*n;

if(!BinarySearch(boo,BorrowNum)||total==0) //如果沒有找到此書

printf("書庫裏沒這書。\n");//如果有這書

if(BinarySearch(boo,BorrowNum)) //書庫裏有

{

if(boo[mid].NowNum>0) //看現庫存是否大於0

{

boo[mid].NowNum--;//借出壹本,少1

if(boo[mid].next==NULL) //若該書信息下顯示該種書還沒被人借過

{

m=(LinkList *)malloc(sizeof(LNode));//分配

boo[mid].next=m;//該圖書信息中的鏈表的第壹個結點

strcpy(m->CardNum,CaNum);

m->next=NULL;//後壹個結點為空

}

else //如果已經有人在借這書了

{

m=boo[mid].next;

while(m->next) //遍歷到最後壹個結點

m=m->next;

n=(LinkList *)malloc(sizeof(LNode));//分配空間,增加1個結點

m->next=n;

strcpy(n->CardNum,CaNum);//記錄證號

n->next=NULL;

}

int i=0;

for(i=0;i<Retotal;i++)//

{

if(!strcmp(Lin[i].CNum,CaNum))//如果已經有該圖書證的信息

{

p=Lin[i].next;

while(p->next)p=p->next;//遍歷到最後壹個結點

q=(Bor *)malloc(sizeof(Boro));//分配空間

p->next=q;

strcpy(q->BNum,BorrowNum); //記錄書號

printf("輸入歸還日期:");

scanf("%s",&q->RetDate);

q->next=NULL;

printf("借閱成功.\n");

break; //找到證了就跳出循環

}

}

if(i==Retotal)//如果沒有這張證的信息

{

strcpy(Lin[i].CNum,CaNum); //記錄證號

p=(Bor *)malloc(sizeof(Boro)); //分配空間

Lin[i].next=p;

strcpy(p->BNum,BorrowNum);

printf("輸入歸還日期:");

scanf(" %s",&p->RetDate);

p->next=NULL;

Retotal++; //借閱證號信息總數加1

printf("借閱成功.\n");

}

}

else printf("借閱失敗.該書現在庫存為0.\n");

}

}

void Return(ook &boo,lend &Lin,char ReturnNum[],char BorrowerNum[])

{//4、 歸還:註銷對借閱者的登記,改變該書的現存量。

Bor *p,*q;

LinkList *m,*n;

int flag=0;//設置壹個參數

if(!BinarySearch(boo,ReturnNum)||!total) //沒書

printf("書庫中無此書.\n");

if(BinarySearch(boo,ReturnNum)) //有書

{

m=boo[mid].next;

if(!strcmp(m->CardNum,BorrowerNum)) //如果是第壹個借的人還的

{

boo[mid].NowNum++; //現庫存加1

boo[mid].next=m->next; //刪除結點

free(m); //釋放該結點的空間空間

}

else

{

while(m->next) //查找歸還者的借閱者結點

{

if(!strcmp(m->next->CardNum,BorrowerNum)) //如果找到

{

n=m->next; //n為歸還者的借閱結點

m->next=n->next; //m指向歸還者的借閱結點的下壹結點

free(n); //釋放空間

boo[mid].NowNum++; //現庫存加1

break;

}

m=m->next;

}

}

}

//在借閱者表裏查找借閱者信息

for(int i=0;i<Retotal;i++)

{

if(!strcmp(Lin[i].CNum,BorrowerNum)) //如果找到借閱者

{

p=Lin[i].next;

if(!strcmp(p->BNum,ReturnNum)) //如果是歸還的是借的第壹本書

{

Lin[i].next=p->next; //指向下壹借書結點

free(p); //釋放結點空間

printf("成功歸還該書.\n");

flag=1;

break;

}

else //找不到

{

while(p->next) //找到歸還書的借書結點

{

if(!strcmp(p->next->BNum,ReturnNum)) //如果找到

{

q=p->next; //q為歸還書的借書結點

p->next=q->next; //p指向下壹借書結點

free(q); //釋放空間

printf("成功歸還該書.\n");

flag=1;

break;

}

p=p->next;

}

}

}

}

for(int k=0;k<Retotal;k++)

if(!Lin[k].next)

{

for(int j=k;j<Retotal;j++)

Lin[j]=Lin[j+1]; //其後都往前移壹位,覆蓋掉當前信息

strcpy(Lin[j].CNum," "); //刪除圖書證號

Retotal--; //圖書證數減1

} //刪除當前狀態下沒借書的圖書證的信息,節省空間

if(flag==0) printf("無該證信息.\n");

}

//5、 查找:實現按三種查詢條件之壹查找:按書號查找、

//按書名查找、按作者查找。註:可不實現組合查找,即幾個條件組合查找。

void SearchByNum(ook &boo,char SeaNum[])

{//BY NUM 根據書號查找

LinkList *p;

p=boo[mid].next;

if(BinarySearch(boo,SeaNum)==false)printf("對不起,未找到您想查找的書。\n");//二分查找 沒找到

else//找到了的話

{

{

printf("┏━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━┳━━━━━┓\n");

printf("┃ 書號 ┃ 書名 ┃ 作者 ┃ 出版社 ┃ 現庫存 ┃ 總庫存 ┃\n");

printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━╋━━━━━┫\n");

printf("┃%14s┃%14s┃%16s┃%16s┃%10d┃%10d┃\n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].NowNum,boo[mid].TotNum);

printf("┗━━━━━━━┻━━━━━━━┻━━━━━━━━┻━━━━━━━━┻━━━━━┻━━━━━┛\n");

if(boo[mid].next!=NULL)

{

printf("┏━━━━━━━┓\n");

printf("┃ 已借該書的 ┃\n");

printf("┃ 圖書證號 ┃\n");

while(p)

{

printf("┣━━━━━━━┫\n");

printf("┃%14s┃\n",p->CardNum);

p=p->next;

}

printf("┗━━━━━━━┛\n");

}

}

while(p)

{

printf(" %s ",p->CardNum);//在按書號查找的函數裏也顯示借了這本書的借閱者的證號

p=p->next;

}

printf(" \n");

}//顯示查找的書籍的信息

}

void SearchByName(ook &boo)

{//BY NAME 根據書名查找

char SeaName[20];

printf("輸入想查找的書的書名:\n");

scanf(" %s",&SeaName);

printf("找到符合該書名的書的詳細信息如下:\n");

for(int i=0;i<total;i++)

{

if(strcmp(SeaName,boo[i].name)==0)//如果書名壹樣

{

printf("書號:%s\n書名:%s\n作者:%s\n出版社:%s\n總庫存量:%d\n現庫存量:%d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);

}//顯示符合信息的所有書籍的信息

}

}

void SearchByAuth(ook &boo)

{// BY AUTH 根據作者查找

char SeaAuth[20];

printf("輸入想查找的書的作者:\n");

scanf(" %s",&SeaAuth);

printf("找到符合該作者的書的詳細信息如下:\n");

for(int i=0;i<total;i++)

{

if(strcmp(SeaAuth,boo[i].auth)==0)//如果作者壹樣

{

printf("書號:%s\n書名:%s\n作者:%s\n出版社:%s\n總庫存量:%d\n現庫存量:%d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);

}//顯示符合信息的所有書籍的信息

}

}

//6、 查看:可查看某圖書證號的借閱者借閱的全部圖書,可查看全部超期未還的圖書。

void ViewCard(ook &boo,lend &Lin)

{//查看某圖書證號的借閱者借閱的全部圖書

char Num[20];

printf("請輸入您所想要查看的圖書證號:\n");

scanf(" %s",&Num);

Bor *p;

int qqq=0;

for(int i=0;i<Retotal;i++)

{

if(strcmp(Lin[i].CNum,Num)==0) //找到該證

{

printf("這個證借的書有:\n");

p=Lin[i].next;

while(p)

{

printf(" %s ",p->BNum); //書號

p=p->next;

}

printf("\n");

qqq=1;

break;

}

}

if(qqq==0)

printf("該證不存在.\n");

}

void ViewBook(ook &boo,lend &Lin)

{//查看全部超期未還的圖書

char date[8];

Bor *p;

printf("請輸入日期(請按格式20060605輸入):\n");

scanf(" %s",&date);

printf("所有超期未還的書有:\n");

for(int i=0;i<Retotal;i++)

{

p=Lin[i].next;

while(p)//當p不空時

{

if(strcmp(p->RetDate,date)<0) //超過日期

{

printf("書號為 %s 證號為 %s 應歸還日期為 %s \n",p->BNum,Lin[i].CNum,p->RetDate);

}//顯示所有超期未還的書的信息

p=p->next;

}

}

}

void Menu() //菜單

{

printf("┏—————————————————M E N U————————————————┓\n");

printf("│ │\n");

printf("│ 1. 采編入庫:新購入壹種書,如果該書在圖書賬目中已經存在, │\n");

printf("│ 則將其庫存量增加(包括總庫存量和現庫存量)。 │\n");

printf("│ 如果該書不存在,則在圖書賬目中增加壹種書, │\n");

printf("│ 總庫存量和現庫存量均為輸入的數字。 │\n");

printf("│ 2. 清空庫存:某壹種書已無保留價值,將它從圖書賬目中註銷。 │\n");

printf("│ 3. 借閱:如果壹種書的現庫存量大於零,則借出壹本書,將現庫存量減1, │\n");

printf("│ 並登記借閱者的圖書證號和歸還期限。 │\n");

printf("│ 4. 歸還:註銷對借閱者的登記,改變該書的現存量。 │\n");

printf("│ 5. 按書號查找。 │\n");

printf("│ 6. 按書名查找。 │\n");

printf("│ 7. 按作者查找。 │\n");

printf("│ 8. 查看某圖書證號的借閱者借閱的全部圖書。 │\n");

printf("│ 9. 查看全部超期未還的圖書。 │\n");

printf("│ 0. 退出圖書管理系統。 │\n");

printf("│ │\n");

printf("┗—————————————請 選 擇 妳 需 要 的 操 作————————————┛\n");

}

void main()

{

ook Bo;

lend Lin;

char BNum[20];

char CNum[20];

printf("-----------------------歡 迎 進 入 圖 書 管 理 系 統!---------------------------\n\n");

int choice=10;

int SearchCho=10,ViewCho=10;

while(choice!=0)

{

Menu();//顯示菜單

scanf(" %d",&choice);

switch(choice)

{

case 1://采編入庫

printf("請輸入入庫的書的書號:");

scanf(" %s",BNum);

Buy(Bo,BNum);

break;

case 2://清空庫存

printf("請輸入想要清除的書的書號:");

scanf(" %s",BNum);

Delete(Bo,BNum);

break;

case 3://借閱

printf("請輸入想要借閱的書的書號:\n");

scanf(" %s",&BNum);

printf("請輸入圖書證號:");

scanf(" %s",&CNum);

Borrow(Bo,Lin,BNum,CNum);

break;

case 4://歸還

printf("請輸入想要歸還的書的書號:\n");

scanf(" %s",&BNum);

printf("請輸入圖書證號:");

scanf(" %s",&CNum);

Return(Bo,Lin,BNum,CNum);

break;

case 5://查找//根據書號查找

printf("請輸入書號:");//輸入書號查找

scanf(" %s",&BNum);

SearchByNum(Bo,BNum);

break;

case 6://根據書名查找

SearchByName(Bo);

break;

case 7://根據作者查找

SearchByAuth(Bo);

break;

case 8://查看某圖書證所借的所有書

ViewCard(Bo,Lin);

break;

case 9: //查看全部超期未還的書

ViewBook(Bo,Lin);

break;

case 0://退出系統

exit(0);break;

default:printf("輸入錯誤!\n");exit(0);break;

}

}

}