計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-第五章-程序組織與軟件開(kāi)發(fā)方法講課資料_第1頁(yè)
計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-第五章-程序組織與軟件開(kāi)發(fā)方法講課資料_第2頁(yè)
計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-第五章-程序組織與軟件開(kāi)發(fā)方法講課資料_第3頁(yè)
計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-第五章-程序組織與軟件開(kāi)發(fā)方法講課資料_第4頁(yè)
計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-第五章-程序組織與軟件開(kāi)發(fā)方法講課資料_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)第五章程序組織與軟件開(kāi)發(fā)方法提綱5.1庫(kù)與接口(閱讀)5.2隨機(jī)數(shù)庫(kù)(閱讀)5.3作用域與生存期(閱讀)5.4宏5.5條件編譯5.6典型軟件開(kāi)發(fā)流程本章小結(jié)5.1庫(kù)與接口庫(kù)與程序文件程序文件:源文件(*.c)、頭文件(*.h)、工程文件庫(kù):源文件與頭文件接口通過(guò)接口使用庫(kù):包括指定庫(kù)的頭文件與源文件優(yōu)勢(shì):不需了解庫(kù)的實(shí)現(xiàn)細(xì)節(jié),只需了解庫(kù)的使用方法標(biāo)準(zhǔn)I/O庫(kù)輸入輸出函數(shù)常用函數(shù)列表STRINGgets(STRINGbuffer);intprintf(CSTRINGfmt,…);intputs(CSTRINGstr);intscanf(CSTRINGfmt,…);標(biāo)準(zhǔn)輔助函數(shù)庫(kù)工具與輔助函數(shù)常用函數(shù)列表voidexit(intstatus);voidfree(void*p);void*malloc(size_tsize);intrand();voidsrand(unsignedintseed);頭文件的包含策略包含頭文件的格式尖括號(hào):在C編譯器的標(biāo)準(zhǔn)目錄下查找該頭文件雙引號(hào):首先在當(dāng)前工程項(xiàng)目所在的目錄下查找,若不存在,則查找標(biāo)準(zhǔn)目錄使用雙引號(hào)包含自己或其他編寫(xiě)的非C標(biāo)準(zhǔn)庫(kù)頭文件的多次包含多個(gè)文件包含同一個(gè)頭文件例:“zyrandom.h”包含“zylib.h”,“main.c”包含“zyrandom.h”與“zylib.h”,則“main.c”不僅主動(dòng)包含了“zylib.h”,還通過(guò)“zyrandom.h”被動(dòng)包含了“zylib.h”多次包含同一個(gè)頭文件可能會(huì)導(dǎo)致程序問(wèn)題頭文件的包含策略解決方法使用條件編譯指令#ifndef(條件判斷,若未定義)、#define(定義)與#endif(結(jié)束條件判斷)被包含的頭文件#ifndef__ZYLIB__#define__ZYLIB__頭文件的具體內(nèi)容在此#endif源文件或包含文件#ifndef__ZYLIB__#include"zylib.h"#endif源文件或包含文件的具體內(nèi)容在此5.2隨機(jī)數(shù)庫(kù)隨機(jī)數(shù)的生成庫(kù)的設(shè)計(jì)原則隨機(jī)數(shù)庫(kù)接口隨機(jī)數(shù)庫(kù)實(shí)現(xiàn)隨機(jī)數(shù)庫(kù)測(cè)試隨機(jī)數(shù)的生成第一版編寫(xiě)程序,調(diào)用rand函數(shù)生成五個(gè)隨機(jī)數(shù)#include<stdio.h>#include<stdlib.h>intmain(){inti;printf("Onthiscomputer,theRAND_MAXis%d.\n",RAND_MAX);printf("Fivenumberstherandfunctiongeneratesasfollows:\n");for(i=0;i<5;i++)printf("%d;",rand());printf("\n");return0;}隨機(jī)數(shù)的生成第二版編寫(xiě)程序,調(diào)用rand函數(shù)生成五個(gè)隨機(jī)數(shù)#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){inti;printf("Onthiscomputer,theRAND_MAXis%d.\n",RAND_MAX);printf("Fivenumberstherandfunctiongeneratesasfollows:\n");

