程序设计思想与方法_第1页
程序设计思想与方法_第2页
程序设计思想与方法_第3页
程序设计思想与方法_第4页
程序设计思想与方法_第5页
已阅读5页,还剩478页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计思想与方法翁惠玉Email: hyweng weng-hy教材参考教材教材很遗憾,暂无合适的中文版教材目前使用: Python Programming: An Introduction to Computer Science. (电子版)How to Think Like a Computer ScientistLearning with Python.(电子版)什么是计算机科学?计算机科学并非研究计算机!正如天文学不是研究天文望远镜CS要回答的基本问题:什么是可计算的?对此问题的回答有三种方式:实际设计一个解决问题的算法理论分析问题的可解性:无解的,不是能行可解的通过实验来研究问题.

2、3课程主要内容解决可计算问题需要教会计算机如何解决问题如何教计算机解决问题了解计算机有哪些基本功能因材施教,设计教学的过程一门与计算机进行交流的语言对本课程的定位学习计算机科学解决问题的思想方法, 应用于其他专业领域不是程序设计语言课程!本课程需要编程,以加深对计算思维的理解坏消息:学习编程语言需要掌握非常繁琐的细节好消息:Python语言非常简单,易学易用也不是算法和数据结构课程!当然会学习这方面的一些基本技术5计算机与程序计算机组成程序设计语言初识Python计算机的组成硬件:计算机的躯壳软件:计算机的灵魂计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、

3、处理、存储和输出的系统计算机硬件存储器输入设备输出设备控制器运算器CPU存储器保存正在运行的程序代码和数据内存的最小单元是bit,一个bit存储一个二进制位。一般8个bit组成一个byte,若干个byte组成一个word在一般的机器中,内存按字节编址,内存大小也是按字节计量关机后,内存的数据全部丢失CPUCPU (Central Processing Unit) 有两个部件组成:ALU Arithmetic-Logic Unit(运算器)Control unit (控制器)控制器控制器控制计算机的其余部分如何完成程序的指令指挥内存和其它部件之间的信息的传送(包括信息和指令)指挥CPU和输入输出

4、设备之间的控制信息的传送控制器中的信息存储控制器中有两个寄存器:指令寄存器( IR ):保存当前正在执行的指令程序计数器 ( PC ):保存下一条要执行的指令地址控制器的工作取下一条指令:按PC指定的地址到内存中取出下一条指令,存入IR。解码指令:将指令解码成一系列的控制信号执行指令:将控制信号发送给相关部件,执行相应的运算运算器的组成逻辑电路:执行控制器发出的控制信号一组存放正在运算的数据的寄存器输入输出设备输入设备将人能理解的符号转换成计算机能处理的符号。常用的输入设备有:键盘、鼠标、光笔等输出设备将计算机的输出转换成人能理解的输出。常用的输出设备有:显示器、打印机、音响设备等计算机的组成

5、硬件:计算机的躯壳软件:计算机的灵魂计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、处理、存储和输出的系统计算机软件软件决定了计算机能做什么.没有软件,计算机只是一堆废铁.软件可以分为系统软件和应用软件。系统软件居于计算机系统中最靠硬件的部分,它将计算机的用户与硬件隔离。系统软件与具体的应用无关,但其他的软件要通过系统软件才能发挥作用。常用的系统软件有操作系统、编译器、网络软件等。应用软件是为了支持某一应用而开发的软件。如字处理软件、财务软件等。计算机与程序计算机组成程序设计语言初识Python程序设计语言人与计算机进行交流的一种语言为什么不用自然语言与计算

6、机交互?精确的语法和语义无二义性有不同层次的程序设计语言Lu Chaojun, SJTU 19不同层次的程序设计语言机器语言汇编语言高级语言机器语言是机器的母语。每种计算机都有自己的机器语言。与计算机硬件设计有关。每个语句用一组二进制数表示用机器语言写程序是非常困难的,读机器语言写的程序也是非常困难的机器语言提供的功能非常简单汇编语言用缩写和助记符代替机器语言的0和1的比特串和机器语言一样,不同类的机器有不同的汇编语言汇编程序:将汇编语言写的程序翻译成机器语言的程序解决了机器语言的可读性问题,但没有解决功能简单的问题以及可移植型问题高级语言类似于英语的语言,适合于人理解功能比机器语言强,解决问

