毛彦峰-图书管理系统

更新时间:2024-03-15 22:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

华科学院计算机科学与技术专业 《程序设计综合课程设计》报告 (2009/2010学年 第一学期) 学生姓名: 毛彦峰 学生班级: 计算机082202H 学生学号: 200822030216 指导教师: 李富萍 2009年12月12日

目 录

第一章 课程设计目的和要求 ······························································································1

1.1 课程设计的目的 ····································································································1 1.2 课程设计实现的要求 ····························································································1 第二章 课程设计任务内容 ··································································································2 第三章 详细设计说明 ··········································································································3

3.1 模块 ························································································································3 3.2 性能 ························································································································4 3.3 算法说明 ················································································································4 3.4 函数说明 ················································································································5 3.5 系统程序流程图 ··································································································14 3.6 注释设计 ··············································································································15 3.7 限制条件 ··············································································································15 3.8 测试计划 ··············································································································15 第四章 软件使用说明 ········································································································16

4.1 软件使用说明及出现的问题 ··············································································16 4.2 运行结果 ··············································································································16 第五章 课程设计心得与体会 ····························································································20 附录1:参考文献 ···············································································································21 附录2:程序清单 ···············································································································22

程序设计综合课程设计

第一章 课程设计目的和要求

1.1 课程设计的目的

进一步巩固《C++程序设计》所学的知识,特别加强数组,指针,结构体,文件数据类型的应用,熟悉面向过程的结构化和面向对象可视化程序设计方法,培养结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解,锻炼程序设计的能力,以及用C/C++ 语言解决实际问题的能力,为以后后续课程的学习打好基础。

此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。要求熟悉运用一些编程软件(如:Microsoft Visual C++ 6.0),对我们所学的理论知识进一步的深化。

1.2 课程设计实现的要求

本设计要求用C++语言实现一个图书管理系统,要求能够进行借书,还书。对图书和读者进行编号。可以增加和减少图书和读者。可以修改图书和读者的信息等。

1

程序设计综合课程设计

第二章 课程设计任务内容

用C/C++语言实现一个图书管理系统,该系统主要应用在图书管理,涉及到图书的录入,某个图书存在查询,某本书的删除,以及某读者的新增、更改以及查找和删除。其中图书录入可以使用编号输入,也可以输入书名。

在本程序中,我主要负责图书的查找,新增和删除三个功能,这部分主要是将图书的编号输入到程序中,输入正确后,由系统自动把图书的编号保存在系统中,而且可以对已保存过的图书进行查询,并且可以对图书的编号进行修改,并保存。

2

程序设计综合课程设计

第三章 详细设计说明

3.1 模块

3.1.1 模块描述

定义一个结构体,在其中声明结构变量,然后定义字符串,来存放要用到的变量。然后定义此程序的其他功能模块的原型。主函数调用各个功能子函数,定义各个功能子函数,通过addbook创建一个图书信息函数,实现图书编号的录入,通过setname(char

na[]),delbook()做一个查询图书的函数,实现查询某个图书是否存在,通过modlist做

一个修改图书的函数,实现修改某个图书编号。在程序中需要输入的内容包括:

(1)借书

实现过程:根据提示选择“1”进入借书界面,按步骤输入读者编号以及图书编号,以“Enter”键结束,然后由系统自动查询图书是否存在,图书保存在事先定义的数据库中。

(2)还书

实现过程:根据提示选择“2”进入还书界面,按步骤输入读者以及图书的编号,以“Enter”键结束,由系统自动调出读者的信息。

(3)图书的维护

实现过程:根据提示选择“3”进入图书维护界面,按步骤输入要新增或更改的图书的编号,以“Enter”键结束,此时所有的基本信息都被要求重新输入。

(4)读者的维护 与图书的维护基本类似。

3

程序设计综合课程设计

3.1.2 功能模块图

此系统的函数功能模块图如图3-1所示。

图书管理系统 借书模块还书模块图书维护读者维护模块退出 图3-1 函数功能模块图

3.2 性能

该系统性能要求: (1)灵活性要求:

输出的数据能准确的按照操作代码输出。 (2)时间特性要求:

输入的各项操作代码能及时反应其运行结果。

3.3 算法说明

该程序先采用了一个嵌套在do—while循环语句中的switch语句来控制要执行操作的编号,用户可以有多种选择,根据不同的需要选择不同的操作。

其中具体的操作主要采用的是一个链表的结构,涉及到了链表的插入,链表的查找,以及链表的删除等知识点。链表的插入解决了图书的录入问题,具体为:为每个图书建立一个头结点,若有人借了本书,建立一个新的结点来存储该读者的信息,并将其插到该图书所在链表的最后一个结点后面。链表的查找解决了图书的查询,以及

4

程序设计综合课程设计

后面的存在否的输出、删除都要用到链表的查找,查找时先将头结点的地址赋给查找函数,根据查找的条件依次与每个结点中相应的比较,若相等则输出所需要的信息,否则返回“查找的元素不存在”信息。而图书的删除,先查找到其所在的结点,然后将该结点前后结点相连,再删除该结点;图书的修改要先查找到其所在的结点,然后再重新录入数据;至于查询结果的输出,将该图书所在的头结点的地址赋给控制输出的函数,利用指针的移动将查询结果输出。

