C课设实验报告.docx
《C课设实验报告.docx》由会员分享,可在线阅读,更多相关《C课设实验报告.docx(80页珍藏版)》请在冰豆网上搜索。
![C课设实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/a07f4341-cf1f-40f7-8938-6a8de9dddb1a/a07f4341-cf1f-40f7-8938-6a8de9dddb1a1.gif)
C课设实验报告
华中科技大学计算机科学与技术学院
《C语言程序设计》课程设计
实验报告
题目:
书店租书信息管理系统
专业:
计算机科学与技术专业
班级:
0906班
学号:
姓名:
成绩:
指导教师:
完成日期:
2010年10月24日
1题目
2系统功能模块结构图
3数据结构设计及用法说明
4程序结构(流程图)
5功能模块介绍
6试验结果
7体会
8参考文献
9附录:
源代码
一、题目
1.题目:
书店租书信息管理系统
2.需要处理的基础数据
(1).图书类别基本信息参考:
中文字段名
类型及长度
举例
编号
char
‘0’表示教辅,‘1’表示少儿等
类别名称
char[10]
中小学教辅
续费率
double
会员出租折扣率
double
(2).图书基本信息参考:
中文字段名
类型及长度
举例
类别
char
‘0’表示教辅
图书编号
char[10]
“200900011”
图书名称
char[30]
小学语文阅读训练80篇
作者
char[20]
出版社
char[30]
长春出版社
售价
double
租价
double
会员价
double
库存数
int
上架日期
char[11]
2009/04/20
架位
char[3]
(3).图书租阅基本信息参考:
中文字段名
类型及长度
举例
类别
char
‘0’表示教辅
图书编号
char[10]
“200900011”
姓名
char[20]
身份证
char[19]
租书日期
char[11]
2010/01/20
可租天数
int
5
应还日期
char[11]
2010/01/25
归还日期
char[11]
2010/01/28
续费
double
图书续费=超期天数*租费*续费率*会员出租折扣率
3.需实现的系统功能
(1).各种基本数据的录入
(2).各种基本数据的修改
(3).各种基本数据的插入
(4).各种基本数据的删除
(5).基于各种数据的查询
(6).基于各种基本数据的统计计算
二、系统功能模块结构图
图1系统功能模块结构示意图
图2文件处理结构示意图图3修改处理结构示意图
图4插入处理结构示意图图5删除处理结构示意图
图6查询处理结构示意图图7统计处理结构示意图
三、数据结构设计及用法说明
1.数据结构设计
typedefstructrent_info{/*定义图书租阅基本信息结构类型rent*/
chartype;/*类别*/
charnum[10];/*图书编号*/
charrenter_name[20];/*姓名*/
charID_card[19];/*身份证*/
charrent_date[11];/*租书日期*/
intrental_days;/*可租天数*/
charpreturn_date[11];/*应还日期*/
charreturn_date[11];/*归还日期*/
intoverlap_days;/*超期天数*/
doublerenewal_fee;/*续费*/
structrent_info*next;/*指向下一结点的自引用指针*/
}rent;
typedefstructbasic_info{/*定义图书基本信息结构类型basic*/
chartype;/*类别编号*/
charnum[10];/*图书编号*/
charname[30];/*图书名称*/
charauthor[20];/*作者*/
charpub_house[30];/*出版社*/
doublesell_price;/*售价*/
doublerent_price;/*租价*/
doublemem_price;/*会员价*/
intsup_num;/*库存数*/
charsh_date[11];/*上架日期*/
charsh_place[3];/*架位*/
rent*head_rent;/*指向租阅信息链的头指针*/
structbasic_info*next;/*指向下一结点的自引用指针*/
}basic;
typedefstructbooktype_info{/*定义图书类别基本信息结构类型type*/
chartnum;/*类别编号*/
chartname[10];/*类别名称*/
doublerenewal_rate;/*续费率*/
doublediscount_rate;/*会员出租折扣率*/
basic*head_basic;/*指向基本信息链的头指针*/
structbooktype_info*next;/*指向下一结点的自引用指针*/
}type;
typedefstructrent_times{/*定义图书租阅次数结构类型rtimes*/
chartype;/*类别编号*/
charnum[10];/*图书编号*/
charname[30];/*图书名称*/
intk;/*租阅次数*/
structrent_times*next;/*指向下一结点的自引用指针*/
}rtimes;
2.数据结构说明
…
…
图2书店租书信息管理系统十字交叉链表
3.系统用法及功能说明
3.1运行程序后,即进入图书租阅信息管理系统操作界面
图8图书租阅信息管理系统操作界面
主菜单有六个选项,每个选项都是一个英文字母加主菜单名,提示用户可以用快捷键:
按热键“F”或“Alt_F”弹出“文件”下的子菜单
按热键“M”或“Alt_M”弹出“修改”下的子菜单
按热键“I”或“Alt_I”弹出“插入”下的子菜单
按热键“D”或“Alt_D”弹出“删除”下的子菜单
按热键“S”或“Alt_S”弹出“查询”下的子菜单
按热键“C”或“Alt_C”弹出“统计”下的子菜单
还有一个“退出”的快捷键:
“Alt+X”.
不用快捷键的话,可以通过按“←”“→”键选择其他主菜单。
当选中某一主菜单时,按“↓”或Enter,可以显示子菜单。
再通过“↑”“↓”键选择子菜单,按Enter,就可以进入相应函数,屏幕颜色改变,执行相应功能。
3.2.1在文件处理菜单中,选择“创建”,屏幕显示需要输入的内容,输入后按Enter,会询问是否输入另一类图书类别基本信息,”y”,则继续录入另一类图书类别基本信息,“n”,则询问是否输入%c%s类图书的基本信息,“y”则显示需要输入的内容,“n”则询问是否输入另一本类图书的基本信息。
租阅链类似。
3.2.2在文件处理菜单中,选择“保存”,保存已录入的信息,如果保存成功,屏幕显示“保存成功”。
3.2.3在文件处理菜单中,选择“载入”,载入已录入的信息,如果载入成功,屏幕显示“载入成功”。
3.2.4在文件处理菜单中,选择“退出”,则退出整个系统。
图9创建一级链表界面
图10修改二级链表界面
3.3.1在修改处理菜单中,选择“修改类别信息”,屏幕显示提示“请输入要修改的图书的类别编号:
”,输入后,如果有此类图书,则输出此类图书的类别信息,并输出可修改的选择项供选择,选择修改项后输入修改内容,按Enter,会提示“修改成功”并输出修改后数据;如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
3.3.2在修改处理菜单中,选择“修改基本信息”,屏幕显示提示“请输入要修改的图书的类别编号:
”,输入后,如果有此类图书,则提示输入要修改的图书编号,如果有此本图书,则输出此本图书的基本信息,并输出可修改的选择项供选择,选择修改项后输入修改内容,按Enter,会提示“修改成功”并输出修改后数据。
如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
如果没有此本图书,则提示输入错误,询问是否重新输入,是则提示输入要修改的图书编号,否则退出此功能。
3.3.3在修改处理菜单中,选择“修改租阅信息”,步骤与3.3.2类似。
图11插入一级链表界面
3.4.1在插入处理菜单中,选择“插入类别信息”,屏幕显示提示“想把信息插入到哪类图书后面?
请输入相应图书类别编号:
”,输入后,如果有此类图书,屏幕显示需要输入的内容,输入后按Enter,会提示“插入成功”。
如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
3.4.2在插入处理菜单中,选择“插入基本信息”,屏幕显示提示“想把信息插入到哪类图书后面?
请输入相应图书类别编号:
”,输入后,如果有此类图书,则提示"想把信息插入到哪本图书后面?
请输入相应图书图书编号:
",如果有此本图书,屏幕显示需要输入的内容,输入后按Enter,会提示“插入成功”。
如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
。
如果没有此本图书,则提示输入错误,询问是否重新输入,是则提示输入相应的图书编号,否则退出此功能。
3.4.3在插入处理菜单中,选择“插入租阅信息”,步骤与3.4.2类似。
图12删除三级链表界面
3.5.1在删除处理菜单中,选择“删除类别信息”,屏幕显示提示"请输入要删除的图书的类别编号:
",输入后,如果有此类图书,则提示“删除成功”,如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
3.5.2在删除处理菜单中,选择“删除基本信息”,情况参考3.5.1和3.3.2
3.5.3在删除处理菜单中,选择“删除租阅信息”,步骤类似3.5.2。
图13查询三级链表界面
3.6.1在查询处理菜单中,选择“查询类别信息”,屏幕显示提示"请输入要查询的图书的类别编号:
",输入后,如果有此类图书,则输出此类图书类别信息,如果没有此类图书,则提示输入错误,询问是否重新输入,是则返回刚开始进入的页面,否则退出此功能。
3.6.2在查询处理菜单中,选择“查询基本信息”,屏幕显示提示"请输入要删除的图书的类别编号:
",输入后,如果有此类图书,且有书,则提示“1输出此类所有图书基本信息
2输出某本图书详细基本信息”请选择,选1则输出所有图书基本信息,选2,则需输入要查询的图书的图书编号,有此本书则输出,否则提示输入错误,询问是否重新输入是则返回上一步,否则退出此功能。
3.6.3在查询处理菜单中,选择“查询基本信息”,步骤类似3.6.2。
图14统计三级链表界面
3.7.1在统计处理菜单中,选择“统计类别信息”,屏幕直接输出总共的类别数和所有类别信息。
3.7.2在统计处理菜单中,选择“统计基本信息”,屏幕直接输出总共的图书本数和所有图书基本信息。
3.7.3在统计处理菜单中,选择“统计租阅信息”,查询某月各图书的租阅次数,屏幕显示提示“请输入要统计的年月:
”,输入后按Enter,将输出各图书在当月内的租阅次数,且已按租阅次数从高到低排序。
四、程序结构(流程图)
删除图书基本信息函数流程图
五、各模块的功能
具体介绍参见第3节(系统操用法及功能说明),运行结果请参见第6节(试验结果)
Ø数据文件处理
"载入","创建","保存","退出"
Ø数据修改处理
"修改类别信息","修改基本信息","修改租阅信息"
Ø数据插入处理
"插入类别信息","插入基本信息","插入租阅信息"
Ø数据删除处理
"删除类别信息","删除基本信息","删除租阅信息"
Ø数据查询处理
"查询类别信息","查询基本信息","查询租阅信息","输出全部信息"
Ø数据统计处理
"统计类别信息","统计基本信息","统计租阅信息"
六、试验结果
1.数据文件处理
1.1创建
录入数据
1.2载入
2修改处理
修改图书基本信息
输入错误的处理:
选择修改项并输入修改信息:
修改结果:
3.插入处理
插入图书类别信息:
输入后按Enter,显示插入成功:
4.删除处理
删除图书租阅信息
输入错误的处理:
输入无误,显示“删除成功”:
5.查询处理
查询图书类别信息:
查询结果:
输出全部:
6.统计处理
统计总图书本数:
七、体会
第一次写这么大的一个程序,其中经历了诸多纠结痛苦,也尝到了调通程序而获得的快乐,学到了很多编程方面的知识,并提高了自己的编程能力。
刚开始听其他同学说这个程序有两千行代码要写,感觉头都大了,有一点畏惧心理,于是在暑假的时候就开始看书,照着书上的例题自己先编一些较小的程序,慢慢试着调试运行。
当已经没有例题可参考时,我就只能按照自己的思路来编写程序。
在编写的过程中,我遇到过一些麻烦。
知道自己的思路,但是要把思路具体到代码,有时候就不知道该用什么式子来实现它。
这时候就只能到处找资料或请教同学,通过查阅资料,和同学讨论,代码最终都写出来了。
但是在调试的过程中,就又是一大堆的错误。
这就让我充分体会到了细心和耐心的重要性,也就是在这个过程中,我了解了更多编程知识,也更知道该如何去调试程序了。
有时候只是一个小小的输入错误,都能引出一大堆的Warning和Error,还让你不知道该到哪里去找这个错误的源头。
像这样的错误,我犯过几次。
有一次,我把一个删除函数中的“:
”写成了“;”,结果运行的时候,出现3个Warning,26个Error,最后一个Error还说这个程序错误太多,不能一一列举,请仔细检查。
这个错误我找了好长时间都没找出来,最后还是我叫一个同学帮我找才找出来的。
这个错误一改正,整个程序就都可以运行了。
在运行的过程中也发现了很多逻辑错误,最后经过我一步步的单步调试,终于把它调通了。
当时高兴得简直快要跳起来了
这还只是写系统的内核部分,在写菜单程序时,我也纠结了好长时间。
检查内核部分是否正确的时候用的是简易菜单,不过那个太简陋,我决定用文本菜单。
图形菜单不是没考虑过,只是在看图形菜单参考程序的时候,我发现好多地方都没办法理解,好多函数都很陌生,而且那个点阵字符运用起来还比较麻烦,所以就放弃了。
在看文本菜单参考程序的时候,我也有一些地方看不懂,通过上网查资料,请教同学,并借助TC编译器边运行边理解,最终把大部分都弄懂了,然后根据自己系统的需要将参考程序进行了修改,通过调试,是这个系统能够正确运行。
通过这次大型作业,我对链表的知识了解得更透彻了,也提高了自己的编程能力,养成了自己的编程风格,也让自己以后在编程时更细心、更有耐心。
八、参考文献
1.C语言程序设计.曹计昌,卢萍,李开编著.科学出版社
2.TurboC使用大全第一册、第二册.徐金梧等编译.北京科海培训中心
九、附录(源代码):
#include
#include
#include
#include
char*Menu[]={"F文件","M修改","I插入","D删除","S查询","C统计"};
/*存放主菜单信息的字符数组*/
char*Menus[]={"载入","创建","保存","退出",
"修改类别信息","修改基本信息","修改租阅信息",
"插入类别信息","插入基本信息","插入租阅信息",
"删除类别信息","删除基本信息","删除租阅信息",
"查询类别信息","查询基本信息","查询租阅信息","输出全部信息",
"统计类别信息","统计基本信息","统计租阅信息",};
/*存放子菜信息单的字符数组*/
intMnN[]={4,3,3,3,4,3};/*存放每个菜单下面有多少个子菜单的数组*/
intMnLoc[][5]={{4,3,2,10,7},
{16,15,2,30,6},
{28,27,2,42,6},
{40,39,2,54,6},
{52,51,2,66,7},
{64,63,2,78,6}};/*存放主菜单起始位置和子菜单窗口位置数组*/
intMnm,Mns,flag;/*主菜单Mnm,子菜单Mns,由flag的值决定是否退出系统*/
charbuf[16*25*2],buf1[75*25*2];/*存放屏幕缓存区*/
typedefstructrent_info{/*定义图书租阅基本信息结构类型rent*/
chartype;/*类别*/
charnum[10];/*图书编号*/
charrenter_name[20];/*姓名*/
charID_card[19];/*身份证*/
charrent_date[11];/*租书日期*/
intrental_days;/*可租天数*/
charpreturn_date[11];/*应还日期*/
charreturn_date[11];/*归还日期*/
intoverlap_days;/*超期天数*/
doublerenewal_fee;/*续费*/
structrent_info*next;/*指向下一结点的自引用指针*/
}rent;
typedefstructbasic_info{/*定义图书基本信息结构类型basic*/
chartype;/*类别编号*/
charnum[10];/*图书编号*/
charname[30];/*图书名称*/
charauthor[20];/*作者*/
charpub_house[30];/*出版社*/
doublesell_price;/*售价*/
doublerent_price;/*租价*/
doublemem_price;/*会员价*/
intsup_num;/*库存数*/
charsh_date[11];/*上架日期*/
charsh_place[3]/*架位*/
rent*head_/*指向租阅信息链的头指针*/
structbasic_info*next;/*指向下一结点的自引用指针*/
}basic;
typedefstructbooktype_info{/*定义图书类别基本信息结构类型type*/
chartnum;/*类别编号*/
chartname[10];/*类别名称*/
doublerenewal_rate;/*续费率*/
doublediscount_rate;/*会员出租折扣率*/
basic*head_basic;/*指向基本信息链的头指针*/
structbooktype_info*next;/*指向下一结点的自引用指针*/
}type;
typedefstructrent_times{/*定义图书租阅次数结构类型rtimes*/
chartype;/*类别编号*/
charnum[10];/*图书编号*/
charname[30];/*图书名称*/
intk;/*租阅次数*/
structrent_times*next;/*指向下一结点的自引用指针*/
}rtimes;
voidShowMenuM(void);/*显示主菜单函数*/
voidSetMenuM(int);/*设置选中的主菜单函数*/
voidClrMenuM(int);/*清除已选中的主菜单函数*/
voidShowMenuS(int);/*显示选中主菜单的子菜单函数*/
voidHideMenuS(int);/*收回选中主菜单的子菜单函数*/
voidSetMenuS(int);/*设置子菜单函数*/
voidClrMenuS(int);/*清除子菜单函数*/
voidSelLR(int);/*选择左边或右边的主菜单函数*/
voidSelUD(int);/*选择上边或下边的子菜单函数*/
voidExeItem(int,int);/*执行相应函数的函数*/
voidScanKb(int*,int*);/*接受键入的键值函数*/
voidcreat_cross_list(type**head);/*创建十字交叉链表函数*/
voidsave(type*head);/*保存数据函数*/
voidload(type**head);/*载入数据函数*/
voidmodify_type(type*head);/*修改一级链表函数*/
voidmodify_basic(type*head);/*修改二级链表函数*/
voidmodify_rent(type*head);/*修改三级链表函数*/
voiddelet_type(type*head);/*删除一级链表函数*/
voiddelet_basic(type*head);/*删除二级链表函数*/
voiddelet_rent(type*head);/*删除三级链表函数*/
voidinsert_type(type*head);/*插一级链表函数*/
voidinsert_basic(type*head);/*插入二级链表函数*/
voidinsert_rent(type*head);/*插入三级链表函数*/
voidsearch_type(type*head);/*查询一级链表函数*/
voidsearch_basic(type*head);/*查询二级链表函数*/
voidsearch_rent(type*head);/*查询三级链表函数*/
voidtraverse(type*head);/*输出所有信息函数*/
voidcount_type(type*head);/*统计一级链表函数*/
voidcount_basic(type*head);/*统计二级链表函数*/
voidcount_rent_date(type*head);/*统计逾期未还图书并排序输出函数*/
intoverlap_days(char*s1,char*s2);/*计算超期天数函数*/
voidmain()
{
inti,key0,key1,idx;
s