7、题更加容易编译器:将过程化语言写的程序(源代码)翻译成机器语言的程序(目标代码)解释器:逐句解释源程序并执行,不保存目标代码。编译执行main() int i, s;i=1;s=0;C compiler0110001011101001Source programObject program将程序全部翻译成机器语言的程序,然后再执行。解释执行源程序 解释系统(逐句解释、执行)原始数据结果高级语言的特点具备了一定的机器独立性,使用户可以专注于解决问题的方法。但某些方面还是受到机器的限制为了解决移植性问题,ANSI制订了一系列的标准高级语言本课程采用Python语言高级程序设计语言有很多种,据说20

8、08年网上被引用最多的10个语言是(按字母顺序): C,C+,C#,Java,JavaScript,Perl, PHP,Python,Ruby,SQL27计算机与程序计算机组成程序设计语言初识PythonPythonPython采用编译/解释混合方式:先编译成字节码,再解释执行Python 软件: ftp:/ 用户码/密码:hyweng/public启动Python29初识Python:提示符,提示你可以输入命令语句:一条命令,如print “hello”串:“hello world”数:3、10表达式:3 + 5赋值:x = 530函数函数:将完成某一功能的语句组合起来函数定义函数调用: d

9、ef area( ): x = 5 y = 6 print x * y area( )30带参数的函数函数定义 函数的调用 def area(x, y): print x * y area(3, 4)12area(2, 4)8模块如果一段程序需要反复执行,可以把它以文件形式保存在外存储器中。保存在外存储器中的程序称为一个模块,也称为脚本文件或源文件。PYTHON的源文件的后缀名为py程序模拟物理现象:chaos程序# File: chaos.py# A simple program illustrating chaotic behavior.def main(): print This pro

10、gram illustrates a chaotic function x = input(Enter a number between 0 and 1: ) for i in range(10): x = 3.9 * x * (1 - x) print x input(Enter 0 to quit )main()main函数:标志程序的开始,也可以省略注释变量与赋值程序的执行:一个个语句顺序执行,但也可以重复执行某个语句for循环将一段语句重复执行多次语法for in : 是一个值的序列,如1,3,5,7,9或range(10)(即0,1,9).可以是任何语句序列,用左缩进标识.36程序的

11、控制流程序的诸语句通常是顺序执行的,但循环语句改变了控制流,表示一种控制结构.控制流可以用流程图直观表达37取的下一个值无有保存文件用任何一个文本编辑器,保存成纯文本格式在IDLE中的file菜单中选择new window,输入程序的内容。输入结束后再在file菜单中选择save或save as保存到文件中模块的执行在IDLE中执行程序打开文件:在file菜单下选open或直接用右键点击文件,并选择用IDLE打开,或先打开IDLE,再在file菜单下选择open执行:在run菜单下选run module或直接按f5Cmd界面中执行程序import文件添加python的路径Import时,系统必

12、须知道到哪里去找那个文件这是通过PYTHONPATH指定的安装PYTHON时,系统会指定缺省path。缺省的路径是:Python26Libsite-packages添加搜索路径右键单击我的电脑,然后单击属性。 单击高级选项卡。 单击环境变量。 单击新建添加一个新变量名和值。 END写一个简单的程序软件开发过程程序实例:温度转换程序的构件程序实例:利息计算程序设计需要系统化的方法程序设计是用精确的语言告诉计算机该做什么,要精确到最细节处.计算机只会做很简单的事情,只能刻板地执行程序.一方面要写大型程序,一方面要精确到细枝末节,这极具挑战性.细节上的微小差错可带来巨大灾难.例如1996年阿丽亚娜5