srand((int)time(0));for(i=0;i<5;i++) printf("%d;",rand());printf("\n");return0;}接口設(shè)計(jì)原則用途一致接口中所有函數(shù)都屬于同一類(lèi)問(wèn)題操作簡(jiǎn)單函數(shù)調(diào)用方便,最大限度隱藏操作細(xì)節(jié)功能充足滿(mǎn)足不同潛在用戶(hù)的需要性能穩(wěn)定經(jīng)過(guò)嚴(yán)格測(cè)試,不存在程序缺陷隨機(jī)數(shù)庫(kù)接口設(shè)計(jì)隨機(jī)數(shù)接口#ifndef__ZYRANDOM__#define__ZYRANDOM__#ifndef__ZYLIB__#include"zylib.h"#endifvoidRandomize();intGenerateRandomNumber(intlow,inthigh);doubleGenerateRandomReal(doublelow,doublehigh);#endif隨機(jī)數(shù)庫(kù)實(shí)現(xiàn)實(shí)現(xiàn)隨機(jī)數(shù)庫(kù)#include<stdlib.h>#include<time.h>#ifndef__ZYRANDOM__#include"zyrandom.h"#endif#ifndef__ZYLIB__#include"zylib.h"#endifvoidRandomize(){srand((int)time(NULL));}隨機(jī)數(shù)庫(kù)實(shí)現(xiàn)intGenerateRandomNumber(intlow,inthigh){double_d;if(low>high)PrintErrorMessage(FALSE,"GenerateRandomNumber:Makesurelow<=high.\n");_d=(double)rand()/((double)RAND_MAX+1.0);return(low+(int)(_d*(high-low+1)));}doubleGenerateRandomReal(doublelow,doublehigh){double_d;if(low>high)PrintErrorMessage(FALSE,"GenerateRandomReal:Makesurelow<=high.\n");_d=(double)rand()/((double)RAND_MAX+1.0);return(low+_d*(high-low));}隨機(jī)數(shù)庫(kù)測(cè)試單獨(dú)測(cè)試庫(kù)的所有函數(shù)合法參數(shù)時(shí)返回結(jié)果是否正確非法參數(shù)時(shí)返回結(jié)果是否正確,即容錯(cuò)功能是否正常聯(lián)合測(cè)試多次運(yùn)行程序,查看生成的數(shù)據(jù)是否隨機(jī)測(cè)試整數(shù)與浮點(diǎn)數(shù)隨機(jī)數(shù)是否均能正確工作5.3作用域與生存期量的作用域與可見(jiàn)性量的存儲(chǔ)類(lèi)與生存期函數(shù)的作用域與生存期聲明與定義量的作用域與可見(jiàn)性作用域與可見(jiàn)性作用域:標(biāo)識(shí)符的有效范圍可見(jiàn)性:程序中某個(gè)位置是否可以使用某個(gè)標(biāo)識(shí)符標(biāo)識(shí)符僅在其作用域內(nèi)可見(jiàn)位于作用域內(nèi)的標(biāo)識(shí)符不一定可見(jiàn)局部數(shù)據(jù)對(duì)象定義于函數(shù)或復(fù)合語(yǔ)句塊內(nèi)部的數(shù)據(jù)對(duì)象(包括變量、常量與函數(shù)形式參數(shù)等)局部數(shù)據(jù)對(duì)象具有塊作用域,僅在定義它的塊內(nèi)有效有效性從定義處開(kāi)始直到該塊結(jié)束多個(gè)函數(shù)定義同名的數(shù)據(jù)對(duì)象是允許的,原因?局部數(shù)據(jù)對(duì)象的作用域intfunc(intx,inty){intt;t=x+y;/*單獨(dú)出現(xiàn)的花括號(hào)對(duì)用于引入嵌套塊*/

