自動售貨機c編程_第1頁
自動售貨機c編程_第2頁
自動售貨機c編程_第3頁
自動售貨機c編程_第4頁
自動售貨機c編程_第5頁
已閱讀5頁,還剩139頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

自動售貨機C編程

C語言課程設(shè)計報告

題目:

班級:

組員:

指導(dǎo)教師:

上交日期:自動售貨機自動售貨機圖形模擬仿真學(xué)號:學(xué)號:2011.5.13圖形模

擬系統(tǒng)目錄

1引

.A...

1.1售貨機的背

景..............................................................................

3

1.2編寫目

的...............................................................................

.....3

1.3任務(wù)概

述...............................................................................

.....4

2需求分

析...............................................................................

2.1需求分

析...............................................................................

2.2運行環(huán)

境...............................................................................

3系統(tǒng)設(shè)

計...............................................................................

3.1功能需求描

述..............................................................................

3.2程序流程

圖...............................................................................

3.3功能和操作簡介(界

面)...........................................................3.4程序模塊劃

分..............................................................................3.

5程序中的名詞定義及注釋........................................................

4算法分

析................................................................................

4.1核心算法分

析............................................................................

4.2其他函數(shù)算法分

析....................................................................5程序總

結(jié)................................................................................

5.1編程過程中的疑難點處

理........................................................5.2程序不足之

處............................................................................

1

6組員分

工...............................................................................

......................7參考資

料...............................................................................

..................................................................428具體函數(shù)解釋及原代

碼....................................422

引言

1.1背景自動售貨機是能根據(jù)投入的錢幣自動付貨的機器是商業(yè)自動化的常用設(shè)備,它

不受時間、地點的限制,能節(jié)省人力、方便交易。是一種全新的商業(yè)零售形式,又被稱為

24小時營業(yè)的微型超市。能分為三種:飲料自動售

貨機、食品自動售貨機、綜合自動售貨機。

自動售貨機是一種全新的商業(yè)零售形式,20世紀70

年代自日本和歐美發(fā)展起來。自動售貨咖啡機是一種既可

以出冷熱咖啡也可以同時出奶茶果汁飲料的咖啡飲料自

動售貨機,省時方便快捷。既可以作投資來使用,也可作

為員工福利來使用。

現(xiàn)在,自動售貨機產(chǎn)業(yè)正在走向信息化并進一步實現(xiàn)合理化。24小時無人售貨的系統(tǒng)可

以更省力,運營時需要的資本少、面積小,有吸引人們購買好奇心的自身性能,可以很好

地解決人工費用上升的問題等各項優(yōu)點。

L2編寫目的通過對自動售貨機買賣商品的過程分析,建立模擬自動售貨機的圖形界面

作系統(tǒng),對其投幣、出貨、統(tǒng)計等多個方面的功能模擬,實現(xiàn)模擬真實自動售貨機的操

作流程。

此次C語言課程設(shè)計是木專業(yè)的第一次課程設(shè)計,具有重要的意義:通過上個學(xué)期對C語

言的學(xué)習(xí),對C語言編程有了初步的了解,獲得了一定的基礎(chǔ)但是非常缺乏實際的編程經(jīng)驗,

無法從質(zhì)上對自己的編程技巧有一個很大的提高,這次的課程設(shè)計給我們提供了一個非常

好的鍛煉機會。通過二個人的分工合作,在實際中運用和訓(xùn)練程序設(shè)計的模塊化和工程化

思想和技術(shù),努力掌握C語言精髓;同時提高自己的交流與團隊合作的能力.為以后的更專

業(yè)更復(fù)雜的課程設(shè)計和實踐活動打好基礎(chǔ)。

3

1.3任務(wù)概述

自動售貨機售貨9種商品,價格分別為3元,5元和7元。顧客投入10元、5元或2元

的紙幣,然后選擇購買9種商品之一,自動售貨機吐出商品,并且找給用戶零錢。如果商

品售完,或者無法找零,則給出用戶一個提示,商品已售完,并且退還紙幣。

程序具備以下功能:

庫存查詢:檢索9種商品的儲存量

商品上架:為9種商品增加

銷售查詢:分別統(tǒng)計今天每種商品的銷售量和銷售額

會計查詢:打印當天的往來帳目以及剩余零鈔數(shù)目

結(jié)算功能:能夠取出金額

銷售界面:顧客投入紙幣,選擇商品,獲得商品和零錢;或者直接顯示錯誤并退

還紙幣

要求以自動售貨機為對象,圖形化模擬投幣、找零、出貨的基本流程;能對售貨機的商

品進行管理:補貨、查詢、統(tǒng)計等功能。

二.需求分析

2.1需求分析自動售貨機是一種全新的商業(yè)零售形式,20世紀70年代自日本和歐美發(fā)

展起來。它又被稱為24小時營業(yè)的微型超市。在日本,70%的罐裝飲料是通過自動售貨

