c语言图书管理系统程序设计

Python014

c语言图书管理系统程序设计,第1张

一 程序设计说明书

【设计题目】 图书馆借阅管理

【问题描述】图书馆,适合用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=0i<Maxbori++)误写为for(int i=1i<Maxbori++),使循环发生错误。

2.指针使用错误,指针b和r混淆,导致编译错误得到“error C2660: 'retbook' : function does not take 1 parameters”错误报告。

你不觉得给的悬赏少了点么

新建一个下面的文件 讲这个文件和下面的代码放在一个目录下 表示你的图书数据库信息

lib.txt

1001 1

1 0

c primier

1003 1

1 0

c primier

1002 2

1 0

c++ primier

代码

#include<stdio.h>

#include<stdlib.h>

#include<stdbool.h>//定义bool类型

#include<string.h>

typedef struct book book

struct book{

int bid//书的id

int cid//category id 所属的书的类别id

char bname[30]

int state//书的state 0 已借出 1代表还未借出

int stdid//借书人id 如果未借出 则此项为0

}

//booklist

book lib[100]

int len=0

//书的类别五类

int category[5]={0}

void init_lib()//讲lib.txt存储的图书馆信息读入内存

{

FILE *fin=fopen("lib.txt","r")

if(!fin)

{

printf("openfile error!\n")

exit(1)

}

len=0

while(!feof(fin))

{

fscanf(fin,"%d %d",&lib[len].bid,&lib[len].cid)

fscanf(fin,"%d %d",&lib[len].state,&lib[len].stdid)

fgetc(fin)

fgets(lib[len].bname,28,fin)

lib[len].bname[strlen(lib[len].bname)-1]='\0'//去除\n

category[lib[len].cid]++

len++

}

fclose(fin)

}

void libprint()//输出图书信息

{

int i

for(i=0i<leni++)

{

printf("书名:%s\n编号:%d \n书目前的所属人(0代表图书馆):%d \n同类别图书共有:%d\n",lib[i].bname,lib[i].bid,lib[i].stdid,category[lib[i].cid])

printf("-------------------------------------------------------------------------\n")

//printf("%d %d\n%d %d\n%s",lib[i].bid,lib[i].cid,lib[i].state,lib[i].stdid,lib[i].bname)

}

}

bool borrowbook(int bookid,int stdid)//借书

{

int i

for(i=0i<leni++)

{

if(bookid==lib[i].bid&&lib[i].state==1)

{

lib[i].state=0

category[lib[i].cid]--

lib[i].stdid=stdid

return 1

}else

return 0

}

return 0

}

bool returnbook(int bookid,int stdid)//还书

{

int i=0

for(i=0i<leni++)

{

if(bookid==lib[i].bid&&lib[i].state==0&&lib[i].stdid==stdid)

{

lib[i].state=1

lib[i].stdid=0

category[lib[i].cid]++

return 1

}

}

return 0

}

void savelib()//将内存的数据写入lib.txt存储起来

{

FILE *fout=fopen("lib.txt","w")

if(!fout)

{

printf("写入失败!\n")

exit(0)

}

int i

for(i=0i<leni++)

{

fprintf(fout,"%d %d\n%d %d\n%s\n",lib[i].bid,lib[i].cid,lib[i].state,lib[i].stdid,lib[i].bname)

}

fclose(fout)

printf("成功写入数据库文件!\n")

}

int main(void)

{

int choice,stdid,bookid

init_lib()//数据读入内存

while(1)

{

choice=0

printf("图书馆管理系统\n")

printf("---------------\n")

printf("1-将每本书信息输出\n")

printf("2-借书\n")

printf("3-还书\n")

printf("4-save\n")

printf("5-exit without save\n")

printf("---------------------------\n")

scanf("%d",&choice)

printf("---------------------------\n")

if(choice<1||choice>5)

{

printf("检查你的输入!(1,2,3,4,5)\n")

continue

}

if(choice==1)

libprint()

if(choice==2)

{

printf("输入你要借的书的id和你的studentid(以空格分隔):\n")

scanf("%d %d",&bookid,&stdid)

if(borrowbook(bookid,stdid))

printf("成功借出!\n")

else

printf("借出错误\n")

}

if(choice==3)

{

printf("输入你要还的书的id和你的studentid(以空格分隔):\n")

scanf("%d %d",&bookid,&stdid)

if(returnbook(bookid,stdid))

printf("成功还书\n")

else

printf("还书错误\n")

}

if(choice==4)

{

savelib()

}

if(choice==5)

exit(0)

}

return 0

}

#include <iostream>

#include <iomanip>

#include <string>

//输入/输出文件流类

#include <fstream>

using namespace std

//最多的读者

const int Maxr=100

//最多的图书

const int Maxb=100

//每位读者最多借五本书

const int Maxbor=5

//读者类,实现对读者的信息的描述

class Reader

{

private:

//删除标记 1:已删 0:未删

int tag

//读者编号

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)

}

//设置删除标记 1:已删 0:未删

void delbook()

{

tag=1

}

//增加读者

void addreader(int n,char *na)

{

tag=0

no=n

strcpy(name,na)

for(int i=0i<Maxbori++)

borbook[i]=0

}

//借书操作

void borrowbook(int bookid)

{

for(int i=0i<Maxbori++)

{

if (borbook[i]==0)

{

borbook[i]=bookid

return

}

}

}

//还书操作

int retbook(int bookid)

{

for(int i=0i<Maxbori++)

{

if(borbook[i]==bookid)

{

borbook[i]=0

return 1

}

}

return 0

}

//读出读者信息

void disp()

{

cout <<setw(5) <<no <<setw(10) <<name<<"借书编号:["

for(int i=0i<Maxbori++)

if(borbook[i]!=0)

cout <<borbook[i] <<"|"

cout <<"]"<<endl

}

}

//读者类库,实现建立读者的个人资料

class RDatabase

{

private:

//读者记录指针

int top

//读者记录

Reader read[Maxr]

public:

//构造函数,将reader.txt读到read[]中

RDatabase()

{

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

}

//关闭 reader.txt

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=0i<=topi++)

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

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

{

return &read[i]

}

return NULL

}

//输出所有读者信息

void disp()

{

for (int i=0i<=topi++)

read[i].disp()

}

//读者库维护

void readerdata()

//析构函数,将read[]写到reader.txt文件中

~RDatabase()

{

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

for (int i=0i<=topi++)

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:

//删除标记 1:已删 0:未删

int tag

//图书编号

int no

//书名

char name[20]

//是否再架 1:再架 2:已借

int onshelf

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:

//构造函数,将book.txt读到book[]中

BDatabase()

{

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=0i<=topi++)

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

{

return &book[i]

}

return NULL

}

//图书库维护

void bookdata()

void disp()

{

for (int i=0i<=topi++)

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

book[i].disp()

}

//析构函数,将book[]写到book.txt文件中

~BDatabase()

{

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

for (int i=0i<=topi++)

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()

{

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<<"输入错误,请从新输入:"

}

}

}

希望能够帮助到你,望采纳!