结构化程序设计
自顶向下的分解,每个小问题设计为一个函数,公共小问题可以设计成一个库实现阶段
自底向上的实现
程序由3种基本结构组成
顺序
分支
循环
功能
提供游戏指南
计算机随机产生正反面,让用户猜,报告对错结果
重复玩游戏过程,直到用户不想玩了为止
顶层分解
程序要做两件事:显示程序指南;模拟玩游戏的过程。
void prn_instruction(); void play();
prn_instruction()的实现
只要一系列的输出语句把程序指南显示一下就可以了
void prn_instruction() { cout << "这是一个猜硬币正反面的游戏.\n"; cout << "我会扔一个硬币,你来猜.\n"; cout << "如果猜对了,你赢,否则我赢。\n"; }
play()函数的实现
随机产生正反面,让用户猜,报告对错结果,然后询问是否要继续玩
生成正反面:生成0和1两个随机数
输入用户的猜测:抽象成一个函数get_call_from_user。
void play() { char flag = ‘y’; while ( flag == ‘Y’ || flag == ‘y’) { coin = 生成正反面; 输入用户的猜测; if (用户猜测 == coin) 报告本次猜测结果正确; else 报告本次猜测结果错误; 询问是否继续游戏 } }
产生随机数
srand(time(NULL));
coin = rand() * 2 / RAND_MAX;
get_call_from_user()的实现
该函数接收用户输入的一个整型数。如果输入的数不是0或1,则重新输入,否则返回输入的值
int get_call_from_user() { int guess; do { cout << "\n输入你的选择(0表示正面,1表示反面):"; cin >> guess; } while (guess != 0 && guess != 1); return guess; }
枚举类型与头文件
知识点
程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。
石头、剪子、布游戏
要求
游戏规则:布覆盖石头;石头砸坏剪刀;剪刀剪碎布
游戏过程:
游戏者选择出石头、剪子或布
计算机也随机选择一个
输出输赢结果
继续游戏,直到游戏者选择结束为止
在此过程中,游戏者也可以阅读游戏指南或看看当前战况
第一层的分解:函数抽取(获取用户输入;获取机器输入;评判结果 ;报告结果并记录结果信息;显示目前战况;显示帮助信息)
类型定义格式
enum 枚举类型名 {元素表};
石头、剪子、布中的枚举类型
用户输入值的类型:enum p_r_s { paper, rock, scissor, game, help, quit } ;
比较结果类型:enum outcome { win, lose, tie } ;
枚举类型变量的定义
p_r_s select;
枚举类型变量的使用
赋值: select = paper;
比较:paper < rock 比较这两个值的内部表示
枚举类型不能直接输入输出
枚举类型的内部表示
采用编码表示:默认用0代表pape, 1代表rock ,…,5 表示quit
指定编码值
希望从1而不是0开始编号,可以这样定义
enum p_r_s { paper = 1, rock, scissor, game, help, quit } ;
可以从中间某一个开始重新指定,如
enum p_r_s { paper, rock = 5, scissor, game, help, quit } ;
选择题
1.
阅读下面的代码,写出输出结果
#include <bits/stdc++.h> using namespace std; enum fruits { apple, banana, orange, grapes = 4, strawberry, pear }; enum students { math, chemistry, cs, physics, biology }; int main() { fruits a = apple, b = orange, c = strawberry; students d = math, e = physics; cout << (int)a << ' ' << (int)b << endl; cout << ((a == d) ? "Yes" : "No") << endl; cout << ((c <= e) ? "Yes" : "No") << endl; return 0; }
概念
把程序再分成几个小的源文件。每个源文件都包含一组相关的函数
一个源文件被称为一个模块
模块划分标准
同一模块中的函数比较类似
块内联系尽可能大,块间联系尽可能小
案例——石头、剪刀、布游戏
游戏规则
布覆盖石头,石头砸坏剪刀,剪刀剪碎布
游戏的过程
游戏者选择出石头、剪子或布
计算机也随机选择一个
输出输赢结果
继续游戏,直到游戏者选择结束为止
在此过程中,游戏者也可以阅读游戏指南或看看当前战况。
石头、剪子、布中的枚举类型定义
用户输入值的类型:enum p_r_s { paper, rock, scissor, game, help, quit } ;
比较结果类型:enum outcome { win, lose, tie } ;
模块划分
主模块: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();
Compare模块的设计
功能:compare函数比较用户输入的值和机器产生的值,确定输赢
参数:用户输入的值和机器产生的值,都是p_r_s类型的
返回值:判断的结果 , 是outcome类型
原型:outcome compare( p_r_s, p_r_s );
print模块的设计
prn_help
功能:显示一个用户输入的指南,告诉用户如何输入他的选择。它没有参数也没有返回值
原型: void prn_help();
Report
功能:函数报告输赢结果,并记录输赢的次数
参数:输赢结果、输的次数、赢的次数和平局的次数
返回值:无
原型:void report(outcome result);
prn_game_status
功能:报告至今为止的战况
参数:输的次数、赢的次数和平的次数
返回值:无
原型:void prn_game_status();