機售出的。全球著名飲料商可口可樂公司在全世界就布有50萬臺飲料自動售貨機。

現(xiàn)在,自動售貨機產(chǎn)業(yè)正在走向信息化并進一步實現(xiàn)合理化。自動售貨咖啡機是一種既

可以出冷熱咖啡也可以同時出奶茶果汁飲料的咖啡飲料自動售貨機,省時方便快捷。既可

以作投資來使用,也可作為員工福利來使用。

4

從自動售貨機的發(fā)展趨勢來看,它的出現(xiàn)是由F勞動密集型的產(chǎn)業(yè)構(gòu)造向技術(shù)密集型社

會轉(zhuǎn)變的產(chǎn)物。大量生產(chǎn)、大量消費以及消費模式和銷售環(huán)境的變化,要求出現(xiàn)新的流通

渠道;而相對的超市、百貨購物中心等新的流通渠道的產(chǎn)生,人工費用也不斷上升;再加

上場地的局限性以及購物的便利性等這些因素的制約,無人自動售貨機作為一種必須的機

器便應(yīng)運而生了。

現(xiàn)在,自動售貨機產(chǎn)業(yè)正在走向信息化并進一步實現(xiàn)合理化。例如實行聯(lián)機方式,通過

電話線路將自動售貨機內(nèi)的庫存信息及時地傳送各營業(yè)點的電腦中,從而確保了商品的發(fā)

送、補充以及商品選定的順利進行。并且,為防止地球暖化,自動售貨機的開發(fā)致力于能

源的節(jié)省,節(jié)能型清涼飲料自動售貨機成為該行業(yè)的主流。

程。我們用TC3.0編寫的C語言程序來模擬自動售貨機的控制及各種操作過

2.2運行環(huán)境(DOS環(huán)境)

該系統(tǒng)給予tc2.0和bc31開發(fā),適用于dos3.0以上的所有dos版本和

windows操作系統(tǒng);本軟件設(shè)計中加入了鼠標和鍵盤操作,因此操作過程必須依賴鼠標

和鍵盤才能實現(xiàn)所有功能;本軟件對于顯示卡無特殊要求;本軟件可以允許用戶自定義?

些參數(shù),具有良好的人機交互性。

木軟件主要的輸入方式是數(shù)字輸入,實際操作是通過鍵盤或者鼠標選擇我們給出的漢化

菜單選項。輸出信息也將采用漢化的窗口(包括彈窗)傳遞給用戶。除此之外無其他特殊

要求;

出現(xiàn)圖形無法顯示或圖形顯示效果差——處理辦法:檢查顯示卡驅(qū)動是否正常;出現(xiàn)某

些子程序的初始化無法正常完成——處理辦法:顯示初始化失敗的位置,并退出程序;出

現(xiàn)空間分配失敗——處理辦法:顯示為內(nèi)存不夠,退出程序并檢查內(nèi)存利用情況;

5

三.系統(tǒng)設(shè)計

3.1功能需求描述

進入主界面,可以有管理員入口和顧客模式。

顧客模式先,選擇要購買的飲料。如有庫存則出貨,選擇投硬幣和投紙幣,其中紙幣有

2元5元10元可以供選擇,選擇完幣值后,按鍵確定,在出幣扣找零。

管理員模式先點擊鑰匙口(key),會彈出一個對話框要求輸入密碼確定權(quán)限,進入后

可查詢各種飲料的剩余量和售量、銷售幣額以及顧客購買的時間。管理員還可以進行密碼

的修改。

3.2程序流程圖(見附錄)

3.3功能和操作簡介(界面)

菜單界面——點擊“幫

助”出現(xiàn)如圖上的界

面,按鍵ESC退出;

點擊“退出”,則退出

系統(tǒng);點擊“buy”進

入售貨模式;點擊

“key”進入管理模式

監(jiān)::

DOSBox■.72,CpuCyclesFraaeskip0.Progra*TC

自動售貨機圖形模擬系筑幫助退出

幫助

羸i善夢:娥

M^TER確定,按E"退出當前界面

6

點擊“buy”后進

入售貨模式,選擇

商品,當鼠標到對

應(yīng)商品時會出現(xiàn)

箭頭提示

單擊選擇商品,系

統(tǒng)會查看選擇的

商品是否還有存

貨,如果有會進入投幣環(huán)節(jié),如果沒有,則輸出無存貨,然后對出售貨模式。

進入投幣環(huán)節(jié),當

鼠標移到投紙幣窗

口時,會出現(xiàn)下拉

式菜單,用于選擇投入紙幣的面額,當鼠標移到投硬幣的窗口單擊,會投入一元硬幣,

若投入,會有提示,并顯示此時投入的總額。按鍵ENTER表示確定。

(如單擊10元,右邊會顯示“投入幣額:10元”)

