1、第2单元 编程计算2.1计算机解决问题的过程1、算法简单地说,算法就是解决问题的方法和步骤。“最强大脑”游戏问题的求解过程就代表着一种算法。其实,我们在日常生活中也经常使用算法。例如,我们到超市购物,首先确定要购买的物品,然后进行挑选、比较,最后到收银台结账付款,这一系列活动流程与策略就 是所谓的算法。解决问题的过程,就是实现算法的过程。找到算法之后,不能只是自己心知肚明,还需要准确、具体地将它描述出来。要让计算机解决问题,必须明确地告诉它要处理的具体对象和每一步的准确处理过程,否则计算机就无法工作。因此,对算法的描述要求尽可能精确、详尽。描述算法可以有多种方法,比如可以使用自然语言或流程图进
2、行描述。2、使用自然语言描述算法自然语言是指人们日常生活中使用的语言,汉语、英语、德语等都是自然语言。用自然语言描述算法符合我们的表达习惯,并且容易理解。用自然语言描述算法,通常是我们理解算法的第一步3、使用流程图描述算法流程图也称为程序框图,它是算法的一种图形化表示方法。与使用自然语言描述算法相比,用流程图描述算法形象、直观、更容易理解。对于一些复杂的算法,直接编写代码很困难,我们可以先用流程图描述算法,然后根据流程图写出程序代码。为了使算法的流程图看起来更加直观,需要对流程图的表示方法进行规范,目前最常用的流程图规范是由美国国家标准学会制定的一系列流程图符号,如图2.1.1所示。起止框:表
3、示一个算法的开始和结束。输人/输出框:表示从外部输人数据到计算机内部或者从计算机内部输出数据到计算机外部。处理框:表示操作的内容。判断框:表示判断的条件。满足条件,执行标识为“是”的路径;不满足条件,则执行标识为“否”的路径。流程线:指向算法运行的方向。连接符:表示流程图的接续。在相互联系的流程图内,流程线将在具有相同数字或字母的另一连接符处继续下去。4、三种基本结构的流程图算法的三种基本结构是顺序结构、分支结构和循环结构。顺序结构是一种最简单的基本结构,按照自上而下的先后顺序依次执行程序语句。在如图2.1.2所示的顺序结构示意图中,先执行处理框A,再执行处理框B。分支结构也称为选择结构,是一
4、种根据给定的条件进行判断的结构。如图2.1.2所示的分支结构中必定包括一个判断框,若满足条件则执行处理框A,若不满足条件则执行处理框B。循环结构是一种重复某一部分操作的结构。如图2.1.2所示的循环结构中,若满足条件则执行循环体(处理框A),若不满足条件则跳出循环,执行循环结构后面的代码。5、Python语言的开发环境Python是一种程序开发工具。6、程序设计语言的发展除Python语言之外,还有很多其他程序设计语言。程序设计语言经历了从机器语言、汇编语言到高级语言的发展过程。机器语言由二进制的0、1代码指令构成,能被计算机直接识别。但理解和记忆机器语言非常困难,并且容易出错,编程效率极低。
5、汇编语言是符号化的机器语言,采用英文助记符代替机器指令,比机器语言容易识别和记忆,从而提高了程序的可读性。但是汇编语言仍然是面向机器的语言,是为特定的计算机系统设计的,它要求软件工程师对相应的机器硬件非常熟悉,因而汇编语言属于低级语言。高级语言更接近自然语言,并不特指某一个种语言,也不依赖于特定的计算机系统,因而更容易掌握和使用,通用性也更好。比较流行的高级语言有Java、C/C+以及本书使用的Python等。用高级语言编写的程序可读性更强,也便于修改、维护。2.2 做出判断的分支常量在程序运行过程中值始终保持不变的量称为常量。所有的常数都是常量变量在程序运行过程中值允许改变的量称为变量。计算
6、机在处理数据时,首先要将数据调入内存单元,然后进行各种操作。变量是创建时在内存中开辟的一个存储空间,变量名是内存中存放数据的存储单元的标签,存放的数据叫变量的值。在Python中,变量的命名需遵循以下几条规则。必须以字母或下划线开头,后面可以是字母、数字或下划线。区分大小写。不能使用保留字。程序中的变量与数学中的变量含义略有不同。数学中的变量隐含着“未知”;在程序中,程序执行的每个瞬间,变量的值是确定的,但在程序执行的整个过程中,它的值是可以改变的。运算符与表达式表达式由一个或多个操作数通过运算符组合而成。例如“2+3” 它由运算符“+”和操作数“2”“3”两部分构成。运算符是进行某种运算的标
7、识符号,它标明对操作数所进行的运算。常见的运算符如表2.2.1所示。赋值语句赋值语句的基本格式如下:变量=表达式,功能是将右边表达式的值赋值给左边的变量。输入和输出语句在Python中,使用“input()”从键盘输人数据,使用“print()”在屏幕上输出数据。如果有多个输出项,可以使用“,”分隔。数据类型为了便于数据的表示与处理,Python提供了整数、浮点数和字符串等常见的数据类型。下面给出一些函数,它们可以把数据从一种类型转换为另一种类型。float():根据一个字符串或整数创建一个新的浮点数(小数)。int():根据一个字符串或浮点数创建一个新的整数。str():根据一个数(也可以是
8、任何其他类型)创建一个新的字符串。分支语句当程序中需要根据不同的条件判断来决定程序执行的走向时,可以 使用if分支语句实现,其基本格式如下。2.3周而复始的循环1、列表列表在Python中的作用非常强大,它可以包含多个数据元素,同时它是一个有序的集合。下面通过一个简单的例子来熟悉列表的使用方法。2、计数循环循环重复次数一定时,我们通常称为计数循环。在Python中, 使用for语句来创建这类循环。for语句的基本格式如下通常我们将一组重复执行的语句称为循环体。Python对循环体的定的格式是,循环体必须相对关键词for有缩进。在for语句中,in后也可以是range()函数,它可以生成某个范围
9、内的数字列表。例如:range(1,6)就会生成1,2,3,4,5这样一个列表,而range(8)会生成0,1,2,3,4,5,6,7这样一个列表。3、条件循环条件循环一般用于循环次数未知的情况。只有当循环条件成立时,才执行循环体。在Python中,使用while语句来创建这类循环。while语句的基本格式如下。如:在本例中,循环体是两条语句,因此这两条语句相对于关键词while均要缩进。程序执行过程是:变量s初值为0,判断“s=30”是否成立;如果成立则执行循环体( s值增加10,输出s的值),不断重复直到“s=30”不成立,退出循环。在此我们需要特别关注语句“s=s+10。在编程时,形如“
10、s=s+x”的语句可以起到累加的作用,如果x=1,即s=s+1可以起到计数的作用。一般在使用累加器或计数器时将变量赋初值为0。也有一类特殊的关系表达式,如数字0表示假,非0数字表示真。如果循环是以“while 1:”开头,那么在不加干预的情况下,程序就会“不知疲倦”地一直执行下去。如果你想停止这个程序,按快捷键Ctrl+C即可。通常情况下,我们不会让程序陷人这种“死循环”的境地。2.4可以复用的代码1、函数函数可分为系统函数和用户自定义函数两种类型。系统函数即函数库中的标准函数,是程序设计语言或操作系统提供给用户的一系列已经编制好的程序。在前面单元使用过的print()和input()函数都是
11、系统函数。前者用于将字符串按指定格式输出到屏幕上;后者用于接收键盘的输人,并存储于相应变量中。用户自定义函数则是用户自己编写的一段程序。函数一般包括函数名、参数、返回值和函数体等四部分。其中,函数名和函数体是必不可少的,参数和返回值可根据需要进行定义。定义函数的基本格式如下。参数是用来向函数传递值的,当有多个参数时,各个参数之间用逗号分隔开。函数执行完成后,由return语句将表达式值返回给调用者,结束函数。函数的调用采用函数名(参数)的方式。如: 用函数来求n!。上例中,程序执行时由于def块中的代码不是主程序的一部分, 因此会跳过该段代码,从主程序的第一行total = factorial
12、(4)开始运行。在遇到函数的调用语句factorial(4)时,转到丽数中的第一行代码开始执行。函数运行时,变量n会被赋值为4。函数执行完成返回变量s的值即24,然后回到语句total = factorial(4),将返回值赋给变量total,最后输出。2、发布代码通过模块发布代码可以让很多人受益于你的工作。如:有6根火柴棒,列出所有能摆出的自然数,要求火柴棒正好用完。火柴数字如图所示。在D:创建一个文件夹mymodule, 其中包含mymodule.py和setup.py两个文件。mymodule.py是一个模块文件,其内容就是match_ num函数。mymodule.pysetup.py打开mymodule所在的目录,构建发布文件。最后将发布文件安装到你的Python本地副本中。安装完成后,mymodule文件夹包含了如图2.4.4所示的文件。如果你想让全世界都分享你的成果,你可以在互联网上发布你的代码。3、导入模块并使用已经构建发布的模块必须先导人程序才能使用。导人时使用语句“import mymodule”, 调用模块内的函数时用“mymodule.match_ num()”来实现。