13、火箭首次鉴定发射失败的原因是将一个浮点数转换为整数的代码有问题.43软件开发过程需求分析:问题是什么?制定程序规格:程序要做什么?对简单程序描述输入输出即可.设计:程序怎么做?主要任务是设计出满足规格的算法一般用伪代码给出总体结构,不纠缠细节.实现:用某种程序设计语言翻译设计.测试与排错:测试程序是否如预期,排除bug.维护:运行中还会不断有问题.44写一个简单的程序软件开发过程程序实例:温度转换程序的构件程序实例:利息计算温度转换需求:预报摄氏度,想知道对应华氏度.规格:输入摄氏度,显示输出华氏度.两者对应关系是F = ( 9 / 5 ) C + 32.设计算法:简单的IPO实现:翻译成Py

14、thon程序测试:常用边界数据.如输入0, 10046算法设计将完成任务的步骤分解成计算机能完成的动作伪代码写的算法:输入摄氏度:celsius计算华氏度:fahrenheit = 9 / 5 celsius + 32显示输出:fahrenheit47Python程序# convert.py# convert Celsius temps to Fahrenheitdef main():celsius = input(What is the Celsius temperature? )fahrenheit = 9.0 / 5.0 * celsius + 32print The temperatu

15、re is, fahrenheit, degrees Fahrenheit.”main()写一个简单的程序软件开发过程程序实例:温度转换程序的构件程序实例:利息计算程序的构成各种名字:main、 celsius等输入: celsius = input(What is the Celsius temperature? )表达式: 9.0 / 5.0 * celsius + 32赋值: fahrenheit = 9.0 / 5.0 * celsius + 32输出: print The temperature is, fahrenheit, degrees Fahrenheit.”标识符标识符:值

16、,变量,函数,模块等的名字.标识符命名规则字母下划线开头,后接字母数字下划线大小写敏感标识符不能是保留词良好编程风格选择有意义的名字:变量名一般是名词短语,函数名一般是动词短语风格统一.51表达式表达式:与数学中类似。如3.9 * x * (1x)参加运算的可以是常量、变量运算符:+、-、*、/、*(指数运算)可以用括号改变优先级良好编程风格:用空格、括号增加可读性.52输出语句输出语句print的语法:printprint print , , , print , , , ,print的语义:自左向右计算表达式的值并在一行上显示,值之间以空格隔开.最后输出换行,但以逗号结尾时不换行.53赋值语

17、句语法 = 语义: 计算表达式的值,存入变量.一个变量可被多次赋值,但总是持有最后一次赋值的结果.54输入赋值语句输入赋值语句 = input()语义计算的值(通常是字符串),显示该值等待用户输入一个表达式(以回车键结束)计算用户输入的表达式,得到input( )的值把input( )的值存入.良好风格用提醒用户输入以空格结束. (Why?)55同时赋值语句同时赋值: , . , = , . ,语义:计算右边各表达式的值,分别存入左边的对应变量.应用同时赋值交换两个变量传统语言的做法:引入一临时变量Python可以: x, y = y, xinput( )也可为多个变量同时赋值x, y = i

18、nput(“input x, y”)执行到此语句时用户可输入:3,4,则x=3, y=456写一个简单的程序软件开发过程程序实例:温度转换程序的构件程序实例:利息计算利息计算需求:给定本金和利率,计算10年后的本利之和规格:明年的本金之和 = 今年的本金*(1+利率)算法过程Python程序# interest.py# coding = gbkdef main(): print 这是一个计算10年后本利之和的程序 balance = input(请输入本金: ) rate = input(请输入利率: ) for i in range(9): balance = balance * (1 +

19、rate) print balancemain()上机作业修改interest.py,使它能输出每一年的本利之和。例如年份 本利之和= =1 1012 102.2 104.5END数值计算数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换数据类型程序存储与操作的信息称为数据.数据类型不同的数据表示方式不同的操作数值数据类型整数类型int不带小数点可存储整数的精确值浮点数类型float带小数点计算机只能存储浮点数的近似值type( )函数返回值的类型65整型数的内部表示整型数在内部用补码表示正数的补码是它的二进制表示,负数的补码是它的绝对值的二进制的每一位取反后再加1。如用8位表示一