ixDOSBox.0.72,CpuCycles:TC-Inlx|

自動售貨機圖形模擬系統(tǒng)幫助退出

請投幣

回因

國周

回囹

la回回

IB

援確定,按Sc退出當前界面

7

顯示找零,并且會顯示找出的幾個硬幣,幾張多少面值的紙幣,

\1O1/

幫助退it

^1〈

紙1

紙鈔o

元O

然后物品從里面出來。

理員系統(tǒng)

請輸入密碼

ESCexit;ENTERendinput

然DOSBox0.72,CpuCycles■ax,Fraaeskip0.Program:TC-Injxl

自動售貨機圖形模擬系統(tǒng)幫助退出

按EMER確定,按Esc退出當前界面

8

如果點擊“key”,則進入管理界面,進入管理界面是會要求先輸入密碼,按鍵ENTER

表示確定,如果正確就進入管理的菜單,否則退出管理模式。

進入管理菜單:

會選擇對應(yīng)的功能,通過售貨機右中部

的小鍵盤

選擇對應(yīng)的功能。然后系統(tǒng)會根據(jù)小鍵盤返回的值執(zhí)行各個功能函數(shù)。

[UDOSBox0.72,CpuCycles:ax,Fra*eskip0,ProgramTC,1□!x|

自動售貨機圖形模擬系境幫助退出

存量售量收額

可樂30OO

蘇打30OO

檸檬30OO

牛妍30OO

桃汁30OO

橘汁2915

紅茶30OO

綠茶30OO

如啡30OO

總量26915

陰NTER確定,按ESC退出當前界面

功能1:制表,顯示各個物品的信息。

1^④,選擇功能

2曹

3^給

4膏

5查

6圖

回回回

團回國

國同圜

9

功能2:對9中商品補貨,全部補齊,途中會顯示loading。。。。。。功能3:補單

貨,選擇物品,對其存量補齊。

功能4:格式化,對所有的數(shù)據(jù)格式化。

功能5:查詢每次物品賣出的時間

功能6:做系統(tǒng)智能前條形圖,并顯示售貨額最高的物品。

按鍵ENTER確定,顯示銷售額最高

的物品。

按鍵ESC退出功能

功能7:更改密碼。

功能8:顯示售貨機里錢幣的數(shù)量,并取出一定幣額。

toji:DOSBox0.72,CpuCycles:sax,Fraaeskip0,Program:

自動售貨機圖形模擬系或幫助退出

colasodalamomilkpeach|uicaicegreencoffee

按ENTER確定,按Ewe退出當前界面物品

10

loAdingMMw

退出界面

SoxDOSBox0.72,CpuCycles:Fraaeskip0,Prograa:TC,|n|x|

cwm⑸、eCW5WC1E),GD

歡迎使用

G

B

K

E

S

B自動售貨機圖形仿真

G

D

系統(tǒng)

O

W

E

OWD8Q:CME8。

單擊“退出”顯示的退出動畫。

按鍵ENTER退出此界面。

3.4程序模塊劃分

在程序模塊的分析中,為了方便理清函數(shù)之間的調(diào)用關(guān)系,我們采用了函數(shù)級別的定義

方式。自頂向下級次增高,在某些模塊中被多次調(diào)用的小功能函數(shù)定義為該模塊的工具函

數(shù)。故main函數(shù)被定義為一級函數(shù),在main函數(shù)中被直接調(diào)用的子函數(shù)定義為二級函

數(shù),依此類推

主函數(shù)模塊:

#includez/main.h"

voidmainO

intgdriver,gmode;11

MENUPOSITION*pm;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"c:\\tc30\\bgi");〃圖形驅(qū)動welcome0;//歡迎的界

draw。;〃畫界面

menu(pm);〃菜單函數(shù),進入系統(tǒng)

)

主函數(shù)main()中除了調(diào)用welcome()函數(shù)顯示歡迎畫面和draw()函數(shù)畫售貨機界

面;,主要子函數(shù)是調(diào)用的menu。函數(shù)。menu。函數(shù)即菜單選擇模塊的根函數(shù)。下面分別

來介紹這個主要模塊。

一、圖形模塊:主要是界面

二、鼠標模塊:包括鼠標的圖形,鼠標狀態(tài)。

三、漢字模塊:中文顯示

四、菜單模塊:

1.顧客模式:a.選擇貨物b.投幣c.找零(面值優(yōu)先)a.密碼b.庫存查看與添加c.

取走和填補銷售金額2.管理員模式:d.商品銷量統(tǒng)計制表制圖

五、文件模塊:保存銷售和庫存的信息

六、時間模塊:顯示時間,并記錄售貨的時間資料

菜單選擇模塊:

此模塊用于菜單界面的顯示,實現(xiàn)菜單按鈕和鼠標的各種功能。本模塊的核心函數(shù):

