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

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”错误报告。

#include<iostream>

#include<fstream>

#include<windows.h>

#include<stdlib.h>

using namespace std

void mainmenu()

void Manage_Book()

void input_Book()

void input_Reader()

void New_Book()

void Seek_Book()

void Borrow_Manage()

void Borrow_Book()

void Return_Book()

void Output_Message()

void Exit_System()

int u,v=3,k=0

struct Book

{

char name[20]

int booknumber

int num_present

int num_all

}book[1000]

struct Reader

{

char name[20]

int readernumber

int card

}reader[3]

void mainmenu()

{

int Num_Choice1,flag=1

system("color E")

for(k<=0k++)

{

input_Book()

input_Reader()

}

while(flag==1)

{

system("cls")

cout<<"\t\t\t◆◆◆◆◆主菜单◆◆◆◆◆"<<endl

<<"\t\t\t☆ 1.图书管理 ☆"<<endl

<<"\t\t\t☆ 2.借阅管理 ☆"<<endl

<<"\t\t\t☆ 3.输出信息 ☆"<<endl

<<"\t\t\t☆ 4.退出系统 ☆"<<endl

<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl

cout<<"请输入所需要的服务编码"<<endl

cin>>Num_Choice1

switch(Num_Choice1)

{

case 1:

Manage_Book()

break

case 2:

Borrow_Manage()

break

case 3:

Output_Message()

break

case 4:

Exit_System()

flag=0

break

default:

flag=0

cout<<"输入有误!!"<<endl

}

}

}

void Manage_Book()

{

int flag1=1,Num_Choice2

system("cls")while(flag1==1)

{

cout<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl

<<"\t\t\t☆ 1.新书入库 ☆"<<endl

<<"\t\t\t☆ 2.图书查询 ☆"<<endl

<<"\t\t\t☆ 3.返回主菜单☆"<<endl

<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl

cin>>Num_Choice2

switch(Num_Choice2)

{

case 1:

flag1=2

New_Book()

break

case 2:

flag1=2

Seek_Book()

break

case 3:

mainmenu()

default:

flag1=1

cout<<"输入有误!"<<endl

system("pause")

system("cls")

}

}}

void input_Book()

{

cout<<"请依照提示输入现有的三本图书的信息:"<<endl

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

{

cout<<"书名:"<<endl

cin>>book[i].name

cout<<"书号:"<<endl

cin>>book[i].booknumber

cout<<"库存量:"<<endl

cin>>book[i].num_all

cout<<"现存量:"<<endl

cin>>book[i].num_present

}

}

void New_Book()

{

system("cls")

int j

char newbook_name[20]

cout<<"请输入新书书名:"<<endl

cin>>newbook_name

for(j=0j<1000j++)

{

if(strcmp(newbook_name,book[j].name)==0)

{

book[j].num_all++

book[j].num_present++

break

}

}

if(j==1000)

{

cout<<"请为此新书编号:"<<endl

v++

cin>>book[v].booknumber

strcpy(book[v].name,newbook_name)

book[v].num_all=1

book[v].num_present=1

}

else cout<<"已有此书,库存量加一"<<endl

system("pause")

}

void Seek_Book()

{

system("cls")

int k,booknumber

cout<<"请输入所要查询的书号:"<<endl

cin>>booknumber

for(k=0k<1000k++)

{

if(book[k].booknumber==booknumber)

{

cout<<"书号:"<<booknumber<<endl

cout<<"书名:"<<book[k].name<<endl

cout<<"库存量:"<<book[k].num_all<<endl

cout<<"现存量:"<<book[k].num_present<<endl

system("pause")

break

}

}

if(k==1000)

{

cout<<"未找到此书!!"<<endl

system("pause")

}

}

void Borrow_Manage()

{

int flag=1

system("cls")

int Num_Choice3

while(flag==1)

{

cout<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl

<<"\t\t\t☆ 1.借书登记 ☆"<<endl

<<"\t\t\t☆ 2.还书管理 ☆"<<endl

<<"\t\t\t☆ 3.返回主菜单☆"<<endl

<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl

cin>>Num_Choice3

switch(Num_Choice3)

{

case 1:

flag=2

Borrow_Book()

break

case 2:

flag=2

Return_Book()

break

case 3:

mainmenu()

default:

flag=1

cout<<"输入有误!!"<<endl

system("pause")

}

system("cls")

}

}