20、个整数,那么: 62补=0 0111110 -62补=1 1000010在补码表示中,最高位是符号。0为正数,1为负数Python中的整数用32位表示, 则int范围为 231 2311,即-2147483648 2147483647实型数的表示定点表示:小数点的位置固定不变浮点表示:小数点位置不固定。一个浮点数分成尾数和阶码两部分。阶码表示小数点在该数中的位数,尾数表示数的有效数值。如十进制数N=246.135,其浮点表示可为: N = 246135 * 10-3 = 2461350 * 10-4 = 0.246135 * 103 = 0.0246135 * 104浮点数的存储当字长一定时,

21、分配给阶码的位数越多,表示数的范围越大,但分配给尾数的位数将减少,从而降低数的精度。符号位 阶码 尾数数值运算符运算符整数浮点数加加减减乘乘除(结果取整)除乘方乘方余数(商取整时的)余数abs()绝对值绝对值69运算数都是整数,结果为整数;至少有一个运算数是浮点数,结果为浮点数.数值计算数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换数学库其他的数学运算都包含在一个库中库是系统或其他用户已经写好的一些有用的程序。一般一个功能表示为一个函数数学库:支持各类数学计算的函数.数学库的引入:import math数学库中函数的调用:例如求平方根math.sqrt()求一元二次方程解# e

22、quation1.pyimport mathdef main(): a, b, c = input(Enter three coefficients:) discRoot = math.sqrt(b * b - 4 * a * c) r1 = (-b + discRoot) / (2 * a) r2 = (-b - discRoot) / (2 * a) print The solutions are:, r1, r2main()72引用数学函数库中的函数数学库中的常用函数pi : 常数e : 常数esqrt(x): 平方根sin(x), cos(x), tan(x), asin(x), ac

