![8.2.1趣味程序案例 - 趣味程序案例解析-教學課件_第1頁](http://file4.renrendoc.com/view2/M01/36/38/wKhkFmZK4E-AAkFkAACdOmwHakM251.jpg)
![8.2.1趣味程序案例 - 趣味程序案例解析-教學課件_第2頁](http://file4.renrendoc.com/view2/M01/36/38/wKhkFmZK4E-AAkFkAACdOmwHakM2512.jpg)
![8.2.1趣味程序案例 - 趣味程序案例解析-教學課件_第3頁](http://file4.renrendoc.com/view2/M01/36/38/wKhkFmZK4E-AAkFkAACdOmwHakM2513.jpg)
![8.2.1趣味程序案例 - 趣味程序案例解析-教學課件_第4頁](http://file4.renrendoc.com/view2/M01/36/38/wKhkFmZK4E-AAkFkAACdOmwHakM2514.jpg)
![8.2.1趣味程序案例 - 趣味程序案例解析-教學課件_第5頁](http://file4.renrendoc.com/view2/M01/36/38/wKhkFmZK4E-AAkFkAACdOmwHakM2515.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章大型趣味程序設計第2節(jié)趣味程序案例前言目的:通過案例解析,領略大型程序的設計思想和開發(fā)方法,了解程序評價標準案例:通訊錄簡單計算器俄羅斯方塊主要內容通訊錄范例解析簡易計算器范例解析俄羅斯方塊范例解析通訊錄問題描述:
以文件的方式保存用戶錄入的通訊錄數(shù)據(jù)供用戶查詢和使用通訊錄信息通訊錄功能分析:
記錄項的基本屬性:姓名、性別、住址、聯(lián)系電話、電子郵件等操作功能:錄入:操作添加一條新的記錄項刪除:刪除一條已經存在的記錄項
通訊錄功能分析:修改:改變記錄項的一個或多個屬性,并用新的記錄項覆蓋已經存在的記錄項查找:根據(jù)用戶輸入的屬性值查找符合條件的記錄項。通訊錄功能分析:通訊錄數(shù)據(jù)以文件形式存儲在磁盤上,根據(jù)實際需要定義文件的存儲格式;在程序運行中需要對文件進行讀取操作。程序中還要對輸入數(shù)據(jù)的容錯性進行檢查,可以保證通訊錄數(shù)據(jù)的合法性。通訊錄設計:程序總體結構:輸入輸出模塊:人機交互,包括程序界面顯示、用戶輸入響應、結果輸出等管理模塊:管理模塊從輸入輸出模塊讀取用戶命令并進行相應的操作,包括錄入、刪除、修改、查找、列表等文件操作模塊:進行存儲文件的讀寫通訊錄模塊結構圖輸入輸出終端輸入輸出模塊管理模塊文件操作模塊存儲文件用戶輸入系統(tǒng)輸出文件寫入文件讀出通訊錄界面設計:通訊錄數(shù)據(jù)結構設計:
struct
myrecord{ unsignedintnum; unsignedintgroup; charname[MAXLEN+1]; chargender; datebirthday; charaddress[MAXLEN+1]; charphone[MAXLEN+1]; charemail[MAXLEN+1];};通訊錄數(shù)據(jù)結構設計:
struct
mydate{ unsignedintyear; unsignedintmonth; unsignedintday;};typedef
struct
mydatedate;通訊錄數(shù)據(jù)結構設計:三個查詢關鍵字:記錄編號、組別和聯(lián)系人姓名
unionmysearch_entry{ unsignedintnum; unsignedintgroup; charname[MAXLEN+1];};typedefunionmysearch_entrysearch_entry;通訊錄-函數(shù)設計函數(shù)原型函數(shù)功能函數(shù)處理描述voidmenulist(void)以文本方式顯示程序主菜單,同時響應用戶輸入調用bioske(0),獲取按鍵的值voidupbar(inty)向上滾動光標條通過改變字體顏色實現(xiàn)光標條移動voiddownbar(inty) 向下滾動光標條通過改變字體顏色實現(xiàn)光標條移動voidmydelay(void)等待用戶響應調用getch()實現(xiàn)voidformat(void)結果輸出時打印輸出的格式信息調用printf()實現(xiàn)voidsearchmenu(void)輸出查詢功能的子菜單調用printf()實現(xiàn)voidinput_search(charch)處理查詢時用戶的輸入,將關鍵字讀入根據(jù)輸入參數(shù)ch,執(zhí)行相應的操作intinput_num(void)讀入一個整型數(shù)值(記錄編號),進行合法性檢查采用了遞歸的方法循環(huán)讀取數(shù)據(jù)int
input_new(myrecord*p)進行數(shù)據(jù)修改時,讀入一個新的記錄項,并用它覆蓋輸入參數(shù)所指向的數(shù)據(jù)記錄項。參數(shù):新記錄項的指針返回值:返回是否進行了修改的信息,已修改返回1,否則返回0。myrecord*input_app(void)錄入信息時處理鍵盤輸入,對輸入進行合法性檢查逐項錄入通訊記錄int
date_legal(int
year,int
month,intday)檢查日期是否為合法參數(shù):年、月、日的信息返回值:合法日期返回1,否則返回0menu.c輸入輸出文件通訊錄-函數(shù)設計file.c文件處理文件int
file_app(myrecord*p)添加一條新的記錄項參數(shù):要錄入的記錄項的指針返回值:操作結果(插入成功返回1,失敗返回0)myrecord*read_record(intn)從文件中讀出下標為n的塊(記錄項)參數(shù):下標值返回值:讀取結果的指針int
write_record(myrecord*p,intn)向文件中寫入某一塊(如果該塊已經存在,將進行覆蓋)參數(shù):指向記錄項的指針和要寫入的塊位置返回值:操作結果(插入成功返回1,失敗返回0)intfile_search(search_entry*s,intf)對存儲文件進行遍歷,查找符合輸入的記錄項并輸出參數(shù):指向查詢項的指針和查詢類型返回值:符合條件的記錄項總數(shù)(如果是0則查找失?。﹊nt
file_delete(intn)刪除文件中某個記錄塊參數(shù):下標值返回值:操作結果(插入成功返回1,失敗返回0)通訊錄-函數(shù)設計control.c控制文件voidappend(void)執(zhí)行數(shù)據(jù)錄入操作調用input_app()完成數(shù)據(jù)錄入,調用file_app()完成數(shù)據(jù)保存。voiddelet(void)執(zhí)行數(shù)據(jù)記錄項刪除操作調用file_search查找要刪除的記錄,然后調用file_delete()進行刪除voidsearch(void)執(zhí)行數(shù)據(jù)查找操作調用searchmenu()進入查找的菜單,調用input_search(ch)獲得要查找的內容,file_search()進行查找voidchange(void)執(zhí)行數(shù)據(jù)記錄項修改操作調用input_num()輸入待修改的記錄,調用file_search()進行查找,調用input_new()輸入新的內容,調用write_record()進行更新voidlist_all(void)列出當前所有聯(lián)系人信息打開文件,遍歷所有記錄并輸出voidinit(void)系統(tǒng)初試化操作,保證文件的正確性和合法性調用fopen()打開文件,初始化voidquit(void)系統(tǒng)退出函數(shù),寫回文件以保證數(shù)據(jù)的一致性關閉文件,退出系統(tǒng)通訊錄-程序運行示意圖通訊錄源程序:略主要內容通訊錄范例解析簡易計算器范例解析俄羅斯方塊范例解析簡單計算器問題描述:
Windows操作系統(tǒng)提供了計算器應用程序,它有標準型和科學型兩種模式,是標準的Windows圖形界面應用程序,支持鼠標和鍵盤操作。Windows提供的計算器簡單計算器功能分析:簡單計算器是對Windows計算器的模擬,設計其功能如下:具有加(+)、減(-)、乘(*)、除(/)四則運算和求百分運算;通過鼠標輸入一個數(shù),單擊S按鈕還可計算該數(shù)的平方根簡單計算器設計:簡單計算器的處理過程:首先進行圖形和鼠標初始化,接著顯示簡單計算器外觀,并接受用戶的鼠標控制使用。如果單擊了鼠標右鍵,則程序關閉圖形方式并結束運行。簡單計算器簡單計算器的流程圖主程序流程:voidmain(){
GraphInit();
initmouse(); picture(); compute();
closegraph();}簡單計算器界面外觀
:簡單計算器界面設計:(1)背景采用淺藍色,用灰色作底色和紅色作前景色畫一個bar3d圖形,模擬立體效果;(2)第1行是數(shù)據(jù)輸入和結果輸出的信息顯示框,使用bar函數(shù),用黃色填充;(3)信息顯示框下面是4排按鈕,每排5個,同樣使用bar函數(shù)。按鈕被設計成有按下和彈起兩種狀態(tài),初始是彈起狀態(tài);(4)在每個按鈕框上顯示相應的按鈕標簽;(5)在簡單計算器下方輸出使用說明和設計單位信息。簡單計算器數(shù)據(jù)結構設計:簡單計算器沒有用到復雜的數(shù)據(jù)結構,計算時定義了兩個double變量u、v和一個字符數(shù)組s及幾個標志變量。開始使用時u和v變量分別存儲第1次和第2次輸入的數(shù)據(jù),計算結果始終保存在u中。繼續(xù)運算時,輸入的數(shù)據(jù)存于v,并與u中的數(shù)據(jù)運算后結果保存于u中。簡單計算器數(shù)據(jù)結構設計:簡單計算器進行加減乘除運算的函數(shù)compute()中,定義以下主要標志變量:(1)sign:表示'+'、'-'、'*'、'/'等運算符的整數(shù)變量。值為0表示當前未單擊過運算符。(2)flag:輸入數(shù)據(jù)時是否單擊了小數(shù)點。單擊了小數(shù)點,flag為1,否則為0。簡單計算器函數(shù)設計:簡單計算器采用了結構化程序設計思想,由一個.h文件和四個.c文件組成,并構造了TC工程文件來管理和生成簡單計算器應用。每個源文件包含多個函數(shù)的設計,這些函數(shù)的功能設計及處理描述見下表。簡單計算器-函數(shù)設計文件名函數(shù)原型函數(shù)功能處理描述mouse.cvoidinitmouse()鼠標初始化調用0x33中斷的0號功能寄存器ax返回值不是-1,表明鼠標初始化失敗voidget_mouse_position(int*x,int*y)獲取鼠標位置坐標調用0x33中斷的3號功能鼠標位置存于寄存器cx和dx中,然后存于x、y指針變量指向的單元返回調用函數(shù)int
leftpress()判斷鼠標左鍵是否單擊調用0x33中斷的3號功能鼠標狀態(tài)存于寄存器bx,其第0位是1表明左鍵被按下int
rightpress()判斷鼠標右鍵是否單擊調用0x33中斷的3號功能鼠標狀態(tài)存于寄存器bx,其第1位是1表明右鍵被按下簡單計算器-函數(shù)設計picture.cvoidpicture()繪制計算器界面使用圖形函數(shù)繪制計算器外框調用公用函數(shù)bottonup()繪制彈起效果的按鈕調用系統(tǒng)outtextxy()輸出按鈕標簽調用系統(tǒng)outtextxy()輸出使用說明等信息注:函數(shù)開始繪制鼠標圖標并保存在全局變量imagep中,在compute()函數(shù)(見compute.c文件)中涉及顯示、移動鼠標等操作簡單計算器-函數(shù)設計util.cvoidGraphInit()圖形初始化調用系統(tǒng)函數(shù)initgraph()進行初始化失敗則程序結束運行voidbottondown(int
x,inty)畫按下效果的按鈕框調用畫線及顏色設置函數(shù)繪制按下效果的按鈕框(x,y)表示按鈕框的左上角坐標voidbottonup(int
x,inty)畫彈起效果的按鈕框調用畫線及顏色設置函數(shù)繪制彈起效果的按鈕框(x,y)表示按鈕框的左上角坐標voidshow(int
x,inty)單擊按鈕的效果顯示顯示按下的按鈕延時顯示彈起的按鈕注:模擬按鈕被單擊簡單計算器-函數(shù)設計util.cchargetnumber(int
x,inty)獲取單擊按鈕圖標每個按鈕的位置是確定的(即矩形框的左上角坐標和大小已知)根據(jù)單擊按鈕時鼠標的(x,y)可確定單擊了哪個按鈕,函數(shù)返回按鈕的標簽例:左上角坐標為(150,105)和右下角為(200,135)的矩形框表示計算器上數(shù)字'7'按鈕voidclearscreen()清信息顯示框清除信息顯示框中的數(shù)據(jù)(可能是輸入的數(shù)或輸出的計算結果)int
kx(chard)獲取按鈕的左上角x坐標d表示按鈕的圖標根據(jù)d返回按鈕的左上角x坐標按鈕左上角坐標為模擬單擊按鈕服務簡單計算器-函數(shù)設計util.cint
ky(chard)獲取按鈕的左上角y坐標d表示按鈕的圖標根據(jù)d返回按鈕的左上角y坐標按鈕左上角坐標為模擬單擊按鈕服務voidoutch(doublesum)在信息顯示框中輸出sumsum的絕對值大于1e20,輸出E,即對太大或太小的數(shù)顯示出錯sum小于等于1e20且大于等于1e8,顯示格式為d.dExxsum大于等于-1e20且小于等于-1e8,顯示格式為-d.dExxsum的值在-1e8和1e8之間,若是0,顯示0.其他,按實際顯示compute.cvoidcompute()簡單計算器的主處理函數(shù)最外層循環(huán)由鼠標右鍵控制,單擊右鍵則計算器退出在其內層,判斷鼠標左鍵是否單擊,無則僅做移動鼠標光標處理若單擊左鍵,且MouseLeftFlag全局變量為1,則置該變量為0,避免重復進入,并進行相應處理若單擊的是'C',則啟用計算器若單擊'0'-'9'數(shù)字鍵,則進行第1個或第2個輸入數(shù)據(jù)的處理若單擊加,減,乘,除,等號按鈕,進行相應的計算處理若單擊小數(shù)點按鈕的處理若單擊求平方根按鈕的處理若單擊+/-按鈕的處理doublecalculate(doubleu,doublev,intsign)加減乘除計算處理根據(jù)sign的運算符進行加減乘除的計算處理計算結果保存在u中,但由函數(shù)返回voidmain()計算器的main()函數(shù)應用程序由多個文件組成時,僅能有一個main()函數(shù)簡單計算器-函數(shù)設計簡單計算器源程序:略簡單計算器測試:關于測試方法和特殊輸入的測試,針對簡單計算器程序,我們可以從以下幾個方面來檢驗程序功能是否正確。1.界面及按鈕單擊測試檢查界面布局是否合理、正確,單擊按鈕是否有按下再彈起效果,單擊按鈕的輸入是否正確。簡單計算器測試:2.簡單計算器的功能測試(1)加、減、乘、除四則運算的測試。(2)優(yōu)先級處理的測試單擊‘1’、‘+’、‘2’、‘*’、‘4’、‘=’按鈕,結果是12,即不支持四則運算的優(yōu)先級。因為單擊‘*’按鈕時,1+2的結果3已經計算并顯示在信息顯示框中,此時繼續(xù)計算乘4得結果12。簡單計算器測試:
(3)求平方根運算的測試
1)計算sqrt(9)
先單擊'9'、再'S'按鈕,看結果是否正確。
2)計算1+sqrt(9)
檢查是否能正確1+sqrt(9)。通過以上測試可以基本確定計算器程序是否實現(xiàn)了預定的功能。主要內容通訊錄范例解析簡易計算器范例解析俄羅斯方塊范例解析俄羅斯方塊問題描述:
要求支持鍵盤操作和7種不同類型方塊的旋轉變換,并且界面上顯示下一個方塊的提示以及當前的玩家得分俄羅斯方塊功能分析:俄羅斯方塊游戲需要解決的問題包括:(
1)整個游戲界面的圖形顯示;(2)各種方塊形狀的表示;(3)如何控制方塊的移動、旋轉和下落速度;(4)如何判斷方塊是否到底;(5)如何判斷一行是否填滿以及如何消去填滿的行;(6)如何判斷游戲的結束及如何終止游戲;(7)游戲難度的設計和得分規(guī)則
俄羅斯方塊功能分析:重點:游戲面板的數(shù)據(jù)結構:二維數(shù)組7種形狀方塊的數(shù)據(jù)結構:結構體保存每種形狀方塊的坐標、顏色俄羅斯方塊設計:程序總體結構:voidmain(){
InitializeGraph();
SetTimer(newtimer);/*設置新的時鐘中斷*/ while(1) {
StartGame();
ProcessInGame();
if(bOver)break; }
KillTimer();
closegraph();}俄羅斯方塊界面設計:分為左右兩個部分:左邊為游戲面板右邊有三個框:下一形狀提示框、速度框和記分框俄羅斯方塊數(shù)據(jù)結構設計:定義如下的結構體來表示每一個形狀:structblock{
intarrXY[8];
int
nColor;
int
nNext;};可用4*4的格子顯示7種形狀,并用4個數(shù)對來表示:arrXY[0]、arrXY[1]表示第一個數(shù)對,arrXY[2]、arrXY[3]表示第二個數(shù)對…。例如,(-2,0)、(-1,0)、(0,0)、(1,0)表示左邊的方塊
-1012-3□□□□-2□■□□-1□■□□0□■■□俄羅斯方塊數(shù)據(jù)結構設計:每一種形狀都可以進行旋轉,旋轉后的變形體同樣可用結構體block表示。所有的7種形狀和它們的旋轉體(共19個)可保存在一個全局數(shù)組arrayBlock中。Block中的nNext就是當前形狀逆時針旋轉后的下一個形狀在該全局數(shù)組中的索引。俄羅斯方塊數(shù)據(jù)結構設計:第一個形狀和它的旋轉體在arrayBlock中的表示□□□□□□□□□□□□□□□□□■□□□□□□□■■□□□□□□■□□□□■□□□■□■■■□□■■□■■■□□□■□■□□□BLOCKarrayBlock[19]={ /*x1,y1,x2,y2,x3,y3,x4,y4,color,next,第一種形狀*/ {0,-2,0,-1,0,0,1,0,CYAN,1},/*第一種形狀,對應圖3-12的第一個*/ {-1,0,0,0,1,-1,1,0,CYAN,2},/*一種旋轉體,對應圖3-12的第二個*/ {0,-2,1,-2,1,-1,1,0,CYAN,3},/*另一種旋轉體,對應圖3-12的第三個*/ {-1,-1,-1,0,0,-1,1,-1,CYAN,0},/*第三種旋轉體,對應圖3-12的第四個*/…….}俄羅斯方塊數(shù)據(jù)結構設計:游戲的主界面:寬10、高20的游戲板數(shù)據(jù)結構:全局數(shù)組Gameboard[12][22],1表示已有方塊,0表示這個位置空著。在10*20基礎上各加2行、2列為了便于判斷形狀在移動時是否到邊、到底。整個屏幕的坐標系原先為640*480。在此游戲中,將16個像素定義為一個方格的邊長,所以坐標系轉變成為了40*30(640/16=40,480/16=30)。俄羅斯方塊數(shù)據(jù)結構設計:絕對坐標和相對坐標的轉換相對坐標即指在結構體block中的4對坐標某個形狀的絕對坐標:指原點方塊(4*4格子中的第2列、第4行的方塊)在10*20的游戲面板中的坐標
俄羅斯方塊-程序結構1個.h文件和4個.c文件,共20個函數(shù);函數(shù)相互關系見右圖
俄羅斯方塊-函數(shù)設計Timer.c文件文件名函數(shù)原型函數(shù)功能函數(shù)處理描述Timer.cVoidinterrupt(*oldtimer)(void)指向原來時鐘中斷處理過程入口的中斷處理函數(shù)指針(句柄)Voidinterruptnewtimer(void)新的時鐘中斷處理函數(shù)調用(*oldtimer)()函數(shù)句柄,計時器自加1VoidSetTimer(voidinterrupt(*IntProc)(void))設置新的時鐘中斷處理過程調用setvect()設置新的時鐘中斷處理過程voidKillTimer()恢復原有的時鐘中斷處理過程調用setvect()恢復原有的時鐘中斷處理過程俄羅斯方塊-函數(shù)設計Drawing.c文件文件名函數(shù)原型函數(shù)功能函數(shù)處理描述Drawing.cvoidInitializeGraph()初始化圖形模式①調用initgraph()切換到圖形模式②初始化若發(fā)生錯誤,則返回錯誤碼。VoidInitializeGameboard()初始化游戲面板以及下一形狀提示框、計分框和難度框①調用bar()、rectangle()等庫函數(shù)繪圖函數(shù)繪制游戲界面。②調用outtextxy()函數(shù)顯示文字。俄羅斯方塊-函數(shù)設計Util.c文件函數(shù)原型函數(shù)功能函數(shù)處理描述Util.cvoidDrawSquare(intx,inty)在坐標(x,y)處畫方塊調用庫函數(shù)bar()繪制方塊VoidDrawBlock(int
BlockIndex,int
sx,int
sy,intcolor)在坐標(sx,sy)處繪制顏色為color的形狀調用DrawSquare()函數(shù)繪制形狀Int
IsConflict(int
BlockIndex,intx,inty)判斷形狀是否能存在于坐標(x,y)處無沖突返回0,有沖突返回1VoidHandleLeft(int
BlockIndex,int*x,int*y)按下左方向鍵時的處理函數(shù)調用IsConflic()函數(shù)判斷形狀是否可以左移,VoidHandleRight(int
BlockIndex,int*x,int*y)按下右方向鍵時的處理函數(shù)調用IsConflic()函數(shù)判斷形狀是否可以右移,VoidHandleUp(int*BlockIndex,int*x,int*y)按下上方向鍵(旋轉鍵)時的處理函數(shù)調用IsConflic()函數(shù)判斷形狀是否可以旋轉,int
HandleDown(int
BlockIndex,int*x,int*y)按下向下方向鍵或自由下落時的處理函數(shù)形狀在自由下落返回0,無法下落了返回1,并做相應處理int
IsLineFull(inty)判斷第y行是否已被填滿填滿返回1,否則返回0voidKillLine(inty)消去第y行將消去的行置為背景色int
KillLines(inty)消去第y行以及與第y行連續(xù)的上面被填滿的行返回消去的行數(shù)int
IsGameOver()判斷游戲是否結束游戲結束返回1,否則返回0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石英玻璃纖維布項目發(fā)展計劃
- 電子文檔格式轉換標準流程
- 加強需求預測提升響應速度
- 關于開展新員工培訓的策劃書
- 自然資源保護與合理利用合作協(xié)議
- 移動應用開發(fā)及維護服務合同
- 草房子小學生故事解讀
- 2025年稀土-鐵超磁致伸縮單晶材料合作協(xié)議書
- 惠州學校道路標線施工方案
- IT服務行業(yè)云服務解決方案探討
- 福建省服務區(qū)標準化設計指南
- 銷售人員薪酬設計實例 薪酬制度設計 薪酬設計方案 設計案例全套
- 光伏電站生產準備大綱全套
- 工業(yè)控制安全
- 媽祖重離子醫(yī)院硼中子俘獲治療系統(tǒng)環(huán)境影響報告
- 征地搬遷基本要求及工作技巧課件
- 部編版語文五年級下冊 課本解讀
- 海洋工程裝備制造職業(yè)發(fā)展研究報告
- 供應商現(xiàn)場審核評估表
- 20XX年吉林省事業(yè)單位公開招聘人員審核備案表
- 產科危重癥識別與處理及危重癥管理培訓課件
評論
0/150
提交評論