voidmenu()(屬于二級函數(shù))

本模塊的二級函數(shù):(被voidmenu()調(diào)用)

work()核心函數(shù),模擬自動售貨機的物品買賣功能

manage()核心函數(shù),自動售貨機管理物品信息的功能函數(shù)

help()系統(tǒng)幫助函數(shù)

thank()界面退出函數(shù),退出界面

bklight()設(shè)置高亮12

其中manage()里面又有一個子菜單的函數(shù)leadmanage(),用于對系統(tǒng)管理功能的

選擇,屬于四級函數(shù)。

其中l(wèi)eadmanage()里的五級函數(shù)有

voidinitallgoods()對物品補全貨的函數(shù)voidinitsinglegoods(MOUSESTATE*pm)

對單個物品補貨的函數(shù)voidsearch()畫表格顯示物品信息的函數(shù)

數(shù)據(jù)格式化的函數(shù)voidrefresh()

voidsearchsold(MOUSESTATE*pm)查詢單次售貨的時間void

outinformation(MOUSESTATE*pm,intn)彈出消息提示的函數(shù)voidautodrawbargraph()

智能畫條形圖函數(shù)

voidsuggest()顯示銷售額最高的商品

leadmanage()會調(diào)用function,cpp里的各種功能函數(shù),包括一些其他cpp文件里的

函數(shù)

模擬自動售貨機售貨模塊(核心)

voidarrow(GOODSDATE*pgc);箭頭

intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg);

選擇物品函數(shù)

intchoosemoney(MOUSESTATE*);

投幣,返回單次投幣的數(shù)額

voidinsertall(MOUSESTATE*,int*);

通過choosemoney的循環(huán),退出后計算總投幣13

voidbuy(GOODSDATE*,int);

傳入選擇的物品信息和總投幣額,進行買賣操作的函數(shù)

voidshowinsertall(int);顯示總頭幣額的函數(shù)

以上的函數(shù)為work的核心調(diào)用函數(shù),還有其他的對文件操作的函數(shù),用于對物品信息

的儲存,下面將在文件模塊中說明。另外此函數(shù)將在算法分析中進行解釋與分析。

文件模塊

voidgoodsfilesave(GOODSDATE*pg)物品信息儲存到文件void

goodsfileread(GOODSDATE*pg)從文件讀取物品信息voidpasswordsave(char*ps)密

碼文件保存

voidpasswordread(char*ps)密碼從文件中讀取

voidsold_file(GOODSDATE*pg,SOLDFILE*ps)

物品售貨單次的信息操作存入文件

voidshowsold_file(SOLDFILE*ps,int*n)

從文件中讀取物品單次操作信息的函數(shù)

voidmoneynumsave(MONEYNUM*pmn);錢幣數(shù)量的儲存voidmoneynumread(MONEYNUM

*pmn);錢幣數(shù)量的讀取

鼠標漢字模塊

voidshubiaoO對鼠標初始化

voidcursor(inta,intb)在(a,b)點畫鼠標14

intread(int*x,int*y,int*buttons)

調(diào)用中斷來讀鼠標的狀態(tài)如果鼠標不動,這一直在里面循環(huán),直到鼠標狀態(tài)改變或是按

鍵,就退出循環(huán)

voidneyxy(int*x,int*y,int*buttons)

鼠標移動的函數(shù),通過read的返回值在異或的模式下,覆蓋原來的鼠標和畫新的鼠

標。

Outtextxy(int,int,char*,int)漢字輸出

動畫圖形模塊

voidoutgoods(intn)商品出貨動畫的函數(shù)

voidoutmoney(intn)吐幣函數(shù)

Voidthank();退出系統(tǒng)的動畫

Voidwelcome();進入系統(tǒng)的動畫

輔助模塊

voidbklight(MENUPOSITION*p,MOUSESTATE*pms)

設(shè)置高亮

voidloading0模擬等待過程的動畫函數(shù)

intinputpassword(char*s,intn)專用于密碼輸入的函數(shù)

intreadboard(MOUSESTATE*pm)小鍵盤的讀取,返回鍵盤值int

mouseonkey(KEYBOARD*pm)判斷鼠標是否在小鍵盤上相

應(yīng)的位置,如果是,返回1

voidoutinformation(MOUSESTATE*pm,intn)彈出消息提

示的函數(shù)

voidcheckcount(intagoods[9])讀取商品的售量函數(shù)151ntmouseon(MENUPOSITION

*pm)判斷鼠標是否在菜單項

的位置上

voidarrow(GOODSDATE*pgc);箭頭

時間模塊

voidbuytimc(SOLDFILE*p)紀錄購買貨物的時間

讀取系統(tǒng)的時間,并賦值到結(jié)構(gòu)中的長整型變量t,以文件的

形式把結(jié)構(gòu)中的數(shù)據(jù)存儲下來

3.5程序中的名詞定義及注釋