3.4 函数说明

3.4.1 图书录入函数

(1)原型:void addreader(int n,char *na)

(2)功能:该函数用来录入图书,读者编号。 (3)流程图:如图3-2所示。 (4)对应代码:

//增加读者

void addreader(int n,char *na) { tag=0; no=n;

strcpy(name,na); for(int i=0;i

//增加图书

void addbook(int n,char *na) { tag=0; no=n;

strcpy(name,na); onshelf=1; }

5

程序设计综合课程设计

开始 输入 i=0 假 i<3 真 输入图书编号 输入读者编号 i++ 结束

图3-2 借书的流程图

3.4.2 还书函数

(1)原型:void borrowbook(int bookid)

(2)功能:通过输入读者的编号以及图书的编号来查找是否存在该读者以及是否存在该图书。

6

程序设计综合课程设计

(3)流程图:如图3-3所示。

开始 输入要查找的图书的编号 输入要查找的读者的编号 判断是否存在 否 是 存在 结束

图3-3还书的程序流程图

(4)对应代码:

void borrowbook(int bookid) {

for(int i=0;i

if (borbook[i]==0) {

borbook[i]=bookid; return; } } }

//还书操作

7

程序设计综合课程设计

3.4.3 图书维护函数

(1)原型:void BDatabase::bookdata() (2)功能:该函数用来进行图书的维护 (3)流程图:如图3-4所示。

开始 输入操作项编号 N 判断 Y 运行 结束

图3-4 图书维护流程图 (4)对应代码:

void BDatabase::bookdata() {

char choice; char bname[40]; int bookid; Book *b;

while (choice!='0') {

cout <<\图 书 维 护 \

cout<<\新 增\\n \\t\\t2 更 改\\n\\t\\t3 删 除\\n\\t\\t4 查 找\\n\\t\\t5 显 示\\n\\t\\t6 全 删\\n\\t\\t0 退 出\ cin >> choice; switch (choice)

8

程序设计综合课程设计

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

9

程序设计综合课程设计

cout <<\该图书不存在\ break; } b->disp(); break; case '5': disp(); break; case '6': clear(); break;

default:cout<<\输入错误,请从新输入:\ } } }

3.4.4 读者维护函数

(1)原型:Reader *query(int readerid) (2)功能:该函数用来进行读者的维护 (3)流程图:

开始 输入操作项编号 N 判断 Y 运行 结束

图3-5 读者维护流程图

10

程序设计综合课程设计

(4)对应代码:

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

//析构函数,将read[]写到reader.txt文件中 ~RDatabase() {

fstream file(\ 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')

11

程序设计综合课程设计

{

cout <<\读 者 维 护\\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 退 出\ 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 << \该读者不存在 \ break; }

cout << \输入新的姓名:\ cin >> rname; r->setname(rname); break; case '3':

cout << \输入读者编号:\ cin >> readerid; r=query(readerid); if (r==NULL) {

cout <<\该读者不存在\ break; }

r->delbook(); break; case '4':

12

程序设计综合课程设计

cout << \读入读者编号:\ cin >> readerid;

r=query(readerid); if (r==NULL) {

cout <<\该读者不存在\ break; } r->disp(); break; case '5': disp(); break; case '6': clear(); break;

default:cout<<\输入错误,请从新输入:\ } } }

13

程序设计综合课程设计

3.5 系统程序流程图

系统程序流程图如图3-6所示。

开始 输入操作项编号 借书还书图书维护读者维护退出 列出一个操作目录选择要操作的编号 图3-6 系统程序流程图

结束

14

程序设计综合课程设计

3.6 注释设计

详见程序清单。

3.7 限制条件

在输入值时必须按照程序所规定的输入,否则将运行错误或无法运行。

3.8 测试计划

该程序可以完成对图书的录入,对图书编号以及读者编号的查询和修改的功能。当输入编号后,由系统自动把图书信息保存在系统中,而且可以对已保存过的某本书籍进行查询,并且可以对某本书籍的编号进行修改,并保存。

15

程序设计综合课程设计

第四章 软件使用说明

4.1 软件使用说明及出现的问题

该程序可以实现对图书的录入,某个图书是否存在的查询,某本书籍编号的修改。 安装VisualC++6.0中文版后,在工具栏“文件”中单击“新建”选项,单击“文件”选项卡,选择“C++ Source file”并输入文件名。开始输入程序,程序输入完成,单击工具栏中“组建”选项,选择“编译[图书管理系统.cpp]”待程序无误后,开始构建并执行程序。

该程序在输入时,必须是按照要求的字符串输入,否则程序无法运行。

4.2 运行结果

4.2.1 初始运行界面:

图书管理系统的初始运行界面如图4-1所示:

图4-1 初始运行界面

16

程序设计综合课程设计

4.2.2 借书界面:

进入初始界面后,输入项目编号“1”,借书。由于还没有输入数据,所以此处显示“不存在”。如图4-2所示:

图4-2 借书界面

4.2.3 还书界面:

输入编号“2”,具体的数据如图4-3所示:

图4-3 还书界面

17

程序设计综合课程设计

4.2.4 图书维护

输入编号“3”,具体的结果如图4-4所示:结果显示可以对图书进行哪些维护方面的操作,用户可以根据自己的需要选择。

图4-4 图书维护界面

18

程序设计综合课程设计

4.2.5 读者维护界面:

输入编号“4”,具体的结果如图4-5所示:结果显示可以对读者进行哪些维护方面的操作,用户可以根据自己的需要选择。

图4-5 读者维护界面

4.2.6 退出界面

输入编号“0”,具体的结果如图4-6所示:将退出系统。

图4-6 退出界面

19

程序设计综合课程设计

第五章 课程设计心得与体会

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说,掌握程序开发技术是十分重要的,而C/C++语言又是最常见,功能最强大的高级语言,因此做好C/C++语言课程设计是十分必要的。

回顾起此次课程设计,我感慨颇多。的确,从拿到题目到完成整个系统的编程,从理论到实践,在整整三周的日子里,我学会了很多东西,在巩固了以前所学过的知识的同时,我还学到了很多在书本上所没有学到过的知识。

经过这次课程设计,我在收获知识、提高能力的同时,我也学到了很多人生的哲理,学会了如何运用所学知识去解决实际问题,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。在此,感谢老师的辛勤教导!感谢对我予以帮助的同学们!

20

程序设计综合课程设计

附录1:参考文献

[1]、谭浩强,C++语言程序设计,北京清华大学出版社,2008年3月。

[2]、谭浩强,张基温,C语言程序设计教程(第三版),高等教育出版社,2008年4月。

[3]、郑阿奇,丁有和,郑进,周怡君,Visual C++实用教程,北京电子工业出版社, 2005年6月。

21

程序设计综合课程设计

附录2:程序清单

#include #include #include //输入/输出文件流类 #include 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;

22

程序设计综合课程设计

}

//获取删除标记 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=0;i

//借书操作

void borrowbook(int bookid) {

for(int i=0;i

if (borbook[i]==0) {

23

程序设计综合课程设计

borbook[i]=bookid; return; } } }

//还书操作

int retbook(int bookid) {

for(int i=0;i

if(borbook[i]==bookid) {

borbook[i]=0; return 1; } } return 0; }

//读出读者信息 void disp() {

cout << setw(5) << no <

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

24

程序设计综合课程设计

private: //读者记录指针 int top; //读者记录

Reader read[Maxr]; public:

//构造函数,将reader.txt读到read[]中 RDatabase() { Reader s; top=-1;

//打开一个输入文件

fstream file(\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; }

25

程序设计综合课程设计

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

//析构函数,将read[]写到reader.txt文件中 ~RDatabase() {

fstream file(\ 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];

26

程序设计综合课程设计

int readerid; Reader *r; while (choice!='0') {

cout <<\读 者 维 护\\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 退 出\ 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 << \该读者不存在 \ break; }

cout << \输入新的姓名:\ cin >> rname; r->setname(rname); break; case '3':

cout << \输入读者编号:\ cin >> readerid; r=query(readerid); if (r==NULL) {

cout <<\该读者不存在\ break; }

27

程序设计综合课程设计

r->delbook(); break; case '4':

cout << \读入读者编号:\ cin >> readerid; r=query(readerid); if (r==NULL) {

cout <<\该读者不存在\ break; } r->disp(); break; case '5': disp(); break; case '6': clear(); break;

default:cout<<\输入错误,请从新输入:\ } } }

//图书类,实现对图书的描述,图书的编号,书名,借出,还入等 class Book { private:

//删除标记 1:已删 0:未删 int tag; //图书编号 int no; //书名

28

程序设计综合课程设计

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

29

程序设计综合课程设计

{

onshelf=1; }

//输出图书 void disp() {

cout << setw(6) << no << setw(18) << name << setw(10) <<(onshelf==1? \在架\已借\ } };

//图书库类,实现对图书的维护,查找,删除等 class BDatabase { private: //图书记录指针 int top; //图书记录 Book book[Maxb]; public:

//构造函数,将book.txt读到book[]中 BDatabase() { Book b; top=-1;

fstream file(\ while (1) {

file.read((char *)&b,sizeof(b)); if (!file) break; top++; book[top]=b; }

30

程序设计综合课程设计

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

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

31

程序设计综合课程设计

~BDatabase() {

fstream file(\ 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 <<\图 书 维 护 \

cout<<\新 增\\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)

32

程序设计综合课程设计

{

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

33

程序设计综合课程设计

} }

//main() 函数的实现,程序的主界面的引导

int main() {

char choice; int bookid,readerid; RDatabase ReaderDB; Reader *r;

BDatabase BookDB; Book *b; while(choice!='0') {

cout <

cout <<\借 书\\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);

34

程序设计综合课程设计

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;

35

程序设计综合课程设计

default:cout<<\输入错误,请从新输入:\ } } }

36

本文来源:https://www.bwwdw.com/article/dhm8.html

Top