北大裘宗燕《从问题到程序》第三章 变量、函数和控制结构_第1页
北大裘宗燕《从问题到程序》第三章 变量、函数和控制结构_第2页
北大裘宗燕《从问题到程序》第三章 变量、函数和控制结构_第3页
北大裘宗燕《从问题到程序》第三章 变量、函数和控制结构_第4页
北大裘宗燕《从问题到程序》第三章 变量、函数和控制结构_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、从问题到程序,邱宗炎,北京大学数学学院,2005年,第三章变量,函数和控制结构,讨论了机制的局限性:它只能描述基于基本数据的简单计算;只能描述具体的计算。我们希望描述更复杂的计算过程能使程序通用,解决一类问题,并完成不同数据的相似计算,因此需要更多的程序机制。3.1、语句和复合结构、语法:语句的形式必须满足语言要求。语义:具有合法形式的语句表达某种意义(程序执行时的效果),这被称为语句的语义。语句是程序的基本单元。函数调用是一种“基本”语句。还有其他一些基本陈述(将在下面介绍)。为了描述复杂的计算,该语言提供了一些结合简单语句的结构来控制执行过程。复合结构(复合语句),语法:一对大括号,其中可

2、以有0个或更多语句。语义:按顺序执行每个语句。空复合结构中没有语句,执行立即结束。这个简单c程序的主要部分是一个复合语句:intmain()printf(Goodmorning!n);返回0;3.2变量的概念、定义和使用。在硬件中,数据存储的概念是存储单元和地址,变量是它们在高级语言中的反映。变量:存储数据的命名对象。变量名允许您使用存储在变量中的数据。变量名是一个标识符。基本操作:赋值和取值。变量可以保存值。在给一个变量赋值后,每次使用它时,在下一次赋值之前,总是会得到这个值。在程序执行过程中,变量值会发生变化。变量具有固定类型,并且只能保存这种类型的值。整型变量(保存整型值的变量)、双精度

3、变量(保存双精度值的变量)、字符变量等。变量定义:必须在使用定义所需的信息之前定义变量:变量名和类型。示例:intm。doublex您可以同时定义相同类型的多个变量:整数、n、总和、计数;longdoubley,z;关键字不能用作变量名。建议使用有意义的名称。局部变量可以在复合结构中定义。在内部使用变量定义,它应该出现在所有语句之前。变量定义序列语句序列不能在复合结构中定义多个同名的变量。复合结构的执行(修改的语义):首先定义变量,然后按顺序执行每个语句。变量值和赋值值:在计算中遇到变量,并取其值参与计算:x sin(3.2 * y)-幂(x,2)。表达式中有变量,计算结果将取决于变量值。pr

4、intf(%dn ,n * 2);赋值:由赋值运算符(=,赋值编号)表示:x=5.0左边是赋值目标,右边是提供值的表达式。赋值操作的主要作用是将表达式的值赋给左变量,赋值操作符的优先级很低。示例:x=2 3*y,赋值语句:赋值表达式后面跟着一个加号(语法),这是最基本的语句。在完成程序中最重要的操作程序中,赋值语句通常用于描述赋值动作,赋值表达式也可以独立存在(稍后讨论)。示例:重写程序,从三条边3、5和7计算三角形面积。计算中多次使用半周长,定义变量来保存该值,可以避免重复计算。# include # includeintmain()double;s=(3。5.7.)/2。printf(Ar

