基本要求:
1)采用鏈式存儲結構實現
2)圖書信息:每種書的登記內容包括書號、書名、著作者、現存量和庫存量等信息;
3)讀者信息:每個讀者的登記內容包括讀者號、姓名、性別等信息
4)借閱信息:每條借閱信息包括讀者號、書號、借閱時間、歸還時間
5)系統主要功能如下:
a)讀者的增刪改,圖書信息的增刪改,其中圖書的增加(采編入庫):新購一種書,確定書號后,登記到圖書帳目表中,如果表中已有,則只將庫存量增加;
b)借閱:如果一種書的現存量大於0,則借出一本,在借閱信息中登記讀者號、書號、借閱時間,改變圖書現存量;
c)歸還:填寫對應借閱記錄的歸還時間,改變該書的現存量。
d)查詢:可查詢書籍信息、讀者信息、借閱信息等
e)圖書、讀者、借閱信息均可保存在文件中,可從文件中調入
學校實驗專周比較水,出的都是一些小題目, 從中挑了一個工程量最大的也只是這個小實驗,然后我就盡量寫的詳細一點,把各個功能分開。
文件調用不是很熟悉,倉促學了一點皮毛就用上了,有興趣以后自行擴展。
實驗大致思路和順序表差不多,多了一些鏈表基本操作,分別存儲圖書信息和讀者信息,初始化並插入數據后開始用第三個結構體存儲借閱信息,通過判斷輸入法內容和讀者號、圖書號是否一致來決定借閱成功或失敗。
鏈式結構體中的數組是為了方便存儲字符串。
#include <cstdio>
#include <cstdlib>
#include <string.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 50//字符串容納最大長度 50
typedef int Status;
typedef int ElemType;
//圖書信息
typedef struct Book{
char book_id[MAXSIZE];//圖書序號
char book[MAXSIZE];//書名
char author[MAXSIZE];//作者
int num;//現存量
int kucun;//庫存量
char read_id[MAXSIZE];//借閱者的id
struct Book *next;
}LBook,*LinkBook;
//讀者信息
typedef struct Reader{
char read_id[MAXSIZE];//讀者號
char reader[MAXSIZE];//讀者姓名
char ssex[MAXSIZE];//讀者性別
// char borrow_book[10];
struct Reader *next;
}LReader,*LinkReader;
//查閱信息
typedef struct info{
char book_id[MAXSIZE];//圖書序號
char book_name[MAXSIZE];//圖書名稱
char read_id[MAXSIZE];//讀者序號
char reader[MAXSIZE];//讀者名字
char time1[MAXSIZE];//借閱時間
char time2[MAXSIZE];//歸還時間
struct info *next;
}*information,Info;
Status InitBook(LinkBook &L){
L=new Book;
if(!L) return ERROR;
L->next=NULL;
L->kucun=0;
L->num=0;
return OK;
}
//初始化讀者信息
Status InitReader(LinkReader &L){
L=new Reader;
if(!L) return ERROR;
L->next=NULL;
return OK;
}
//初始化借閱信息
Status Information(information &C){
C=new Info;
if(!C) return ERROR;
C->next=NULL;
return OK;
}
//遍歷圖書信息
void DisBook(LinkBook L){//不改動數值可以不引用&
LBook *p;
p=L->next;//指向第一個節點
printf("開始展開所有圖書信息\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("圖書序號:%s\n圖書名稱:%s\n圖書作者:%s\n現存量:%d\n庫存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun);
printf("------------------>\n");
p=p->next;
}
}
//遍歷讀者信息
void DisReader(LinkReader L){//不改動數值可以不引用&
LReader *p;
p=L->next;//指向第一個節點
printf("開始展開所有讀者信息\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("讀者號:%s\n姓名:%s\n性別:%s\n",p->read_id,p->reader,p->ssex);
printf("------------------>\n");
p=p->next;
}
}
//遍歷借閱信息
void DisBorrow(information L) {
Info *p;
p=L->next;
printf("展開所有訂閱信息:\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("圖書:%s\n讀者:%s\n借閱日期:%s\n歸還日期:%s\n",p->book_name,p->reader,p->time1,p->time2);
printf("------------------>\n");
p=p->next;
}
}
//刪除讀者操作
Status DelReader(LinkReader &L,char *i)
{
LReader *p=L;
while(p->next)//
{
if(strcmp(p->next->read_id,i)==0){
Reader *s=p->next;
p->next=s->next;//p->next=p->next->next
delete s;
return OK;
}
p=p->next;
}
return ERROR;
}
//刪除圖書信息操作
Status DelBook(LinkBook &L,char *i)
{
LBook *p=L;
while(p->next)//
{
if(strcmp(p->next->book_id,i)==0){
Book *s=p->next;
p->next=s->next;//p->next=p->next->next
delete s;
return OK;
}
p=p->next;
}
return ERROR;
}
//添加讀者信息(前插法)--量插
void AddReader(LinkReader &L,int n){
LReader *p;
L=new Reader;
L->next=NULL;
int i;
p=L->next;
printf("請輸入讀者號,姓名和性別:\n");
for(i=n;i>0;--i)
{
p=new Reader;
scanf("%s %s %s",p->read_id,p->reader,p->ssex);
p->next=L->next;
L->next=p;
}
}
//初始添加圖書信息(前插法)--單插
Status AddBook(LinkBook &L,ElemType e){
LBook *p;
L=new Book;
L->next=NULL;
int i,j;
p=L->next;
for(i=0;i<e;i++){
p=new LBook;
p->num=p->kucun=0;
printf("請選擇圖書編號和數量:\n");
scanf("%s%d",p->book_id,&j);
printf("請插入圖書的名字和作者名:\n");
scanf("%s%s",p->book,p->author);
p->num+=j;
p->kucun+=j;
p->next=L->next;
L->next=p;
}
}
//Insert 后續添加圖書
Status InsertBook(LinkBook &L,char *n,ElemType e) {
LBook *p,*s;
p=L->next;
while(p){
if(strcmp(p->book_id,n)==0){//如果存在過這本書
p->kucun+=e;
p->num+=e;
return OK;
}
p=p->next;
}
p=new LBook;
p->num=p->kucun=0;
printf("請插入圖書的名字和作者名:\n");
scanf("%s%s",p->book,p->author);
p->num=e;
p->kucun=e;
p->next=L->next;
L->next=p;
}
//后續添加讀者號
Status InsertReader(LinkReader &L,char *n) {
LReader *p,*s;
p=L->next;
while(p){
if(strcmp(p->read_id,n)==0){//如果讀者號已存在
printf("該賬戶已經被注冊!\n");
return OK;
}
p=p->next;
}
p=new LReader;
strcpy(p->read_id,n);
printf("請插入讀者的名字和性別:\n");
scanf("%s%s",p->reader,p->ssex);
p->next=L->next;
L->next=p;
}
//按圖書序號查找圖書信息
Status GetBook(LinkBook L,char *n)
{
LBook *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->book_id,n)==0)
{
printf("查找的結果為:\n");
printf("圖書序號:%d\n圖書名稱:%s\n圖書作者:%s\n現存量:%d\n庫存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("沒找到該圖書,請核對輸入是否正確\n");
}
//搜索圖書序號修改圖書信息
Status AlterBook(LinkBook L,char *n)
{
LBook *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->book_id,n)==0)
{
printf("圖書查到,請修改:\n");
printf("圖書序號為:%s\n請修改:",p->book_id);
scanf("%s",p->book_id);
printf("書名為:%s\n請修改:",p->book);
scanf("%s",p->book);
printf("作者:%s\n請修改:",p->author);
scanf("%s",p->author);
printf("現存量和庫存量為%d和%d\n請修改:",p->num,p->num);
scanf("%d,%d",&p->num,&p->kucun);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("沒找着該圖書,請重新檢查!\n");
return ERROR;
}
//按讀者號查找讀者信息
Status GetReader(LinkReader L,char *n)
{
LReader *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->read_id,n)==0)
{
printf("查找的結果為:\n");
printf("讀者號:%s\n姓名:%s\n性別:%s\n",p->read_id,p->reader,p->ssex);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("沒找到該讀者,請核對輸入是否正確\n");
}
//通過讀者號修改讀者信息
Status AlterReader(LinkReader L,char *n)
{
LReader *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->read_id,n)==0)
{
printf("讀者信息查到,請修改:\n");
printf("讀者號:\n");
scanf("%s",&p->read_id);
printf("讀者名:\n");
scanf("%s",p->reader);
printf("讀者性別:\n");
scanf("%s",p->ssex);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("沒找到該讀者,請核對輸入是否正確\n");
}
//借閱書
Status Borrow(LinkBook &L,LinkReader &S,information &C ){
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
char n[10],m[10];
printf("請輸入讀者證號和圖書號進行借閱:\n");
scanf("%s%s",m,n);
while(p){
if(strcmp(p->book_id,n)==0){
s=new Info;
strcpy(s->book_id,n); //字符串賦值,需要函數
strcpy(s->book_name,p->book);
if(p->kucun>0){//判斷是否還有庫存
p->kucun--; //借走了,該書庫存-1
}
else {
printf("這本書已經被借完了!\n");
delete s;
return ERROR;
}
break;
}
p=p->next;
}
while(q){
if(strcmp(q->read_id,m)==0){
strcpy(s->read_id,m);//字符串賦值
strcpy(s->reader,q->reader);
// strcpy(q->borrow_book,p->book);
break;
}
q=q->next;
}
if(q==NULL){
printf("讀者號或者圖書號錯誤,請檢查輸入是否有誤!\n");
return ERROR;
}
printf("請填寫借閱和歸還日期:\n");
scanf("%s%s",s->time1,s->time2);
s->next=C->next;
C->next=s;
return OK;
}
//歸還書
Status Return(LinkBook &L,LinkReader &S,information &C ){
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
char n[10],m[10];
printf("請輸入讀者證號和圖書號進行歸還:\n");
scanf("%s%s",m,n);
while(p){
if(strcmp(p->book_id,n)==0){
s=new Info;
strcpy(s->book_id,"已歸還"); //原來的信息填寫為已歸還,做個記錄,也可以刪掉 都行啊;
strcpy(s->book_name,"已歸還");//刪掉代碼:略了
p->kucun++; //歸還了,庫存+1
Info *S=C;
Info *P=S->next;
S->next=P->next;
delete P;
break;
while(q){
if(strcmp(s->read_id,m)==0){
// strcpy(q->borrow_book,"暫無");
strcpy(p->book_id,0);
return OK;
}
q=q->next;
}
}
p=p->next;
}
return ERROR;
}
//保存到txt中 --路徑默認選擇到我的桌面,可更改
void saveBook(LinkBook L,LinkReader S,information &C) {
FILE *fp=NULL;
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
fp=fopen("C:/Users/23211/Desktop/books.txt","w+");
while(p){
fprintf(fp,"%s %s %s %d %d\n",p->book_id,p->author,p->book,p->num,p->kucun);
p=p->next;
}
fp=fopen("C:/Users/23211/Desktop/Readers.txt","w+");
while(q){
fprintf(fp,"%s %s %s\n",q->read_id,q->reader,q->ssex);
q=q->next;
}
fp=fopen("C:/Users/23211/Desktop/Borrow.txt","w+");
while(s){
fprintf(fp,"%s %s %s %s %s %s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2);
s=s->next;
}
printf("更新完成!\n");
}
//從文件中讀取
void ReadBook(LinkBook L,LinkReader S,information &C) {
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
p=new LBook;
q=new LReader;
s=new Info;
FILE * fp=NULL;
printf("--------------------------------------------------->\n");
printf("展開圖書信息:\n");
fp=fopen("C:/Users/23211/Desktop/books.txt","r");
while(fscanf(fp,"%s%s%s%d%d",p->book_id,p->author,p->book,&p->num,&p->kucun)!=EOF){
printf("圖書序號:%s,作者:%s,書名:%s,數量:%d,庫存:%d\n",p->book_id,p->author,p->book,p->num,p->kucun);
p-p->next;
}
printf("--------------------------------------------------->\n");
printf("展開讀者信息:\n");
fp=fopen("C:/Users/23211/Desktop/Readers.txt","r");
while(fscanf(fp,"%s%s%s\n",q->read_id,q->reader,q->ssex)!=EOF){
printf("讀者號:%s,姓名:%s,性別:%s\n",q->read_id,q->reader,q->ssex);
// q=q->next;
}
printf("--------------------------------------------------->\n");
printf("展開借閱信息\n");
fp=fopen("C:/Users/23211/Desktop/Borrow.txt","r");
while(fscanf(fp,"%s%s%s%s%s%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2)!=EOF){
printf("圖書號:%s\n,圖書名:%s\n,讀者號:%s\n,讀者姓名:%s\n,借閱日期:%s\n,歸還日期:%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2);
s=s->next;
}
printf("--------------------------------------------------->\n");
printf("提取完成完成!\n");
}
void function(){//功能菜單
printf("<------------------------------------------------>\n");
printf("<-----------0-歡迎來到鱔溪校區閱覽室!-0---------->\n");
printf("<------------------------------------------------>\n");
printf("<---------------請選擇以下功能------------------->\n");
printf("<---------------1.初始圖書信息------------------->\n");
printf("<---------------2.初始讀者信息------------------->\n");
printf("<---------------3.查看所有圖書信息--------------->\n");
printf("<---------------4.查看所有讀者信息--------------->\n");
printf("<---------------5.添加讀者借閱信息--------------->\n");
printf("<---------------6.刪除讀者信息------------------->\n");
printf("<---------------7.刪除圖書信息------------------->\n");
printf("<---------------8.修改讀者信息------------------->\n");
printf("<---------------9.修改圖書信息------------------->\n");
printf("<---------------10.查詢讀者信息------------------>\n");
printf("<---------------11.查詢圖書信息------------------>\n");
printf("<---------------12.查詢借閱信息------------------>\n");
printf("<---------------13.導出讀者、圖書和借閱信息------>\n");
printf("<---------------14.導入讀者,圖書和借閱信息------>\n");
printf("<---------------15.查看功能菜單------------------>\n");
printf("<---------------16.添加圖書信息------------------>\n");
printf("<---------------17.添加讀者信息------------------>\n");
printf("<---------------18.歸還圖書---------------------->\n");
printf("<-------------------0.退出----------------------->\n");
}
void tool(LinkBook L,LinkReader S,information &C){//功能實現
int i,choose;
char n[MAXSIZE];
ElemType e;
while(1){
printf("請輸入你要選擇的功能:\n請選擇:");
scanf("%d",&choose);
switch(choose){
case 1:
printf("請插入多少種不同的圖書:\n");
scanf("%d",&e);
AddBook(L,e);
break;
case 2:
printf("請選擇插入讀者數量:\n");
scanf("%d",&e);
AddReader(S,e);
break;
case 3:
DisBook(L);
break;
case 4:
DisReader(S);
break;
case 5://添加讀者借閱信息
if(Borrow(L,S,C))
printf("添加成功!\n");
else printf("添加失敗!\n");
break;
case 6:
printf("請輸入要刪除的讀者號:\n");
scanf("%s",n);
if(DelReader(S,n)){
printf("刪除成功!\n");
}
else{
printf("該讀者號不存在,請檢查是否有這個讀者號!\n");
}
break;
case 7:
printf("請輸入要刪除的圖書序號:\n");
scanf("%s",n);
if(DelBook(L,n)){
printf("刪除成功!\n");
}
else{
printf("該圖書不存在,請檢查是否有這個圖書號!\n");
}
break;
case 8:
printf("請輸入要修改的讀者號:\n");
scanf("%s",n);
AlterReader(S,n);
break;
case 9:
printf("請輸入要修改的圖書號:\n");
scanf("%s",n);
AlterBook(L,n);
break;
case 10:
printf("請輸入要查詢的讀者號:\n");
scanf("%s",n);
GetReader(S,n);
break;
case 11:
printf("請輸入要查詢的圖書序號:\n");
scanf("%s",n);
GetBook(L,n);
break;
case 12://遍歷借閱信息
DisBorrow(C);
break;
case 13://導出讀者、圖書和借閱信息
saveBook(L,S,C);
break;
case 14://導入讀者、圖書和借閱信息
ReadBook(L,S,C);
break;
case 15://功能菜單
function();
break;
case 16:
printf("插入圖書信息:\n");
printf("請輸入圖書號和數量:\n");
scanf("%s%d",n,&e);
InsertBook(L,n,e);
break;
case 17:
printf("插入讀者信息:\n");
printf("請輸入讀者號:\n");
scanf("%s",n);
InsertReader(S,n);
break;
case 18://歸還
Return(L,S,C);
break;
case 0://退出程序
printf("拜拜!\n");
exit(0);
default:
printf("不在選擇范圍內,更多功能請等待擴展。\n請重新選擇!\n");
}
}
}
int main()
{
LinkBook L;
LinkReader S;
information C;
InitReader(S);
InitBook(L);
Information(C);
function();
tool(L,S,C);
}
寫的比較基礎,也更容易擴展。