1.對文件名(*.cpp)的解釋

MAIN.CPP主函數(shù)

BACKPH.CPP用于畫界if

BKLIGHT.CPP鼠標高亮

BUY_TIME.CPP讀取系統(tǒng)時1

COUNT.CPP條形圖的顯示1

FUNCTION.CPP(核心)附有管理員勸

GOODS.CPP對物品的文件3

GUANLI.CPP進入管理員界面的I-

HANZLCPP用于中文漢字4

HELP.CPP系統(tǒng)的help萬

MENU.CPP進入系統(tǒng)的mem

MOUSECPP對鼠標操作

OUTGOODS.CPP物品出貨動L

PASSWORD.CPP對密碼操作

SOLDFILE.CPP每次購買信息存盤依

THANK.CPP退出系統(tǒng)的應(yīng)

WELCOME.CPP進入系統(tǒng)的過

WORK.CPP(核心)購買物品購買物品

16

2.程序中的結(jié)構(gòu)定義:

typedefstruct_menu

intxl;

intyl;

intx2;

inty2;〃四個角的坐標

intrx;

intry;〃輸出headline的左上點的坐標char*headname;

}MENUPOSITION;主界面菜單欄結(jié)構(gòu)

對菜單的操作時,用于鼠標點擊時判斷位置。

typedefstruct_mouse

(

intmousex;

intmousey;〃鼠標的坐標點

intbuttons;〃鼠標按鍵click的狀態(tài)

}MOUSESTATE;鼠標結(jié)構(gòu)

17

MONEYNUM.CPP對錢幣的數(shù)依的管

當圖形界面轉(zhuǎn)換時,需要傳遞鼠標的位置,以免留下鼠標印。

typedefstructsoldfile

(

longt;〃購買的時間,從系統(tǒng)中讀取

intlabel;〃商品的標號

char*name;〃商品的名字

intprice;〃商品的價格

}SOLDFILE;已售出貨物的結(jié)構(gòu)

此結(jié)構(gòu)用于當每次對物品操作時,保存單次記錄,以存入文件中。

typedefstruct_goods

(

intlabel;〃商品的標號

char*name;〃商品的名字

intprice;〃商品的價格

intsavenum;〃商品的存量

intsoldnum;〃商品的售量

intgoodsincome;//商品的銷售額

intx,y;〃圖形界面上的商品的坐標18

JGOODSDATE;貨品信息結(jié)構(gòu)

用于對物品信息的處理。

typedefstruct_key

(

intxl;

intyl;

intx2;

inty2;〃小鍵盤上按鍵的四個頂點的坐標

char*str;〃小鍵盤上鍵的符號

}KEYBOARD;界面小鍵盤按鍵結(jié)構(gòu)

typedefstruct_moneynum

intvalueone;〃一元硬幣的數(shù)量

intvaluetwo;〃兩元紙幣的數(shù)量

intvaluefive;〃五元紙幣的數(shù)量

intvalueten;〃十元紙幣的數(shù)量

}MONEYNUM;錢幣數(shù)量的結(jié)構(gòu)

3.函數(shù)名詞定義及解釋

1.BACKPH:包含函數(shù)

voiddraw()用于構(gòu)建主菜單的圖形界面

2.BKLIGHT:包含函數(shù)

voidbklight(MENUPOSITION*p,MOUSESTATE*pms)19設(shè)置高亮

3.BUYTIME:包含函數(shù)

voidbuytime(SOLDFILE*p)紀錄購買貨物的時間

4.COUNT:包含函數(shù)

voidcheckcount(intagoods[9])讀取商品的售量函數(shù)

voidautodrawbargraph()智能畫表形圖函數(shù)

voidsuggest()顯示銷售額最高的商品

5.FUNCTION:包含函數(shù)

voidinitallgoodsO對物品補全貨的函數(shù)

voidinitsinglegoods(MOUSESTATE*pm)對單個物品補貨的函數(shù)

voidsearch()畫表格顯示物品信息的函數(shù)

數(shù)據(jù)格式化的函數(shù)voidrefresh()

voidsearchsold(MOUSESTATE*pm)查詢單次售貨的時間

voidoutinformation(MOUSESTATE*pm,intn)彈出消息提示的函數(shù)

6.GOODS:包含函數(shù)

voidgoodsinit(GOODSDATE*pg)對物品信息的初始化

voidgoodsfilesave(GOODSDATE*pg)物品信息儲存到文件

voidgoodsfileread(GOODSDATE*pg)從文件讀取物品信息

7.GUANLI:包含函數(shù)

voidmanage(MOUSESTATE*ms)管理界面的“主函數(shù)”

voidleadmanage(MOUSESTATE*p)管理的界面的菜單函數(shù)

intreadboard(MOUSESTATE*pm)小鍵盤的讀取,返回鍵盤值20