{/*允許在塊中定義數(shù)據(jù)對(duì)象,作用域僅限本塊*/intn=2;printf("n=%d.\n",n);

}returnt;}量的作用域與可見(jiàn)性全局?jǐn)?shù)據(jù)對(duì)象定義于函數(shù)或復(fù)合語(yǔ)句塊之外的數(shù)據(jù)對(duì)象全局?jǐn)?shù)據(jù)對(duì)象具有文件(全局)作用域,有效性從定義處開(kāi)始直到本文件結(jié)束,其后函數(shù)都可直接使用若包含全局?jǐn)?shù)據(jù)對(duì)象定義的文件被其他文件包含,則其作用域擴(kuò)展到宿主文件中,這可能會(huì)導(dǎo)致問(wèn)題,為什么?不要在頭文件中定義全局?jǐn)?shù)據(jù)對(duì)象!函數(shù)原型作用域定義在函數(shù)原型中的參數(shù)具有函數(shù)原型作用域,其有效性?xún)H延續(xù)到此函數(shù)原型結(jié)束函數(shù)原型中參數(shù)名稱(chēng)可以與函數(shù)實(shí)現(xiàn)中的不同,也可以省略作用域與可見(jiàn)性示例1 inti; /*

全局變量i作用域開(kāi)始,可見(jiàn)*/2 intmain()3 {4 intn; /*局部變量n作用域開(kāi)始,可見(jiàn)*/5 i=10; /*全局變量i有效且可見(jiàn)*/6 printf("i=%2d;n=%2d\n",i,n);7 n=func(i);8 printf("i=%2d;n=%2d\n",i,n);9 } /*局部變量n作用域結(jié)束,不再可見(jiàn)*/10 intn; /*全局變量n作用域開(kāi)始,可見(jiàn)*/11 intfunc(intx) /*形式參數(shù)x作用域開(kāi)始,可見(jiàn)*/12 {13 i=0; /*全局變量i有效且可見(jiàn)*/14 printf("i=%2d;n=%2d\n",i,n);15 n=20; /*全局變量n有效且可見(jiàn)*/16 { /*嵌套塊開(kāi)始*/17 inti=n+x;/*局部變量i、x有效可見(jiàn);全局變量n有效可見(jiàn);全局變量i有效不可見(jiàn)*/18 printf("i=%2d;n=%2d\n",i,n);19 } /*局部變量i作用域結(jié)束,全局變量i有效且可見(jiàn)*/20 return++i;21 } /*局部變量x作用域結(jié)束,不再可見(jiàn)*/22 /*文件結(jié)束,全局變量i、n作用域結(jié)束*/量的存儲(chǔ)類(lèi)與生存期生存期:量在程序中存在的時(shí)間范圍C使用存儲(chǔ)類(lèi)表示生存期作用域表達(dá)量的空間特性,存儲(chǔ)類(lèi)表達(dá)量的時(shí)間特性靜態(tài)(全局)生存期全局?jǐn)?shù)據(jù)對(duì)象具有靜態(tài)(全局)生存期生死僅與程序是否執(zhí)行有關(guān)自動(dòng)(局部)生存期局部數(shù)據(jù)對(duì)象具有自動(dòng)(局部)生存期生死僅與程序流程是否位于該塊中有關(guān)程序每次進(jìn)入該塊時(shí)就為該對(duì)象分配內(nèi)存,退出該塊時(shí)釋放內(nèi)存;兩次進(jìn)入該塊時(shí)使用的不是同一個(gè)數(shù)據(jù)對(duì)象static關(guān)鍵字修飾局部變量:靜態(tài)局部變量使局部變量具有靜態(tài)生存期程序退出該塊時(shí)局部變量仍存在,并且下次進(jìn)入該塊時(shí)使用上一次的數(shù)據(jù)值靜態(tài)局部變量必須進(jìn)行初始化不改變量的作用域,仍具有塊作用域,即只能在該塊中訪問(wèn),其他代碼段不可見(jiàn)修飾全局變量使其作用域僅限定于本文件內(nèi)部,其他文件不可見(jiàn)靜態(tài)局部變量示例檢查下述程序的輸出結(jié)果#include<stdio.h>intfunc(intx);intmain(){inti;for(i=1;i<4;i++)printf("Invokefunc%dtime(s):Return%d.\n",i,func(i));return0;}intfunc(intx){staticintcount=0;/*定義靜態(tài)局部變量count,函數(shù)結(jié)束后仍存在*/

