一、自顶向下和自底向上
1、自顶向下
解决复杂问题的有效方法
- 将一个总问题表达为若干个小问题组成的形式
- 使用同样方法进一步分解小问题
- 直至,小问题可以用计算机简单明了的解决
2、自底向上(执行)
逐步组建复杂系统的有效测试方法
- 分单元测试,逐步组装
- 按照自顶向下相反的路径操作
- 直至,系统各部分以组装的思路都经过测试和验证
二、"体育竞技分析"实例讲解
1、程序总体框架及步骤
- 步骤1:打印程序的介绍性信息 - printInfo()
- 步骤2:获得程序运行参数:proA, proB, n - getInputs()
- 步骤3:利用球员A和B的能力值,模拟n局比赛 - simNGames()
- 步骤4:输出球员A和B获胜比赛的场次及概率 - printSummary()
第一阶段:程序总体框架及步骤
def main():#主函数
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
def printIntro():#游戏说明
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():#信息输入
a = eval(input("请输入选手A的能力值(0-1): "))
b = eval(input("请输入选手B的能力值(0-1): "))
n = eval(input("模拟比赛的场次: "))
return a, b, n
第二阶段:步骤3 模拟N局比赛
def simNGames(n, probA, probB):#模拟N局比赛,通过N次调用1局比赛来完成
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
第三阶段 根据分数判断局的结束
def simOneGame(probA, probB):#模拟1局比赛的胜负情况
scoreA, scoreB = 0, 0
serving = "A"#表示选手A先发球
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:#通过A能力与随机数的比较,来判断是否得分
scoreA += 1
else:
serving="B"#A没得分,则B发球,且进入下一轮
else:
if random() < probB:
scoreB += 1
else:
serving="A"
return scoreA, scoreB
def gameOver(a,b):#有一方得分达到15分,则游戏结束
return a==15 or b==15#注意这里返回的不是15!,而是true 或 false
pass
运行结果:
注意:别忘了在程序开头和结尾分别引用库和主函数哦
from random import random