第9模块化开发.ppt
《第9模块化开发.ppt》由会员分享,可在线阅读,更多相关《第9模块化开发.ppt(55页珍藏版)》请在三一办公上搜索。
1、第9章 模块化开发,自顶向下的分解模块划分库的设计与实现库的应用,猜硬币的游戏,功能:提供游戏指南;计算机随机产生正反面,让用户猜,报告对错结果。重复此过程,直到用户不想玩了为止。,顶层分解,程序要做两件事:显示程序指南;模拟玩游戏的过程。,main()显示游戏介绍;玩游戏;,主程序的两个步骤是相互独立的两个,没有什么联系,因此可设计成两个函数:void prn_instruction()void play(),int main()prn_instruction();play();return 0;,prn_instruction的实现,prn_instruction函数的实现非常简单,只要一
2、系列的输出语句把程序指南显示一下就可以了,void prn_instruction()cout 这是一个猜硬币正反面的游戏.n;cout 我会扔一个硬币,你来猜.n;cout 如果猜对了,你赢,否则我赢。n;,play函数的实现,Play函数随机产生正反面,让用户猜,报告对错结果,然后询问是否要继续玩,void play()char flag=y;while(flag=Y|flag=y)coin=生成正反面;输入用户的猜测;if(用户猜测=coin)报告本次猜测结果正确;else 报告本次猜测结果错误;,play函数的细化,生成正反面:如果用0表示正面,1表示反面,那么生成正反面就是随机生成0
3、和1两个数 输入用户的猜测。如果不考虑程序的鲁棒性,这个问题也可以直接用一个输入语句即可。但想让程序做得好一点,就必须考虑得全面一些。比如,用户可以不守规则,既不输入0也不输入1,而是输入一个其他值,程序该怎么办?因此这个任务还可以进一步细化,所以再把它抽象成一个函数get_call_from_user。,void play()int coin;char flag=Y;srand(time(NULL);/设置随机数种子 while(flag=Y|flag=y)coin=rand()*2/RAND_MAX;/生成扔硬币的结果 if(get_call_from_user()=coin)cout f
4、lag;,get_call_from_user的实现,该函数接收用户输入的一个整型数。如果输入的数不是0或1,则重新输入,否则返回输入的值,int get_call_from_user()int guess;/0=head,1=tail do cout guess;while(guess!=0,这是一个猜硬币正反面的游戏.我会扔一个硬币,你来猜.如果猜对了,你赢,否则我赢。输入你的选择(0表示正面,1表示反面):1我赢了继续玩吗(Y或y)?y输入你的选择(0表示正面,1表示反面):6输入你的选择(0表示正面,1表示反面):1你赢了继续玩吗(Y或y)?nPress any key to cont
5、inue,运行实例,第9章 模块化开发,自顶向下的分解模块划分库的设计与实现库的应用,模块划分,当程序变得更长的时候,要在一个单独的源文件中处理如此众多的函数会变得困难 把程序再分成几个小的源文件。每个源文件都包含一组相关的函数。一个源文件被称为一个模块。模块划分标准:块内联系尽可能大,块间联系尽可能小,石头、剪刀、布游戏,游戏规则布覆盖石头石头砸坏剪刀剪刀剪碎布 游戏的过程为:游戏者选择出石头、剪子或布,计算机也随机选择一个,输出结果,继续游戏,直到游戏者选择结束为止。在此过程中,游戏者也可以阅读游戏指南或看看当前战况。,第一层的分解,While(用户输入!=quit)switch(用户的选
6、择)case paper,rock,scissor:机器选择;评判结果;报告结果;case game:显示目前的战况;case help:显示帮助信息;default:报告错误;显示战况;,函数抽取,获取用户输入selection_by_player获取机器输入selection_by_machine评判结果compare报告结果并记录结果信息report显示目前战况prn_game_status显示帮助信息prn_help六个函数,枚举类型的定义,为了提高程序的可读性,我们定义两个枚举类型:enum p_r_s paper,rock,scissor,game,help,quit;enum o
7、utcome win,lose,tie,error;,模块划分,分成四个模块:主模块:main函数获取选择的模块:selection_by_player和selection_by_machine比较模块:compare输出模块:report、prn_game_status和prn_help函数,Select模块的设计,selection_by_player从键盘接收用户的输入并返回此输入值。因此,原型为 p_r_s selection_by_player();selection_by_machine函数由机器产生一个石头、剪子、布的值,并返回。因此,原型为 p_r_s selection_by
8、_machine();,Compare模块的设计,compare函数比较用户输入的值和机器产生的值,确定输赢。它要有两个参数,都是p_r_s类型的,它也应该有一个返回值,就是判断的结果。原型为:outcome compare(p_r_s,p_r_s);,print模块的设计,prn_help显示一个用户输入的指南,告诉用户如何输入他的选择。因此,它没有参数也没有返回值。Report函数报告输赢结果,并记录输赢的次数。因此它必须有四个参数:输赢结果、输的次数、赢的次数和平局的次数,但没有返回值。prn_game_status函数报告至今为止的战况,因此需要三个参数:输的次数、赢的次数和平的次数,
9、但没有返回值。,print模块的进一步考虑,输的次数、赢的次数和平局的次数在Report和prn_game_status两个函数中都出现。Report函数修改这些变量的值,prn_game_status函数显示这些变量的值。这三个函数的原型和用户期望的原型不一致,用户不希望原型中有参数。输的次数、赢的次数和平局的次数和其他模块的函数无任何关系,因此可作为该模块的内部状态。内部状态可以作为该模块的全局变量这样report和prn_game_status函数中都不需要这三个参数了。,头文件的设计,为方便起见,我们把所有的符号常量定义、类型定义和函数原型声明写在一个头文件中,让每个模块都includ
10、e这个头文件。那么,每个模块就不必要再写那些函数的原型声明了但这样做又会引起另一个问题,当把这些模块连接起来时,编译器会发现这些类型定义、符号常量和函数原型的声明在程序中反复出现多次,解决方法:需要用到一个新的编译预处理命令:#ifndef 标识符#endif,头文件的格式,#ifndef _name_h#define _name_h 头文件真正需要写的内容#endif,石头、剪子、布游戏的头文件,/文件:p_r_s.h/本文件定义了两个枚举类型,声明了本程序包括的所有函数原型#ifndef P_R_S#define P_R_S#include#include#include using na
11、mespace std;enum p_r_s paper,rock,scissor,game,help,quit;enum outcome win,lose,tie,error;outcome compare(p_r_s player_choice,p_r_s machine_choice);void prn_final_status();void prn_game_status();void prn_help();void report(outcome result);p_r_s selection_by_machine();p_r_s selection_by_player();#endi
12、f,主模块的实现,/文件:main.cpp/石头、剪子、布游戏的主模块#include p_r_s.hint main(void)outcome result;p_r_s player_choice,machine_choice;/seed the random number generator srand(time(NULL);,while(player_choice=selection_by_player()!=quit)switch(player_choice)case paper:case rock:case scissor:machine_choice=selection_by_ma
13、chine();result=compare(player_choice,machine_choice);report(result);break;case game:prn_game_status();break;case help:prn_help();break;default:cout PROGRAMMER ERROR!nn;exit(1);prn_game_status();return 0;,select模块的实现,/文件:select.cpp/包括机器选择selection_by_machine和/玩家选择selection_by_player函数的实现#include p_r_
14、s.hp_r_s selection_by_machine()int select=(rand()*3/(RAND_MAX+1);cout I am;switch(select)case 0:cout paper.;break;case 1:cout rock.;break;case 2:cout scissor.;break;return(p_r_s)select);,p_r_s selection_by_player()char c;p_r_s player_choice;prn_help();/显示输入提示 cout c;switch(c)case p:player_choice=pap
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模块化 开发

链接地址:https://www.31ppt.com/p-5300951.html