《python数据处理的流程控制课件.ppt》由会员分享,可在线阅读,更多相关《python数据处理的流程控制课件.ppt(96页珍藏版)》请在三一办公上搜索。
1、第二次上机总结1,1、以file的形式写代码,交互式的界面只适合于单语句代码的测试2、file文件中以函数为单位写代码,方便调用以实现代码重用3、inport语句放在程序的开头,即程序总注释后面,第一个函数前面,1,第二次上机总结11、以file的形式写代码,交互式的界面只适,第二次上机总结2,提高课堂效率了解每次课的主要内容,2,第二次上机总结2提高课堂效率2,第3章,数据处理的流程控制,第3章数据处理的流程控制,计算机程序根据语句的顺序依次向下执行。,# convert.py# A program to convert Celsius temps to Fahrenheitdef main
2、(): celsius = input(What is the .”) fahrenheit = 9.0 / 5.0 * celsius + 32 print The temperature is, fahren.main(),计算机程序根据语句的顺序依次向下执行。# conve,流程图:用标准化的图形符号来表示程序步骤,流程图:用标准化的图形符号来表示程序步骤,但这种顺序执行显然是不够的,我们会要求某个功能重复执行,也会要求根据不同的前提条件执行不同的功能,所以引入了另两种控制结构分支和循环,但这种顺序执行显然是不够的,,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计
3、,1 单分支结构2 二分支结构3 多分支结构,3.2 分支结构1 单分支结构,(一)温度转换的例子(eg3_1.py),# convert.py# A program to convert Celsius temps to Fahrenheitdef main(): celsius = input(What is the .”) fahrenheit = 9.0 / 5.0 * celsius + 32 print The temperature is, fahren.main(),(一)温度转换的例子(eg3_1.py)# convert.,(一)温度转换的例子,希望他可以根据不同的温度给出
4、不同的提示。If fahrenheit 90 print a hot warningIf fahrenheit 30 print a cold warning,(一)温度转换的例子希望他可以根据不同的温度给出不同的提示。,(一)温度转换的例子:流程图,(一)温度转换的例子:流程图,(一)温度转换的例子改进版,# convert2.pydef main(): celsius = input(What is the .? ) fahrenheit = 9.0 / 5.0 * celsius + 32 print The temperature is, fahrenheit,. if fahrenh
5、eit 90: print Its really hot out there, . if fahrenheit 30: print Brrrrr. Be sure to dress warmlymain(),单分支语句,(一)温度转换的例子改进版# convert2.py单分支语,(二)用于执行决策的if语句,语法:if :(if fahrenheit 90:) next 语义:先判断条件表达式(condition)true, 执行语句体(body),再转向下一个语句false, 忽略语句体(body),直接转向下一个语句语句体(body):一个或多个语句 在:后面缩进显示,body中的各语句
6、缩进对齐,(二)用于执行决策的if语句语法:if condition,(三)条件表达式的格式,简单条件表达式(condition):比较两个表达式 (a+2 =, , !=数值比较:整型数的比较,实型数的比较字符串比较: 按字典序。字母序由编码(ASCII等)决定. 如:大写字母在小写字母前.称为布尔表达式结果为true/false,1/0,Relation operation(关系运算符),(三)条件表达式的格式简单条件表达式(condition):,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,1 单分支结构2 二分支结构3 多分支结构,3.2 分支结构1 单分支
7、结构,求一元二次方程的例子(ver1.0),# quadratic.py import mathdef main(): print This program finds the real . a, b, c = input(Please enter. (a, b, c): ) discRoot = math.sqrt(b * b - 4 * a * c) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print The solutions are:, root1, root2 main(),求一元二次方程
8、的例子(ver1.0)# quadratic.,This program finds the real solutions to a quadraticPlease enter the coefficients (a, b, c): 1,1,2Traceback (most recent call last): File C:Documents and SettingsTerryMy DocumentsTeachingW04CS 120Textbookcodechapter3quadratic.py, line 21, in -toplevel- main() File C:Documents
9、 and SettingsTerryMy DocumentsTeachingW04CS 120Textbookcodechapter3quadratic.py, line 14, in main discRoot = math.sqrt(b * b - 4 * a * c)ValueError: math domain error,ver1.0的运行,引入决策分支结构,This program finds the real so,# quadratic2.py,当discrim=0时才有解import math def main(): print This program finds the
10、real solutions .n a, b, c = input(Please enter the . (a, b, c): ) discrim = b * b - 4 * a * c if discrim = 0: discRoot = math.sqrt(discrim) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print nThe solutions are:, root1, root2main(),求一元二次方程的例子(ver2.0),# quadratic2.py,当discrim=0时
11、才有,ver2.0的运行结果,This program finds the real solutions to a quadraticPlease enter the coefficients (a, b, c): 1,1,1,discRoot0时,没有任何执行语句就结束了,应该给出提示,ver2.0的运行结果 This program fin,# quadratic2.py的改良import math def main(): print This program finds the real solutions .n a, b, c = input(Please enter the . (a
12、, b, c): ) discrim = b * b - 4 * a * c if discrim = 0: discRoot = math.sqrt(discrim) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print nThe solutions are:, root1, root2 if discRoot 0: print “The equation has no real roots!” main(),求一元二次方程的例子(ver2.0+),该程序两个if语句的流程图?,做了基于同一个值的两
13、次条件表达式的判断,不够高效,# quadratic2.py的改良求一元二次方程的例子(v,二分支结构,二分支结构,二分支结构,语法: if : else: next statements,二分支结构语法:,# quadratic3.py 考虑到负值并会给出提示import math def main(): print This program finds the real solutions .n a, b, c = input(Please enter the . (a, b, c): ) discrim = b * b - 4 * a * c if discrim 0: print nT
14、he equation has no real roots! else: discRoot = math.sqrt(b * b - 4 * a * c) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print nThe solutions are:, root1, root2 main(),求一元二次方程的例子(ver3.0),# quadratic3.py 考虑到负值并会给出提示求一元,This program finds the real solutions to a quadratic Pleas
15、e enter the coefficients (a, b, c): 1,2,1 The solutions are: -1.0 -1.0 该程序还可以改善:同时0三种情况,ver3.0的运行结果,ver3.0的运行结果,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,1 单分支结构2 二分支结构3 多分支结构,3.2 分支结构1 单分支结构,多分支结构,多分支结构,if discrim 0: print Equation has no real rootselse: #大于等于0的情况 if discrim = 0: root = -b / (2 * a) prin
16、t There is a double root at, root else: #大于0的情况 discRoot = math.sqrt(b * b - 4 * a * c) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print nThe solutions are:, root1, root2,if.else的嵌套: if或else后面的语句块可以是ifelse语句,多分支结构的实现1: if.else的嵌套,if discrim 0:if.else的嵌套:多分,教材p121: 第13题,程序设计:
17、 输入百分制的考试分数,输出相应的等级制名称。设A:90-100, B:80-89, C:70-79, D:60-69, F: 60分以下,多层嵌套会导致缩进很多,教材p121: 第13题程序设计: 输入百分制的考试分数,输,多分支结构的实现2: elif,语法: if : elif : elif : else: ,语义: 找到第一个为真的条件表达式并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。,多分支结构的实现2: elif语法:语义:,# quadratic4.py 同时考虑三种情况import math def main(): print
18、This program finds the real solutions .n a, b, c = input(Please enter the . (a, b, c): ) discrim = b * b - 4 * a * c if discrim 0: print nThe equation has no real roots! elif discrim = 0: root = -b / (2 * a) print nThere is a double root at, root else: discRoot = math.sqrt(b * b - 4 * a * c) root1 =
19、 (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print nThe solutions are:, root1, root2,求一元二次方程的例子(ver4.0),# quadratic4.py 同时考虑三种情况求一元二次方,教材p121: 第13题,程序设计: 输入百分制的考试分数,输出相应的等级制名称。设A:90-100, B:80-89, C:70-79, D:60-69, F: 60分以下,教材p121: 第13题程序设计: 输入百分制的考试分数,输,Boolean操作符,有时候简单的bool表达式还不够用an
20、d、or、not 等去组合多个布尔表达式 and or not ,Boolean操作符有时候简单的bool表达式还不够,布尔操作结果,我们可以用布尔操作符任意地组合各种布尔表达式。最终的结果还是T或F。,布尔操作结果PQP and QP or Qnot PTTTT,Boolean操作符,a or not b and c 是T还是F(a,b,c皆为T)?操作符的优先级: not and or上述表达式等价于(a or (not b) and c)在记不住优先级的时候,加小括号确定优先级,Boolean操作符a or not b and c 是T还,写Bool表达式的例子: 模拟racquetba
21、ll的结束,两个人比赛,得分记为scoreA,scoreB,没分出胜负之前循环比赛,直到有一人胜出。循环的退出表达式怎么写?先得15分者胜(1)有一位得15分的表示 scoreA = 15 or scoreB = 15(2)满足上述条件的时候停止,否则继续比赛 while not(scoreA = 15 or scoreB = 15): # continue playing,只要满足一个条件就要退出取not的时候就是没退出,继续游戏,写Bool表达式的例子: 模拟racquet,例:模拟racquetball的结束,先得15分或7:0者胜while not(a = 15 or b = 15 o
22、r (a = 7 and b = 0) or (b = 7 and a = 0))必须有一方大于15并且至少要多2分才胜while not(a = 15 and a - b = 2) or (b = 15 and b - a = 2),例:模拟racquetball的结束先得15分或7:0者胜,Boolean代数,对布尔表达式的要求: 能写:将实际问题所涉及的条件表达成布尔表达式 能计算:能对布尔表达式进行演算和推导布尔表达式也能进行代数计算(布尔逻辑),Boolean代数对布尔表达式的要求:,Boolean代数,and has properties similar to *or has pr
23、operties similar to +0 and 1 correspond to false and true, respectively.,Boolean代数and has properties si,Boolean代数,任何数 or true,其结果肯定为true:a or true = trueand和or服从分配律:a or (b and c) = (a or b) and (a or c)a and (b or c) = (a and b) or (a and c)双重否定就是肯定:not(not a) = a摩根定律:not(a or b) = (not a) and (not
24、 b)not(a and b) = (not a) or (not b),Boolean代数任何数 or true,其结果肯定为tru,Python对布尔值和布尔运算的处理很灵活可扩展阅读 中文教材2.4.4 Python中真假的表示与计算,Python对布尔值和布尔运算的处理很灵活,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,3.2 分支结构,quadratic.py程序会产生很多问题quadratic2-4.py利用决策分支避免了其中的开方为负数时的运行错误在其他很多程序里,也经常用决策分支结构保护程序,避免出现虽然几率很小但还是不可避免会发生的错误。,quad
25、ratic.py程序会产生很多问题,# quadratic.py import mathdef main(): print This program finds the real . a, b, c = input(Please enter. (a, b, c): ) if a=0: #非二次方程 handler1 if type(a)!=int or type(b)!=int or type(c)!=int: #输入类型错误 handler2 discRoot = math.sqrt(b * b - 4 * a * c) if discRoot0: handler3 root1 = (-b
26、+ discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print The solutions are:, root1, root2 main()raw_input(),当程序中充斥着这样的错误检测代码时,解决问题的算法反而不明显了。,是不是可以把程序的主干留着,错误处理代码提出来放到专门的地方,# quadratic.py 当程序中充斥着这样的 是不,异常处理机制,异常处理机制把错误集中在一起处理,以免影响算法的主线条。Python提供try.except.可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰。,异常处理机制,异常处
27、理语句,语法:try: except : except : .except: nextstatement,语义: 执行。 若无错,控制转下一语句; 若有错,查找匹配该错误的except子句,找到则执行相应的处理程序,找不到则程序崩溃,系统报错。,异常处理语句语法:,编程实例:完善quadratic.py,用异常处理语句来捕获math.sqrt的溢出错误(quadratic5.py)try:.except ValueError:.错误类型:从系统报错信息中可得。如ValueError, TypeError, NameError等,编程实例:完善quadratic.py用异常处理语句来捕获m,Tr
28、aceback (most recent call last): File C:Documents and SettingsTerryMy DocumentsTeachingW04CS120Textbookcodechapter3quadratic.py, line 21, in -toplevel- main() File C:Documents and SettingsTerryMy DocumentsTeachingW04CS 120Textbookcodechapter3quadratic.py, line 14, in main discRoot = math.sqrt(b * b
29、- 4 * a * c)ValueError: math domain error,Traceback (most recent call la,# quadratic5.pyimport mathdef main(): print This program finds the real solutions.n a, b, c = input(Please enter the .(a, b, c): ) try: discRoot = math.sqrt(b * b - 4 * a * c) root1 = (-b + discRoot) / (2 * a) root2 = (-b - dis
30、cRoot) / (2 * a) print nThe solutions are:, root1, root2 except ValueError: print nNo real roots“ except ZeroDivisionError: print “input error, a cannot be zero.main(),求一元二次方程的例子(ver5.0),将a等于0的判断也作为异常,使程序更加简洁,# quadratic5.py求一元二次方程的例子(ver5,运行程序ver5.0: This program finds the real solutions to a quadr
31、aticPlease enter the coefficients (a, b, c): 1, 1, 1No real roots,运行程序ver5.0:,tryexcept 可以捕捉任何类型的错误,包括内置类型,自定义类型等。对于quadratic program,还会有其他的运行错误,如:输入非数值类型,输入非常量而是变量(NameError),输入无效的数值类型 (TypeError)等。此时可以用一个try语句加多重except来实现。,tryexcept 可以捕捉任何类型的错误,包括内置类型,,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,(1)for 循环
32、: 回顾 (2)while循环(3)常见循环模式 (4)循环的非正常中断,3.2 分支结构(1)for 循环: 回顾,for 循环,语法: for in : 例子:for i in range(100): print i语义:循环索引值var依次取sequence中的值,每循环一次执行一次,for 循环语法:,用for处理序列数据的两种遍历方式, data = Born on:,July,2,2005直接遍历序列 for d in data: print d,通过索引遍历序列 for i in range(len(data): print datai, 可以更灵活地处理序列数据,如 for i
33、 in range(0,len(data),3): .,用for处理序列数据的两种遍历方式 data = ,用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,t0,t1,(1, 2) 1 2(3, 4) 3 4(5, 6) 5 6,123,h e l l o w o r l d,用for处理各种序列数据字符串(1, 2) 1 21h e,假设我们要求一组数的均值为了实现程序的通用性,必须使得该程序能
34、够求任意个数的平均值程序特点:不要求记录每个值,只要求平均值,所以我们可以只记录加和值。,for 循环例子,假设我们要求一组数的均值for 循环例子,# average1.py# A program to average a set of numbersdef main(): n = input(How many numbers do you have? ) sum = 0.0 for i in range(n): x = input(Enter a number ) sum = sum + x print nThe average is, sum / n,for 循环,累积计算:(1)初始值
35、的设定(2)循环计算,更新,# average1.pyfor 循环累积计算:,How many numbers do you have? 5Enter a number 32Enter a number 45Enter a number 34Enter a number 76Enter a number 45The average of the numbers is 46.4,How many numbers do you have?,average1.py的缺点:需要用户输入n,不适合事先不知道n的场合不知道n则不能用确定的计数循环for不确定的条件循环:while,average1.py的
36、缺点:需要用户输入n,不适合事先不知,上机课上交的作业问题:,1、没交作业: 9156 9168 9172 9192 9194 9196 9205 92162、存成了txt文件(9169,9175)3、没写成函数的形式(9197,9211)4、输出格式:%,上机课上交的作业问题:1、没交作业:,上机课上交的作业问题:,59,%的应用 print i , ” $”+str(%0.2f“ % principal) print i , “ $%0.2f“ % principal,上机课上交的作业问题:59%的应用,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,(1)for
37、循环: 回顾 (2)while循环(3)常见循环模式 (4)循环的非正常中断,3.2 分支结构(1)for 循环: 回顾,语法:while : nextstatement语义: 只要条件成立就反复执行循环体; 当条件不成立则执行下一条语句。,不确定循环:while,语法:不确定循环:while,while : 条件表达式(condition)是一个bool型的表达式。语句体(body)是一句或多句语句,多句语句时缩进对齐。每次循环时,先检查条件表达式,为真时执行body,为假时略过body执行while后的语句,循环终止。,不确定循环:while,while : 不确,while循环的特点,循
38、环前测试条件若不满足,则循环体一次都不执行循环体影响下一次条件测试否则导致无穷循环,条件,循环体,yes,no,while循环的特点循环前测试条件条件循环体yesno,例如:要依次打印110这10个数:for loop:for i in range(1,11): print iwhile loop:i = 1while i = 10: print i i = i + 1,while循环的特点,两者有什么区别?,(1)while需要对循环变量i进行初始化,而for循环的循环变量是自动处理的,(2)while语句相对简单,但循环体一定要影响下一次条件测试,试想,如果没有 i=i+1 这条语句,会发
39、生什么事情?,i一直为0,陷入死循环,例如:要依次打印110这10个数:while循环的特点两者,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,(1)for 循环: 回顾 (2)while循环(3)常见循环模式 (4)循环的非正常中断,(一)交互式循环 (二)哨兵循环(三)后测试循环(四)嵌套循环,3.2 分支结构(1)for 循环: 回顾 (一)交互式,根据用户交互来决定是否循环下去求和例子(eg3_10.py):用户不断输入数据,程序得到数据后不断累加,最后算出输入数据的总和伪代码: 设置一个循环控制变量(moredata=yes/no) while (mored
40、ata为yes): 获得用户输入的数据 处理该数据 询问用户是否还要输入数据,即更新moredata的值,(一)交互式循环,根据用户交互来决定是否循环下去(一)交互式循环,#交互式循环的codesum = 0 #累积值赋初值moredata = “yes“ #循环控制变量赋初值while (moredata0 = “y ” or moredata0 = “Y“): x = input(Input a number: ) sum = sum + x moredata = raw_input(More?(yes/no)print The sum is, sum,(一)交互式循环,#交互式循环的co
41、de(一)交互式循环,运行eg3_10.py,Input a number: 32More?(yes/no) yInput a number: 40More?(yes/no) yInput a number: 50More?(yes/no) yInput a number: 45More?(yes/no) nThe sum is 167,优点:用户不用事先输入n缺点:用户会被没完没了的“y”的输入烦死,改进:设置一个特殊数据值作为终止循环的信号。,运行eg3_10.pyInput a number: 32优,(二)哨兵循环(Sentinel Loops),A sentinel loop 就是一
42、直循环干事直到碰到一个特殊值。这个特殊值被称为哨兵(sentinel)。这个哨兵必须能很明确地和其它输入值分开。算法模式:前导输入while 该数据不是哨兵: 处理该数据 循环尾输入(下一个数据),(二)哨兵循环(Sentinel Loops)A senti,哨兵循环例(1),正常数据是非负数,则可以-1作为哨兵: eg3_11.pysum = 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,
43、 sum,哨兵循环例(1)正常数据是非负数,则可以-1作为哨兵: eg,哨兵循环例(2),正常数据是任何实数,则可以空串作为哨兵: eg3_12.pysum = 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,哨兵循环例(2)正常数据是任何实数,则可以空串作为哨兵: e,(三)后测试循环,输入验证问题:检查用户输入是否符合要求,不符合就要求用户重新输入,直至符合为
44、止。这是一种后测试循环:执行循环体后才测试条件循环体至少执行一次直至条件成立才退出循环有些语言提供repeatuntil语句Python可用while实现只需确保首次进入while时条件成立x = 1while x 0: .,(三)后测试循环输入验证问题:,例如,假设程序要求用户输入一个正数,则用下面代码片段可检查输入合法性:x=-1while x 0: x=input(“please input a positive number: ”),例如,假设程序要求用户输入一个正数,则用下面代码片段可检查输,(四) 嵌套循环(Nested Loops),分支结构能够嵌套,循环结构也能嵌套一个循环语句
45、体内可以是循环语句。如果序列的成员本身又是序列,就需要嵌套循环来处理。数学中向量是一维序列,矩阵是二维序列,(四) 嵌套循环(Nested Loops)分支结构能够嵌套,(四) 嵌套循环(Nested Loops),用嵌套循环遍历矩阵元素:a = 11,12,21,22,31,32sum = 0for i in a: for j in i: sum = sum + jprint sum,sum = 0for i in a: for j in i: sum = sum + j print sum,sum = 0for i in a: for j in i: sum = sum + j print
46、 sum,(四) 嵌套循环(Nested Loops)用嵌套循环遍历矩,嵌套循环例,打印乘法口诀表关键是输出的排列 for i in range(1,10): for j in range(1,i+1): print %dx%d=%-2d % (j,i,j*i), print1x1=11x2=2 2x2=41x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=161x5=5 2x5=10 3x5=15 4x5=20 5x5=251x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=361x7=7 2x7=14 3x7=21 4x7=28 5x7
47、=35 6x7=42 7x7=491x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=641x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81,嵌套循环例打印乘法口诀表,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,(1)for 循环: 回顾 (2)while循环(3)常见循环模式 (4)循环的非正常中断,3.2 分支结构(1)for 循环: 回顾,正常的循环总是按“从头到尾再回到头”的方式进行,但是很多编程语言都提供了特定条件下打破正常循环方式的
48、语句,便于解决问题。Python: break 和 continue,循环的非正常中断,正常的循环总是按“从头到尾再回到头”的方式进行,但是,循环非正常中断: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,语义:
49、中止本轮循环,控制转移到所处循环语句的开头“继续”下一轮循环。例:对列表中的奇数求和a = 23,28,39,44,50,67,99sum = 0for i in a: if a % 2 = 0: continue sum = sum + iprint sum,for i in range(10): print 烦 if i 4: continue,for i in range(10): if i 4: continue print 烦,循环非正常中断:continue语义:中止本轮循环,控制转移,for i in range(10): if i=4: break print 烦,for i
50、in range(10): if i = 4: continue print 烦,烦烦烦烦,烦烦烦烦烦烦烦烦烦,for i in range(10):for i in ra,3.2 分支结构3.3 异常处理3.4 循环结构3.5 结构化程序设计,3.2 分支结构,程序设计的发展,早期:手工作坊式程序规模小,功能简单要在有限内存中尽快完成计算凭借程序员的个人编程技巧后来:作为工程来开发程序规模大,功能复杂内存和速度不是问题,软件可靠性和开发效率变得突出依靠系统化的开发方法和工具,程序设计的发展早期:手工作坊式,程序开发的周期,Step1、需求分析: 我们要解决什么问题?分析的越仔细越好。Step