intmouseonkey(KEYBOARD*pin)判斷鼠標是否在小鍵盤上相

應(yīng)的位置,如果是,返回1

8.HANZI:漢字庫

此cpp是用作漢字輸出的調(diào)用,非編者編寫

9.HELP:包含函數(shù)

voidhelpOmenu中的幫助選項

10.INPUT:包含函數(shù)

intinputpassword(char*s,intn)專用于密碼輸入的函數(shù)intinput(char*s,int

n)用于一般的信息輸入11LOADING:包含函數(shù)

voidloading()模擬等待過程的動畫函數(shù)

12.MAIN:

VoidmainO主函數(shù)

13.MENU:包含函數(shù)

voidmenu(MENUPOSITION*pm)初始化菜單中的選項voidchoose(MENUPOSITION*pm)

菜單選擇函數(shù)intmouseon(MENUPOSITION*pm)判斷鼠標是否在菜單項

的位置上

14:MOUSE:鼠標函數(shù)

voidshubiaoO對鼠標初始化

voidcursor(inta,intb)在(a,b)點畫鼠標

intread(int*x,int*y,int*buttons)21

調(diào)用中斷來讀鼠標的狀態(tài)如果鼠標不動,這一直在里面循環(huán),直到鼠標狀態(tài)改變

或是按鍵,就退出循環(huán)

voidneyxy(int*x,int*y,int*buttons)

鼠標移動的函數(shù),通過read的返回值在異或的模式下,覆蓋原來的鼠標和畫新的鼠

標。

15:OUTGOODS:包含函數(shù)

voidoutgoods(intn)商品出貨動畫的函數(shù)

voidoutmoney(intn)吐幣函數(shù)

16:PASSWORD:包含函數(shù)

voidout_text(int);password中人機對話的函數(shù)

voidpasswordsave(char*ps)密碼文件保存

voidpasswordread(char*ps)密碼從文件中讀取

voidpasswordmodofy()修改密碼的功能

intpassword()進入管理界面時判斷輸入密碼是否正確17:S0LDFILE:包含函數(shù)

voidsoldfile(GOODSDATE*pg,SOLDFILE*ps)

物品售貨單次的信息操作存入文件

voidshowsold_fi1e(SOLDFILE*ps,int*n)

從文件中讀取物品單次操作信息的函數(shù)

18:THANK:

Voidthank();退出系統(tǒng)的動畫

19:WELCOME:

Voidwelcome();進入系統(tǒng)的動畫

20:WORK:

22

voidarrow(GOODSDATE*pgc);箭頭

intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg);

選擇物品函數(shù)

intchoosemoney(MOUSESTATE*);

投幣,返回單次投幣的數(shù)額

voidinsertall(MOUSESTATE*,int*);

通過choosemoney的循環(huán),退出后計算總投幣

voidbuy(GOODSDATE*,int);

傳入選擇的物品信息和總投幣額,進行買賣操作的函數(shù)

voidshowinsertall(int);顯示總頭幣額的函數(shù)voidwork(MOUSESTATE*ps)核心

函數(shù)

21:MONEYNUM:

voidinitmoneynum(MONEYNUM*pmn);初始化錢幣的數(shù)量void

moneynumsave(MONEYNUM*pmn);錢幣數(shù)量的儲存voidmoneynumread(MONEYNUM*pmn);

錢幣數(shù)量的讀取voidmoneynumadd(int,MONEYNUM*);錢幣數(shù)量相加

voidinitmoneynumzero(MONEYNUM*pmn);設(shè)置錢幣數(shù)量全為0void

moneynumwithdrawO;顯示錢幣數(shù)量后取幣額intmoneynumdepend(MONEYNUM

*pmn,MONEYNUM*ppmtemp,intallmoney);錢幣數(shù)量判斷函數(shù),判斷是否可以找零void

moneynumshow(MONEYNUM*pmn);錢幣數(shù)量顯示函數(shù)23

四.算法分析

4.1核心算法(work)的分析

work函數(shù)主要由外部函數(shù)

outgoods(int)

outmoney(int)

和內(nèi)部函數(shù)

voidarrow(GOODSDATE*pgc)

intchoosegoods(MOUSESTATE*ps,GOODSDATE*pg)

intchoosemoney(MOUSESTATE*)

voidinsertall(MOUSESTATE*,int*)

voidbuy(GOODSDATE*,int)

voidshowinsertall(int);構(gòu)成

主要流程為先執(zhí)行choosegoods函數(shù)選擇貨物,通過指針返回貨物編號并讀取貨物信

息,判斷貨物是有存量之后執(zhí)行下一步操作,否則提示并返回。確定有存貨后開始投幣。

voidinsetall函數(shù)與intchoosemoney函數(shù)處于同,級別,在投幣的同時計算投幣總量

并顯示存儲起來。投幣結(jié)束enter鍵確認,進入buy函數(shù)。buy是整個work中最重要的部

