图书管理系统实验报告.docx
- 文档编号:23618807
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:15
- 大小:122KB
图书管理系统实验报告.docx
《图书管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《图书管理系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
图书管理系统实验报告
大型程序设计实验报告
课程名称
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.在编写程序时我往往会在同一个工程中建立两个文件。
一个是主要的工作文件,另一个则是“实验室”——通过它可以快速方便地验证自己的一些想法,发现一些没有考虑到得问题,少走很多弯路。
我觉得这样大大地提高了我的工作效率和工作质量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 实验 报告