printf("x=%d.\n",x);return++count;}函數(shù)的作用域與生存期所有函數(shù)具有文件作用域與靜態(tài)生存期在程序每次執(zhí)行時(shí)都存在,并且可以在函數(shù)原型或函數(shù)定義之后的任意位置調(diào)用內(nèi)部函數(shù)與外部函數(shù)外部函數(shù):可以被其他文件中的函數(shù)所調(diào)用內(nèi)部函數(shù):不可以被其他文件中的函數(shù)所調(diào)用函數(shù)缺省時(shí)均為外部函數(shù)內(nèi)部函數(shù)定義:使用static關(guān)鍵字內(nèi)部函數(shù)示例:staticintTransform(intx);內(nèi)部函數(shù)示例:staticintTransform(intx){…}聲明與定義聲明不是定義定義在程序產(chǎn)生一個(gè)新實(shí)體聲明僅僅在程序中引入一個(gè)實(shí)體函數(shù)的聲明與定義聲明是給出函數(shù)原型,定義是給出函數(shù)實(shí)現(xiàn)代碼類(lèi)型的聲明與定義產(chǎn)生新類(lèi)型就是定義類(lèi)型定義示例:typedefenum__BOOL{FALSE,TRUE}BOOL;不產(chǎn)生新類(lèi)型就不是定義,而僅僅是聲明類(lèi)型聲明示例:enum__BOOL;全局變量的作用域擴(kuò)展全局變量的定義不能出現(xiàn)在頭文件中,只有其聲明才可以出現(xiàn)在頭文件中聲明格式:使用extern關(guān)鍵字/*庫(kù)的頭文件*//*此處僅引入變量a,其定義位于對(duì)應(yīng)源文件中*/externinta;/*變量a可導(dǎo)出,其他文件可用*//*庫(kù)的源文件*//*定義變量a

*/inta;5.4宏宏替換含參宏宏與函數(shù)的差異宏的特殊用法宏替換編譯前進(jìn)行簡(jiǎn)單文本替換STRINGNAME="TheFundamentals…"; STRINGNAME="The…";#define FALSE 0 /*宏定義前的標(biāo)識(shí)符不被替換*/#define TRUE 1 /*宏定義本身已不再需要*/#define NAME "QiaoLin"intmain() intmain(){ {

/*宏定義后標(biāo)識(shí)符全被替換*/STRINGMY_NAME=NAME; STRINGMY_NAME="QiaoLin";