void input_Reader()

{

system("cls")

cout<<"请依照提示输入现有的三位读者的信息:"<<endl

for(int m=0m<3m++)

{

cout<<"姓名:"<<endl

cin>>reader[m].name

cout<<"编号:"<<endl

cin>>reader[m].readernumber

reader[m].card=0

}

}

void Borrow_Book()

{

system("cls")

char reader_name[20]

int n,book_number

cout<<"请输入读者姓名:"<<endl

cin>>reader_name

for(n=0n<3n++)

{

if(strcmp(reader_name,reader[n].name)==0)

{

if(reader[n].card!=0)

{

cout<<"已借书,不能再借,请按任意键返回"<<endl

system("pause")

mainmenu()

}

else

break

}

}

if(n==3)

{

cout<<"无此读者!输入有误!!按任意键返回主菜单"<<endl

system("pause")

mainmenu()

}

cout<<"请输入所借图书书号:"<<endl

cin>>book_number

for(n=0n<vn++)

{

if(strcmp(reader_name,reader[n].name)==0)

reader[n].card=book_number

}

for(n=0n<vn++)

{

if(book[n].booknumber==book_number)

{

if(book[n].num_present==0)

{

cout<<"该书已经被借完,请按任意键返回"<<endl

system("pause")

for(n=0n<vn++)

{

if(strcmp(reader_name,reader[n].name)==0)

reader[n].card=0

}

mainmenu()

}

else

{

book[n].num_present--

cout<<"借书成功,请按任意键返回"<<endl

system("pause")

break

}

}

}

if(n==v)

{

for(n=0n<vn++)

{

if(strcmp(reader_name,reader[n].name)==0)

reader[n].card=0

}

cout<<"所输入的书号不存在,请按任意键返回主菜单"<<endl

system("pause")

mainmenu()

}

}void Return_Book()

{

system("cls")

int j

char reader_name[20]

int book_number

cout<<"请输入读者姓名:"<<endl

cin>>reader_name

for(j=0j<3j++)

{

if(strcmp(reader_name,reader[j].name)==0)

break

}

if(j==3)

{

cout<<"无此读者!输入有误!!按任意键返回主菜单"<<endl

system("pause")

mainmenu()

}

cout<<"请输入所还图书书号:"<<endl

cin>>book_number

for(j=0j<3j++)

{

if(strcmp(reader_name,reader[j].name)==0)

{

if(book_number==reader[j].card)

{

reader[j].card=0

for(j=0j<vj++)

{

if(book[j].booknumber==book_number)

{

book[j].num_present++

cout<<"还书成功,请按任意键返回"<<endl

system("pause")

break

}

}

}

else

{

cout<<"该读者未借此书"<<endl

system("pause")

}

}

if(j==v)

cout<<"所输入的书号不存在:"<<endl

}

}

void Output_Message()

{

system("cls")

int q

cout<<"以下是图书信息"<<endl<<endl

for(q=0q<vq++)

{

cout<<"书号:"<<book[q].booknumber<<'\t'

cout<<"书名:"<<book[q].name<<'\t'

cout<<"库存量:"<<book[q].num_all<<'\t'

cout<<"现存量:"<<book[q].num_present<<endl

}

cout<<"以下是读者信息"<<endl<<endl

for(q=0q<3q++)

{

cout<<"姓名:"<<reader[q].name<<'\t'

<<"编号:"<<reader[q].readernumber<<'\t'

<<"所借书号:"<<reader[q].card<<endl

}

system("pause")

}

void Exit_System()

{

system("cls")

cout<<"欢迎下次使用,谢谢"<<endl

system("pause")

}

void main()

{

mainmenu()

}

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#include<string.h>

#define N 100 //书籍的最多本数

struct book

{ char title[30]

int number

char author[30]

float price

int store

char borrower_name[20]

char borrower_gender[5]

int borrower_number

}s[N]

int m=0

void input(structbook *p) //输入图书信息

void save(structbook *p) //保存图书信息

void read(structbook *p) //读取图书信息

void search(structbook *p) //查找图书信息

void del(structbook *p)//删除图书信息

