完整版C语言毕业课程设计图书管理系统.docx
《完整版C语言毕业课程设计图书管理系统.docx》由会员分享,可在线阅读,更多相关《完整版C语言毕业课程设计图书管理系统.docx(22页珍藏版)》请在冰豆网上搜索。
完整版C语言毕业课程设计图书管理系统
课程报告
课程名称:
程序设计实践
专业班级:
计算机科学与技术1205班
学生姓名:
安龙龙
学号:
任课教师:
陈卫东
学期:
学年第二学期
课程报告任务书
题目
图书信息管理系统
主要
内容
开发一个图书信息管理系统,图书信息包括:
图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。
使之能提供以下基本功能:
(1)图书信息录入功能(图书信息用文件保存)--输入
(2)图书信息浏览功能--输出
(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
①按书名查询②按作者名查询
按照价钱排序
按出版时间排序等等
(4)图书信息的删除与修改
扩展功能:
可以按照自己的程度进行扩展。
比如
(1)简单的权限处理
(2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。
(4)模糊查询(5)综合查询(6)统计功能比如统计处某一类别的图书信息或筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。
任务
要求
一、提交材料应包括:
(1)系统源代码
(2)课程报告
二、整个设计过程具体要求
(1)需求分析要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
1需求分析
经过大一上学期的理论学习,在基础实验的基础上,本学期我们继续开设了C语言程序设计实践课。
课程要求我们对已经学习的基础实验进行整合与衔接处理,并最终形成一个系统性质的规模较大的程序。
本次课程设计要求我们达到能独立完成一个图书管理系统,完成后要求实现的功能有对图书信息的录入、删除、修改,浏览(即输出),按某种方式查询(要求至少一种查询方式),按某种方式排序(要求至少一种排序方式)。
当然,我们可以根据自己的能力对系统进行完善性的拓展,例如自己加入简单的权限处理,统计功能,模糊查询等,甚至可以拓展为图书借阅系统。
通过整个程序的开发过程,最终使我们掌握利用计算机解决实际问题的基本方法,熟悉C语言开发的全过程,提高综合应用C语言的能力、编程和调试能力,为学习计算机和通信专业的后续课程打好专业基础。
2概要设计
(1)图书信息及数据格式
图书信息:
图书信息包括图书编号、图书类别、图书书名、作者、出版社、出版时间、图书价格。
数据格式:
本系统采用单向链表来对图书信息进行各项操作。
其中图书的编号为整型数据,价格为双精度浮点型,其余的类别、书名、作者、出版社与出版时间均为字符串类型
structtushu_node{
intnum;
charleibie[20];
charname[30];
charauthor[20];
charpress[20];
chartime[20];
doubleprice;
structtushu_node*next;
};
一个结点的示意图如下图所示:
num
leibie
name
author
press
time
price
next
(2)程序的整体框架
(3)模块划分
1、intquanxian();核查权限的函数
2、intinputchioce();显示主菜单的函数
3、voidsave();保存链表为文件的函数覆盖以前的信息
4、voidsave1();保存链表为文件的函数不覆盖以前的信息只在创建时调用
5、structtushu_node*wjtolb();从文件中读取数据并建立图书信息的链表的函数
6、intluruxinxi();录入学生信息的函数
7、structtushu_node*luruxinxi_chuangjian();创建图书信息的函数
8、structtushu_node*luruxinxi_charu();插入图书信息的函数
9、structtushu_node*luruxinxi_shanchu();删除图书信息的函数
10、structtushu_node*luruxinxi_xiugai();修改图书信息的函数
11、intliulantushu();浏览图书信息的函数
12、intchaxuntushu();查询图书信息的函数
13、voidchaxuntushu_num();按编号查询图书
14、voidchaxuntushu_name();按书名查询图书
15、voidchaxuntushu_price();按价格查询图书
16、voidpaixutushu();为图书排序的函数
17、structtushu_node*paixutushu_price();为图书按价格排序的函数
18、structtushu_node*paixutushu_time();为图书按出版时间排序的函数
19、voidsfjx();写个函数判断是否继续排序中使用
20、inttongjitushu_shumu();统计图书数目的函数
21、voidshiyongshuoming();使用说明的函数
3详细设计
程序的主体设计思想是根据结构化程序设计思想分模块进行设计,有一个主函数和多个自定义函数构成。
主函数
对于本程序来说,主函数很简单,就是定义了一个变量chioce用来接受核查用户是否有使用该管理系统的权限的函数quanxian()函数返回的值,若为1(即用户获得了使用权限),则调出显示主菜单的函数进行具体操作
intmain()
{
intchioce;
chioce=quanxian();核查用户是否有使用该管理系统的权限的函数
if(chioce==1)若取得权限则返回值为1
{
system("cls");
inputchioce();用来显示主菜单的函数
}
exit(0);
}
权限函数
核查用户权限的函数使用do-while语句来限制用户输入密码的次数仅为三次,并且为了使界面更具亲切感,会在用户输入密码错误时进行提示引起用户注意及提示剩余输入次数。
intquanxian()
{
intm=1,n=3,flag=0;
charmima[20];
do{
printf("\n\n你好,欢迎使本图书信息管理系统!
\n");printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("【现在进行权限核查】\n友情提醒:
你共有3次输入密码的机会!
\n");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
if(n==2||n==1){printf("注意:
你已输入错误%d次剩余输入次数:
%d请输入密码:
",3-n,n);}
if(n==3)printf("剩余输入次数:
%d请输入密码:
",n);
scanf("%s",mima);第一次输入和输错密码后再次输入显示的也卖弄不同
if(strcmp(mima,"chenbo0916")==0)
{
flag=1;
returnflag;
}
m++;
n--;
system("cls");
}while(strcmp(mima,"chenbo0916")!
=0&&m<=3);限制输入次数在3次之内
printf("\n\n对不起,你连续三次输入密码错误,没有使用该图书管理系统的权限!
\n");
exit(0);
}
显示主菜单的函数
本程序将主菜单单独作为一个函数是为了让用户进入一次系统可以进行多项操作(即为在每次用户完成一个具体的操作后,都会有对是否继续或返回主菜单有相应的询问,让用户在想退出系统时才退出),基本思路是通过函数的嵌套调用来实现多项操作。
这个函数的功能就是显示主菜单并对用户进行的选择调用不同的子菜单函数或进入具体功能
intinputchioce()*主菜单*
{
intmychioce,x=-1;
printf("\n++++++++++++++欢迎你++++++++++++++++++\n\n");
printf("**+++++++++++++主菜单+++++++++++++++++++++**\n");
printf("**1--录入(删除修改)图书信息****2--(按规则)查询图书信息**\n");
printf("**3--浏览图书信息****4--为图书(按规则)排序**\n");
printf("**5--统计图书(数目)****6--帮助**\n");
printf("**0--退出系统******\n");printf("**++++++++++++++++++++++++++++++++++++++++++++++++++++++++**\n");
printf("\n恭喜你获得使用权限,请你选择:
");
scanf("%d",&mychioce);
switch(mychioce)
{
case1:
{luruxinxi();break;}
case2:
{chaxuntushu();break;}
case3:
{liulantushu();break;}
case4:
{paixutushu();break;}
case5:
{tongjitushu_shumu();
printf("\n\n是否继续操作?
请选择(继续-1退出-0)");
scanf("%d",&x);
if(x==1){system("cls");inputchioce();}
if(x==0){
printf("\n\n谢谢你的使用!
再见\n");
exit(0);
}
if(x!
=1&&x!
=0){
system("cls");
printf("选择有误,默认返回主菜单,请重新选择:
\n");
inputchioce();}
break;
}
case6:
{shiyongshuoming();break;}
case0:
{printf("\n\n谢谢你的使用!
!
再见\n\n");break;}
default:
{system("cls");
printf("\n选择有误,请重新选择:
\n");
inputchioce();
}break;
}
}
关于一些录入(删除修改)、查询、排序等子菜单的原理及实现方法与主菜单那类似
创建(插入)函数
算法如下图:
结束输入控制条件Num!
=0
将链表数据保存为文件的函数
首先打开文件以可读写(也可以只写的方式打开区别在于是否覆盖以前的信息)的方式,p1作为形参来接受实参head,只要不为空,写入p1后,下移一个节点
voidsave1(structtushu_node*p1){*将链表保存为文件的函数不覆盖前面信息*
if((fpp=fopen("1.txt","a"))==NULL)
{
printf("打开文件失败!
");
exit(0);
}
while(p1!
=NULL)
{
fprintf(fpp,"%d%s%s%s%s%s%lf\n",p1->num,p1->leibie,p1->
name,p1->author,p1->press,p1->time,p1->price);
p1=p1->next;
}
if(fclose(fpp))
{
printf("关闭文件失败!
\n");
exit(0);
}
}
从文件中读出数据并创建链表的函数
在调用从文件读取数据创建链表的函数前,先定义head链表指针并赋值为空作为实参。
打开文件后,从文件中读取一组数据赋给已经被动态分配内存的结点指针p
第一次head为空时
Head
p1
第二次以后head("1.txt","r"))==NULL)
{
printf("打开文件失败!
");
exit(0);}
else{
printf("\n\n编号类别书名作者出版社出版时间价格\n");
while(!
feof(fpp)){fscanf(fpp,"%d%s%s%s%s%s%lf",&num,leibie,name,autho
r,press,time,&price);printf("%d%s%s%s%s%s%lf\n",num,leibie,name,author,press,time,price);}
}
if(fclose(fpp))
{printf("关闭文件失败!
\n");
exit(0);
}
printf("\n\n是否继续操作?
请选择(继续-1退出-0)");
scanf("%d",&x);
if(x==1)
{system("cls");
inputchioce();}
if(x==0)
{printf("\n\n谢谢你的使用!
再见\n");
exit(0);}
if(x!
=1&&x!
=0)
{system("cls");
printf("选择有误,默认返回主菜单,请重新选择:
\n");
inputchioce();}
}
统计图书数目的函数
统计函数简单的实现了对图书数目的统计,其实现思路可以看做在浏览函数的基础上去掉一些不必要的输出而是另外加上一个变量n用在while中执行一次循环就n++一次,就能统计出图书的数目了,不再具体叙述。
由于feof()函数本身的原理,如果每次写入一行数据到文件中时最后有换行符号,则会出现n多加一问题或输出时最后一行复制,只要将n减一即为图书实际上的数目。
查询函数
查询函数算法如下图所示:
P!
=NULL
不相等
相等
如果found依然为0,则输出“未找到某图书”
是否
排序函数
排序函数算法叙述如下:
排序函数使用冒泡排序的算法,定义了ij两个变量来控制实现双层循环,for(i=1;i内循环:
初始化状态为
P4P4->next
辅助P3p1p2
比较p1与p2的排序项,如p1比p2小,上图所有指针的指针均后移一位
相反,若上图中p1比p2大,则变为
P3P3->next
P2->nextp1p2
简单的说———始终是p1与p2比较,其中一个为前一次比较中的的大的一个,另一个向后移动
内循环源程序
p4=(structtushu_node*)malloc(size);
p4->next=-i;j++)
{
if(p2->price>p1->price)
{
p3=p1;
p1=p2;
p2=p2->next;
}
else
{
p1->next=NULL;
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next;
}
}
\n是否继续操作?
请选择(继续-1退出-0)");
scanf("%d",&x);
if(x==1)
{
system("cls");
inputchioce();
}
if(x==0)
{
printf("\n\n谢谢你的使用!
再见\n");
exit(0);
}
if(x!
=1&&x!
=0)
{
system("cls");
printf("选择有误,默认返回主菜单,请重新选择:
\n");
inputchioce();
}
实现了每次操作完成后,使只显示主菜单可继续进行其他操作
问题二权限系统以前是输入学号后三位(int)进行验证并且只有一次输入机会,一次输入错误就退出系统
解决方法在权限函数中使用字符串变量(char)来作为密码,使用do-while语句来实现对输入次数的控制
问题三录入时以前的思路是想在输入的同时写入文件只有一组数据想存入文件
解决方法将保存文件作为一个独立的函数。
在创建函数中有一组另外的参数来接收用户输入的数据,然后再调用保存函数将数据存入文件
问题四文件的保存与读取问题
解决方法由于系统要求结合文件的知识使用户的数据在一次输入之后即使关闭退出系统后在次进入系统时原有数据依然能继续使用。
并且在对数据进行创建、删除、修改、排序等相关的操作之后要重新保存,所以将将链表保存到文件和从文件读取数据建立链表都重新写作单独的函数,在进行完相关的操作后都调用save()重新保存,在再次进行操作前就先调用wjtolb()函数从文件中读取数据创建链表,实现了对数据更及时的保存与利用
问题五保存数据时覆盖不覆盖原有数据的问题
解决问题由于以前没有注意细节问题导致虽然数据被修改或是删除后保存成功,但数据不覆盖原来的数据从而出现文件中数据重复保存的问题,解决方法很简单,只要将打开文件的方式由可读可写(a)改为只写方式打开(w)就行
问题六 输入时无法结束输入的问题
解决方法 由于在输入时时先输入图书的编号,所以在输入时除了输入第一本图书的信息,
即在输入第一本图书之后在输入时先输入图书的编号,加上一个判断循环while(num!
=0)才继续输入完这本图书的其他信息,即0可以作为输入结束标志
问题七程序漏洞,只有第二本图书信息无法修改的问题
解决方法程序设计思路有问题及对do-while语句了解不充分导致了问题。
修改函数的思路是先让用户先输入要修改的图书编号再依次查询,先看头结点的图书编号与要修改的编号是否相等,如果相等继续选择要修改的图书信息成分修改,如果不相等,有个循环语句来使结点后移只带相等再选择要修改的图书信息成分修改。
有问题的写法是使用了
do{
p=p->next;
}while(p!
=NULL&&p->num!
=numm)
从而导致了如果要修改的图书不是第一本而是第二本时,先执行了后移一个结点直接到第三个结点即无法修改第二本图书的信息。
解决后是用while循环
while(p!
=NULL&&p->num!
=numm)
{
p=p->next;
}
就不存在上述问题
问题八要对图书的信息进行删除后修改前必须先浏览图书不然不知道要选择哪本图书进行操作的问题
解决方法由于上述修改与删除的操作是通过用户对图书编号的选择来完成的所以在浏览前不知道图书对于的编号就使操作具有盲目性即对图书的信息进行删除后修改前必须先浏览图书。
解决时时让修改于删除函数中让用户输入编号前默认直接输出所有图书(遍历所有图书)
5测试结果
编号类别书名作者出版社出版时间价格
4传记让世界因你而不同李开复北京工业出版社2008.328.000000
2英语四级词汇俞敏洪群言出版社2008.932.000000
5漫画我兔斯基你王卯卯动漫出版社2009.332.000000
3营销哈佛市场营销策略宋海峰内蒙古出版社2010.428.000000
1杂志电脑爱好者无cfan杂志社2010.96.000000
6教材思修罗国杰高等教育出版社2006.815.50
7教材大学英语王大伟外研社2005.134.9
8教材高等数学蒋青高等教育出版社2007.625.9
现在给出一组测试数据来全程展示本图书管理系统的所有功能
功能一之核查用户权限:
首先进入系统,你会发现要求对用户使用权限进行核查的界面:
(效果图如下)
若密码为错误密码,那么你会看到提醒“注意”的界面
上图密码正确,则仍然可以顺利进入系统见到主菜单如下图
若三次输入错误将无法进入系统
功能二之浏览全部图书:
在主菜单界面选择3则可遍历现有全部图书信息
功能三之创建或添加图书:
选择1后进入录入(删除修改)子菜单
继续选择1进入创建添加图书功能以0结束输入
结束后自动返回主菜单再次选择3(浏览)可查看添加效果(浏览时刚才上图添加的图书信息“9ITFLASH8尹浩琼电子工业出版社2006.941”显示在最后一行说明程序已经实现了添加功能)
功能四之为图书按规则排序:
选择4后进入排序子菜单进一步选择按何种规则排序(报告只演示按出版时间排序)
当选择2—按出版时间排序然后回车键你会看到
选1继续返回浏览看到图书已经按出版时间的先后排序完成
功能五之按规则查询图书:
同排序一样你可以在子菜单选择按何种方式查询(报告只演示按书名查询)
选择按书名查询后你可以输入书名
查询图书《当代大学生》的结果是“没有找到这本书”
选择1继续按书名查找其他图书
查找到图书《让世界因你而不同》时,这本图书的信息将被全部输出,如图:
功能六之修改已有图书信息:
从录入子菜单1进入后选择3可以进入修改功能首先你会看到目前文件中所有图书的信息方便你选择要修改哪本图书
上图选择了修改编号为1的图书现在编号为1的图书的信息单独显示出来你可以再次根据提示界面选择修改图书1的哪一项成分
我们看到图书1的作者为“无”决定将它改为“陈波”(如下图)
完成后可以利用浏览函数同样可以查看到修改后的效果
修改成功
功能七之按编号删除某本图书:
选择要删除图书的编号前你也会看到目前所有图书的信息
现在选择删除编号为8的