#include#includeclassBook{//书籍基类protected:charTitle[40];//书名longCode;//条码intType;//0表示书,1表示杂志public:Book();Book(char*title,longcode);voidSetCode(longcode){Code=code;}voidSetTitle(char*tl){strcpy(Title,tl);}voidSetType(booltype){Type=type;}intGetType(){returnType;}longGetCode(){returnCode;}virtualvoidShow();//显示书的信息friendostream&operator>(istream&is,Book&);//重载提取运算符Book*Next;//为创建每个读者所借书链表而定义指针};classItem:publicBook{//书的款目//charTitle[40];//书名charAuthor[20];//著者名charIndexCode[10];//分类号//longCode;//条码public:Item();Item(char*author,char*title,char*index,intcode);Item(Item&);voidSetAuthor(char*);voidSetIndexCode(char*);virtualvoidShow();//显示书的信息friendostream&operator>(istream&is,Item&);//重载提取运算符public:};classMagazine:publicBook{//杂志类intVolume;enumLANG{CHINESE=1,ENGLISH}Lang;//枚举变量,确定语言类别public:Magazine():Book(){Volume=0;Lang=CHINESE;Type=1;}Magazine(char*title,intvol,LANGlang,intcode);Magazine(Magazine&);voidSetVolume(intvol){Volume=vol;}voidSetLang(intlang){Lang=(LANG)lang;}virtualvoidShow();//显示杂志的信息friendostream&operator>(istream&is,Magazine&);//重载提取运算符};classReader{//读者信息类charName[20];//姓名charPosition[20];//职务intAge;//年龄longCode;//借书证号Book*items;//所借书链表public:Reader();Reader(char*name,char*posi,intage,intcode);//Reader(Reader&);~Reader();longGetCode(){returnCode;}voidSetName(char*);voidSetPosition(char*);voidSetAge(int);voidSetCode(long);voidAddBook(Item);//添加所借书voidAddBook(Magazine);//添加所借杂志voidDelBook(Bookit);//还书后减少所借书voidShowBooks();//显示所借书voidShow();//显示读者信息friendostream&operator>(istream&is,Reader&);//重载提取运算符public:intCounter;//计数器,统计所借书数目};classManager{//管理员类charName[20];//姓名intAge;//年龄intCode;//工号friendclassLibrary;//将图书馆类声明为友元public:Manager(){}Manager(char*,int,int);longGetCode(){returnCode;}voidShow();friendostream&operator>(istream&is,Manager&);//重载提取运算符};classLoan{//借阅信息类intType;//0表示书,1表示杂志Itemitem;//借阅书Magazinemag;//借阅杂志Readerreader;//借阅者Managermanager;//借书操作员intCode;friendclassLibrary;//将图书馆类声明为友元public:Loan(){}Loan(Loan&l);intGetCode(){returnCode;}voidShow();friendostream&operator>(istream&is,Loan&);//重载提取运算符};、、、、、、、、、、、、、、、、、、、、、、、#include#includeclassReader;templateclassDblList;templateclassDblNode{public:TInfo;//数据域DblNode*llink,*rlink;//前驱(左链)、后继(右链)指针public:DblNode(Tdata);//一般结点DblNode();//头结点TGetInfo(){returnInfo;};friendclassDblList;friendclassLibrary;};templateclassDblList{DblNode*head,*current;public:DblList();~DblList();voidInsert(constT&data);DblNode*Remove(DblNode*p);voidPrint();intLength();//计算链表长度DblNode*Find(Tdata);//搜索数据与定值相同的结点DblNode*Find(intdata);//按某个关键字查找voidMakeEmpty();//清空链表voidShowList();//显示链表各结点friendistream&operator>>(istream&,DblList&);//重载输入流运算符friendostream&operator&dlist);//重载输出流运算符friendclassLibrary;//其它操作};templateDblNode::DblNode(){llink=rlink=NULL;}templateDblNode::DblNode(Tdata){info=data;llink=NULL;rlink=NULL;}templateDblList::DblList(){//建立表头结点head=newDblNode();head->rlink=head->llink=head;current=NULL;}templateDblList::~DblList(){MakeEmpty();//清空链表deletehead;}templatevoidDblList::MakeEmpty(){DblNode*tempP;while(head->rlink!=head){tempP=head->rlink;head->rlink=tempP->rlink;//把头结点后的第一个节点从链中脱离tempP->rlink->llink=head;//处理左指针deletetempP;//删除(释放)脱离下来的结点}current=NULL;//current指针恢复}templatevoidDblList::Insert(constT&data){//新节点在链尾current=newDblNode;current->Info=data;current->rlink=head;//注意次序current->llink=head->llink;head->llink->rlink=current;head->llink=current;//最后做}templateDblNode*DblList::Remove(DblNode*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;}returncurrent;}templateDblNode*DblList::Find(Tdata){//按结点查找current=head->rlink;while(current!=head&¤t->Info!=data)current=current->rlink;if(current==head)current=NULL;returncurrent;}templateDblNode*DblList::Find(intdata){//按数据值查找结点current=head->rlink;inttemp=current->Info.GetCode();while(current!=head&&temp!=data){current=current->rlink;temp=current->Info.GetCode();}if(current==head)current=NULL;returncurrent;}templatevoidDblList::Print(){//输出链表current=head->rlink;while(current!=head){coutInforlink;}coutintDblList::Length(){//取得链表长度intcount=0;current=head->rlink;while(current!=head){count++;current=current->rlink;}returncount;}templatevoidDblList::ShowList(){//输出链表各结点intcount=0;current=head->rlink;while(current!=head){current->GetInfo().Show();current=current->rlink;}return;}templateistream&operator>>(istream&is,DblList&dlist){intlen;Ttt;//定义局部变量读入一个结点is>>len;for(inti=0;i>tt;dlist.Insert(tt);}returnis;}templateostream&operator&dlist){DblNode*tempP;intlen=dlist.Length();osrlink;while(tempP!=dlist.head){//循环输出链表各结点osInfo;tempP=tempP->rlink;}returnos;}#include"class.h"#include"dblist.h"#includeclassLibrary{//封装图书馆流通业务的类DblListitem;//在馆图书链表DblListmag;//在馆杂志链表DblListreader;//读者链表DblListloan;//借阅信息链表DblListmanager;//管理员信息链表intitemNum;//记录在馆图书数目intmagNum;//记录在馆杂志数目intreaderNum;//记录读者数目intloanNum;//记录借阅信息数目intmanagerNum;//记录管理员数目ofstreamitemFileOut;//文件流对象,保存图书馆书籍数据ifstreamitemFileIn;//文件流对象,读入图书馆书籍数据ofstreammagFileOut;//文件流对象,保存图书馆杂志数据ifstreammagFileIn;//文件流对象,读入图书馆杂志数据ofstreamreaderFileOut;//文件流对象,保存图书馆读者数据ifstreamreaderFileIn;//文件流对象,读入图书馆读者数据ofstreamloanFileOut;//文件流对象,保存图书馆借阅信息数据ifstreamloanFileIn;//文件流对象,读入图书馆借阅信息ofstreammanagerFileOut;//文件流对象,保存图书馆管理员数据ifstreammanagerFileIn;//文件流对象,读入图书馆管理员数据public:Library();//构造函数~Library();//析构函数voidRun();//图书馆类的运行函数voidCreateBibliotheca();//创建书目voidCreateReader();//创建读者库voidCreateManager();//创建管理员信息intShowMainMenu();//显示主菜单函数voidBorrow();//借书操作voidReturn();//还书操作voidRequire();//查询操作voidSaveInfo();//保存图书馆信息voidOpenInfo();//读入图书馆信息};
⑵ c语言图书管理系统程序设计
一 程序设计说明书
【设计题目】 图书馆借阅管理
【问题描述】图书馆,适合用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”错误报告。
⑶ 图书馆管理系统代码
/*****************************************************************************************/
#include <iostream>
#include <iomanip>
#include <cstring>
#include <fstream>//输入/输出文件流类
using namespace std;
const int Maxr=100;//最多的读者
const int Maxb=100;//最多的图书
const int Maxbor=5;//每位读者最多借五本书
//读者类,实现对读者的信息的描述
class Reader
{
private:
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; }//设置删除标记 1:已删 0:未删
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;
return;
}
}
}
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] << "|";
cout << "]"<<endl;
}
};
//读者类库,实现建立读者的个人资料
class RDatabase
{
private:
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(); //关闭 reader.txt
}
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()
{
char choice;
char rname[20];
int readerid;
Reader *r;
while (choice!='0')
{
cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1 新 增\n\n\t\t 2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 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;
}
r->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";break;
}
}
}
//图书类,实现对图书的描述,图书的编号,书名,借出,还入等
class Book
{
private:
int tag;//删除标记 1:已删 0:未删
int no;//图书编号
char name[20];//书名
int onshelf;//是否再架 1:再架 2:已借
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
{
private:
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 (NULL==p)
{
top++;
book[top].addbook(n,na);
return 1;
}
return 0;
}
Book *query(int bookid)//查找图书
{
for (int i=0;i<=top;i++)
if (book[i].getno()==bookid &&book[i].gettag()==0)
{
return &book[i];
}
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()
{
char choice;
char bname[40];
int bookid;
Book *b;
while (choice!='0')
{
cout <<"\n\n\n\t\t\t图 书 维 护 "<<endl<<endl;
cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "输入图书编号:"<<endl;
cin >> bookid;
cout << "输入图书书名:"<<endl;
cin >> bname;
addbook(bookid,bname);
break;
case '2':
cout << "输入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout << " 该图书不存在 "<<endl;
break;
}
cout << "输入新的书名:"<<endl;
cin >> bname;
b->setname(bname);
break;
case '3':
cout <<" 读入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout <<" 该图书不存在" << endl;
break;
}
b->delbook();
break;
case '4':
cout << " 读入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout <<" 该图书不存在"<< endl;
break;
}
b->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";
}
}
}
//main() 函数的实现,程序的主界面的引导
int main(void)
{
char choice;
int bookid,readerid;
RDatabase ReaderDB;
Reader *r;
BDatabase BookDB;
Book *b;
while(choice!='0')
{
cout <<endl<<endl<<"\t\t\t 图 书 管 理 系 统\n\n\n";
cout <<"\t\t\t1 借 书\n\n\t\t\t2 还 书 \n\n\t\t\t3 图 书 维 护\n\n\t\t\t4 读 者 维 护\n\n\t\t\t0 离 开"<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout <<" 借书 读者编号:";
cin >>readerid;
cout <<" 图书编号: ";
cin >>bookid;
r=ReaderDB.query(readerid);//按编号查找
if (NULL==r)
{
cout <<" 不存在该读者,不能借书"<< endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能借书"<< endl;
break;
}
if (b->borrowbook()==0)
{
cout << " 该图书已借出,不能借书"<< endl;
break;
}
r->borrowbook(b->getno());
break;
case '2':
cout<<"还书\n 读者编号:";
cin >>readerid;
cout << " 图书编号:";
cin >>bookid;
r=ReaderDB.query(readerid);
if (r==NULL)
{
cout <<" 不存在该读者,不能还书" << endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能还书" <<endl;
break;
}
b->retbook();
r->retbook(b->getno());
break;
case '3':
BookDB.bookdata();
break;
case '4':
ReaderDB.readerdata();
break;
default:cout<<"输入错误,请从新输入:";
}
}
return 0;
}
希望能解决您的问题。