void borrow(structbook *p) //借阅图书

void retur(structbook *p) //归还图书

void main()

{

int x

do

{

printf("**************************************菜单**************************************\n"

" ***********1.输入图书信息********** \n"

" ***********2.查找图书信息********** \n"

" ***********3.删除图书信息********** \n"

" ***********4.借阅图书********** \n"

" ***********5.归还图书********** \n"

" ***********0.退出********** \n")

printf("********************************************************************************\n")

printf("请在0-5中选择,以回车键结束\n")

scanf("%d",&x)

switch(x)

{ case 1: input(&s[0])break

case 2: search(&s[0])break

case 3: del(&s[0])break

case 4: borrow(&s[0])break

case 5: retur(&s[0])break

case 0: break

}

}while(x!=0)

}

void input(structbook *p)

{int y

for(p<(&s[0]+N)p++)

{ printf("请输入书名:")scanf("%s",p->title)

printf("请输入编号:")scanf("%d",&p->number)

printf("请输入作者:")scanf("%s",p->author)

printf("请输入图书价格:")scanf("%f",&p->price)

printf("请输入图书数量:")scanf("%d",&p->store)

m++

printf("第%d个信息已经输入完毕,是否继续?\n按任意键继续,按0键结束.",m)

scanf("%d",&y)//读取是否继续

if(y==0)

{ save(&s[0])

read(&s[0])//调用读取文件函数

break

}

}

}

void search(structbook *p)//查询模块

{ int n

char name1[20]

char name2[20]

char c[3]

do

{ p=&s[0]

printf("\t请选择查找方式:\n")//打印查询方式菜单

printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")

printf("请在0-2中选择:\n\n")

scanf("%d",&n)//读取查找方式

if(n==0) break

switch(n)

{ case 1: printf("请输入书名:\n")scanf("%s",name1)break

case 2: printf("请输入作者:\n")scanf("%s",name2)break

}

for(p<&s[m]p++)

{ read(&s[0])//调用读取函数

if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)

{ printf("\n查找图书信息成功!\n")

printf("书名 编号 作者 价格 数量\n")

printf("%-10s%-10d%-10s%-10.2f%-10d\n",p->title,p->number,p->author,p->price,p->store)//打印信息

break

}

}

printf("是否继续查找?\n“是”请键入“yes”, “否”请按任意键,返回菜单\n")

scanf("%s",c)

}while(strcmp(c,"yes")==0)//判断是否结束

}

void del(structbook *p)//删除模块

{ int i

struct book *p1,*p2

char name1[20]

char name2[20]

char c[3]

int n

do

{ p=&s[0]

printf("请选择删除以方式回车键结束:\n")//打印删除方式菜单

printf( " 1.按书名删除\n 2.按作者删除\n 0.返回\n")

printf("请在0-2中选择:\n\n")

scanf("%d",&n)//读取查找方//

if(n==0) break

switch(n)

{case 1:printf("请输入书名:\n")

scanf("%s",name1)break

case 2: printf("请输入作者:\n")

scanf("%s",name2)break

}

read(&s[0])//调用读取函数

for(i=0i<mi++,p++)

{

if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)

{ p1=p

for(p2=p1+1p2<=&s[m]p1++,p2++)

{

strcpy(p1->title,p2->title)

strcpy(p1->author,p2->author)

p1->number=p2->number

p1->store=p2->store

p1->price=p2->price

m--

printf("删除成功!!\n")

}

}

else {printf("没有该书记录!!")

break}

}

printf("是否继续删除?“是”请键入“yes”, “否”请按任意键,返回菜单\n")

scanf("%s",c) //读取是否继续

save(&s[0])//调用保存函数

}while(strcmp(c,"yes")==0)//判断是否继续删除

}

void borrow(structbook *p)//借书模块

