C语言程序设计图书管理系统Word版.docx
《C语言程序设计图书管理系统Word版.docx》由会员分享,可在线阅读,更多相关《C语言程序设计图书管理系统Word版.docx(25页珍藏版)》请在冰豆网上搜索。
C语言程序设计图书管理系统Word版
C语言程序设计
实验报告
题目:
图书管理管理系统
院系:
信息科技学院
专业:
姓名:
学号:
指导教师:
杨呈勇
日期:
09-09-18
1问题定义…………………………………………………………………………..3
2系统设计……………………………………………………………………3
2.1总体设计………………………………………………………………………………4
2.2详细设计………………………………………………………………………………4
2.2.1借书模块…………………………………………………………4
2.2.2图书维护…………………………………………………………………………5
新增记录……………………………………………………………………5
更改系统…………………………………………….…………………6
删除系统……………………………………………6
查找系统……………………………………………….………………….6
显示系统………………………………………………………………….7
3系统实现………………………………………………………………………10
3.1编码………………………………………………………………………8
3.1.1程序预处理……….……………………………………………………………9
3.1.2主函数main()……….……………………………………………………….9
4系统维护………………………………………………………………………16
5归纳总结………………………………………………………………………16
5.1开发经验………………………………………………………………………16
5.2实训中遇到的问题及解决方法………………………………………………16
5.3设计中的不足之处……………………………………………………………………16
5.4感想和心得体会……………………………………………………………………16
图书管理系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。
本程序中涉及结构体、单链表、文件及各种语句的运用如for();switch();if….else等方面的知识。
通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,初步掌握链表的一些结构及构成。
掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。
1、问题定义
图书信息包括:
编号、书名、作者名、分类号、出版单位、出版时间、库存数量,价格等。
试设计一图书信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)图书信息录入功能(图书信息用文件保存)
(3)图书信息浏览功能
(4)图书信息查询功能
查询方式:
可以按书名,按作者名,按出版单位,按出版时间进行查询。
(5)图书信息的删除与修改
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。
可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
图2.1图书管理系统功能模块图
本图书管理系统要求采用单链表实现,如图2.1所示,它由如下四大功能模块组成:
●借书模块。
通过输入读者的编号和图书的编号,查找到要该借的书,完成借书这一项任务
●还书模块。
通过输入读者的编号和图书的编号,查找到要该还的书,完成还书这一项任务
●图书维护模块。
完成对图书信息的维护。
在此图书管理系统中,它实现了对图书信息的新曾、更改、删除、查找和显示操作,并将追加后的数据存入源数据文件。
●读者维护模块。
一是实现对读者记录的存盘,即将读者信息写入数据文件中;
2.2详细设计
2.2.1借书模块
通过输入读者的信息和要借的书的编号。
系统显示相应的内容,若该文件中没有数据,系统会提示单链表为空,没有任何读者记录或图书操作,此时,用户应选择调用create()函数,进行读者记录的输入,即完成在单链表1中添加记录的操作。
值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样一来,大大减少了代码的重复和冗余,符合模块化程序设计的特点。
2.2.2还书模块
还书模块主要实现了在单链表中按读者和图书的编号查找满足相关条件的借书记录。
在用户选择4,调用查询函数search()中,为指向保存了读者信息的单链表的首地址的指针变量。
为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作,设计一个
intretbook(intbookid)
{
for(inti=0;i{
if(borbook[i]==bookid)
{
borbook[i]=0;
return1;
}
}
return0;
}
//读出读者信息
voiddisp()
{
cout<[";
for(inti=0;iif(borbook[i]!
=0)
cout<cout<<"]"<}
};
若没有该记录,则显示无此记录,返回到上一操作。
2.2.3图书维护模块
此模块主要实现了对图书记录的新增、更改、删除、查找和显示操作。
因为图书记录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。
下面分别介绍着4个功能模块。
新增记录。
该操作需要对单链表中目标节点的数据域中的值进行追加新增要输入图书的编号和书名,
intaddbook(intn,char*na)
{
Book*p=query(n);
if(NULL==p)
{
top++;
book[top].addbook(n,na);
return1;
}
return0;
}
更改系统。
该操作可以将原本错误的图书记录更改,将之改为正确的记录。
首先输入原来的记录的图书的编号,在此之后输入新的记录的书名。
③删除系统。
该操作可以将原本记录得图书信息,在不用之后选择将此删除的一种方法,在弹出的窗口输入原来的图书的编号,就可以将之删除。
④查找系统。
该操作可以帮助读者快速找到将要借的图书,只要输入图书的编号,如果有这本书,就将显示出。
反之就会显示不存在。
Book*query(intbookid)
{
for(inti=0;i<=top;i++)
if(book[i].getno()==bookid&&book[i].gettag()==0)
{
return&book[i];
}
returnNULL;
}
显示系统。
该操作可以显示出图书现在的信息。
cout<<"输入图书编号:
"<cin>>bookid;
cout<<"输入图书书名:
"<cin>>bname;
addbook(bookid,bname);
break;
case'2':
cout<<"输入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
cout<<"输入新的书名:
"<cin>>bname;
b->setname(bname);
break;
case'3':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->delbook();
break;
case'4':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:
cout<<"输入错误,请从新输入:
";
}
}
}cout<<"输入图书编号:
"<cin>>bookid;
cout<<"输入图书书名:
"<cin>>bname;
addbook(bookid,bname);
break;
case'2':
cout<<"输入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
cout<<"输入新的书名:
"<cin>>bname;
b->setname(bname);
break;
case'3':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->delbook();
break;
case'4':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:
cout<<"输入错误,请从新输入:
";
}
}
}cout<<"输入图书编号:
"<cin>>bookid;
cout<<"输入图书书名:
"<cin>>bname;
addbook(bookid,bname);
break;
case'2':
cout<<"输入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
cout<<"输入新的书名:
"<cin>>bname;
b->setname(bname);
break;
case'3':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->delbook();
break;
case'4':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:
cout<<"输入错误,请从新输入:
";
}
}
3、系统实现
3.1编码
3.1.2主函数main()include
#include
#include
//输入/输出文件流类
#include
usingnamespacestd;
//最多的读者
constintMaxr=100;
//最多的图书
constintMaxb=100;
//每位读者最多借五本书
constintMaxbor=5;
//图书库类,实现对图书的维护,查找,删除等
classBDatabase
{
private:
//图书记录指针
inttop;
//图书记录
Bookbook[Maxb];
public:
//构造函数,将book.txt读到book[]中
BDatabase()
{
Bookb;
top=-1;
fstreamfile("book.txt",ios:
:
in);
while
(1)
{
file.read((char*)&b,sizeof(b));
if(!
file)break;
top++;
book[top]=b;
}
file.close();
}
//全删
voidclear()
{
top=-1;
}
//增加图书
intaddbook(intn,char*na)
{
Book*p=query(n);
if(NULL==p)
{
top++;
book[top].addbook(n,na);
return1;
}
return0;
}
//查找图书
Book*query(intbookid)
{
for(inti=0;i<=top;i++)
if(book[i].getno()==bookid&&book[i].gettag()==0)
{
return&book[i];
}
returnNULL;
}
//图书库维护
voidbookdata();
voiddisp()
{
for(inti=0;i<=top;i++)
if(book[i].gettag()==0)
book[i].disp();
}
//析构函数,将book[]写到book.txt文件中
~BDatabase()
{
fstreamfile("book.txt",ios:
:
out);
for(inti=0;i<=top;i++)
if(book[i].gettag()==0)
file.write((char*)&book[i],sizeof(book[i]));
file.close();
}
};
voidBDatabase:
:
bookdata()
{
charchoice;
charbname[40];
intbookid;
Book*b;
while(choice!
='0')
{
cout<<"\n\n\n\t\t\t图书维护"<cout<<"\t\t1新增\n\t\t2更改\n\t\t3删除\n\t\t4查找\n\t\t5显示\n\t\t6全删\n\t\t0退出"<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<<"该图书不存在"<break;
}
cout<<"输入新的书名:
"<cin>>bname;
b->setname(bname);
break;
case'3':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->delbook();
break;
case'4':
cout<<"读入图书编号:
"<cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<<"该图书不存在"<break;
}
b->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:
cout<<"输入错误,请从新输入:
";
}
}
}
//main()函数的实现,程序的主界面的引导
intmain()
{
charchoice;
intbookid,readerid;
RDatabaseReaderDB;
Reader*r;
BDatabaseBookDB;
Book*b;
while(choice!
='0')
{
cout<
cout<<"\t\t\t1借书\n\n\t\t\t2还书\n\n\t\t\t3图书维护\n\n\t\t\t4读者维护\n\n\t\t\t0离开"<cin>>choice;
switch(choice)
{
case'1':
cout<<"借书读者编号:
";
cin>>readerid;
cout<<"图书编号:
";
cin>>bookid;
//按编号查找
r=ReaderDB.query(readerid);
if(NULL==r)
{
cout<<"不存在该读者,不能借书"<break;
}
b=BookDB.query(bookid);
if(b==NULL)
{
cout<<"不存在该图书,不能借书"<break;
}
if(b->borrowbook()==0)
{
cout<<"该图书已借出,不能借书"<break;
}
r->borrowbook(b->getno());
break;
case'2':
cout<<"还书\n读者编号:
";
cin>>readerid;
cout<<"图书编号:
";
cin>>bookid;
r=ReaderDB.query(readerid);
if(r==NULL)
{
cout<<"不存在该读者,不能还书"<break;
}
b=BookDB.query(bookid);
if(b==NULL)
{
cout<<"不存在该图书,不能还书"<break;
}
b->retbook();
r->retbook(b->getno());
break;
case'3':
BookDB.bookdata();
break;
case'4':
ReaderDB.readerdata();
break;
default:
cout<<"输入错误,请从新输入:
";
4、系统维护
经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。
一般维护的工作有:
更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。
5、归纳总结
5.1开发经验
通过对本题目的开发,体会到要掌握以下几点内容。
●大程序的设计风格。
按“自顶向下,逐步细化,模块化”的方法进行程序设计。
●编写主函数,并进行测试与调试。
当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。
C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。
●定义函数时,应选好参数的个数和数据类型。
●文件使用方法。
文件使用完毕后应及时关闭。
5.2实训中遇到的问题及解决方法
在实训过程中,我遇到许多的问题,比如有些语句有语法错误,表达式不正确,或缺少}或;等。
或者是没有宏定义,申明某些变量。
这些都比较容易解决。
通过查阅课本和请教同学,在经过WIN-TV编译,知道哪有错误就改一下就行。
比较严重的是,我的代码在求解平均成绩和总分时没有录入,且乱码。
自已改了很久,也在网上查询但是都不行。
最后在老师的帮助下及查阅有关资料,把代码改出来了。
5.3设计中尚存的不足之处
关于这次的程序,也有挺多不足的地方。
首先,我觉得程序还不够完善,比如没有排序前和排序后的学生记录输出结果显示和有些程序功能没有满足所给题目要求及好几项都没有显示出学生具体的信息,甚至有些地方有点乱;其次,有些地方好像功能有点重复了,且编写的代码有重复;最后,就是该程序界面不够美观大方,有些文件不能链接。
5.4感想和心得体会
通过这次实训,我感触甚深,要把所学的理论知识运用于解决实际问题不仅要付出艰辛的劳动,还得要有科学的方法和坚持不懈的努力。
加上我们只是学了一个学期的c语言,我们所学的知识还不足以独立编写程序代码。
但是我认为只要我们认真的去学去做,我们会受益非浅。
这次实训让我进一步理解了“编程是什么”,“如何去编程”,“编程的目的又是什么”,……发现自己的知识竟是如此贫乏,顿时感到了压力的存在,从而也激发了我的学习热情
。
它会成为我今后不断进取、永不懈怠的动力。
在整个实训过程中,老师给了我很大的帮助,使我由不了解怎样运用链表到逐渐懂得链表的