5、ea:%fn,sqrt(s*(s-3。)*(s-5。)*(s-7。);返回0;变量的主要目的是保存计算的中间结果、赋值操作符的值和组合以及赋值操作的值,即右边表达式的值。通常不使用赋值表达式的值。可以使用赋值表达式的值。示例(不推荐):y=(x=5)8;人们有时使用同一个表达式给多个变量赋值。y=(z=(x=1.0);赋值运算符从右向左组合。上述语句可以简化(也称为多重赋值):y=z=x=1.0赋值和类型赋值的变量有一个类型(由变量定义决定);赋值号右边的表达式的值有一个您可以用数值或数值表达式初始化适当类型的变量:double=(3 5 7)/2.0;longdoublex=4.5L,y=3

6、.24L一次只能对一个变量进行初始化。赋值表达式有一个值,下面是一个合法的语句:x=2.0y=(x=3.0)x;执行后y的值是多少?作业与数学中的“平等”完全不同。示例:x=x1;“x=x 1”是数学中的一个矛盾。上述声明是合法的(常用的)。这个问题没有得到回答,因为第二个陈述是不正确的。c语言没有通过加法指定两个操作数的求值顺序,“这个表达式的结果是未定义的”。程序中的注释:程序中写的解释性文字,帮助人们阅读/理解程序。注释对程序意义(执行)没有影响。(所有语言都允许注释)表格:/*程序中的任何字符序列*/注释等同于一个空格。给程序添加必要的注释是一个好的编程习惯。对于复杂的大型程序,注释更

7、有意义。简单计算程序,#include/*如果使用数学函数,写#include*/intmain()/*几个变量定义(和可能的初始化)*/*几个计算和赋值语句*/*几个输出语句*/return 0;这是C程序的基本形式,后来逐渐扩展。3.3函数定义(初步),函数可以看作是C语言基本函数的扩展。函数是特定计算过程的抽象,它是通用的,可以以特定的方式(参数的数量/类型)用于特定的数据。示例:标准函数sin,类型特征是:doublesin(double),标准函数是有限的,需求是无限的。在编程中,需要定义函数。例如:计算一些圆盘的面积,其半径为3.24、2.13、0.865、3.746、12.336

8、4、8.421,圆周率为3.1411。可以编写以下程序:# include int main () printf(半径:% f,面积:% fn,3.24,3.24 * 3.24 * 3.1416);printf(半径:%f,面积:%fn,2.13,2.13 * 2.12 * 3.1415);/*在实际程序中不能有省略号*/。单调乏味的事情很容易出错,而上面的程序是错误的。如果有一个以半径为参数的计算圆盘面积的函数:doublec_area(double)程序可以简化。第一个语句可以写成:printf(半径:% f,面积:% fn,3.24,c _ area(3.24);如果有打印光盘区的功能p

9、c_area,只需写:PC _ area(3.24);PC _ area(2.13);函数可以使程序更短,更容易编写/理解/修改。函数定义将计算定义为函数,并给它一个名称。定义函数c_area的程序段:double c _ area(doubler)returnr * r * 3.1416;一旦定义好了,它就可以被命名并在任何需要的地方使用。半径为3.24、高度为2.4的圆锥体体积:2.4*c_area(3.24)/3.0,外半径为5.3、内半径为3.07、高度为4.2的空心圆柱体:(c _ area (5.3)-c _ area (3.07) * 4.2,# include/*定义函数。/*

10、 pi的近似值可以轻松修改*/intmain () printf(半径:% f,面积3360% fn,3.24,c _ area(3.24);printf(Radis :% f,area:%fn,2.13,c _ area(2.13);printf(Radis :% f,area:%fn,0.865,c _ area(0.865);printf(Radis :% f,area:%fn,3.746,c _ area(3.746);printf(Radis :% f,area:%fn,12.3364,c _ area(12.3364);printf(Radis :% f,area:%fn,8.42

11、1,c _ area(8.421);返回0;函数定义,函数标题描述函数名称和类型特征。包括函数返回值类型、函数名和参数表。参数表声明了参数的数量和每个参数的类型。参数命名是使用函数中实际参数的值。c_area定义的函数头是:doublec_area(doubler),函数体是一个复合结构,其中定义的变量是该函数的局部变量。参数也被视为局部变量。形式:函数头函数体,函数体中的特殊语句:返回/返回语句:返回表达式;返回;结束函数:首先计算表达式,并将其值作为函数的返回值。函数调用函数名(实际参数表)多个参数用逗号分隔。函数的执行:当参数有特定的参数值时,函数体的复合语句开始执行。多对类型/参数被写

12、入多个参数的函数参数表中,用逗号分隔。例:定义寻找已知三条边长的三角形面积的函数。T_area,3个双参数返回双。类型特征:double _ area(double,double,double),函数定义可以写成:double _ area(double a,doubleb,double c)double=(a b c)/2.0;返回(sqrt(s *(s-a)*(s-b)*(s-c);定义没有返回值的函数。如果函数不需要返回值,您可以定义一个没有返回值的函数。form:在返回值类型处写入void。当执行到达函数体的末尾时,表达式中不能使用没有返回值的函数,例如,根据半径计算和输出盘面积的函数

13、:void PC _ area (doubler) printf(半径:% f,面积3360% fn,r,3.1416 * r * r);#includevoidpc_area(倍增器)printf(Radis :% f,area:%fn,r,3.1416 * r * r);/*很容易修改输出格式、pi等。*/int main()PC _ area(3.24);PC _ area(2.13);pc _面积(0.865);PC _ area(3.746);PC _ area(12.3364);PC _ area(8.421);返回0;函数和程序,完整的程序必须有一个名为main的函数(main

14、function)。函数main表示程序的执行过程。程序从主体开始执行,直到复合结构结束(语句执行或退出),其他函数在没有调用的情况下不会执行。程序启动时会自动调用Main(由运行系统调用)。程序中不允许调用main。函数和类型,return语句中表达式的值应转换为函数返回值类型,并且计算结果(转换后)将作为执行语句时的返回值。示例:intfun(intm)返回3.2*m 5。定义时的类型问题:标头中定义的返回值类型可能与return语句中的表达式类型不一致。调用时的类型问题:参数的数量应该满足函数定义的要求,并且每个参数应该能够转换成相应参数的类型。当实际参数类型不同于形式参数类型时,首先将

15、其转换为所需类型的值,然后传递给形式参数int fun(intm)return 3.2 * m 5;声明:x=有趣(2.5 6);让x是一个双精度变量。执行该语句时有多少次转换?类型转换的各种情况:类型转换可能发生在计算和赋值过程中;类型转换可能发生在参数传输期间;生成函数返回值时可能会发生类型转换;识别函数调用;包含一个或多个函数定义的程序模式:#include/*函数定义写在这里*/intmain()/*包含函数调用的主程序体*/建议在编写程序时使用这种形式,这将在后面介绍,3.4例如,您需要编写一个函数来返回两个参数的较大值:doubledmax(double,double),并且您需要

16、比较数据大小(judge)并根据判断结果决定要做什么(处理每种情况)。本节主要讨论如何描述逻辑判断,如何确定判断结果,如何使用逻辑判断来控制计算过程,以及如何通过关系运算符/关系表达式关系运算符来确定数据之间是否存在一定的关系。关系表达式的结果可用于控制计算过程。总共有6个关系运算符:=大于/大于或等于/小于或等于/小于=!=等于/不等于,关系运算符可用于算术类型。如果要比较的对象类型不同,则根据算术运算规则进行转换后进行判断。关系是否真实(真/假):3.2=2.9y!=x 1,关系表达式C语言没有明确指出关系运算结果的类型,关系运算结果为int,有效/无效值分别为1/0。(3.24=2.98

17、)的值是int类型的0;(5!=3 1)是int类型的1。关系运算符的优先级低于二进制算术运算符,高于赋值运算符,赋值运算符分为两个级别:=,=低,其他运算符为高。关系运算符从左到右组合,并且不指定对象计算顺序。通常不采用连续写关系运算符的形式(容易误解),例如,5=3=2,条件表达式关系表达式的结果为真/假。描述逻辑判断/逻辑属性关系成立,描述的关系为“真”,逻辑值为“真”;否则,关系为“假”,逻辑值为“假”。该程序使用逻辑判断/逻辑值来控制计算过程。所有基本类型条件表达式的语法形式:表达式1?表达式2:表达式3,语义(特殊计算方法):先计算表达式1(条件);如果条件成立,则计算表达式2;如

18、果条件不成立,则计算表达式3;注意:如果条件成立,则不计算表达式3;如果不是,则不计算表达式2。函数dmax的定义:double dmax(double,double)返回xy?x:y例子:z=dmax(2,3)注意它的计算过程。对应于符号函数的c函数:doublesign(doublex)returnx0?1:(x=0?0:-1);条件表达式的优先级和组合顺序,每个:不匹配最近的一个?匹配x0?1:x=0?0:-1,条件运算符的优先级高于赋值运算符,低于关系运算符。注意条件表达式的特殊计算。下面的例子是可以的:当x的值不为0时,变量z将被赋值为y/x,否则,z将被赋值为1。z=x!=0?y/x :1;复杂条件的描述:逻辑表达式的复杂关系,例如,3x5时z取2,否则取1。它可以用关系表达式和条件表达式来描述:z=(x=3?(x=5?2:1):1);关系表达式和条件表达式足以描述所有可能的复杂条件。但是描述可能很复杂而且不

温馨提示

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

评论

0/150

提交评论