/*字符串本身不會(huì)被替換*/STRINGs="NAME"; STRINGs="NAME";if(a==TRUE) if(a==1)…… ……} }宏替換的基本原則宏定義占用單獨(dú)一個(gè)文本行宏替換時(shí),被替換文字不能是標(biāo)識(shí)符的一部分宏定義中宏名稱(chēng)之后的全部?jī)?nèi)容都是替換文本,包括該文本行后面的操作符號(hào)或標(biāo)點(diǎn)符號(hào)設(shè)宏定義:#defineADDa+b;c=ADD被替換為c=a+b;可以使用已定義宏定義新宏#definePI3.14#defineAREAPI*r*r;area=AREA;被替換為area=3.14*r*r;宏替換的基本原則宏替換只發(fā)生一次,不會(huì)嵌套替換#definePI3.14#defineDPI*D*Darea=D;被替換為area=3.14*D*D;宏定義總是出現(xiàn)在函數(shù)聲明或定義之外,一般放置在頭文件的函數(shù)原型開(kāi)始之前宏定義的有效性從定義處開(kāi)始直到文件結(jié)束如果要提前取消某個(gè)宏定義,使用#undef指令#undefNAME宏的目的:降低改變同樣文本時(shí)的工作量;為特定文字起個(gè)有意義的名稱(chēng),取代魔數(shù)含參宏定義格式#define宏名稱(chēng)(參數(shù)列表)替換文本替換時(shí),使用參數(shù)列表中的實(shí)際參數(shù)逐一替換后面宏的替換文本中的形式參數(shù)定義與替換示例:看起來(lái)像函數(shù)#defineADD(x,y)x+yc=ADD(a,b);被替換為c=a+b;形式參數(shù)x被實(shí)際參數(shù)a替換,y被b替換含參宏的替換是直接替換#defineADD(x,y)x+yc=ADD(a+b,c);被替換為c=a+b+c;含參宏替換文本中的操作符優(yōu)先級(jí)問(wèn)題#definePI3.14#defineADD(x,y)x+y#defineAREA(r)PI*r*rc=AREA(ADD(a,b));首先被替換為c=PI*ADD(a,b)*ADD(a,b);然后被替換為c=PI*a+b*a+b;解決方案:使用括號(hào)#definePI3.14#defineADD(x,y)((x)+(y))#defineAREA(r)(PI*(r)*(r))c=AREA(ADD(a,b));被替換為c=(PI*(((a)+(b)))*(((a)+(b))));含參宏與函數(shù)的異同函數(shù)形式參數(shù)與實(shí)際參數(shù)具有固定類(lèi)型,并且保持一致;含參宏的參數(shù)沒(méi)有類(lèi)型要求,甚至可以不是數(shù)據(jù)對(duì)象示例:#defineMax(x,y)(x)>(y)?(x):(y)可以使用上述宏判斷整數(shù)或浮點(diǎn)數(shù)等類(lèi)型數(shù)據(jù)的大小關(guān)系,C語(yǔ)言是不允許為不同數(shù)據(jù)類(lèi)型編寫(xiě)同名函數(shù)的!函數(shù)調(diào)用在程序執(zhí)行時(shí)處理,含參宏在編譯前處理函數(shù)形式參數(shù)會(huì)在執(zhí)行時(shí)分配存儲(chǔ)空間,含參宏的參數(shù)不會(huì)分配存儲(chǔ)空間,不會(huì)發(fā)生參數(shù)傳遞,也沒(méi)有返回值函數(shù)調(diào)用占用程序執(zhí)行時(shí)間,含參宏替換不占用程序執(zhí)行時(shí)間,僅占用編譯時(shí)間函數(shù)調(diào)用節(jié)省程序代碼空間(多次調(diào)用使用同樣代碼),含參宏浪費(fèi)程序代碼空間(多次替換會(huì)使得代碼膨脹)宏的特殊用法略感興趣的可以自學(xué)閱讀zylib庫(kù)代碼需要了解這部分內(nèi)容5.5條件編譯略基礎(chǔ)知識(shí):見(jiàn)頭文件的包含策略復(fù)雜內(nèi)容:感興趣的可以自學(xué),開(kāi)發(fā)大型程序才需要了解5.6典型軟件開(kāi)發(fā)流程軟件工程概要問(wèn)題的提出需求分析概要設(shè)計(jì)詳細(xì)設(shè)計(jì)編碼實(shí)現(xiàn)系統(tǒng)測(cè)試經(jīng)驗(yàn)總結(jié)軟件工程概要需求分析:確定軟件需要解決什么問(wèn)題決定因素:人軟件開(kāi)發(fā)人員需要與用戶(hù)深入交流,明確問(wèn)題的輸入、輸出以及其他附加信息不要輕視任何問(wèn)題!方案設(shè)計(jì):設(shè)計(jì)程序框架概要設(shè)計(jì):設(shè)計(jì)總體方案,形成高層模塊劃分詳細(xì)設(shè)計(jì):細(xì)化模塊,獲得各模塊的輸入、輸出與算法編碼實(shí)現(xiàn):實(shí)際編程系統(tǒng)測(cè)試:測(cè)試程序的正確性與穩(wěn)定性經(jīng)驗(yàn)總結(jié)軟件開(kāi)發(fā)流程圖軟件開(kāi)發(fā)問(wèn)題我猜!我猜!我猜猜猜!編程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的猜價(jià)格游戲假設(shè)有某物品,已知其最低價(jià)格與最高價(jià)格游戲參與者在給定次數(shù)內(nèi)猜測(cè)其價(jià)格具體值若游戲者成功猜出其價(jià)格,作為獎(jiǎng)勵(lì)將得到該物品需求分析需求A:游戲運(yùn)行前首先應(yīng)向游戲參與者介紹游戲功能需求B:首期工程不需要解決游戲難度問(wèn)題,用戶(hù)迫切希望程序能在最短時(shí)間內(nèi)運(yùn)行起來(lái),因此只考慮最簡(jiǎn)單情形需求C:在每個(gè)游戲回合結(jié)束時(shí)允許用戶(hù)選擇是否重新開(kāi)始新游戲,這里游戲回合是指游戲參與者或者猜中價(jià)格或者其猜測(cè)機(jī)會(huì)已用完,如果用戶(hù)沒(méi)有選擇退出,游戲應(yīng)無(wú)休止地玩下去需求D:能夠記錄游戲參與者的游戲信息,目前僅統(tǒng)計(jì)用戶(hù)玩了多少回合以及贏了多少回合需求E:在用戶(hù)退出游戲時(shí),給出此次游戲勝率需求分析不明確的地方:什么是最簡(jiǎn)單情形?與用戶(hù)再次溝通……需求B1:設(shè)物品最低價(jià)格為100元,最高價(jià)格為200元需求B2:物品實(shí)際價(jià)格由系統(tǒng)運(yùn)行時(shí)隨機(jī)生成需求B3:游戲參與者最多允許猜6次需求B4:若游戲參與者猜測(cè)價(jià)格比實(shí)際價(jià)格高,則程序提示“高”;若猜測(cè)價(jià)格比實(shí)際價(jià)格低,提示“低”用戶(hù)補(bǔ)充需求需求F:需要定義游戲初始化過(guò)程,未來(lái)有可能通過(guò)它調(diào)整游戲難度,程序必須為此提供接口概要設(shè)計(jì)響應(yīng)需求A、E、F將游戲劃分為四個(gè)模塊:歡迎信息顯示模塊、游戲初始化模塊、游戲模塊、游戲結(jié)束模塊程序架構(gòu):主文件“main.c”,程序主體函數(shù)庫(kù)“guess.h”與“guess.c”;此外需要使用zylib與zyrandom庫(kù)設(shè)計(jì)函數(shù)原型勝率信息需要從游戲模塊傳遞給游戲結(jié)束模塊voidPrintWelcomeInfo();voidInitializeGame();doublePlayGame();voidPrintGameOverInfo(doubleprevailed_ratio);guess.h#ifndef__EG0507GUESS__#define__EG0507GUESS__voidPrintWelcomeInfo();voidInitializeGame();doublePlayGame();voidPrintGameOverInfo(doubleprevailed_ratio);#endifmain.c#ifndef__EG0507GUESS__#include"guess.h"#endifintmain(){doubleprevailed_ratio;PrintWelcomeInfo();InitializeGame();prevailed_ratio=PlayGame();PrintGameOverInfo(prevailed_ratio);return0;}概要設(shè)計(jì)響應(yīng)需求C使用無(wú)限循環(huán)作為游戲模塊的主架構(gòu):初始化游戲回合,進(jìn)行游戲回合,判斷游戲參與者是否開(kāi)始新游戲回合響應(yīng)需求B2每一回合需要隨機(jī)生成物品價(jià)格,應(yīng)在游戲回合初始化階段完成抽象出單獨(dú)的游戲回合初始化函數(shù),返回值為初始化的物品價(jià)格(整數(shù)類(lèi)型)intInitializeBout();響應(yīng)需求D游戲參與者的回合數(shù)與獲勝回合數(shù):使用整數(shù)類(lèi)型保存,游戲開(kāi)始時(shí)初始化為0,并隨著游戲進(jìn)程變化概要設(shè)計(jì)游戲回合活動(dòng)分析將每一回合游戲抽象成函數(shù),函數(shù)返回值為BOOL,表示該游戲回合游戲參與者是否獲勝BOOLPlayBout();判斷用戶(hù)是否進(jìn)入下一回合BOOLAgain();Again函數(shù)負(fù)責(zé)在PlayGame函數(shù)中充當(dāng)哨兵,在返回值為FALSE時(shí)退出游戲響應(yīng)需求B1、B3:數(shù)據(jù)初始化工作constintlowest_price=100;constinthighest_price=200;constintguesstimate_count=6;詳細(xì)設(shè)計(jì)響應(yīng)需求B4:細(xì)化PlayBout在給定猜測(cè)次數(shù)內(nèi)接受游戲參與者的輸入價(jià)格,判斷與實(shí)際價(jià)格是否相同,如果不同則給出提示信息,如果相同則恭喜游戲參與者獲勝但是……需求G:一旦游戲參與者給出了猜測(cè)價(jià)格,當(dāng)該價(jià)格或高或低時(shí),提示游戲參與者的信息應(yīng)能夠相應(yīng)縮小價(jià)格區(qū)間以反映此變化響應(yīng)需求G:修改PlayBout函數(shù),添加參數(shù)BOOLPlayBout(intactual_price,intlower_price,inthigher_price,intchances_left);詳細(xì)設(shè)計(jì)歡迎信息模塊設(shè)計(jì)要求:將游戲性質(zhì)與游戲方法告訴游戲參與者,系統(tǒng)應(yīng)盡可能輸出詳細(xì)信息,例如物品最低價(jià)格、最高價(jià)格與猜測(cè)次數(shù)都應(yīng)通知游戲參與者偽代碼voidPrintWelcomeInfo(){

