古詩詞大全網 - 成語查詢 - c語言課程設計 書管理系統

c語言課程設計 書管理系統

高級語言程序設計(2)課程設計

壹 程序設計說明書

設計題目 圖書館借閱管理

問題描述圖書館,適合用C++面向對象的功能來描述。圖書館管理系統分為借書、還書、圖書管理和讀者服務等四個部分。設計壹個讀者類Reader,記錄每個讀者基本信息;讀者庫類Rdatabase,記錄所有讀者信息;圖書類Book, 記錄每本書的基本信息;圖書庫類Bdatabase, 記錄所有圖書信息。

基本要求

1讀者庫類RDatabase中,其構造函數中,將read.txt文件中所有讀入讀者記錄rede[]中。處理完畢,在析構函數中將read[]中的所有未刪記錄寫入到read.txt中。

2圖書庫類BDatabase中,其構造函數中,將book.txt文件中所有讀入圖書記錄book[]中。處理完畢,在析構函數中將book[]中的所有未刪記錄寫入到book.txt中。

3 利用構造函數完成讀者和圖書數據初始化,完成內存分配。程序結束前,析構函數完成所申請的堆內存空間。

4 編寫主函數,對所編寫的矩陣類進行全面測試。要求用戶界面采用菜單方式。測試中需要讀者和圖書數據通過I/O流從磁盤文件讀入,同時顯示在屏幕上。得到的數據通過I/O流寫入磁盤文件保存,同時顯示在屏幕上。

5 源程序中要有充分的註釋,報告中要有詳細的流程圖和文字材料。

類的設計

該程序包含了四個類,如下:

1.Reader類,有讀者的基本管理功能,具有以下私有數據:

int tag;//刪除標記 1:已刪;0:未刪

int no;//讀者編號

char name[10];//讀者姓名

int borbook[Maxbor];//所借圖書

2.讀者庫類Rdatabase, 具有以下私有數據:

int top;//讀者記錄指針

Reader read[Maxr];//讀者記錄

3.圖書庫類Book,有壹本圖書的基本功能,有以下私有數據:

int tag;//刪除標記 1:已刪;0:未刪

int no;//圖書編號

char name[20];//書名

int onshelf;//是否在架 1在架 0已借

4.圖書庫類BDatabase,有以下私有數據:

int top;//圖書記錄指針

Book book[Maxb];//圖書記錄

特殊函數的設計說明

構造函數

1.Reader類中構造函數Reader(),初始化函數;

2.讀者庫類RDatabase中,其構造函數Rdatabase(),將read.txt文件中所有讀入讀者記錄rede[]中。

3.Book類中構造函數Book(),初始化函數;

4.圖書庫類BDatabase中,其構造函數中,將book.txt文件中所有讀入圖書記錄book[]中。

拷貝構造函數

Reader類中的拷貝構造函數將getname()的返回值讀者姓名拷貝到setname()中,Book類中的拷貝構造函數將getname()函數的返回值圖書名拷貝到圖書名設置函數setname()中。

析構函數

1.讀者庫類RDatabase中,其析構函數~Rdatabase(),將read[]中的所有未刪記錄寫入到read.txt中;

2.圖書庫類BDatabase中,其析構函數~Bdatabase(),將book[]中的所有未刪記錄寫入到book.txt中。

運算符重載

重載了“=”,當比較讀者編號和圖書編號時,重載;重載位運算符“〈〈”和“〉〉”等。

主要函數算法流程圖

程序的使用方法

1.進入操作頁面,按提示操作;

2.首先,新增圖書和讀者信息,之後就可以對以存在的信息進行操作;

3.操作當中,可以隨時增加,更改和刪除圖書或讀者信息;

4.當選擇退出時,進行清屏。

二 程序上機調試報告

語法錯誤及其排除

1.在敲程序時,有很多拼寫錯誤,例好多處把Readdata()誤打Readdate();結束的分號,在不同的輸入法狀態下輸入,這些小錯誤剛開始很難發現,不過有了經驗,就很容易了。

2.創建新的構造函數時,使用出現了錯誤。重載構造函數要註意函數的訪問權限,結果就不會出現錯誤。

算法錯誤及其排除

1.讀者類中借書操作函數中,采用循環語句時判斷讀者已借圖書量時for(int i=0;i<Maxbor;i++)誤寫為for(int i=1;i<Maxbor;i++),使循環發生錯誤。

2.指針使用錯誤,指針b和r混淆,導致編譯錯誤得到“error C2660: 'retbook' : function does not take 1 parameters”錯誤報告。

三 程序測試結果

收獲及體會

除了課堂外,課程設計是最能學到東西的,最考驗人的。在做課程設計這段時間,時刻都感覺自己有好多不懂,要學的太多了!經過這次課程設計,讓我對C++這門語言有了更深的認識,操作能力有了提高。要想得到敲的代碼運行出來後的滿足感,需要耐心細心,毅力以及充沛的體力。只有經過多次編輯,多次編譯,再多次運行,才能編寫出更好的程序,有時候需要多次的更正才達到所要的運行結果。學習編程,需要多揣摩,實踐,實踐,再實踐,編程技能才能更上壹層樓,此外還得多向高手請教!

