自动售货机c编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言课程设计报告
自动售货机
图形模拟系统
题目:自动售货机图形模拟仿真班
级:
学号:
组员:
学号:
指导教师:
上交日期:
目录
1 前言 (3)
1.1 售货机的背景 (3)
1.2 编写目的 (3)
1.3 任务概括 (4)
2 需求剖析 (4)
2.1 需求剖析 (4)
2.2 运转环境 (5)
3 系统设计 (6)
3.1 功能需求描绘 (6)
3.2 程序流程图 (6)
3.3 功能和操作简介(界面) (6)
3.4 程序模块区分 (11)
3.5 程序中的名词定义及说明 (16)
4 算法剖析 (24)
4.1 中默算法剖析 (24)
4.2 其余函数算法剖析 (30)
5 程序总结 (38)
5.1 编程过程中的疑难点办理 (38)
5.2 程序不足之处 (41)
6 (42)
7 (42)
842
一. 前言
1.1 背景
自动售货机是能依据投入的钱币自动付货的机器是商业自动化的常用设施,
它不受时间、地址的限制,能节俭人力、方便交易。
是一种崭新的商业零售形式,又被称为 24 小时营业的微型商场。
能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。
自动售货机是一种崭新的商业零售形式,20 世纪 70
年代自日本和欧美发展起来。
自动售货咖啡机是一种既能
够出冷热咖啡也能够同时出奶茶果汁饮料的咖啡饮料自动售
货机,省时方便快捷。
既能够作投资来使用,也可作为职工
福利来使用。
此刻,自动售货机家产正在走向信息化并进一步实现合理化。
24 小时无人售货的系统能够更省力,营运时需要的资本少、面积小,有吸引人们购
买好奇心的自己性能,能够很好地解决人工花费上涨的问题等各项长处。
1.2 编写目的
经过对自动售货机买卖商品的过程剖析,成立模拟自动售货机的图形界面操
作系统,对其投币、出货、统计等多个方面的功能模拟,实现模拟真切自动售货机的操作流程。
此次 C语言课程设计是本专业的第一次课程设计 , 拥有重要的意义 : 经过上个学期对 C语言的学习 , 对 C语言编程有了初步的认识 , 获取了必定的基础但是特别缺少实质的编程经验 , 没法从质上对自己的编程技巧有一个很大的提升 , 此次的
课程设计给我们供给了一个特别好的锻炼时机。
经过二个人的分工合作 , 在实质中运用和训练程序设计的模块化和工程化思想和技术 , 努力掌握 C 语言精华;同时提升自己的沟通与团队合作的能力 . 为此后的更专业更复杂的课程设计和实践活动打好基础。
1.3 任务概括
自动售货机售货 9 种商品,价钱分别为 3 元, 5 元和 7 元。
顾客投入 10 元、 5 元或 2 元的纸币,而后选择购置 9 种商品之一,自动售货机吐出商品,并且找
给用户零钱。
假如商品售完,或许没法找零,则给出用户一个提示,商品已售完,并且退还纸币。
程序具备以下功能:
库存查问:检索9 种商品的储藏量
商品上架:为 9 种商品增添
销售查问:分别统计今日每种商品的销售量和销售额
会计查问:打印当日的来往帐目以及节余零钞数目结
算功能:能够拿出金额
销售界面:顾客投入纸币,选择商品,获取商品和零钱;或许直接显示错误并退还纸币
要求以自动售货机为对象,图形化模拟投币、找零、出货的基本流程;能对售货
机的商品进行管理:补货、查问、统计等功能。
二.需求剖析
2.1 需求剖析
自动售货机是一种崭新的商业零售形式,20 世纪 70 年代自日本和欧美
发展起来。
它又被称为24 小时营业的微型商场。
在日本,70%的罐装饮料是经过自动售货机售出的。
全世界有名饮料商爽口可乐企业在全世界就布有
50万台饮料自动售货机。
此刻,自动售货机家产正在走向信息化并进一步实现合理化。
自动售货
咖啡机是一种既能够出冷热咖啡也能够同时出奶茶果汁饮料的咖啡饮料自
动售货机,省时方便快捷。
既能够作投资来使用,也可作为职工福利来使
用。
从自动售货机的发展趋向来看,它的出现是因为劳动密集型的家产结构向
技术密集型社会转变的产物。
大批生产、大批花费以及花费模式和销售
环境的变化,要求出现新的流通渠道;而相对的商场、百货购物中心等新
的流通渠道的产生,人工花费也不停上涨;再加上场所的限制性以及购物
的便利性等这些要素的限制,无人自动售货机作为一种一定的机器便应运
而生了。
此刻,自动售货机家产正在走向信息化并进一步实现合理化。
比如推行
联机方式,经过电话线路将自动售货机内的库存信息实时地传递各营业点的
电脑中,进而保证了商品的发送、增补以及商品选定的顺利进行。
并且,为
防备地球暖化,自动售货机的开发致力于能源的节俭,节能型清冷饮料自动
售货机成为该行业的主流。
我们用 TC3.0 编写的 C 语言程序来模拟自动售货机的控制及各样操作过程。
2.2 运转环境 (DOS 环境 )
该系统赐予 tc2.0 和 bc31 开发,合用于 dos3.0 以上的所有 dos 版本和windows 操作系统;本软件设计中加入了鼠标和键盘操作,所以操作过程一定依
赖鼠标和键盘才能实现所有功能;本软件关于显示卡无特别要求;本软件能够允许用户自定义一些参数,拥有优秀的人机交互性。
本软件主要的输入方式是数字输入,实质操作是经过键盘或许鼠标选择我们
给出的汉化菜单项选择项。
输出信息也将采纳汉化的窗口(包含弹窗)传达给用
户。
除此以外无其余特别要求;
出现图形没法显示或图形显示成效差——办理方法:检查显示卡驱动能否正常;出现某些子程序的初始化没法正常达成——办理方法:显示初始化失败的地点,
并退出程序;出现空间分派失败——办理方法:显示为内存不够,退出程序并检查
内存利用状况;
三. 系统设计
3.1 功能需求描绘
进入主界面,能够有管理员进口和顾客模式。
顾客模式先,选摘要购置的饮料。
若有库存则出货,选择投硬币和投纸币,此中纸币有 2 元 5 元 10 元能够供选择,选择完币值后,按键确立,在出币扣找零。
管理员模式先点击钥匙口(key),会弹出一个对话框要求输入密码确立权限,进入后可查问各样饮料的节余量和售量、销售币额以及顾客购置的时间。
管理员
还能够进行密码的改正。
3.2 程序流程图(见附录)
3.3 功能和操作简介(界面)
菜单界面——点击“帮
助”出现如图上的界
面,按键ESC 退出;
点击“退出”,则退出
系统;点击“ buy”进
入售货模式;点击
“key”进入管理模式
点击“ buy”后进
入售货模式,选择
商品,当鼠标到对
应商品时会出现
箭头提示
单击选择商品,系
统会查察选择的
商品能否还有存
货,假若有会进入投币环节,假如没有,则输出无存货,而后对销售
货模式。
进入投币环节,当
鼠标移到投纸币窗
口时,会出现下拉
式菜单,用于选择投入纸币的面额,当鼠标移到投硬币的窗口单击,
会投入一元硬币,若投入,会有提示,并显示此时投入的总数。
按键 ENTER 表示确立。
(如单击10 元,右侧会显示“投入币额:10 元”)
显示找零,并且会显示找出的几个硬币,几张多少面值的纸币,而后物件从里面出来。
假如点击“key”,则进入管理界面,进入管理界面是会要求先输入密码,按键ENTER 表示确立,假如正确就进入管理的菜单,不然退出管理模式。
进入管理菜单:
会选择对应的功能,经过售货机右中部
的小键盘
选择对应的功能。
而后系统会依据小键盘返回的值履行各个功能函数。
功能 1:制表,显示各个物件的信息。
功能 2:对 9 中商品补货,所有补齐,途中会显示loading。
功能 3:补单货,选择物件,对其存量补齐。
功能 4:格式化,对所有的数据格式化。
功能 5:查问每次物件卖出的时间
功能 6:做系统智能画条形图,并显示售货额最高的物件。
按键 ENTER 确立,显示销售额最高
的物件。
按键 ESC 退出功能
功能 7:改正密码。
功能 8:显示售货机里钱币的数目,并拿出必定币额。
退出界面
单击“退出”显示的退出动画。
按键 ENTER 退出此界面。
3.4 程序模块区分
在程序模块的剖析中,为了方便理清函数之间的调用关系,我们采纳了函数级其余定义方式。
自顶向下级次增高,在某些模块中被多次调用的小功能函数定义为该模块的工具函数。
故 main 函数被定义为一级函数,在 main 函数中被直接调用的子函数定义为二级函数,依此类推
主函数模块:
#include"main.h"
void main()
{
int gdriver,gmode;
MENUPOSITION *pm;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:\\tc30\\bgi");//图形驱动
welcome();//欢迎的界面
draw();//画界面
menu(pm);//菜单函数,进入系统
}
主函数main()中除了调用welcome ()函数显示欢迎画面和draw()函数画售货机界面;,主要子函数是调用的menu()函数。
menu()函数即菜单项选择择模块的根函数。
下边分别来介绍这个主要模块。
一、图形模块:主假如界面
二、鼠标模块:包含鼠标的图形,鼠标状态。
三、汉字模块:中文显示
四、菜单模块: 1. 顾客模式:
a. 选择货物
b.投币
c.找零(面值优先)
2.管理员模式:
a. 密码
b. 库存查察与增添
c. 取走和填充销售金额
d.商品销量统计制表制图
五、文件模块:保留销售和库存的信息
六、时间模块:显示时间,并记录售货的时间资料
菜单项选择择模块:
此模块用于菜单界面的显示,实现菜单按钮和鼠标的各样功能。
本模块的中心函数: void menu()(属于二级函数)
本模块的三级函数:(被 void menu ()调用)
work()中心函数,模拟自动售货机的物件买卖功能
manage()中心函数,自动售货机管理物件信息的功能函数
help ()系统帮助函数
thank ()界面退出函数,退出界面
bklight ()设置高亮
此中 manage()里面又有一个子菜单的函数leadmanage(),用于对系统管理功能的选择,属于四级函数。
此中 leadmanage()里的五级函数有
void initallgoods()
void initsinglegoods(MOUSESTATE *pm) void search()
void refresh()
对物件补全货的函数对单个物件补货的函数画表格显示物件信息的函数
数据格式化的函数
void searchsold(MOUSESTATE *pm)
void outinformation(MOUSESTATE *pm,int n)查问单次售货的时间
弹出信息提示的函
数
void autodrawbargraph()智能画条形图函数
void suggest()显示销售额最高的商品
leadmanage()会调用 function.cpp里的各样功能函数,包含一些其余 cpp文件里的函数
模拟自动售货机售货模块(中心)
void arrow (GOODSDATE *pgc);箭头
int choosegoods(MOUSESTATE *ps,GOODSDATE *pg);
选择物件函数
int choosemoney(MOUSESTATE *);
投币,返回单次投币的数额
void insertall(MOUSESTATE *,int *);
经过 choosemoney的循环,退出后计算总投币
void buy(GOODSDATE *,int);
传当选择的物件信息和总投币额,进行买卖操作的函数
void showinsertall(int );显示总头币额的函数
以上的函数为work 的中心调用函数,还有其余的对文件操作的函数,用于对物件信息的储藏,下边将在文件模块中说明。
此外此函数将在算法剖析中进行解说与剖析。
文件模块
void goodsfilesave(GOODSDATE *pg)物件信息储藏到文件void goodsfileread(GOODSDATE *pg)从文件读取物件信息void passwordsave(char *ps)密码文件保留
void passwordread(char *ps)密码从文件中读取
void sold_file(GOODSDATE *pg,SOLDFILE *ps)
物件售货单次的信息操作存入文件
void showsold_file(SOLDFILE *ps,int *n)
从文件中读取物件单次操作信息的函数
void moneynumsave(MONEYNUM *pmn);钱币数目的储藏void moneynumread(MONEYNUM *pmn);钱币数目的读取
鼠标汉字模块
void shubiao()对鼠标初始化
void cursor(int a,int b)在(a,b)点画鼠标
int read(int *x ,int*y ,int*buttons )
调用中止来读鼠标的状态假如鼠标不动,这向来在里面循环,直到鼠标状态改变
或是按键,就退出循环
void neyxy(int *x ,int*y,int*buttons)
鼠标挪动的函数,经过 read 的返回值在异或的模式下,覆盖本来的鼠标和画新的鼠
标。
Outtextxy (int,int ,char *,int)汉字输出
动绘图形模块
void outgoods(int n)商品出货动画的函数
void outmoney(int n)吐币函数
Void thank();退出系统的动画
Void welcome();进入系统的动画
协助模块
void bklight (MENUPOSITION *p,MOUSESTATE *pms)
设置高亮
void loading()模拟等候过程的动画函数
int inputpassword(char *s,int n)专用于密码输入的函数
int readboard(MOUSESTATE*pm) 小键盘的读取,返回键盘值
int mouseonkey(KEYBOARD*pm) 判断鼠标能否在小键盘上相应的
地点,假如是,返回 1
void outinformation(MOUSESTATE *pm,int n)弹出信息提
示的函数
void checkcount(int agoods[9])读取商品的售量函
数
Int mouseon(MENUPOSITION *pm)判断鼠标能否在菜单项的
地点上
void arrow (GOODSDATE *pgc);箭头
时间模块
void buytime(SOLDFILE *p)纪录购置货物的时间
读取系统的时间,并赋值到结构中的长整型变量t,以文件的
形式把结构中的数据储存下来
3.5 程序中的名词定义及说明
1.对文件名( *.cpp )的解说
MAIN.CPP主函数
BACKPH.CPP用于画界面
BKLIGHT.CPP鼠标高亮
BUY_TIME.CPP读取系统时间
COUNT.CPP条形图的显示售量FUNCTION.CPP (中心)附有管理员功能
GOODS.CPP对物件的文件操作
GUANLI.CPP进入管理员界面的 menu 选择
HANZI.CPP用于中文汉字输出
HELP.CPP系统的 help 功能
MENU.CPP进入系统的 menu 选择
MOUSE.CPP对鼠标操作
OUTGOODS.CPP物件出货动画
PASSWORD.CPP对密码操作
SOLDFILE.CPP每次购置信息存盘的文件操作
THANK.CPP退出系统的动画
WELCOME.CPP进入系统的动画WORK.CPP(中心)购置物件购置物件
MONEYNUM.CPP对钱币的数目的管理函数
2.程序中的结构定义:
typedef struct _menu
{
int x1;
int y1;
int x2;
int y2; //四个角的坐标
int rx;
int ry; //输出headline的左上点的坐标
char *headname;
}MENUPOSITION; 主界面菜单栏结构
对菜单的操作时,用于鼠标点击时判断地点。
typedef struct _mouse
{
int mousex;
int mousey; //鼠标的坐标点
int buttons; //鼠标按键click的状态
}MOUSESTATE;鼠标结构
当图形界面变换时,需要传达鼠标的地点,免得留下鼠标印。
typedef struct _soldfile
{
long t; //购置的时间,从系统中读取
int label; //商品的标号
char *name; //商品的名字
int price;//商品的价钱
}SOLDFILE;已售出货物的结构
此结构用于当每次对物件操作时,保留单次记录,以存入文件中。
typedef struct _goods
{
int label;//商品的标号
char *name; //商品的名字
int price; //商品的价钱
int savenum; //商品的存量
int soldnum; //商品的售量
int goodsincome; //商品的销售额
int x,y;//图形界面上的商品的坐标}GOODSDATE; 货物信息结构
用于对物件信息的办理。
typedef struct _key
{
int x1;
int y1;
int x2;
int y2; //小键盘上按键的四个极点的坐标
char *str; //小键盘上键的符号
}KEYBOARD;界面小键盘按键结构
typedef struct _moneynum
{
int valueone;//一元硬币的数目
int valuetwo;//两元纸币的数目
int valuefive;//五元纸币的数目
int valueten;//十元纸币的数目
}MONEYNUM;钱币数目的结构
3.函数名词定义及解说
1.BACKPH:包含函数
void draw()用于建立主菜单的图形界面
2.BKLIGHT:包含函数
void bklight (MENUPOSITION *p,MOUSESTATE *pms)
设置高亮
3.BUY_TIME:包含函数
void buytime(SOLDFILE *p)纪录购置货物的时间
4.COUNT:包含函数
void checkcount(int agoods[9])读取商品的售量函数
void autodrawbargraph()智能画表形图函数
void suggest()显示销售额最高的商
品
5.FUNCTION:包含函数
void initallgoods()对物件补全货的函数
void initsinglegoods(MOUSESTATE *pm)对单个物件补货的函数void search()画表格显示物件信息的函数
void refresh()数据格式化的函数void searchsold(MOUSESTATE *pm)查问单次售货的时间
void outinformation(MOUSESTATE *pm,int n)弹出信息提示的函数
6.GOODS: 包含函数
void goodsinit(GOODSDATE *pg)对物件信息的初始化void goodsfilesave(GOODSDATE *pg)物件信息储藏到文件void goodsfileread(GOODSDATE *pg)从文件读取物件信息7.GUANLI: 包含函数
void manage(MOUSESTATE *ms)管理界面的“主函数”void leadmanage(MOUSESTATE *p)管理的界面的菜单函数int readboard(MOUSESTATE*pm)小键盘的读取,返回键盘值int mouseonkey(KEYBOARD*pm)判断鼠标能否在小键盘上相应的
地点,假如是,返回 1
8.HANZI:汉字库
此cpp是用作汉字输出的调用,非编者编写
9.HELP:包含函数
void help()menu中的帮助选项
10.INPUT:包含函数
int inputpassword(char *s,int n)专用于密码输入的函数
int input(char *s,int n)用于一般的信息输入
11:LOADING:包含函数
void loading()模拟等候过程的动画函数
12.MAIN:
Void main()主函数
13.MENU:包含函数
void menu(MENUPOSITION *pm)初始化菜单中的选项void choose(MENUPOSITION *pm)菜单项选择择函数int mouseon(MENUPOSITION *pm)判断鼠标能否在菜单项的
地点上
14:MOUSE:鼠标函数
void shubiao()对鼠标初始化
void cursor(int a,int b)在(a,b)点画鼠标
int read(int *x ,int*y ,int*buttons )
调用中止来读鼠标的状态假如鼠标不动,这向来在里面循环,直到鼠标状态改变
或是按键,就退出循环
void neyxy(int *x ,int*y,int*buttons)
鼠标挪动的函数,经过 read 的返回值在异或的模式下,覆盖本来的鼠标和画新的鼠
标。
15:OUTGOODS:包含函数
void outgoods(int n)商品出货动画的函数
void outmoney(int n)吐币函数
16:PASSWORD:包含函数
void out_text(int );password中人机对话的函数
void passwordsave(char *ps)密码文件保留
void passwordread(char *ps)密码从文件中读取
void passwordmodefy()改正密码的功能
int password()进入管理界面时判断输入密码能否正确
17:SOLDFILE:包含函数
void sold_file(GOODSDATE *pg,SOLDFILE *ps)
物件售货单次的信息操作存入文件
void showsold_file(SOLDFILE *ps,int *n)
从文件中读取物件单次操作信息的函数
18:THANK:
Void thank();退出系统的动画
19:WELCOME:
Void welcome();进入系统的动画
20:WORK:
void arrow (GOODSDATE *pgc);箭头
int choosegoods(MOUSESTATE *ps,GOODSDATE *pg);
选择物件函数
int choosemoney(MOUSESTATE *);
投币,返回单次投币的数额
void insertall(MOUSESTATE *,int *);
经过 choosemoney的循环,退出后计算总投币
void buy(GOODSDATE *,int);
传当选择的物件信息和总投币额,进行买卖操作的函数
void showinsertall(int );显示总头币额的函数
void work(MOUSESTATE *ps)中心函数
21:MONEYNUM:
void initmoneynum(MONEYNUM *pmn);初始化钱币的数目void moneynumsave(MONEYNUM *pmn);钱币数目的储藏void moneynumread(MONEYNUM *pmn);钱币数目的读取void moneynumadd(int ,MONEYNUM *);钱币数目相加
void initmoneynumzero(MONEYNUM *pmn);设置钱币数目全为0 void moneynumwithdraw();显示钱币数目后取币额
int moneynumdepend(MONEYNUM *pmn,MONEYNUM *ppmtemp,int allmoney);钱币数目判断函数,判断能否能够找零void moneynumshow(MONEYNUM *pmn);钱币数目显示函数
四.算法剖析
4.1中默算法(work)的剖析
work 函数主要由外面函数
outgoods(int )
outmoney(int )
和内部函数
void arrow (GOODSDATE *pgc )
int choosegoods(MOUSESTATE *ps,GOODSDATE *pg )
int choosemoney(MOUSESTATE *)
void insertall(MOUSESTATE *,int * )
void buy(GOODSDATE *,int)
void showinsertall(int );组成
主要流程为先履行choosegoods函数选择货物,经过指针返回货物编
号并读取货物信息,判断货物是有存量以后履行下一步操作,不然提示并返回。
确立有存货后开始投币。
void insetall 函数与int choosemoney 函数处于同一级别,在投币的同时计算投币总量并显示储存起来。
投币结束enter 键确认,进入 buy 函数。
buy 是整个 work 中最重要的部分,第一判断投币总数与选择货物时返回编号的货物的
价钱进行选择,假如投入金额小于价钱则提示并退出;当投入金额大于价钱时,第一对货物的信息进行办理,即改正货物的存量与售货量。
而后办理一块图形地区,显示售货信息。
下边剖析算法中的重难点:
1
static GOODSDATE a[9];
goodsfileread(&a[0]);// 读取货物信息
int n,insertmoney,flag;
n=choosegoods(ps,&a[0]);// 选货,返回货物号( label-1)在主函数的最开始,读取9 种货物的物件信息。
在整个程序中,都是用指针经过传达货物的标号来读取货物信息
进行办理的!
2
goodsfilesave(&a[0]);程序的最后对被办理的货物数据要进行储存。
3
选择货物时使用FOR 循环
for(;;)//经过鼠标的地点读取货物信息经过指针传递(循环)
{
newxy(&ps->mousex,&ps->mousey,&ps->buttons);
if((ps->mousex)<=73&&(ps->mousex)>=49&&(ps->mousey)>=133 &&(ps->mousey)<=165)//鼠标处于第一个货物图形地区
{
arrow(pg+0);
//显示箭头
if(ps->buttons)
{
cursor(ps->mousex,ps->mousey);
x=0;
//选定货物
return x; //返回货物编号
}
经过鼠标的地点传达,来显示出帮助的箭头。
点击鼠标后返回货物
的编号,在此后的办理中,都经过编号读取的
货物结构信息来办理数据并储藏。
4
while(1)
{
newxy(&ps->mousex,&ps->mousey,&ps->buttons);
if(ps->mousex>=185&&ps->mousex<=215&&ps->mousey>=160&&ps->mousey<=170)//计算投入纸币时钱币总量
{
if(ps->buttons==1)
{
cursor(ps->mousex,ps->mousey);
*allmoney=*allmoney+choosemoney(ps);// 投币总量等于以前投币总数加上目前投币面值
//printf("%d",*allmoney);
cursor(ps->mousex,ps->mousey);
showinsertall(*allmoney);// 显示目前已投币总数
ps->buttons=0;
}
在 insertall 函数中,使用 while 循环计算投币总量,很好理解。
中间
插入的 showinsertall 函数即分派一块地区进行投币是的提示信息。
所
以在最后需要做办理:
if(bioskey(1))
{
if(bioskey(0)==ENTER)
{
setfillstyle(1,0);
bar(390,90,620,120);//投币完成以后将界面中显示金额总量的图形地区初始化
ps->buttons=0;
curstoxy(ps);
cursor(ps->mousex,ps->mousey);
break;//跳出将显示金额总量的图形地区初始化并跳出。
方便后续操作
5
在办理投币的时候对纸币做了一个指针数值:
char *value[]={"RMB:2","RMB:5","RMB:10"};//定义纸币的指针数组
在后续操作中都是办理纸币信息储藏的地址:
outtextxy(185,180,value[0]);
outtextxy(185,200,value[1]);
outtextxy(185,220,value[2]);
6
买卖函数(投币金额大于价钱的状况):
if(a>=pg->price)//投币大于价钱
{
pg->savenum=pg->savenum-1;//存货减一
pg->soldnum=pg->soldnum+1;//已售货物数目加一
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);
delay(100);
第一对货物数据进行操作再对图形进行办理,提示信息。
使其有足够内存。
最后再将显示帮助信息的地区初始化。
7
void showinsertall(int money)
{
setfillstyle(1,0);
char s[80];
bar(390,90,620,120);
sprintf(s,"投入币额: %d 元",money);
OutTextxy(390,90,s,4);
}
在显示投币总量函数中使用sprintf 系统函数,使数字与字符串一同显示。
而在以前的程序中我们并未
掌握这一函数所以是先使用itoa(rest,ch,10); itoa 函数将数字转变为字符串再和汉子一同输出显示。
4.2其余算法的剖析
里的函数算法剖析
进入管理模式时,会要求输入密码
flag=0;
flag=password();//返回值为 1 则表示输入密码正确
if(flag==1)
{
leadmanage(ms); //shouliang chunhuo huochunchakan qu bi e
}——manage ();
a=readboard(p);//readboard 是读取小键盘的按键值的函数
返回值 a,用 swith(a)来选择功能
switch(a)对应各样功能//
{
case 1: search();
break;
case 2: initallgoods();
break;
case 3: initsinglegoods(p);
break;
case 4: refresh();
break;
case 5: searchsold(p);
break;
case 6: printf("");//demand
autodrawbargraph();
suggest();
break;
case 7: passwordmodefy();
break;
case 8: moneynumwithdraw();
break;
default: break;
}—— leadmanage ();
2.count.cpp 里的函数算法剖析
在这个 cpp 文件里,有一个只好画条形图的函数 autodrawbargraph(),它会更具物件的数目画出条形图!
for(i=0;i<9;i++)
{
if((max<goodsnum[i])==1)
{
max=goodsnum[i];
}
}// 找销售量最大的物件的售量数
longmax=350/max;//用于确立条形图的一个售量的高度(y 轴的单位长度)
这里用 longmax,就是为了控制售量最多的商品的条形图的最高点,其余数目
能够依据这个比率,画出相应高度的棒状图。
3.function.cpp 里的函数算法剖析
在这个 cpp 文件里,有好多功能函数,都是对数据的办理,其
中有个函数 void searchsold(MOUSESTATE *pm) ,用于显示每次购
买的时间。
p=gmtime(&(ps->t));//转变时间,将文件读取的物件结构中的t//
sprintf(s,"%s%d--%02d--%02d%s%02d:%02d:%02d",a[ps->label-1],(1900+
p->tm_year),(1+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(1)
{
newxy(&pm->mousex,&pm->mousey,&pm->buttons);
if(pm->buttons==1)// 假如鼠标点击
{
if(pm->mousex>370&&pm->mousex<420&&pm->mousey>300&&pm->mousey<320)
//点的是“上一页”的按钮
{
if(ptoi==0)// 假如是第一页
{
outinformation(pm,0);// 第一页the first one ,提示已到最前一页
pm->buttons=0;
delay(200);
continue;//持续循环
}
else//不是第一页
{
ptoi=ptoi-1;// 往前减少一页
setfillstyle(1,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",a[(ps+i)->label-1],(1900+p->tm_ye
ar),(1+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;//持续循环
}
}
if(pm->mousex>450&&pm->mousex<500&&pm->mousey>300&&pm->mousey<320)
//判断能否点在“下一页”
{
if(ptoi>=ptoimax||(ptoirest==0&&ptoi==ptoimax-1))//假如是最后一页
{
outinformation(pm,1); //最后一页the last one, 提示这是最后一页
pm->buttons=0;
delay(200);
continue;// 持续循环
}
else//假如不是最后一页
{
//printf("");
setfillstyle(1,0);
bar(365,85,639,298);
if(ptoi<ptoimax-1)// 假如不是倒数第二页
{
ptoi=ptoi+1;// 页数加 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",a[(ps+i)->label-1],(1900+p->tm_ye
ar),(1+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+1;// 页码加 1
for(i=ptoi*12,j=0;i<n;i++,j++)//显示最后的不到12 个的信息
{
p=gmtime(&((ps+i)->t));
sprintf(s,"%s %d--%02d--%02d%s%02d:%02d:%02d",a[(ps+i)->label-1],(1900+p->tm_ye
ar),(1+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;// 持续循环
}
}
}
if(pm->mousex>530&&pm->mousex<580&&pm->mousey>300&&pm->mousey<320)
//假如点击的“退出”
{
cursor(pm->mousex,pm->mousey);
setfillstyle(1,0);
bar(365,85,639,298);
bar(365,298,600,322);
setwritemode(1);
cursor(pm->mousex,pm->mousey);// 图形操作
break;// 退出循环
}
}
因为用指针操作,所以不可以把空指针也输出来,不然会是乱码,
并且需要判断什么是后到最后一页,什么是有已经是最前一页。
4.input.cpp 里的函数算法剖析
主假如为了提升真切性,当我们在其界面下输入字符时,字符会隔。