版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
12/76華中科技大學(xué)控制科學(xué)與工程系C語言課程設(shè)計報告超市庫存管理系統(tǒng) 專業(yè):自動化 班級:自動化0904班 組員:李衢鵬U200914348 黎浩U200914330 指導(dǎo)教師:周純杰何頂新彭剛完成時間:2010年11月21日星期天目錄:一.引言……………41.任務(wù)背景……………42.編寫目的……………43.任務(wù)概述……………….…………..………………4二.功能及操作介紹………….….5界面1—?dú)g迎暨人員登錄界面………………5界面2—主界面………………….………6界面3—信息查詢界面……………………7界面4—退出界面……….………………8三.系統(tǒng)設(shè)計分析…………………91.程序流程圖…………….……….……92.程序模塊分析………………..………101)主函數(shù)模塊………………….………102)登陸及人員編輯模塊…………….……113)主菜單模塊…………………….……144)超市仿真模擬模塊……….……………183.核心算法分析……………………..…211)鏈表的應(yīng)用…………………….……212)圖形界面下的同步輸入顯示……….……223)超市模擬仿真………………..………25四.不足之處……………..………29五.編程分工……….……………30六.程序設(shè)計心得….……………30七.參考資料…………………..…31八.程序源代碼…………………31一.引言1.任務(wù)背景 在為期一學(xué)期的c語言課程學(xué)習(xí)之后,需要我們能扎實掌握所學(xué)知識,能夠?qū)⑵潇`活運(yùn)用到實際當(dāng)中。于是在大二上學(xué)期布置了c語言課設(shè)的任務(wù),本次課設(shè)2至3人一組,共設(shè)置了22個題材,采用抽簽的方式選擇各組的題目。每組須在大約兩個月的時間內(nèi),編寫出不少于1000行的c語言程序。并要求所編寫的程序能正常運(yùn)行,并符合生活實際。我們組的題目為“超市庫存管理系統(tǒng)”,在下面的內(nèi)容中將詳細(xì)介紹。2.編寫目的此次C語言課程設(shè)計是本專業(yè)的第一次課程設(shè)計,具有重要的意義:通過上個學(xué)期對C語言的學(xué)習(xí),對C語言編程有了初步的了解,獲得了一定的基礎(chǔ)但是非常缺乏實際的編程經(jīng)驗,無法從質(zhì)上對自己的編程技巧有一個很大的提高,這次的課程設(shè)計給我們提供了一個非常好的鍛煉機(jī)會。通過二個人的分工合作,在實際中運(yùn)用和訓(xùn)練程序設(shè)計的模塊化和工程化思想和技術(shù),努力掌握C語言精髓;同時提高自己的交流與團(tuán)隊合作的能力.為以后的更專業(yè)更復(fù)雜的課程設(shè)計和實踐活動打好基礎(chǔ)。3.任務(wù)概述以某超市為研究對象,了解超市商品進(jìn)出庫管理的基本數(shù)據(jù)流程,能對超市商品進(jìn)行日常維護(hù)(錄入、刪除、編輯修改)具有存儲、出庫、入庫、查找、統(tǒng)計等功能。在編寫此程序的基礎(chǔ)上掌握編修大程序的一些基本知識與技巧,為以后真正的走向社會,編修高效率的程序作準(zhǔn)備。二.功能及操作介紹界面1—?dú)g迎暨人員登錄界面該界面一方面用于在歡迎使用者的同時初步讓使用者了解到程序的大概內(nèi)容:“超市庫存管理系統(tǒng)”。另外它同時是一個登錄界面以及用戶的編輯界面??梢詫崿F(xiàn)登錄到主界面以及常規(guī)的用戶編輯功能。并且它有這自身所帶的退出功能。界面2—主界面該界面是程序的主題界面,幾乎程序中所有的功能都是在本屆面之下實現(xiàn)的。它本身根據(jù)用途的不同分為3個板塊。一個是最上面的主菜單板塊,用于實現(xiàn)菜單選項中相應(yīng)的功能;另一個是左邊的實時信息顯示反饋板塊,用于實時反映當(dāng)前超市各種商品的各類信息;最后一個是右邊的超市實際銷售情況的模擬板塊,用于仿真模擬現(xiàn)實超市顧客購買呢商品的情況。界面3—信息查詢界面該界面是用于主界面主菜單中的“查詢”功能的界面,主要是商品各類信息比較多,需要大版面的空間予以系統(tǒng)詳盡的顯示,方便使用者查詢各類所需要了解的信息。界面4—退出界面該界面是程序整體退出時的一個結(jié)束界面,一個動態(tài)的動畫感謝使用者對于本程序的使用,在按下任意鍵后,程序結(jié)束。三.系統(tǒng)設(shè)計分析程序開始1.程序流程圖程序開始新用戶注冊新用戶注冊用戶編輯歡迎登錄界面用戶編輯歡迎登錄界面舊用戶注銷舊用戶注銷登登錄密碼修改密碼修改超市商品信息實時顯示主超市商品信息實時顯示主界面開始主菜開始主菜單 超市仿真模擬退出返回超市仿真模擬退出返回查詢編輯 Space 鍵歡迎登錄界面歡迎登錄界面信息查詢界面入出庫提醒入出庫提醒Enter鍵添加商品 Ese鍵添加商品添加商品手動入庫添加商品主界面主界面刪除商品 其他鍵 自動入庫刪除商品修改商品信息修改商品信息入出庫管理入出庫管理結(jié)束界結(jié)束界面程序結(jié)束程序結(jié)束2.程序模塊分析1)主函數(shù)模塊voidmain(){ intgd=VGA,gm=VGAHI;//用于圖形界面初始化 intkey,x,y,mflag=0,dlflag=0,rsflag=0;//主菜單功能選擇標(biāo)記,登陸人員職能選擇標(biāo)記,顧客人數(shù)標(biāo)記 intmx=320,my=240,mbutt=0;//鼠標(biāo) renyuan*ryhead=rycreat();//創(chuàng)建人員鏈表 shangpin*sphead=spcreat();//創(chuàng)建商品鏈表 intn=0,q=0,a[18],x1[18],y1[18],c[18];//用于模擬銷售,總顧客人數(shù)最多18人??傤櫩蛿?shù)目,定位所選顧客標(biāo)記,顧客所走步數(shù),顧客所在橫坐標(biāo),顧客所在縱坐標(biāo),顧客所購買商品及顧客顏色標(biāo)記 charstr1[11],str2[11];//登陸時輸入用戶名和密碼 char*menu[]={"編輯","查詢","返回","退出"}; char*xs[2][5]={{"編號","名稱","價格","現(xiàn)存","已售"},{"編號","名稱","總?cè)霂?,"總出庫","庫存"}}; char*ms,*msp;//ms用于顯示鼠標(biāo),msp用于恢復(fù)原鼠標(biāo)所在位置畫面 initgraph(&gd,&gm,"C:\\TC30\\BGI");//圖形界面初始化 cleardevice(); mouse(&ms,msp);//畫鼠初始化 while(1) { hyjiemian();//歡迎及登陸界面繪制 while(1)//歡迎登陸界面 { read1(&mx,&my,&mbutt,ms,msp); dlxz(mx,my,mbutt,&dlflag);//選擇登陸人員職能 if(denglu(ryhead,mx,my,mbutt,str1,str2,dlflag))break; rybj(ryhead,&mx,&my,&mbutt,dlflag,&ms,msp);//人員編輯功能 } zhujiemian(sphead,menu,xs); while(1)//主界面 { read1(&mx,&my,&mbutt,ms,msp); menuxz(mx,my,menu,&mflag);//主菜單功能選擇 if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)//模擬銷售開始選擇 { if(moni(sphead,&rsflag,&n,&q,a,x1,y1,c)) { tixing(sphead); } } if(mflag==4&&mbutt==1)//結(jié)束整個函數(shù) { jieshu(); } elseif(mflag==3&&mbutt==1)//返回登錄界面 { dlflag=0; break; } elseif(mflag==1&&mbutt==1&&dlflag==1)//商品信息編輯功能 { spbj(sphead,&mx,&my,&mbutt,&ms,msp,c); zhujiemian(sphead,menu,xs); } elseif(mflag==2&&mbutt==1)//商品信息查詢功能 { spcx(sphead); zhujiemian(sphead,menu,xs); } } }} 主函數(shù)main()反映了各個功能板塊之間的聯(lián)系。函數(shù)在定義各變量值時,同時定義創(chuàng)建了登陸人員和默認(rèn)商品兩個鏈表。這是程序的準(zhǔn)備階段。后面在程序進(jìn)行完圖形初始化和鼠標(biāo)初始化以后,程序正式進(jìn)入主體部分。函數(shù)主題有三個嵌套的while(1)語句構(gòu)成。外層一個while(1)語句,和內(nèi)層兩個并列的while(1)語句。外層的while(1)語句保證程序一直循環(huán)運(yùn)行,可以實現(xiàn)從程序后面的語句跳轉(zhuǎn)到程序前面的語句,達(dá)到“返回”的效果。內(nèi)層兩個while(1)語句,前面一個接在“歡迎暨登錄界面”繪制函數(shù)hyjiemian();后面,用于該界面下的各項功能的實現(xiàn),后面一個while(1)語句接在“主界面”繪制函數(shù)zhujiemian(sphead,menu,xs);后面,用于主界面下各項功能的實現(xiàn)。 主界面下各項功能板塊,上面初略提到過是三大板塊。他們中的“主菜單功能選擇”函數(shù)menuxz(mx,my,menu,&mflag);配合下面的“主菜單功能選擇”標(biāo)記mflag實現(xiàn)主菜單板塊中的各項功能,而現(xiàn)實超市銷售情況的模擬仿真板塊則由“開始按鈕”if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)和“模擬超市銷售動畫”函數(shù)moni(sphead,&rsflag,&n,&q,a,x1,y1,c);,“庫存不足,入出庫提醒”操作函數(shù)tixing(sphead);兩個函數(shù)實現(xiàn)。這兩個板塊是并行的,不可以同時進(jìn)行。而主界面下的另一大板塊實時信息顯示反饋板塊,則是穿插在另外兩大板塊之間,應(yīng)為另外兩大板塊都會引起超市商品信息的改變,而要做到實時反饋就只能深入這兩個板塊中去。 下面將就各個具體的模塊功能做一些講解。2)登陸及人員編輯模塊 該模塊主要用于使用人員登錄和用戶信息的編輯操作。本模塊的核心函數(shù): renyuan*rycreat(); intdenglu(renyuan*h,intmx,intmy,intmbutt,char*str1,char*str2,intdlflag); voidrybj(renyuan*h,int*x0,int*y0,int*mb,intdlflag,char**ms,char*msp); renyuan*rycreat();函數(shù)通過文件renyuan.txt的讀取,將已經(jīng)注冊過的已有的用戶信息創(chuàng)建成鏈表。鏈表結(jié)點(diǎn)結(jié)構(gòu)如下:typedefstructnode1{ intryflag;使用人員的職能,分為管理者(1)和普通人(0) charname[11];用戶名 charmima[11];用戶密碼 structnode1*next;指向下一個結(jié)點(diǎn)}renyuan; 最初程序默認(rèn)的用戶是兩個:1gly12345;0ptr54321。 intdenglu(renyuan*h,intmx,intmy,intmbutt,char*str1,char*str2,intdlflag);函數(shù)用于用戶的登陸操作。它包括職能的判斷,用戶名的輸入及判斷,密碼的輸入及判斷,登陸時信息反饋。 用戶職能使用int型整數(shù)來確定,通過p->ryflag==dlflag;(dlflag:用戶登錄職能的標(biāo)記)語句來實現(xiàn)它的判斷;用戶名是char型字符串,則通過strcmp(p->name,str1)==0;語句來實現(xiàn)判斷用戶名是否正確;同樣的,用戶密碼也是char型字符串,通過strcmp(p->mima,str2)==0;來判斷用戶密碼是否正確。在輸入完全后,點(diǎn)擊“登陸”選項來實現(xiàn)上述判斷,并給出相應(yīng)的判斷信息反饋,,如上圖右圖中的“密碼錯誤!”,從而方便使用者更好的使用各種功能。 voidrybj(renyuan*h,int*x0,int*y0,int*mb,intdlflag,char**ms,char*msp);函數(shù)用于用戶信息的編輯操作。 用戶人員信息編輯包括三個方“新用戶注冊”,“舊用戶注銷”,“密碼修改”。通過調(diào)用一下函數(shù)實現(xiàn): intzhuce(renyuan*h,intryflag);新用戶注冊功能 intzhuxiao(renyuan*h);舊用戶注銷功能 intryxiugai(renyuan*h);密碼修改功能 實現(xiàn)是用于輸入的圖框函數(shù)通過調(diào)用一下函數(shù)實現(xiàn): voidzccaidan();用于新用戶注冊的圖框 voidzxcaidan();用于舊用戶注銷的圖框 voidryxgcaidan();用于密碼修改的圖框 在用戶人員信息編輯的同時會有實時信息的反饋,如上圖的“注冊成功!”,方便使用者更好的使用這些功能,在輸入數(shù)據(jù)后按下Enter鍵(確認(rèn)鍵,回車鍵)表示該數(shù)據(jù)輸入完成。而在編輯的任意位置按下Space鍵(空格鍵)都可以結(jié)束編輯,放棄此次編輯。 “新用戶注冊”功能執(zhí)行時的職能選擇與“登陸”時的職能選擇共用。如上圖就是成功注冊了一個職能為“管理員”的新用戶?!靶掠脩糇浴惫δ?,在成功注冊之后,通過尾插法在用戶人員鏈表后面插入新結(jié)點(diǎn),保存新注冊的用戶信息,則在登錄時該用戶就可以直接使用了。 “舊用戶注銷”功能,不考慮用戶職能,在判斷用戶名存在,兩次確定用戶密碼后,直接通過鏈表的結(jié)點(diǎn)刪除操作,注銷掉舊用戶,則在登錄時該用戶將不存在,無法實現(xiàn)登錄操作了。至于用戶名和密碼的判斷確認(rèn)同前面的登錄操作時的是一樣的。 “密碼修改”功能只能修改密碼,而不能修改用戶名和用戶職能,與現(xiàn)實情況基本保持一致。 同時在操作成功之后,都會對保存用戶信息的文件renyuan.txt進(jìn)行寫操作,把更改后的新用戶信息寫進(jìn)去,保存起來。那么當(dāng)程序結(jié)束后,這些信息還將一直存在,等到下一次登錄時,renyuan*rycreat();函數(shù)通過直接讀取這些信息創(chuàng)建用戶人員鏈表,這樣就可以實現(xiàn)以前注冊的用戶依然可以使用。及各項用戶人員操作將保存起來,延續(xù)到以后程序當(dāng)中。 本模塊的其它函數(shù): voidhyjiemian();整個歡迎暨登陸界面的繪制函數(shù)。 voiddlxz(intmx,intmy,intmbutt,int*dlflag);登陸及新用戶注冊時用戶職能的選擇函數(shù)。 voidrybjxz(intmx,intmy,char*rybj[],int*bjflag);用戶人員信息編輯時菜單中各項操作的選擇函數(shù)。 voidrybjcaidan(char*rybj[]);用戶人員信息編輯下來菜單 voidhfrybj();用戶人員信息編輯下來菜單區(qū)域的恢復(fù) voidryhf();//用戶人員信息編輯功能實現(xiàn)所用圖框區(qū)域的恢復(fù) voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠標(biāo)工具函數(shù),用于 需要鼠標(biāo)的各項功能的實現(xiàn) voiddisphz16(intx,inty,intz,inta,intcolor,char*p);繪制圖畫時的漢字輸出 intzifuinput(charstr[],intx,inty);鍵盤輸入同時顯示字母或數(shù)字,用于用戶名輸入 intmimainput(charstr[],intx,inty);鍵盤輸入同時顯示“*”號,用于密碼輸入 voidguangbiao(intx,inty);產(chǎn)生光標(biāo)的工具函數(shù) voidxiaoguangbiao(intx,inty);消除光標(biāo)工具函數(shù) voidjieshu();退出程序時的動畫界面,并實現(xiàn)程序的結(jié)束3)主菜單模塊 本模塊是主界面中主菜單下的各項功能的實現(xiàn)模塊。主要用于商品的各項信息的編輯,商品總信息的查詢,返回登錄界面,以及退出程序。與主菜單的各選項相對應(yīng)。而其中尤以各項商品的信息編輯最為主要。本模塊的核心函數(shù): shangpin*spcreat(); voidmenuxz(intmx,intmy,char*menu[],int*mflag); voidspbj(shangpin*h,int*mx,int*my,int*mbutt,char**ms,char*msp,intc[]); voidchaxun(shangpin*h); voidxiaoshou(shangpin*h); shangpin*spcreat();函數(shù)是商品鏈表的一個創(chuàng)建函數(shù)。它用與創(chuàng)建一個系統(tǒng)默認(rèn)的商品鏈表,保存這些商品的各項信息。商品鏈表的結(jié)點(diǎn)結(jié)構(gòu)如下:typedefstructnode0{ intbianhao;商品的編號 charmingcheng[11];商品的名稱 floatyuanjia;商品的原價格 floatjiage;商品的銷售價格 intruku;商品的總共進(jìn)貨數(shù)量 intkucun;商品現(xiàn)有的倉庫存儲量 intxiancun;商品現(xiàn)存于超市貨架的量 structnode0*next;指向下一個結(jié)點(diǎn)}shangpin; 這里創(chuàng)建的商品鏈表的信息都是程序“臨時”指定的,即程序退出后無法保存用戶對于各項商品信息的編輯修改操作。下一次程序再次運(yùn)行時,各商品信息依然是系統(tǒng)默認(rèn)制定的信息。即每一次程序的運(yùn)行,商品信息都會還原。 系統(tǒng)默認(rèn)的商品信息如下: 編號:1,2,3,4 名稱:chara[4][11]={"mianbao","yinliao","taideng","yusan"}; 原價:floatb[4]={1.5,4,38,12}; 價格:floatc[4]={1.2,3,28,7}; 總?cè)霂欤?00 現(xiàn)有庫存:80 超市現(xiàn)存:20 這里的商品信息沒有像用戶人員信息一樣保存起來是有考慮的。一方面說,超市商品的信息確實是一個動態(tài)變化的過程,但是做為一個超市商品庫存的模擬,我們在很多方面達(dá)不到現(xiàn)實實際的要求。而且沒有這么大的必要性。另一方面,我們要實現(xiàn)實時商品信息的顯示,而我們的用于顯示的區(qū)域面積有限,無法支持大量商品的同時顯示。另外,在超市的仿真模擬當(dāng)中,也沒有辦法空出足夠的空間放置商品貨架。而若做到保存這些信息數(shù)據(jù),那么這些數(shù)據(jù)很大一部分是稱遞增的,時間一久勢必造成畫面框架無法滿足顯示的要求??偠灾?,作為一個模擬仿真,這方面其實不是重點(diǎn)。 voidmenuxz(intmx,intmy,char*menu[],int*mflag);函數(shù)用于主菜單上各項功能的選擇。自然在選擇后會有相應(yīng)的函數(shù)語句來實現(xiàn)它所選擇的選項所對應(yīng)的功能。 其選擇的功能與菜單選項相一致,包括:“編輯”,“查詢”,“返回”,“退出”。編輯與查詢下面還將詳細(xì)介紹,這里就不加贅述。主要講一下返回與退出功能。 返回功能其實在主函數(shù)模塊中已經(jīng)說到。它不是通過一個函數(shù)來實現(xiàn)的,它的實現(xiàn)是通過下面的if選擇語句來完成的。 elseif(mflag==3&&mbutt==1)//返回登錄界面 { dlflag=0; break; } 其中,mflag是主菜單上面各項選項才標(biāo)記(3表示退出),mbutt是鼠標(biāo)按鍵的標(biāo)記(1便是左鍵按下),dlflag是用戶登錄的職能標(biāo)記。上述語句表示在主菜單中選擇“退出”時,用戶的職能恢復(fù)默認(rèn)值“0”(表示普通人),并跳出該層循環(huán)。在主函數(shù)模塊中提到,它含有三個while(1);語句,兩層循環(huán)而以上語句是從內(nèi)層循環(huán)中的下面一個循環(huán)中跳出,由于外層循環(huán)的存在,在外層循環(huán)中本次循環(huán)結(jié)束后,函數(shù)將返回到內(nèi)層循環(huán)的中的上面一個循環(huán),這個循環(huán)恰好是用于登錄及用戶人員信息編輯的循環(huán)。這樣就實現(xiàn)了由“主界面”返回“歡迎暨到登錄界面”的操作。 退出功能相對來說就更為簡單了。他也是通過一個if選擇語句來實現(xiàn)的。語句如下: if(mflag==4&&mbutt==1)//結(jié)束整個函數(shù) { jieshu(); } 即在主菜單中選擇“退出”選項時,調(diào)用結(jié)束動畫界面函數(shù),并實現(xiàn)程序的結(jié)束。 voidspbj(shangpin*h,int*mx,int*my,int*mbutt,char**ms,char*msp,intc[]);函數(shù)實現(xiàn)的是主菜單中的“編輯”選項功能。用于商品各類信息的編輯,包括“添加商品”,“刪除商品”,“修改商品信息”,“入出庫管理”四項功能。 這四項功能的實現(xiàn)是通過調(diào)用一下函數(shù)來完成的: intcharu(shangpin*h,intc[]);添加商品功能 intshanchu(shangpin*h,intc[]);刪除商品功能 intxiugai(shangpin*h,intc[]);修改商品信息功能 intruchuku(shangpin*h);入出庫管理功能 這四項功能實現(xiàn)輸入用的圖框是通過調(diào)用一下函數(shù)來實現(xiàn)的: voidcrcaidan();繪制添加商品功能圖框 voidsccaidan();繪制刪除商品功能圖框 voidxgcaidan();繪制修改商品信息功能圖框 voidrckcaidan();繪制入出庫管理功能圖框 在商品信息編輯時在輸入數(shù)據(jù)后按下Enter鍵(確認(rèn)鍵,回車鍵)表示該數(shù)據(jù)輸入完成。而在編輯的任意位置按下Space鍵(空格鍵)都可以結(jié)束編輯,放棄此次編輯 “添加商品”功能用于添加新的商品。由對商品信息鏈表的插入結(jié)點(diǎn)操作來實現(xiàn)。首先通過編號的輸入,用于確定要插入結(jié)點(diǎn)在鏈表中的位置,然后輸入商品的各類信息。。在信息的輸入同時還會判斷信息的實際意義,若不符合實際,則結(jié)束信息輸入,商品添加操作失敗,如價格小于原價,商品總進(jìn)貨量小于倉庫庫存等。另外在添加商品成功后,新添加商品所對應(yīng)的結(jié)點(diǎn)位置以后的結(jié)點(diǎn)所對應(yīng)的商品編號會與它們實際所處鏈表中的位置不一致,而在添加商品最后也會調(diào)整各商品的編號。同樣的,下面的所有操作都會對輸入信息的實際意義作出判斷,確保數(shù)據(jù)輸入不失真,與實際不符。而且也會對他們有編號改變的商品進(jìn)行相應(yīng)的編號調(diào)整。 “刪除商品”功能用于刪除已有的商品。由對商品信息鏈表的刪除結(jié)點(diǎn)操作來實現(xiàn)。要被刪除的商品通過其編號來確定。 “修改商品信息”功能用于修改以后商品的某些信息,包括“編號”,“名稱”,“價格”。對于不想修改信息,直接按Enter鍵,這樣將保留原信息不變。 “入出庫管理”功能用于已有商品的進(jìn)出貨,通過輸入編號確認(rèn)要進(jìn)行入出庫操作的商品,同時自動顯示商品名稱。操作分為“進(jìn)貨”和“出貨”兩個部分,分別輸入要進(jìn)貨或者出貨的量,不用操作的直接按Enter鍵,則該項將不會改變。 另外,商品信息的編輯與超市商品信息的實時反饋,超市銷售的仿真模擬都有很大的關(guān)聯(lián),在商品信息的編輯功能中,同時對于商品信息在超市銷售仿真模擬中反映出來的信息也作出了相應(yīng)的調(diào)整,如添加了一樣新商品之后,超市銷售仿真模擬部分就要及時的有新商品的貨架,顧客也能購買到新商品。而在商品信息編輯之后,超市商品信息的實時反饋也要及時修整過來,同樣的,在添加了一樣新商品之后,要及時反映出新商品的各類信息。 voidchaxun(shangpin*h);函數(shù)實現(xiàn)的是主菜單中的“查詢”功能。主要是用于使用者查詢商品的各類數(shù)據(jù)。包括“編號”,“名稱”,“原價”,“價格”,“總?cè)霂臁?“庫存”,“現(xiàn)存”,“已售”,“總利潤”九大類。也即是上面介紹過的“界面3—信息查詢界面”。通過此查詢功能可以了解到該模擬超市的所有營業(yè)情況,以供使用者據(jù)此相應(yīng)的對商品做出適當(dāng)?shù)牟僮鳌?voidxiaoshou(shangpin*h);函數(shù)用于實現(xiàn)超市商品情況的實時反饋。 如上圖所示,它顯示了超市商品的一些最基本的數(shù)據(jù)情況。該板塊處于主界面下,顯示一直存在,這樣對于使用者掌握超市商品的基本信息是十分有用的。而且他和商品信息編輯功能,超市銷售仿真模擬是直接相連的,這樣可以達(dá)到實時反映超市商品情況的目的。讓使用者及時掌握這些數(shù)據(jù)。 另外下面的“入出庫提醒”會在因銷售而使得商品現(xiàn)存數(shù)目緊張時,做出動態(tài)的提醒,及時補(bǔ)充商品。更具體的介紹將放在下面的“超市仿真模擬模塊”中。本模塊的其它函數(shù): voidzhujiemian(shangpin*h,char*menu[],char*sx[][5]);主界面的繪制函數(shù) voidzhucaidan(char*menu[]);主菜單的繪制函數(shù) voidxscaidan(char*xs[][5]);商品信息實時反饋板塊的圖框繪制函數(shù) voidspcx(shangpin*h);“查詢”功能界面的繪制函數(shù) voidbjzicaidan(char*bj[]);“編輯”功能的下拉菜單繪制函數(shù) voidhfbj(intxzflag,intfhflag,intmbutt);用于恢復(fù)“編輯”功能下來菜單以及用于實現(xiàn)商品實現(xiàn)商品編輯的操作函數(shù)而開辟的圖框所處區(qū)域的函數(shù) voidbjxz(intmx,intmy,char*bj[],int*xzflag);用于實現(xiàn)“編輯”功能菜單各選項選擇的函數(shù) voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠標(biāo)工具函數(shù),用于 需要鼠標(biāo)的各項功能的實現(xiàn) voiddisphz16(intx,inty,intz,inta,intcolor,char*p);繪制圖畫時的漢字輸出 floatshuziinput(intx,inty);//輸入并顯示數(shù)字鍵盤輸入同時顯示數(shù)字,用于商品信息編輯時的數(shù)字輸入 floatzhuanhuan(intxsd,inti,floatsum,floata[]);數(shù)組轉(zhuǎn)換為浮點(diǎn)數(shù)的轉(zhuǎn)換函數(shù),用于輸入數(shù)字?jǐn)?shù)據(jù)從字符串裝換為數(shù)字 intzifuinput(charstr[],intx,inty);鍵盤輸入同時顯示字母或數(shù)字,用于商品信息編輯時的商品名稱數(shù)據(jù)輸入 voidguangbiao(intx,inty);產(chǎn)生光標(biāo)的工具函數(shù) voidxiaoguangbiao(intx,inty);消除光標(biāo)工具函數(shù) voidjieshu();退出程序時的動畫界面,并實現(xiàn)程序的結(jié)束4)超市仿真模擬模塊 該模塊用于模擬仿真現(xiàn)實生活中,超市的營業(yè)銷售情況。通過模擬顧客來超市購買商品,以及超市自行的入出庫管理,展現(xiàn)出一幅動態(tài)的超市營業(yè)銷售景像。模擬圖像如下圖所示:本模塊的核心函數(shù): intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0); voidtixing(shangpin*h); intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0);函數(shù)用于模擬仿真超市中的銷售營業(yè)界面。購買商品的顧客從超市的“入口”進(jìn)入超市,經(jīng)過各種商品的貨架,拿上自己要購買的商品,到“收銀臺”付賬,從超市的“出口”處走出超市。這便是一位顧客購買商品的整個過程。 函數(shù)功能的實現(xiàn)首先通過隨機(jī)函數(shù)產(chǎn)生隨機(jī)數(shù),沒產(chǎn)生一個隨機(jī)數(shù),按照默認(rèn)設(shè)置,若隨機(jī)數(shù)處于有效區(qū)間,表示進(jìn)來一位顧客,再根據(jù)這些隨機(jī)數(shù)所處有效區(qū)間的不同分別將它們指定為購買不同商品的顧客,并用不同那個的顏色加以區(qū)分。對于隨機(jī)數(shù)的處理,是通過調(diào)用以下函數(shù)來實現(xiàn)的: voidcolorxz(intk,int*c);用于判斷所產(chǎn)生的隨機(jī)數(shù)屬于有效區(qū)間,對于處于有效區(qū)間的隨機(jī)數(shù),相應(yīng)的根據(jù)他所在區(qū)間的不同,指定它表示購買不同商品的顧客。 voidgk(intx,inty,intc);將購買不同商品的顧客用不同是顏色卻分開來,并在(x,y)表示坐標(biāo)處產(chǎn)生該位顧客,用一個填充了指定顏色的“○”表示。 其次是顧客購買商品的過程。它是一個動態(tài)過程,通過調(diào)用以下動畫函數(shù)來實現(xiàn): voidmove(inta,int*x1,int*y1,intc);用于顧客在超市內(nèi)的移動過程。當(dāng)顧客到達(dá)所要購買的商品貨架處時,為表現(xiàn)顧客拿上所要購買的商品,將所購買商品的編號繪制在表示顧客的“○”上。 按下任意鍵都可以實現(xiàn)模擬銷售動畫的暫停,另外在商品現(xiàn)存不足的情況下,模擬銷售動畫會自動暫停,并發(fā)出“入出庫”提醒。具體實現(xiàn)的介紹就在下面。 voidtixing(shangpin*h);函數(shù)用于在商品現(xiàn)存不足時,模擬銷售動畫暫停,提醒使用者存貨緊張的商品進(jìn)行“入出庫”操作。 默認(rèn)是商品現(xiàn)存緊張標(biāo)記是該商品的現(xiàn)存量小于等于3。此時模擬銷售動畫會自行暫停。并調(diào)用voidtixing(shangpin*h);。此時動態(tài)地提醒使用者進(jìn)行“入出庫”的操作。 此時的“入出庫”操作有兩種選擇,如上圖所示,一種是直接按下除確認(rèn)鍵(Enter鍵)意外的按鍵,程序?qū)⑦M(jìn)行自動“入出庫”操作。默認(rèn)的自動“入出庫”操作是:在“庫存”充足的情況下(庫存不小于30),就直接出庫20件商品。在“庫存”緊張的情況下,“入庫”100件商品,同時“出庫”20件商品。另一種操作是按下“確認(rèn)鍵“,進(jìn)行手動“入出庫”操作,同時“入出庫提醒”出靜態(tài)地提醒使用者盡快進(jìn)行入出庫操作,如下圖所示。相關(guān)操作在主菜單的“編輯”功能里面。 在上述介紹中已經(jīng)提到,超市仿真模擬當(dāng)中,有兩個商品信息的實時反饋機(jī)制。一個是在賣出商品后及時的在超市商品信息的實時反饋中及時的表現(xiàn)出來。這個是通過在模擬動畫中及時調(diào)用voidxiaoshou(shangpin*h);函數(shù)來實現(xiàn)的。 另一個是在進(jìn)行商品的“編輯”功能后,及時的在模擬動畫中反映出商品信息的改變。這個是通過對一系列保存了每個在超市的顧客的信息的數(shù)據(jù)的相應(yīng)改變來實現(xiàn)的。這些保存顧客信息的數(shù)據(jù)如下: n 當(dāng)前超市顧客數(shù)目 q 定位所選中進(jìn)行操作的顧客 a[18] 記錄每位顧客從進(jìn)入超市到當(dāng)前位置所走步數(shù) x1[18],y1[18] 顧客當(dāng)前所在位置的橫縱坐標(biāo) c[18] 記錄每位顧客所購買商品及對應(yīng)該種商品的顏色 以上數(shù)據(jù)記錄下了每一位在超市內(nèi)的顧客的所有有用信息。這樣在intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0);退出以后,及模擬銷售暫停后,重新開始的時候可以重現(xiàn)當(dāng)初暫停是的動畫,并接著進(jìn)行下去。同樣的,在商品“編輯”功能操作改變了商品的信息之后,同時也會對以上數(shù)據(jù)進(jìn)行相應(yīng)的調(diào)整,這樣再一次進(jìn)行銷售模擬的時候也是可以及時的反應(yīng)出商品信息的改變情況。另外指出一點(diǎn),當(dāng)進(jìn)行“添加商品”,“刪除商品”時,模擬超市銷售界面中的貨架也應(yīng)當(dāng)有相應(yīng)的改變。這是通過調(diào)用一下函數(shù)來實現(xiàn)的: voidyyjiemian(shangpin*h);模擬超市銷售界面的繪制函數(shù),用于根據(jù)當(dāng)前情況下的商品信息繪制超市銷售界面。如下面表示的是添加了一項商品后的超市模擬銷售情況。該模塊的其他函數(shù): voidgkhf(intx,inty);用于顧客向前移動時,恢復(fù)顧客原位置畫面的函數(shù) intlength(shangpin*h);用于計算商品信息鏈表的長度的函數(shù) voidread1(int*mx,int*my,int*mbutt,char*ms,char*msp);鼠標(biāo)工具函數(shù),用于 需要鼠標(biāo)的各項功能的實現(xiàn) voiddisphz16(intx,inty,intz,inta,intcolor,char*p);繪制圖畫時的漢字輸出3.核心算法分析1)鏈表的應(yīng)用 在整個函數(shù)當(dāng)中使用到了兩個鏈表,一個用戶人員鏈表,用于存放用戶信息;一個商品信息鏈表,用于存放商品信息。 兩個鏈表的結(jié)構(gòu)分別如下: typedefstructnode1 { intryflag;使用人員的職能,分為管理者(1)和普通人(0) charname[11];用戶名 charmima[11];用戶密碼 structnode1*next;指向下一個結(jié)點(diǎn) }renyuan; typedefstructnode0 { intbianhao;商品的編號 charmingcheng[11];商品的名稱 floatyuanjia;商品的原價格 floatjiage;商品的銷售價格 intruku;商品的總共進(jìn)貨數(shù)量 intkucun;商品現(xiàn)有的倉庫存儲量 intxiancun;商品現(xiàn)存于超市貨架的量 structnode0*next;指向下一個結(jié)點(diǎn) }shangpin; 程序中創(chuàng)建的是兩個單鏈表。在對人員和商品信息的編輯上面都是通過對相應(yīng)鏈表中的相應(yīng)結(jié)點(diǎn)的操作來實現(xiàn)的。鏈表的相關(guān)操作都是相通的,概括為:鏈表的創(chuàng)建,求鏈表長度,鏈表信息輸出,查詢鏈表指定位置結(jié)點(diǎn)的信息,指定位置插入鏈表新結(jié)點(diǎn),刪除鏈表指定位置的結(jié)點(diǎn),修改鏈表指定位置的信息,刪除鏈表等幾項操作,以此作為模板,用于人員及商品信息的編輯操作,十分的方便,減少了很多工作量。2)圖形界面下的同步輸入顯示 圖形界面下面是沒有數(shù)據(jù)的輸入函數(shù)的,而且它的輸出函數(shù)只有 voidouttext(char*textstring); voidouttextxy(intx,intu,char*textstring); 他們也只能用于字符串的輸出,該輸出的字符串還是已經(jīng)存在的,沒有辦法實現(xiàn)鍵盤輸入,屏幕同步顯示的目的。然而我們程序要求手動鍵盤輸入數(shù)據(jù)說進(jìn)行人員和商品信息的修改編輯,而這些數(shù)據(jù)是直接在屏幕上輸入顯示的。為解決這個問題,我們專門編輯了幾個工具函數(shù),用于不同情況下的數(shù)據(jù)輸入。 floatshuziinput(intx,inty);輸入并顯示數(shù)字鍵盤輸入同時顯示數(shù)字,用于商品信息編輯時的數(shù)字輸入 floatzhuanhuan(intxsd,inti,floatsum,floata[]);數(shù)組轉(zhuǎn)換為浮點(diǎn)數(shù)的轉(zhuǎn)換函數(shù),用于輸入數(shù)字?jǐn)?shù)據(jù)從字符串裝換為數(shù)字 intzifuinput(charstr[],intx,inty);鍵盤輸入同時顯示字母或數(shù)字,用于商品信息編輯時的商品名稱數(shù)據(jù)輸入 intmimainput(charstr[],intx,inty);鍵盤輸入同時顯示“*”號,用于密碼輸入 鍵盤輸入使用的是key=bioskey(0);語句。通過key保存函數(shù)的返回值。 key=key&0xff;留下返回值的低八位,即普通鍵的ASCII碼。用于輸入數(shù)字時的同步輸入顯示 if(0x30<=key&&key<=0x39)//數(shù)字0-9 { xiaoguangbiao(x,y); setcolor(WHITE); a[i]=key-0x30; sprintf(c,"%d",key-0x30); outtextxy(x,y,c); x=x+7; i++; guangbiao(x,y); } 通過一個數(shù)組保存下每次輸入的數(shù)字大小,使用sprintf(c,"%d",key-0x30);語句將數(shù)字轉(zhuǎn)換成字符串,同時及時的將字符串在屏幕上指定位置(x,y)顯示出來,這樣便實現(xiàn)了數(shù)據(jù)的輸入同步顯示,且保存下了輸入的數(shù)據(jù)。x=x+7;語句將輸入數(shù)據(jù)顯示位置后移,通過循環(huán)可以實現(xiàn)數(shù)據(jù)的連續(xù)輸入。i++;語句保證保存下每一位屬于的數(shù)據(jù)。用于輸入字符時的同步輸入顯示 if((0x61<=key&&key<=0x7a)||(0x30<=key&&key<=0x39))//數(shù)字0-9和小寫字母a-z { xiaoguangbiao(x,y); setcolor(WHITE); c[0]=(char)key; c[1]='\0'; p[i]=(char)key; outtextxy(x,y,c); x=x+7; i++; guangbiao(x,y); }用于輸入密碼時的同步輸入顯示 if((0x61<=key&&key<=0x7a)||(0x30<=key&&key<=0x39))//數(shù)字0-9和小寫字母a-z { xiaoguangbiao(x,y); setcolor(WHITE); p[i]=(char)key; outtextxy(x,y,"*"); x=x+7; i++; guangbiao(x,y); } 在實現(xiàn)了輸入同步顯示之后,我們要求輸入的數(shù)據(jù)能夠在輸入的同時作出修改。避免因輸入錯誤導(dǎo)致操作失敗,否則會增加很多的工作量,也不夠人性化。因此我們對退格鍵(BackSpace鍵)做了特殊處理。 用于輸入數(shù)字時的退格鍵功能 elseif(key==Key_BackSpace)//退格鍵,消除錯誤輸入的數(shù)字 { xiaoguangbiao(x,y); if(i!=0) { x=x-7; bar(x,y,x+7,y+15);//消除原光標(biāo)和要刪除的錯誤輸入數(shù)據(jù) setcolor(WHITE); i--; a[i]=0; if(xsd==i)flag=0; } guangbiao(x,y); } 即在按下BackSpace鍵之后,x=x-7;bar(x,y,x+7,y+15);語句消除前一個輸入的數(shù)據(jù),i--;a[i]=0;語句將已經(jīng)保存的數(shù)據(jù)作廢。 用于輸入字符和密碼時的退格鍵功能 elseif(key==Key_BackSpace)//0x0e08退格鍵,消去錯誤輸入的字符 { xiaoguangbiao(x,y); if(i!=0) { x=x-7; bar(x,y,x+7,y+15);//消除原光標(biāo)和要刪除的錯誤輸入數(shù)據(jù) setcolor(WHITE); i--; p[i]='\0'; } guangbiao(x,y); } 最后輸入的數(shù)字是保存在一個數(shù)組里面的,么一個保存的是該數(shù)字某位上的一個數(shù)字符或者小數(shù)點(diǎn)(xsd)。然而我們需要的是數(shù)字整體的數(shù)值。這樣我們編了一個轉(zhuǎn)換函數(shù)。 floatzhuanhuan(intxsd,inti,floatsum,floata[]) { intk,j; if(xsd==0)xsd=i; if(xsd!=i) { k=xsd+1; while(k<i) { for(j=0;j<k-xsd;j++) { a[k]=a[k]/10.0; } sum=sum+a[k]; k++; } } for(k=0;xsd>0;xsd--) { for(j=xsd-1;j>0;j--) { a[k]=a[k]*10.0; } sum=sum+a[k]; k++; } returnsum; } 該函數(shù)直接用在函數(shù)floatshuziinput(intx,inty);中,xsd為輸入的小數(shù)點(diǎn)在數(shù)組中的位置,i為輸入結(jié)束后的i值,sum為數(shù)組保存的數(shù)據(jù)所表示的數(shù)值大小,a[]為保存數(shù)據(jù)的數(shù)組。 同時數(shù)字的輸入不能兩次輸入小數(shù)點(diǎn),這個用一個標(biāo)記flag來控制。3)超市模擬仿真 超市模擬仿真的實現(xiàn)主要在于退出超市模擬程序后,在進(jìn)入時要哦能夠從退出的地方接著運(yùn)行。這個在超市仿真模擬模塊中已經(jīng)做了比較詳細(xì)的說明。 intmoni(shangpin*h,int*rsflag0,int*n0,int*q0,int*a0,int*x10,int*y10,int*c0) { intx=639-10,y=370+43,i,k,k0,flag=0; int*a=a0,n=*n0,q=*q0,*x1=x10,*y1=y10,*c=c0,rsflag=*rsflag0;//移動的步數(shù),顧客人數(shù),定位每位顧客,保存每位顧客的坐標(biāo),保存相應(yīng)顧客的表示顏色及收購商品編號,總?cè)藬?shù)標(biāo)記 shangpin*p=h->next; k0=length(h)*20; while(1) { if(bioskey(1)!=0||flag==1)//任意鍵暫停銷售 { if(flag!=1)bioskey(0); a0=a;//移動的步數(shù) *n0=n;//顧客人數(shù) *q0=q;//用于定位每位顧客,從而進(jìn)行相應(yīng)的操作 x10=x1,y10=y1;//保存每位顧客的坐標(biāo) c0=c;//保存相應(yīng)顧客的表示顏色 *rsflag0=rsflag; returnflag; } if(rsflag==0)q=0; if(rsflag==1)q=n+1; srand(time(0));//用系統(tǒng)時間當(dāng)種子,對隨機(jī)函數(shù)進(jìn)行初始化 k=rand()%k0;//產(chǎn)生隨機(jī)數(shù),顧客隨機(jī)購買任意商品 if(n<18) { a[n]=0; x1[n]=x; y1[n]=y; colorxz(k,c+n); if(rsflag==0)n++; if(rsflag==1)n=18,rsflag=0; } for(i=q;i<n;i++) { move(a[q],x1+q,y1+q,c[q]);//顧客移動 a[q]=a[q]+1; if(a[q]==21) { gkhf(x1[q],y1[q]); while(1) { if(c[q]==0)break; if(p->bianhao==c[q]) { p->xiancun-=1;//收銀臺付賬結(jié)束,商品賣出 if(p->xiancun<=3) { flag=1;//現(xiàn)存不足,入出庫提醒標(biāo)記開啟 } delay(30); xiaoshou(h); p=h; break; } if(p->next==NULL)break; p=p->next; } a[q]=0; n=q; rsflag=1; } q++; } } } 已上是超市模擬函數(shù),為了保存各類的數(shù)據(jù),都通過地址傳遞的方式,不過若函數(shù)全都使用讀地址的方式來使用其中個的數(shù)據(jù),并對這些數(shù)據(jù)進(jìn)行操作,則會出現(xiàn)數(shù)據(jù)的混亂。所以在函數(shù)運(yùn)行前,我們把每個數(shù)據(jù)都賦給臨時動態(tài)變量,通過對這些臨時動態(tài)變量的操作來運(yùn)行下面的函數(shù)。只在函數(shù)退出的時候把改變以后的數(shù)據(jù)重新賦給專遞來的地址。即下面的代碼語句: if(bioskey(1)!=0||flag==1)//任意鍵暫停銷售 { if(flag!=1)bioskey(0); a0=a;//移動的步數(shù) *n0=n;//顧客人數(shù) *q0=q;//用于定位每位顧客,從而進(jìn)行相應(yīng)的操作 x10=x1,y10=y1;//保存每位顧客的坐標(biāo) c0=c;//保存相應(yīng)顧客的表示顏色 *rsflag0=rsflag; returnflag; } 而切為求函數(shù)再次運(yùn)行是能夠從退出的位置繼續(xù)運(yùn)行,我們退出的位置設(shè)置在函數(shù)頭部,也就是在函數(shù)單次循環(huán)完全運(yùn)行完以后才退出,那么再次進(jìn)入時,即相當(dāng)于函數(shù)進(jìn)入下一個循環(huán),能夠?qū)崿F(xiàn)函數(shù)從推出位置繼續(xù)運(yùn)行。對于由于“現(xiàn)存不足”造成的函數(shù)退出使用的是統(tǒng)一個退出語句。 另外要實現(xiàn)顧客購買商品之后商品信息的實時反映,則是通過及時的調(diào)用xiaoshou(h);函數(shù)來實現(xiàn)的。代碼如下: if(p->bianhao==c[q]) { p->xiancun-=1;//收銀臺付賬結(jié)束,商品賣出 if(p->xiancun<=3) { flag=1;//現(xiàn)存不足,入出庫提醒標(biāo)記開啟 } delay(30); xiaoshou(h);//商品信息的實時反映 p=h; break; } 最后對于商品編輯所造成的超市模擬中商品表示的改變。是通過對c[18](記錄每位顧客所購買商品及對應(yīng)該種商品的顏色)中數(shù)據(jù)的改變來實現(xiàn)的,該數(shù)據(jù)保存的就是顧客所購買的商品的編號?!疤砑由唐贰惫δ芤鸬纳唐窋?shù)據(jù)改變 c0=n; for(i=0;i<18;i++) { if(c[i]>=c0)c[i]+=1; } 添加商品引起的商品信息改變主要是鏈表插入的新結(jié)點(diǎn)以后的結(jié)點(diǎn)中表示商品編號的數(shù)據(jù)不再正確了,需要做出相應(yīng)的調(diào)節(jié)?!皠h除商品”功能引起的商品數(shù)據(jù)改變 c0=p->bianhao;//要刪除商品編號 for(i=0;i<18;i++) { if(c[i]==c0)c[i]=0; if(c[i]>c0)c[i]-=1; } 刪除商品功能引起的商品信息變化在于丟失了一個結(jié)點(diǎn)以后,該結(jié)點(diǎn)以后的結(jié)點(diǎn)中表示商品編號的數(shù)據(jù)已經(jīng)不再正確了,需要做出相應(yīng)的調(diào)節(jié)。 “修改商品信息”功能引起的商品數(shù)據(jù)改變 for(i=0;i<18;i++) { if(c[i]==n)c[i]=bh; elseif(c[i]==bh)c[i]=n; } 修改商品信息功能所引起的商品信息改變主要在于修改后兩個編號所對應(yīng)的商品的信息互換。 另一個方面,對于“添加商品”和“刪除商品”功能引起的超市模擬界面中貨架的改變,通過函數(shù)voidyyjiemian(shangpin*h)實現(xiàn),主要代碼如下: intk0=length(h);//判斷有幾種商品 if(k0>=1)//1號商品貨架繪制 { rectangle(x-230,y+190,x-180,y+250); sprintf(s,"%d",p->bianhao);//3個空格,編號 settextstyle(2,0,8); outtextxy(x-230+20,y+190+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+190+35,p->mingcheng); p=p->next; } if(k0>=2)//2號商品貨架繪制 { rectangle(x-140,y+190,x-90,y+250); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-140+20,y+190+10,s); settextstyle(2,0,4); outtextxy(x-140+5,y+190+35,p->mingcheng); p=p->next; } if(k0>=3)//3號商品貨架繪制 { rectangle(x-230,y+270,x-180,y+330); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-230+20,y+270+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+270+35,p->mingcheng); p=p->next; } if(k0>=4)//4號商品貨架繪制 { rectangle(x-140,y+270,x-90,y+330); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-140+20,y+270+10,s); settextstyle(2,0,4); outtextxy(x-140+8,y+270+35,p->mingcheng); p=p->next; } if(k0>=5)//5號商品貨架繪制 { rectangle(x-230,y+350,x-180,y+410); sprintf(s,"%d",p->bianhao); settextstyle(2,0,8); outtextxy(x-230+20,y+350+10,s); settextstyle(2,0,4); outtextxy(x-230+5,y+350+35,p->mingcheng); p=p->next; } 有多少商品就繪制多少個貨架,并顯示出相應(yīng)貨架對應(yīng)商品的信息。(最多5個)四.不足之處 程序的主要不足之處有以下幾點(diǎn):程序所能容納的商品數(shù)目有限,我們定的是最多五個。 原因在于我們界面的面積有限,要把這些商品的數(shù)據(jù)權(quán)都在界面中顯示出來,那么所能容納的商品數(shù)目自然有限。尤其是在模擬超市模塊當(dāng)中,商品貨架所占的區(qū)域尤其大。我們有想過將這些都縮小化,不過這樣只是增加了所能容納商品的上限罷了,上線大了,所能容納的商品自然會有所增加,不過上述問題依然還是存在,它總會有一個上限。可是聯(lián)系實際,超市商品容量的確很大,不過它也肯定是有一個上限的,只是我們?nèi)粘K枰纳唐房偭靠赡軟]有達(dá)到這個上限,那么這個上限就對于超市沒有實質(zhì)性的影響罷了。超市模擬仿真模塊中,每個顧客都只能買一種商品。填充表示顧客的“○”,表征的不是顧客所要買的商品本生,而是編號。這樣在商品編號改變之后,所要購買該項商品的顧客的顏色也是隨之改變了,而這種改變并不怎么符合實際。最主要還是在于顧客購買的商品只能是一件。我們有考慮過用排列組合的方式,考慮各種購買商品的組合,在通過隨機(jī)數(shù)所處的不同區(qū)間確定顧客所要買的是那種或者哪幾種。不過這樣在實現(xiàn)時比較困難,一方面要指示出顧客所要購買的分別是那些商品,在購買完后又要實時的顯示出這些被購買的商品的庫存信息。另一方面在商品信息別修改的時候,要實施的反映在超市模擬當(dāng)中。這些實現(xiàn)起來都比較困難。鼠標(biāo)功能無法在函數(shù)全程使用。這主要體現(xiàn)在兩個方面,一個是鼠標(biāo)與動畫不能同時存在;一個是在鍵盤輸入信息時不能同時用鼠標(biāo)。前一個問題可以說成是兩個動畫無法同時實現(xiàn),因為鼠標(biāo)某種意義上來說也是一個動畫。后一個則是由于key=bioskey(0);語句等待下一個鍵盤按鍵的輸入和輸入函數(shù)為了實現(xiàn)連續(xù)輸入設(shè)定的內(nèi)部循環(huán)造成的。在沒有進(jìn)行數(shù)據(jù)輸入操作時,有事還是可能按動鍵盤上的按鍵,這個時候若選擇數(shù)據(jù)輸入,那么前面按了的鍵會直接在輸出位置顯示出來。又甚者,我們以空格鍵(Space鍵)作為某項功能的返回鍵,若在選擇該項功能之前之按了返回鍵,那么在選擇這項功能的時候,程序就會自動的返回。為此我們在鼠標(biāo)里面添加了if(bioskey(1)!=0)bioskey(0);的語句。用于將隨意按了的按鍵信號輸出去,不至于影響的程序的正常工作??墒鞘髽?biāo)只在每一次動或按鼠標(biāo)鍵的時候才會循環(huán)一次,能夠消耗掉一個按鍵信號,若按動的鍵太多,而鼠標(biāo)的操作太少,還是無法耗盡隨意按動的鍵所產(chǎn)生的信號,上述問題依然會存在。五.編程分工 我們的程序總共1800行左右。除去了漢字庫和鼠標(biāo)。 就實現(xiàn)的功能模塊方面,主函數(shù)模塊,登陸及人員編輯模塊和主菜單模塊主要由李衢鵬完成。超市仿真模擬模主要由黎浩完成。 就用于實現(xiàn)這些功能的界面方面,菜單和圖框而言,大部分是黎浩做的設(shè)計。 就在界面下在各項功能間進(jìn)行選擇操作方面,大部分是李衢鵬設(shè)計的。 就所提及的三項核心算法方面,鏈表的應(yīng)用和圖形界面下的同步輸入顯示主要由李衢鵬完成,超市模擬仿真主要由黎浩完成。六.程序設(shè)計心得 在本次c語言課設(shè)中,遇到過很多的問題,諸如error的調(diào)試,常常一個error連續(xù)幾天都調(diào)不出來。自己一個人苦思冥想,到最后突然一下子就又把問題解決了。最大的苦難莫過于最初做出來的東西有些功能無法實現(xiàn),不得不舍棄之前辛苦做的全部,尋找新的方法來實現(xiàn)這些功能。不過最后把全新的東西做出來之后,感覺還是很欣慰很值得的。 通過課程設(shè)計,我們學(xué)到了不少東西,不僅是c語言的知識,方法,技巧,更多的是我們在學(xué)習(xí)過程中掌握的一些學(xué)習(xí)的技巧,手段和方法。C語言課程設(shè)計當(dāng)中的大部分東西對于我們來說動都是全新的,在之前我們只是知道了最簡單的c語言但中的各種操作,可是現(xiàn)在要求我們能夠使用高級c編寫一個現(xiàn)在來說已經(jīng)是很大的一個程序。這絕對是一個挑戰(zhàn)。而且我們的課設(shè)時間又是很長的,又沒有老師實時監(jiān)督,在大部分同學(xué)都是剛開始能夠帶電腦來校的情況下,要靜下心來編程,這同樣是一個很不小的挑戰(zhàn)。很幸運(yùn)的,我么都克服過來了。作為一個大學(xué)生,我們知道自己來學(xué)校的目的是做什么的,我們沒有時間用來荒廢,我們必須好好抓緊每一分每一秒,來充實壯大自己。而通過對一個全新的任務(wù)的實現(xiàn),我們喊好的鍛煉了自己的學(xué)習(xí)能力。我們來到學(xué)校的時候,可能說智商什么的都不會要太大的差異,可是在自學(xué)能力上,我是很有體會的,大家的差異是很明顯的。然而不管在什么情況下,良好的自學(xué)能力都是十分重要的,這次課程設(shè)計正是很好的鍛煉了我們的自學(xué)能力。 正如有個學(xué)長曾經(jīng)說過的一句話:“經(jīng)歷了C語言課程設(shè)計以后,你會發(fā)現(xiàn)你的C語言編程能力以到達(dá)一個以前完全不能相比的高度”。課程設(shè)計雖然結(jié)束了,但是它給我們帶來好處是很多的,影響是很遠(yuǎn)的,我們感覺到,只有認(rèn)真的完成這樣的任務(wù),才會在實踐中有所提高,因此,我們應(yīng)該在以后的學(xué)習(xí)中更加重視動手能力,學(xué)會在動手中發(fā)揮自己的想像,與所學(xué)的東西結(jié)合,學(xué)會創(chuàng)新,這個才是我們大學(xué)學(xué)習(xí)的真正目的所在。七.參考資料 王士元.C高級實用程序設(shè)計.北京:清華大學(xué)出版社.1996 周純杰,劉正林等.標(biāo)準(zhǔn)C語言程序及應(yīng)用.武漢:華中科技大學(xué)出版社.2005 譚浩強(qiáng).C語言程序設(shè)計.北京:清華大學(xué)出版社,2000 C語言實用程序薈萃.西安:西安電子科技大學(xué)出版社.1993 另外我們在網(wǎng)上查詢了很多資料,尤其是在百度百科當(dāng)中學(xué)習(xí)到很多八.程序源代碼/*****my.h*****/#include<graphics.h>#include<process.h>#include<bios.h>#include<alloc.h>#include<stdio.h>#include<dos.h>#include<conio.h>#include<stdlib.h>typedefstructnode0{ intbianhao; charmingcheng[11]; floatyuanjia; floatjiage; intruku; intkucun; intxiancun; structnode0*next;}shangpin;typedefstructnode1{ intryflag; charname[11]; charmima[11]; structnode1*next;}renyuan;#defineKey_Down0x5100#defineKey_Up0x4900#defineKey_Esc0x011b#defineKey_Enter0x1c0d#defineKey_Space0x3920#defineKey_Shift_b0x3042#defineKey_Shift_c0x2e43#defineKey_BackSpace0x0e08/*****主函數(shù)*****/voidmain(){ intgd=VGA,gm=VGAHI;//用于圖形界面初始化 intkey,x,y,mflag=0,dlflag=0,rsflag=0;//主菜單功能選擇標(biāo)記,登陸人員職能選擇標(biāo)記,顧客人數(shù)標(biāo)記 intmx=320,my=240,mbutt=0;//鼠標(biāo) renyuan*ryhead=rycreat();//創(chuàng)建人員鏈表 shangpin*sphead=spcreat();//創(chuàng)建商品鏈表 intn=0,q=0,a[18],x1[18],y1[18],c[18];//用于模擬銷售,總顧客人數(shù)最多18人。總顧客數(shù)目,定位所選顧客標(biāo)記,顧客所走步數(shù),顧客所在橫坐標(biāo),顧客所在縱坐標(biāo),顧客所購買商品及顧客顏色標(biāo)記 charstr1[11],str2[11];//登陸時輸入用戶名和密碼 char*menu[]={"編輯","查詢","返回","退出"}; char*xs[2][5]={{"編號","名稱","價格","現(xiàn)存","已售"},{"編號","名稱","總?cè)霂?,"總出庫","庫存"}}; char*ms,*msp;//ms用于顯示鼠標(biāo),msp用于恢復(fù)原鼠標(biāo)所在位置畫面 initgraph(&gd,&gm,"C:\\TC30\\BGI");//圖形界面初始化 cleardevice(); mouse(&ms,msp);//畫鼠初始化 while(1) { hyjiemian();//歡迎及登陸界面繪制 while(1)//歡迎登陸界面 { read1(&mx,&my,&mbutt,ms,msp); dlxz(mx,my,mbutt,&dlflag);//選擇登陸人員職能 if(denglu(ryhead,mx,my,mbutt,str1,str2,dlflag))break; rybj(ryhead,&mx,&my,&mbutt,dlflag,&ms,msp);//人員編輯功能 } zhujiemian(sphead,menu,xs); while(1)//主界面 { read1(&mx,&my,&mbutt,ms,msp); menuxz(mx,my,menu,&mflag);//主菜單功能選擇 if(mx>639-190&&mx<639-130&&my>43+120&&my<43+150&&mbutt==1)//模擬銷售開始選擇 { if(moni(sphead,&rsflag,/*&txflag,*/&n,&q,a,x1,y1,c)) { tixing(sphead); } } if(mflag==4&&mbutt==1)//結(jié)束整個函數(shù) { jieshu(); } elseif(mflag==3&&mbutt==1)//返回登錄界面 { dlflag=0; break; } elseif(mflag==1&&mbutt==1&&dlflag==1)//商品信息編輯功能 { spbj(sphead,&mx,&my,&mbutt,&ms,msp,c); zhujiemian(sphead,menu,xs); } elseif(mflag==2&&mbutt==1)//商品信息查詢功能 { spcx(sphead); zhujiemian(sphead,menu,xs); } } }}/*****creat.c*****/renyuan*rycreat()//用戶鏈表{ FILE*fry; renyuan*h,*p,*s;//*h保存表頭結(jié)點(diǎn)的指針,*p指向當(dāng)前結(jié)點(diǎn)的前一個結(jié)點(diǎn),*s指向當(dāng)前結(jié)點(diǎn) if((h=(renyuan*)malloc(sizeof(renyuan)))==NULL)//分配空間并檢測 { printf("noenoughmemory!"); exit(0); } h->ryflag=0;//把表頭結(jié)點(diǎn)的數(shù)據(jù)域置空 h->name[0]='\0';//把表頭結(jié)點(diǎn)的數(shù)據(jù)域置空 h->mima[0]='\0';//把表頭結(jié)點(diǎn)的數(shù)據(jù)域置空 h->next=NULL;//把表頭結(jié)點(diǎn)的鏈域置空 p=h;//p指向表頭結(jié)點(diǎn) if((fry=fopen("c:\\TC30\\BIN\\chaoshi\\renyuan.txt","rt"))==NULL) { printf("unabletoopen!"); exit(0); } rewind(fry); while(!feof(fry)) { if((s=(renyuan*)malloc(sizeof(renyuan)))==NULL)//分配新存儲空間并檢測 { printf("noenoughmemory!"); exit(0); } p->next=s;//把s的地址賦給p所指向的結(jié)點(diǎn)的鏈域,這樣就把p和s所指向的結(jié)點(diǎn)連接起來了 fscanf(fry,"%d%s%s\n",&s->ryflag,s->name,s->mima); s->next=NULL; p=s; } fclose(fry); returnh;}shangpin*spcreat()//建立單鏈表的函數(shù){ shangpin*h,*p,*s;//*h保存表頭結(jié)點(diǎn)的指針,*p指向當(dāng)前結(jié)點(diǎn)的前一個結(jié)點(diǎn),*s指向當(dāng)前結(jié)點(diǎn) inti;//計數(shù)器 chara[4][11]={"mianbao","yinliao","taideng","yusan"}; floatb[4]={1.5,4,38,12}; floatc[4]={1.2,3,28,7}; if((h=(shangpin*)malloc(sizeof(shangpin)))==NULL)//分配空間并檢測 { printf("noenoughmemory!"); exit(0); } h->mingcheng[0]='\0';//把表頭結(jié)點(diǎn)的數(shù)據(jù)域置空 h->next=NULL;//把表頭結(jié)點(diǎn)的鏈域置空 p=h;//p指向表頭結(jié)點(diǎn) for(i=0;i<4;i++) { if((s=(shangpin*)malloc(sizeof(shangpin)))==NULL)//分配新存儲空間并檢測 { printf("noenoughmemory!"); exit(0); } p->next=s;//把s的地址賦給p所指向的結(jié)點(diǎn)的鏈域,這樣就把p和s所指向的結(jié)點(diǎn)連接起來了 s->bianhao=(i+1);//編號 strcpy(s->mingcheng,a[i]);//名稱 s->jiage=b[i];//價格 s->yuanjia=c[i];//原價 s->ruku=100;//入庫 s->kucun=80;//庫存 s->xiancun=20;//現(xiàn)存 s->next=NULL; p=s; } returnh;}/*****jiemian.c*****/voidzhujiemian(shangpin*h,char*menu[],char*xs[][5])//主界面繪制{ delay(30); setbkcolor(LIGHTBLUE); zhucaidan(menu);//主菜單 xscaidan(xs);//商品實時信息菜單 xiaoshou(h);//商品實時信息輸出 yyjiemian(h);//模擬銷售界面繪制 }voidhyjiemian()//歡迎及登陸界面繪制{ char*p[]={"管理員","普通人","用戶名","密碼","登錄"}; intx,y; x=30,y=50; delay(50); cleardevice(); setbkcolor(BLACK); disphz16(x,y+8,10,3,YELLOW,"超市商品庫存管理系統(tǒng)"); disphz16(x+3,y+8,10,3,RED,"超市商品庫存管理系統(tǒng)"); disphz16(x+6,y+8,10,3,GREEN,"超市商品庫存管理系統(tǒng)"); x=180,y=150; disphz16(x,y,20,4,YELLOW,"歡迎你!"); disphz16(x,y
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 刑事辯護(hù)服務(wù)行業(yè)營銷策略方案
- 居家醫(yī)療保健服務(wù)行業(yè)市場調(diào)研分析報告
- 電動食物攪拌機(jī)產(chǎn)品供應(yīng)鏈分析
- 眼鏡套細(xì)分市場深度研究報告
- 覆盆子中藥材市場分析及投資價值研究報告
- 練習(xí)本封面項目營銷計劃書
- 停車場服務(wù)行業(yè)經(jīng)營分析報告
- 二手圖書交易電商行業(yè)經(jīng)營分析報告
- 頭發(fā)用滅虱制劑產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 便攜式超聲波洗衣設(shè)備產(chǎn)品供應(yīng)鏈分析
- 《治安管理處罰法》課件
- 組建內(nèi)鏡中心的可行性方案
- 咳嗽暈厥綜合征查房
- 2024年中國長江三峽集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 物業(yè)掃黑除惡專項行動行動
- 胎膜早破教學(xué)查房
- 消毒供應(yīng)中心消毒隔離質(zhì)量控制評價標(biāo)準(zhǔn)
- 陶藝教學(xué)課件
- 主播試用期合同模板正規(guī)范本(通用版)
- 視覺與視覺環(huán)境設(shè)計
- 建筑工程管理(建筑材料)專業(yè)中級職稱理論練習(xí)試題及答案(一)
評論
0/150
提交評論