源程序代碼

//********************

//圖書館借閱管理

//班級:

//學號:

//姓名:

//********************

#include<iostream.h>

#include<iomanip.h>

#include<string.h>

#include<fstream.h>

const int Maxr=1000;//最多的讀者

const int Maxb=10000;//最多的圖書

const int Maxbor=8;//每位讀者最多借8本書

class Reader //讀者類

{

int tag;//刪除標記 1已刪;0未刪

int no;//讀者編號

char name[10];//讀者姓名

int borbook[Maxbor];//所借圖書

public :

Reader(){}//構造函數

char *getname(){return name;}//獲取讀者姓名

int gettag(){return tag;}//獲取刪除標記

int getno(){return no;}//獲取讀者編號

void setname(char na[])//設置讀者姓名

{

strcpy(name,na);

}

void delbook(){tag=1;}//設置刪除標記

void addreader(int n,char *na)//增加讀者

{

tag=0;

no=n;

strcpy(name,na);

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

borbook[i]=0;

}

void borrowbook(int bookid)//借書操作

{

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

{

if(borbook[i]==0)

{

borbook[i]=bookid;

}

}

}

int retbook(int bookid)//還書操作

{

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

{

if (borbook[i]==bookid)

{

borbook[i]=0;

return 1;

}

}

return 0;

}

void disp()//輸出讀者信息

{

cout<<setw(5)<<no<<setw(10)<<name<<"借書編號:";

for(int i=0;i,Maxbor;i++)

if(borbook[i]!=0)

cout<<borbook[i]<<endl;

}

};

class RDatabase//讀者庫類

{

int top;//讀者記錄指針

Reader read[Maxr];//讀者記錄

public:

RDatabase()//構造函數,將reader.txt讀到read[]中

{

Reader s;

top=-1;

fstream file("reader.txt",ios::in);

while(1)

{

file.read((char*)&s,sizeof(s));

if(!file)break;

top++;

read[top]=s;

}

file.close();

}

void clear()//刪除所有讀者信息

{

top=-1;

}

int addreader(int n,char *na)//添加讀者,檢查是否已存在

{

Reader *p=query(n);

if(p==NULL)

{

top++;

read[top].addreader(n,na);

return 1;

}

return 0;

}

Reader*query(int readerid)//按編號查找

{

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

if(read[i].getno()==readerid&&read[i].gettag==0)

return &read[i];

return NULL;

}

void disp()//刪除讀者所有信息

{

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

read[i].disp();

}

void readerdata();//讀者庫維護

~RDatabase()//析構函數,將read[]寫入reader.txt文件中

{

fstream file("reader.txt",ios::out);

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

if(read[i].gettag()==0)

file.write((char*)&read[i],sizeof(read[i]));

file.close();

}

};

void RDatabase::readerdata()

{

int choice=1;

char rname[20];

int readerid;

Reader*r;

while(choice!=0)

{

cout<<"讀者服務 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出"<<endl;

cin>>choice;

switch(choice)

{

case 1:

cout<<"請輸入讀者編號:";

cin>>readerid;

cout<<"讀入讀者姓名:";

cin>>rname;

addreader(readerid,rname);

break;

case 2:

cout<<"請輸入讀者編號:";

cin>>readerid;

r=query(readerid);

if(r==NULL)

{

cout<<"讀者不存在"<<endl;

break;

}

cout<<"請輸入新讀者姓名:";

cin>>rname;

r->setname(rname);

break;

case 3:

cout<<"請輸入讀者編號:";

cin>>readerid;

r=query(readerid);

if(r==NULL)

{

cout<<"讀者不存在"<<endl;

break;

}

r->delbook();

break;

case 4:

cout<<"請輸入讀者編號:";

cin>>readerid;

r=query(readerid);

if(r==NULL)

{

cout<<"該讀者編號不存在"<<endl;

break;

}

case 5:

disp();

break;

case 6:

clear();

break;

}

}

}

class Book//圖書類

{

int tag;//刪除標記 1:已刪;0:未刪

int no;//圖書編號

char name[20];//書名

int onshelf;//是否在架 1在架 0已借

public:

Book(){}

char*getname(){return name;}//獲取讀者姓名

int getno(){return no;}//獲取圖書編號

int gettag(){return tag;}//獲取刪除標記

void setname(char na[])//設置書名

{

strcpy(name,na);

}

void delbook(){tag=1;}//刪除圖書

void addbook(int n,char*na)//增加圖書

{

tag=0;

no=n;

strcpy(name,na);

onshelf=1;

}

int borrowbook()//借書操作

{

if(onshelf==1)

{

onshelf=0;

return 1;

}

return 0;

}

void retbook()//還書操作

{

onshelf=1;

}

void disp()//輸出圖書

{

cout<<setw(6)<<no<<setw(18)<<name<<setw(10)<<(onshelf==1?"在架":"已借")<<endl;

}

};