23、os(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,这种累积程序需要一个存放累积结果的变量,累积过程是一个循环:初始化累积变量循环直至得到最终结果 计算累积变量的当前累积值累积(续)初始化:给累积变量一个合适的初值,以便

24、进入循环后能正确计算.忘记初始化是一个常见编程错误!循环过程:将一个个值累积到累积变量中阶乘计算程序具体数(如6)的阶乘fact = 1for f in 6,5,4,3,2,1:fact = fact * f一般情形n = input( Enter a number: )fact = 1for f in range(n,1,-1):fact = fact * fprint The factorial of ,n, is,fact阶乘程序的几点注解由于乘法结合律,累积的次序是不重要的.如按下面的循环来累积:for f in 2,3,4,5,6:for f in 2,4,6,1,3,5:for f

25、 in range(2,n+1)range()函数range(n)range(start,n)range(start,n,step)fact也可初始化为n求1到100的和sum = 0for i in range(1, 101): sum = sum + iprint sum数值计算数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换整数的限制int型在内存占用的空间是有限的,因此能表示的数值范围也是有限的。Python中的整数用32位表示, 只能表示-2147483648 2147483647浮点数同样也有这个问题数值计算数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转

26、换大数的表示long int: 不定长,可扩至任意长度(当然受限于存储器容量).如5L, 1234567890000L注意:5L和5有完全不同的表示有长整数参加的运算,结果为长整数.long int运算效率远低于int,因此能用int就不用long int.浮点数很大时用科学表示法:1.234e+12最大数:1e+308求阶乘的更好的实现n = input( Enter a number: )fact = 1Lfor f in range(n,1,-1):fact = fact * fprint The factorial of ,n,“ is , fact阶乘增长很快,结果很容易超出int的

27、范围现在的Python环境都能自动执行int到大整数的转换。当超出int范围时,自动转换为大整型数值计算数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换类型转换Python只会做同类型的运算,运算结果与运算数类型相同。在混合类型表达式中,Python自动转换: int long float人工转换:利用int(), long(), float()小测验:求整数的平均值时用哪个好?avg = sum / countavg = float(sum) / countavg = float(sum / count)浮点数取整时如何做到四舍五入?int(x + 0.5)round()END

28、字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理文本数据计算机应用从科学计算转向信息管理.信息管理中大量的数据都是文本数据.如姓名,地址,简历等等计算机中用字符串来表示文本数据.89字符串类型字符串:字符序列字符串字面值:用一对引号(单或双)标明.“hello world”!#$%&*“汉字也是字符”字符串中包含引号怎么办?包含单引号:串用双引号括住包含双引号:串用单引号括住两者都有:更一般的方法是串中用转义字符print “Alice said, “Hello, Bob”字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理字符串的输

29、入普通变量的输入num = input(“Enter a number: “)Enter a number : 5.6变量num得到值 5.6如果用同样的方法输入字符串str = input(“Enter a string: “)Enter a string: JohnPython会输出出错信息原因:input()是把输入当成表达式来计算的!92字符串的正确输入输入时加上引号str = input(“Enter a string: “)Enter a string: JohnEnter a string: “John”使用raw_input()str = raw_input(“Enter a

30、string: “)Enter a string: Johninput与raw_inputx = input() x = raw_input()“John” Johnx xJohn Johnx = input() x = raw_input()3*4+2 3*4+2x x14 3*4+294字符串赋值字符串可以直接赋值Str = abcdeStrabcde取字符字符串是字符序列,可通过位置索引访问每个字符.对长度为n的字符串,索引可以是大于0的数:自左向右为0 n1, 或者是负数:自右向左为1, 2, 3, n 例如:若str = “Hello Bob”,则str0或str9是Hstr5或st

31、r4是 str8或str1是bstr9或str10越界出错取子串切段:取一个索引范围内的字符.:所取子串:位置索引从start end1start或/和end可省略,缺省值为串的首尾例如:若str = “Hello Bob”,则str0:3是Helstr5:9是 Bobstr:5即str0:5str5:即str5,9str:即str0:9连接两字符串的连接 + 例如:“Hello” + “Bob”得到“HelloBob”一个字符串的重复例如:3*“Hi”和“Hi”*3都得到“HiHiHi”串长度函数len()编程实例:获得每个月份的缩写在一个数据表里查找目标def main():months=

32、“JanFebMarAprMayJunJulAugSepOctNovDec”n = input(“Enter month number (1-12): ”)pos = (n-1)*3monthAbbr = monthspos:pos+3print “The month abbreviation is”,monthAbbr+”.”这是简单查找:利用位置规律来定位.若是月份全称怎么办?字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理字符串的机内表示与数值一样,计算机内用二进制数表示每一个字符因此操作字符串本质上仍然是数值运算.表示字符的这个数值称为字符的编码.每个字

33、符用什么编码?对这个问题的不同回答就导致了许多不同的字符编码系统例如:字符集只包含AZ,分别用126表示.“8 5 12 12 15”是什么意思?编码标准不同计算机若用不同编码体系,则彼此无法沟通。标准化ASCII:单字节编码只用到7位: 0 - 12796个可打印字符,32个控制字符利用8位可扩充ASCII: 0 - 255GB2312:两字节(6763个汉字)GB18030:最多四字节(70244个汉字)Unicode:最多四字节.字符与编码求给定字符的编码: ord()ord(a)可得97求给定编码的字符:chr()chr(97)可得a可见Python 2.7支持ASCII.支持中文编码

34、吗?print “你好”字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理编码编码:输出一串字符对应的内码def main(): message=raw_input(Enter the message to encode:) for ch in message: print ord(ch),main()执行时Enter the message to encode:abcdef97,98,99,10,11,12解码输出一串数字对应的字符串称为解码import stringdef main(): code = raw_input(Enter the code of m

35、essage: ) message = for numStr in string.split(code): num = eval(numStr) message = message + chr(num) print the decoded message is:, messagemain()运行时Enter the code of message:97 98 99 100the decoded message is:abcd几个函数字符串与数字的相互转换eval(字符串):将字符串转换成数字。例如:eval(“500”) 返回500str(表达式) :将数值当作字符串。例如:str(3+4*5

36、)string.split:string库中的函数字符串库Python提供的string库包含了很多有用的字符串处理函数例如split():将字符串拆分成子串string.split(“Hello string library!”)返回结果:Hello,string,library!string.split(“32,24,25,57”,”,”):按,拆分返回结果:32,24,25,57字符串库的常用函数capitalize(s): 使字符串s的首字母大写capwords(s): 使字符串s中的每个单词首字母大写center(s, width), ljust(s, width), rjust(s

37、, width): 使s变成width宽度且居中/左对齐/右对齐count(s, sub): sub在s中出现次数find(s, sub), rfind(s, sub): 在s中找sub的首次/末次出现join(seq): 将串序列中的串合并成一个串,分隔符默认为空格lower(s), upper(s): 将串变成小写/大写lstrip(s), rstrip(s): 删除打头/收尾的空格replace(s, oldsub, newsub): 在s中用新子串替换旧子串字符串与密码字符串在机内使用一个数字序列表示。如果不知道采用什么编码,只看这个数字序列是猜不出表示的是什么字符串。这就是一种加密机

38、制,称为替换法。字符编码都是工业标准,不是为了保密目的从编码到密码密码:为了保密而对信息进行编码.加密是计算机的一个重要应用明文密文加密解密凯撒密码(Caesar cipher)a-D、b-E、 c-F、d-G、e-H s-V 、z-C eg. 明文:access control 可变为: DFFHVV FRQWURO 字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理格式化输出格式化运算符%语法 % ()语义:模板串中用%标记“空位”,输出时用实际值填入.例如print “The price is $%0.2f” % (100)The price is $100

39、.00格式描述%.三种类型字符:decimal, float, string宽度:用多少位置显示数值.省略或指定为0:根据值的实际长度显示.宽度超出值的长度时:右对齐显示宽度前加负号:左对齐.对浮点数用超长宽度会怎样?试试精度:指示浮点数值的小数位数.省略:按系统默认的小数位数显示.print “%f” % (math.pi)浮点数如何精确化?浮点数的机内表示是近似值.银行应用要求精确表示金额,故不宜用浮点数及浮点运算.解决办法:以“分”为单位,用整数表示金额.设金额是x分,输出时利用x/100和x%100分别得到“元”和“角分”.print “You have %d.%02d” % (x/1

40、00, x%100)02d:不足2位用0填充:语句换行继续字符串处理文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理文件处理文件:存储在磁盘上的数据序列.典型的文件结构:基本数据项:可为任何类型若干数据项构成记录若干记录构成文件例如:学生基本数据项:学号,姓名,年龄一个学生记录:学号,姓名,年龄文件:全体学生记录118文本文件文件中是文本数据文本文件可视为存储在磁盘上的字符串.单行字符串多行字符串行尾(EOL):用特殊字符,如新行(newline)字符.Python用n表示新行字符,该字符在显示时被解释成新行字符.例:print “first linensecond li

41、ne”文件处理:打开文件程序不能直接与外存储器交互信息,必须通过内存进行交流打开文件:将磁盘文件与一个程序变量关联,做好读写准备. = open(,): “r”或“w”例如infile = open(“myfile”, “r”)outfile = open(“myfile”, “w”)写打开时小心文件名!因为可能破坏现有文件文件处理:读写文件读文件:读出文件内容.read():将整个文件作为一个字符串读入.readline():读入一行.readlines():读入所有行点表示法:文件是对象!写文件:将新内容写入文件.write()若想写多行内容,需写入n文件处理:关闭文件关闭文件:取消文件变

42、量与磁盘文件的关联.close()关闭文件时,系统会将内存中文件内容输出到磁盘.将整个文件作为一个字符串# file0.pydef main(): infile = open(encode.py, r) str = infile.read() print str infile.close()main()读入文件的前5行# file1.pydef main(): infile = open(encode.py, r) for i in range(5): str = infile.readline() print str infile.close()main()读入某个文件的所有行# file3

43、.pydef main(): infile = open(encode.py, r) for line in infile.readlines(): print line infile.close()main()125END面向对象与图形编程面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍数据与操作:传统观点数据类型某种值的集合运算(操作)的集合计算就是对数据进行操作数据与操作分离数据是被动的, 操作是主动的例如:string类型的值是abc等, 对串的操作有+, *, len()等数据与操作:面向对象观点对象(Object):集数据与操作于一身.对象知

44、道一些信息对象能对那些信息进行处理计算:向对象发出请求操作的消息.主动的数据类型面向对象(Object-Oriented):软件系统由各种对象组成, 对象之间通过消息进行交互.现代软件系统几乎都是OO设计和实现.OO基本概念类(class):描述同类对象的共性包含的数据:任何类型的数据,甚至可以是对其他对象的引用.能执行的操作(方法)对象(object):类的实例(instance)同类的不同对象可有不同的数据值(实例变量),但能执行的操作是一样的创建对象:使用类的构造器(constructor)初始化对象(,,)消息:请求对象执行它的方法.(,,)对象的方法不同类型的对象当然提供不同的操作对

45、象一般都提供读取它的实例变量值的方法,统称为accessor。例如Point对象的getX()和getY(),Line对象的getP1()和getP2()。对象一般也提供修改其实例变量的方法,统称为mutator。例如所有图形对象都有move(dx,dy)方法。面向对象与图形编程面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍图形界面命令行界面通过输入一个个命令名字让计算机去做某项特定的工作。如DOS系统。使用复杂,需要记住一个个命令。图形用户界面(GUI)利用窗口、图标、按钮和菜单等方式驱动程序的执行。如window系统。使用方便图形编程框架现代编程语

46、言大都提供图形化变成的工具Python有自带的Tkinter本书作者写的图形库:graphics.py放入文件夹:Python26Libsite_packagesimport graphics或 from graphics import *后者可使引用库函数更方便面向对象与图形编程面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍创建和关闭窗口图形窗口:画图的地方创建一个窗口对象用import graphicswin = graphics.GraphWin()win = graphics.GraphWin(窗口的名字,行像素数,列像素数)用from gra

47、phics import *win = GraphWin()win = GraphWin (窗口的名字 ,行像素数,列像素数)关闭窗口:win.close()图的内部表示数字图像的表示:用像素(pixel)表示,像素越多,质量越好。黑白图像的像素需要一个bit表示。如1表示白,0表示黑。如需要表示灰度和彩色,则需要多于1个bit。每个像素占用的bit越多,图像质量越好。分辨率:图象中的像素数。图形库创建的窗口默认的分辨率是200*200图形对象的操作小测验:窗口中有哪几类对象?创建一个对象各类对象的公共操作将对象显示在窗口中:draw移动对象:move设置对象的填充颜色:setFill设置对象

48、的边界颜色:setOutline点点:图形窗口的一个像素,位置用坐标(x,y)表示。坐标系统原点(0,0):左上角x轴:自左向右y轴:自顶向下小测试:默认大小的图形窗口,右下角坐标是?点(续)创建Point类的对象Point(,)例: p = Point(50,60)对Point对象的操作求坐标:p.getX(), p.getY()在窗口中画自己:p.draw(win)设置点的颜色:p.setOutline(red)移动点:p.move(dx, dy)线段创建 Line 类的对象Line(,)例如l = Line(Point(0,0),Point(100,100)对 Line 对象的操作在窗口

49、中画自己l.draw(win)圆形创建Circle类的对象Circle(,)例如c = Circle(Point(50,50),40)对Circle对象的操作填充颜色c.setFill(red)在窗口中画自己c.draw(win)椭圆给定一个矩形框,创建一个内切Oval类的对象Oval(,)例如o = Oval(Point(20,150),Point(180,199)对Oval对象的操作在窗口中画自己o.draw(win)矩形创建Rectangle类的对象Rectangle(,)例如r = Rectangle(Point(5,8),Point(30,40)对Rectangle对象的操作在窗口中

50、画自己r.draw(win)多边形创建Polygon类的对象Polygon(,)例如p = Polygon(Point(10,10), Point(30,30),Point(10,30)对Polygon对象的操作在窗口中画自己p.draw(win)文本创建Text类的对象t = Text(,)例如t = Text(Point(99,99),”text here”)对Text对象的操作在窗口中画自己t.draw(win)重设字符串t.setText(“new text”)实例:画两只眼睛方法一:直接创建两个对象leftEye = Circle(Point(80,50),5)leftEye.set

51、Fill(yellow)leftEye.setOutline(red)rightEye = Circle(Point(20,50),5)rightEye.setFill(yellow)rightEye.setOutline(red)利用对象复制错误代码leftEye = Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye = leftEyerightEye.move(20,50)Python中图像对象的赋值是为对象取一个别名,而不是创建一个新对象!正确代码leftEye = Circle(Po

52、int(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye = Circle(Point(100,50),5)rightEye.setFill(yellow)rightEye.setOutline(red)更美观的代码使用clone()复制对象leftEye = Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye = leftEye.clone()rightEye.move(20,0)150面向对象与图形编程面向对象的

53、思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍编程实例:投资收益柱状图用柱状图表示10年的投资收益.每年的收益是一个矩形。这些矩形有相同的宽度,但有不同的高度算法输入本金和年利率创建图形窗口确定比例:1原先对应的高度,每一年占用的宽度窗口左边画上刻度0号位置画对应初始本金的矩形,高度为本金值对接下来的1到10年:高度principal = principal * (1 + apr)在相应位置画对应本利的矩形进一步细化确定图形窗口的尺寸:如果我们的显示器用的分辨率是1024*768,我们希望图形占四分之一的画面,则可以把分辨率定为512*384创建一个相应的窗口创

54、建512*384的图形窗口,标题为Investment Growth ChartPython代码win = GraphWin(Investment Growth Chart, 512, 384)进一步细化(续)确定刻度的内容和位置内容:0.0K,2.5K,5.0K,7.5K,10.0K位置:确定水平方向30像素为一年,从第80像素开始;垂直方向5个刻度($10,000)平分300像素,即70像素为一档.算法精化Draw label 0.0K at (20, 320)Draw label 2.5K at (20, 250)Draw label 5.0K at (20, 180)Draw labe

55、l 7.5K at (20, 110)Draw label 10.0K at (20, 40)用Text函数实现进一步细化(续)确定0号柱子的位置和高度位置: 左下角坐标为(70,320)高度: principal * (280 / 10000),即右上角y坐标为320 principal * (280 / 10000).宽度: 故右上角x坐标为70 + 30 = 100算法精化0号柱:从(70,320)到(100,320 - principal*0.028)画矩形进一步细化(续)其他柱子的位置和高度位置: 左下角为(x, 320).高度: principal*(280/10000),则右上角

56、y坐标为320 principal*(280/10000).宽度: 30,故右上角x坐标为(左下角x坐标+30)算法精化for year 从1到10:principal = principal * (1 + apr)x = 25 * year + 40height = principal * 0.02从(x,230)到(x + 25,230-height)画矩形最后的程序(graph)from graphics import *def main(): win = GraphWin(Investment Growth Chart, 512, 384) Text(Point(20, 320), 0

57、.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(enter initial principal:) apr = input(enter interest rate: ) bar = Rectangle(Point(70,320), Point(100, 320- principal*0

58、.028) bar.setFill(green) bar.draw(win) x = 100 for year in range(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 + 30 raw_input(press any key to quit: ) win.close()main()面向对象与图形编程面向对象的思想图形化编程图形对象的使用未知值的图

59、形化处理坐标系的选择图形交互图形模块介绍自定义坐标系默认坐标系以像素为单位,编程很麻烦.坐标变换:实际数据需映射成窗口像素位置.Graphics模块提供自定义坐标系的功能,使坐标变换自动完成.好处编程简单直观改变窗口像素尺寸对程序几乎没影响自定义坐标系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)L

60、ine(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)graph1将x坐标分为13份,从0到13将y坐标分成6份,从0到6X坐标1-2是当年信息,2-3是一年后的信息,以此类推Y坐标1是0元,2是2.5K元,3是5K元,from graphics import *def main(): win = Gra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论