輸出程序性質(zhì)信息物品最低價(jià)格、最高價(jià)格與猜測(cè)次數(shù)一并輸出}詳細(xì)設(shè)計(jì)游戲初始化模塊設(shè)計(jì)要求:不知道偽代碼voidInitializeGame(){}詳細(xì)設(shè)計(jì)游戲結(jié)束模塊設(shè)計(jì)要求:如果能夠在游戲結(jié)束模塊不僅輸出游戲參與者勝率,還針對(duì)其勝率高低輸出不同鼓勵(lì)信息就好了需求H:當(dāng)游戲參與者勝率超過(guò)75%(含)時(shí),輸出“Youluckyyyyyyyyyyyyy!”;當(dāng)勝率低于75%但超過(guò)50%(含)時(shí),輸出“Sogooooooood.”;其他輸出“Youcandoitbetter.Wishyouluck.”偽代碼voidPrintGameOverInfo(doubleprevailed_ratio){

輸出百分制勝率根據(jù)勝率分別輸出不同信息}詳細(xì)設(shè)計(jì)游戲模塊細(xì)化偽代碼doublePlayGame(){while(TRUE){

調(diào)用InitializeBout獲得實(shí)際價(jià)格調(diào)用PlayBout啟動(dòng)游戲回合如果游戲回合結(jié)束后結(jié)果為T(mén)RUE,遞增獲勝回合數(shù)遞增總回合數(shù)調(diào)用Again,若結(jié)果為FALSE,終止游戲,否則繼續(xù)

}

返回最終勝率}詳細(xì)設(shè)計(jì)游戲回合初始化與游戲初始化模塊細(xì)化偽代碼intInitializeBout(){

調(diào)用GenerateRandomNumber函數(shù)

并返回其結(jié)果}voidInitializeGame(){

調(diào)用Randomize函數(shù)啟動(dòng)隨機(jī)數(shù)發(fā)生器}詳細(xì)設(shè)計(jì)游戲回合模塊細(xì)化需求I:如果游戲參與者給出的猜測(cè)價(jià)格不在當(dāng)時(shí)價(jià)格范圍內(nèi),應(yīng)提醒用戶(hù)重新提供新價(jià)格,此次操作不應(yīng)遞減用戶(hù)猜測(cè)次數(shù),以防止用戶(hù)輸入錯(cuò)誤,也就是說(shuō),需要檢查猜測(cè)價(jià)格的合法性需求J:當(dāng)最后一次機(jī)會(huì)也未猜中價(jià)格時(shí),不需要再輸出提示價(jià)格高低信息,直接輸出用戶(hù)本回合失敗信息,并將實(shí)際價(jià)格告訴用戶(hù)詳細(xì)設(shè)計(jì)BOOLPlayBout(intactual_price,intlower_price,inthigher_price,intchances_left){while(還有猜測(cè)機(jī)會(huì)){

獲得游戲參與者猜測(cè)價(jià)格,檢查游戲參與者猜測(cè)價(jià)格是否在給定范圍遞減游戲參與者猜測(cè)機(jī)會(huì)判斷猜測(cè)價(jià)格高低

switch(判斷結(jié)果){case高了:if(還有猜測(cè)機(jī)會(huì)){輸出價(jià)格高了信息,降低最高價(jià)格值,縮小猜測(cè)區(qū)間}else{輸出失敗信息與物品實(shí)際價(jià)格,結(jié)束函數(shù),返回本回合失敗值FALSE}break;

case低了:if(還有猜測(cè)機(jī)會(huì)){輸出價(jià)格低了信息,增大最低價(jià)格值,縮小猜測(cè)區(qū)間}else{輸出失敗信息與物品實(shí)際價(jià)格,結(jié)束函數(shù),返回本回合失敗值FALSE}break;

default:

輸出游戲參與者獲勝信息,結(jié)束函數(shù),返回TRUE}}

程序流程至此,說(shuō)明游戲參與者本回合已失敗,返回FALSE}詳細(xì)設(shè)計(jì)進(jìn)一步細(xì)化游戲回合函數(shù)抽象三個(gè)輔助函數(shù)獲得游戲參與者猜測(cè)價(jià)格:intGetGuesstimatePrice(intlower_price,inthigher_price,intchances_left);檢查游戲參與者猜測(cè)價(jià)格是否在給定范圍:intCheckValidationOfGuesstimatePrice(intlower_price,inthigher_price,intguesstimate_price);判斷猜測(cè)價(jià)格高低:intJudgeGuesstimatePrice(intactual_price,intguesstimate_price);詳細(xì)設(shè)計(jì)intGetGuesstimatePrice(intlower_price,inthigher_price,intchances_left){

輸出提示信息,包括最低價(jià)格,最高價(jià)格與剩余猜測(cè)次數(shù)調(diào)用GetIntegerFromKeyboard獲取猜測(cè)價(jià)格并返回}intCheckValidationOfGuesstimatePrice(intlower_price,inthigher_price,intguesstimate_price){while(猜測(cè)價(jià)格小于最低價(jià)格或高于最高價(jià)格){

通知游戲參與者猜測(cè)價(jià)格超出范圍,提醒用戶(hù)重新輸入新價(jià)格調(diào)用GetIntegerFromKeyboard獲取新猜測(cè)價(jià)格

}

返回新猜測(cè)價(jià)格}intJudgeGuesstimatePrice(intactual_price,intguesstimate_price){

獲得猜測(cè)價(jià)格與實(shí)際價(jià)格之差

if(差值大于0)return1;elseif(差值小于0)return-1;elsereturn0;}詳細(xì)設(shè)計(jì)細(xì)化Again函數(shù)Zylib庫(kù)的字符串比較函數(shù)BOOLIsStringEqual(STRINGs1,STRINGs2)BOOLIsStringEqualWithoutCase(STRINGs1,STRINGs2)偽代碼BOOLAgain(){

詢(xún)問(wèn)游戲參與者是否開(kāi)始新游戲獲取游戲參與者的響應(yīng)調(diào)用!IsStringEqualWithoutCase函數(shù),

判斷游戲參與者的響應(yīng)是否為“n”如果真,返回FALSE,即將上述返回值取反返回}詳細(xì)設(shè)計(jì)編碼實(shí)現(xiàn)#include<stdio.h>#ifndef__ZYLIB__#include"zylib.h"#endif#ifndef__ZYRANDOM__#include"zyrandom.h"#endif#ifndef__EG0507GUESS__#include"guess.h"#endifconstintlowest_price=100;constinthighest_price=200;constintguesstimate_count=6;編碼實(shí)現(xiàn)staticintInitializeBout();staticBOOLPlayBout(intactual_price,intlower_price,inthigher_price,intchances_left);staticBOOLAgain();staticintGetGuesstimatePrice(intlower_price,inthigher_price,intchances_left);staticintCheckValidationOfGuesstimatePrice(intlower_price,inthigher_price,intguesstimate_price);staticintJudgeGuesstimatePrice(intactual_price,intguesstimate_price);編碼實(shí)現(xiàn)voidPrintWelcomeInfo(){printf("Theprogramlistsaproductwithpricebetween%dand"