class BDatabase//圖書庫類

{

int top;//圖書記錄指針

Book book[Maxb];//圖書記錄

public:

BDatabase()//構造函數,將book.txt讀到book[]中

{

Book b;

top=-1;

fstream file("book.txt",ios::in);

while(1)

{

file.read((char*)&b,sizeof(b));

if(!file)break;

top++;

book[top]=b;

}

file.close();

}

void clear()//全刪

{

top=-1;

}

int addbook(int n,char*na)//增加圖書

{

Book*p=query(n);

if(p==NULL)

{

top++;

book[top].addbook(n,na);

return 1;

}

cout<<"新增成功!"<<endl;

}

Book*query(int bookid)//查找圖書

{

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

if(book[i].getno()==bookid&&book[i].gettag()==0)

return NULL;

}

void bookdata();//圖書庫維護

void disp()

{

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

if(book[i].gettag()==0)

book[i].disp();

}

~BDatabase()//析構函數,將book[]寫入book.txt文件中

{

fstream file("book.txt",ios::out);

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

if(book[i].gettag()==0)

file.write((char*)&book[i],sizeof(book[i]));

file.close();

}

};

void BDatabase::bookdata()

{

int choice;

char bname[40];

int bookid;

Book *b;

while(choice!=0)

{

cout<<"圖書管理 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出"<<endl;

cin>>choice;

switch(choice)

{

case 1:

cout<<"輸入圖書編號:";

cin>>bookid;

cout<<"輸入圖書書名:";

cin>>bname;

addbook(bookid,bname);

break;

case 2:

cout<<"輸入圖書編號:";

cin>>bookid;

b=query(bookid);

if(b==NULL)

{

cout<<"該圖書不存在"<<endl;

break;

}

cout<<"輸入新書名:";

cin>>bname;

b->setname(bname);

cout<<"更名成功!"<<endl;

break;

case 3:

cout<<"輸入圖書編號:";

cin>>bookid;

b=query(bookid);

if(b==NULL)

{

cout<<"該圖書不存在!"<<endl;

break;

}

b->delbook();

break;

case 4:

cout<<"請輸入圖書編號:";

cin>>bookid;

b=query(bookid);

if(b==NULL)

{

cout<<"該書不存在!"<<endl;

break;

}

b->disp();

break;

case 5:

disp();

break;

case 6:

clear();

break;

}

}

}

void main()

{

int choice=1,bookid,readerid;

RDatabase ReaderDB;

Reader *r;

BDatabase BookDB;

Book *b;

while(choice!=0)

{

cout<<" 1借書? "<<endl;

cout<<" 2還書? "<<endl;

cout<<" 3圖書維護? "<<endl;

cout<<" 4讀者維護? "<<endl;

cout<<" 0離開? "<<endl;

cin>>choice;

switch(choice)

{

case 1:

cout<<"借書,請輸入讀者編號:";

cin>>readerid;

cout<<"圖書編號:";

cin>>bookid;

r=ReaderDB.query(readerid);

if(r==NULL)

{

cout<<"哈哈,借書成功!";

break;

}

b=BookDB.query(bookid);

if(b==NULL)

{

cout<<"不存在該書!"<<endl;

break;

}

if(b->borrowbook()==0)

{

cout<<"該書已借"<<endl;

break;

}

r->borrowbook(b->getno());

break;

cout<<"借書成功!"<<endl;

case 2:

cout<<"還書,請輸入讀者編號:";

cin>>readerid;

cout<<"請輸入圖書編號;";

cin>>bookid;

r=ReaderDB.query(readerid);

if(r==NULL)

{

cout<<"不存在該讀者!"<<endl;

break;

}

b->retbook();

r->retbook(b->getno());

break;

cout<<"還書成功!"<<endl;

case 3:

BookDB.bookdata();

break;

case 4:

ReaderDB.readerdata();

break;

}

}

}

輸出結果

1借書

2還書

3圖書管理

4讀者服務

0退出

3

圖書管理 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

1

輸入圖書編號:1111

輸入圖書書名:武林外傳

新增成功!

圖書管理 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

1

輸入圖書編號:2222

輸入圖書書名:今夜無眠

新增成功!

圖書管理 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

0

1借書

2還書

3圖書管理

4讀者服務

0退出

4

讀者服務 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

1

請輸入讀者編號:001

讀入讀者姓名:周強

讀者服務 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

0

1借書

2還書

3圖書管理

4讀者服務

0退出

1

借書,請輸入讀者編號:001

圖書編號:1111

哈哈,借書成功! 1借書

2還書

3圖書管理

4讀者服務

0退出

2

還書,請輸入讀者編號:001

請輸入圖書編號;1111

還書成功!

1借書

2還書

3圖書管理

4讀者服務

0退出

3

圖書管理 1新增 2更該 3刪除 4查找 5顯示 6全刪 0退出

2

輸入圖書編號:2222

輸入新書名:金庸全集

更名成功!

Press any key to continue

這樣可以麽?