图书管理系统实验报告.docx

上传人:b****8 文档编号:23618807 上传时间:2023-05-19 格式:DOCX 页数:15 大小:122KB
下载 相关 举报
图书管理系统实验报告.docx_第1页
第1页 / 共15页
图书管理系统实验报告.docx_第2页
第2页 / 共15页
图书管理系统实验报告.docx_第3页
第3页 / 共15页
图书管理系统实验报告.docx_第4页
第4页 / 共15页
图书管理系统实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

图书管理系统实验报告.docx

《图书管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《图书管理系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

图书管理系统实验报告.docx

图书管理系统实验报告

大型程序设计实验报告

课程名称

C程序设计实践

实验日期

2011-3~2011-5

学生姓名

吴连杰

所在班级

计101

学号

1004011007

实验名称

图书管理系统

实验地点

信息楼109

同组人员

1.问题描述

系统涉及的用户分为(软件)系统管理员、图书管理员和读者三类。

其中系统管理员负责系统相关操作和系统配置工作,其操作至少包括:

添加、删除用户,查看用户信息,清空用户密码。

图书管理员负责和图书及其借阅相关的操作,其操作至少包括:

添加、删除图书,修改图书信息,用户帐户充值。

读者包括学生和教职工两类,两类读者的主要区别在于一次可借图书册数,借阅期限等,读者可进行的操作至少包括:

图书查询(系统是否有该书,图书借阅情况),借/还/续借图书,修改读者信息。

2.问题分析

关键技术:

文件的读取,存储。

链表的创建、添加、删除等操作。

将文件信息读取存至链表中。

难点:

1.关于时间函数的运用

2.有两类读者,需要区别开

3.实现自动判断图书是否超期,并对对应信息进行修改

4.用户登陆,及密码加密。

3.系统设计

3.1总体设计

登陆

添加图书

图书管理员模块删除图书

修改图书信息

图用户充值

书添加用户

管删除用户

系统管理员模块查看用户信息

系清空用户密码

统查询图书

借书

还书

读者模块续借

修改读者信息

编成函数,通过调用实现对应功能。

除以上外还需要统计最受读者喜爱的书,登陆,超期罚款功能。

主函数流程图:

按选择进入不同系统后的子主函数流程示例:

功能函数流程图示例:

3.2界面设计

主要界面示意图如下,就不一一列举了:

 

3.3系统主要流程设计(实验一、二无需填写)

3.4主要数据结构设计

3.4.1系统数据结构概述

除系统管理员外都使用结构体存放用户信息,采用数组或链表的数据结构。

3.4.2数据结构详细说明

书本和读者采用链表数据结构。

以下是所使用的结构体说明

structbookinf/*定义图书结构体*/

{

charname[31];

charauthor[21];

charpubcompany[100];/*出版社*/

charpubdate[20];/*出版时间*/

intprice;/*价格*/

longintISBN;/*图书编号*/

charcategory[30];/*分类*/

intcondition;/*是否在架1:

在架0:

已借2:

再借*/

intborrowednum;/*借阅次数*/

structbookinf*next;

};

structreaderinf/*定义学生结构体*/

{

charname[30];

charsex[4];

charbirthday[20];/*出生年月*/

charcollege[20];/*学院*/

charsecretnum[10];/*secretnum=(密码-20)*2*/

longintID;/*学号*/

chartype[20];/*读者类型*/

intbalance;/*账户余额*/

intbornum;/*当前借阅数*/

intoutdatenum;/*超期图书数*/

structborrowb[30];/*一个结构体变量,记录图书和超期时间*/

structreaderinf*next;/*指向下一位同学的指针*/

};

structborrow/*定义被借图书简单信息*/

{

longintbook;

intoutyear;/*为查看用户信息时,可以查看书本超期时间所定*/

intoutmonth;

intoutday;

longinttim;/*为简化超期罚款函数所定*/

};

在做图书管理员登陆时也使用结构体存放账户和密码,并采用数组结构:

structlibrarian/*图书管理员的账户、加密后密码=(密码-20)*2*/

{

intz;

charm[20];

}liber[5]={{1001,"<<<<"},{1002,"@@@@"},{1003,"DDDD"},{1004,"HHHH"},{1005,"<@DH"}};

密码为:

2222、4444、6666、8888、2468

3.5函数设计

3.5.1概述

遵循程序设计原则,尽量使用局部变量。

