




已阅读5页,还剩416页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计思想与方法,潘理,什么是计算机科学?,计算机科学并非研究计算机!正如天文学不是研究天文望远镜CS要回答的基本问题:什么是可计算的?对此问题的回答有三种方式:理论分析问题的可解性:无解的,不是能行可解的实际设计一个解决问题的算法通过实验来研究问题.,2,课程主要内容,解决可计算问题需要教会计算机如何解决问题如何教计算机解决问题了解计算机有哪些基本功能因材施教,设计教学的过程一门与计算机进行交流的语言,对本课程的定位,学习计算机科学解决问题的思想方法,应用于其他专业领域不是程序设计语言课程!本课程需要编程,以加深对计算思维的理解坏消息:学习编程语言需要掌握非常繁琐的细节好消息:Python语言非常简单,易学易用也不是算法和数据结构课程!当然会学习这方面的一些基本技术,4,计算机与程序,计算机组成程序设计语言初识Python,计算机的组成,硬件:计算机的躯壳软件:计算机的灵魂,计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、处理、存储和输出的系统,计算机硬件,存储器,保存正在运行的程序代码和数据内存的最小单元是bit,一个bit存储一个二进制位。一般8个bit组成一个byte,若干个byte组成一个word在一般的机器中,内存按字节编址,内存大小也是按字节计量关机后,内存的数据全部丢失,CPU,CPU(CentralProcessingUnit)有两个部件组成:ALUArithmetic-LogicUnit(运算器)Controlunit(控制器),控制器,控制器控制计算机的其余部分如何完成程序的指令指挥内存和其它部件之间的信息的传送(包括信息和指令)指挥CPU和输入输出设备之间的控制信息的传送,控制器中的信息存储,控制器中有两个寄存器:指令寄存器(IR):保存当前正在执行的指令程序计数器(PC):保存下一条要执行的指令地址,控制器的工作,取下一条指令:按PC指定的地址到内存中取出下一条指令,存入IR。解码指令:将指令解码成一系列的控制信号执行指令:将控制信号发送给相关部件,执行相应的运算,运算器的组成,逻辑电路:执行控制器发出的控制信号一组存放正在运算的数据的寄存器,输入输出设备,输入设备将人能理解的符号转换成计算机能处理的符号。常用的输入设备有:键盘、鼠标、光笔等输出设备将计算机的输出转换成人能理解的输出。常用的输出设备有:显示器、打印机、音响设备等,计算机的组成,硬件:计算机的躯壳软件:计算机的灵魂,计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、处理、存储和输出的系统,计算机软件,软件决定了计算机能做什么.没有软件,计算机只是一堆废铁.软件可以分为系统软件和应用软件。系统软件居于计算机系统中最靠硬件的部分,它将计算机的用户与硬件隔离。系统软件与具体的应用无关,但其他的软件要通过系统软件才能发挥作用。常用的系统软件有操作系统、编译器、网络软件等。应用软件是为了支持某一应用而开发的软件。如字处理软件、财务软件等。,计算机与程序,计算机组成程序设计语言初识Python,程序设计语言,人与计算机进行交流的一种语言为什么不用自然语言与计算机交互?精确的语法和语义无二义性有不同层次的程序设计语言,LuChaojun,SJTU,18,不同层次的程序设计语言,机器语言汇编语言高级语言,机器语言,是机器的母语。每种计算机都有自己的机器语言。与计算机硬件设计有关。每个语句用一组二进制数表示用机器语言写程序是非常困难的,读机器语言写的程序也是非常困难的机器语言提供的功能非常简单,汇编语言,用缩写和助记符代替机器语言的0和1的比特串和机器语言一样,不同类的机器有不同的汇编语言汇编程序:将汇编语言写的程序翻译成机器语言的程序解决了机器语言的可读性问题,但没有解决功能简单的问题以及可移植型问题,高级语言,类似于英语的语言,适合于人理解功能比机器语言强,解决问题更加容易编译器:将过程化语言写的程序(源代码)翻译成机器语言的程序(目标代码)解释器:逐句解释源程序并执行,不保存目标代码。,编译执行,将程序全部翻译成机器语言的程序,然后再执行。,解释执行,高级语言的特点,具备了一定的机器独立性,使用户可以专注于解决问题的方法。但某些方面还是受到机器的限制为了解决移植性问题,ANSI制订了一系列的标准,高级语言,本课程采用Python语言高级程序设计语言有很多种,据说2008年网上被引用最多的10个语言是(按字母顺序):C,C+,C#,Java,JavaScript,Perl,PHP,Python,Ruby,SQL,26,计算机与程序,计算机组成程序设计语言初识Python,Python,Python采用编译/解释混合方式:先编译成字节码,再解释执行启动Python,28,Python2.7.1(r271:86832,Nov272010,18:30:46)MSCv.150032bit(Intel)onwin32Typecopyright,creditsorlicense()formoreinformation.,初识Python,:提示符,提示你可以输入命令语句:一条命令,如print“hello”串:“helloworld”数:3、10表达式:3+5赋值:x=5,29,函数,函数:将完成某一功能的语句组合起来函数定义函数调用:,defarea():x=5y=6printx*y,area()30,带参数的函数,函数定义函数的调用,defarea(x,y):printx*y,area(3,4)12area(2,4)8,模块,如果一段程序需要反复执行,可以把它以文件形式保存在外存储器中。保存在外存储器中的程序称为一个模块,也称为脚本文件或源文件。PYTHON的源文件的后缀名为py程序模拟物理现象:chaos程序,#File:chaos.py#Asimpleprogramillustratingchaoticbehavior.defmain():printThisprogramillustratesachaoticfunctionx=input(Enteranumberbetween0and1:)foriinrange(10):x=3.9*x*(1-x)printxinput(Enter0toquit)main(),main函数:标志程序的开始,也可以省略注释变量与赋值程序的执行:一个个语句顺序执行,但也可以重复执行某个语句,for循环,将一段语句重复执行多次语法forin:是一个值的序列,如1,3,5,7,9或range(10)(即0,1,9).可以是任何语句序列,用左缩进标识.,35,程序的控制流,程序的诸语句通常是顺序执行的,但循环语句改变了控制流,表示一种控制结构.控制流可以用流程图直观表达,36,模块的执行,在IDLE中执行程序打开文件:在file菜单下选open或直接用右键点击文件,并选择用IDLE打开执行:在run菜单下选runmodule或直接按f5Cmd界面中执行程序import文件,添加python的路径,Import时,系统必须知道到哪里去找那个文件这是通过PYTHONPATH指定的安装PYTHON时,系统会指定缺省path。缺省的路径是:Python26Libsite-packages添加搜索路径右键单击我的电脑,然后单击属性。单击高级选项卡。单击环境变量。单击新建添加一个新变量名和值。,END,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,程序设计需要系统化的方法,程序设计是用精确的语言告诉计算机该做什么,要精确到最细节处.计算机只会做很简单的事情,只能刻板地执行程序.一方面要写大型程序,一方面要精确到细枝末节,这极具挑战性.细节上的微小差错可带来巨大灾难.例如1996年阿丽亚娜5火箭首次鉴定发射失败的原因是将一个浮点数转换为整数的代码有问题.,41,软件开发过程,需求分析:问题是什么?制定程序规格:程序要做什么?对简单程序描述输入输出即可.设计:程序怎么做?主要任务是设计出满足规格的算法一般用伪代码给出总体结构,不纠缠细节.实现:用某种程序设计语言翻译设计.测试与排错:测试程序是否如预期,排除bug.维护:运行中还会不断有问题.,42,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,温度转换,需求:预报摄氏度,想知道对应华氏度.规格:输入摄氏度,显示输出华氏度.两者对应关系是F=(9/5)C+32.设计算法:简单的IPO实现:翻译成Python程序测试:常用边界数据.如输入0,100,44,算法设计,将完成任务的步骤分解成计算机能完成的动作伪代码写的算法:输入摄氏度:celsius计算华氏度:fahrenheit=9/5celsius+32显示输出:fahrenheit,45,Python程序,#convert.py#convertCelsiustempstoFahrenheit#by:SuzieProgrammerdefmain():celsius=input(WhatistheCelsiustemperature?)fahrenheit=9.0/5.0*celsius+32printThetemperatureis,fahrenheit,degreesFahrenheit.”main(),写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,程序的构成,各种名字:main、celsius等输入:celsius=input(WhatistheCelsiustemperature?)表达式:9.0/5.0*celsius+32赋值:fahrenheit=9.0/5.0*celsius+32输出:printThetemperatureis,fahrenheit,degreesFahrenheit.”,标识符,标识符:值,变量,函数,模块等的名字.标识符命名规则字母下划线开头,后接字母数字下划线大小写敏感标识符不能是保留词良好编程风格选择有意义的名字:变量名一般是名词短语,函数名一般是动词短语风格统一.,49,表达式,表达式:与数学中类似。如3.9*x*(1x)参加运算的可以是常量、变量运算符:+、-、*、/、*(指数运算)可以用括号改变优先级良好编程风格:用空格、括号增加可读性.,LuChaojun,SJTU,50,输出语句,输出语句print的语法:printprintprint,print,print的语义:自左向右计算表达式的值并在一行上显示,值之间以空格隔开.最后输出换行,但以逗号结尾时不换行.,51,赋值语句,语法=语义:计算表达式的值,存入变量.一个变量可被多次赋值,但总是持有最后一次赋值的结果.,52,输入赋值语句,输入赋值语句=input()语义计算的值(通常是字符串),显示该值等待用户输入一个表达式(以回车键结束)计算用户输入的表达式,得到input()的值把input()的值存入.良好风格用提醒用户输入以空格结束.(Why?),53,同时赋值语句,同时赋值:,.,=,.,语义:计算右边各表达式的值,分别存入左边的对应变量.应用同时赋值交换两个变量传统语言的做法:引入一临时变量Python可以:x,y=y,xinput()也可为多个变量同时赋值x,y=input(“inputx,y”)执行到此语句时用户可输入:3,4,则x=3,y=4,54,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,利息计算,需求:给定本金和利率,计算10年后的本利之和规格:明年的本金之和=今年的本金*(1+利率),算法过程,Python程序,#interest.py#coding=gbkdefmain():print这是一个计算10年后本利之和的程序balance=input(请输入本金:)rate=input(请输入利率:)foriinrange(10):balance=balance*(1+rate)printbalancemain(),END,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,数据类型,程序存储与操作的信息称为数据.数据类型不同的数据表示方式不同的操作,61,数值数据类型,整数类型int不带小数点可存储整数的精确值浮点数类型float带小数点计算机只能存储浮点数的近似值type()函数返回值的类型,62,整型数的内部表示,整型数在内部用补码表示正数的补码是它的二进制表示,负数的补码是它的绝对值的二进制的每一位取反后再加1。如用8位表示一个整数,那么:62补=00111110-62补=11000010在补码表示中,最高位是符号。0为正数,1为负数Python中的整数用32位表示,则int范围为2312311,即-21474836482147483647,实型数的表示,定点表示:小数点的位置固定不变浮点表示:小数点位置不固定。一个浮点数分成尾数和阶码两部分。阶码表示小数点在该数中的位数,尾数表示数的有效数值。如十进制数N=246.135,其浮点表示可为:N=246135*10-3=2461350*10-4=0.246135*103=0.0246135*104,浮点数的存储,当字长一定时,分配给阶码的位数越多,表示数的范围越大,但分配给尾数的位数将减少,从而降低数的精度。,数值运算符,66,运算数都是整数,结果为整数;至少有一个运算数是浮点数,结果为浮点数.,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,数学库,其他的数学运算都包含在一个库中库是系统或其他用户已经写好的一些有用的程序。一般一个功能表示为一个函数数学库:支持各类数学计算的函数.数学库的引入:importmath数学库中函数的调用:例如求平方根math.sqrt(),求一元二次方程解,#equation1.pyimportmathdefmain():a,b,c=input(Enterthreecoefficients:)discRoot=math.sqrt(b*b-4*a*c)r1=(-b+discRoot)/(2*a)r2=(-b-discRoot)/(2*a)printThesolutionsare:,r1,r2main(),69,引用数学函数库中的函数,数学库中的常用函数,pi:常数e:常数esqrt(x):平方根sin(x),cos(x),tan(x),asin(x),acos(x),atan(x):三角函数log(x),log10(x):自然对数与常用对数exp(x):e的x次方ceil(x):x的最小整数floor(x):x的最大整数,数值计算,数值数据的类型数学库的使用累积整型数的限制处理大整型类型转换,一种常用算法模式:累积,最终结果是由逐个中间结果累积起来形成的.例如6!的计算:先算6*5,再*4,再*1而得.1+2+3+4+100:先计算1+2,再加3,这种累积程序需要一个存放累积结果的变量,累积过程是一个循环:初始化累积变量循环直至得到最终结果计算累积变量的当前累积值,累积(续),初始化:给累积变量一个合适的初值,以便进入循环后能正确计算.忘记初始化是一个常见编程错误!循环过程:将一个个值累积到累积变量中,阶乘计算程序,具体数(如6)的阶乘fact=1forfin6,5,4,3,2,1:fact=fact*f一般情形n=input(Enteranumber:)fact=1forfinrange(n,1,-1):fact=fact*fprintThefactorialof,n,is,fact,阶乘程序的几点注解,由于乘法结合律,累积的次序是不重要的.如按下面的循环来累积:forfin2,3,4,5,6:forfin2,4,6,1,3,5:forfinrange(2,n+1)range()函数range(n)range(start,n)range(start,n,step)fact也可初始化为n,求1到100的和,sum=0foriinrange(1,101):sum=sum+iprintsum,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,整数的限制,int型在内存占用的空间是有限的,因此能表示的数值范围也是有限的。Python中的整数用32位表示,只能表示-21474836482147483647浮点数同样也有这个问题,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,大数的表示,longint:不定长,可扩至任意长度(当然受限于存储器容量).如5L,1234567890000L注意:5L和5有完全不同的表示有长整数参加的运算,结果为长整数.longint运算效率远低于int,因此能用int就不用longint.浮点数很大时用科学表示法:1.234e+12最大数:1e+308,求阶乘的更好的实现,n=input(Enteranumber:)fact=1Lforfinrange(n,1,-1):fact=fact*fprintThefactorialof,n,“is,fact,阶乘增长很快,结果很容易超出int的范围,现在的Python环境都能自动执行int到大整数的转换。当超出int范围时,自动转换为大整型,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,类型转换,Python只会做同类型的运算,运算结果与运算数类型相同。在混合类型表达式中,Python自动转换:intlongfloat人工转换:利用int(),long(),float()小测验:求整数的平均值时用哪个好?avg=sum/countavg=float(sum)/countavg=float(sum/count)浮点数取整时如何做到四舍五入?int(x+0.5)round(),字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,文本数据,计算机应用从科学计算转向信息管理.信息管理中大量的数据都是文本数据.如姓名,地址,简历等等计算机中用字符串来表示文本数据.,85,字符串类型,字符串:字符序列字符串字面值:用一对引号(单或双)标明.“helloworld”!#$%垂直方向5个刻度($10,000)平分300像素,即70像素为一档.算法精化Drawlabel0.0Kat(20,320)Drawlabel2.5Kat(20,250)Drawlabel5.0Kat(20,180)Drawlabel7.5Kat(20,110)Drawlabel10.0Kat(20,40)用Text函数实现,151,进一步细化(续),确定0号柱子的位置和高度位置:左下角坐标为(20,320)高度:principal*(280/10000),即右上角y坐标为320principal*(280/10000).宽度:故右上角x坐标为20+30=50算法精化0号柱:从(20,320)到(50,320-principal*0.028)画矩形,152,进一步细化(续),其他柱子的位置和高度位置:左下角为(x,320).高度:principal*(280/10000),则右上角y坐标为320principal*(280/10000).宽度:30,故右上角x坐标为(左下角x坐标+30)算法精化foryear从1到10:principal=principal*(1+apr)x=25*year+40height=principal*0.02从(x,230)到(x+25,230-height)画矩形,153,最后的程序(graph),fromgraphicsimport*defmain():win=GraphWin(InvestmentGrowthChart,512,384)Text(Point(20,320),0.0K).draw(win)Text(Point(20,250),2.5K).draw(win)Text(Point(20,180),5.0K).draw(win)Text(Point(20,110),7.5K).draw(win)Text(Point(20,40),10.0K).draw(win)principal=input(enterinitialprincipal:)apr=input(enterinterestrate:),bar=Rectangle(Point(70,320),Point(100,320-principal*0.028)bar.setFill(green)bar.draw(win)x=100foryearinrange(1,11):principal=principal*(1+apr)bar=Rectangle(Point(x,320),Point(x+30,320-principal*0.028)bar.setFill(green)bar.draw(win)x=x+30raw_input(pressanykeytoquit:)win.close()main(),面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,自定义坐标系,默认坐标系以像素为单位,编程很麻烦.坐标变换:实际数据需映射成窗口像素位置.Graphics模块提供自定义坐标系的功能,使坐标变换自动完成.好处编程简单直观改变窗口像素尺寸对程序几乎没影响,157,自定义坐标系,setCoords(左下角的新坐标,左下角的y坐标,右上角的x坐标,右上角的y坐标)Python自动进行新坐标系和像素之间的转换,例子:坐标系变换,例如win=GraphWin(“Tic-Tac-Toe”)win.setCoords(0.0,0.0,3.0,3.0)Line(Point(1,0),Point(1,3).draw(win)Line(Point(2,0),Point(2,3).draw(win)Line(Point(0,1),Point(3,1).draw(win)Line(Point(0,2),Point(3,2).draw(win)新坐标系为:左下角(0,0),右上角(3,3)系统自动把新坐标变换成200*200像素坐标编程实例:柱状图的改进(graph1),LuChaojun,SJTU,159,graph1,将x坐标分为13份,从0到13将y坐标分成6份,从0到6X坐标1-2是当年信息,2-3是一年后的信息,以此类推Y坐标1是0元,2是2.5K元,3是5K元,,fromgraphicsimport*defmain():win=GraphWin(InvestmentGrowthChart,512,384)win.setCoords(0.0,0.0,13.0,6.0)Text(Point(0.5,1),0.0K).draw(win)Text(Point(0.5,2),2.5K).draw(win)Text(Point(0.5,3),5.0K).draw(win)Text(Point(0.5,4),7.5K).draw(win)Text(Point(0.5,5),10.0K).draw(win)principal=input(enterinitialprincipal:)apr=input(enterinterestrate:)bar=Rectangle(Point(1,1),Point(2,1+principal*0.0004)bar.setFill(green)bar.draw(win)foryearinrange(1,11):principal=principal*(1+apr)bar=Rectangle(Point(year+1,1),Point(year+2,1+principal*0.0004)bar.setFill(green)bar.draw(win)raw_input(pressanykeytoquit:)win.close()main(),面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,图形交互界面,GUI:图形元素用于输入输出事件:移动鼠标,点击按钮,选菜单等.也是对象事件发生后,有相应事件处理程序来处理.事件驱动的编程捕获事件处理事件:一段程序,163,捕获鼠标点击,GraphWin类有一个方法getMouse():调用时等待用户点击,并返回点击位置(是个Point对象).例如:win=GraphWin(ClickMe!)foriinrange(10):p=win.getMouse()printYouclicked(%d,%d)%(p.getX(),p.getY(),164,编程实例:triangle.py,设计一个程序,用鼠标在窗口中任意点三个点,将这三个点连成一个三角形。,#Program:triangle.pyfromgraphicsimport*defmain():win=GraphWin(DrawaTriangle)win.setCoords(0.0,0.0,10.0,10.0)message=Text(Point(5,0.5),Clickonthreepoints)message.draw(win)p1=win.getMouse()p1.draw(win)p2=win.getMouse()p2.draw(win)p3=win.getMouse()p3.draw(win)triangle=Polygon(p1,p2,p3)triangle.draw(win)message.setText(Clickanywheretoquit.)win.getMouse()main(),166,图形窗口中的文本输入,Entry对象:提供一个可编辑文本的框Entry(,)方法:setText()和getText()等实例:温度转换GUI版关键语句input=Entry(Point(2,3),5)input.setText(“0.0”)input.draw(win)celsius=eval(input.getText(),167,温度转换GUI版,创建一个名为“华氏到摄氏转换”的窗口显示两个文本框:“华氏温度”和“摄氏温度”设置一个输入框,用于输入华氏温度计算摄氏温度显示摄氏温度输出提示,结束程序,#coding=gbk#Program:fToC.pyfromgraphicsimport*importstringdefmain():win=GraphWin(u华氏到摄氏的转换,300,300)Text(Point(50,50),u华氏温度).draw(win)Text(Point(50,150),u摄氏温度).draw(win)input=Entry(Point(200,50),10)input.setText(“0.0)input.draw(win)output=Text(Point(200,150),)output.draw(win)win.getMouse()fahrenheit=eval(input.getText()celsius=5.0/9*(fahrenheit-32)Text(Point(200,150),str(celsius).draw(win)Text(Point(200,250),Clickanywheretoquit.).draw(win)win.getMouse()win.close()main(),面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,图形模块介绍,graphWin对象图形对象Entry对象,graphWin对象,表示屏幕上的一个窗口创建窗口graphWin关闭窗口close获取点击鼠标的位置getMouse设置坐标系设置背景颜色,图形对象,图形对象有:Point、Line、Circle、Rectangle、Oval、Polygon、Text行为:创建对象、设置图形的位置、设置图形的填充颜色、设置图形的边界颜色等,Entry对象,可编辑的文本框行为:创建文本框设置文本框的内容获取文本框的内容,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,什么是函数?,函数是一种程序构件,是构成大程序的小程序.函数定义:将一组完成某个特定功能的语句组合起来,取一个名字函数调用:通过函数名执行者组语句函数的输入称为参数函数的输出称为返回值我们已经熟悉的函数:自己编的函数,如常用的main()Python内建函数,如abs()Python标准库函数,如math.sqrt()和string.split()对象的方法,如win.close()和p.draw(),176,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,为什么需要函数?,编程更容易把握复杂程序分解成较小部件代码可重用提高开发效率更易维护代码更简洁程序更易理解,178,编程实例:生日歌,用函数减少重复代码defmain():print“Happybirthdaytoyou!”print“Happybirthdaytoyou!”print“Happybirthday,dearFred.”print“Happybirthdaytoyou!”,重复代码的坏处:1.费时费力2.代码维护的一致性,defhappy():printhappybirthdaytoyou!defsingFred():happy()happy()printHappybirthday,dearFred.happy()defmain():singFred()main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数和参数,如果要为tom唱一首数据生日歌,必须另外写一个函数singTomsingTom和singFred的区别在于第三个语句将Tom或Fred写成一个变量,这两个函数变成一个函数。这个变量称为函数的参数,它是函数的输入。,编程实例:生日歌(续),defhappy():printhappybirthdaytoyoudefsing(person):happy()happy()print“appybirthday,dear”,person,.happy()print“defmain():sing(Fred)sing(Lucy)sing(Elmer)main(),参数实例:计算利息,计算利息程序中两处画柱子的代码是类似的循环外的初始柱子循环内的每年的柱子解决方法:定义一个函数defdrawBar(win,year,height):bar=Rectangle(Point(year+1,1),Point(year+2,height)bar.setFill(green)bar.draw(win),184,完整的程序,defmain():win=GraphWin(InvestmentGrowthChart,512,384)win.setCoords(0.0,0.0,14.0,6.0)Text(Point(0.5,1),0.0K).draw(win)Text(Point(0.5,2),2.5K).draw(win)Text(Point(0.5,3),5.0K).draw(win)Text(Point(0.5,4),7.5K).draw(win)Text(Point(0.5,5),10.0K).draw(win)principal=input(enterinitialprincipal:)apr=input(enterinterestrate:)drawBar(win,0,1+principal*0.0004)foryearinrange(1,11):principal=principal*(1+apr)drawBar(win,year,1+principal*0.0004)raw_input(pressanykeytoquit:)win.close()main(),形参和实参,函数定义:defdrawBar(window,year,height)window,year,height成为形式参数,表示函数执行时的输入函数调用:drawBar(win,0,1+principal*0.0004)win,0,1+principal*0.0004称为实际参数,代表某次函数函数执行的输入参数传递:将实际参数赋给形式参数,函数调用过程,函数定义def():函数调用()调用程序暂停函数形参被赋值为实参(按位置对应)执行函数体控制返回调用点的下一条语句,函数调用过程图解,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,带返回值的函数,函数的返回值:函数执行的结果函数与调用者之间的沟通:通过参数从调用者输入值通过返回值向调用者输出值定义def(形参):returnPython遇见return语句时即退出函数,并计算表达式将结果返回给调用者使用x=(),编程实例:factorial,计算n!该函数是一个有参数又有返回值的函数。参数是n,返回值是n!,#coding=gbkdefp(n):x=1foriinrange(1,n+1):x=x*ireturnxdefmain():n=input(“请输入一个整数:)printn,!的值为:,p(n)main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数与程序结构,函数不只是为了减少重复代码.函数还使程序更加模块化(modular).即使增加了代码量!编程实例:计算利率将主程序中并未重复出现的语句序列改写成了一个函数,原地方改成一个函数调用。代码量不减反增,但程序可读性大大增强!,defcreateWin():win=GraphWin(InvestmentGrowthChart,512,384)win.setCoords(0.0,0.0,14.0,6.0)Text(Point(0.5,1),0.0K).draw(win)Text(Point(0.5,2),2.5K).draw(win)Text(Point(0.5,3),5.0K).draw(win)Text(Point(0.5,4),7.5K).draw(win)Text(Point(0.5,5),10.0K).draw(win)returnwin,defmain():win=createWin()principal=input(enterinitialprincipal:)apr=input(enterinterestrate:)drawBar(win,0,1+principal*0.0004)foryearinrange(1,11):principal=principal*(1+apr)drawBar(win,year,1+principal*0.0004)raw_input(pressanykeytoquit:)win.close()main(),END,分支程序设计,前面出现的所有程序的执行过程都是从第一个语句执行到最后一个语句,这称为顺序执行。例如求一元二次方程的解,#equation1.pyimportmathdefmain():a,b,c=input(Enterthreecoefficients:)discRoot=math.sqrt(b*b-4*a*c)r1=(-b+discRoot)/(2*a)r2=(-b-discRoot)/(2*a)printThesolutionsare:,r1,r2main(),当b*b4*a*c,!=数值比较字符串比较:按字典序.复杂条件:布尔表达式.布尔运算符:and,or,not布尔表达式:结果为true/false,205,205,and的定义,and表示“并且”:,206,206,or的定义,or表示“或者”:日常用语中的“或”往往具有互斥的涵义,即二选一.与此处的or有不同!,207,207,not的定义,not表示“否定”:,布尔运算符的优先级,not最高,and次之,or最低思考:aornotbandc何意?最好使用括号!,208,例:判断两点是否位置相同,ifp1.getX()=p2.getX()andp1.getY()=p2.getY():#pointsarethesameelse:#pointsaredifferent,209,解一元二次方程,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*cif(d0):x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),缺点,在b*b4*a*c0时,程序没有任何反应改进:在b*b4*a*c0时,输出一个出错信息,两分支决策,语法if:else:语义若为真,执行,控制转向下一条语句;否则执行,控制转向下一条语句.,212,解一元二次方程,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*cif(d0):printnorootelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),缺陷,当a等0时,程序会异常终止。因为遇到了除数为0的问题在解一元二次方程时增加一个检测条件,检验方程是不是一元二次方程,#coding=gbkimportmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):print不是一元二次方程else:d=b*b-4*a*cif(d0):printnorootelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),单分支程序设计,分支语句的基本格式及应用条件执行,217,217,217,有条件执行程序,回顾:Python模块分为程序/脚本:可直接执行模块最后一行是main(),即启动程序的语句执行方式直接执行Windows下双击模块图标DOS命令行下:python.py在会话或其他程序中import并执行库:不能直接执行模块中没有main()一行被其他程序import但不执行,218,218,218,有条件执行程序(续),混合型模块:既能作为独立程序直接执行,又能作为库被其他程序import而不执行.#myfile.pydefmain():defother():if_name_=_main_:main(),import一个模块时,Python将该模块中的一个特殊变量_name_设置为该模块的名字;直接执行模块时,_name_被设置为_main_,分支程序设计,单分支多分支异常处理,多分支决策,语法if:elif:.elifelse语义:找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。,220,完善一元二次方程,考虑等根的情况,importmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):printinputillegalelse:d=b*b-4*a*cif(d0):printnorootelif(abs(d)0.0000001):x=-b/2/aprintx=,xelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),222,分支程序设计,单分支多分支异常处理,异常处理,为保证程序的正确性,当程序中充斥着许多错误检测代码,使解决问题的算法反而不明显了.例如求一元二次方程的解,就是利用标准的公式。但为了用此公式,必须判断a是否为0,是否小于0。,224,解决办法,异常处理机制:把错误集中在一起处理,以免影响算法的主线条。Python提供try.except.可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰。,例外处理语句,语法try:except:except:.except:.语义:执行。若无错,控制转下一语句;若有错,查找匹配该错误的except子句,找到则执行相应的处理程序,找不到则程序崩溃,系统报错。,226,完善一元二次方程问题,用异常处理语句来捕获math.sqrt的溢出错误try:.exceptValueError:.错误类型:从系统报错信息中可得.如ValueError,TypeError,NameError等,227,importmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):printinputillegalelse:d=b*b-4*a*ctry:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2exceptValueError:printnorootmain(),改进版2,将a等于0的判断也作为异常,是程序更加简洁,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*ctry:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2exceptValueError:printnorootexceptZeroDivisionError:printinputerrormain(),END,循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,233,233,233,for循环:回顾,语法forin:语义:循环标志变量var取遍序列sequenc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024安徽警官职业学院单招《英语》考前冲刺练习题带答案详解(研优卷)
- 2025年执业药师之《西药学专业二》练习题库包附答案详解(预热题)
- 中信银行江门市鹤山市2025秋招数据分析师笔试题及答案
- 兴业银行济南市槐荫区2025秋招笔试专业知识题专练及答案
- 民生银行桂林市七星区2025秋招笔试创新题型专练及答案
- 2025重庆市巴南区惠民街道社区卫生服务中心招聘1人笔试备考试题带答案详解
- 浦发银行兰州市皋兰县2025秋招笔试性格测试题专练及答案
- 浙江金华永康市环境卫生管理处工作人员招聘笔试高频难、易错点备考题库及参考答案详解一套
- 2025年云南西双版纳州招聘事业单位工作人员362人笔试备考题库含答案详解
- 2025年酒、饮料及精制茶制造人员考试黑钻押题附答案详解【预热题】
- 职高课件模板
- 【生物】第四节 激素调节课件-2025-2026学年人教版生物八年级上册
- 卫生院安全生产培训课件
- 物流紧急事件应急预案方案
- 期中专题复习-词汇句型训练-2025-2026学年 译林版2024 英语八年级上册 原卷
- 2025年全国中小学校科普知识竞赛题库(+答案)
- 2.2创新永无止境教学课件 2025-2026学年度九年级上册 道德与法治 统编版
- 矿山爆破作业安全培训课件
- 2025-2026学年九年级英语上学期第一次月考 (四川成都专用) 2025-2026学年九年级英语上学期第一次月考 (四川成都专用)解析卷
- 高陡边坡稳定性控制技术及其工程实践
- 2025年智能焊接机器人产业发展蓝皮书-GGII高工咨询
评论
0/150
提交评论