{ int z

char name3[20],name4[20]

char w[3]

do

{ p=&s[0]

printf("请先查找您要借阅的图书!")

printf("请选择查找方式:\n")//打印查询方式菜单

printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")

printf("请在0-2中选择:\n")

scanf("%d",&z)//读取查找方式

if(z==0) break

switch(z)

{ case 1: printf("请输入书名:\n")scanf("%s",name3)break

case 2: printf("请输入作者:\n")scanf("%s",name4)break

}

read(&s[0])//调用读取函数

for(p<&s[m]p++)

{ if(strcmp(p->title,name3)==0||strcmp(p->author,name4)==0)

{

printf("\n查找图书信息成功!\n")

printf("书名 编号 作者 价格 数量\n")

printf("%-10s%-10d%-10s%-10.2fs%-10d\n",p->title,p->number,

p->author,p->price,p->store)//打印信息

printf("请输入您的姓名:")scanf("%s",p->borrower_name)

printf("请输入您的性别:")scanf("%s",p->borrower_gender)

printf("请输入您的学号:")scanf("%d",&p->borrower_number)

p->store--

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

printf("书名 编号 作者 价格 数量 借书人 性别 学号\n")

printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,p->number,p->author,

p->price,p->store,p->borrower_name,p->borrower_gender,p->borrower_number)

break

}

}

printf("是否继续借书??")

printf("“是”请键入“yes”, “否”请按任意键,返回菜单\n")

scanf("%s",w) //读取是否继续

save(&s[0])//调用保存函数

}while(strcmp(w,"yes")==0)//判断是否继续借书

}

void retur(structbook *p)//还书模块

{int e,f

char name5[20]

char name6[20]

char t[3]

do

{ p=&s[0]

printf("请先查找您要还的图目!")

printf("请选择查找方式:\n") //打印查询方式菜单

printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")

printf("请在0-2中选择:\n\n")

scanf("%d",&e) //读取查找方式

if(e==0) break

switch(e)

{ case 1: printf("请输入书名:\n")scanf("%s",name5)break

case 2: printf("请输入作者:\n")scanf("%s",name6)break

}

read(&s[0])//调用读取函数

for(p<&s[m]p++)

{ if(strcmp(p->title,name5)==0||strcmp(p->author,name6)==0)

{ printf("\n查找图书信息成功!\n")

printf("确认还书请按“1”!")//确认是否还书

scanf("%d",&f)

if(f==1)

{ strcpy(p->borrower_name,"0")

strcpy(p->borrower_gender,"0")

p->borrower_number=0

p->store++

printf("书名 编号 作者 价格 数量 借书人 性别 学号\n")

printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,p->number,p->author,

p->price,p->store,p->borrower_name,p->borrower_gender,p->borrower_number)

//打印信息

}

break

}

else {printf("没有该书记录!!")

break}

}

printf("是否继续还书?\n")

printf("“是”请键入“yes”, “否”请按任意键,返回菜单\n")

scanf("%s",t) //读取是否继续

save(&s[0])//调用保存函数

}while(strcmp(t,"yes")==0)//判断是否继续还书

}

void save(structbook *p)//保存文件

{ FILE *fp,*fp1

int i

if((fp=fopen("tushu.txt","wb"))==NULL)//打开文件并判断是否出错

{ printf("创建文件失败!\n\n")//打印出错提示

getchar()return

}

if((fp1=fopen("book.txt","wb"))==NULL)//打开文件并判断是否出错

{ printf("创建文件失败!\n\n")//打印出错提示

getchar()return

}

for(i=0i<mi++,p++)

if(fwrite(p,sizeof(structbook),1,fp)==0)//向文件写入数据,并判断是否出错

printf("向文件输入数据失败!\n\n")

fprintf(fp1,"%d",m)

fclose(fp)//关闭文件

fclose(fp1)//关闭文件

}

void read(structbook *p)//从文件读取信息模块

{FILE *fp,*fp1

int i

if((fp=fopen("tushu.txt","rb"))==NULL)//打开文件,并判断是否出错

{ printf("出错,请检查文件是否存在,按任意键返回住菜单")//打印出错提示

getchar()

}

if((fp1=fopen("book.txt","rb"))==NULL)//打开文件并判断是否出错

{ printf("创建文件失败!\n\n")//打印出错提示

getchar()return

}

fscanf(fp1,"%d",&m)

fclose(fp1)//关闭文件

for(i=0i<mi++,p++)

{ fread(p,sizeof(struct book),1,fp)//从文件中读取信息

}

fclose(fp)//关闭文件

}

你把保存的文件地址自己修改一下就可以了。。希望能帮到你


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12110859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存