第9模块化开发教程文件

上传人:yulij****0329 文档编号:138584272 上传时间:2020-07-16 格式:PPT 页数:55 大小:338KB
返回 下载 相关 举报
第9模块化开发教程文件_第1页
第1页 / 共55页
第9模块化开发教程文件_第2页
第2页 / 共55页
第9模块化开发教程文件_第3页
第3页 / 共55页
第9模块化开发教程文件_第4页
第4页 / 共55页
第9模块化开发教程文件_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《第9模块化开发教程文件》由会员分享,可在线阅读,更多相关《第9模块化开发教程文件(55页珍藏版)》请在金锄头文库上搜索。

1、第9章 模块化开发,自顶向下的分解 模块划分 库的设计与实现 库的应用,猜硬币的游戏,功能: 提供游戏指南; 计算机随机产生正反面,让用户猜,报告对错结果。 重复此过程,直到用户不想玩了为止。,顶层分解,程序要做两件事:显示程序指南;模拟玩游戏的过程。,main( ) 显示游戏介绍; 玩游戏; ,主程序的两个步骤是相互独立的两个,没有什么联系,因此可设计成两个函数: void prn_instruction() void play(),int main() prn_instruction(); play(); return 0; ,play函数的实现,Play函数随机产生正反面,让用户猜,报告

2、对错结果,然后询问是否要继续玩,void play() char flag = y; while (flag = Y | flag = y) coin = 生成正反面; 输入用户的猜测; if (用户猜测 = coin) 报告本次猜测结果正确; else 报告本次猜测结果错误; ,play函数的细化,生成正反面:如果用0表示正面,1表示反面,那么生成正反面就是随机生成0和1两个数 输入用户的猜测。如果不考虑程序的鲁棒性,这个问题也可以直接用一个输入语句即可。但想让程序做得好一点,就必须考虑得全面一些。比如,用户可以不守规则,既不输入0也不输入1,而是输入一个其他值,程序该怎么办?因此这个任务还

3、可以进一步细化,所以再把它抽象成一个函数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 flag; ,get_call_from_user的实现,该函数接收用户输入的一个整型数。如果输入的数不是0或1,则重新输入,否则返回输入的值,int get_call_from_u

4、ser() 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)?n Press any key to continue,运行实例,第9章 模块化开发,自顶向下的分解 模块划分 库的设计与实现 库的应用,模块划分,当程序变得更长的时候,要在一个单

5、独的源文件中处理如此众多的函数会变得困难 把程序再分成几个小的源文件。每个源文件都包含一组相关的函数。一个源文件被称为一个模块。 模块划分标准:块内联系尽可能大,块间联系尽可能小,石头、剪刀、布游戏,游戏规则 布覆盖石头 石头砸坏剪刀 剪刀剪碎布 游戏的过程为:游戏者选择出石头、剪子或布,计算机也随机选择一个,输出结果,继续游戏,直到游戏者选择结束为止。在此过程中,游戏者也可以阅读游戏指南或看看当前战况。,第一层的分解,While (用户输入 != quit) switch(用户的选择) case paper, rock, scissor: 机器选择; 评判结果; 报告结果; case gam

6、e: 显示目前的战况; 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 outcome win, lose, tie, error

7、;,模块划分,分成四个模块: 主模块: 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_machine();,Comp

8、are模块的设计,compare函数比较用户输入的值和机器产生的值,确定输赢。 它要有两个参数,都是p_r_s类型的,它也应该有一个返回值,就是判断的结果 。 原型为:outcome compare(p_r_s, p_r_s);,print模块的设计,prn_help显示一个用户输入的指南,告诉用户如何输入他的选择。因此,它没有参数也没有返回值。 Report函数报告输赢结果,并记录输赢的次数。因此它必须有四个参数:输赢结果、输的次数、赢的次数和平局的次数,但没有返回值。 prn_game_status函数报告至今为止的战况,因此需要三个参数:输的次数、赢的次数和平的次数,但没有返回值。,pr

9、int模块的进一步考虑,输的次数、赢的次数和平局的次数在Report和prn_game_status两个函数中都出现。 Report函数修改这些变量的值,prn_game_status函数显示这些变量的值。 这三个函数的原型和用户期望的原型不一致,用户不希望原型中有参数。 输的次数、赢的次数和平局的次数和其他模块的函数无任何关系,因此可作为该模块的内部状态。 内部状态可以作为该模块的全局变量 这样report和prn_game_status函数中都不需要这三个参数了。,头文件的设计,为方便起见,我们把所有的符号常量定义、类型定义和函数原型声明写在一个头文件中,让每个模块都include这个头文

10、件。 那么,每个模块就不必要再写那些函数的原型声明了 但这样做又会引起另一个问题,当把这些模块连接起来时,编译器会发现这些类型定义、符号常量和函数原型的声明在程序中反复出现多次, 解决方法:需要用到一个新的编译预处理命令: #ifndef 标识符 #endif,头文件的格式,#ifndef _name_h #define _name_h 头文件真正需要写的内容 #endif,石头、剪子、布游戏的头文件,/ 文件:p_r_s.h / 本文件定义了两个枚举类型,声明了本程序包括的所有函数原型 #ifndef P_R_S #define P_R_S #include #include #includ

11、e using namespace 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

12、_s selection_by_player(); #endif,主模块的实现,/文件:main.cpp / 石头、剪子、布游戏的主模块 #include p_r_s.h int 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 r

13、ock: case scissor: machine_choice = selection_by_machine(); 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

14、/包括机器选择selection_by_machine和 /玩家选择selection_by_player函数的实现 #include p_r_s.h p_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 sele

15、ction_by_player() char c; p_r_s player_choice; prn_help(); /显示输入提示 cout c; switch(c) case p: player_choice = paper; cout you are paper. ; break; case r: player_choice = rock; cout you are rock. ; break; case s: player_choice = scissor; cout you are scissor. ;break; case g: player_choice = game; brea

16、k; case q: player_choice = quit; break; default : player_choice = help; break; return player_choice; ,Compare模块的实现,/文件:compare.cpp /包括compare函数的实现 #include p_r_s.h outcome compare(p_r_s player_choice, p_r_s machine_choice) outcome result; if (player_choice = machine_choice) return tie; switch(player_choice) case paper:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号