版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12/76华中科技大学控制科学与工程系C语言课程设计报告超市库存管理系统 专业:自动化 班级:自动化0904班 组员:李衢鹏U200914348 黎浩U200914330 指导教师:周纯杰何顶新彭刚完成时间:2010年11月21日星期天目录:一.引言……………41.任务背景……………42.编写目的……………43.任务概述……………….…………..………………4二.功能及操作介绍………….….5界面1—欢迎暨人员登录界面………………5界面2—主界面………………….………6界面3—信息查询界面……………………7界面4—退出界面……….………………8三.系统设计分析…………………91.程序流程图…………….……….……92.程序模块分析………………..………101)主函数模块………………….………102)登陆及人员编辑模块…………….……113)主菜单模块…………………….……144)超市仿真模拟模块……….……………183.核心算法分析……………………..…211)链表的应用…………………….……212)图形界面下的同步输入显示……….……223)超市模拟仿真………………..………25四.不足之处……………..………29五.编程分工……….……………30六.程序设计心得….……………30七.参考资料…………………..…31八.程序源代码…………………31一.引言1.任务背景 在为期一学期的c语言课程学习之后,需要我们能扎实掌握所学知识,能够将其灵活运用到实际当中。于是在大二上学期布置了c语言课设的任务,本次课设2至3人一组,共设置了22个题材,采用抽签的方式选择各组的题目。每组须在大约两个月的时间内,编写出不少于1000行的c语言程序。并要求所编写的程序能正常运行,并符合生活实际。我们组的题目为“超市库存管理系统”,在下面的内容中将详细介绍。2.编写目的此次C语言课程设计是本专业的第一次课程设计,具有重要的意义:通过上个学期对C语言的学习,对C语言编程有了初步的了解,获得了一定的基础但是非常缺乏实际的编程经验,无法从质上对自己的编程技巧有一个很大的提高,这次的课程设计给我们提供了一个非常好的锻炼机会。通过二个人的分工合作,在实际中运用和训练程序设计的模块化和工程化思想和技术,努力掌握C语言精髓;同时提高自己的交流与团队合作的能力.为以后的更专业更复杂的课程设计和实践活动打好基础。3.任务概述以某超市为研究对象,了解超市商品进出库管理的基本数据流程,能对超市商品进行日常维护(录入、删除、编辑修改)具有存储、出库、入库、查找、统计等功能。在编写此程序的基础上掌握编修大程序的一些基本知识与技巧,为以后真正的走向社会,编修高效率的程序作准备。二.功能及操作介绍界面1—欢迎暨人员登录界面该界面一方面用于在欢迎使用者的同时初步让使用者了解到程序的大概内容:“超市库存管理系统”。另外它同时是一个登录界面以及用户的编辑界面。可以实现登录到主界面以及常规的用户编辑功能。并且它有这自身所带的退出功能。界面2—主界面该界面是程序的主题界面,几乎程序中所有的功能都是在本届面之下实现的。它本身根据用途的不同分为3个板块。一个是最上面的主菜单板块,用于实现菜单选项中相应的功能;另一个是左边的实时信息显示反馈板块,用于实时反映当前超市各种商品的各类信息;最后一个是右边的超市实际销售情况的模拟板块,用于仿真模拟现实超市顾客购买呢商品的情况。界面3—信息查询界面该界面是用于主界面主菜单中的“查询”功能的界面,主要是商品各类信息比较多,需要大版面的空间予以系统详尽的显示,方便使用者查询各类所需要了解的信息。界面4—退出界面该界面是程序整体退出时的一个结束界面,一个动态的动画感谢使用者对于本程序的使用,在按下任意键后,程序结束。三.系统设计分析程序开始1.程序流程图程序开始新用户注册新用户注册用户编辑欢迎登录界面用户编辑欢迎登录界面旧用户注销旧用户注销登登录密码修改密码修改超市商品信息实时显示主超市商品信息实时显示主界面开始主菜开始主菜单 超市仿真模拟退出返回超市仿真模拟退出返回查询编辑 Space 键欢迎登录界面欢迎登录界面信息查询界面入出库提醒入出库提醒Enter键添加商品 Ese键添加商品添加商品手动入库添加商品主界面主界面删除商品 其他键 自动入库删除商品修改商品信息修改商品信息入出库管理入出库管理结束界结束界面程序结束程序结束2.程序模块分析1)主函数模块voidmain(){ intgd=VGA,gm=VGAHI;//用于图形界面初始化 intkey,x,y,mflag=0,dlflag=0,rsflag=0;//主菜单功能选择标记,登陆人员职能选择标记,顾客人数标记 intmx=320,my=240,mbutt=0;//鼠标 renyuan*ryhead=rycreat();//创建人员链表 shangpin*sphead=spcreat();//创建商品链表 intn=0,q=0,a[18],x1[18],y1[18],c[18];//用于模拟销售,总顾客人数最多18人。总顾客数目,定位所选顾客标记,顾客所走步数,顾客所在横坐标,顾客所在纵坐标,顾客所购买商品及顾客颜色标记 charstr1[11],str2[11];//登陆时输入用户名和密码 char*menu[]={"编辑","查询","返回","退出"}; char*xs[2][5]={{"编号","名称","价格","现存","已售"},{"编号","名称","总入库","总出库","库存"}}; char*ms,*msp;//ms用于显示鼠标,msp用于恢复原鼠标所在位置画面 initgraph(&gd,&gm,"C:\\TC30\\BGI");//图形界面初始化 cleardevice(); mouse(&ms,msp);//画鼠初始化 while(1) { hyjiemian();//欢迎及登陆界面绘制 while(1)//欢迎登陆界面 { read1(&mx,&my,&mbutt,ms,msp); dlxz(mx,my,mbutt,&dlflag);//选择登陆人员职能 if(denglu(ryhead,mx,my,mbutt,str1,str2,dlflag))break; rybj(ryhead,&mx,&my,&mbutt,dlflag,&ms,msp);//人员编辑功能 } zhujiemian(sphead,menu,xs); while(1)//主界面 { read1(&mx,&my,&mbutt,ms,msp); menuxz(mx,my,menu,&mflag);//主菜单功能选择 if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)//模拟销售开始选择 { if(moni(sphead,&rsflag,&n,&q,a,x1,y1,c)) { tixing(sphead); } } if(mflag==4&&mbutt==1)//结束整个函数 { jieshu(); } elseif(mflag==3&&mbutt==1)//返回登录界面 { dlflag=0; break; } elseif(mflag==1&&mbutt==1&&dlflag==1)//商品信息编辑功能 { spbj(sphead,&mx,&my,&mbutt,&ms,msp,c); zhujiemian(sphead,menu,xs); } elseif(mflag==2&&mbutt==1)//商品信息查询功能 { spcx(sphead); zhujiemian(sphead,menu,xs); } } }} 主函数main()反映了各个功能板块之间的联系。函数在定义各变量值时,同时定义创建了登陆人员和默认商品两个链表。这是程序的准备阶段。后面在程序进行完图形初始化和鼠标初始化以后,程序正式进入主体部分。函数主题有三个嵌套的while(1)语句构成。外层一个while(1)语句,和内层两个并列的while(1)语句。外层的while(1)语句保证程序一直循环运行,可以实现从程序后面的语句跳转到程序前面的语句,达到“返回”的效果。内层两个while(1)语句,前面一个接在“欢迎暨登录界面”绘制函数hyjiemian();后面,用于该界面下的各项功能的实现,后面一个while(1)语句接在“主界面”绘制函数zhujiemian(sphead,menu,xs);后面,用于主界面下各项功能的实现。 主界面下各项功能板块,上面初略提到过是三大板块。他们中的“主菜单功能选择”函数menuxz(mx,my,menu,&mflag);配合下面的“主菜单功能选择”标记mflag实现主菜单板块中的各项功能,而现实超市销售情况的模拟仿真板块则由“开始按钮”if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)和“模拟超市销售动画”函数moni(sphead,&rsflag,&n,&q,a,x1,y1,c);,“库存不足,入出库提醒”操作函数tixing(sphead);两个函数实现。这两个板块是并行的,不可以同时进行。而主界面下的另一大板块实时信息显示反馈板块,则是穿插在另外两大板块之间,应为另外两大板块都会引起超市商品信息的改变,而要做到实时反馈就只能深入这两个板块中去。 下面将就各个具体的模块功能做一些讲解。2)登陆及人员编辑模块 该模块主要用于使用人员登录和用户信息的编辑操作。本模块的核心函数: renyuan*rycreat(); intdenglu(renyuan*h,intmx,intmy,intmbutt,char*str1,char*str2,intdlflag); voidrybj(renyuan*h,int*x0,int*y0,int*mb,intdlflag,char**ms,char*msp); renyuan*rycreat();函数通过文件renyuan.txt的读取,将已经注册过的已有的用户信息创建成链表。链表结点结构如下:typedefstructnode1{ intryflag;使用人员的职能,分为管理者(1)和普通人(0) charname[11];用户名 charmima[11];用户密码 structnode1*next;指向下一个结点}renyuan; 最初程序默认的用户是两个:1gly12345;0ptr54321。 intdenglu(renyuan*h,intmx,intmy,intmbutt,char*str1,char*str2,intdlflag);函数用于用户的登陆操作。它包括职能的判断,用户名的输入及判断,密码的输入及判断,登陆时信息反馈。 用户职能使用int型整数来确定,通过p->ryflag==dlflag;(dlflag:用户登录职能的标记)语句来实现它的判断;用户名是char型字符串,则通过strcmp(p->name,str1)==0;语句来实现判断用户名是否正确;同样的,用户密码也是char型字符串,通过strcmp(p->mima,str2)==0;来判断用户密码是否正确。在输入完全后,点击“登陆”选项来实现上述判断,并给出相应的判断信息反馈,,如上图右图中的“密码错误!”,从而方便使用者更好的使用各种功能。 voidrybj(renyuan*h,int*x0,int*y0,int*mb,intdlflag,char**ms,char*msp);函数用于用户信息的编辑操作。 用户人员信息编辑包括三个方“新用户注册”,“旧用户注销”,“密码修改”。通过调用一下函数实现: intzhuce(renyuan*h,intryflag);新用户注册功能 intzhuxiao(renyuan*h);旧用户注销功能 intryxiugai(renyuan*h);密码修改功能 实现是用于输入的图框函数通过调用一下函数实现: voidzccaidan();用于新用户注册的图框 voidzxcaidan();用于旧用户注销的图框 voidryxgcaidan();用于密码修改的图框 在用户人员信息编辑的同时会有实时信息的反馈,如上图的“注册成功!”,方便使用者更好的使用这些功能,在输入数据后按下Enter键(确认键,回车键)表示该数据输入完成。而在编辑的任意位置按下Space键(空格键)都可以结束编辑,放弃此次编辑。 “新用户注册”功能执行时的职能选择与“登陆”时的职能选择共用。如上图就是成功注册了一个职能为“管理员”的新用户。“新用户注册”功能,在成功注册之后,通过尾插法在用户人员链表后面插入新结点,保存新注册的用户信息,则在登录时该用户就可以直接使用了。 “旧用户注销”功能,不考虑用户职能,在判断用户名存在,两次确定用户密码后,直接通过链表的结点删除操作,注销掉旧用户,则在登录时该用户将不存在,无法实现登录操作了。至于用户名和密码的判断确认同前面的登录操作时的是一样的。 “密码修改”功能只能修改密码,而不能修改用户名和用户职能,与现实情况基本保持一致。 同时在操作成功之后,都会对保存用户信息的文件renyuan.txt进行写操作,把更改后的新用户信息写进去,保存起来。那么当程序结束后,这些信息还将一直存在,等到下一次登录时,renyuan*rycreat();函数通过直接读取这些信息创建用户人员链表,这样就可以实现以前注册的用户依然可以使用。及各项用户人员操作将保存起来,延续到以后程序当中。 本模块的其它函数: voidhyjiemian();整个欢迎暨登陆界面的绘制函数。 voiddlxz(intmx,intmy,intmbutt,int*dlflag);登陆及新用户注册时用户职能的选择函数。 voidrybjxz(intmx,intmy,char*rybj[],int*bjflag);用户人员信息编辑时菜单中各项操作的选择函数。 voidrybjcaidan(char*rybj[]);用户人员信息编辑下来菜单 voidhfrybj();用户人员信息编辑下来菜单区域的恢复 voidryhf();//用户人员信息编辑功能实现所用图框区域的恢复 voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠标工具函数,用于 需要鼠标的各项功能的实现 voiddisphz16(intx,inty,intz,inta,intcolor,char*p);绘制图画时的汉字输出 intzifuinput(charstr[],intx,inty);键盘输入同时显示字母或数字,用于用户名输入 intmimainput(charstr[],intx,inty);键盘输入同时显示“*”号,用于密码输入 voidguangbiao(intx,inty);产生光标的工具函数 voidxiaoguangbiao(intx,inty);消除光标工具函数 voidjieshu();退出程序时的动画界面,并实现程序的结束3)主菜单模块 本模块是主界面中主菜单下的各项功能的实现模块。主要用于商品的各项信息的编辑,商品总信息的查询,返回登录界面,以及退出程序。与主菜单的各选项相对应。而其中尤以各项商品的信息编辑最为主要。本模块的核心函数: shangpin*spcreat(); voidmenuxz(intmx,intmy,char*menu[],int*mflag); voidspbj(shangpin*h,int*mx,int*my,int*mbutt,char**ms,char*msp,intc[]); voidchaxun(shangpin*h); voidxiaoshou(shangpin*h); shangpin*spcreat();函数是商品链表的一个创建函数。它用与创建一个系统默认的商品链表,保存这些商品的各项信息。商品链表的结点结构如下:typedefstructnode0{ intbianhao;商品的编号 charmingcheng[11];商品的名称 floatyuanjia;商品的原价格 floatjiage;商品的销售价格 intruku;商品的总共进货数量 intkucun;商品现有的仓库存储量 intxiancun;商品现存于超市货架的量 structnode0*next;指向下一个结点}shangpin; 这里创建的商品链表的信息都是程序“临时”指定的,即程序退出后无法保存用户对于各项商品信息的编辑修改操作。下一次程序再次运行时,各商品信息依然是系统默认制定的信息。即每一次程序的运行,商品信息都会还原。 系统默认的商品信息如下: 编号:1,2,3,4 名称:chara[4][11]={"mianbao","yinliao","taideng","yusan"}; 原价:floatb[4]={1.5,4,38,12}; 价格:floatc[4]={1.2,3,28,7}; 总入库:100 现有库存:80 超市现存:20 这里的商品信息没有像用户人员信息一样保存起来是有考虑的。一方面说,超市商品的信息确实是一个动态变化的过程,但是做为一个超市商品库存的模拟,我们在很多方面达不到现实实际的要求。而且没有这么大的必要性。另一方面,我们要实现实时商品信息的显示,而我们的用于显示的区域面积有限,无法支持大量商品的同时显示。另外,在超市的仿真模拟当中,也没有办法空出足够的空间放置商品货架。而若做到保存这些信息数据,那么这些数据很大一部分是称递增的,时间一久势必造成画面框架无法满足显示的要求。总而言之,作为一个模拟仿真,这方面其实不是重点。 voidmenuxz(intmx,intmy,char*menu[],int*mflag);函数用于主菜单上各项功能的选择。自然在选择后会有相应的函数语句来实现它所选择的选项所对应的功能。 其选择的功能与菜单选项相一致,包括:“编辑”,“查询”,“返回”,“退出”。编辑与查询下面还将详细介绍,这里就不加赘述。主要讲一下返回与退出功能。 返回功能其实在主函数模块中已经说到。它不是通过一个函数来实现的,它的实现是通过下面的if选择语句来完成的。 elseif(mflag==3&&mbutt==1)//返回登录界面 { dlflag=0; break; } 其中,mflag是主菜单上面各项选项才标记(3表示退出),mbutt是鼠标按键的标记(1便是左键按下),dlflag是用户登录的职能标记。上述语句表示在主菜单中选择“退出”时,用户的职能恢复默认值“0”(表示普通人),并跳出该层循环。在主函数模块中提到,它含有三个while(1);语句,两层循环而以上语句是从内层循环中的下面一个循环中跳出,由于外层循环的存在,在外层循环中本次循环结束后,函数将返回到内层循环的中的上面一个循环,这个循环恰好是用于登录及用户人员信息编辑的循环。这样就实现了由“主界面”返回“欢迎暨到登录界面”的操作。 退出功能相对来说就更为简单了。他也是通过一个if选择语句来实现的。语句如下: if(mflag==4&&mbutt==1)//结束整个函数 { jieshu(); } 即在主菜单中选择“退出”选项时,调用结束动画界面函数,并实现程序的结束。 voidspbj(shangpin*h,int*mx,int*my,int*mbutt,char**ms,char*msp,intc[]);函数实现的是主菜单中的“编辑”选项功能。用于商品各类信息的编辑,包括“添加商品”,“删除商品”,“修改商品信息”,“入出库管理”四项功能。 这四项功能的实现是通过调用一下函数来完成的: intcharu(shangpin*h,intc[]);添加商品功能 intshanchu(shangpin*h,intc[]);删除商品功能 intxiugai(shangpin*h,intc[]);修改商品信息功能 intruchuku(shangpin*h);入出库管理功能 这四项功能实现输入用的图框是通过调用一下函数来实现的: voidcrcaidan();绘制添加商品功能图框 voidsccaidan();绘制删除商品功能图框 voidxgcaidan();绘制修改商品信息功能图框 voidrckcaidan();绘制入出库管理功能图框 在商品信息编辑时在输入数据后按下Enter键(确认键,回车键)表示该数据输入完成。而在编辑的任意位置按下Space键(空格键)都可以结束编辑,放弃此次编辑 “添加商品”功能用于添加新的商品。由对商品信息链表的插入结点操作来实现。首先通过编号的输入,用于确定要插入结点在链表中的位置,然后输入商品的各类信息。。在信息的输入同时还会判断信息的实际意义,若不符合实际,则结束信息输入,商品添加操作失败,如价格小于原价,商品总进货量小于仓库库存等。另外在添加商品成功后,新添加商品所对应的结点位置以后的结点所对应的商品编号会与它们实际所处链表中的位置不一致,而在添加商品最后也会调整各商品的编号。同样的,下面的所有操作都会对输入信息的实际意义作出判断,确保数据输入不失真,与实际不符。而且也会对他们有编号改变的商品进行相应的编号调整。 “删除商品”功能用于删除已有的商品。由对商品信息链表的删除结点操作来实现。要被删除的商品通过其编号来确定。 “修改商品信息”功能用于修改以后商品的某些信息,包括“编号”,“名称”,“价格”。对于不想修改信息,直接按Enter键,这样将保留原信息不变。 “入出库管理”功能用于已有商品的进出货,通过输入编号确认要进行入出库操作的商品,同时自动显示商品名称。操作分为“进货”和“出货”两个部分,分别输入要进货或者出货的量,不用操作的直接按Enter键,则该项将不会改变。 另外,商品信息的编辑与超市商品信息的实时反馈,超市销售的仿真模拟都有很大的关联,在商品信息的编辑功能中,同时对于商品信息在超市销售仿真模拟中反映出来的信息也作出了相应的调整,如添加了一样新商品之后,超市销售仿真模拟部分就要及时的有新商品的货架,顾客也能购买到新商品。而在商品信息编辑之后,超市商品信息的实时反馈也要及时修整过来,同样的,在添加了一样新商品之后,要及时反映出新商品的各类信息。 voidchaxun(shangpin*h);函数实现的是主菜单中的“查询”功能。主要是用于使用者查询商品的各类数据。包括“编号”,“名称”,“原价”,“价格”,“总入库”,“库存”,“现存”,“已售”,“总利润”九大类。也即是上面介绍过的“界面3—信息查询界面”。通过此查询功能可以了解到该模拟超市的所有营业情况,以供使用者据此相应的对商品做出适当的操作。 voidxiaoshou(shangpin*h);函数用于实现超市商品情况的实时反馈。 如上图所示,它显示了超市商品的一些最基本的数据情况。该板块处于主界面下,显示一直存在,这样对于使用者掌握超市商品的基本信息是十分有用的。而且他和商品信息编辑功能,超市销售仿真模拟是直接相连的,这样可以达到实时反映超市商品情况的目的。让使用者及时掌握这些数据。 另外下面的“入出库提醒”会在因销售而使得商品现存数目紧张时,做出动态的提醒,及时补充商品。更具体的介绍将放在下面的“超市仿真模拟模块”中。本模块的其它函数: voidzhujiemian(shangpin*h,char*menu[],char*sx[][5]);主界面的绘制函数 voidzhucaidan(char*menu[]);主菜单的绘制函数 voidxscaidan(char*xs[][5]);商品信息实时反馈板块的图框绘制函数 voidspcx(shangpin*h);“查询”功能界面的绘制函数 voidbjzicaidan(char*bj[]);“编辑”功能的下拉菜单绘制函数 voidhfbj(intxzflag,intfhflag,intmbutt);用于恢复“编辑”功能下来菜单以及用于实现商品实现商品编辑的操作函数而开辟的图框所处区域的函数 voidbjxz(intmx,intmy,char*bj[],int*xzflag);用于实现“编辑”功能菜单各选项选择的函数 voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠标工具函数,用于 需要鼠标的各项功能的实现 voiddisphz16(intx,inty,intz,inta,intcolor,char*p);绘制图画时的汉字输出 floatshuziinput(intx,inty);//输入并显示数字键盘输入同时显示数字,用于商品信息编辑时的数字输入 floatzhuanhuan(intxsd,inti,floatsum,floata[]);数组转换为浮点数的转换函数,用于输入数字数据从字符串装换为数字 intzifuinput(charstr[],intx,inty);键盘输入同时显示字母或数字,用于商品信息编辑时的商品名称数据输入 voidguangbiao(intx,inty);产生光标的工具函数 voidxiaoguangbiao(intx,inty);消除光标工具函数 voidjieshu();退出程序时的动画界面,并实现程序的结束4)超市仿真模拟模块 该模块用于模拟仿真现实生活中,超市的营业销售情况。通过模拟顾客来超市购买商品,以及超市自行的入出库管理,展现出一幅动态的超市营业销售景像。模拟图像如下图所示:本模块的核心函数: intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0); voidtixing(shangpin*h); intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0);函数用于模拟仿真超市中的销售营业界面。购买商品的顾客从超市的“入口”进入超市,经过各种商品的货架,拿上自己要购买的商品,到“收银台”付账,从超市的“出口”处走出超市。这便是一位顾客购买商品的整个过程。 函数功能的实现首先通过随机函数产生随机数,没产生一个随机数,按照默认设置,若随机数处于有效区间,表示进来一位顾客,再根据这些随机数所处有效区间的不同分别将它们指定为购买不同商品的顾客,并用不同那个的颜色加以区分。对于随机数的处理,是通过调用以下函数来实现的: voidcolorxz(intk,int*c);用于判断所产生的随机数属于有效区间,对于处于有效区间的随机数,相应的根据他所在区间的不同,指定它表示购买不同商品的顾客。 voidgk(intx,inty,intc);将购买不同商品的顾客用不同是颜色却分开来,并在(x,y)表示坐标处产生该位顾客,用一个填充了指定颜色的“○”表示。 其次是顾客购买商品的过程。它是一个动态过程,通过调用以下动画函数来实现: voidmove(inta,int*x1,int*y1,intc);用于顾客在超市内的移动过程。当顾客到达所要购买的商品货架处时,为表现顾客拿上所要购买的商品,将所购买商品的编号绘制在表示顾客的“○”上。 按下任意键都可以实现模拟销售动画的暂停,另外在商品现存不足的情况下,模拟销售动画会自动暂停,并发出“入出库”提醒。具体实现的介绍就在下面。 voidtixing(shangpin*h);函数用于在商品现存不足时,模拟销售动画暂停,提醒使用者存货紧张的商品进行“入出库”操作。 默认是商品现存紧张标记是该商品的现存量小于等于3。此时模拟销售动画会自行暂停。并调用voidtixing(shangpin*h);。此时动态地提醒使用者进行“入出库”的操作。 此时的“入出库”操作有两种选择,如上图所示,一种是直接按下除确认键(Enter键)意外的按键,程序将进行自动“入出库”操作。默认的自动“入出库”操作是:在“库存”充足的情况下(库存不小于30),就直接出库20件商品。在“库存”紧张的情况下,“入库”100件商品,同时“出库”20件商品。另一种操作是按下“确认键“,进行手动“入出库”操作,同时“入出库提醒”出静态地提醒使用者尽快进行入出库操作,如下图所示。相关操作在主菜单的“编辑”功能里面。 在上述介绍中已经提到,超市仿真模拟当中,有两个商品信息的实时反馈机制。一个是在卖出商品后及时的在超市商品信息的实时反馈中及时的表现出来。这个是通过在模拟动画中及时调用voidxiaoshou(shangpin*h);函数来实现的。 另一个是在进行商品的“编辑”功能后,及时的在模拟动画中反映出商品信息的改变。这个是通过对一系列保存了每个在超市的顾客的信息的数据的相应改变来实现的。这些保存顾客信息的数据如下: n 当前超市顾客数目 q 定位所选中进行操作的顾客 a[18] 记录每位顾客从进入超市到当前位置所走步数 x1[18],y1[18] 顾客当前所在位置的横纵坐标 c[18] 记录每位顾客所购买商品及对应该种商品的颜色 以上数据记录下了每一位在超市内的顾客的所有有用信息。这样在intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0);退出以后,及模拟销售暂停后,重新开始的时候可以重现当初暂停是的动画,并接着进行下去。同样的,在商品“编辑”功能操作改变了商品的信息之后,同时也会对以上数据进行相应的调整,这样再一次进行销售模拟的时候也是可以及时的反应出商品信息的改变情况。另外指出一点,当进行“添加商品”,“删除商品”时,模拟超市销售界面中的货架也应当有相应的改变。这是通过调用一下函数来实现的: voidyyjiemian(shangpin*h);模拟超市销售界面的绘制函数,用于根据当前情况下的商品信息绘制超市销售界面。如下面表示的是添加了一项商品后的超市模拟销售情况。该模块的其他函数: voidgkhf(intx,inty);用于顾客向前移动时,恢复顾客原位置画面的函数 intlength(shangpin*h);用于计算商品信息链表的长度的函数 voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠标工具函数,用于 需要鼠标的各项功能的实现 voiddisphz16(intx,inty,intz,inta,intcolor,char*p);绘制图画时的汉字输出3.核心算法分析1)链表的应用 在整个函数当中使用到了两个链表,一个用户人员链表,用于存放用户信息;一个商品信息链表,用于存放商品信息。 两个链表的结构分别如下: typedefstructnode1 { intryflag;使用人员的职能,分为管理者(1)和普通人(0) charname[11];用户名 charmima[11];用户密码 structnode1*next;指向下一个结点 }renyuan; typedefstructnode0 { intbianhao;商品的编号 charmingcheng[11];商品的名称 floatyuanjia;商品的原价格 floatjiage;商品的销售价格 intruku;商品的总共进货数量 intkucun;商品现有的仓库存储量 intxiancun;商品现存于超市货架的量 structnode0*next;指向下一个结点 }shangpin; 程序中创建的是两个单链表。在对人员和商品信息的编辑上面都是通过对相应链表中的相应结点的操作来实现的。链表的相关操作都是相通的,概括为:链表的创建,求链表长度,链表信息输出,查询链表指定位置结点的信息,指定位置插入链表新结点,删除链表指定位置的结点,修改链表指定位置的信息,删除链表等几项操作,以此作为模板,用于人员及商品信息的编辑操作,十分的方便,减少了很多工作量。2)图形界面下的同步输入显示 图形界面下面是没有数据的输入函数的,而且它的输出函数只有 voidouttext(char*textstring); voidouttextxy(intx,intu,char*textstring); 他们也只能用于字符串的输出,该输出的字符串还是已经存在的,没有办法实现键盘输入,屏幕同步显示的目的。然而我们程序要求手动键盘输入数据说进行人员和商品信息的修改编辑,而这些数据是直接在屏幕上输入显示的。为解决这个问题,我们专门编辑了几个工具函数,用于不同情况下的数据输入。 floatshuziinput(intx,inty);输入并显示数字键盘输入同时显示数字,用于商品信息编辑时的数字输入 floatzhuanhuan(intxsd,inti,floatsum,floata[]);数组转换为浮点数的转换函数,用于输入数字数据从字符串装换为数字 intzifuinput(charstr[],intx,inty);键盘输入同时显示字母或数字,用于商品信息编辑时的商品名称数据输入 intmimainput(charstr[],intx,inty);键盘输入同时显示“*”号,用于密码输入 键盘输入使用的是key=bioskey(0);语句。通过key保存函数的返回值。 key=key&0xff;留下返回值的低八位,即普通键的ASCII码。用于输入数字时的同步输入显示 if(0x30<=key&&key<=0x39)//数字0-9 { xiaoguangbiao(x,y); setcolor(WHITE); a[i]=key-0x30; sprintf(c,"%d",key-0x30); outtextxy(x,y,c); x=x+7; i++; guangbiao(x,y); } 通过一个数组保存下每次输入的数字大小,使用sprintf(c,"%d",key-0x30);语句将数字转换成字符串,同时及时的将字符串在屏幕上指定位置(x,y)显示出来,这样便实现了数据的输入同步显示,且保存下了输入的数据。x=x+7;语句将输入数据显示位置后移,通过循环可以实现数据的连续输入。i++;语句保证保存下每一位属于的数据。用于输入字符时的同步输入显示 if((0x61<=key&&key<=0x7a)||(0x30<=key&&key<=0x39))//数字0-9和小写字母a-z { xiaoguangbiao(x,y); setcolor(WHITE); c[0]=(char)key; c[1]='\0'; p[i]=(char)key; outtextxy(x,y,c); x=x+7; i++; guangbiao(x,y); }用于输入密码时的同步输入显示 if((0x61<=key&&key<=0x7a)||(0x30<=key&&key<=0x39))//数字0-9和小写字母a-z { xiaoguangbiao(x,y); setcolor(WHITE); p[i]=(char)key; outtextxy(x,y,"*"); x=x+7; i++; guangbiao(x,y); } 在实现了输入同步显示之后,我们要求输入的数据能够在输入的同时作出修改。避免因输入错误导致操作失败,否则会增加很多的工作量,也不够人性化。因此我们对退格键(BackSpace键)做了特殊处理。 用于输入数字时的退格键功能 elseif(key==Key_BackSpace)//退格键,消除错误输入的数字 { xiaoguangbiao(x,y); if(i!=0) { x=x-7; bar(x,y,x+7,y+15);//消除原光标和要删除的错误输入数据 setcolor(WHITE); i--; a[i]=0; if(xsd==i)flag=0; } guangbiao(x,y); } 即在按下BackSpace键之后,x=x-7;bar(x,y,x+7,y+15);语句消除前一个输入的数据,i--;a[i]=0;语句将已经保存的数据作废。 用于输入字符和密码时的退格键功能 elseif(key==Key_BackSpace)//0x0e08退格键,消去错误输入的字符 { xiaoguangbiao(x,y); if(i!=0) { x=x-7; bar(x,y,x+7,y+15);//消除原光标和要删除的错误输入数据 setcolor(WHITE); i--; p[i]='\0'; } guangbiao(x,y); } 最后输入的数字是保存在一个数组里面的,么一个保存的是该数字某位上的一个数字符或者小数点(xsd)。然而我们需要的是数字整体的数值。这样我们编了一个转换函数。 floatzhuanhuan(intxsd,inti,floatsum,floata[]) { intk,j; if(xsd==0)xsd=i; if(xsd!=i) { k=xsd+1; while(k<i) { for(j=0;j<k-xsd;j++) { a[k]=a[k]/10.0; } sum=sum+a[k]; k++; } } for(k=0;xsd>0;xsd--) { for(j=xsd-1;j>0;j--) { a[k]=a[k]*10.0; } sum=sum+a[k]; k++; } returnsum; } 该函数直接用在函数floatshuziinput(intx,inty);中,xsd为输入的小数点在数组中的位置,i为输入结束后的i值,sum为数组保存的数据所表示的数值大小,a[]为保存数据的数组。 同时数字的输入不能两次输入小数点,这个用一个标记flag来控制。3)超市模拟仿真 超市模拟仿真的实现主要在于退出超市模拟程序后,在进入时要哦能够从退出的地方接着运行。这个在超市仿真模拟模块中已经做了比较详细的说明。 intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0) { intx=639-10,y=370+43,i,k,k0,flag=0; int*a=a0,n=*n0,q=*q0,*x1=x10,*y1=y10,*c=c0,rsflag=*rsflag0;//移动的步数,顾客人数,定位每位顾客,保存每位顾客的坐标,保存相应顾客的表示颜色及收购商品编号,总人数标记 shangpin*p=h->next; k0=length(h)*20; while(1) { if(bioskey(1)!=0||flag==1)//任意键暂停销售 { if(flag!=1)bioskey(0); a0=a;//移动的步数 *n0=n;//顾客人数 *q0=q;//用于定位每位顾客,从而进行相应的操作 x10=x1,y10=y1;//保存每位顾客的坐标 c0=c;//保存相应顾客的表示颜色 *rsflag0=rsflag; returnflag; } if(rsflag==0)q=0; if(rsflag==1)q=n+1; srand(time(0));//用系统时间当种子,对随机函数进行初始化 k=rand()%k0;//产生随机数,顾客随机购买任意商品 if(n<18) { a[n]=0; x1[n]=x; y1[n]=y; colorxz(k,c+n); if(rsflag==0)n++; if(rsflag==1)n=18,rsflag=0; } for(i=q;i<n;i++) { move(a[q],x1+q,y1+q,c[q]);//顾客移动 a[q]=a[q]+1; if(a[q]==21) { gkhf(x1[q],y1[q]); while(1) { if(c[q]==0)break; if(p->bianhao==c[q]) { p->xiancun-=1;//收银台付账结束,商品卖出 if(p->xiancun<=3) { flag=1;//现存不足,入出库提醒标记开启 } delay(30); xiaoshou(h); p=h; break; } if(p->next==NULL)break; p=p->next; } a[q]=0; n=q; rsflag=1; } q++; } } } 已上是超市模拟函数,为了保存各类的数据,都通过地址传递的方式,不过若函数全都使用读地址的方式来使用其中个的数据,并对这些数据进行操作,则会出现数据的混乱。所以在函数运行前,我们把每个数据都赋给临时动态变量,通过对这些临时动态变量的操作来运行下面的函数。只在函数退出的时候把改变以后的数据重新赋给专递来的地址。即下面的代码语句: if(bioskey(1)!=0||flag==1)//任意键暂停销售 { if(flag!=1)bioskey(0); a0=a;//移动的步数 *n0=n;//顾客人数 *q0=q;//用于定位每位顾客,从而进行相应的操作 x10=x1,y10=y1;//保存每位顾客的坐标 c0=c;//保存相应顾客的表示颜色 *rsflag0=rsflag; returnflag; } 而切为求函数再次运行是能够从退出的位置继续运行,我们退出的位置设置在函数头部,也就是在函数单次循环完全运行完以后才退出,那么再次进入时,即相当于函数进入下一个循环,能够实现函数从推出位置继续运行。对于由于“现存不足”造成的函数退出使用的是统一个退出语句。 另外要实现顾客购买商品之后商品信息的实时反映,则是通过及时的调用xiaoshou(h);函数来实现的。代码如下: if(p->bianhao==c[q]) { p->xiancun-=1;//收银台付账结束,商品卖出 if(p->xiancun<=3) { flag=1;//现存不足,入出库提醒标记开启 } delay(30); xiaoshou(h);//商品信息的实时反映 p=h; break; } 最后对于商品编辑所造成的超市模拟中商品表示的改变。是通过对c[18](记录每位顾客所购买商品及对应该种商品的颜色)中数据的改变来实现的,该数据保存的就是顾客所购买的商品的编号。“添加商品”功能引起的商品数据改变 c0=n; for(i=0;i<18;i++) { if(c[i]>=c0)c[i]+=1; } 添加商品引起的商品信息改变主要是链表插入的新结点以后的结点中表示商品编号的数据不再正确了,需要做出相应的调节。“删除商品”功能引起的商品数据改变 c0=p->bianhao;//要删除商品编号 for(i=0;i<18;i++) { if(c[i]==c0)c[i]=0; if(c[i]>c0)c[i]-=1; } 删除商品功能引起的商品信息变化在于丢失了一个结点以后,该结点以后的结点中表示商品编号的数据已经不再正确了,需要做出相应的调节。 “修改商品信息”功能引起的商品数据改变 for(i=0;i<18;i++) { if(c[i]==n)c[i]=bh; elseif(c[i]==bh)c[i]=n; } 修改商品信息功能所引起的商品信息改变主要在于修改后两个编号所对应的商品的信息互换。 另一个方面,对于“添加商品”和“删除商品”功能引起的超市模拟界面中货架的改变,通过函数voidyyjiemian(shangpin*h)实现,主要代码如下: intk0=length(h);//判断有几种商品 if(k0>=1)//1号商品货架绘制 { rectangle(x-230,y+190,x-180,y+250); sprintf(s,"%d",p->bianhao);//3个空格,编号 settextstyle(2,0,8); outtextxy(x-230+20,y+190+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+190+35,p->mingcheng); p=p->next; } if(k0>=2)//2号商品货架绘制 { rectangle(x-140,y+190,x-90,y+250); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-140+20,y+190+10,s); settextstyle(2,0,4); outtextxy(x-140+5,y+190+35,p->mingcheng); p=p->next; } if(k0>=3)//3号商品货架绘制 { rectangle(x-230,y+270,x-180,y+330); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-230+20,y+270+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+270+35,p->mingcheng); p=p->next; } if(k0>=4)//4号商品货架绘制 { rectangle(x-140,y+270,x-90,y+330); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-140+20,y+270+10,s); settextstyle(2,0,4); outtextxy(x-140+8,y+270+35,p->mingcheng); p=p->next; } if(k0>=5)//5号商品货架绘制 { rectangle(x-230,y+350,x-180,y+410); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-230+20,y+350+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+350+35,p->mingcheng); p=p->next; } 有多少商品就绘制多少个货架,并显示出相应货架对应商品的信息。(最多5个)四.不足之处 程序的主要不足之处有以下几点:程序所能容纳的商品数目有限,我们定的是最多五个。 原因在于我们界面的面积有限,要把这些商品的数据权都在界面中显示出来,那么所能容纳的商品数目自然有限。尤其是在模拟超市模块当中,商品货架所占的区域尤其大。我们有想过将这些都缩小化,不过这样只是增加了所能容纳商品的上限罢了,上线大了,所能容纳的商品自然会有所增加,不过上述问题依然还是存在,它总会有一个上限。可是联系实际,超市商品容量的确很大,不过它也肯定是有一个上限的,只是我们日常所需要的商品总量可能没有达到这个上限,那么这个上限就对于超市没有实质性的影响罢了。超市模拟仿真模块中,每个顾客都只能买一种商品。填充表示顾客的“○”,表征的不是顾客所要买的商品本生,而是编号。这样在商品编号改变之后,所要购买该项商品的顾客的颜色也是随之改变了,而这种改变并不怎么符合实际。最主要还是在于顾客购买的商品只能是一件。我们有考虑过用排列组合的方式,考虑各种购买商品的组合,在通过随机数所处的不同区间确定顾客所要买的是那种或者哪几种。不过这样在实现时比较困难,一方面要指示出顾客所要购买的分别是那些商品,在购买完后又要实时的显示出这些被购买的商品的库存信息。另一方面在商品信息别修改的时候,要实施的反映在超市模拟当中。这些实现起来都比较困难。鼠标功能无法在函数全程使用。这主要体现在两个方面,一个是鼠标与动画不能同时存在;一个是在键盘输入信息时不能同时用鼠标。前一个问题可以说成是两个动画无法同时实现,因为鼠标某种意义上来说也是一个动画。后一个则是由于key=bioskey(0);语句等待下一个键盘按键的输入和输入函数为了实现连续输入设定的内部循环造成的。在没有进行数据输入操作时,有事还是可能按动键盘上的按键,这个时候若选择数据输入,那么前面按了的键会直接在输出位置显示出来。又甚者,我们以空格键(Space键)作为某项功能的返回键,若在选择该项功能之前之按了返回键,那么在选择这项功能的时候,程序就会自动的返回。为此我们在鼠标里面添加了if(bioskey(1)!=0)bioskey(0);的语句。用于将随意按了的按键信号输出去,不至于影响的程序的正常工作。可是鼠标只在每一次动或按鼠标键的时候才会循环一次,能够消耗掉一个按键信号,若按动的键太多,而鼠标的操作太少,还是无法耗尽随意按动的键所产生的信号,上述问题依然会存在。五.编程分工 我们的程序总共1800行左右。除去了汉字库和鼠标。 就实现的功能模块方面,主函数模块,登陆及人员编辑模块和主菜单模块主要由李衢鹏完成。超市仿真模拟模主要由黎浩完成。 就用于实现这些功能的界面方面,菜单和图框而言,大部分是黎浩做的设计。 就在界面下在各项功能间进行选择操作方面,大部分是李衢鹏设计的。 就所提及的三项核心算法方面,链表的应用和图形界面下的同步输入显示主要由李衢鹏完成,超市模拟仿真主要由黎浩完成。六.程序设计心得 在本次c语言课设中,遇到过很多的问题,诸如error的调试,常常一个error连续几天都调不出来。自己一个人苦思冥想,到最后突然一下子就又把问题解决了。最大的苦难莫过于最初做出来的东西有些功能无法实现,不得不舍弃之前辛苦做的全部,寻找新的方法来实现这些功能。不过最后把全新的东西做出来之后,感觉还是很欣慰很值得的。 通过课程设计,我们学到了不少东西,不仅是c语言的知识,方法,技巧,更多的是我们在学习过程中掌握的一些学习的技巧,手段和方法。C语言课程设计当中的大部分东西对于我们来说动都是全新的,在之前我们只是知道了最简单的c语言但中的各种操作,可是现在要求我们能够使用高级c编写一个现在来说已经是很大的一个程序。这绝对是一个挑战。而且我们的课设时间又是很长的,又没有老师实时监督,在大部分同学都是刚开始能够带电脑来校的情况下,要静下心来编程,这同样是一个很不小的挑战。很幸运的,我么都克服过来了。作为一个大学生,我们知道自己来学校的目的是做什么的,我们没有时间用来荒废,我们必须好好抓紧每一分每一秒,来充实壮大自己。而通过对一个全新的任务的实现,我们喊好的锻炼了自己的学习能力。我们来到学校的时候,可能说智商什么的都不会要太大的差异,可是在自学能力上,我是很有体会的,大家的差异是很明显的。然而不管在什么情况下,良好的自学能力都是十分重要的,这次课程设计正是很好的锻炼了我们的自学能力。 正如有个学长曾经说过的一句话:“经历了C语言课程设计以后,你会发现你的C语言编程能力以到达一个以前完全不能相比的高度”。课程设计虽然结束了,但是它给我们带来好处是很多的,影响是很远的,我们感觉到,只有认真的完成这样的任务,才会在实践中有所提高,因此,我们应该在以后的学习中更加重视动手能力,学会在动手中发挥自己的想像,与所学的东西结合,学会创新,这个才是我们大学学习的真正目的所在。七.参考资料 王士元.C高级实用程序设计.北京:清华大学出版社.1996 周纯杰,刘正林等.标准C语言程序及应用.武汉:华中科技大学出版社.2005 谭浩强.C语言程序设计.北京:清华大学出版社,2000 C语言实用程序荟萃.西安:西安电子科技大学出版社.1993 另外我们在网上查询了很多资料,尤其是在百度百科当中学习到很多八.程序源代码/*****my.h*****/#include<graphics.h>#include<process.h>#include<bios.h>#include<alloc.h>#include<stdio.h>#include<dos.h>#include<conio.h>#include<stdlib.h>typedefstructnode0{ intbianhao; charmingcheng[11]; floatyuanjia; floatjiage; intruku; intkucun; intxiancun; structnode0*next;}shangpin;typedefstructnode1{ intryflag; charname[11]; charmima[11]; structnode1*next;}renyuan;#defineKey_Down0x5100#defineKey_Up0x4900#defineKey_Esc0x011b#defineKey_Enter0x1c0d#defineKey_Space0x3920#defineKey_Shift_b0x3042#defineKey_Shift_c0x2e43#defineKey_BackSpace0x0e08/*****主函数*****/voidmain(){ intgd=VGA,gm=VGAHI;//用于图形界面初始化 intkey,x,y,mflag=0,dlflag=0,rsflag=0;//主菜单功能选择标记,登陆人员职能选择标记,顾客人数标记 intmx=320,my=240,mbutt=0;//鼠标 renyuan*ryhead=rycreat();//创建人员链表 shangpin*sphead=spcreat();//创建商品链表 intn=0,q=0,a[18],x1[18],y1[18],c[18];//用于模拟销售,总顾客人数最多18人。总顾客数目,定位所选顾客标记,顾客所走步数,顾客所在横坐标,顾客所在纵坐标,顾客所购买商品及顾客颜色标记 charstr1[11],str2[11];//登陆时输入用户名和密码 char*menu[]={"编辑","查询","返回","退出"}; char*xs[2][5]={{"编号","名称","价格","现存","已售"},{"编号","名称","总入库","总出库","库存"}}; char*ms,*msp;//ms用于显示鼠标,msp用于恢复原鼠标所在位置画面 initgraph(&gd,&gm,"C:\\TC30\\BGI");//图形界面初始化 cleardevice(); mouse(&ms,msp);//画鼠初始化 while(1) { hyjiemian();//欢迎及登陆界面绘制 while(1)//欢迎登陆界面 { read1(&mx,&my,&mbutt,ms,msp); dlxz(mx,my,mbutt,&dlflag);//选择登陆人员职能 if(denglu(ryhead,mx,my,mbutt,str1,str2,dlflag))break; rybj(ryhead,&mx,&my,&mbutt,dlflag,&ms,msp);//人员编辑功能 } zhujiemian(sphead,menu,xs); while(1)//主界面 { read1(&mx,&my,&mbutt,ms,msp); menuxz(mx,my,menu,&mflag);//主菜单功能选择 if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)//模拟销售开始选择 { if(moni(sphead,&rsflag,/*&txflag,*/&n,&q,a,x1,y1,c)) { tixing(sphead); } } if(mflag==4&&mbutt==1)//结束整个函数 { jieshu(); } elseif(mflag==3&&mbutt==1)//返回登录界面 { dlflag=0; break; } elseif(mflag==1&&mbutt==1&&dlflag==1)//商品信息编辑功能 { spbj(sphead,&mx,&my,&mbutt,&ms,msp,c); zhujiemian(sphead,menu,xs); } elseif(mflag==2&&mbutt==1)//商品信息查询功能 { spcx(sphead); zhujiemian(sphead,menu,xs); } } }}/*****creat.c*****/renyuan*rycreat()//用户链表{ FILE*fry; renyuan*h,*p,*s;//*h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点 if((h=(renyuan*)malloc(sizeof(renyuan)))==NULL)//分配空间并检测 { printf("noenoughmemory!"); exit(0); } h->ryflag=0;//把表头结点的数据域置空 h->name[0]='\0';//把表头结点的数据域置空 h->mima[0]='\0';//把表头结点的数据域置空 h->next=NULL;//把表头结点的链域置空 p=h;//p指向表头结点 if((fry=fopen("c:\\TC30\\BIN\\chaoshi\\renyuan.txt","rt"))==NULL) { printf("unabletoopen!"); exit(0); } rewind(fry); while(!feof(fry)) { if((s=(renyuan*)malloc(sizeof(renyuan)))==NULL)//分配新存储空间并检测 { printf("noenoughmemory!"); exit(0); } p->next=s;//把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了 fscanf(fry,"%d%s%s\n",&s->ryflag,s->name,s->mima); s->next=NULL; p=s; } fclose(fry); returnh;}shangpin*spcreat()//建立单链表的函数{ shangpin*h,*p,*s;//*h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点 inti;//计数器 chara[4][11]={"mianbao","yinliao","taideng","yusan"}; floatb[4]={1.5,4,38,12}; floatc[4]={1.2,3,28,7}; if((h=(shangpin*)malloc(sizeof(shangpin)))==NULL)//分配空间并检测 { printf("noenoughmemory!"); exit(0); } h->mingcheng[0]='\0';//把表头结点的数据域置空 h->next=NULL;//把表头结点的链域置空 p=h;//p指向表头结点 for(i=0;i<4;i++) { if((s=(shangpin*)malloc(sizeof(shangpin)))==NULL)//分配新存储空间并检测 { printf("noenoughmemory!"); exit(0); } p->next=s;//把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了 s->bianhao=(i+1);//编号 strcpy(s->mingcheng,a[i]);//名称 s->jiage=b[i];//价格 s->yuanjia=c[i];//原价 s->ruku=100;//入库 s->kucun=80;//库存 s->xiancun=20;//现存 s->next=NULL; p=s; } returnh;}/*****jiemian.c*****/voidzhujiemian(shangpin*h,char*menu[],char*xs[][5])//主界面绘制{ delay(30); setbkcolor(LIGHTBLUE); zhucaidan(menu);//主菜单 xscaidan(xs);//商品实时信息菜单 xiaoshou(h);//商品实时信息输出 yyjiemian(h);//模拟销售界面绘制 }voidhyjiemian()//欢迎及登陆界面绘制{ char*p[]={"管理员","普通人","用户名","密码","登录"}; intx,y; x=30,y=50; delay(50); cleardevice(); setbkcolor(BLACK); disphz16(x,y+8,10,3,YELLOW,"超市商品库存管理系统"); disphz16(x+3,y+8,10,3,RED,"超市商品库存管理系统"); disphz16(x+6,y+8,10,3,GREEN,"超市商品库存管理系统"); x=180,y=150; disphz16(x,y,20,4,YELLOW,"欢迎你!"); disphz16(x,y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024广告发布合同范文
- 公共场所环境卫生承包合同
- 北京交通事故损害赔偿协议书撰写指南
- 2024年交通事故调解协议书范例
- 2024清洁工劳动合同书样本
- 商品采购协议
- 2024工程建设招标投标合同(履约银行保证书)新
- 舞蹈学校教师聘请协议书
- 2024《技术服务合同范本》
- 2024共事协议书样式
- 人教鄂教版版五年级上册科学期末测试题
- (高清版)DZT 0213-2002 冶金、化工石灰岩及白云岩、水泥原料矿产地质勘查规范
- 消防安全评估消防安全评估方案
- 工程造价专业《工程经济》课程标准
- ZARA服装市场营销策略研究分析 市场营销专业
- 设备维保的市场化运作与服务模式创新
- 幼儿园科普知识宣传
- 中医减肥药方-超有效分类型
- 论现代外科技术的发展趋势
- 办公楼室外地面维修改造施工组织设计样本
- 小学科学试卷分析存在问题及整改措施4篇-
评论
0/150
提交评论