"%d(RMBYuan).\n",lowest_price,highest_price);printf("Yougiveaguesstimateprice.Ifthepriceyougiveis""correct,youwin.\n");printf("Youhave%dchances.\n",guesstimate_count);printf("Risetothechallengetowinyourbonus...\n");}voidInitializeGame(){inti,n;Randomize();}編碼實(shí)現(xiàn)doublePlayGame(){intactual_price,lower_price=lowest_price,higher_price=highest_price;intchances_left=guesstimate_count;intbout_count=0,prevailed_bout_count=0;while(TRUE){printf("\n");actual_price=InitializeBout();if(PlayBout(actual_price,lower_price,higher_price,chances_left))prevailed_bout_count++;bout_count++;if(!Again())break;}return(double)prevailed_bout_count/(double)bout_count;}編碼實(shí)現(xiàn)voidPrintGameOverInfo(doubleprevailed_ratio){printf("\nprevailedratio:%.2lf%%.\n",prevailed_ratio*100);if(prevailed_ratio>=0.75)printf("Youluckyyyyyyyyyyyyy!\n\n");elseif(prevailed_ratio>=0.50)printf("Sogooooooood.\n\n");elseprintf("Youcandoitbetter.Wishyouluck.\n\n");}staticintInitializeBout(){returnGenerateRandomNumber(lowest_price,highest_price);}編碼實(shí)現(xiàn)staticBOOLPlayBout(intactual_price,intlower_price,inthigher_price,intchances_left){intguesstimate_price;intjudge_result;while(chances_left>0){guesstimate_price=GetGuesstimatePrice(lower_price,higher_price,chances_left);guesstimate_price=CheckValidationOfGuesstimatePrice(lower_price,higher_price,guesstimate_price);chances_left--;judge_result=JudgeGuesstimatePrice(actual_price,guesstimate_price);switch(judge_result){case1:if(chances_left>0){printf("\nHigher.\n");higher_price=guesstimate_price-1;}else{printf("\nYoulosethisbout.Theactualpriceis%d.\n",actual_price);returnFALSE;}break;case-1:if(chances_left>0){printf("\nLower.\n");lower_price=guesstimate_price+1;}else{printf("\nYoulosethisbout.Theactualpriceis%d.\n",actual_price);returnFALSE;}break;default:printf("\nYouwinnnnnnnnnnnnnnnn!\n");returnTRUE;}}returnFALSE;}編碼實(shí)現(xiàn)staticBOOLAgain(){printf("\nPlayanewgame(\"n\"tostop,otherwordstoplayagain)?");return!IsStringEqualWithoutCase(GetStringFromKeyboard(),"n");}staticintGetGuesstimatePrice(intlower_price,inthigher_price,in

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論