用C语言进行商品信息管理系统设计.docx
《用C语言进行商品信息管理系统设计.docx》由会员分享,可在线阅读,更多相关《用C语言进行商品信息管理系统设计.docx(26页珍藏版)》请在冰豆网上搜索。
用C语言进行商品信息管理系统设计
《C语言程序设计》
课程设计报告
专业:
电子信息工程(本)
班级:
0902
姓名:
学号:
指导教师:
二0一0年十二月二十九日
一.商品信息管理系统设计的目的…………………………………03
二。
商品信息管理系统设计题目描述和要求………………………04
三。
商品信息管理系统设计报告内容………………………………04
3。
1需求分析……………………………………………04
3.2概要设计……………………………………………04
3.3详细设计……………………………………………05
3.4编写代码……………………………………………06
3.5程序分析……………………………………………11
四.总结…………………………………………………………11
五.参考书目……………………………………………………12
六.附源程序……………………………………………………13
二、设计目的
1、熟练掌握C语言课程中所学的理论知识;
通过课程设计让我们对掌握的C语言的理论知识更加熟练,加深对C语言
的各种数据类型的理解,以及在编程中对各种数据类型,运算符和表达示
的运用,更加熟练掌握运用不同的结构类型如顺序结构、选择结构、循环结
构,同时掌握数组、结构体在编程中的运用的优点。
2、通过综合C语言的基本知识来解决实际问题;
对理论知识有了一定的掌握后,要求我们能做到理论与实践相结合,通过综合C语言的基本知识来解决实际问题,这次的课程设计就是我们理论联系实际的案例,要求我们编写一个商品信息管理系统,方便对商品的各类指标进行存储,查询,为商店的管理带来方便,是我们对解决实际问题的一次尝试.
3、加强分析和解决问题的能力。
通过课程设计,加强我们对实际问题的分析能力,让我们在学习过程中的一些想法得到检验,可以让我们的思维在辩证中提高,最重要的是可以分析我们过往的不足,对于以后遇到类似问题可以更加快速、完善的解决,同时让我们积累了一定的经验,为今后的发展奠定了基础。
二.程序设计题目描述和要求
设计对n种商品进行管理的商品信息管理系统,商品信息管理系统是为了商品信息管理的方便而做的一套商品信息管理系统.本管理系统只有获得权限的用户才可以管理商品信息,否则不可以进行操作,提高了管理系统的安全性。
获得权限的用户可以进行商品信息修改、商品信息删除、商品信息查询、计算总价格和平均价格的基本操作,还可以轻而易举得到统计信息,即商品编号,商品名称,出厂日期,商品价格。
充分展示了一个商品信息管理系统所带来的方便。
(可是本系统不支持商品信息永久保留的功能)
系统功能包括:
1、系统以菜单方式工作,密码登陆。
2、商品信息的录入功能(增加数据)。
用数组数据类型赋初值的方法把商品信息送到各个数组中(但注意要是合法数据),然后把它们输出显示。
3、商品信息的删除(删除数据)。
任意输入一个商品的编号,将它所有的信息从组数中删除。
4、商品信息的浏览功能(查找数据)。
任意输入一个商品的编号,打印出他的所有数据。
要求能多次查找。
5、商品信息的删除(修改数据).任意输入一个商品的编号,打印出所有相关信息后,可对某一项信息进行修改并保存。
6、商品信息的计算并排序.计算所有商品的总价格及平均价格(aver,单精度,输出一位小数),将包括所有数据的数组元素按价格从低到高的顺序排序打印出来。
三.程序设计报告内容
3。
1需求分析:
题目要求设计的系统满足如下一些要求:
菜单方式工作;添加商品信息;删除指定商品信息;修改指定商品信息;浏览指定商品的信息;计算所有商品的总价格和平均价格;
对于排序,根据题目的要求和自身设计的需求,本程序按照每种商品的价格从低到高的方式进行排序。
3。
2概要设计:
本系统分为以下几个模块来实现其功能:
密码登陆验证模块,为单独设计函数,放在主体main函数中;
任务选择主菜单模块,包括:
增加商品信息模块,删除商品信息模块,查找商品信息模块,修改商品信息模块,计算商品总价格及商品平均价格模块,退出系统模块;以上各模块除退出系统直接调用系统exit函数外,其它模块均单独放在一个函数里;分支选择利用的是switch语句。
增加商品信息模块所用的函数接口为ADD,无参数调用;
删除商品信息模块所用的函数接口为DELETEC【防止和系统的DELETE函数冲突】,无参数调用;
查找商品信息模块的函数接口为FIND,无参数调用;
修改商品信息模块的函数接口为MODIFY,无参数调用;
计算商品平均价格和总价格的函数为AVER,无参数调用;
主菜单功能选择模块函数接口为choose,无参数调用。
系统使用的数据结构为结构体链表.结构体成员包括结构体成员变量和结构体方法,成员变量包括:
Number,商品编号;name,商品名称;date,商品的出场日期;factory,制造商的名字;price,商品的价格;next结构体指针,指向链表的下一个节点;pre结构体指针,指向链表的上一个节点。
结构体成员列表包括:
Course,构造函数;output,输出当前节点的信息,也就是商品的信息。
链表有一个头节点:
start,一个链表尾节点:
cur,添加商品信息通过操作尾节点cur实现;删除商品信息,查找商品信息和修改商品信息都从start节点开始操作。
本系统预设密码为“12345",不提供密码修改功能.
3。
3详细设计:
Main函数:
case1:
ADD();break;增加商品
case2:
DELETEC();break;删除商品
case3:
FIND();break;查找商品
case4:
MODIFY();break;修改商品信息
case5:
AVER();break;总价格和平均价格
case6:
sortSeq;break;按照商品价格排序
case7:
SORT();break;
算法:
本系统的密码登陆及验证模块,为单独设计的函数,放在主体main函数中.因此主体main函数包括了使系统通过密码登陆(本程序通过调试和实际的操作反馈出,密码登录次数在程序的设计过程中没有做出限制,可以说是设计的一个缺陷)。
伪代码如下:
while(密码不匹配)
重新输入密码
endwhile
while(用户输入选择)
if(选择增加商品信息)
ADD();
elseif(删除指定商品信息)
DELETEC();
elseif(修改指定商品信息)
MODIFY();
elseif(查找指定商品信息)
FIND();
Elseif(计算总价格和平均价格)
AVER();
Elseif(退出系统)
exit();
endwhile
**********************************************
添加商品信息伪代码如下:
ADD:
while(继续添加)
(“输入添加商品的信息”)
New(是一个新的节点,存储添加的商品信息)
Endwhile
(“返回主菜单”)
EndADD
**********************************************
删除商品信息伪代码如下:
DELETEC:
while(继续删除)
输入删除的商品编号
for(链表上的节点)
if(当前节点的编号==待删除节点编号)
删除当前节点,更改前后节点的next和pre指针指向
标记找到节点
elsethen继续遍历
endfor
if(假如没有找到)
输出提示信息
elsethen
输出删除成功
endwhile
返回主菜单
endDELETEC
**********************************************
查找商品信息伪代码如下:
FIND:
while(继续查找)
输入查找的商品编号
for(链表上的节点)
if(当前节点的编号==等待查找的节点编号)
调用当前节点输出函数output,打印节点信息
标记找到节点
elsethen继续遍历
endfor
if(假如没有找到)
输出提示信息
endwhile
返回主菜单
endFIND
**********************************************
修改商品信息伪代码如下:
MODIFY:
while(继续修改)
输入修改的商品编号
for(链表上的节点)
if(当前节点的编号==待修改节点编号)
输入新的商品信息
标记找到节点
elsethen继续遍历
endfor
if(假如没有找到)
输出提示信息
elsethen
提示修改成功
endwhile
返回主菜单
endMODIFY
**********************************************
计算总价格和平均价格伪代码如下:
AVER:
初始化总学分sum为0
for(未到达末尾节点)
将节点学分累加,保存到sum变量中
同时累计节点个数
endfor
打印并输出总价格和平均价格
endAVER
**********************************************
选择函数伪代码如下:
choose:
打印主菜单,并提示输入命令编号
然后系统执行指定命令
endchoose
程序流程图如下:
输入
查询
删除
修改
计算
结束程序
输入密码界面
主菜单
输入数据
完毕
输入的数据
输入的数据
输入的数据
输入的数据
完毕
完毕
完毕
选择功能
计算总价格
平均价格
价
格
返回主菜单
3。
4编写代码
作为小组长除了参与主函数的设计外,我在小组内主要负责的模块是,商品信息输出和俺照价格(从低到高的顺序)进行排序两个模块.
1、个体任务模块的源代码如下:
商品信息输入:
Commodity*cur=NULL,*start=NULL;
Commodity*tp_Pre=NULL;
voidADD()
{
intlabel;//商品编号
charname[50];//商品名称
intelec;
intsco;//学分
puts(”输入添加的商品信息,按照如下格式:
编号名称出场年月价格");
puts(”返回主菜单输入—1”);
while(true)
{
scanf(”%d”,&label);
if(—1==label)break;
scanf("%s%d%d",name,
&elec,&sco);
cur=newCommodity(label,name,elec,sco);
if(NULL==start)start=cur;
if(NULL==tp_Pre)tp_Pre=cur;
else
{
cur—>pre=tp_Pre;
tp_Pre->next=cur;
tp_Pre=cur;
}
puts("添加成功,您添加的信息如下:
”);
cur->output();////////////////////////////////
cur=cur->next;
}
system("cls");
}
按照商品价格排序:
sortSeq[MAX];//结构体数组,用于排序用
intMyCMP(constvoid*a,constvoid*b)
{
structCommodity*aa=(Commodity*)a;
structCommodity*bb=(Commodity*)b;
returnaa—〉price-bb->price;
}
Commodity*cur=NULL,*start=NULL;
Commodity*tp_Pre=NULL;
2、具体负责模块的功能的设计与实现
a、商品信息输入模块:
voidADD(){intlabel;//商品编号charname[50];//商品名称intelec;intsco;//学分puts("输入添加的商品信息,按照如下格式:
编号名称出场年月价格");puts(”返回主菜单输入-1");while(true){scanf("%d”,&label);//输入添加的商品编号if(—1==label)break;//假如输入-1,表示退出scanf("%s%d%d”,name,&elec,&sco);//否则,继续输入剩余信息cur=newCommodity(label,name,elec,sco);//构造一个新节点,存储新加商品的信息if(NULL==start)start=cur;//假如是第一件商品,那么讲链表头结点指向他if(NULL==tp_Pre)tp_Pre=cur;//同上,将当前指针指向第一个节点else//否则,更改节点指向关系{cur-〉pre=tp_Pre;tp_Pre—>next=cur;tp_Pre=cur;}puts(”添加成功,您添加的信息如下:
");cur—>output();//输出新加商品的信息,用于确认录入的正确性cur=cur->next;//当前指针移向下一个节点位置}system("cls");}
b、按照价格排序模块:
voidSORT()//排序函数{Commodity*tp=start;//构造一个临时结构指针,获取链表头指针doubleaver=0;//存储节点价格的平均值intcnt=0;//计数商品个数while(NULL!
=tp)//从链表头结点开始遍历,获取每个节点,存到//结构数组sortSeq中,便于下面调用系统的快速排序函数,因为链表不支持排序{sortSeq[cnt++]=*tp;tp=tp—>next;}//调用系统的快速排序函数对结构数组按照价格关键字进行排序qsort(sortSeq,cnt,sizeof(Commodity),MyCMP);inti;//将排好序的结构数组按照排序规则:
价格从小到大挨个输出for(i=0;i〈cnt;++i)sortSeq[i].output();}
3.5程序分析
首先在和各成员完成自己的模块后,我们进行了系统的集成和调试。
在此过程中我们也遇到了很多的问题,不过在老师和同学的帮助下都基本上解决了.
1、本系统采用以菜单工作方式,并采用密码登陆(程序不提供密码修改功能,且不限制密码输入的次数)。
2、商品信息的录入功能(输入数据,因为系统内没有自带商品信息,这一步是首先操作的,否则其他功能不能实现)。
用数组数据类型赋初值的方法把商品信息送到各个数组中(但是注意必须是合法数据),然后系统会自动将它们输出并显示.
3、商品信息的删除(删除数据)。
任意输入一个商品的编号,将它所有的信息从组数中删除并显示“删除成功”,如果没有此数据,系统会输出“”未找到指定商品。
4、商品信息的浏览功能(查找数据)。
任意输入一个商品的编号,打印出他的所有数据。
本系统能进行多次查找,如果没有此编号,系统会输出“未找到指定商品”。
5、商品信息的修改(修改数据)。
任意输入一个商品的编号,系统会自动打印出所选商品的所有相关信息,可对某一项信息进行修改并保存,系统会输出“输入新的商品信息,系统将会自动覆盖原有信息:
”,如果没有此商品,系统会输出“”未找到指定商品。
。
6、商品信息的计算并排序。
计算所有商品的总价格及平均价格(aver,单精度,输出一位小数),将包括所有数据的数组元素按价格从低到高的顺序排序打印出来。
7、本系统输入0键,可以退出程序。
四.总结与心得体会
通过一周的程序设计实践,感慨颇多,尤其是同学之间的合作和互助精神让我极为感动。
商品信息管理程序设计,在我们六人密切合作及同学老师的帮忙下花了整整一周的时间才得以完成。
这是我入大学以来第一次感觉整个过程我有学到东西,当调试到最后一个错误时那种胜利的喜悦让我无法用言语表达,那是一种强烈的成就感。
当然,在整个设计过程中,我付出了很多,也懂得了只有付出才有回报。
同样在这次设计中,我遇到了很多困难,但我没有向困难低头,通过查询资料,自学结构体知识,虚心向同学、老师请教,积极参与讨论,问题都一一得到了解决。
我发现平时学的太少了,在今后我首先要把老师在课堂讲的弄懂,弄透,在此基础上利用课余时间多看课外书籍,拓宽知识面。
同样在设计过程中,合作精神必不可少。
单凭一个人的力量是不能完成的,毕竟一个人学的很有限。
每个人掌握的不同.态度决定一切,只有努力才有收获。
程序设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题的重要环节,是对学生实际工作能力的具体训练和考察过程.科学技术的发展日新月异,当今计算机应用在生活中可以说是无处不在。
因此作为二十一世纪的大学来说掌握计算机软件开发技术十分重要.最鲜明的例子就是charpass[MAX];这个我刚开始写成了char*pass,没有进行内存申请下面就直接使用,所以报错,这个问题本来是可以避免的。
可见细心是多么的重要
的确,回顾起此次程序设计,自从拿到题目到完成整个程序设计,不仅巩固了以前所学过的知识,通过这次程序设计使我们懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过这次程序设计我总结了关于软件开发要具有一下素质:
1.很强的团队精神和协作能力2.此外编程是一项高精度的工作所以我们要有规范化,标准化的代码编写习惯
3。
通过这次编程我们深深的感受到对函数的变量命名,输入格式.良好的编写习惯,不但有助于函数的移植和纠错,也有助于不同人员之间的协作。
4。
我们要有有错就改和虚心接受别人的意见的诚恳态度。
程序设计像做数学题,只要你的结果没错无论你的方法是什么都可以。
每个人思考题目的方式都不同,一个问题要达到某种结果可以通过多种途径与方法,别人的方法也有你借鉴的价值。
5。
我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,
6。
善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高.
生活就是这样,汗水见证了获。
通过实际动手做,我们才真正领略到“苦奋斗”一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。
对我们而言,知识上的收获重要,精神上的满足同样是难得的。
挫折是一份财富,经历是一份拥有。
这次实际操作必将成为我们人生旅途上一个非常美好的回忆!
最后我想说的是,不论我们做什么事,只要用心去做,就一定会做得很好,不要认为自己做不好,关键是要保持那份去努力的精神!
五、参考书目
1、谭浩强,《C语言程序设计教程》,北京,清华大学出版社,2009年
2、谭浩强,《C语言课程设计》,北京,清华大学出版社,2009年
3、谭浩强,张基温,唐永炎编著《C语言程序设计》北京:
高等教育出版社。
6、附录—-源程序
constintMAX=100;//默认最多存储MAX件商品
structCommodity
{
public:
//结构体里的成员和方法是公有的,在任何地方都能访问
intlabel;//商品编号
charname[50];//商品名称
intelective;//出厂年月
intprice;//价格
Commodity*pre;//前驱指针节点,链表的节点指针
Commodity*next;//后继指针节点,把一个个的节点连接起来
Commodity(intlab,charnam[],intelect,intscor)
{
label=lab;
strcpy(name,nam);
elective=elect;
price=scor;
next=NULL;
pre=NULL;
}
Commodity(){}//因为有数组,重载一个无参构造函数
voidoutput()
{
printf(”商品编号:
\t%d\n",label);
printf("商品名称:
\t%s\n",name);
printf(”出厂年月:
\t%d\n",elective);
printf("商品价格:
\t%d\n",price);
puts("——-———-—--—-——--——-----—--—”);
}
}
sortSeq[MAX];//结构体数组,用于排序用
intMyCMP(constvoid*a,constvoid*b)
{
structCommodity*aa=(Commodity*)a;
structCommodity*bb=(Commodity*)b;
returnaa->price-bb-〉price;
}
Commodity*cur=NULL,*start=NULL;
Commodity*tp_Pre=NULL;
voidADD()
{
intlabel;//商品编号
charname[50];//商品名称
intelec;
intsco;//学分
puts(”输入添加的商品信息,按照如下格式:
编号名称出场年月价格");
puts("返回主菜单输入-1");
while(true)
{
scanf(”%d",&label);
if(—1==label)break;
scanf("%s%d%d”,name,
&elec,&sco);
cur=newCommodity(label,name,elec,sco);
if(NULL==start)start=cur;
if(NULL==tp_Pre)tp_Pre=cur;
else
{
cur-〉pre=tp_Pre;
tp_Pre—〉next=cur;
tp_Pre=cur;
}
puts(”添加成功,您添加的信息如下:
”);
cur—>output();////////////////////////////////
cur=cur->next;
}
system("