原文地址:https://blog.csdn.net/longteng007/article/details/51227923
第六周 程序设计方法与面向对象程序设计(OOP)
7.1 程序设计方法
(1)计算思维:计算思维的本质:抽象、自动化
实证思维、逻辑思维、计算思维
程序设计中的计算思维: 理解问题的计算特性
将计算抽象为计算问题
程序设计实现问题的自动求解
计算机通过模拟计算过程提供一般情况下无法获得的信息
【例】体育竞技分析
【IPO】 输入:两个球员的能力值,比赛次数
处理:模拟比赛的过程
输出:球员获胜场次及概率
(2)自顶向下的设计:
基本思想:将算法表达为一系列小问题
为每个小问题设计接口
通过将算法表达为接口关联的多个小问题来细化算法
为每个小问题重复上述过程
【例】体育竞技分析程序的顶层设计
第一阶段:设计基本功能函数,只考虑接口(输入和返回)
第二阶段:分别设计printIntro()、getInputs()
simNGames(n, probA, probB) → 核心
PrintSummary(winsA, winsB)函数的函数体
第三阶段:simNGames()函数继续分解出simOneGame()函数
(3)自底向上的执行: 从底层模块开始一个一个进行测试
小规模:直接运行
中等规模:底层开始逐步上升
大规模:高级软件测试方法
【例】体育竞技分析的测试:从第三阶段开始对函数逐个进行测试
-
程序
7.1
-
# 体育竞技分析程序的设计
-
from random
import *
-
def main():
-
printIntro()
# 输出程序介绍信息
-
probA,probB,n = getInputs()
# 获取输入
-
winsA,winsB = simNGames(n, probA, probB)
# 模拟比赛并计算胜次和胜率
-
PrintSummary(winsA, winsB)
# 输出结果
-
def printIntro():
-
print(
"体育竞技分析程序\n")
-
print(
"本程序用以模拟两个对手之间的胜次及胜率\n")
-
print(
"需要获取用户两个对手的能力系数(0~1)和模拟次数\n")
-
def getInputs():
-
a = eval(input(
"请输入A的能力系数:"))
-
b = eval(input(
"请输入B的能力系数:"))
-
n = eval(input(
"请问您要模拟多少次比赛?:"))
-
return a,b,n
-
def simNGames(n, probA, probB):
-
A =
0
-
B =
0
# 胜次
-
for i
in range(n):
-
scoreA,scoreB = simOneGame(probA,probB)
-
if scoreA > scoreB:
-
A = A +
1
-
else:
-
B = B +
1
-
return A,B
-
def simOneGame(probA, probB):
-
A =
0
-
B =
0
-
serving =
"A"
# 发球方
-
while
not gameOver(A,B):
# 判断是否达到15场比赛结束
-
if serving ==
"A":
-
if random() < probA:
-
A = A +
1
-
else:
-
serving =
"B"
-
else:
-
if random() < probB:
-
B = B +
1
-
else:
-
serving =
"A"
-
return A,B
-
def gameOver(A,B):
-
return A ==
15
or B ==
15
-
def PrintSummary(winsA, winsB):
-
n = winsA + winsB
-
print(
'模拟次数:%d'%n)
-
print(
'选手A的胜次:{0}({1:0.1%})'.format(winsA,winsA/n))
-
print(
'选手B的胜次:{0}({1:0.1%})'.format(winsB,winsB/n))
-
if __name__ ==
'__main__':
-
main()
【运行结果】
体育竞技分析程序
本程序用以模拟两个对手之间的胜次及胜率
需要获取用户两个对手的能力系数(0~1)和模拟次数
请输入A的能力系数:0.65
请输入B的能力系数:0.6
请问您要模拟多少次比赛?:3000
模拟次数:3000
选手A的胜次:2027(67.6%)
选手B的胜次:973(32.4%)
7.2 软件开发方法
常见的软件开发模式:瀑布模式、螺旋模式、快速原型模式
喷泉模式、混合模式、敏捷开发模式
(1)瀑布模式:
(2)螺旋模式:
(3)敏捷开发模式: 以人为核心、迭代、循序渐进
多个相互联系、独立运行的小项目
软件一直处于可使用的状态
优点: 自底向上、逐步有序、遵循软件客观规律
迭代增量开发、能提高开发效率
典型过程: [1]产品形成共识
[2]建立和维护产品需求列表进行优先级排序
[3]筛选需求进入本轮迭代开发
[4]细化需求,完成本轮开发
[5]每日站立会议
(任务看板:未完成、正在做、已完成的工作状态)
[6]现场验收和反馈
[7]从第三步进行下一轮迭代
7.3 面向对象程序设计(OOP)
对象包含两种特征:状态和行为
类:某种类型集合的描述,如:人类
属性:类本身的特性,如:姓名、身高、体重
方法:类所能实现的行为,如:吃饭、走路、睡觉等方法
步骤:① 根据功能,抽象业务对象
② 构建独立的业务模块,利用封装,继承,多态等抽象业务需求
③ 编写程序
④ 以对象为单位输入参数,开展测试
类的定义:
classclassname[(父类名)]:
[成员函数及成员变量]
_init_构造函数:初始化对象
_del_析构函数:销毁对象
【例】学生成绩计算
【说明】学生评估:学分和平均绩点GPA,GPA计算以4分为准则,如:
3学分课程,学生得“A”,量分数为3*4=12,找到最高者
程序7.3
-
# 找到GPA最高的学生
-
class Student:
-
def __init__(self, name, hours, qpoints):
-
self.name = name
-
self.hours = float(hours)
-
self.qpoints = float(qpoints)
-
def getName(self):
-
return self.name
-
def getHours(self):
-
return self.hours
-
def getQPoints(self):
-
return self.qpoints
-
def gpa(self):
-
return self.qpoints/self.hours
-
def makeStudent(infoStr):
-
name, hours, qpoints =infoStr.split(
"\t")
-
return Student(name, hours, qpoints)
-
def main():
-
# 打开输入文件
-
filename = input(
"Enter name the gradefile: ")
-
infile = open(filename,
'r')
-
# 设置文件中第一个学生的记录为best
-
best = makeStudent(infile.readline())
-
# 处理文件剩余行数据
-
for line
in infile:
-
# 将每一行数据转换为一个记录
-
s = makeStudent(line)
-
# 如果该学生是目前GPA最高的,则记录下来
-
if s.gpa() > best.gpa():
-
best = s
-
infile.close()
-
# 打印GPA成绩最高的学生信息
-
print(
"The best student is:", best.getName())
-
print(
"hours:", best.getHours())
-
print(
"GPA:", best.gpa())
-
if __name__ ==
'__main__':
-
main()
【运行结果】
Enter name thegrade file: students.dat
The best studentis: Li Si
hours: 100.0
GPA: 4.0
7.4 面向对象的特点
(1)封装: 抽象对象,打包数据和操作。
对象的实现与使用独立,支持代码复用。
(2)多态: 对象怎么回应消息,用同一函数名启用不同的方法,具有较高灵活性。
例:图形对象列表,列表包括Circle,Rectangle, Polygon
使用相同的代码,画出列表中所有图形:
forobj in objects:
obj.draw(win)
(3)继承: 一个类可以借用另一个类的行为,可避免操作重复,提高代码复用性。
例:员工信息系统:类Employee → SalariedEmployee 子类
homeAddress()方法 ↘ HourlyEmployee