尽量遵循使模块的“内聚性”强、与其他模块的“耦合性”弱,模块的功能单一化原则编辑主要的功能函数,并且编写一些辅助函数来简化程序。

3.5.2函数清单

以下是对系统管理员模块使用函数:

intloadone();/*登陆*/

函数功能:

系统管理员登陆

输出参数:

1--登陆成功,0--返回上层

函数流程:

1.输入用户名,若返回上层输入4

2.若有这个用户,则继续输入密码。

密码正确则返回1,

3.否则继续输入。

voidmanagementone();

函数功能:

系统管理员选择对应功能,进行操作

structreaderinf*creat();/*初始化链表函数*/

函数功能:

读取文件中的信息,存至链表中对应位置

输出参数:

head--链表头指针

函数流程:

1.打开文件

2.文件没有结束则读取文件信息并存至链表

3.文件结束则返回头指针

structreaderinf*addperson(structreaderinf*head);/*添加用户函数*/

函数功能:

添加用户

输入/输出参数:

均为链表指头针head

函数流程:

1.若链表为空,申请一块空间给头指针

2.否则申请一块空间给p

3.输入用户的信息,并对密码加密

4.将p指向的节点连到链表上

structreaderinf*delperson(structreaderinf*head);/*删除用户函数*/

函数功能:

删除用户

输入/输出参数:

均为链表头指针head

函数流程:

1.输入要删除用户的ID

2.若为头指针的用户,则使后一个节点为头节点

3.否则寻找该用户

4.若找到该用户,则删除该节点

5.否则向用户输出“无此用户”

voidshowperson(structreaderinf*head);/*查看用户信息*/

函数功能:

查看用户信息

输入参数:

head--链表头指针

函数流程:

1.输入要查看用户的ID

2.寻找该户

3.若找到该用户,则输出该用户信息

4.查找所借图书信息并输出

5.否则向用户输出“无此用户”

voiddelsecret(structreaderinf*head);

函数功能:

清空用户密码

输入参数:

head--链表头指针

voidstoragereader(structreaderinf*p);

函数功能:

将链表中读者信息存至文件

以下是对图书管理员模块使用函数:

intloadtwo();/*登陆*/

函数功能:

图书管理员登陆

输出参数:

1--登陆成功,0--返回上层

函数流程:

1.输入用户名,若返回上层输入4

2.若有这个用户,则继续输入密码。

密码正确则返回1,

3.否则继续输入

voidmanagementtwo();

函数功能:

图书管理员选择对应功能,进行操作

structbookinf*addbook(structbookinf*head);/*添加图书*/

函数功能:

添加图书

输入/输出参数:

均为链表指头针head

函数流程:

1.若链表为空,申请一块空间给头指针

2.否则申请一块空间给p

3.输入图书的信息

4.将p指向的节点连到链表上

structbookinf*delbook(structbookinf*head);/*删除图书*/

函数功能:

删除图书

输入/输出参数:

均为链表头指针head

函数流程:

1.输入要删除图书的ISBN

2.若为头指针的图书,则使后一个节点为头节点

3.否则寻找该图书

4.若找到该图书,则删除该节点

5.否则向用户输出“无此图书”

voidrewritebook(structbookinf*b);/*修改图书信息*/

函数功能:

修改图书信息

输入参数:

head--链表头指针

函数流程:

1.输入要修改图书的ISBN

2.寻找该图书

3.若找到该图书,则输入修改信息

4.否则向用户输出“无此图书”

voidrecharge(structreaderinf*p);/

函数功能:

用户充值

以下是对读者模块函数使用的声明:

structreaderinf*loadthree();/*登陆*/

函数功能:

读者登陆

输出参数:

1--登陆成功,0--返回上层

函数流程:

1.打开用户信息文件,存至链表

2.输入用户名,若返回上层输入4

3.若有这个用户,则继续输入密码。

密码正确则返回1,

4.否则继续输入。

voidoperation();

函数功能:

读者选择对应功能,进行操作

structbookinf*begin();/*初始化链表函数*/

函数功能:

读取图书文件中的信息,存至链表中

输出参数:

head--链表头指针

函数流程:

1.打开文件

2.文件没有结束则读取文件信息并存至链表

3.文件结束则返回头指针

voidborrowbook(structbookinf*b1,structreaderinf*p);/*借书*/

函数功能:

借书

输入参数:

b1--图书头指针,p--登陆后读者指针

函数流程:

1.读取系统时间

2.判断读者类型

