圖書館管理系統課程設計
❶ 數據結構課程設計(基於C) 圖書管理系統
頭文件:
============
#ifndef _DATA_STRUCT_H_
#define _DATA_STRUCT_H_
/*圖書結構*/
struct Book
{
unsigned long BookID;/*圖書編號*/
char BookName[512];/*書名*/
char Writer[512];/*作者*/
int CurrentNumber;/*現存量*/
Book *pNext;/*下一個圖書信息*/
};
/*圖書索引結構*/
struct Index
{
unsigned long BookID;/*圖書編號*/
Index *pNext;/*下一個索引指針*/
};
/*借閱信息結構*/
struct Borrow
{
unsigned long BookID;/*借閱圖書編號*/
char BookName[512];/*書名*/
unsigned long StuID;/*圖書證號*/
char ReturnTime[512];/*歸還日期*/
Borrow *pNext;/*下一個借閱信息*/
};
#endif/*_DATA_STRUCT_H_*/
實現文件:
===============
// BookManage.cpp : 定義控制台應用程序的入口點。
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "DataStruct.h"
/*
數據結構課程設計(基於C) 圖書管理系統
懸賞分:100 - 離問題結束還有 14 天 23 小時
【問題描述】
圖書管理基本業務活動包括,對一本書的采編入庫、清楚庫存、借閱和歸還等等。試設計一個圖書管理系統,將上述業務活動藉助於計算機系統完成。
【基本要求】
(1) 每種書的登記至少包括書號書名作者現存量總庫存量5項
(2)對書號建立索引表(線性表)以提高查找效率
(3) 系統要實現的操作及其功能定義如下:
1 采編入庫:新購入一種書,經分類和確定數好之後登記到圖書館賬目中去。如果這種書在賬戶中已有,則只將總庫存量增加。
2借閱:如果一本書的現存量大於零,則借出一本,登出借閱者的圖書證號和歸還日期
3歸還:注銷對借閱者的登記,改變該書的現存量
*/
/*獲取輸入字元串*/
void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber = false);
/*顯示主菜單 並返回選擇*/
int ShowMainMenu();
/*圖書入庫操作,傳入參數為圖書列表頭指針的指針和索引信息的頭指針的指針,因為在此函數內部可能會改變頭指針的值*/
void PutBookInLib(Book **pHead,Index **pIndex);
/*查詢圖書館庫存,查詢不改變數據,故傳入指針即可*/
void QueryBookLib(Book *pHead);
/*借閱圖書*/
void BorrowBook(Borrow **pBorrow,Book *pHead);
/*查詢借閱*/
void QueryBorrow(Borrow *pBorrow);
/*歸還圖書*/
void ReturnBook(Borrow **pBorrow,Book *pHead);
/*釋放圖書鏈表及索引鏈表及借閱信息鏈表*/
void DeleteBookList(Book **pHead);
void DeleteIndexList(Index **pIndex);
void DeleteBorrowList(Borrow **pBorrow);
int main()
{
/*圖書列表頭指針*/
Book *pBookHead = NULL;
/*圖書索引頭指針*/
Index *pIndexHead = NULL;
/*借閱信息頭指針*/
Borrow *pBorrowHead = NULL;
/*用來保存當前用戶的輸入*/
int ChoosedNum = -1;
while ( true )
{
ChoosedNum = ShowMainMenu();
switch(ChoosedNum)
{
case 0 :/*退出*/
{
return 0;
break;
}
case 1:/*圖書入庫*/
{
PutBookInLib(&pBookHead,&pIndexHead);
break;
}
case 2:/*查詢庫存*/
{
QueryBookLib(pBookHead);
printf("按回車鍵繼續...");
fflush(stdin);
getchar();
system("cls");
break;
}
case 3:/*借閱圖書*/
{
QueryBookLib(pBookHead);
BorrowBook(&pBorrowHead,pBookHead);
break;
}
case 4:/*查詢借閱*/
{
QueryBorrow(pBorrowHead);
printf("按回車鍵繼續...");
fflush(stdin);
getchar();
system("cls");
break;
}
case 5:/*歸還圖書*/
{
QueryBorrow(pBorrowHead);
ReturnBook(&pBorrowHead,pBookHead);
break;
}
}
}
DeleteBookList(&pBookHead);
DeleteIndexList(&pIndexHead);
DeleteBorrowList(&pBorrowHead);
fflush(stdin);
getchar();
return 0;
}
/*獲取輸入字元串*/
void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber)
{
memset(pInOutStr,0x0,StrLen);
fflush(stdin);
int Count = 0;
while ( true )
{
char TmpC = 0;
fread(&TmpC,1,1,stdin);
if ( 10 == TmpC )
{
break;
}
if ( OnlyGetNumber && TmpC >= '0' && TmpC <= '9' )
{
pInOutStr[Count] = TmpC;
Count++;
}
else
{
pInOutStr[Count] = TmpC;
Count++;
}
}
}
/*顯示主菜單 並返回選擇*/
int ShowMainMenu()
{
char InPutStr[1024];
NO_INPUT:
printf("\n\n\n");
printf("******************************************************************\n");
printf("* 圖書管理系統 *\n");
printf("******************************************************************\n");
printf("\n");
printf("請選擇:\n");
printf("\t1.圖書入庫\n");
printf("\t2.查詢庫存\n");
printf("\t3.借閱圖書\n");
printf("\t4.查詢借閱\n");
printf("\t5.歸還圖書\n");
printf("\t0.退出\n");
printf("\n");
printf("\t輸入 : ");
GetInput(InPutStr,1024,true);
if ( strlen(InPutStr) < 1 )
{
system("cls");
goto NO_INPUT;
}
return atoi(InPutStr);
}
/*圖書入庫操作*/
void PutBookInLib(Book **pHead,Index **pIndex)
{
Book *pWork = *pHead;
unsigned long BookID = 1;
char InPutStr[1024];
/*先計算處當前入庫圖書的ID號*/
if ( NULL == pWork )
{
BookID = 1;
}
else
{
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
BookID = pWork->BookID + 1;
}
Book *pTmpNewBook = (Book *)(malloc(sizeof(Book)));
memset(pTmpNewBook,0x0,sizeof(Book));
Index *pTmpIndex = (Index *)(malloc(sizeof(Index)));
memset(pTmpIndex,0x0,sizeof(Index));
pTmpNewBook->BookID = BookID;
pTmpIndex->BookID = BookID;
system("cls");
printf("輸入圖書名稱 : ");
GetInput(InPutStr,1024);
strcpy(pTmpNewBook->BookName,InPutStr);
system("cls");
printf("<<%s>>\n",pTmpNewBook->BookName);
printf("圖書作者 : ");
GetInput(InPutStr,1024);
strcpy(pTmpNewBook->Writer,InPutStr);
system("cls");
printf("<<%s>>\n",pTmpNewBook->BookName);
printf("作者:%s\n",pTmpNewBook->Writer);
printf("入庫數量 : ");
GetInput(InPutStr,1024,true);
pTmpNewBook->CurrentNumber = atoi(InPutStr);
if ( pTmpNewBook->CurrentNumber < 1 )
{
system("cls");
printf("入庫數量錯誤!(按回車鍵繼續...)");
fflush(stdin);
getchar();
system("cls");
return;
}
if ( NULL == *pHead )
{
*pHead = pTmpNewBook;
*pIndex = pTmpIndex;
}
else
{
Book *pWork = *pHead;
while ( pWork != NULL )
{
if ( strcmp(pWork->BookName,pTmpNewBook->BookName) == 0 && strcmp(pWork->Writer,pTmpNewBook->Writer) == 0 )
{
pWork->CurrentNumber += pTmpNewBook->CurrentNumber;
return;
}
pWork = pWork->pNext;
}
pWork = *pHead;
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
pWork->pNext = pTmpNewBook;
Index *pWork2 = *pIndex;
while ( pWork2->pNext != NULL )
{
pWork2 = pWork2->pNext;
}
pWork2->pNext = pTmpIndex;
}
system("cls");
printf("圖書:<<%s>>\n作者:%s\n入庫數:%d\n\n入庫操作成功!(按回車鍵繼續...)",pTmpNewBook->BookName,pTmpNewBook->Writer,pTmpNewBook->CurrentNumber);
fflush(stdin);
getchar();
system("cls");
}
/*釋放圖書鏈表及索引鏈表*/
void DeleteBookList(Book **pHead)
{
Book *pWork = *pHead;
Book *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
void DeleteIndexList(Index **pIndex)
{
Index *pWork = *pIndex;
Index *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
void DeleteBorrowList(Borrow **pBorrow)
{
Borrow *pWork = *pBorrow;
Borrow *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
/*查詢圖書館庫存,查詢不改變數據,故傳入指針即可*/
void QueryBookLib(Book *pHead)
{
Book *pWork = pHead;
int TotalCount = 0;
while ( NULL != pWork )
{
TotalCount++;
pWork = pWork->pNext;
}
system("cls");
printf("當前庫存共%d種圖書,列表如下:\n=====================================================\n",TotalCount);
pWork = pHead;
while ( NULL != pWork )
{
printf("編號:[%d] 書名:<<%s>> 作者:%s 當前庫存:%d\n",pWork->BookID,pWork->BookName,pWork->Writer,pWork->CurrentNumber);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*借閱圖書*/
void BorrowBook(Borrow **pBorrow,Book *pHead)
{
char InPutStr[1024];
bool HadTheBook = false;
Borrow *pTmpBorrow = (Borrow *)(malloc(sizeof(Borrow)));
memset(pTmpBorrow,0x0,sizeof(Borrow));
printf("請輸入你想借書的編號 : ");
GetInput(InPutStr,1024,true);
pTmpBorrow->BookID = atoi(InPutStr);
Book *pWorkBook = pHead;
while ( pWorkBook != NULL )
{
if ( pWorkBook->BookID == pTmpBorrow->BookID )
{
HadTheBook = true;
break;
}
pWorkBook = pWorkBook->pNext;
}
if ( HadTheBook )
{
if ( pWorkBook->CurrentNumber < 1 )
{
system("cls");
printf("圖書<<%s>>當前無庫存,無法借閱!\n(按回車鍵繼續...)",pWorkBook->BookName);
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
}
else
{
system("cls");
printf("圖書編號%d不存在!\n(按回車鍵繼續...)",pTmpBorrow->BookID);
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
strcpy(pTmpBorrow->BookName,pWorkBook->BookName);
printf("請輸入借書證號 : ");
GetInput(InPutStr,1024,true);
pTmpBorrow->StuID = atoi(InPutStr);
if ( 0 == pTmpBorrow->StuID )
{
system("cls");
printf("借書證號不存在(借書證號輸入整數)!\n(按回車鍵繼續...)");
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
time_t ltime;
struct tm *today;
time(<ime);
ltime += 60 * 60 * 24 * 30;
today = localtime(<ime);
sprintf(pTmpBorrow->ReturnTime,"%d年%d月%d日", today->tm_year+1900,
today->tm_mon+1,
today->tm_mday);
if ( *pBorrow == NULL )
{
*pBorrow = pTmpBorrow;
}
else
{
Borrow *pWork = *pBorrow;
while ( NULL != pWork->pNext )
{
pWork = pWork->pNext;
}
pWork->pNext = pTmpBorrow;
}
pWorkBook->CurrentNumber--;
system("cls");
printf("借書證號:%d\n借閱圖書:<<%s>>\n\n操作成功!(按回車鍵繼續...)",pTmpBorrow->StuID,pTmpBorrow->BookName);
fflush(stdin);
getchar();
system("cls");
}
/*查詢借閱*/
void QueryBorrow(Borrow *pBorrow)
{
Borrow *pWork = pBorrow;
int TotalCount = 0;
while ( NULL != pWork )
{
TotalCount++;
pWork = pWork->pNext;
}
system("cls");
printf("當前借閱信息共%d條,列表如下:\n=====================================================\n",TotalCount);
pWork = pBorrow;
while ( NULL != pWork )
{
printf("借數證號:[%d] 借書名:<<%s>> 圖書編號:%d 歸還日期:%s\n",pWork->StuID,pWork->BookName,pWork->BookID,pWork->ReturnTime);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*歸還圖書*/
void ReturnBook(Borrow **pBorrow,Book *pHead)
{
char InPutStr[1024];
Borrow TmpBorrow;
bool HasFindBorrwo = false;
memset(&TmpBorrow,0x0,sizeof(TmpBorrow));
printf("請輸入借書證號 : ");
GetInput(InPutStr,1024,true);
TmpBorrow.StuID = atoi(InPutStr);
printf("請輸入所還圖書編號 : ");
GetInput(InPutStr,1024,true);
TmpBorrow.BookID = atoi(InPutStr);
Borrow *pWorkBorrow = *pBorrow;
Borrow *pDeletePre = NULL;
while ( NULL != pWorkBorrow )
{
if ( pWorkBorrow->BookID == TmpBorrow.BookID && pWorkBorrow->StuID == TmpBorrow.StuID )
{
HasFindBorrwo = true;
break;
}
pDeletePre = pWorkBorrow;
pWorkBorrow = pWorkBorrow->pNext;
}
if ( ! HasFindBorrwo )
{
system("cls");
printf("你輸入的借書信息不存在!\n(按回車鍵繼續...)");
fflush(stdin);
getchar();
system("cls");
return;
}
if ( NULL == pDeletePre )
{
*pBorrow = pWorkBorrow->pNext;
}
else
{
pDeletePre->pNext = pWorkBorrow->pNext;
}
Book *pWorkBook = pHead;
while ( NULL != pWorkBook )
{
if ( pWorkBook->BookID == pWorkBorrow->BookID )
{
pWorkBook->CurrentNumber ++;
}
pWorkBook = pWorkBook->pNext;
}
system("cls");
printf("借書證號:%d\n歸還圖書:<<%s>>\n\n操作成功!(按回車鍵繼續...)",pWorkBorrow->StuID,pWorkBorrow->BookName);
fflush(stdin);
getchar();
system("cls");
free(pWorkBorrow);
}
❷ 數據結構課程設計:小型圖書管理系統
^^#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N sizeof(struct book)
#define PT "%-5d %10s %6s %6s %8s %3d \n",p->num,p->name,p->where,p->author,p->pub,p->count
struct book /*圖書信息*/
{
int num; /*書號*/
char name[10]; /*書名*/
char where[10]; /*所在書庫*/
char author[15]; /*作者*/
char pub[20]; /*出版社*/
int count; /*數量*/
struct book *next;
};
/*輸出模塊*/
void print(struct book *p0)
{
struct book *p;
p=p0->next;
printf("\n\n\t\t^^^^^^^^^^^^^^圖書信息表^^^^^^^^^^^^^^");
printf("\n\n圖書編號---圖書名稱---所在書庫----作者----出版社---數量\n");
while(p!=NULL)
{
printf(PT);
p=p->next;
}
getch();
}
/*輸入模塊*/
struct book *creat()
{
struct book *head,*p1,*p2;
int i=0;
head=p2=(struct book *)malloc(N);
head->next=NULL;
printf("\n\n\t\t錄入圖書信息");
printf("\n\t---------------------------------------");
while(1)
{ p1=(struct book *)malloc(N);
printf("\n 請輸入圖書編號(書號為0結束): ");
scanf("%d",&p1->num);
if(p1->num!=0)
{
printf("\n\n書名 所在書庫 作者 出版社 圖書數量\n");
scanf("%s%s%s%s%d",p1->name,p1->where,p1->author,p1->pub,&p1->count);
p2->next=p1;
p2=p1;
i++;
}
else
break;
}
p2->next=NULL;
free(p1);
printf("\n\t\t----------------------------------------");
printf("\n\t\t %d 種書錄入完畢",i);
getch();
return head;
}
/*查找模塊*/
void find(struct book *p0)
{
char name[10];
int flag=1;
struct book *p;
p=p0->next;
printf("請輸入要查找的書名:\n");
scanf("%s",name);
for(p=p0;p;p=p->next)
if(strcmp(p->name,name)==0)
{
printf("\n\n圖書編號---圖書名稱---所在書庫----作者----出版社---數量\n");
printf(PT);
flag=0;
break;
}
if(flag) printf("\n 暫無此圖書信息\n");
getch();
}
/*刪除模塊*/
void del(struct book *p0)
{
char name[10];
int flag=1;
struct book *p;
p=p0;
printf("請輸入要刪除的書名:\n");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
p0->next=p->next; /*後續節點連接到前驅節點之後*/
free(p);
printf("\t該書資料已刪除.");
flag=0;
break;
}
p0=p;
p=p->next;
}
if(flag) printf("\n\t無此圖書信息。");
getch();
}
/*增加模塊*/
void insert(struct book *p0)
{
struct book *p;
p=(struct book *)malloc(N);
while(1)
{
printf("\n 請輸入要增加的圖書編號(書號為0 退出): ");
scanf("%d",&p->num);
if(p->num!=0)
{
if(p0->next!=NULL&&p0->next->num==p->num) /*找到重號*/
{
p=p->next;
free(p);
printf("\t該書已存在");
}
else
{printf("\n\n書名 所在書庫 作者 出版社 圖書數量\n");
scanf("%s%s%s%s%d",p->name,p->where,p->author,p->pub,&p->count);
p->next=p0->next;
p0->next=p;
printf("\t已成功插入.");
}
}
else
break;
}
getch();
}
/*修改模塊*/
void modify(struct book *p0)
{
char name[10];
int flag=1;
int choice;
struct book *p;
p=p0->next;
printf("請輸入要修改的書名:\n");
scanf("%s",name);
while(p!=NULL&&flag==1)
{
if(strcmp(p->name,name)==0)
{
printf("\n\t請選擇要修改的項:");
printf("\n\t 1.修改圖書編號\n");
printf("\n\t 2.修改圖書所在書庫\n");
printf("\n\t 3.修改圖書作者\n");
printf("\n\t 4.修改圖書出版社\n");
printf("\n\t 5.修改圖書庫存量\n");
scanf("%d",&choice);
switch(choice)
{
case 1: { printf("\n 請輸入新的圖書編號:");
scanf("%d",p->num); break;
}
case 2: { printf("\n 請輸入新的圖書書庫:");
scanf("%s",p->where); break;
}
case 3: { printf("\n 請輸入新的圖書作者:");
scanf("%s",p->author); break;
}
case 4: {printf("\n 請輸入新的圖書出版社:");
scanf("%s",p->pub); break;
}
case 5: {printf("\n 請輸入新的圖書庫存量:");
scanf("%d",p->count); break;
}
}
printf("\n\t該項已成功修改。\n\t 新的圖書信息:");
printf("\n\n圖書編號---圖書名稱---所在書庫----作者----出版社---數量\n");
printf(PT);
flag=0;
}
p0=p;
p=p0->next;
}
if(flag) printf("\n\t暫無此圖書信息。");
getch();
}
/*讀文件*/
struct book *read_file()
{
int i=0;
struct book *p,*p1,*head=NULL;
FILE *fp;
if((fp=fopen("library.txt","rb"))==NULL)
{printf("\n\n\n\n\n \t********庫文件不存在,請創建!**********");
getch();
return NULL;
}
head=(struct book *)malloc(N);
p1=head;
head->next=NULL;
printf("\n 已有圖書信息:");
printf("\n\n圖書編號---圖書名稱---所在書庫----作者----出版社---數量\n");
while(!feof(fp))
{
p=(struct book *)malloc(N); /*開辟空間以存放的取得信息*/
while(fscanf(fp,"%d%s%s%s%s%d",&p->num,p->name,p->where,p->author,p->pub,&p->count)!=EOF)
{
printf(PT);
i++;
}
p1->next=p;
p1=p;
}
p1->next=NULL;
fclose(fp);
printf("\n 共種%d 圖書信息",i);
printf("\n\n\n 文件中的信息以正確讀出。按任意鍵進入主菜單。");
getch();
return (head);
}
/*保存文件*/
void save(struct book *head)
{
FILE *fp;
struct book *p;
fp=fopen("library.txt","wb"); /*以只寫方式打開二進制文件*/
if(fp==NULL) /*打開文件失敗*/
{
printf("\n=====>打開文件失敗!\n");
getch();
return ;
}
else
for(p=head->next;p!=NULL;p=p->next)
fprintf(fp,"%d %s %s %s %s %d\n",p->num,p->name,p->where,p->author,p->pub,p->count);
fclose(fp);
printf("\n\t保存文件成功!\n");
}
void main()
{
struct book *head=NULL;
int choice=1;
head=read_file();
if(head==NULL)
{
printf("\n\t\t**********");
getch();
head=creat();
}
do
{
system("cls");
printf("\t\t----------Welcome---------\n");
printf("\n\n\t歡迎您,圖書管理員.\n");
printf("\n\n\n\n\n");
printf("\n\t 請選擇:");
printf("\n\t 1.查詢圖書信息\n");
printf("\n\t 2.修改圖書信息\n");
printf("\n\t 3.增加圖書信息\n");
printf("\n\t 4.刪除圖書信息\n");
printf("\n\t 5.顯示所有圖書信息\n");
printf("\n\t 0.退出系統\n");
scanf("%d",&choice);
switch(choice)
{
case 1: find(head); break;
case 2: modify(head); break;
case 3: insert(head); break;
case 4: del(head); break;
case 5: print(head); break;
case 0: system("cls");
printf("\n\n\n\n\n\t^^^^^^^^^^謝謝使用,再見^^^^^^^^^^!\n\n");
break;
}
}while(choice!=0);
save(head);
}
❸ C語言課程設計-圖書管理系統
您好!
還是你自己編吧!一班人都沒有那個心思,你這個代碼花的精力太大了,至少要半天才能出來!
非人力所能及!
加油,我相信你自己能寫出更完善的代碼來的!
❹ c語言課程設計 小型圖書管理系統設計
沒有按價格排序,自己加,可以運行
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct BOOK
{
int id,usr[10],total,store,days[10];
char name[31],author[21];
}books[100];
/*上面是結構體的定義,用於存放書籍及借書的信息。*/
void page_title(char *menu_item)
{
printf(">>> 圖 書 管 理 系 統 <<<\n\n- %s -\n\n",menu_item);
}
/*上面是列印頁眉的函數,同時通過參數menu_item,可以顯示當前的狀態。*/
void return_confirm(void)
{
printf("\n按任意鍵返回……\n");
getch();
}
/*上面是返回前請求確認的函數,以便在返回前觀察結果*/
int search_book(void)
{
int n,i;
printf("請輸入圖書序號:");
scanf("%d",&i);
for(n=0;n<100;n++)
{
if(books[n].id==i)
{
printf("書名:%s\n",books[n].name);
printf("作者:%s\n",books[n].author);
printf("存數:%d of ",books[n].store);
printf("%d\n",books[n].total);
return n;
}
}
printf("\n輸入錯誤或無效圖書序號.\n");
return -1;
}
/*上面的函數是在數組中找到圖書號匹配的記錄,顯示其信息並返
回數組下標,如果找不到相應記錄則提示錯誤並返回-1。*/
void book_out(void)
{
int n,s,l,d;
page_title("借閱圖書");
if((n=search_book())!=-1&&books[n].store>0)
{
printf("請輸入借書證序號:");
scanf("%d",&s);
printf("請輸入可借天數:");
scanf("%d",&d);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==0)
{
books[n].usr[l]=s;
books[n].days[l]=d;
break;
}
}
books[n].store--;
}
if(n!=-1&&books[n].store==0) printf("此書已經全部借出.\n");
return_confirm();
}
/*上面是借書的函數,首先調用找書函數*/
void book_in(void)
{
int n,s,l;
page_title("歸還圖書");
if((n=search_book())!=-1&&books[n].store<books[n].total)
{
printf("借閱者圖書證列表:\n");
for(l=0;l<10;l++)
if (books[n].usr[l]!=0)
printf("[%d] - %d天\n",books[n].usr[l],books[n].days[l]);
printf("請輸入借書證序號:");
scanf("%d",&s);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==s)
{
books[n].usr[l]=0;
books[n].days[l]=0;
break;
}
}
books[n].store++;
}
if(n!=-1&&books[n].store==books[n].total)
printf("全部入藏.\n");
return_confirm();
}
void book_add(void)
{
int n;
page_title("注冊新書");
for(n=0;n<100;n++)
if(books[n].id==0) break;
printf("序號:");
scanf("%d",&books[n].id);
printf("書名:");
scanf("%s",&books[n].name);
printf("作者:");
scanf("%s",&books[n].author);
printf("數量:");
scanf("%d",&books[n].total);
books[n].store=books[n].total;
return_confirm();
}
void book_del(void)
{
int n;
page_title("注銷舊書");
if((n=search_book())!=-1) books[n].id=0;
printf("該書已注銷.\n");
return_confirm();
}
void main(void)
{
menu: page_title("操作選單");
printf("請用數字鍵選擇操作\n\n");
printf("\t\t1 借閱圖書\t2 歸還圖書\n");
printf("\t\t3 注冊新書\t4 注銷舊書\n");
printf("\t\t0 退出\n");
switch(getch())
{
case '1' : book_out();break;
case '2' : book_in();break;
case '3' : book_add();break;
case '4' : book_del();break;
case '0' : exit(0);
}
goto menu;
}
❺ 高分求一份完整圖書管理系統資料庫課程設計
目錄
第一章 系統概述 1
1.1 系統開發背景和意義 1
1.2 開發環境 1
第二章 系統需求分析 2
2.1 任務概述 2
2.2 數據描述(數據流圖+數據字典) 2
2.3 功能需求 6
2.4性能需求 6
第三章 系統總體設計 8
3.1 新的業務流程 8
3.2 系統功能模塊圖 8
3.3 系統的流程圖 9
第四章 詳細設計 11
4.1 程序流程圖 11
4.2 程序輸入輸出描述 13
4.2.1 主模塊 13
4.2.1 學生管理模塊 13
4.2.2 圖書管理模塊 13
4.2.3 借閱管理模塊 13
4.2.4 歸還管理模塊 13
4.2.5 管理措施設置模塊 13
4.3 程序介面描述 14
4.3.1 外部介面 14
4.3.2 內部介面 14
4.4 資料庫的設計 14
4.4.1 資料庫的邏輯設計 14
4.4.2 資料庫的物理設計 16
第五章 編碼實現 19
5.1 程序編碼 19
第六章 測試分析報告 37
6.1 測試計劃和要點 37
6.1.1 主模塊測試要點 37
6.1.2 借閱模塊測試要點 37
6.1.3 學生查詢模塊測試要點 37
6.1.4 圖書查詢模塊測試要點 38
6.1.5 圖書歸還模塊測試要點 38
6.2 測試用例 38
6.2.1 主模塊測試用例 39
6.2.2 借閱模塊測試用例 39
6.2.3 學生查詢模塊測試用例 40
6.2.4 圖書查詢模塊測試用例 40
6.2.5 圖書歸還模塊測試用例 40
6.3 測試結果及結論 41
6.3.1 測試的結果 41
6.3.2 缺陷分析及改進 42
6.3.3 測試結論 43
總結 44
參考文獻 45
第一章 系統概述
1.1 系統開發背景和意義
圖書管理是高校內每一個系部或院部都必須切實面對的工作,但一直以來人們使用傳統的人工方式管理圖書資料。這種方式存在著許多缺點,如效率低、保密性差且較為繁瑣。另外,隨著圖書資料數量的增加,其工作量也將大大增加,這必將增加圖書資料管理者的工作量和勞動強度,這將給圖書資料信息的查找、更新和維護都帶來了很多困難。
經過詳細的調查,目前我國各類高等學校中有相當一部分單點陣圖書資料管理還停留在人工管理的基礎上。這樣的管理機制已經不能適應時代的發展,其管理方法將浪費許多人力和物力。隨著科學技術的不斷提高,這種傳統的手工管理方法必然被以計算機為基礎的信息管理方法所取代。
圖書管理作為計算機應用的一個分支,有著手工管理無法比擬的優點,如檢索迅速、查找方便、可靠性高、存儲量大、保密性好、壽命長、成本低等。這些優點能夠極大地提高圖書管理的效率。因此,開發一套能夠為用戶提供充足的信息和快捷的查詢手段的圖書管理系統,將是非常必要的,也是十分及時的。
1.2 開發環境
開發環境的選擇會影響到資料庫的設計,所以在這里給出圖書管理系統開發與運行環境的選擇如下:
開發環境:Windows 2000
開發工具:Visual Basic 6.0
資料庫管理系統: SQL Server 2000
資料庫伺服器: SQL Server 2000 桌面引擎
第二章 系統需求分析
2.1 任務概述
經過對我校詳細調查,並多次與負責圖書管理的老師進行研討後,加深了對現行圖書管理業務的深刻了解,與此同時,將整個圖書管理的業務流程抽象描述如下:
1.新的圖書購進後,分門別類地進行歸並並匯總,加以編號。
2.新書編號後,上到書架以備學生借閱。
3.如某學生需要借閱圖書,則在其本人的借閱登記表上進行登記,記錄相關借閱信息與借閱日期。
4.學生借閱圖書後,應及時歸還圖書,並在本人的借閱登記表上註明還書日期和時間。
根據以上調查分析,可以給出其現行業務流程圖如圖2.1所示。
圖2.1 現行圖書管理業務流程圖
2.2 數據描述(數據流圖+數據字典)
經過詳細的調查,我們已經清楚了解了現行的業務流程,接下來給出系統的邏輯模型。構造系統邏輯模型的工具是數據流圖和數據字典。根據現行圖書管理的業務流程,首先把數據流圖中的源點和終點都選定為學生,因此可以得到圖書管理系統的基本系統模型,如圖2.2所示。
圖2.2 圖書管理系統的基本系統模型
根據基本系統模型,對其逐步細化,得到描述邏輯系統細化後的數據流圖,如圖2.3所示。
圖2.3 圖書管理系統數據流圖(頂層DFD圖)
對頂層DFD圖中的一個加工「學生管理」進行展開,如圖2.4。
圖2.4 細化後數據流圖
對頂層DFD圖中的一個加工「圖書管理」進行展開,如圖2.5。
圖2.5 「圖書管理」展開
對第1層DFD圖中的加工進一步進行展開,如圖2.6。
(1)
(2)
圖2.6 進一步細化數據流圖
有了系統的數據流圖後,還有相當多的數據信息如圖書、借閱、歸還等信息需要進一步描述,這就是需要定義數據字典,才能把現有的系統描述清楚。圖2.7列出了系統的主要數據字典。
圖2.7 系統主要數據字典
2.3 功能需求
經過以上詳細的用戶調查,在現行業務流程和數據分析的基礎上,基本可以確定系統設計必須達到的目標。
以下是圖書管理系統必須具備的功能:
1.新進圖書的登記功能:對於購進的新書,系統必須具備圖書信息資料的錄入功能。
2.圖書的查詢修改功能:當圖書資料發生變化,如圖書丟失或有錯誤信息輸入時,則應能夠及時對數據進行修改和補充。
3.借閱的登記,歸還的登記功能:系統的主要功能之一,供本校學生借閱圖書、歸還圖書,並進行登記。
4.學生信息的增加、刪除和修改功能:系統主要功能之一,建立學生信息,並對其進行維護。
2.4性能需求
為了保證系統能夠長期、安全、穩定、可靠、高效的運行,圖書管理系統應該滿足以下的性能需求:
1、系統處理的准確性和及時性
系統處理的准確性和及時性是系統的必要性能。在系統設計和開發過程中,要充分考慮系統當前和將來可能承受的工作量,使系統的處理能力和響應時間能夠滿足學校對信息處理的需求。
2、系統的開放性和系統的可擴充性
圖書管理系統在開發過程中,應該充分考慮以後的可擴充性。例如用戶查詢的需求也會不斷的更新和完善。所有這些,都要求系統提供足夠的手段進行功能的調整和擴充。而要實現這一點,應通過系統的開放性來完成,既系統應是一個開放系統,只要符合一定的規范,可以簡單的加入和減少系統的模塊,配置系統的硬體。通過軟體的修補、替換完成系統的升級和更新換代。
3、系統的易用性和易維護性
圖書管理系統是直接面對使用人員的,而使用人員往往對計算機並不時非常熟悉。這就要求系統能夠提供良好的用戶介面,易用的人機交互界面。要實現這一點,就要求系統應該盡量使用用戶熟悉的術語和中文信息的界面;針對用戶可能出現的使用問題,要提供足夠的在線幫助,縮短用戶對系統熟悉的過程。
4、系統的標准性
系統在設計開發使用過程中都要涉及到很多計算機硬體、軟體。所有這些都要符合主流國際、國家和行業標准。
5、系統的先進性
目前計算系統的技術發展相當快,做為圖書管理系統工程,在系統的生命周期盡量做到系統的先進,充分完成企業信息處理的要求而不至於落後。這一方面通過系統的開放性和可擴充性,不斷改善系統的功能完成。另一方面,在系統設計和開發的過程中,應在考慮成本的基礎上盡量採用當前主流並先進且有良好發展前途的產品。
6、系統的響應速度
圖書管理系統系統在日常處理中的響應速度為秒級,達到實時要求,以及時反饋信息。在進行統計分析時,根據所需數據量的不同而從秒級到分鍾級,原則是保證操作人員不會因為速度問題而影響工作效率。
第三章 系統總體設計
3.1 新的業務流程
根據需求分析的得到的現行業務處理流程,在用戶反復研究後,首先確定目標系統的業務流程,其處理流程如圖3.1。
圖3.1 圖書管理系統的業務流程
針對新的業務流程,現具體描述其功能如下:
1.用戶登錄:系統對用戶合法性進行檢查。
2.圖書入庫:對新購進的圖書分類進行編號,並把圖書基本信息錄入計算機。
3.圖書借閱:對已入庫的圖書,學生可以借閱,並進行登記。
4.圖書歸還:對學生已歸還的圖書進行歸還登記。
5.信息查詢:即對所有圖書的借閱情況,或學生的基本情況和借閱情況進行查詢。
6.管理措施:定義系統規定的借閱圖書超期時間、超期處罰辦法和丟失賠償辦法。
3.2 系統功能模塊圖
依據需求分析階段得到的數據流圖,採用軟體工程中軟體設計的概念和原理,與用戶成分協商後,在保證系統基本功能要求的前提下,結合系統新的業務流程確定系統必須具備的所有功能,由此給出圖書管理系統的系統功能模塊圖如圖3.2所示。
圖3.2 圖書管理系統功能模塊圖
3.3 系統的流程圖
依據軟體工程的基本原理,綜合以上分析給出系統流程圖如圖3.4所示。
圖3.4 系統流程圖
第四章 詳細設計
4.1 程序流程圖
依據軟體工程的基本原理,詳細設計階段的根本任務是確定應該怎樣具體實現所要求的系統,也就是說,經過這個階段的設計工作,應該得出對目標系統的精確描述,從而在系統實現階段可以把這個描述直接翻譯成用某種程序設計語言書寫的程序。具體來說就是把經過總體設計得到的各個模塊詳細的加以描述。
由於本系統採用支持面向對象的Visual Basic 6.0作為開發工具,而Visual Basic 6.0採用事件驅動的編程機制,所以在此給出軟體系統的主程序流程圖,如圖4.1所示。
圖4.1 主程序流程圖
根據以上主程序的流程圖,我們可以得出下面的關於各個模塊的程序流程圖,如圖4.2所示。
圖4.2 程序流程圖
4.2 程序輸入輸出描述
4.2.1 主模塊
1.輸入項目:操作系統傳遞至的各種消息以及用戶的輸入數據。
2.輸出項目:用戶界面顯示。
4.2.1 學生管理模塊
1.輸入項目:與學生管理操作子對話框有關的用戶輸入及系統消息。
2.輸出項目:操作結果顯示。
4.2.2 圖書管理模塊
1.輸入項目:用戶口令。
2.輸出項目:相應的界面。
4.2.3 借閱管理模塊
1.輸入項目:學生學號、圖書編號。
2.輸出項目:學生信息、相關借書信息。
4.2.4 歸還管理模塊
1.輸入項目:圖書編號。
2.輸出項目:相關學生信息。
4.2.5 管理措施設置模塊
1.輸入項目:用戶的輸入。
2.輸出項目:根據用戶的輸入顯示相應的對話框。
4.3 程序介面描述
4.3.1 外部介面
按Windows應用軟體用戶界面的規范來設計,使用以對話框為主的用戶界面,便於用戶使用。
4.3.2 內部介面
模塊間介面採用數據耦合方式,通過參數表傳送數據,交換信息。
4.4 資料庫的設計
4.4.1 資料庫的邏輯設計
在需求分析階段已完成該系統所有的數據分析。根據該階段所建立的概念模型,已經得出滿足系統設計要求的幾個關系描述,該階段的主要工作就是把前一階段的成果轉化為具體的資料庫。下面給出概念結構設計得E-R圖如圖4.3所示。
①
②
③
(1) 分E-R圖
(2) 總E-R圖
圖4.3 概念結構設計E-R圖
實體:圖書(圖書編號,書名,作者,出版社,定價,圖書類別,圖書ISBN號,圖書數量)
學生(學生學號,學生姓名,性別,入校時間,畢業時間)
管理員(編號,名字,密碼,加入時間)
聯系:學生管理(圖書管理員,學生姓名,學生密碼)
圖書管理(圖書管理員,借閱號,歸還號)
查詢(圖書編號,借閱證號,圖書管理員,學生)
4.4.2 資料庫的物理設計
依據資料庫的原理,並結合以上E-R圖,經過轉化,即可進行資料庫的物理設計。基於以上資料庫的邏輯設計,考慮程序設計的簡易性,同時考慮題目的時間,該系統的資料庫採用Microsoft SQL Server 2000。本系統決定採用一個資料庫,在其下創建5個數據表,其結構分別如下:
1.圖書信息表(tBook),其欄位列表如表4-1所示。
表4-1 圖書信息表的結構
序號 欄位名稱 欄位說明 類型 位數 屬性 備注
1 cBooksID 圖書編號 文本 7 必須非空
2 cBooksName 圖書名稱 文本 20 必須非空
3 cBooksISBN 圖書ISBN號 文本 15 可為空
4 cBooksAuthor 圖書作者 文本 10 可為空
5 cBooksPublisher 圖書出版社 文本 20 可為空
6 cBooksType 圖書類型 文本 16 可為空
7 smBooksPrice 圖書價格 貨幣 可為空
8 iBooksStoreQuan 圖書庫存量 整數 可為空
9 iBooksLeftQuant 圖書副本數量 整數 可為空
10 iBooksTotalQuan 圖書總數 整數 可為空
2.圖書借閱登記表(tBorrow),其欄位列表如表4-2所示。
表4-2 圖書借閱登記表的結構
序號 欄位名稱 欄位說明 類型 位數 屬性 備注
1 cBorrowID 借書編號 文本 6 必須非空
2 cVipID 學生編號 文本 6 必須非空
3 cBooksID 圖書編號 文本 7 必須非空
4 cBorrwTime 借書時間 時間日期 可為空
5 cReturnTime 還書時間 時間日期 可為空
6 cReturn 是否歸還 文本 1 可為空
3.圖書歸還登記表(tReturn),其欄位列表如表4-3所示。
表4-3 圖書歸還登記表的結構
序號 欄位名稱 欄位說明 類型 位數 屬性 備注
1 cBorrowID 借書編號 文本 6 必須非空
2 cVipID 學生編號 文本 6 必須非空
3 cBooksID 圖書編號 文本 7 必須非空
4 cBorrwTime 借書時間 時間日期 可為空
5 cReturnTime 還書時間 時間日期 必須非空
6 cReturn 是否歸還 文本 1 必須非空
7 cNoReturn 歸還異常 文本 8 可為空
4.學生信息表(tVip),其欄位列表如表4-4所示。
表4-4 學生信息表的結構
序號 欄位名稱 欄位說明 類型 位數 屬性 備注
1 cVipID 學生編號 文本 6 必須非空
2 cVipName 學生姓名 文本 10 必須非空
4 cVipSex 學生性別 文本 1 可為空
5 vipAddTime 學生入學時間 時間日期 必須非空
6 vipEndTime 學生畢業時間 時間日期 必須非空
5.管理員信息表(tOperators),其欄位列表如表4-5所示。
表4-5 管理員信息表的結構
序號 欄位名稱 欄位說明 類型 位數 屬性 備注
1 cOperatorID 管理員編號 文本 5 必須非空
2 cOperatorName 管理員姓名 文本 10 必須非空
3 cOperatorPassword 密碼 文本 6 必須非空
4 cOperatorAddTime 管理員加入時間 時間日期 10 必須非空
把積分給我,我就把後半部給你。
第五章 編碼實現
5.1 程序編碼
登陸界面如圖5.1所示。
❻ 求資料庫圖書管理系統課程設計全套
資料庫圖書管理系統課程設計:
1、可以參考網上的一些開源項目,根據別人提供的一些思路,進行開發
2、找身邊的學長,學姐,他們開發過類似的系統
3、請教老師同學,讓他們給你提供一些思路
4、可以參考類似的系統
❼ 數據結構課程設計(圖書館借閱管理系統)
圖書借閱管理系統具有以下功能:
圖書資料管理
圖書資料管理主要完成圖書資料的新增、修改和報廢,並生成圖書資料庫的功能。按采購員的要求,供書商提供需要的書籍。進行分類新增修改處理。並對已報廢圖書進行處理。
讀者資料管理
讀者資料管理主要完成讀者資料的新增、修改和撤消,並生成讀者資料庫。按讀者要求進行讀者資料的新增、修改和撤消。
借書操作
借書操作主要完成讀者的借書、續借及預訂處理,並生成讀者借閱庫。首先進行讀者資格的審核,符合要求後查閱書庫是否有書,如有則修改圖書資料庫,書庫取書書交讀者。書庫無書則進行預訂處理。用戶續借則修改還書日期。並將借書信息匯總後交統計員。
還書操作
還書操作主要完成讀者的還書及罰款處理,並修改讀者借閱庫。首先進行讀者資格的審核,符合要求後則修改圖書資料庫,讀者還書書還書庫。書籍逾期或遺失則進行罰款處理。並將還書信息匯總後交統計員。
查詢處理
查詢處理主要完成讀者對書是否逾期、書是否未借、書籍排行榜的查詢處理。並及時地把查詢結果反饋給讀者,並將查詢信息匯總給統計員。
系統維護
包括許可權管理、數據恢復和數據備份。數據恢復和數據備份是對數據的有效保護。許可權管理是對系統使用者規定相關的許可權,以免系統數據被非法訪問和使用。
(訪問時需要密碼,密碼錯誤要有提示重輸,登陸分為管理員登陸和用戶登陸兩項,用戶只能進行查詢操作,而管理員能進行所有操作)
#include <string.h>
#include <iostream.h>
class Book{ // 書籍基類
protected:
char Title[40]; // 書名
long Code; // 條碼
int Type; // 0表示書,1表示雜志
public:
Book();
Book(char *title,long code);
void SetCode(long code){ Code = code; }
void SetTitle(char* tl){ strcpy(Title,tl); }
void SetType(bool type){Type = type; }
int GetType(){ return Type; }
long GetCode(){ return Code;}
virtual void Show(); // 顯示書的信息
friend ostream& operator<<(ostream& , Book&); // 重載插入運算符
friend istream& operator>>(istream& is, Book&); // 重載提取運算符
Book *Next; // 為創建每個讀者所借書鏈表而定義指針
};
class Item :public Book{ //書的款目
// char Title[40]; // 書名
char Author[20]; // 著者名
char IndexCode[10]; // 分類號
// long Code; // 條碼
public:
Item();
Item(char *author,char *title,char *index,int code);
Item(Item &);
void SetAuthor(char*);
void SetIndexCode(char*);
virtual void Show(); // 顯示書的信息
friend ostream& operator<<(ostream& os, Item&); // 重載插入運算符
friend istream& operator>>(istream& is, Item&); // 重載提取運算符
public:
};
class Magazine:public Book { //雜志類
int Volume;
enum LANG {CHINESE=1,ENGLISH} Lang; // 枚舉變數,確定語言類別
public:
Magazine():Book(){Volume = 0; Lang = CHINESE; Type = 1; }
Magazine(char *title,int vol,LANG lang,int code);
Magazine(Magazine&);
void SetVolume(int vol){Volume = vol;}
void SetLang(int lang){Lang = (LANG)lang;}
virtual void Show(); // 顯示雜志的信息
friend ostream& operator<<(ostream& os, Magazine&); // 重載插入運算符
friend istream& operator>>(istream& is, Magazine&); // 重載提取運算符
};
class Reader{ // 讀者信息類
char Name[20]; // 姓名
char Position[20]; // 職務
int Age; // 年齡
long Code; // 借書證號
Book* items; // 所借書鏈表
public:
Reader();
Reader(char *name,char *posi,int age,int code);
// Reader(Reader&);
~Reader();
long GetCode(){return Code;}
void SetName(char*);
void SetPosition(char*);
void SetAge(int);
void SetCode(long);
void AddBook(Item); // 添加所借書
void AddBook(Magazine); // 添加所借雜志
void DelBook(Book it); // 還書後減少所借書
void ShowBooks(); // 顯示所借書
void Show(); // 顯示讀者信息
friend ostream& operator<<(ostream& os, Reader&); // 重載插入運算符
friend istream& operator>>(istream& is, Reader&); // 重載提取運算符
public:
int Counter; //計數器,統計所借書數目
};
class Manager{ // 管理員類
char Name[20]; // 姓名
int Age; // 年齡
int Code; // 工號
friend class Library; // 將圖書館類聲明為友元
public:
Manager(){}
Manager(char*,int,int);
long GetCode(){ return Code;}
void Show();
friend ostream& operator<<(ostream& os, Manager&); // 重載插入運算符
friend istream& operator>>(istream& is, Manager&); // 重載提取運算符
};
class Loan { // 借閱信息類
int Type; // 0表示書,1表示雜志
Item item; // 借閱書
Magazine mag; // 借閱雜志
Reader reader; // 借閱者
Manager manager; // 借書操作員
int Code;
friend class Library; // 將圖書館類聲明為友元
public:
Loan(){ }
Loan(Loan & l);
int GetCode(){ return Code;}
void Show();
friend ostream& operator<<(ostream& os, Loan&); // 重載插入運算符
friend istream& operator>>(istream& is, Loan&); // 重載提取運算符
};
、、、、、、、、、、、、、、、、、、、、、、、
#include<iostream.h>
#include<string.h>
class Reader;
template<typename T> class DblList;
template<typename T> class DblNode{
public:
T Info;//數據域
DblNode<T> *llink,*rlink; //前驅(左鏈)、後繼(右鏈)指針
public:
DblNode(T data);//一般結點
DblNode();//頭結點
T GetInfo(){return Info;};
friend class DblList<T>;
friend class Library;
};
template<typename T>class DblList{
DblNode<T> *head,*current;
public:
DblList();
~DblList();
void Insert(const T& data);
DblNode<T>* Remove(DblNode<T>* p);
void Print();
int Length();//計算鏈表長度
DblNode<T> *Find(T data);//搜索數據與定值相同的結點
DblNode<T>* Find(int data);//按某個關鍵字查找
void MakeEmpty(); //清空鏈表
void ShowList(); //顯示鏈表各結點
friend istream& operator>>(istream&, DblList<typename T>&); // 重載輸入流運算符
friend ostream& operator<<(ostream& os, DblList<typename T>& dlist); // 重載輸出流運算符
friend class Library;
//其它操作
};
template<typename T> DblNode<T>::DblNode(){
llink=rlink=NULL;
}
template<typename T> DblNode<T>::DblNode(T data){
info=data;
llink=NULL;
rlink=NULL;
}
template<typename T> DblList<T>::DblList(){//建立表頭結點
head=new DblNode<T>();
head->rlink=head->llink=head;
current=NULL;
}
template<typename T> DblList<T>::~DblList(){
MakeEmpty();//清空鏈表
delete head;
}
template<typename T> void DblList<T>::MakeEmpty(){
DblNode<T> *tempP;
while(head->rlink!=head){
tempP=head->rlink;
head->rlink=tempP->rlink;//把頭結點後的第一個節點從鏈中脫離
tempP->rlink->llink=head;//處理左指針
delete tempP; //刪除(釋放)脫離下來的結點
}
current=NULL; //current指針恢復
}
template<typename T> void DblList<T>::Insert(const T & data){//新節點在鏈尾
current=new DblNode<T>;
current->Info=data;
current->rlink=head;//注意次序
current->llink=head->llink;
head->llink->rlink=current;
head->llink=current;//最後做
}
template<typename T> DblNode<T>* DblList<T>::Remove(DblNode<T>* p){ // 刪除結點
current=head->rlink;
while(current!=head&¤t!=p) current=current->rlink;
if(current==head) current=NULL;
else{//結點摘下
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
p->rlink=p->llink=NULL;
}
return current;
}
template<typename T> DblNode<T>* DblList<T>::Find(T data){ // 按結點查找
current=head->rlink;
while(current!=head&¤t->Info!=data) current=current->rlink;
if(current==head) current=NULL;
return current;
}
template<typename T> DblNode<T>* DblList<T>::Find(int data){ // 按數據值查找結點
current=head->rlink;
int temp =current->Info.GetCode();
while(current!=head&&temp!=data){
current=current->rlink;
temp = current->Info.GetCode();
}
if(current==head) current=NULL;
return current;
}
template<typename T> void DblList<T>::Print(){ // 輸出鏈表
current=head->rlink;
while(current!=head){
cout<<current->Info<<'\t';
current=current->rlink;
}
cout<<endl;
}
template<typename T> int DblList<T>::Length(){ // 取得鏈表長度
int count=0;
current=head->rlink;
while(current!=head){
count++;
current=current->rlink;
}
return count;
}
template<typename T> void DblList<T>::ShowList(){ // 輸出鏈表各結點
int count=0;
current=head->rlink;
while(current!=head){
current->GetInfo().Show();
current=current->rlink;
}
return ;
}
template<typename T>
istream& operator>>(istream& is, DblList<typename T> &dlist){
int len;
T tt; // 定義局部變數讀入一個結點
is>>len;
for(int i= 0 ;i<len; i++){ // 循環讀入鏈表各結點
is>>tt;
dlist.Insert(tt);
}
return is;
}
template<typename T>
ostream& operator<<(ostream& os, DblList<typename T> &dlist){
DblNode<T> *tempP;
int len = dlist.Length();
os<<len<<' ';
tempP=dlist.head->rlink;
while(tempP!=dlist.head){ // 循環輸出鏈表各結點
os<<tempP->Info;
tempP = tempP->rlink;
}
return os;
}
#include "class.h"
#include "dblist.h"
#include <fstream.h>
class Library{ // 封裝圖書館流通業務的類
DblList<Item> item; // 在館圖書鏈表
DblList<Magazine> mag; // 在館雜志鏈表
DblList<Reader> reader; // 讀者鏈表
DblList<Loan> loan; // 借閱信息鏈表
DblList<Manager> manager; // 管理員信息鏈表
int itemNum; // 記錄在館圖書數目
int magNum; // 記錄在館雜志數目
int readerNum; // 記錄讀者數目
int loanNum; // 記錄借閱信息數目
int managerNum; // 記錄管理員數目
ofstream itemFileOut; // 文件流對象,保存圖書館書籍數據
ifstream itemFileIn; // 文件流對象,讀入圖書館書籍數據
ofstream magFileOut; // 文件流對象,保存圖書館雜志數據
ifstream magFileIn; // 文件流對象,讀入圖書館雜志數據
ofstream readerFileOut; // 文件流對象,保存圖書館讀者數據
ifstream readerFileIn; // 文件流對象,讀入圖書館讀者數據
ofstream loanFileOut; // 文件流對象,保存圖書館借閱信息數據
ifstream loanFileIn; // 文件流對象,讀入圖書館借閱信息
ofstream managerFileOut; // 文件流對象,保存圖書館管理員數據
ifstream managerFileIn; // 文件流對象,讀入圖書館管理員數據
public:
Library(); // 構造函數
~Library(); //析構函數
void Run(); // 圖書館類的運行函數
void CreateBibliotheca(); // 創建書目
void CreateReader(); // 創建讀者庫
void CreateManager(); // 創建管理員信息
int ShowMainMenu(); // 顯示主菜單函數
void Borrow(); // 借書操作
void Return(); // 還書操作
void Require(); // 查詢操作
void SaveInfo(); // 保存圖書館信息
void OpenInfo(); // 讀入圖書館信息
};
多給點分吧
❽ C語言課程設計圖書館管理系統加講解
圖書管理系統代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct BOOK
{
int id,usr[10],total,store,days[10];
char name[31],author[21];
}books[100];
/*上面是結構體的定義,用於存放書籍及借書的信息。*/
void page_title(char *menu_item)
{
clrscr();
printf(">>> 圖 書 管 理 系 統 <<<\n\n- %s -\n\n",menu_item);
}
/*上面是列印頁眉的函數,同時通過參數menu_item,可以顯示當前的狀態。*/
void return_confirm(void)
{
printf("\n按任意鍵返回……\n");
getch();
}
/*上面是返回前請求確認的函數,以便在返回前觀察結果*/
int search_book(void)
{
int n,i;
printf("請輸入圖書序號:");
scanf("%d",&i);
for(n=0;n<100;n++)
{
if(books[n].id==i)
{
printf("書名:%s\n",books[n].name);
printf("作者:%s\n",books[n].author);
printf("存數:%d of ",books[n].store);
printf("%d\n",books[n].total);
return n;
}
}
printf("\n輸入錯誤或無效圖書序號.\n");
return -1;
}
/*上面的函數是在數組中找到圖書號匹配的記錄,顯示其信息並返
回數組下標,如果找不到相應記錄則提示錯誤並返回-1。*/
void book_out(void)
{
int n,s,l,d;
page_title("借閱圖書");
if((n=search_book())!=-1&&books[n].store>0)
{
printf("請輸入借書證序號:");
scanf("%d",&s);
printf("請輸入可借天數:");
scanf("%d",&d);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==0)
{
books[n].usr[l]=s;
books[n].days[l]=d;
break;
}
}
books[n].store--;
}
if(n!=-1&&books[n].store==0) printf("此書已經全部借出.\n");
return_confirm();
}
/*上面是借書的函數,首先調用找書函數*/
void book_in(void)
{
int n,s,l;
page_title("歸還圖書");
if((n=search_book())!=-1&&books[n].store<books[n].total)
{
printf("借閱者圖書證列表:\n");
for(l=0;l<10;l++)
if (books[n].usr[l]!=0)
printf("[%d] - %d天\n",books[n].usr[l],books[n].days[l]);
printf("請輸入借書證序號:");
scanf("%d",&s);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==s)
{
books[n].usr[l]=0;
books[n].days[l]=0;
break;
}
}
books[n].store++;
}
if(n!=-1&&books[n].store==books[n].total)
printf("全部入藏.\n");
return_confirm();
}
void book_add(void)
{
int n;
page_title("注冊新書");
for(n=0;n<100;n++)
if(books[n].id==0) break;
printf("序號:");
scanf("%d",&books[n].id);
printf("書名:");
scanf("%s",&books[n].name);
printf("作者:");
scanf("%s",&books[n].author);
printf("數量:");
scanf("%d",&books[n].total);
books[n].store=books[n].total;
return_confirm();
}
void book_del(void)
{
int n;
page_title("注銷舊書");
if((n=search_book())!=-1) books[n].id=0;
printf("該書已注銷.\n");
return_confirm();
}
void main(void)
{
menu: page_title("操作選單");
printf("請用數字鍵選擇操作\n\n");
printf("1 借閱圖書\n2 歸還圖書\n\n");
printf("3 注冊新書\n4 注銷舊書\n\n");
printf("\n0 退出\n");
switch(getch())
{
case '1' : book_out();break;
case '2' : book_in();break;
case '3' : book_add();break;
case '4' : book_del();break;
case '0' : exit(0);
}
goto menu;
}
{
int n;
page_title("廣?症慕");
if((n=search_book())!=-1) books[n].id=0;
printf("乎慕廝廣?.\n");
return_confirm();
}
void main(void)
{
menu: page_title("荷恬僉汽");
printf("萩喘方忖囚僉夲荷恬\n\n");
printf("1 処堋夕慕\n2 拷珊夕慕\n\n");
printf("3 廣過仟慕\n4 廣?症慕\n\n");
printf("\n0 曜竃\n");
switch(getch())
{
case '1' : book_out();break;
case '2' : book_in();break;
case '3' : book_add();break;
case '4' : book_del();break;
case '0' : exit(0);
}
goto menu;
}