分,首先判斷投幣總額與選擇貨物時返回編號的貨物的價格進行選擇,如果投入金額小

于價格則提示并退出;當投入金額大于價格時,首先對貨物的信息進行處理,即更改貨物

的存量與售貨量。然后處理一塊圖形區(qū)域,顯示售貨信息。

24

下面分析算法中的重難點:

1

staticGOODSDATEa[9];

goodsfi1eread(&a[0]);〃讀取貨品信息

intn,insertmoney,flag;

n=choosegoods(ps,&a[0]);//選貨,返回貨品號(label-1)在主函數(shù)的最開始,讀

取9種貨物的物品信息。

在整個程序中,都是用指針通過傳遞貨物的標號來讀取貨物信息進行處理的!

2

goodsfilesave(&a[0]);程序的最后對被處理的貨物數(shù)據(jù)要進行儲存。

3

選擇貨物時使用FOR循環(huán)

for(;;)〃通過鼠標的位置讀取貨品信息通過指針傳遞(循環(huán))

25{newxy(&ps->mousex,&ps->mousey,&ps->buttons);if((ps->mousex)<=73&&(ps-

>mousex)>=49&&(ps->mousey)>=133

&&(ps->mousey)<=165)〃鼠標處于第一個貨物圖形區(qū)域

{arrow(pg+0);〃顯示箭頭

if(ps->buttons){cursor(ps->mousex,ps->mousey);x=0;〃選定貨物

returnx;〃返回貨物編號

)

通過鼠標的位置傳遞,來顯示出幫助的箭頭。點擊鼠標后返回貨物

的編號,在今后的處理中,都通過編號讀取的

貨物結(jié)構(gòu)信息來處理數(shù)據(jù)并儲存。

4

while(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(〃肌T,*allmoney);cursor(ps->mousex,ps->mousey);

showinsertall(*allmoney);〃顯示目前已投幣總額

}ps->buttons=0;

在insertall函數(shù)中,使用while循環(huán)計算投幣總量,很好理解。中間插入的

showinsertall函數(shù)即分配一塊區(qū)域進行投幣是的提示信息。所以在最后需要做處理:

if(bioskey(1))

{if(bioskey(0)==ENTER)27{setfillstyle(l,0);bar(390,90,620,120);〃投幣完

畢之后將界面中顯示金額總量的圖形區(qū)域初始化

break;〃跳出ps->buttons=0;curstoxy(ps);cursor(ps->mousex,ps->mousey);將

顯示金額總量的圖形區(qū)域初始化并跳出。方便后續(xù)操作

5

在處理投幣的時候?qū)垘抛隽艘粋€指針數(shù)值:

char*value[]={〃RMB:2〃,〃RMB:5〃,〃RMB:10〃};〃定義紙幣的指針數(shù)組

6

在后續(xù)操作中都是處理紙幣信息儲存的地址:outtextxy(185,180,value[0]);

outtextxy(185,200,value[l]);outtextxy(185,220,value[2]);買賣函數(shù)(投幣金額大

于價格的情況):28if(a>=pg->price)〃投幣大于價格{pg->savenum=pg->savenum-l;

〃存貨減一pg->soldnum=pg->soldnum+l;〃已售貨物數(shù)量加一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);

首先對貨物數(shù)據(jù)進行操作再對圖形進行處理,提示信息。使其有足夠內(nèi)存。

最后再將顯示幫助信息的區(qū)域初始化。

7

voidshowinsertall(intmoney)

在顯示投幣總量函數(shù)中使用sprintf系統(tǒng)函數(shù),使數(shù)字與字符串一起顯示。而在之前的

程序中我們并未

掌握這一函數(shù)所以是先使用itoa(rest,ch,10);itoa函數(shù)將數(shù)字轉(zhuǎn)化為字符串再和漢

子一起輸出顯示。

setfillstyle(1,0);chars[80];bar(390,90,620,120);sprintf(s,“投入幣額:%d

元“,money);OutTextxy(390,90,s,4);

4.2其他算法的分析

1.guanli.cpp里的函數(shù)算法分析30

進入管理模式時,會要求輸入密碼

flag=0;

flag=password();〃返回值為1則表示輸入密碼正確

(

leadmanage(ms);//shouliangchunhuohuochunchakanqubie

}----manage();

if(flag==l)

a=readboard(p);//readboard是讀取小鍵盤的按鍵值的函數(shù)

返回值a,用swith(a)來選擇功能

switch(a)對應(yīng)各種功能〃

(

case1:search();

break;

case2:initallgoodsO;

break;

case3:initsinglegoods(p);

break;

case4:refresh();

break;

case5:searchsold(p);

break;

case6:printf(〃");//demand

autodrawbargraph();

suggest();break;

case7:passwordmodefy();

break;

case8:moneynumwithdraw();

break;

default:break;

}----leadmanage();

2.count,cpp里的函數(shù)算法分析

在這個cpp文件里,有一個只能畫條形圖的函數(shù)autodrawbargraph(),它會31更具

物品的數(shù)量畫出條形圖!

for(i=0;i<9;i++)

(

if((max<goodsnum[i])==1)

max=goodsnum[i];

)〃找出售量最大的物品的售量數(shù)

longmax=350/niax;〃用于確定條形圖的一個售量的高度(y軸的單位長度)

這里用longmax,就是為了控制售量最多的商品的條形圖的最高點,其他數(shù)量可以根據(jù)

這個比例,畫出相應(yīng)高度的棒狀圖。

3.function,cpp里的函數(shù)算法分析

在這個cpp文件里,有很多功能函數(shù),都是對數(shù)據(jù)的處理,其中有個函數(shù)void

searchsold(MOUSESTATE*pm),用于顯示每次購買的時間。

「二8m日1113(&85->。);〃轉(zhuǎn)化時間,將文件讀取的物品結(jié)構(gòu)中的t〃

sprintf(s,z,%s%d—%02d—%02d%s%02d:%02d:%02dz/,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是一個系統(tǒng)定義的結(jié)構(gòu),用于把時間轉(zhuǎn)換為年月日時分秒。以上是其顯示的語

句。

由于物品的購買次數(shù)會很多,所以不可能一次在屏幕上顯示所有的的信息,于是我們,

把他們分為每12個一組,每次顯示12個。于是又操作頁面,點擊進入“上一頁”或是

“下一頁”或是“退出"。while(l)

newxy(&pm->mousex,&pm->mousey,&pm->buttons);

if(pm->buttons==l)〃如果鼠標點擊32

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);

continue;〃繼續(xù)循環(huán)

)

else〃不是第一頁

(

ptoi=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,z,%s%d—%02d—%02d%s%02d:%02d:%02d,z,a[(ps+i)->label-l],(1900+p-

>tmyear),(l+p->tmmon),(p->tmmday),wday[p->tmwday],p->tmhour,p->tmmin,p-

>tm_sec);outtextxy(370,90+j*14,s);

)

pm->buttons=0;

delay(200);

continue;〃繼續(xù)循環(huán)

)

)

