课程设计报告课程名称《C语言程序设计》课题超市库存货品信息管理系统系别机电工程系专业班级计控1101学生姓名孙方瑞学号11306013指导老师顾建华任务书下达日期2013年1月7日任务完成日期2013年1月11日课程设计目的和要求1、目的:a)巩固和加深学生对C语言课程的基本知识的理解和掌握;b)掌握C语言编程和程序调试的基本技能;c)利用C语言进行基本的软件设计;d)掌握书写程序设计说明文档的能力;e)提高运用C语言解决实际问题的能力。2、要求:a)课程设计期间,同学之间可以讨论算法的实现和编程的思路和方法,但每个人必须自己动手编写程序,不得抄袭;b)写出详细设计说明(程序实现的基本算法思想及流程图);c)编写程序代码,调试程序使其能正确运行;d)设计完成后提交课程设计报告;(对于程序中未能实现的部分需要加以解释说明;对于程序中所参考的部分代码需要加以声明,并说明出处。)目录一,问题定义………………………………………..1.1问题背景…………………………………….1.2用户目标……………………………………二,概要设计………………………………………2.1方案确定…………………………………….2.2软件结构……………………………………2.3模块功能说明………………………………三,详细设计………………………………………3.1数据设计…………………………………..3.2流程图…………………………………….四,编码………………………………………….4.1各功能模块编码………………………….4.2主程序编码………………………………五,调试分析…………………………………..六,总结………………………………………..C语言课程设计内容:课题:超市库存货品信息管理系统设计一,问题定义1.1问题背景对于超市库存货品信息管理系统,其数据不仅复杂,量大而且还经常变化,要是采用传统的手工方式采集,不仅工作效率低,容易出错,而且管理也不够规范。由于计算机技术在管理应用领域中的开展,开发此数据库管理系统是十分必要的,并且具有可行性。当然目前超市的数据库系统不是采用C语言,而是采用一些数据库语言开发的,但为了说明C语言也同样可编写数据库软件,故本系统选用C语言作为开发工具。1.2用户目标由计算机来完成超市库存货品信息的管理,要求实现如下功能:建立超市库存货品表列,且可对此表列进行输出,插入,删除,查找,修改,保存等操作。二,概要设计2.1方案确定超市库存货品信息管理系统要求实现许多功能,可遵循前面所学的结构化程序设计思想来进行本系统的设计-----自顶向下,逐步细化,也就是将系统软件设计任务分成许多容易解决的小的任务,即分解出许多子功能模块进行设计。2.2软件结构本实例中超市库存货品信息管理系统的软件结构如图所示2.3模块功能说明对本系统的功能进行分析后可作如下的模块化设计输入模块实现功能:能把用户逐一输入的数据添加进表中。载入模块实现功能:能把磁盘上数据文件载入表中。输出模块实现功能:能逐一把数据按指定格式输出到屏幕。查找模块实现功能:能搜索到符合用户指定条件的数据,并将数据输出到屏幕。插入模块实现功能:能把用户再次输入的数据插入表中。删除模块实现功能:能把符合用户指定条件的数据从表中删除。修改模块实现功能:能让用户修改制定的表中数据。排序模块实现功能:能按照指定的关键字进行排序。保存模块实现功能:能将数据保存为文件形式,长期保存。主程序模块实现功能:完成主菜单的显示,及对各模块的调用。三,详细设计3.1数据设计1数据结构的选择a,对于各个超市,其规模各不相同,在建立某个超市库存货品的目录时无法预知期货品品种的多少,那么在用数组完成这一设计时,由于数组是在编译时分配内存的,所以其分配的空间大小是不可改变的,当数组的空间定义过小而货品种类很多时,就可能会出现数组很快用完的情况,使得数据量难以扩充,从而就主程序模块输入模块载入模块输出模块查找模块插入模块删除模块修改模块排序模块保存模块限制了程序的应用能力;若数组的空间定义过大而当下又未被使用时,势必又会造成内存浪费。b,对于某一个固定的超市,它每天需要进行的货品品种可能不同,因而一定会有新旧货品需要进行增加或删除。在有数组完成数据设计时,在数组中插入,删除一个元素需要移动数组中的大量数据元素,因此操作费时费事。2数据类型的选择由于本系统是完成本系统超市货品信息系统,货品数据有多个数据项,采用前面学习的结构体类型是最合适不过的。因为一个结构体可包含若干成员,而这些成员可以是数值类型,字符类型,数组类型,指针类型等,因此本系统在数据类型选择上选取结构体类型。设计如下:Typedefstructgoods_stype{intnum;/*货品号*/charname[20];/*货品名*/intamount;/*货品量*/}GOODS;3.2流程图1,输入模块输入模块实际上是完成一个用来存储超市货品信息的结构体类型数组的建立。假设要求如表中的3个货品建立一个表,那么要建立数组来存储货品信息其算法流程图如下。表1–3个货品信息单列表货品号货品名:货品数量(单位)10001童袜125(双)10201童鞋230(双)20100童装180(套)输入模块流程图:2,载入模块载入模块将已存入文件中的货品数据信息导出,创建成数组,之后可进行数组的插入,删除,修改,查找,排序等操作。载入模块算法描述的流程图如下:i=0n=0开始输入numwhile(num!=-1)输入name,amountn++i++返回n值结束YN载入模块流程图3,输出模块就是依次输出数组中各货品元素,这个问题比较容易处理。输出数组中第一个元素直至最后一个元素即可。输出模块算法描述的流程图如下:开始打开文件是否成功?i=0读入numnameAmounti++While(!Feof(fp))返回i值结束输出未找到文件返回0NYNY输出模块流程图4,查找模块查找模块是指在已知数组中查找值为某指定值的货品元素,查找过程是从数组的第一个元素开始,顺序查找,当发现有指定值得货品元素时,输出查找结果,或查找至数组最后一个元素都没被发现有指定值得货品元素,输出“未找到”,表示数组中每有指定值得货品。查找是常用的一种操作,它常与插入,删除,修改等操作配合使用。本系统在设计时采用两种查找依据,即可以按“货品号”或“货品名”来分别查找某货品,而在插入模块,删除模块,修改模块和排序模块中,处理方法是相同的,有两种依据。查找模块算法描述的流程图如下:开始i=0i=n-1输出numNameamounti++结束NY查找模块流程图5,插入模块插入模块要完成的是货品表的插入操作,即将一个新货品信息插入到一个已有存储货品信息的数组中。假设对刚刚建立的数组,现有一个新货品(货品号:10301,货品名:童帽,数量:300个)要求插入其中,并要求插入到数组中货品号为“10201”之前,如何完成?首先新设一个结构体变量ins_goods,输入预插入货品信息,即新货品有关数据,接下来在数组中查找货品号为“10201”的货品,找到后只需移动此货品元素及其之后的所有数组元素即可,数组中的此货品元素及其以后的元素要依次向后移动,虽然效率不高但实现起来简单方便。插入模块也可以设计成插入某货品之后,读者可自己设计。插入模块算法描述的流程图如下开始i=n-1i=0&&goodlist[i].num!=search-numi--returni结束NY插入模块流程图6,删除模块删除模块要完成的是货品的删除操作,此操作也容易,只需删开始输入出入位置(货品号)调用查询模块(货品号查询)k!=-1输入插入货品信息j=*len-1j=kGoodlist[j+1]=goodlist[j]j--*len++Goodlist[k]=ins_goods结束输出无效的插入位置NYNY除数组中指定货品即可。接上例,假设现又要求在刚完成插入操作的数组中再删除一个货品,货品号为“10201”。在数组中查找货品号为“10201”的货品,找到后只需要移动此货品元素之后的所有数组元素即可,数组中的此货品元素之后的元素要依次向前移动。删除模块算法的流程图如下:删除模块的流程图7,修改模块开始输入删除位置(货品号调用查询模块(按货品号查询k!=-1j=k+1J=*len-1Goodlist[j-1]=goodlist[k]j++*len--结束输出无效的删除位置NYNY修改模块是指可对已有货品信息进行修改,修改时应先查找到此货品,然后对其修改。修改模块算法描述的流程图如下修改模块的流程图8,排序模块排序模块是指对已有货品表可按某一个指定(货品名,货品号)开始输入要修改货品(货品号)调用查询模块(按货品号查询)k!=-1输入货品新信息goodlist[k].numgoodlist[k].namegoodlist[k].amount结束输出无此货品NY对货品进行排序,排序算法可选择已学过的算法进行。排序模块算法描述的流程图如下;排序模块流程图开始i=oin-1k=ij=i+1jnglist[k].numglist[j].nummk=jj++i!=kglist[k]=glist[i]i++结束NYNYNYNY9,保存模块保存模块是将最终想要保留的货品数据信息保存于文件中。保存模块酸发描述的流程图如下:保存模块流程图开始文件创建是否成功?i=0in将数组中数据依次写入文件i++结束输出创建文件失败NYNY四,编码编码是将概要设计和详细设计阶段中的结果翻译成程序设计语言书写的程序。首先是各功能模块的编码,最后完成主程序的编码。4.1各功能模块编码1输入模块编码/*录入模块*/intinput(GOODSglist[]){inti=0,n=0;printf(请依次按提示输入货品信息\n);printf(输入货品号(货品号-1结束输入):);scanf(%d,&glist[i].num);while(glist[i].num!=-1)/*当读入货品号不为-1时,循环读入数据*/{printf(输入货品名:);scanf(%s,glist[i].name);printf(输入货品量:);scanf(%d,&glist[i].amount);i++;n++;printf(输入货品号(货品号为-1结束输入):);scanf(%1d,&glist[i].num);}returnn;/*返回读入货品的个数*/}2载入模块编码/*载入模块*/intopenfile(GOODSglist[]){inti=0;FILE*fp2;fp2=fopen(d:\\货品信息原始表.txt,r);/*打开D盘货品信息原始表.txt文件*/if(fp2==NULL)/*返回空指针表示文件未正确打开*/{printf(未找到文件\n);return0;}else{while(!feof(fp2))/*当文件未读完成,执行循环*/{fscanf(fp2,%d%s%d,&glist[i].num,glist[i].name,&glist[i].amount);i++;}fclose(fp2);/*关闭文件*/printf(载入数据成功\n);returni;/*返回从文件中读取货品的个数*/getch();}}3输出模块编码/*输出模块*/intoutput(GOODSglist[],intn){inti;printf(--------------\n);printf(超市货品信息表\n);printf(--------------\n);printf(货品号货品名货品量\n);for(i=0;i=n-1;i++)printf(%6d%16s%6d\n,glist[i].num,glist[i].name,glist[i].amount);printf(--------------\n);getch();}/*函数结束*/4查找模块编码/*查找模块*/intseqsearch1(GOODSglist[],intn,intsearch_num)/*按货品号查找*/