3.若为学生可以借10本,教师可以借30本

4.判断所借图书数是否到达上限

5.若没有则输入要借图书ISBN,否则不允许借

6.查找图书

7.若有该书则借阅,若没有则告诉读者没有该书

voidrenewbook(structreaderinf*p);/*续借*/

函数功能:

续借

输入参数:

p--登陆后读者指针

函数流程:

1.读取系统时间

2.判断读者类型

3.若为学生则超期时间加1个月份,教师则超期时间加5个月份

4.输入要续借图书ISBN号

5.查找该图书

6.若找到,则按3处理。

7.否则输出“未借此书

voidreturnbook(structreaderinf*p);/*还书*/

函数功能:

还书

输入参数:

p--读者登陆后对应指针

函数流程:

1.输入要还图书ISBN

2.查找该图书

3.若借了该书被借图书数减1,并判断是否超期

4.若超期则使超期图书数减1

5.调整被借图书数组b[30];

6.若没借该书,则输出“未借此图书”

voidcheckbook(structbookinf*b);

函数功能:

查找图书

voidrewritereader(structreaderinf*p3);

函数功能:

修改读者信息

voidstoragebook(structbookinf*b);

函数功能:

将链表中的图书信息存至文件

voidstatistic();

函数功能:

统计最受喜欢图书

voidfine();/*超期罚款函数*/

函数功能:

超期罚款函数

函数流程:

1.调用函数打开文件

2.读取系统时间

3.若图书到期,将tt赋值给p->b[i].tim,超期图书数加1

4.若图书超期,将tt赋值给p->b[i].tim,根据公式p->balance-=(tt-p->b[i].tim)/864000罚款

5.调用函数,存储信息

4.系统使用说明

运行系统,出现用户类型选择框,选择对应的类型之后进入对应的登陆界面。

成功登陆后,选择对应的功能进行操作。

期间可以返回上层进行从新选择。

5.系统实现过程中的难点及其解决方案

1.难点:

文件的存储和读取使用fread和fwrite函数时不稳定,有时会乱码。

解决方案:

改用fprintf和fscanf函数,更加容易掌控。

使用也更加的灵活,方便。

并且比起原来的语句要节约文件的空间。

2.难点:

密码的加密,及输入时不显示。

解决方案:

查找资料,发觉getch语句可以解决密码在输入时不显示的问题。

密码的加密:

我将密码定义成的是字符型数据,只要对其值进行数学运算即可得到加密后的密文,密码破解难易在于运算的复杂程度。

这是我想到的比较可行的加密方案。

3.难点:

系统时间的读取,及存储。

解决方案:

这之所以成为问题只是因为以前从未接触到涉及系统时间的问题。

查阅资料,很快解决了这个问题。

函数库自带了对应的函数

6.系统不足之处及其改进构想

不足之处:

系统在图书超期时必须运行一次,不然读者就会被扣很多钱,但之后隔多久运行也没有关系。

问题产生的原因是之前想偷懒超期按月份来做,后来发觉还是按一个月30天来做的简单、合乎实际。

虽然在那里我设计了一个算法,代码只多出六七条,但在系统稳定性上还是欠缺的。

改进构想:

舍去查询用户信息时能看到超期时间的功能。

选择借书时记录的是借书时间,修改一下超期罚款函数,这样不管隔多久运行都不会有问题了。

7.其他说明

发觉在制作图书管理系统过程中自己的能力和经验提高了很多。

还知道了很对以前不知道的知识,这些书上往往是没有的。

下面是我的一点心得:

1.先构造好答题的框架,对问题做全面细致的分析,然后再将问题具体化写到纸上,最后再敲代码。

写一部分就调试一部分。

2.变量赋初值十分重要,不能忽略,好多时候程序运行出错都是因为这个问题。

3.不能为了想让一个函数简洁一点,就去轻易改变前面结构体等的定义。

这样效率很低,要充分考虑全局,有时候鱼与熊掌不可兼得。

有了一个思路就要坚持这个思路写下去,当然前提是在前期足够的分析上。

4.Switch(choice)中,choice的值只作为判断用,想要由其值进行某些操作还要对其赋值。

5.在编写程序时我往往会在同一个工程中建立两个文件。

一个是主要的工作文件,另一个则是“实验室”——通过它可以快速方便地验证自己的一些想法,发现一些没有考虑到得问题,少走很多弯路。

我觉得这样大大地提高了我的工作效率和工作质量。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1