if(pm->mousex>450&&pm->mousex<500&&pm->mousey>300&&pm->mousey<320)〃判斷是

否點在“下一頁”

if(ptoi>=ptoimax|(ptoirest==0&&ptoi==ptoimax-l))〃如果是最后一頁

outinformation(pm,1);〃最后一頁thelastone,提示這是最后一頁

pm->buttons=0;

delay(200);

continue;〃繼續(xù)循環(huán)

)

else〃如果不是最后一頁

{33

//printf;setfillstyle(l,0);bar(365,85,639,298);if(ptoi<ptoimax-l)//

如果不是倒數(shù)第二頁{

ptoi=ptoi+l;//頁數(shù)加1,顯示12個for(i=ptoi*12,j=0;i<(12+12*ptoi);i++,j++)

{p=gmtime(&((ps+i)->t));

sprintf(s,z,%s%d—%02d—%02d%s%02d:%02d:%02d,z,a[(ps+i)->label-l],(1900+p-

>tmyear),(l+p->tmmon),(p->tmmday),wday[p->tmwday],p->tmhour,p->tmmin,p-

>tm_sec);

outtextxy(370,90+j*14,s);}pm->buttons=0;delay(200);continue;〃繼續(xù)循環(huán)}

else〃如果是倒數(shù)第二頁{ptoi=ptoi+l;//頁碼加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:%02dz,,a[(ps+i)->label-l],(1900+p-

>tmyear),(l+p->tmmon),(p->tmmday),wday[p->tmwday],p->tmhour,p->tm_min,p-

>tmsec);

if(pm->mousex>530&&pm->mousex<580&&pm->mousey>300&&pm->mousey<320)〃如果點

擊的“退出”

cursor(pm->mousex,pm->mousey);

setfillstyle(l,0);

bar(365,85,639,298);

bar(365,298,600,322);

setwritemode(1);

34outtextxy(370,90+j*14,s);}pm->buttons=0;delay(200);continue;〃繼續(xù)循

環(huán)}cursor(pm->mousex,pm->mousey);〃圖形操作

break;//退出循環(huán)

因為用指針操作,所以不能把空指針也輸出來,否則會是亂碼,并且需要判斷什么是后

到最后一頁,什么是有已是最前一頁。

4.input.cpp里的函數(shù)算法分析

主要是為了提高真實性,當我們在其界面下輸入字符時,字符會隔一段時間后變成

主要實現(xiàn)代碼為

while(l)

m=0;k=bioskey(0);if(k==ESC)break;switch(k)

caseENTER:if(i=0)continue;else{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:重點看這里,在輸

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論