《自动售货机c编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
自动售货机C编程C语言课程设计报告题目:班级:组员:指导教师:上交日期:自动售货机自动售货机图形模拟仿真学号:学号:2011.5.13闇形模拟系统冃录1引1.1售货机的背景31.2编写目的31.3任务概述42需求分析2.1需求分析3.2运行环境
13系统设1.1功能需求描述2.2程序流程图3.3功能和操作简介(界面)3.4程序模块划分3.5程序中的名词定义及注释4算法分析3.1核心算法分析4.2其他函数算法分析5程序总结4.1编程过程中的疑难点处理5.2程序不足之处16组员分ェ7参考资料428具体函数解释及原代码422—.引言1.1背景自动售货机是能根据投入的钱币自动付货的机器是商业自动化的常用设备,它不受时间、地点的限制,能节省人カ、方便交易。是ー种全新的商业零售形式,又被称为24小时营业的微型超市。能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。
2自动售货机是一种全新的商业零售形式,20世纪70年代自日本和欧美发展起来。自动售货咖啡机是ー种既可以出冷热咖啡也可以同时出奶茶果汁饮料的咖啡饮料自动售货机,省时方便快捷。既可以作投资来使用,也可作为员エ福利来使用。现在,自动售货机产业正在走向信息化并进ー步实现合理化。24小时无人售货的系统可以更省力,运营时需要的资本少、面积小,有吸引人们购买好奇心的自身性能,可以很好地解决人工费用上升的问题等各项优点。1.1编写目的通过对自动售货机买卖商品的过程分析,建立模拟自动售货机的图形界面操作系统,对其投币、出货、统计等多个方面的功能模拟,实现模拟真实自动售货机的操作流程。此次C语言课程设计是本专业的第一次课程设计,具有重要的意义:通过上个学期对C语言的学习,对C语言编程有了初步的了解,获得了一定的基础但是非常缺乏实际的编程经验,无法从质上对自己的编程技巧有一个很大的提高,这次的课程设计给我们提供了一个非常好的锻炼机会。通过二个人的分工合作,在实际中运用和训练程序设计的模块化和工程化思想和技术,努力掌握C语言精髓;同时提高自己的交流与团队合作的能力.为以后的更专业更复杂的课程设计和实践活动打好基础。31.2任务概述自动售货机售货9种商品,价格分别为3元,5元和7元。顾客投入10元、5元或2元的纸币,然后选择购买9种商品之一,自动售货机吐出商品,并且找给用户零钱。如果商品售完,或者无法找零,则给出用户ー个提示,商品已售完,并且退还纸币。程序具备以下功能:库存查询:检索9种商品的储存量
3商品上架:为9种商品增加销售查询:分别统计今天每种商品的销售量和销售额会计查询:打印当天的往来帐目以及剩余零钞数目结算功能:能够取出金额销售界面:顾客投入纸币,选择商品,获得商品和零钱;或者直接显示错误并退还纸币要求以自动售货机为对象,图形化模拟投币、找零、出货的基本流程;能对售货机的商品进行管理:补货、查询、统计等功能。二.需求分析2.1需求分析自动售货机是ー种全新的商业零售形式,20世纪70年代自日本和欧美发展起来。它又被称为24小时营业的微型超市。在日本,70%的罐装饮料是通过自动售货机售出的。全球著名饮料商可口可乐公司在全世界就布有50万台饮料自动售货机。现在,自动售货机产业正在走向信息化并进ー步实现合理化。自动售货咖啡机是ー种既可以出冷热咖啡也可以同时出奶茶果汁饮料的咖啡饮料自动售货机,省时方便快捷。既可以作投资来使用,也可作为员エ福利来使用。4从自动售货机的发展趋势来看,它的出现是由于劳动密集型的产业构造向技术密集型社会转变的产物。大量生产、大量消费以及消费模式和销售环境的变化,要求出现新的流通渠道;而相对的超市、百货购物中心等新的流通渠道的产生,人工费用也不断上升;再加上场地的局限性以及购物的便利性等这些因素的制约,无人自动售货机作为・种必须的机器便应运而生了。现在,自动售货机产业正在走向信息化并进ー步实现合理化。例如实行联机方式,通过电话线路将自动售货机内的库存信息及时地传送各营业点的电脑中,从而确保了商品的发送、补充以及商品选定的顺利进行。并且,为防止地球暖化,自动售货机的开发致カ于能源的节省,节能型清凉饮料自动售货机成为该行业的主流。程。我们用TC3.0编写的C语言程序来模拟自动售货机的控制及各种操作过2.2运行环境(DOS环境)该系统给予tc2.0和bc3I开发,适用于dos3.0以上的所有dos版本和windows操作系统;本软件设计中加入了鼠标和键盘操作,因此操作过程必须依赖鼠标和键盘才能实现所有功能;本软件对于显示卡无特殊要求;本软件可以允许用户自定义ー些参数,具有良好的人机交互性。
4本软件主要的输入方式是数字输入,实际操作是通过键盘或者鼠标选择我们给出的汉化菜单选项。输出信息也将采用汉化的窗口(包括弹窗)传递给用户。除此之外无其他特殊要求;出现图形无法显示或图形显示效果差——处理办法;检查显示卡驱动是否正常;出现某些子程序的初始化无法正常完成——处理办法;显示初始化失败的位置,并退出程序;出现空间分配失败——处理办法;显示为内存不够,退出程序并检查内存利用情况;5三.系统设计3.1功能需求描述进入主界面,可以有管理员入口和顾客模式。顾客模式先,选择要购买的饮料。如有库存则出货,选择投硬币和投纸币,其中纸币有2元5元10元可以供选择,选择完币值后,按键确定,在出币扣找零。管理员模式先点击钥匙口(key),会弹出ー个对话框要求输入密码确定权限,进入后可查询各种饮料的剩余量和售量、销售币额以及顾客购买的时间。管理员还可以进行密码的修改。3.2程序流程图(见附录)3.3功能和操作简介(界面)菜单界面——点击“帮助”出现如图上的界面,按键ESC退出;点击“退出”,则退出系统;点击“buy”进入售货模式;点击
5“key”进入管理模式6点击“buy”后进入售货模式,选择商品,当鼠标到对应商品时会出现箭头提示单击选择商品,系统会查看选择的
6商品是否还有存货,如果有会进入投币环节,如果没有,则输出无存货,然后对出售货模式。,M)SI«sDT?,C*«Crdat僵s’"就工,技工“退出当R県况,,,■•・動・,进入投币环节,当鼠标移到投纸币窗ロ时,会出现下拉式菜单,用于选择投入纸币的面额,当鼠标移到投硬币的窗口单击,会投入一元硬币,若投入,会有提示,并显示此时投入的总额。按键ENTER表示确定。(如单击10元,右边会显示"投入币额:10元”)
7图DOSBo*0.72,CpuCycles:Prograa:TC-l-lX|自动售货机图形模拟系裝帮助退出按ENTER确定,按Esu退出当前界面
87
9-I-lx|按ENTER确定,按E”退出当前界面显示找零,并且会显示找出的几个硬币,几张多少面值的纸币,
10帮助(张张张1100硬纸纸纸元^兀元元ー两五十然后物品从里面出来。
118如果点击“key”,则进入管理界面,进入管理界面是会要求先输入密码,按键ENTER表示确定,如果正确就进入管理的菜单,否则退出管理模式。进入管理菜单:会选择对应的功能,通过售货机右中部的小键盘选择对应的功能。然后系统会根据小键盘返回的值执行各个功能函数。
12瑞DOSBox自动售货机图形模拟系第-I"1x|帮助退出按ENTER确定,按Esc退出当前界面功能1:制表,显示各个物品的信息。,甚给询盘^^查图胃膏膏形选择功能9存量售量收额可乐30〇〇苏打30〇〇柠檬30〇〇牛妍30〇〇桃汁30〇〇橘汁2915红茶30〇〇绿茶30〇〇如啡30〇〇总量26915
13功能2:对9中商品补货,全部补齐,途中会显示loading。。。。。。功能3:补单货,选择物品,对其存量补齐。功能4:格式化,对所有的数据格式化。功能5:查询毎次物品卖出的时间功能6:做系统智能画条形图,并显示售货额最高的物品。按键ENTER确定,显示销售额最高的物品。按键ESC退出功能功能7:更改密码。功能8:显示售货机里钱币的数量,并取出一定币额。
14
1510loAdir19«mm退出界面
16单击“退出”显示的退出动画。按键ENTER退出此界面。3.4程序模块划分在程序模块的分析中,为了方便理清函数之间的调用关系,我们采用了函数级别的定义方式。自顶向下级次增髙,在某些模块中被多次调用的小功能函数定义为该模块的工具函数。故main函数被定义为ー级函数,在main函数中被直接调用的子函数定义为二级函数,依此类推主函数模块:#include"main.h"voidmain()intgdriver,gmode;11
17MENUPOSITION*pm;gdriver=DETECT;initgraph(&gdriver,&gmode,*c:\\tc30\\bgiO;//图形驱动welcome();//欢迎的界面draw。;〃画界面menu(pm);〃菜单函数,进入系统)主函数main〇中除了调用welcome。函数显示欢迎画面和draw〇函数画售货机界面;,主要子函数是调用的menu。函数。menu。函数即菜单选择模块的根函数。下面分别来介绍这个主要模块。ー、图形模块:主要是界面二、鼠标模块:包括鼠标的图形,鼠标状态。三、汉字模块:中文显示四、菜单模块:1.顾客模式:a.选择货物b.投币c.找零(面值优先)a.密码b.库存查看与添加c.取走和填补销售金额2.管理员模式:d.商品销量统计制表制图五、文件模块:保存销售和库存的信息六、时间模块:显示时间,并记录售货的时间资料菜单选择模块:此模块用于菜单界面的显示,实现菜单按钮和鼠标的各种功能。本模块的核心函数:voidmenu()(属于二级函数)本模块的三级函数:(被voidmenu〇调用)work〇核心函数,模拟自动售货机的物品买卖功能manage()核心函数,自动售货机管理物品信息的功能函数help〇系统帮助函数
18thank()界面退出函数,退出界面bklight()设置高亮12其中manage()里面又有一个子菜单的函数leadmanage〇,用于对系统管理功能的选择,属于四级函数。其中!eadmanage()里的五级函数有voidinitallgoods()对物品补全货的函数voidinitsinglegoods(MOUSESTATE*pm)对单个物品补货的函数voidsearch()I皿表格显示物品信息的函数数据格式化的函数voidrefresh()voidsearchsold(MOUSESTATE*pm)査询单次售货的时间voidoutinformation(MOUSESTATE*pm,intn)弹出消息提示的函数voidautodrawbargraph()智能画条形图函数voidsuggest()显示销售额最高的商品leadmanage()会调用function,cpp里的各种功能函数,包括一些其他cpp文件里的函数模拟自动售货机售货模块(核心)voidarrow(GOODSDATE*pgc):箭头intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg);选择物品函数intchoosemoney(MOUSESTATE*);投币,返回单次投币的数额voidinsertall(MOUSESTATE*,int*);通过choosemoney的循环,退出后计算总投币!3voidbuy(GOODSDATE*,int);传入选择的物品信息和总投币额,进行买卖操作的函数voidshowinsertall(int);显示总头币额的函数以上的函数为work的核心调用函数,还有其他的对文件操作的函数,用于对物品信息的储存,下面将在文件模块中说明。另外此函数将在算法分析中进行解释与分析。
19文件模块voidgoodsfilesave(GOODSDATE*pg)物品信息储存到文件voidgoodsfileread(GOODSDATE*pg)从文件读取物品信息voidpasswordsave(char*ps)密码文件保存voidpasswordread(char*ps)密码从文件中读取voidsold_file(GOODSDATE*pg,SOLDFILE*ps)物品售货单次的信息操作存入文件voidshowsold_file(SOLDFILE*ps,int*n)从文件中读取物品单次操作信息的函数voidmoneynumsave(MONEYNUM*pmn);钱币数量的储存voidmoneynumread(MONEYNUM*pmn):钱币数量的读取鼠标汉字模块voidshubiaoO对鼠标初始化voidcursor(inta,intb)在(a,b)点面鼠标14intread(int*x,int*y,int*buttons)调用中断来读鼠标的状态如果鼠标不动,这ー直在里面循环,直到鼠标状态改变或是按键,就退出循环voidneyxy(int*x,int*y,int*buttons)鼠标移动的函数,通过read的返回值在异或的模式下,覆盖原来的鼠标和画新的鼠林。Outtextxy(int,int,char*,int)汉字输出动画图形模块
20voidoutgoods(intn)商品出货动画的函数voidoutmoney(intn)吐币函数Voidthank();退出系统的动画Voidwelcome();进入系统的动画辅助模块voidbklight(MENUPOSITION*p,MOUSESTATE*pms)设置高亮voidloading()模拟等待过程的动画函数intinputpassword(char*s,intn)专用于密码输入的函数intreadboard(MOUSESTATE*pm)小键盘的读取,返冋键盘值intmouseonkey(KEYBOARD*pm)判断鼠标是否在小键盘上相应的位置,如果是,返回1voidoutinformation(MOUSESTATE*pm,intn)弹出消息提示的函数voidcheckcount(intagoods[9])读取商品的售量函数151ntmouseon(MENUPOSITION*pm)判断鼠标是否在菜单项的位置上voidarrow(GOODSDATE*pgc):箭头时间模块voidbuytime(SOLDFILE*p)纪录购买货物的时间读取系统的时间,并赋值到结构中的长整型变量t,以文件的形式把结构中的数据存储下来3.5程序中的名词定义及注释I.对文件名(♦.cpp)的解释
21MAIN.CPP主函数BACKPH.CPP用于画界IkBKUGHT.CPP鼠标高亮BUY_TIME.CPP读取系统时]COUNTCPP条形图的显示[FUNCTION.CPP(核心)附有管理员助GOODS.CPP对物品的文件[GUANLI.CPP进入管理员界面的rHANZI.CPP用于中文汉字4HELP.CPP系统的helpリMENU.CPP进入系统的memMOUSECPP对鼠标操作OUTGOODS.CPP物品出货动iPASSWORD.CPP对密码操作SOLDFILE.CPP每次购买信息存盘体THANK.CPP退出系统的マWELCOME.CPP进入系统的ゆWORK.CPP(核心)购买物品购买物品162.程序中的结构定义:typedefstructmenuintxl;intyl;
22intx2;inty2;〃四个角的坐标intrx;intry;〃输出headline的左上点的坐标char*headname;}MENUPOSITION:主界面菜单栏结构对菜单的操作时,用于鼠标点击时判断位置。typedefstruct_mouseIintmousex;intmousey;〃鼠标的坐标点intbuttonsJ〃鼠标按键click的状态}MOUSESTATE;鼠标结构17MONEYNUM.CPP对钱币的数量的管当图形界面转换时,需要传递鼠标的位置,以免留下鼠标印。typedefstructsoldfile(longt;〃购买的时间,从系统中读取intlabel;〃商品的标号char*name:〃商品的名字intpricei〃商品的价格JSOLDFILE;已售出货物的结构此结构用于当每次对物品操作时,保存单次记录,以存入文件中。typedefstruct_goods(
23intlabel;〃商品的标号char*name;〃商品的名字intprice;〃商品的价格intsavenum;〃商品的存量intsoldnum;〃商品的售量intgoodsincome;〃商品的销售额intx,y;〃图形界面上的商品的坐标18JGOODSDATE;货品信息结构用于对物品信息的处理。typedefstruct_key(intxl;intyl;intx2;inty2;〃小犍盘上按犍的四个顶点的坐标char*str;〃小键盘上键的符号}KEYBOARD:界面小键盘按键结构typedefstruct_moneynumintvalueone;〃一元硬币的数量intvaluetwo;〃两元纸币的数量intvaluefive;〃五元纸币的数量
24intvaluetenJ〃十元纸币的数量}MONEYNUM:钱币数量的结构3.函数名词定义及解释4.BACKPH:包含函数voiddraw〇用于构建主菜单的图形界面2.BKLIGHT:包含函数voidbklight(MENUPOSITION*p,MOUSESTATE*pms)19设置高亮3.BUYTIME:包含函数voidbuytime(SOLDFILE*p)纪录购买货物的时间4.COUNT:包含函数voidcheckcount(intagoods[9])读取商品的售量函数voidautodrawbargraph()智能画表形图函数voidsuggest()显示销售额最高的商品5.FUNCTION:包含函数voidinitallgoodsO对物品补全货的函数voidinitsinglegoods(MOUSESTATE*pm)对单个物品补货的函数voidsearch()画表格显示物品信息的函数数据格式化的函数voidrefresh()voidsearchsold(MOUSESTATE*pm)查询单次售货的时间voidoutinformation(MOUSESTATE*pm,intn)弹出消息提示的函数6.GOODS:包含函数voidgoodsinit(GOODSDATE*pg)对物品信息的初始化
25voidgoodsfilesave(GOODSDATE*pg)物品信息储存到文件voidgoodsfileread(GOODSDATE*pg)从文件读取物品信息2.GUANLI:包含函数voidmanage(MOUSESTATE*ms)管理界面的“主函数”voidleadmanage(MOUSESTATE*p)管理的界面的菜单函数intreadboard(MOUSESTATE*pm)小键盘的读取,返回键盘值20intmouseonkey(KEYBOARD*pm)判断鼠标是否在小键盘上相应的位置,如果是,返回13.HANZI:汉字库此cpp是用作汉字输出的调用,非编者编写4.HELP:包含函数voidhelp()menu中的帮助选项5.INPUT:包含函数intinputpassword(char*s,intn)专用于密码输入的函数intinput(char*s,intn)用于一般的信息输入11LOADING:包含函数voidloading()模拟等待过程的动画函数12.MAIN:VoidmainO主函数13.MENU:包含函数voidmenu(MENUPOSITION*pm)初始化菜单中的选项voidchoose(MENUPOSITION*pm)菜单选择函数intmouseon(MENUPOSITION*pm)判断鼠标是否在菜单项的位置上14:MOUSE:鼠标函数voidshubiaoO对鼠标初始化
26voidcursor(inta,intb)在(a,b)点画鼠标intread(int*x,int*y,int*buttons)21调用中断来读鼠标的状态如果鼠标不动,这ー直在里面循环,直到鼠标状态改变或是按键,就退出循环voidneyxy(int*x,int*y,int*buttons)鼠标移动的函数,通过read的返回值在异或的模式下,覆盖原来的鼠标和画新的鼠标。15:OUTGOODS:包含函数voidoutgoods(intn)商品出货动画的函数voidoutmoney(intn)吐币函数16PASSWORD:包含函数voidout_text(int);password中人机对话的函数voidpasswordsave(char*ps)密码文件保存voidpasswordread(char*ps)密码从文件中读取voidpasswordmodefy()修改密码的功能intpassword()进入管理界面时判断输入密码是否正确17:SOLDFILE:包含函数voidsold_file(GOODSDATE*pg,SOLDFILE*ps)物品售货单次的信息操作存入文件voidshowsold_file(SOLDFILE*ps,int*n)从文件中读取物品单次操作信息的函数18:THANK:Voidthank();退出系统的动词19:WELCOME:Voidwelcome();进入系统的动画
2720:WORK:22voidarrow(GOODSDATE*pgc):箭头intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg);选择物品函数intchoosemoney(MOUSESTATE*);投币,返回单次投币的数额voidinsertall(MOUSESTATE*,int*);通过choosemoney的循环,退出后计算总投币voidbuy(GOODSDATE*,int);传入选择的物品信息和总投币额,进行买卖操作的函数voidshowinsertall(int);显示总头币额的函数voidwork(MOUSESTATE*ps)核心函数21:MONEYNUM:voidinitmoneynum(MONEYNUM*pmn);初始化钱币的数量voidmoneynumsave(MONEYNUM*pmn);钱币数量的储存voidmoneynumread(MONEYNUM*pmn);钱币数量的读取voidmoneynumadd(int,MONEYNUM*);钱币数量相加voidinitmoneynumzero(MONEYNUM*pmn);设置钱币数量全为〇voidmoneynumwithdrawO;显示钱币数量后取币额intmoneynumdepend(MONEYNUM*pmn,MONEYNUM*ppmtemp,intallmoney);钱币数量判断函数,判断是否可以找零voidmoneynumshow(MONEYNUM*pmn);钱币数量显示函数23四.算法分析4.1核心算法(work)的分析work函数主要由外部函数outgoods(int)outmoney(int)和内部函数
28voidarrow(GOODSDATE*pgc)intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg)intchoosemoney(MOUSESTATE*)voidinsertall(MOUSESTATE*,int*)voidbuy(GOODSDATE*,int)voidshowinsertall(int):构成主要流程为先执行choosegoods函数选择货物,通过指针返回货物编号并读取货物信息,判断货物是有存量之后执行下・步操作,否则提示并返回。确定有存货后开始投币。voidinsetall函数与intchoosemoney函数处于同一・级别,在投币的同时计算投币总量并显示存储起来。投币结束enter键确认,进入buy函数。buy是整个work中最重要的部分,首先判断投币总额与选择货物时返回编号的货物的价格进行选择,如果投入金额小于价格则提示并退出;当投入金额大于价格时,首先对货物的信息进行处理,即更改货物的存量与售货量。然后处理・块图形区域,显示售货信息。24下面分析算法中的重难点:1staticGOODSDATEa[9];goodsfileread(&a[0]);〃读取货品信息intn,insertmoney,flag;n二choosegoods(ps,&a[〇]);〃选货,返回货品号(labelT)在主函数的最开始,读取9种货物的物品信息。在整个程序中,都是用指针通过传递货物的标号来读取货物信息进行处理的!2goodsfilesave(&a[0]);程序的最后对被处理的货物数据要进行储存。3选择货物时使用FOR循环for(;;)〃通过鼠标的位置读取货品信息通过指针传递(循环)25{newxy(&ps->mousex,&ps->mousey,&psー〉buttons);if((ps->mousex)く=73&&(ps-
29>mousex)>=49&&(ps->mousey)>=133&&(ps->mousey)<=165)〃鼠标处于第一个货物图形区域{arrow(pg+0);〃显示箭头if(ps->buttons){cursor(ps->mousex,ps->mousey);x=0;〃选定货物returnx;〃返回货物编号}通过鼠标的位置传递,来显示出帮助的箭头。点击鼠标后返回货物的编号,在今后的处理中,都通过编号读取的货物结构信息来处理数据并储存。4while(l){newxy(&ps->mousex,&psー〉mousey,&psー〉buttons);26if(ps->mousex>=185&&ps->mousex<=215&&ps->mousey>=160&&ps->mousey<=170)〃计算投入纸币时钱币总量cursor(ps->mousex,psー〉mousey);*allmoney=*alImoney+choosemoney(ps);〃投币{if(ps->buttons=l){总量等于之前投币总额加上目前投币面值//printf("%d〃,*allmoney);cursor(ps->mousex,ps-〉mousey);showinsertall(*allmoney);〃显示目前已投币总额}ps->buttons=0;在insertall函数中,使用while循环计算投币总量,很好理解。中间插入的showinsertall函数即分配ー块区域进行投币是的提示信息。所以在最后需要做处理:if(bioskey(1)){if(bioskey(0)==ENTER)27{setfillstyle(l,0);bar(390,90,620,120):〃投币完毕之后将界面中显示金额总量的图形区域初始化break;〃跳出psー〉buttons二〇;curstoxy(ps);cursor(ps->mousex,ps->mousey);将显示金额总量的图形区域初始化并跳出。方便后续操作5在处理投币的时候对纸币做了一个指针数值:
30char*value[]={〃RMB:2","RMB:5〃,“RMB:10"};〃定义纸币的指针数组6在后续操作中都是处理纸币信息储存的地址:outtextxy(185,180,value[〇]);outtextxy(185,200,value[l]);outtextxy(185,220,value[2]);买卖函数(投币金额大于价格的情况):28if(a>=pg->price)〃投币大于价格{pg-〉savenum=pgー〉savenumT;//存货减ーpg->soldnum=pg->soldnum+l;〃已售货物数量加一sold_file(pg,psf);rest=a-pg->price;〃剩余金额等于投币额减去价格buff=malloc(imagesize(390,90,620,130));getimage(390,90,620,130,buff);OutTextxy(400,100,"售货成功!”,4);delay(1000);putimage(390,90,buff,0);itoa(rest,ch,10);setusercharsize(2,1,2,1);outtextxy(440,105,ch);OutTextxy(400,100,"找零元",4);delay(1000);putimage(390,90,buff,0);setwritemode(1);free(buff);outgoods(pg-〉label);outmoney(rest);29delay(100);首先对货物数据进行操作再对图形进行处理,提示信息。使其有足够内存。最后再将显示帮助信息的区域初始化。7voidshowinsertall(intmoney)
31在显示投币总量函数中使用sprintf系统函数,使数字与字符串ー起显示。而在之前的程序中我们并未掌握这ー函数所以是先使用!toa(rest,ch,10);itoa函数将数字转化为字符串再和汉子ー起输出显示。setfillstyle(l,0);chars[80];bar(390,90,620,120);sprintf(s,”投入币额:%d元”,money);OutTextxy(390,90,s,4);4.2其他算法的分析1.guanli.cpp里的函数算法分析30进入管理模式时,会要求输入密码flagニ〇;flag二password();〃返回值为1则表示输入密码正确Ileadmanage(ms);//shouliangchunhuohuochunchakanqubie}manage();if(flag==l)a=readboard(p);//readboard是读取小键盘的按键值的函数返回值a,用swith(a)来选择功能switch(a)对应各种功能〃(case1:search();break;case2:initailgoods();break;case3:initsinglegoods(p);break;case4:refresh();
32break;case1:searchsold(p);break;case2:printf();//demandautodrawbargraph();suggest();break;case3:passwordmodefy();break;case4:moneynumwithdraw();break;default:break;}leadmanage();1.count.cpp里的函数算法分析在这个cpp文件里,有一个只能画条形图的函数autodrawbargraph(),它会31更具物品的数量画出条形图!for(i=0;i<9;i++)(if((maxくgoodsnumLi」)max=goodsnum[i];)〃找出售量最大的物品的售量数longmax=350/max;〃用于确定条形图的,个售量的高度(y轴的单位长度)这里用longmax,就是为了控制售量最多的商品的条形图的最高点,其他数量可以根据这个比例,画出相应高度的棒状图。2.function.cpp里的函数算法分析
33在这个cpp文件里,有很多功能函数,都是对数据的处理,其中有个函数voidsearchsold(MOUSESTATE*pm),用于显示每次购买的时冋。p二gmtime(&(ps->t));〃转化时间,将文件读取的物品结构中的t〃sprintf(s,"%s%d—%02d—%02d%s%02d:%02d:%02d/z,a[ps->label-l],(1900+p->tm_year),(l+p->tm_mon),(p->tm_mday),wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);outtextxy(370,90,s);其中P是ー个系统定义的结构,用于把时间转换为年月日时分秒。以上是其显示的语句。由于物品的购买次数会很多,所以不可能一次在屏幕上显示所有的的信息,于是我们,把他们分为每12个ー组,每次显示12个。于是又操作页面,点击进入“上一页”或是“下ー页”或是“退出"。while(l)newxy(&pm->mousex,&pm->mousey,&pm->buttons);if(pm->buttons==l)〃如果鼠标点击32if(pm->mousex>370&&pm->mousex<420&&pm->mousey>300&&pm->mousey<320)〃点的是“上一页”的按钮if(ptoiニニ〇)〃如果是第一页outinformation(pm,0);〃第一页thefirstone,提示已到最前ー页pmー〉buttonsニ〇;delay(200);continue;〃继续循环}else〃不是第一页(
34ptoi=ptoi-l;〃往前减少ー页个setfillstyle(l,0);bar(365,85,639,298);for(i=ptoi*12,j=0;i<(12+ptoi*12);i++,j++)//从前ー页的第一个物品,显示12{p=gmtime(&((ps+i)->t));sprintf(s/%s%d—%02d—%02d%s%02d:%02d:%02d,z,a[(ps+i)->label-l],(1900+p->tm_year),(l+p->tmmon),(p->tmmday),wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);outtextxy(370,90+j*14,s);)pm->buttons=0;delay(200);continue;〃继续循环}}if(pm->mousex〉450&&pmー〉mousexく500&&pmー〉mousey>300&&pmー〉mouseyく320)〃判断是否点在“下ー页”if(ptoi>=ptoimax|(ptoirest=0&&ptoi==ptoimax-l))〃如果是最后ー页outinformation(pn),1)J〃最后ー页thelastone,提示这是最后ー页pmー〉buttonsエ。;delay(200);continue;〃继续循环}else〃如果不是最后ー页{33//printf(,zzz);setfillstyle(l,0);bar(365,85,639,298);if(ptoi 35ptoi=ptoi+l;〃页数加1,显示12个for(i=ptoi*12,j=0;i<(12+12*ptoi);i++,j++){p=gmtime(&((ps+i)->t));sprintf(s/%s%d—%02d—%02d%s%02d:%02d:%02d,z,a[(ps+i)->label-l],(1900+p->tm_year),(l+p->tmmon),(p->tmmday),wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);outtextxy(370,90+j*14,s);}pm->buttons=0;delay(200);continue;〃继续循环}else〃如果是倒数第二页{ptoi=ptoi+l;/Z页码加1for(i=ptoi*12,j=0;i 36主要实现代码为while(l)m=0;k=bioskey(0);if(k==ESC)break;switch(k)caseENTER:if(i=0)continue;else{m=l;break;〃输入操作过程}caseBACKSPACE:if(i>0&&strlen(s)>0){}s[—i]=\0*;bar(473,145,600,165);for(j=0;jくstrlen(s);j++){outtextxy(473+j*8,155,"*");}continue;35}else{continue;}default:重点看这里,在输入字符s[i]=k;s的最后一位是此字符s[i+l]=‘、〇';然后输出s长度减1的for(j=0;j 37)alImoneytemp=alImoney-pmtemp.valueten*10;〃此时allmoney为找完十元的剩余a2=allmoneytemp/5i〃表示a2为可以找5元的数量if(a2<=pm.valuefive)〃如果此5元数量小于售货机中的存量{pmtemp.valuefive=a2;〃pmtemp表示退出的钱币的数量的结构}else(pmtemp.valuefive=pm.valuefive;al1moneytemp=al1moneytemp-pmtemp.valuefive*5;止匕后以此类推a3=allmoneytemp/2;if(a3<=pm.valuetwo){pmtemp.valuetwo=a3;}elseipmtemp.valuetwo=pm.valuetwo;}allmoneytemp=al1moneytemp-pmtemp.valuetwo*2;if(allmoneytemp<=pm.valueone)(pmtemp.valueone=alImoneytemp; 38pm.valueone=pm.va1ueone-pmtemp.valueone;〃减去找出的钱币的数量pm.valuetwo=pm.valuetwo-pmtemp.valuetwo;pm.valuefive=pm.valuefive-pmtemp.valuefive;pm.valueten=pm.valueten-pmtemp.valueten;*ppmtemp=pmtemp;moneynumsave(&pm);return1;〃表示有可以找的零钱}else{37return0;〃表示没有足够的钱找零}在完成这个目标时,我们以条件优先考虑,先从大的面额开始找零,然后再一次降到面额小的钱币。这样不会漏掉任何ー种情况,而且能够很好的模拟出真是的情况五.程序总结5.!编程中的疑难点分析1.鼠标问题由于这个程序是一个模拟自动售货机的图形系统,所以鼠标操作自然是很重要的,在我们ー开始,我们想借鉴书上的鼠标操作函数,可是发现,如果不懂其中的原理,会在画完图,尤其是调用完putimage〇函数后,会有鼠标印的留下。但是,后来研究鼠标,发现其用的是异或的原理,这个是指能够在原来的的地方把鼠标覆盖掉,所以每次我都会改写setwritemode()为异或的形式。可是在work的函数中,当我们遇到了一个很棘手的问题,就是在确认投币完,按下enter键后,•定要移动鼠标,才能继续执行后面的文件,由于当时不会会用debug,我只能用getch〇或者printf〇来判断程序执行到哪了。这个问题在后来オ发现是因为在按下回车时,鼠标一直处于静止状态,它就一直停留在read的while(1)循环里,因为之前设定的,只有当鼠标移动的时候,オ退出循环,我们来看一下源代码。38do{regs.x.ax=3;int86(51,®s,®s);xnew^regs.x.ex:ynew=regs.x.dx:*mbutt=regs.x.bx;}while(xnew==xxO&&ynew==yyO&&*mbutt==butO); 39可见只有在不满足while里的情况时,オ退出来,可是,我们需要按下键就退出来,于是又来我们在循环里加上了几条语句do{regs.x.ax=3;int86(51,®s,®s);xnew=regs.x.ex;ynew=regs.x.dx;*mbutt=regs.x.bx;if(bioskey(D)〃加上后,只要按键就退出循环{return4;}}while(xnew==xxO&&ynew==yyO&&*mbutt==butO);鼠标问题还不只这点,当我确认投币后,会有一些小动画,物品出货,退币等,此时,我若移动鼠标,那么在动画完了后,就会留下两个鼠标印。我当时一直以为是dosbox的bug,可是在学会用debug后,我ーー运行,オ发现是因为我的鼠标数据都存在ー个结构中。而在buy()的函数里,程序不用鼠标,所以存入的数据是之前的数据,在我执行buy的途中,移动了鼠标,这会在移动之前的位置画一个,然后又在现在的位子画一个鼠标印。后来我在执行完buy后,调用一下read函数buy(&a[n],&pmn,insertmoney);read(&ps->mousex,&ps->mousey,&ps->buttons);cursor(ps->mousex,ps->mousey);39setwritemode(1);成功的解决了这个鼠标印的问题。1.内存分配释放问题因为这个程序是ー个对图形界面操作的函数,自然要对图形大量的操作,我们知道,在我们用到getimage〇时,我们都会用到指针指向malloc开辟的一处连续的内存,可是,我们经常会发现如果图形比较大,那么malloc开辟不了那么大的内存,就会自动退出来,所以我们只能在开辟小的图形窗口下,对图形的操作,但是如果需要大的图形窗U,我们也只能在原来的图上操作完后,用单调的背景来覆盖。比如分配buff=malloc(imagesize(375,85,625,450));if(buff==NULL)IprintfCnotenoughmemory);exit(0); 40}分配这么大的就会退出来后来我们直接用setfillstyled,0);bar(375,85,625,450);完成了图形的覆盖可是,在后续的编写中,当我们添加了对文件的操作时,程序又自动退出来,我以为是有分配不了内存了,我就一直纠结在,图形内存的分配上。不过,突然灵感来了,我想肯定是之前有内存没有释放,可是我检查了每次分配内存我都释放了。于是我,就在用printf()一个个找,后来发现居然是文件分配不到内存,因为我在调用文件操作的函数时,我已经对图形分配了内存,而且没有释放它,而是在调用文件后才释放。后来我将对文件操作的函数malloc的前面,这样就解决了内存分配的问题。1.出货物品颜色问题由于在画图时,对物品的画法,是用了一个二重循环花的。结果它是先竖着画了3个,然后在右边接着竖着画3个,在接着竖着画3个,导致我们在做。utgoods〇时,始终不能配上合适的颜色,后来我オ发现自己是上面的错误。然后用了一个数组解决了问题。画图时的代码for(i=0;i<3;i++){40for(j=0:j<3:j++,ic++){setfillstyle(l,i+ic+4);其中颜色的选取是(i+ic+4)sector(61+i*40,165+j*71,180,360,12,6);bar(49+i*40,133+j*71,73+i*40,165+j*71);setfillstyled,LIGHTGRAY);fillellipse(61+i*40,133+j*71,12,6);}〃易拉罐}选择+4是因为第一的瓶子是cola,所以化成红色的,ic为每次自加的数,本生就可以的,可是我又加了一个i,而i有时是1;有时是2;也有时是〇:而我的outgoods(intlable)里的颜色选取是inta[9]={l,4,7,2,5,8,3,6,9);setfillstyled,a[nT]+3+(a[nT]T)/3);我们来看看,a[n-l]-l/3==i,a[n-l]+3=lable+4;所以刚好颜色ー样了。 414.2程序不足之处1.鼠标的颜色会因为背景的颜色改变而改变2.对取钱的环节没有做的很到位,没有设置功能选取各种币额取多少的功能3.界面的美化不行,高亮有bug存在4.结构中的有些定义没有用到,会降低程序的质量六,组员分エ6.1组员分工(界面设计和算法平均分配)刘骁康管理员模式(function.cpp>count,cpp)售货机界面及界面操作(backph.cpp、guanli.cpp)41文件的管理(goods,cpp、soldfile.cpp>moneynum.cpp)及其他边角函数1400行冯越顾客模式(work,cpp)进入退出界面(welcome,cpp、thank.cpp>outgoods.cpp)密码(password,cpp)输入框(input,cpp)1100行七.参考资料王士元.C高级实用程序设计.北京:清华大学出版社.1996周纯杰,刘正林等.标准C语言程序及应用.武汉:华中科技大学出版社.2005谭浩强.C语言程序设计,北京:清华大学出版社,2000陈超C语言常用函数速査手册.北京:化学工业出版社2010ハ,函数具体解释及原代码******************主函数main,cpp********************#include"main.h"voidmainOiintgdriver,gmode; 42MENUPOSITION*pm;gdriver=DETECT;initgraph(&gdriver,&gmode,"c:\\tc30\\bgi");welcome();42draw();menu(pm);)*************************1^1backph.cpp***************************#include"backph.h"voiddraw()Iinti,j,ic=0;intd4ロ={33,345,170,345,150,395,53,395,33,345):〃多边形坐标//intd7ロ={260,100,20,100,82,38,322,38,322,358,260,420,260,100,322,38};charnum[12][2]={"1","2","3","4","5","6","7","8","9","〇”,"#"};setbkcolor(YELLOW);setcolor(WHITE);setfillstyled,WHITE);〃设置模式bar(0,0,639,35);//画背景setfillstyled,GREEN);bar(20,100,260,420);rectangle(28,108,252,412);fillpoly(7,d7);line(260,100,322,38); 43setfillstyled,WHITE);bar(20,100,260,420);setcolor(GREEN);rectangle(28,108,252,412);rectangle(25,105,255,415);setcolor(GREEN);setlinestyle(O,0,3);line(33,113,170,113);line(170,113,170,328);line(170,328,33,328);line(33,328,33,113);line(33,185,170,185);line(33,256,170,256);setcolor(WHITE);setlinestyle(0,0,0);〃画售货机轮廓43for(i二〇;iく3;i++){for(j=0;j<3;j++,ic++){setfillstyle(l,i+ic+4);sector(61+i*40,165+j*71,180,360,12,6);bar(49+i*40,133+j*71,73+i*40,165+j*71);setfillstyled,LIGHTGRAY);fillellipse(61+i*40,133+j*71,12,6);}〃易拉罐}setlinestyle(0,0,3);setcolor(GREEN);drawpoly(5,d4);rectangle(58,345,145,380);//饮料瓶出口rectangle(185,160,215,170);setcolor(LIGHTGRAY);rectangle(230,145,236,160);rectangle(230,174,236,189);pieslice(233,167,0,360,2);setlinestyle(0,0,1);setcolor(GREEN);rectangle(180,164,220,166);OutTextxy(175,137,〃请投币",4);/Z投币窗口setlinestyle(0,0,3);rectangle(185,200,233,261);setlinestyle(0,0,1);rectangle(188,203,230,258);for(i=0,ic=0;i<4;i++){for(j=0;jく3;j++){rectangle(191+j*13,206+i*13,201+j*13,216+i*13);outtextxy(193+j*13,208+i*13,num[ic]);ic++;}}/Z输入键盘setcolor(RED);outtextxy(38,120,/ZRMB:3.00");outtextxy(38,191,"RMB:5.00");44outtextxy(38,262,“RMB:7.00");for(i=0,ic=0;i<3;i++) 44for(j=0;j<3;j++)outtextxy(59+j*40,173+i*71,num[ic]);ic++;}}//饮料旁边的价格settextstyle(3,0,0);settextjustify(LEFTTEXT,1);setusercharsize(2,5,2,5);setcolor(WHITE);outtextxy(50,149,"cola");outtextxy(90,149,"soda");outtextxy(130,149,"lemo");outtextxy(50,220,"milk");outtextxy(52,288,"ice");outtextxy(54,296,"tea");outtextxy(94,298,"tea");setusercharsize(1,3,2,5);outtextxy(90,220,"peach");outtextxy(132,220,"juice");outtextxy(90,288,"green");setcolor(BROWN);setusercharsize(2,7,1,2); 45outtextxy(130,291,"coffee");//饮料瓶上的字OutTextxy(10,460,”按ENTER确定,按Esc退出当前界面”,4);setlinestyle(0,0,1);**********************总菜单menu,cpp******************************#includemenu.h〃voidchoose(MENUPOSITION*);intmouseon(MENUPOSITION*);45voidmenu(MENUPOSITION*pm){inti;bar(183,280,230,300);bar(183,310,230,330);rectangle(205,317,209,323);rectangle(204,316,210,324);circle(207,320,10);circle(207,320,9);for(i=0;i<3;i++)(0utTextxy(20+i,10,〃自动售货机图形模拟系统〃,4);}OutTextxy(420,10,〃帮助〃,4);OutTextxy(520,10,"退出",4); 46OutTextxy(193,286,"buy",4);OutTextxy(193,330,"key",4);//drawMENUPOSITIONml[5];MENUPOSITIONtuichu={500,0,580,35,520,10,“退出"};//exitMENUPOSITIONbuy={183,280,230,300,193,286,"buy"};MENUPOSITIONkey={183,310,230,330,193,330,"key"};MENUPOSITIONhelpc={400,0,480,35,420,10,"帮助"};ml[0]=tuichu;ml[l]=buy;ml[2]=key;ml[3]=helpc;//pm=ml;choose(&ml[0]);getchO;closegraph();}voidchoose(MENUPOSITION*pm)(MOUSESTATE*pmouse;intkeyz;shubiaoO;pmouse->mousex=320,pmouse-〉mousey=240,pmouse->buttonsマ。;inti;cursor(pmouse->mousex,pmouseー〉mousey);46while(l) 47newxy(&pmouse->mousex,&pmouse->mousey,&pmouse->buttons);if(pmouse->buttons=l){if(mouseon(pm))Icleardevice();thank();closegraph();exit(1);}elseif(mouseon(pm+1))(work(pmouse);pmouse->buttons3Z。;delay(100);}elseif(mouseon(pm+2))(manage(pmouse);pmouse->buttons3Z。;delay(100);//guanlielseif(mouseon(pm+3)) 48helpO;pmouse->buttons=0;delay(100);})else(if(mouseon(pm))(bklight(pm,pmouse);)47elseif(mouseon(pm+1))(bklight(pm+1,pmouse);}elseif(mouseon(pm+2))(bklight(pm+2,pmouse);elseif(mouseon(pm+3))bklight(pm+3,pmouse); 49intmouseon(MENUPOSITION*pm)iintdx,dy,buttons;read(&dx,&dy,&buttons);if(dx>pm->xl&&dx 50//chars[100]="hustji〃;48//removeC'c:\\password.dat");//passwordsave(s);flag=password();“password返回1时表示密码输入正确if(flag=l){leadmanage(ms);//shouliangchunhuohuochunchakanqubie)else{void*buff;buff=malloc(imagesize(390,100,620,230)):if(buff==NULL)(cleardevice();printfC'notenoughmemory!,notsaving");exit(0);}getimage(390,100,620,230,buff);OutTextxy(390,100,"密码错误",4);delay(1000);putimage(390,100,buff,0);free(buff);///////////////////////////////////////////////////////////////voidleadmanage(MOUSESTATE*p) 51(inta;GOODSDATE*pg;void*buff;buff=malloc(imagesize(390,100,620,230));if(buff==NULL)(cleardevice();printf(/znotenoughmemory!leadmanage/?);exit(0);}getimage(390,100,620,230,buff);0utTextxy(400,116,〃请按键盘,选择功能”,4);OutTextxy(400,132,"1,售货统计“,4);0utTextxy(400,148,"2.货存补给”,4);OutTextxy(400,164,"3.单货补给“,4);OutTextxy(400,180,"4.格式化”,4);OutTextxy(400,196,"5,时间查询“,4);OutTextxy(400,212,"6'条形图",4);49//0成16乂1ス丫(400,228,“7.修改密码”,4);〃菜单目录a二readboard(p);putimage(390,100,buff,0); 52free(buff);switch(a)对应各种功能Z/(case1:search();break;case2:initallgoods();break;case3:initsinglegoods(p);break;case4:refresh();break;case5:searchsold(p);break;case6:printfl);//demandautodrawbargraph();suggest();break;case7:passwordmodefy();break;case8:moneynumwithdraw();break;default:break;) 53)//////////////////////////////////////////////////////////intreadboard(MOUSESTATE*pm)(KEYBOARDk[12];KEYBOARD*pk;charnum[12]="2","3","4","5","6","7","8","9","〇”,"#"};inti,j,ic;for(i=0,ic=0;i<4;i++)[for(j=0;j<3;j++)Ik[ic].xl=191+j*13;k[ic].yl=206+i*13;50k[ic].x2=2Ol+j*13;k[ic].y2=216+i*13;k[ic].str=num[ic];ic++;}〃对按键赋值pk=k;while(l){ 54newxy(&pm->mousex,&pmー〉mousey,&pmー〉buttons);if(pm-〉buttonsニニ1)〃如果按键了(for(i=0;i<12;i++)(if(mouseonkey(pk+i))〃如果鼠标在对应的键匕这键值变回绿色{lightkey(pk+i,1);pm->buttons=0;returni+1;else〃没有按键(for(i二〇;iく12;i++)〃循环判断鼠标在哪个键上(if(mouseonkey(pk+i))lightkey(pk+i,0);〃在上面是,键值变为蓝色elselightkey(pk+i,1);〃不在上面是,键值变回绿色 55/////////////////////////////////////////////////////////////intmouseonkey(KEYBOARD*pm)〃判断鼠标是否在相应的键上51{intdx,dy,buttons;read(&dx,&dy,&buttons);if(dx>pm->xl&&dx 56******************function.Cpp*************************#includeくstdio.h>#include 57voidoutinformation(MOUSESTATE*,int);voidinitallgoods()/Z全补货函数(loadingO;//调用!oading函数GOODSDATEpg[9];goodsfileread(&pg[〇]);〃读取物品信息inti;void*buff;buff=mal1oc(imagesize(390,90,620,135)):〃对图形开辟内存getimage(390,90,620,135,buff);if(buff==NULL)Icleardevice0;printflnotenoughmemory!;delay(1000);exit(0);)〃没有内存则退出程序for(i=0;i<9;i++)[(pg+i)->savenum=30;〃对每个物品的存量值赋为30)OutTextxy(400,116,"补全货成功”,4);〃显示操作成功delay(2000); 58putimage(390,90,buff,0)!〃将内存中的图形读回free(buff);〃释放内存goodsfi1esave(&pg[0]);//储存物品信息)voidinitsinglegoods(MOUSESTATE*pm)〃单个补货53(GOODSDATEpg[9];//KEYBOARDpk;inta;void*buffI〃图形分配内存goodsfileread(&pg[0]);buff=malloc(imagesize(390,90,620,135));if(buff==NULL)Icleardevice();printflnotenoughmemory!;delay(1000);exit(0);getimage(390,90,620,135,buff);〃将图形存入内存OutTextxy(400,116,”请选择货号”,4);〃提示选择要补货的物品delay(2000);while(l)( 59a=readboard(pm);〃读取小键盘上的按键〃printf("%d",a);if(a<10&&a>0)〃判断是否按的是物品号pg[a-l].savenum=30;〃将选的物品进行补货为30putimage(390,90,buff,0);//图形操作OutTextxy(400,116,"补货成功”,4);〃显示补货成功delay(1000);putimage(390,90,buff,0);//图形操作free(buff);〃释放图形内存break;〃退出}}goodsfilesave(&pg[0]);}voidsearch()〃制表GOODSDATEg[9];goodsfileread(&g[0]);〃读取物品的信息54inti,j,saveall=0,soldall=0,earnall=0;char*csaveall,*csoldall,*cearnall;chara[9][20];/*void*buff;buff=malloc(imagesize(375,85,625,450)); 60if(buff==NULL)[printf("notenoughmemory");exit(0);)getimage(375,85,625,450,buff);*Z〃内存的分配,但是系统无法分配这么大的内存for(i=0;i<12;i++)Iline(380,90+i*32,620,90+i*32):)for(i=0;i<5;i++)!line(380+i*60,90,380+i*60,442);}〃画表格0utTextxy(454,98,"存量",4);OutTextxy(454+60,98,"售量",4);OutTextxy(454+60*2,98,"收额",4);OutTextxy(394,98+32,"可乐",4);OutTextxy(394,98+32*2,“苏打",4);OutTextxy(394,98+32*3,"柠檬",4);OutTextxy(394,98+32*4,"牛奶",4):OutTextxy(394,98+32*5,"桃汁",4); 61OutTextxy(394,98+32*6,"橘汁”,4);OutTextxy(394,98+32*7,"红茶",4);OutTextxy(394,98+32*8,"绿茶",4);OutTextxy(394,98+32*9,"咖啡",4);OutTextxy(394,98+32*10,"总量",4);〃数据输入表格setusercharsize(3,1,3,1);setcolor(BLUE);for(i=0;i<9:i++)Iitoa(g[i],savenum,a[i],10);outtextxy(460,134+i*32,a[i]);//将每个物品的存量输入到表格里saveall=saveall+g[i].savenum;〃计算出总的存量的总量55)for(i=0;i<9;i++)(itoa(g[i].soldnum,a[i],10);outtextxy(520,134+i*32,a[i]);//将每个物品的售量输入到表格里oldall=soldall+g[i].soldnum:〃计算出售量的总量for(i=0;iく9;i++)itoa(g[i].soldnum*g[i].price,a[i],10);outtextxy(580,134+i*32,a[i]):〃将每个物品的销售额输入到表格earnall=earnal1+g[i].soldnum*g[i].priceJ〃计算销售额的总量 62}itoa(saveall,csaveall,10);itoa(soldall,csoldall,10);itoa(earnail,cearnall,10);outtextxy(460,134+9*32,csaveall);outtextxy(520,134+9*32,csoldall);outtextxy(580,134+9*32,cearnall);〃将总存量、总售量、总销售额输入到表格while(l){if(bioskey(0)=ESC)//按键ESC退出(setfillstyled,0);bar(375,85,625,450);//setwritemode(1);break;//free(buff);/////////////////////////////////////voidrefresh()〃格式化(loading。;〃条用!oading函数GOODSDATE*pg;MONEYNUMpmn;56 63initmoneynum(&pmn);〃对钱币数量的初始化moneynumsave(&pmn)J〃储存钱币的数量goodsfileread(pg);〃读取物品信息goodsinit(pg);〃对物品的信息初始化goodsfilesave(pg);〃储存物品更新后的信息remove(*c:\\soldgoodsdates.dat");〃删除文件void*buff:〃图形界面操作buff=malloc(imagesize(390,100,620,130));if(buffニニNULL)(cleardevice。;printf(/znotenoughmemory!geshihua/z);exit(0);}getimage(390,100,620,130,buff);0utTextxy(390,100,"系统格式化成功〃,4);〃显示格式化成功delay(1000);putimage(390,100,buff,0);free(buff);〃释放图形内存}////////////////////////////////////////voidsearchsold(MOUSESTATE*pm)〃显示物品的购买的时间i 64SOLDFILE*ps;intn;intptoimax,ptoi,ptoirest;inti,j,c;chars[80]:char*wdayLJ=(Sun,Mon,lue,Wed,Inu,rn,Sat);chara[9][20]={"cola","soda","lemo","milk","peach","juice","icetea,greentea,cotree);showsold_file(ps,&n);〃n为购买物品的次数,并对ps指向的内存赋值structtm*p;setcolor(RED);//loadingO;if(n<12)〃如果nく12,那么直接显示对应的物品的购买时间for(i=0;i 65/z,p->tm_hour,p->tm_min,p->tm_sec);} 66}else〃直接显示12个物品的购买时间(for(i=0;i<12;i++)!p=gmtime(&((ps+i)->t));sprintf(s/%s%d~%02d—%02d%s%02d:%02d:%02d",a[(ps+i)->label-l],(1900+p->tm_year),(l+p->tm_mon),(p->tmmday),wday[p->tmwday],p->tmhour,p->tm_min,p->tm_sec);outtextxy(370,90+i*14,s);}}ptoimax=n/12;//(最大的页数T)ptoirest=n%12:〃最后ー页显示的个数ptoi=0;setfillstyled,LIGHTGREEN);bar(370,300,423,320);bar(450,300,503,320);bar(530,300,583,320);0utTextxy(372,302,"上一页",LIGHTBLUE);0utTextxy(452,302,"下ー页",LIGHTBLUE);OutTextxy(539,302,"退出",LIGHTBLUE);//画图,画对其操作的按钮delay(1000);setwritemode(1);while(l) 67(newxy(&pm->mousex,&pm->mousey,&pm->buttons);if(pm->buttons==l)〃如果鼠标点击58{if(pm->mousex>370&&pm->mousex<420&&pm->mousey>300&&pm->mousey<320)〃点的是“上ー页”的按钮[if(ptoi==0)〃如果是第一ー页(outinformation(pm,0):〃第一页thefirstone,提示已到最前ー页pm->buttons=0;delay(200);continueJ〃继续循环else〃不是第一页ptoi=ptoiT;〃往前减少ー页setfillstyle(l,0);bar(365,85,639,298);for(i=ptoi*12,j=0;i<(12+ptoi*12);i++,j++)〃从前ー页的第一个物品,显示12个(p=gmtime(&((ps+i)->t));sprintf(s,〃%s%d--%02d--%02d%s%02d:%02d:%02dz\a[(ps+i)->label-1],(1900+p->tm_year),(l+p->tm_mon),(p->tm_mday),wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);outtextxy(370,90+j*14,s); 68)pm->buttons=0;delay(200);continue;〃继续循环})if(pm->mousex>450&&pm->mousex<500&&pm->mousey>300&&pm->mousey<320)〃判断是否点在“下ー页”{if(ptoi>=ptoimax||(ptoirest==0&&ptoi==ptoimax-l))〃如果是最后ー页{outinformation(pn),1);〃最后ー页thelastone,提示这是最后ー页pmー》buttonsニ〇;delay(200);continue;〃继续循环59else//如果不是最后ー页〃printf("");setfillstyle(l,0);bar(365,85,639,298);if(ptoi 69sprintf(s,"%s%d—%02d—%02d%s%02d:%02d:%02d/z,a[(ps+i)->label-l],(1900+p->tm_year),(l+p->tm_mon),(p->tm_mday),wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);outtextxy(370,90+j*14,s);)pm->buttons=0;delay(200);continue;〃继续循环}else〃如果是倒数第二页ptoi=ptoi+l;/Z页码加1for(i=ptoi*12,j=0;i 70(cursor(pm->mousex,pm->mousey);setfillstyle(l,0);bar(365,85,639,298);bar(365,298,600,322);setwritemode(1);cursor(pm->mousex,pm->mousey);〃图形操作break;〃退出循环/////////////////////////////////////////////////////////////////////voidoutinformation(MOUSESTATE*pm,intn)〃信息的提示ivoid*buffinf=NULL;unsignedsize;intaロ={440,105,390,105,390,198,615,198,615,105,565,105};//waikaungintb[]={440,108,388,108,388,195,612,195,612,108,565,108};//neikaungsize=imagesize(386,100,617,200);if(((void*)buffinf=malloc(size))==NULL)(printf(/znotenoughbuffer");exit(1);}getimage(386,100,617,200,buffinf); 71setfillstyle(l,7);bar(386,100,617,200);drawpoly(6,a);drawpoly(6,b);setfillstyled,LIGHTBLUE); 72bar(540,160,590,190);61setcolor(WHITE);OutTextxy(455,103,"消息提示”,WHITE);0utTextxy(549,167,〃确定”,WHITE);//画图形setcolor(WHITE);switch(n)〃根据传入函数的n,来判断信息框里的输出信息icase0:OutTextxy(400,130,"已到第一页",GREEN);break;case1:OutTextxy(400,130,"已到最后ー页",GREEN);break;default:break;}while(l){newxy(&pm->mousex,&pm->mousey,&pmー〉buttons);if(pm->buttons==l)〃单击"确定”退出{if(pm->mousex>=540&&pm->mousex<=590&&pm->mousey>=160&&pm->mousey<=190) 73putimage(386,100,buffinf,0);setwritemode(1);cursor(pm->mousex,pm->mousey);〃图像操作free(buffinf);//释放内存delay(100);}*********************work.cpp************************#include 74#defineESC0x01lbexternoutgoods(int)1〃出货动画externoutmoney(int);voidarrow(GOODSDATE*pgc);〃箭头intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg);〃选择物品函数intchoosemoney(MOUSESTATE*);〃投币voidinsertall(MOUSESTATE*,int*):〃总投币voidbuy(GOODSDATE*,int);〃购买voidshowinsertall(int):〃显示已投币金额voidwork(MOUSESTATE*ps)(staticGOODSDATEa[9];goodsfi1eread(&a[0]);〃读取货品信息intn,insertmoney,flag;n二choosegoods(ps,&a[0]);〃选货,返回货品号(label-1)ps->buttons=0;//printf(“机T,n);if(a[n].savenum>0&&a[n].savenum<31)〃判断savenum即物品是否还有存货(//printf("%d",n);insertall(ps,&insertmoney);〃总投币//setwritemode(0);//printf('%d”,insertmoney); 75buy(&a[n],insertmoney);//购买货物read(&ps->mousex,&psー〉mousey,&psー〉buttons);//setwritemode(0);cursor(ps->mousex,ps-〉mousey);setwritemode(1);}else//无存货,显示信息63{void*buff=NULL;buff=malloc(imagesize(390,100,620,130));getimage(390,100,620,130,buff):〃图形处理if(buff==NULL)(printf(/znotenoughmemoryv);}OutTextxy(400,110,“无存货",4);delay(1000);putimage(390,100,buff,0);free(buff);}goodsfi1esave(&a[0]);}///////////////////////////////////////////////////////// 76intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg)〃选择货物函数intx=0;for(;;)〃通过鼠标的位置读取货品信息通过指针传递(循环)(newxy(&ps->mousex,&ps->mousey,&ps->buttons);if((ps->mousex)<=73&&(ps->mousex)>=49&&(ps->mousey)>=133&i(ps->mousey)<=165)〃鼠标处于第一个货物图形区域arrow(pg+0);〃显示箭头if(ps->buttons)(cursor(ps->mousex,ps->mousey);x=0;〃选定货物returnx;〃返回货物编号}}if((ps->mousex)<=113&&(ps->mousex)>=89&&(ps->mousey)>=133&&(ps->64mousey)<=165)Iarrow(pg+1);if(ps->buttons) 77cursor(ps->mousex,psー〉mousey);x=l;returnx;}}if((ps->mousex)<=153&&(ps->mousex)>=129&&(ps->mousey)>=133&&(ps->mousey)<=165)(arrow(pg+2);if(ps->buttons)(cursor(ps->mousex,ps->mousey);x=2;returnx;}}if((ps->mousex)<=73&&(ps-〉mousex)〉=49&&(psー〉mousey)〉=204&&(ps-〉mousey)く=236)(arrow(pg+3);if(ps->buttons)(cursor(ps->mousex,psー〉mousey);x=3; 78returnx;if((ps->mousex)<=113&&(ps->mousex)>=89&&(ps->mousey)>=204&&(ps->mousey)く=236)Iarrow(pg+4);if(ps->buttons)(cursor(ps->mousex,ps->mousey);x=4;returnx;65}}if((ps-〉mousex)く=153&&(ps-〉mousex)〉==129&&(ps-〉mousey)〉=204&&(ps->mousey)<=236)(arrow(pg+5);if(ps->buttons)(cursor(ps->mousex,psー〉mousey);x=5;returnx;if((ps->mousex)<=73&&(ps->mousex)>=49&&(ps->mousey)>=275&&(ps->mousey)<=307) 79arrow(pg+6);if(ps->buttons)(cursor(ps->mousex,ps->mousey);x=6;returnx;)}if((ps->mousex)<=113&&(ps->mousex)>=89&&(ps->mousey)>=275&&(ps->mousey)<=307)(arrow(pg+7);if(ps->buttons)(cursor(ps->mousex,ps->mousey);x=7;returnx;)}if((ps->mousex)<=153&&(ps-〉mousex)>=129&&(ps->mousey)>=275&&(ps->mousey)<=307)arrow(pg+8);if(ps->buttons)66( 80cursor(ps->mousex,ps->mousey);x=8;returnx;////////////////////////////////////////////////////////voidinsertall(MOUSESTATE*ps,int*allmoney)//计算投币总量函数{//shubiaoO;curstoxy(ps);cursor(ps->mousex,ps->mousey);delay(100);*allmoney=0;while(l)Inewxy(&ps->mousex,&ps->mousey,&psー)buttons);if(ps->mousex>=185&&ps->mousex<=215&&ps->mousey>=160&&ps->mousey<=170)〃计算投入纸币时钱币总量if(ps->buttons==l)cursor(ps->mousex,ps->mousey);*2111110优丫=*@11010优丫+仲0050010优丫8$);〃投币总量等于之前投币总额加上目前投币面值//printf("知〃,*allmoney); 81cursor(ps->mousex,ps->mousey);showinsertall(*allmoney):〃显示目前已投币总额psー〉buttonsニ〇;}}if(ps->mousex>=230&&ps->mousex<=236&&ps->mousey>=145&&ps->mousey67<=160)//计算硬币投入时钱币总量(与纸币在同一级别)(delay(100);if(ps->buttons==l)(setlinestyle(0,0,3);rectangle(227,142,239,163);*allmoney=*allmoney+1:〃投币总量等于之前投币总额加1delay(500);rectangle(227,142,239,163);setlinestyle(O,0,1);showinsertall(*a11money);ps->buttons=0;}}if(bioskey(1)) 82iif(bioskey(0)=ENTER)!setfillstyle(l,0);bar(390,90,620,120);〃投币完毕之后将界面中显示金额总量的图形区域初始化ps->buttons=0;curstoxy(ps);cursor(ps->mousex,ps->mousey);break;〃跳出///////////////////////////////////////////////////////intchoosemoney(MOUSESTATE*ps)〃选择钱币函数void*buff=NULL;buff=malloc(imagesize(185,160,218,230));68getimage(185,160,218,230,buff);〃图形处理if(buffニニNULL)(printf(""notenoughmemory");} 83char*valueロ={"RMB:2","RMB:5〃,"RMB:10"};〃定义纸币的指针数组setwritemode(C0PY_PUT);setfillstyle(l,7);bar(185,170,215,230);setcolor(1);line(185,190,215,190);line(185,210,215,210);settextstyle(1,0,0);setusercharsize(1,3,2,5);outtextxy(185,180,value[0]);outtextxy(185,200,value[l]);outtextxy(185,220,value[2]);shubiao();curstoxy(ps);cursor(ps->mousex,psー〉mousey);for(;;)newxy(&ps->mousex,&psー〉mousey,&psー〉buttons);if((psー〉mousex)〉=185&&(psー〉mousex)く=215&&(ps-〉mousey)〉=170&&(ps->mousey)<=190)〃鼠标位于2元纸币区域(if(ps->buttons==l)!cursor(ps->mousex,psー〉mousey); 84putimage(185,160,buff,0);free(buff);setwritemode(1);return2;〃返回投币值2元})if((psー〉mousex)〉=185&&(psー〉mousex)く=215&&(ps-〉mousey)〉=190&&(ps->mousey)<=210)〃鼠标位于5元纸币区域(if(ps->buttons==l){69cursor(ps->mousex,ps-〉mousey);putimage(185,160,buff,0);free(buff);setwritemode(1);return5;〃返回5 85if((ps->mousex)>=185&&(ps->mousex)<=215&&(ps->mousey)>=210&&(ps->mousey)<=230)〃鼠标位于10元纸币区域{if(ps->buttons==l)Icursor(ps->mousex,ps->mousey);putimage(185,160,buff,0);free(buff);setwritemode(1);return10;〃返回10//}////////////////////////////////////////////////////////////////voidbuy(GOODSDATE*pg,inta)//a表示money购买函数(//printf('%d",a);intrest;〃剩余钱币金额char*ch;void*buff;S0LDF1LE*psf; 86if(a>=pg->price)〃投币大于价格pg->savenum=pg->savenum-l:〃存货减~,pg->soldnum=pg->soldnum+l;〃已售货物数量加一sold_file(pg,psf);rest=a-pg->price;〃剩余金额等于投币额减去价格buff=malloc(imagesize(390,90,620,130));getimage(390,90,620,130,buff);70OutTextxy(400,100,”售货成功!*,4);delay(1000);putimage(390,90,buff,0);itoa(rest,ch,10);setusercharsize(2,1,2,1);outtextxy(440,105,ch);OutTextxy(400,100,“找零元",4);delay(1000);putimage(390,90,buff,0);setwritemode(1);free(buff);outgoods(pg->label);outmoney(rest);delay(100);else〃投币金额不足buff=malloc(imagesize(390,90,620,140)); 87getimage(390,90,620,140,buff);//图形处理OutTextxy(400,100,〃对不起,您的钱不够”,4);delay(1000);putimage(390,90,buff,0);rest二a;itoa(rest,ch,10):〃将数字转化为字符串setusercharsize(2,1,2,1);outtextxy(440,105,ch);OutTextxy(400,100,"找零元",4);delay(1000);putimage(390,90,buff,0);setwritemode(1);free(buff);outmoney(rest);})/////////////////////////////////////////////////////////////voidarrow(GOODSDATE*pgc)〃箭头函数!void*buffera;buffera=NULL;intl=pgc->x;inth=pgc->y;int 88aロ={1+24,h+16,1+28,h+24,1+28,h+20,1+32,h+20,1+32,h+12,1+28,h+12,1+28,h+8,1+2714,h+16};〃箭头多边形buffera=malloc(imagesize(1+23,h+6,1+32,h+26));//图形处理(箭头出现区域)if(bufferaニニNULL)(printf(*notenoughmemory");exit(1);}getimage(1+23,h+6,1+32,h+26,buffera);setcolor(0);setfillstyle(l,8);fillpoly(8,a);delay(100);putimage(l+23,h+6,buffera,C0PY_PUT);free(buffera);buffera=NULL;}//////////////////////////////////voidshowinsertall(intmoney)setfillstyled,0);chars[80];bar(390,90,620,120);sprintf(s,”投入币额:%d元”,money);OutTextxy(390,90,s,4); 89}*******************count.cpp*************************#include 90)}voidautodrawbargraph()〃智能画条形图!intgoodsnum[9];inti;intmax;intlongmax;inta[4];chargoodsname[9][20]={"cola","soda,"lemo","milk","peach","juice","icetea,greentea,coiieeJ;GOODSDATE*pg;goodsfileread(pg)J〃把goods的信息附到pg里checkcount(fegoodsnum[0]);〃goodsnum里面存入售量数max=goodsnum[0];for(i=0;i<9;i++)if((max 91setlinestyle(0,0,3);line(350,430,610,430);line(350,430,350,85);//x,y轴setlinestyle(0,0,1);charbuff[80];for(i=0;i<9;i++)Ia[0]=355;a[l]=430-longmax*goodsnum[i];a[2]=355+20;a[3]=430;〃每个物品bar的左上角和右下角的坐标setfillstyled,i+4);bar(a[0]+28*i,a[l],a[2]+28*i,a[3]);〃画矩形sprintf(buff,"刎”,goodsnum[i]);outtextxy(a[0]+i*28+6,a[l]-8,buff);//在矩形框上面输出对应的售量数}〃画条形图settextstyle⑶0,0);settextjustify(LEFT_TEXT,1);setusercharsize(2,5,2,5);outtextxy(a[0],430+10,goodsname[0]);outtextxy(a[0]+25,430+10,goodsname[1]);outtextxy(a[0]+28*2-1,430+10,goodsname[2]);outtextxy(a[0]+28*3,430+10,goodsname[3]); 92outtextxy(a[0]+28*4-4,430+10,goodsname[4]);outtextxy(a[0]+28*5+2,430+10,goodsname[5]);outtextxy(a[0]+28*6+2,430+10,"ice");outtextxy(a[0]+28*6+2,430+18,"tea");outtextxy(a[0]+28*7-4,430+10,z/green");outtextxy(a[0]+28*7-1,430+18,"tea");outtextxy(a[0]+28*8+1,430+10,goodsname[8]);//x轴上的单位,物品的名字inttriangle_l[8]={610,425,610,435,620,430,610,425};inttriangle_2[8]={350,75,345,85,355,85,350,75);0utTextxy(340,60,“数量",4);OutTextxy(580,450,"物品",4);fillpoly(3,triangle1);fillpoly(3,triangle_2);setwritemode(1);〃画x,y轴的箭头while(l){74if(bioskey(0)=ENTER)〃如果按键ENTER,退出此函数{setfillstyle(1,0);bar(340,60,639,480);〃由于系统分配不了这么大的内存,用画图形覆盖break; 93voidsuggest()〃算出那个商品的销售额最多,并显示出来!settextjustify(LEFTTEXT,1);intgoodsnum[9];intearnmoney[9];charbuff[80];inti,j,n[9];intmax;GOODSDATEpg[9];chargoodsname[9][20]={"cola","soda,"lemo","milk","peach","juice","icetea,greentea,coriee);checkcount(&goodsnum[0]);〃读取售量数goodsfi1eread(&pg[0]);〃读取物品的信息void*buffera;buffera=NULL;buffera=malloc(imagesize(390,90,620,230));〃分配图形内存if(buffera==NULL)printf(/znotenoughmemory");exit(1);}getimage(390,90,620,230,buffera);〃将图形存入内存中for(i=0;i<9;i++)( 94earnmoney[i]=pg[i].price*goodsnum[i];}max二earnmoney[〇];for(i=0;i<9;i++)(if(max 95)〃显示此物品while(l)(if(bioskey(0)==ESC)〃按键ESC退出Ibreak:))putimage(390,90,buffera,0);〃还原图片free(buffera):〃释放内存setwritemode(1);delay(200);**********************goods.cpp************************#include 96ford二〇;iく9;i++)//■,ー对每个物品的初始化((pg+i)->label=i+1;〃物品的标号初始化(pg+i)ー>savenunF30;〃物品的存量的初始化(pg+i)->soldnum=0;〃物品售量的初始化(pg+i)ー)goodsincome=0;〃物品销售额的初始化//(pg+i)ー〉name二a[i];if(i<3)((pg+i)ー〉price=3;(pg+i)-〉x=49+i*40;(pg+i)->y=133;elseif(i>=3&&i<6)((pg+i)->price=5;(pg+i)->x=49+(i-3)*40;(pg+i)ー)y=133+71;}elseif(i>=6&&i<9){(pg+i)->price=7;(pg+i)->x=49+(i-6)*40; 97(pg+i)->y=133+2*71;)〃物品的右上角的坐标及其价格的初始化}strcpy(pg-)name,cala);(pg+1)ー〉name二soda;(pg+2)ー〉name="lemo";(pg+3)->name=z?milk";(pg+4)ー〉name二〃peach”;(pg+5)ー〉name二juice";(pg+6)ー〉name二icetea";(pg+7)ー〉name="greentea";(pg+8)ー》name="coffee”;〃物品名字的初始化}77voidgoodsfilesave(GOODSDATE*pg)〃物品信息存入文件(FILE*fp;inti;if((fp=fopen("c:Wgoodsdates.dat","wt"))=NULL)〃打开文件(printf("erroronopenfile!goodsfilesave");exit(1);} 98rewind(fp);〃使指针指向文件首for(i=0;i<9;i++)(fwrite(pg+i,sizeof(GOODSDATE),1,fp);)〃将一个个数据写入文件fclose(fp);〃关闭文件}voidgoodsfileread(GOODSDATE*pg)〃从文件中读取物品的信息{FILE*fp;inti;if((fp=fopen("c:Wgoodsdates.dat","rt"))=NULL)〃打开文件printf("erroronopenfile!goodsfileread");exit(1);rewind(fp);〃使指针指向文件首for(i=0;i<9;i++)(fread(pg+i,sizeof(GOODSDATE),1,fp);}〃将文件中的数据ーー读出fclose(fp);〃关闭文件*********************input.cpp**************************#include 99#include 100exit(1);)getimage(430,100,637,200,buffin);setfillstyle(l,7);bar(430,100,637,200);setcolor(WHITE);drawpoly(6,a);drawpoly(6,b);settextjustify(1,TOPTEXT);setcolor(WHITE);OutTextxy(492,102,〃管理员系统”,WHITE);setcolor(GREEN);switch(n)case0:0utTextxy(473,125,"请输入密码”,GREEN);break;casel:0utTextxy(473,125,”请输入原始密码”,GREEN);79break;case2:0utTextxy(473,125,”请输入新密码“,GREEN);break;case3:0utTextxy(473,125,“请重新输入新密码”,GREEN);break;case4:0utTextxy(473,125,〃密码修改成功〃,GREEN);break;default:break;}outtextxy(535,175,"ESCexit;ENTERendinput");inti,j,k,m;i=0;j=0;settextjustify(LEFT_TEXT,1);setfillstyle(1,BLUE);bar(473,145,600,165);while(l)〃输入操作过程{m=0;k=bioskey(0);if(k==ESC)break;switch(k){caseENTER:if(i==0)continue;else{m=l;break;}caseBACKSPACE:if(i>0&&strlen(s)>0){s[—i]二‘、〇';bar(473,145,600,165);for(j二〇;jくstrlen(s);j++){outtextxy(473+j*8,155,"*");}80continue; 101elsecontinue;default:s[i]=k;s[i+l]-\0';for(j=0;j 102free(buffin);buffin=NULL;delay(100);returnm;)intinput(char*s,intn){void*buffin=NULL;unsignedsize;inta[]={490,105,435,105,435,198,635,198,635,105,580,105};//waikaungintb[]={490,108,438,108,438,195,632,195,632,108,580,108);//neikaungsize=imagesize(430,100,637,200);if(((void*)buffin=malloc(size))==NULL)printf(*notenoughbuffer*);exit(1);81}getimage(430,100,637,200,buffin);setfillstyle(l,7);bar(430,100,637,200);setcolor(WHITE);drawpoly(6,a);drawpoly(6,b);settextjustify(1,TOPTEXT);setcolor(WHITE);OutTextxy(492,102,“管理员系统“,WHITE);setcolor(GREEN);switch(n){case0:0utTextxy(473,125,“请输入密码“,GREEN);break;case1:0utTextxy(473,125,〃请输入原始密码”,GREEN);break;case2:0utTextxy(473,125,“请输入新密码”,GREEN);break;case3:0utTextxy(473,125,“请重新输入新密码*,GREEN);break;case4:0utTextxy(473,125,”密码修改成功〃,GREEN);break;default:break;}outtextxy(535,175,*ESCexit;ENTERendinput");inti,j,k,m;i=0;j=0;settextjustify(LEFT_TEXT,1);setfillstyled,BLUE);bar(473,145,600,165);while(1)〃输入操作过程{m=0;k=bioskey(0);82if(k==ESC)break;switch(k) 103caseENTER:if(i==0)continue;elsem=l;break;caseBACKSPACE:if(i>0)s[—i]=,\0";bar(473,145,600,165);outtextxy(473,155,s);continue;)default:s[i]=k;s[i+l]-\0';outtextxy(473+j*8,155,s);i++;)if(m)break;} 104putimage(430,100,buffin,C0PY_PUT);free(buffin);buffin=NULL;delay(100);returnm;}*****************outgoods,cpp*****************************#includeくgraphics.h>#include 105sector(85,350+12,90,270,6,12);bar(85,350,85+32,350+24);setfillstyle(l,LIGHTGRAY);fillellipse(85+32,350+12,6,12);setwritemode(0);settextstyle(3,1,0);settextjustify(T0P_TEXT,2);setlinestyle(0,0,1);setusercharsize(2,5,2,5);setcolor(WHITE);switch(n){case1:outtextxy(85+16,350,“cola");break;case2:outtextxy(85+16,350,"soda");break;case3:outtextxy(85+16,350,lemo,z);break;case4:outtcxtxy(85+16,350,"milk");break;case7:outtextxy(85+13,352,"ice");outtextxy(85+20,353,"tea");break;default:break;}setusercharsize(2,7,2,5); 106switch(n){case5:outtextxy(85+16,350,“peach");break;case6:outtextxy(85+16,350,"juice");break;84case8:outtextxy(85+13,350,"green");outtextxy(85+21,352,"tea");break;case9:setcolor(BROWN);setusercharsize(2,,7,1,2);outtextxy(85+16,348,“coffee");break;default:break;}setlinestyle(0,0,1);delay(2000);putimage(75,348,buff,0);free(buff);settextstyle⑶0,0);settextjustify(LEFTTEXT,1);setwritemode(1);} 107voidoutmoney(intn){inti;for(i=0;i 108#include〃hanzi.h〃#defineESC0x01lbexternintinput(char*,int);externintinputpassword(char*,int);externloading();voidout_text(int);voidpasswordsave(char*ps)(FILE*fp;if((fp=fopen(z,c:Wpassword.dat","wt"))ニニNULL){printf(*errortoopenthefile!”);exit(1);}fwrite(ps,strlen(ps)+l,1,fp);fclose(fp);}voidpasswordread(char*ps)(FILE*fp;if((fp=fopen("c:Wpassword.dat","rt"))==NULL){printf("errortoopenthefile!”);exit(1); 109}fread(ps,strlen(ps)+20,1,fp);fclose(fp);}voidpasswordmodefy(){chars[100];charpsf[100],psbl[100],psb2[100];passwordread(s);printf("");while(l)if(bioskey(l))86if(bioskey(0)=ESC)(break;}}input(psf,1);if(strcmp(psf,s)==0)(input(psbl,2); 110delay(300);input(psb2,3);if(strcmp(psbl,psb2)==0){loadingO;remove("c:Wpassword.dat");passwordsave(psbl);outtext(2);break;}else(out_text(1);continue;elseout_text(0);continue;intpassword()(chars[100];charpsf[100]; 111passwordread(psf);87inputpassword(s,0);if(strcmp(s,psf)==0)(return1;}elsereturn0;voidout_text(inta)void*buff;buff=malloc(imagesize(370,90,520,120));if(buffニニNULL)iprintfCznotenoughmemory!z,);exit(1);}getimage(370,90,520,120,buff);switch(a)(case0:OutTextxy(370,90,“原始密码输入错误”,4); 112break;case1:OutTextxy(370,90,“重新输入密码错误",4);break;case2:OutTextxy(370,90,"密码修改成功",4);break;default:break;}delay(1500);putimage(370,90,buff,0);free(buff);setwritemode(1);}*******************soldfile.cpp****************************#includeくstdio.h>#include 113psー〉name二pg-〉name;psー〉label=pg-〉!.abel;buytime(ps);psー〉price=pg-〉price;ps->insert=0;ps->putout=0;p=gmtime(&(psー〉t));sprintf(sf,z/c:\\%d%02d%02d.dat”,(1900+p-〉tm_year),(1+pー〉tm_mon),(p->tm_mday));//ps->t//if((fp二fopen(sf,"at"))ニニNULL)if((fp=fopen("c:\\soldgoodsdates.dat","at"))ニニNULL)〃丨文件追加{printf("erroronopenfile!sold_file");exit(1);}fwrite(ps,sizeof(SOLDFILE),1,fp):〃结构数据写入文件fclose(fp);〃关闭文件)voidshowsold_file(SOLDFILE*ps,int*n)//文件的读取iFILE*fp;inti;if((fp二fopen("c:\\soldgoodsdates.dat","rt"))ニニNULL) 114(printf("erroronopenfile!showsoldfile");exit(1);}rewind(fp);89for(i=0;1;i++)Ifread(ps+i,sizeof(SOLDFILE),1,fp);if(feof(fp))〃当文件的指针为空时,退出循环*n=i;break;〃n表示读取的物品数量得多少})fclose(fp);)*********************moneyriuni.cpp*****************************#include 115#defineENTEROxlcOd//#includez/jiegou.h〃typedefstructmoneynumiintvalueone;intvaluetwo;intvaluefive;intvalueten;}MONEYNUM;voidmoneynumsave(MONEYNUM*pmn)FILE*fp;if((fp=fopenC'c:Wmoneynumber.dat〃,ニニNULL){printf(*errortoopenthefile!”);exit(1);}fwrite(pmn,sizeof(MONEYNUM),1,fp);fclose(fp);90}voidmoneynumread(MONEYNUM*pmn) 116(FILE*fp;if((fp二fopen("c:Wmoneynumber.dat","rt"))=NULL){printf("errortoopenthefile!");exit(1);}fread(pmn,sizeof(MONEYNUM),1,fp);fclose(fp);}voidinitmoneynumzero(MONEYNUM*pmn)!pmn->valueone二〇;pmn->valuetwo二〇;pmn->valuefive=O;pmn->valueten=O;}voidinitmoneynum(MONEYNUM*pmn)(pmn->valueone=100;pmn->valuetwo=50;pmn->valuefive=20;pmn->valueten=0;} 117voidmoneynumadd(intvalue,MONEYNUM*pmn){if(value==2)(pmn->valuetwo=pmn->valuetwo+l;}elseif(valuers)(pmn->valuefive=pmn->valuefive+1;}elseif(value==10)pmn->valueten=pmn->valuefive+1;else91printf(/zwrongmoney");}}voidmoneynumchange(MONEYNUM*pmn)iMONEYNUMpm;moneynumread(&pm);pm.valueone=pm.valueone+pmn->valueone;pm.valuetwo=pm.valuetwo+pmn->valuetwo; 118pm.valuefive=pm.valuefive+pmn->valuefive;pm.valueten=pm.valueten+pmn->valueten;moneynumsave(&pm);}voidmoneynumwithdraw()(MONEYNUMpmn;moneynumread(&pmn);intwithdrawmoney;charstr[5][80];sprintf(str[0],“ー元硬币%d个“,pmn.valueone);OutTextxy(385,90,str[0],4);sprintf(str[l],“两元纸钞%d张”,pmn.valuetwo);OutTextxy(385,106,str[1],4);sprintf(str[2],“五元纸钞%d张”,pmn.valuefive);OutTextxy(385,122,str[2],4);sprintf(str[3],“十元纸钞%d张”,pmn.valueten);OutTextxy(385,138,str[3],4);while(l)(if(bioskey(O)==ENTER)isetfillstyle(l,0); 119bar(380,85,600,200);withdrawmoney=pmn.valueten*10+(pmn.valuefive-20)*5+(pmn.valuetwo-50)*2+(pmn.valueone-100);sprintf(str[4],〃提取金额%d元”,withdrawmoney);OutTextxy(385,90,str[4],4);initmoneynum(&pmn);moneynumsave(&pmn);delay(1000);setfillstyle(1,0);bar(380,85,600,150);92break;/*voidmain()MONEYNUMm;initmoneynum(&m);moneynumsave(&m);moneynumread(&m);printf(〃知”,m.valuetwo);}*/voidmoneynumshow(MONEYNUM*pmn)(charstr[4][80];sprintf(str[0],"—>兀硬币%d个,pmn->valueone);OutTextxy(385,90,str[0],4); 120sprintf(str[l],“两元纸钞%d张〃,pmnー)valuetwo);OutTextxy(385,106,str[l],4);sprintf(str[2],“五元纸钞%d张”,pmnー)valuefive);OutTextxy(385,122,str[2],4);sprintf(str[3],“十元纸钞%d张”,pmnー〉valueten);OutTextxy(385,138,str[3],4);delay(1000);setfillstyle(l,0);bar(380,85,600,300);intmoneynumdepend(MONEYNUM*pmn,MONEYNUMallmoney)(MONEYNUMpm;MONEYNUMpmtemp;intal,a2,a3,b;intallmoneytemp;moneynumread(&pm);pm.valueone=pm.valueone+pmn->valueone;pm.valuetwo=pm.valuetwo+pmn->valuetwo;pm.valuefive=pm.valuefive+pmn->valuefive;pm.valueten=pm.valueten+pmn->valueten;al=allmoney/10;b=allmoney%10; 12193*ppmtemp,intif(al<=pm.valueten)(pmtemp.valueten=al;}elsepmtemp.valueten=pm・valueten;alImoneytemp=alImoney-pmtemp.valueten*10;a2=allmoneytemp/5;if(a2<=pm.valuefive){pmtemp.valuefive=a2;}elseipmtemp.valuefive=pm.valuefive;}allmoneytemp=al1moneytemp-pmtemp.valuefive*5;a3=allmoneytemp/2;if(a3<=pm.valuetwo)(pmtemp.valuetwo=a3;}else( 122pmtemp.valuetwo=pm.valuetwo;)allmoneytemp=al1moneytemp-pmtemp.valuetwo*2;if(alImoneytemp<=pm.valueone)pmtemp.valueone=alImoneytemp;pm.valueone=pm.valueone-pmtemp.valueone;pm.valuetwo=pm.valuetwo-pmtemp.valuetwo;pm.valuefive=pm.valuefive-pmtemp.valuefive;pm.valueten=pm.valueten-pmtemp.valueten;*ppmtemp=pmtemp;94moneynumsave(&pm);return1;)else(return0;))*****************thank,cpp*************************^include"thank,h"voidthank()(void*buffer=NULL;void*buffer1=NULL;void*buffer2;NULL; 123void*buffer3=NULL;inti;setbkcolor(14);cleardeviceO;circle();setcolor(4);setwritemode(0);settextstyle(5,0,4);settextjustify(LEFTTEXT,1);OutTextxy(50,48,"欢迎使用",4);buffer=malloc(imagesize(40,43,350,95));getimage(40,43,350,95,buffer);setfillstyle(SOLID_FILL,14);bar(40,43,350,95);for(i=0;iく70;i++)iputimage(10+i,40,buffer,COPY_PUT);}free(buffer);buffer=NULL;settextstyle(5,0,5);0utTextxy(60,190,"自动售货机",4);bufferl=malloc(imagesize(50,185,200,277)); 124getimage(50,185,200,277,bufferl);bar(50,185,200,277);95for(i=0;i<90;i++)!putimage(40+i,183,bufferl,COPY_PUT);}free(bufferl);buffer1=NULL;settextstyle(5,0,5);OutTextxy(400,190,“图形仿真”,4);buffer3=malloc(imagesize(400,185,585,277));getimage(400,185,585,277,buffer3);bar(400,185,585,277);for(i=300;i>220;i-)(putimage(120+i,183,buffer3,COPY_PUT);}free(buffer3);buffer3=NULL;OutTextxy(460,250,“系统",4);buffer2=maHoc(imagesize(460,245,585,337));getimage(460,245,585,337,buffer2);bar(460,245,585,337);for(i=360;i>230;i—)iputimage(120+i,243,buffer2,COPY_PUT);}free(buffer2); 125buffer2=NULL;getchO;cleardevice();closegraph();voidcircle()inti;for(i=l:i<45;i++)Isetcolor(i);circle(28+i*13,30,10);circle(28+i*13,450,10);)for(i=14;i<40;i++)Isetcolor(i);circle(20,52+(1-13)*13,10);96circle(620,52+(i-13)*13,10);)) 126******************welcorne.cpp*********************#include"welcome,h"voidputstar();voidwelcome()(inti,size;void*bufferl;void*buffer2;cleardevice();setbkcolor(LIGHTGREEN);setcolor(GREEN);setlinestyle(O,0,1);setfillstyle(1,RED);//drawcirclecircledOO,200,30);floodfill(100,200,GREEN);0utTextxy(80,200,”自动化〃,WHITE);if((bufferl=malloc(imagesize(69,169,131,231)))==NULL){printf(z,notenoughbuffertoallocate);}setfillstyle(1,BLUE);//drawrectanglerectangle(510,170,570,230);floodfill(520,200,GREEN);0utTextxy(520,200,〃售货机〃,WHITE);if((buffer2=malloc(imagesize(510,170,571,231)))==NULL){ 127printf(〃notenoughbuffertoallocate7y);}getimage(69,169,131,231,bufferl);getimage(511,171,571,231,buffer2);for(i=0;iく190;i++)putimage(70+i,170,bufferl,C0PY_PUT);97putimage(510-i,170,buffer2,C0PY_PUT);}cleardeviceO;putstar();0utTextxy(250,200,〃自动售货机图形仿真系统”,RED);delay(2000);free(bufferl);free(buffer2);cleardeviceO;}voidputstar()(intseed=1858;inti,m,n,dotx,doty,color,maxcolor;m=getmaxx();n二getmaxy0;color=getmaxcolor();srand(seed); 128for(i二〇;i<200;i++)Idotx=i+random(m-l);doty=i+random(n-l);color=random(maxcolor);setcolor(color);putpixel(dotx,doty,color);circle(dotx+1,doty+1,1);}}*******************mouse.cpp****************************ttinclude 129voidcurstoxy(MOUSESTATE*ps);voidnewxy(int*mx,int*my,int*mbutt);voidshubiao()staticintxmin,xmax,ymin,ymax,x_max=639,y_max=479;intbuttons,xm,ym,xO,yO;xmin=2;xmax=xmax-1;ymin=2;ymax=y_max_2;setwritemode(XORPUT);if(init(xmin,xmax,ymin,ymax)==0)/・调用init函数对鼠标器初始化・/{printf(''MouseorMouseDriverAbsent,Pleaseinstall!,z);delay(5000);exit(1);}}voidcursor(inta,intb)/・画十字光标函数・/(setcolor(4);line(a,b,a+8,b+8);line(a+8,b+8,a+5,b+8);line(a+5,b+8,a+8,b+15); 130line(a+8,b+15,a+6,b+17);line(a+6,b+17,a+3,b+10);line(a+3,b+10,a,b+13);line(a,b+13,a,b);intinit(intxmi,intxma,intymi,intyma)/・鼠标器初始化函数・/intretcode;regs.x.ax=0;int86(51,®s,®s);retcode=regs.x.ax;if(retcode==0)return0;/・返回〇表示鼠标或鼠标驱动程序未安装・/regs.x.ax=7;regs.x.cx=xmi;99regs.x.dx=xma;int86(51,®s,®s);regs.x.ax=8;regs.x.cx=ymi;regs.x.dx=yma;int86(51,ftregs,®s);/*表示鼠标器和驱动程序已安装・/returnretcode;) 131intread(int*mx,int*my,int*mbutt)/・读鼠标的位置和按钮状态函数・/{intxx0=*mx,yy0=*my,but0=0,mb;intxnew,ynew;doregs.x.ax=3;int86(51,ftregs,®s);xnew=regs.x.ex;ynew=regs.x.dx;*mbutt=regs.x.bx;if(bioskey(1))ireturn4;}}while(xnew==xxO&&ynew==yyO&&*mbutt=butO);*mx=xnew;*my=ynew;mb=(*mbutt);if(mb){if(mb=l)return1;/・左键按下・/elseif(mb==2)return2;/・右键按下・/return3;/・其它的按键情况・/ 132}elsereturn0; 133voidnewxy(int*mx,int*my,int*mbutt)/・是否有按钮按下,若按下,在新位置画十字・/{intch,xxO=*mx,yyO=*my;intxm,ym;100ch=read(&xm,&ym,mbutt);if(ch!=3&&ch!=4)(cursor(xxO,yyO);cursor(xm,ym);}else(}*mx=xm;*my=ym;)voidcurstoxy(MOUSESTATE*ps)(regs.x.ax=4;regs.x.cx=ps->mousex;regs.x.dx=ps->mousey; 134int86x(0x33,®s,®s,&sregs);******************loading,cpp*******************************#includeくstdio.h〉#include 135for(i=0;i<7;i++)delay(1000);OutTextxy(448+i*15,162,〃・〃,BLUE);}putimage(380,160,buffla,0);setwritemode(1);free(buffla);〃释放内存delay(100);}****************hc1p.cpp********************#include 136cleardevice();printf(/znotenoughmemory!");exit(0);}getimage(390,90,638,300,buff);OutTcxtxy(480,100,“帮助",4);OutTextxy(400,116,"先选择模式,按下buy按钮进入",4);OutTextxy(400,132,"售货模式;插入key,进入管理",4);OutTextxy(400,148,”管理员模式!〃,4);while(l)(if(bioskey(O)==ESC)(putimage(390,90,buff,0);free(buff);break;}}102}********************bklight.cpp***********************#include"bklight.h"voidbklight(MENUPOSITION*p,MOUSESTATE*pms) 137void*buff=NULL;buff=malloc(imagesize(p->xl,p->yl,p->x2,p->y2))J〃分配内存if(buff==NULL)(printf("thereisnotenoughmemory");delay(1000);cleardevice();exit(1);}getimage(p->xl,p->yl,p->x2,p->y2,buff);setfillstyle(1,10);bar(p->xl,p->yl,p->x2,p->y2);setcolor(1);OutTextxy(p->rx,p->ry,p->headname,5);〃画高亮//setwritemode(XOR_PUT);delay(100);putimage(p->xl,p->yl,buff,COPY_PUT);setwritemode(1);free(buff);}********************buytime,cpp*********************** 138#include 139quma=bytel-0xa0;weima=byte2-OxaO;p=(quma-1)*94+weima-1;p*=32;fseek(hzkfile,(long)p,SEEK_SET);fread(buf,sizeof(unsignedchar),32,hzkfile);fclose(hzkfile);for(i=0,y=top;i<31;i+=2,y++)for(mark=0x80,j=0;mark>0;mark=mark»l,j++)(if((buf[i]&mark)!=0)putpixel(left+j,y,color);if((buf[i+l]&mark)!=0)putpixel(left+j+8,y,color);})fclose(hzkfile);return1;}intOutTextxy(intx,inty,char*p,intcolor)(104intoldcolor;intdisp_hz(intleft,inttop,unsignedcharbytel,unsignedcharbyte2,intcolor);oldcolor=getcolor();setcolor(color);while(*p){if(((unsignedchar)*p>=0xal&&(unsignedchar)*p<=0xfe)&&((unsignedchar)*(p+1)>=0xal&&(unsignedchar)*(p+l)<=0xfe)){if((x+16-1)>getmaxx()|(y+16-l)>getmaxy())return0;disp_hz(x,y,*p,*(p+l),color);p+=2;x+=16+2;moveto(x,y);}else{charq[2];moveto(x,y);*q=*p;*(q+l)='、0'; 140settextstyle(DEFAULTFONT,HORIZDIR,1);outtextxy(x,y+4,q);x+=8+l;p++;}}setcolor(oldcolor);return1;}.h文件Main.h#include 141intry;char*headname;}MENUPOSITION;typedefstruct_mouse(intmousex;intmousey;intbuttons;}MOUSESTATE;typedefstructsoldfile(longt;intlabel;char*name;intprice;intinsert;intputout;}SOLDFILE;typedefstruct_goodsintlabel;char*name; 142intprice;106intsavenum;intsoldnum;intgoodsincome;intx,y;}GOODSDATE;typedefstruct_key{intxl;intyl;intx2;inty2;char*str;}KEYBOARD;typedefstruct_moneynum{intvalueone;intvaluetwo;intvaluefive;intvalueten;}MONEYNUM;Hanzi.h#include 143Welcome,httinclude
此文档下载收益归作者所有