null数据处理的
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
控制数据处理的流程控制循环控制结构为什么需要循环?Lu Chaojun, SJTU *Lu Chaojun, SJTU **为什么需要循环?有时需要重复做相同或相似的事情,程序中如何
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达?
例如:在屏幕上显示1~5
print 1
print 2
print 3
print 4
print 5
繁琐且不具有扩展性(显示1~10000怎么办?)
循环:用很少的语句表达重复执行的很多语句.for循环Lu Chaojun, SJTU *Lu Chaojun, SJTU **for循环语法
for <循环控制变量> in <序列>:
<循环体>
语义:令<循环控制变量>取遍<序列>中的每个值,并对变量所取的每个值执行一遍循环体.
例如:
for i in [1,2,3,4,5]:
print i
显示1~10000:用[1,2,...,10000]显然不合适,可以用range()for循环的流程图Lu Chaojun, SJTU *Lu Chaojun, SJTU **for循环的流程图for语句中序列的作用for语句中序列的作用计数器:序列只是用来控制循环的次数.
for i in range(10):
print "烦"
循环体不引用循环变量.
数据:序列本身是循环体处理的数据.
for i in range(10):
print i*i
循环体引用循环变量.
两种遍历方式(见下一片)Lu Chaojun, SJTU *用for处理序列数据用for处理序列数据直接遍历序列
>>> data = ['Born on:','July',2,2005]
>>> for d in data:
print d,
通过索引遍历序列
>>> data = ['Born on:','July',2,2005]
>>> for i in range(len(data)):
print data[i],
可以更灵活地处理序列数据,如
>>> for i in range(0,len(data),3): ...Lu Chaojun, SJTU *用for处理各种序列数据用for处理各种序列数据字符串
>>> for c in "hello world":
print c
元组
>>> for i in (1,2,3):
print i
嵌套序列:如元组的列表
>>> for t in [(1,2),(3,4),(5,6)]:
print t,t[0],t[1] Lu Chaojun, SJTU *while循环Lu Chaojun, SJTU *Lu Chaojun, SJTU *while循环for主要用于确定次数的循环
不确定次数的循环:while
while <布尔表达式>:
<循环体>Lu Chaojun, SJTU while循环的特点Lu Chaojun, SJTU *Lu Chaojun, SJTU **while循环的特点循环前测试条件
若不满足,则循环体一次都不执行
循环体必须影响下一次条件测试!
否则导致无穷循环
例如:for循环改写成while循环
i = 0
while i < 10:
print i
i = i + 1
若忘了最后一条语句会怎样?常用循环模式:交互循环常用循环模式:交互循环根据用户交互来决定是否循环下去
例:求和(eg3_10.py)
sum = 0
moredata = "yes"
while moredata[0] == "y":
x = input("Input a number: ")
sum = sum + x
moredata = raw_input("More?(yes/no)")
print "The sum is", sum Lu Chaojun, SJTU *常用循环模式:哨兵循环常用循环模式:哨兵循环交互循环不断要用户输入moredata,很烦人.
改进:设置一个特殊数据值(称为哨兵)作为终止循环的信号.
对哨兵唯一的要求就是能与普通数据区分
算法模式:
前导输入
while 该数据不是哨兵:
处理该数据
循环尾输入(下一个数据)Lu Chaojun, SJTU *哨兵循环例(1)哨兵循环例(1)正常数据是非负数,则可以-1作为哨兵: eg3_11.py
sum = 0
x = input("Input a number (-1 to quit): ")
while x >= 0:
sum = sum + x
x = input("Input a number (-1 to quit): ")
print "The sum is", sum Lu Chaojun, SJTU *哨兵循环例(2)哨兵循环例(2)正常数据是任何实数,则可以空串作为哨兵: eg3_12.py
sum = 0
x = raw_input("Input a number (
to quit): ")
while x != "":
sum = sum + eval(x)
x = raw_input("Input a number ( to quit): ")
print "The sum is", sum Lu Chaojun, SJTU *常用循环模式:后测试循环常用循环模式:后测试循环输入验证问题:
检查用户输入是否符合要求,不符合就要求用户重新输入,直至符合为止.
这是一种后测试循环:
执行循环体后才测试条件
循环体至少执行一次
直至条件成立才退出循环
有些语言提供repeat…until语句
Python可用while实现
只需确保首次进入while时条件成立
x = 1
while x < 0: ...Lu Chaojun, SJTU *常用循环模式:while计数器循环常用循环模式:while计数器循环用while实现计数器循环
计数器count置为0
while count < n:
处理代码
count = count + 1Lu Chaojun, SJTU *i = 0
while i<10:
print i
i = i+1i = 10
while i>0:
print i
i = i-1循环非正常中断:break循环非正常中断:break中止本轮循环,结束break所处循环语句.
常与while True形式的无穷循环配合使用
例1:输入合法性检查
while True:
x = input("请输入非负数:")
if x >= 0: break
例2:break也可以跳出for循环
for i in range(10):
print "烦"
if i > 4: break
慎用break!尤其是一个循环体中有多个break.循环非正常中断:continue循环非正常中断:continue中止本轮循环,控制转移到所处循环语句的开头"继续"下一轮循环.
例:对列表中的奇数求和
a = [23,28,39,44,50,67,99]
sum = 0
for i in a:
if a % 2 == 0:
continue
sum = sum + i
print sum常用循环模式:嵌套循环常用循环模式:嵌套循环一个循环的循环体中有另一个循环.
如果序列的成员本身又是序列,就需要嵌套循环来处理.
数学中向量是一维序列,矩阵是二维序列
用嵌套循环遍历矩阵元素:
a = [[11,12,13,14],[21,22,23,24],[31,32,33,34]]
sum = 0
for i in a:
for j in i:
sum = sum + j
print sum嵌套循环例嵌套循环例打印乘法口诀表
关键是输出的排列
>>> for i in range(1,10):
for j in range(1,i+1):
print "%dx%d=%-2d" % (j,i,j*i),
print
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 程序设计的发展程序设计的发展早期:手工作坊式
程序规模小,功能简单
要在有限内存中尽快完成计算
凭借程序员的个人编程技巧
后来:作为工程来开发
程序规模大,功能复杂
内存和速度不是问题,软件正确性和开发效率变得突出
依靠系统化的开发方法和工具程序开发周期程序开发周期明确需求:问题是什么?用户要求是什么?
制定程序规格:描述“做什么”.
设计程序逻辑:描述“怎么做”.
实现:用编程语言编写代码.
测试与排错:用样本数据执行程序,测试结果是否与预期吻合.有错则排错.
维护:根据用户需求持续改进程序.什么是好的程序什么是好的程序解决同一个问题,可以设计出多种处理过程,即编制多种程序.
即使各种程序都正确,仍然有好坏之分.
除了正确性,好的程序应该是:
效率高
易理解
易维护
可扩展如何得到好的程序如何得到好的程序手工作坊阶段靠的是个人编程技巧
如今则依靠程序设计方法和工具
方法:结构化方法,模块化方法,面向对象方法等
工具:建模工具,集成开发环境,项目管理工具等
结构化程序设计(1)结构化程序设计(1)确保程序具有良好的文本结构, 使程序易理解,易验证,易维护.
基本原则
只使用顺序,分支,循环三种基本控制结构
goto有害
好在goto不是必须的
break和continue有点类似goto,因此要慎用结构化程序设计(2)结构化程序设计(2)单入口单出口的程序块
多条语句可以组合成程序块,只要是单入口单出口,仍然可当作一条语句.编程案例:求最大值(1)编程案例:求最大值(1)先考虑求三个数x1,x2,x3的最大值的问题
策略1:每个数都与其他数比较大小
if x1 >= x2 and x1 >= x3:
max = x1
elif x2 >= x1 and x2 >= x3:
max = x2
else:
max = x3
此算法中各分支彼此独立.但实际上一个分支的信息对其他分支是有用的!
此算法不适合较大n的情况Lu Chaojun, SJTU *编程案例:求最大值(2)编程案例:求最大值(2)策略2:判定树
if x1 >= x2:
if x1 >= x3:
max = x1
else:
max = x3
else:
if x2 >= x3:
max = x2
else:
max = x3Lu Chaojun, SJTU *好处:只需两次比较,效率高.
坏处:结构复杂, 复杂度随n爆炸
式增长.编程案例:求最大值(3)编程案例:求最大值(3)策略3:顺序处理,记录当前最大值.
max = x1
if x2 >= max:
max = x2
if x3 >= max:
max = x3
效率高
易读易理解
可扩展到nLu Chaojun, SJTU *n = input("How many numbers? ")
max = input("Input a number: ")
for i in range(n-1):
x = input("Input a number: ")
if x > max:
max = x
print "max =", max 编程案例:求最大值(4)编程案例:求最大值(4)策略4:利用现成代码.
Python提供内建函数max(x1, x2, ... , xn)
>>> x1,x2,x3 = input("enter 3 numbers:")
>>> print "max =", max(x1,x2,x3)Lu Chaojun, SJTU *小结小结给定问题,有多种解决方法
不要只凭第一感匆忙编程,要多考虑是否有更好算法;
首先要正确,其次要结构清晰,高效,可扩展,漂亮.
问自己会如何解决问题
追求一般性
借鉴,重用现成算法Lu Chaojun, SJTU *EndLu Chaojun, SJTU *Lu Chaojun, SJTU *End