第4章 函数和作用域

合集下载

c4函数[2]

c4函数[2]
17
函 数 的 参 数 传 递 机 制
函数的参数传递
• 引用 引用(&)是变量的别名 例如 是变量的别名,例如 是变量的别名 例如:
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
C++程序设计 C++程序设计
第4章 函数和作用域 章
西南科技大学经管学院 李宇翔
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
空瓶C 空瓶
14
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
#include<iostream.h> void Swap(int a, int b); int main( ) ( { int x(5), y(10); cout<<"x="<<x<<" y="<<y<<endl; Swap(x,y); cout<<"x="<<x<<" y="<<y<<endl; return 0; }

计算机程序设计基础c语言4

计算机程序设计基础c语言4

4.6 递归
如果一个函数在调用的过程中出现直接或者间接地调用 该函数本身,称为函数的递归调用。C语言的特点之一就是 允许使用函数的递归调用。
int fn(int a) { int x,y;

y=fn(x);
return (3*y);
} 在调用函数fn()的过程中,又出现再次调用fn()函数,这 就是函数的递归调用,函数fn()称为递归函数。像函数fn()这 样直接调用自身的,称为函数的直接递归调用。
在函数体中也应将变量的声明放在使用该变量之前,否则会 出现编译错误。
4.2.2 函数声明与函数原型
(一)函数声明 形式如下:
返回数据类型 函数名(形式参数类型 形式参数名); 如 float max1(float a, float b); 注意:
当被调函数的定义位于主调函数之前,可以省略函数 声明;若定义在后,则必须在主调函数之前对被调函 数进行声明。
对于有参函数,在声明时可以省略形式参数的名称, 但类型不能省略。 如 float max1(float , float);
函数声明时不要忘记语句末尾的分号“;”。
4.2.2 函数声明与函数原型
(二)函数原型 形式如下:
返回数据类型 函数名(形参类型 形参名); 返回数据类型 函数名(形参类型);
4.4 函数返回类型与返回值
2.无返回值函数 如果函数没有返回值,则定义为“空”类型,类型说明 符为“void”。无返回值函数用于完成特定的处理任务, 执行完后不向主调函数返回任何值。如
void printstar() {
printf("********"); } 如果要在主调函数中调用printstar函数,则语句为:
n!=1 n!=n×(n-1)!

2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 4

2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 4
double func (double x, int y, char z); /* 注意末尾的分号 */
4.1.4 虚实结合与传值调用
一个函数中的函数体,只有在该函数 被调用时才会执行。在函数被调用时,将 要进行如下两个操作: • 将函数调用中的实际参数值传送给函数定 义中的形式参数; • 将流程从调用处转到被调用的函数的开头, 开始执行函数体中的代码。
{ 函数体
}
1. 函数头函数类型 函数名(形式参数表列)
一个函数的函数头的结构如下: (1)函数类型。指定函数值的类型,即函数返 回值的类型。 (2)函数名。函数名必须采用合法的用户标识 符。 (3)圆括号:在函数名后面的一对圆括号是 “函数运算符”,表示进行函数运算,函数运算符 具有很高的运算优先级别 (4)形式参数表。形式参数表由写在一对圆括 号(函数运算符)中的一系列参数组成。每一个参数 由一个类型符和一个参数名组成。参数名也应当是 合法的用户关键字。函数可以没有参数,这时在函 数运算符内写一个“void”,也可以空允白。
c
no1 no2 no3
第一步:先把上面的n-1个盘子设法借助b杆放到c杆, 如图4.8中的箭头①所示,记做hanoi(n-1, a,c,b)。
第二步:把第n个盘子从a杆直接移到b杆,如图4.8中的 箭头②所示。
第三步:把c杆上的n-1个盘子借助a杆移到b杆,如图4.8 中的箭头③所示,记做hanoi(n-1,c,b,a)。
递归计算n!的函数rfact( )。 通常,n的阶乘可以描述为: n!=1·2·…·n 但是,也可以描述为: n!= n·(n-1)·…·2·1 或者可以写为: n!= n·(n-1)! 更一般的形式是:
1
(x≤1)
n!= n·(n-1)! (x>1)

第4章 函数(GAI)

第4章   函数(GAI)

(4)有时为了明确表示函数无返回值,可以将函 数定义为“void”类型。但应注意:一旦函数定义为 “void”类型,就不能再使用被调用函数的返回值。
函数的调用
一个函数被另一个函数调用的过程称为函数的 调用。 一、函数调用的一般形式 函数调用的一般形式 所谓函数调用(function call),是指使程序流 程转向所定义的函数。 1.函数调用的一般形式如下: 函数名(实际参数表列) 其中,“函数名”必须与函数定义、函数声明 时的函数名同名;
一、内部函数 static 类型标识符 函数名(形参表列) 例如: static int function(int x,int y) 内部函数又称静态函数。
二、外部函数 外部函数 在需要调用外部函数的文件中,用extern声明的函数是外 部函数。
编译预处理
一、C语言提供的预处理主要有以下3种: (1)宏定义。 (2)文件包含。 (3)条件编译。 1. 宏定义可分为不带参数的宏定义和带参数的宏定义两种。 1.不带参数的宏定义 不带参数的宏定义的一般形式如下: #define 宏名 宏体
C语言中用来说明变量存储类别(属性)关键字有4个:auto (自动),static(静态),register(寄存器)和extern (外部)。 在定义局部变量时,如果不赋初值,则对于静态局部变 量来说,编译时,系统自动赋初值0或可以重新赋值;而对 于自动变量来说,它的值是一个不确定的数。
内部函数和外部函数
第4章
重点内容总结 1.函数的定义与声明 2.函数的调用 3.变量的存储类别 4.内部函数与外部函数 5.编译预处理
函数
函数的定义与声明
一、从定义的角度看,函数可以分为系统库函 数和用户自定义函数。 1.系统库函数(标准库函数)。系统库函数用户无 须定义。 库函数从功能上可分为以下几种: 1)字符分类函数:用于对字符按ASCII码分 类(分为字母、数字、控制字符、分隔符、 大小写字母等)。

第4章 Python函数定义与使用

第4章  Python函数定义与使用

4.1 定义函数
4.1.3 函数的返回值 函数使用return语句带回返回值,该返回值由函数名带回
,并结束函数的执行。不论return语句出现在函数的什么 位置,一旦得到执行将直接结束函数的执行。 如果函数没有return语句或者执行了不返回任何值的return 语句,Python将认为该函数以return None结束,即返回 空值。也可以将Lambda表达式作为函数的返回值,关于 Lambda表达式将在后面的章节中介绍。
4.2 函数参数
函数参数有形式参数(形参)和实际参数(实参)的区别 。在函数定义里关键字def定义函数时函数名后面括号里 声明的参数是形参,形参的个数可以为0个或多个,如果 没有形参,声明函数时函数名后的括号也不能够省略,当 形参的个数多于1个时各参数之间用逗号隔开。
函数调用时在函数名后括号中提供的数值为实际参数,在 调用函数时,将实参的值传递给形参,函数中参与运算等 操作的数据是实参,所以只有函数的实参才是正真起作用 的值,而函数的形参不代表任何具体的值,仅仅是为了实 现函数的某种功能。
,也可以没有,多个形式参数之间用逗号隔开。同样地,函数参 数也不用指定参数类型。 函数体是复合语句,函数体语句需要采用缩进书写规则。 如果函数有返回值,返回值是通过函数体中的return语句获得的 ,return语句可以在在函数体内任何地方出现,表示函数调用执 行到此结束;如果没有return语句,会自动返回空值(None), 如果有return语句但return后面没有接表达式或者值得话也是返 回None值。
Python
第4 章 Python函数定义
与使用
本章内容
4.1 定义函数 4.2 函数调用 4.3 匿名函数 4.4 函数的变量 本章小结

C语言程序设计课程大纲

C语言程序设计课程大纲

C语言程序设计课程大纲课程名称:C语言程序设计/ C Programming课程编号:241020课程属性:专业教育必修课授课对象:信息管理与信息系统专业本科生总学时/学分:64/4开课学期:第5学期执笔人:先修课程:大学计算机基础编写日期:一、课程概述C语言程序设计是商学院管理科学与工程专业的专业基础课之一。

课程系统、完整的讲述了C语言程序设计的基本思想和编程原理,在基础语法知识的基础上,重点讲解分支、循环等程序控制语句、以及函数、指针的运用,培养学生基本的程序设计思想和逻辑思维方式。

通过这门课程的学习,使学生掌握C语言程序设计的基本方法和技能,到达用计算机语言描述和解决现实世界中简单问题的能力,为面向对象程序设计、数据结构、管理信息系统、系统分析与设计等课程的学习奠定技术基础。

C programming is one of the specialized basic courses of management science and engineering. This course presents systematically basic ideas and programming principle of C programming, and focuses on the using of loop control, fiinction, pointer and training students' programming skill and logical thinking ability. By learning this course, the students should master the basic methods and skills of C programming, be able to use computer language to solve simple problems in the real world, and lay the technical foundation for studying the future courses, such as the object-oriented programming, data structure, management information system, system analysis and design.二、课程目标1.掌握C语言程序设计的基本思想和编程原理、常用的数据结构和基本算法;2.熟练使用分支、循环等语句进行程序设计;3.灵活运用数组、指针、字符串、函数等进行程序设计;4.掌握文件的操作与基本的输入输出处理,了解编程技术的现状与未来开展方向。

C_C++程序设计与上机指导004

C_C++程序设计与上机指导004
• ①函数语句方式。对无返回值函数的调用一般采用函数语句方式。 函数语句方式。对无返回值函数的调用一般采用函数语句方式。 • ②函数表达式方式。函数的调用出现在表达式中。这种情况一般是将函数的返回值赋给 函数表达式方式。函数的调用出现在表达式中。 一个变量。该方式为对有返回值函数的调用方式之一。 一个变量。该方式为对有返回值函数的调用方式之一。 • ③函数参数方式。函数调用作为一个函数的实参数出现。这种情况一般是将该函数的返 函数参数方式。函数调用作为一个函数的实参数出现。 回值作为另一个函数的实参进行传送。该方式为对有返回值函数的另一种调用方式。 回值作为另一个函数的实参进行传送。该方式为对有返回值函数的另一种调用方式。
2.函数声明 函数声明
一个函数在调用另一个函数之前要对被调函数进行声明,其目的是向编译系统提供必 一个函数在调用另一个函数之前要对被调函数进行声明, 要的信息。 存储类型、返回值类型等等。 要的信息。如:存储类型、返回值类型等等。 (1)函数声明的形式 函数声明的形式 (2)有关函数声明的说明 有关函数声明的说明
1.auto(自动 变量 自动)变量 自动 2.static(静态 变量 静态) 静态 3.register(寄存器 变量 寄存器) 寄存器 4.extern(外部扩展 变量 外部扩展)变量 外部扩展
Company Logo
4.3.2 变量的作用域
由前面的介绍, 由前面的介绍,我们已经知道函数中的形参变量只在被调用期间才分 配内存单元,调用结束立即释放。可见, 配内存单元,调用结束立即释放。可见,形参变量只有在该函数内才 有效,也就是说在程序某一部分,该变量是有定义的,可以被C编译 有效,也就是说在程序某一部分,该变量是有定义的,可以被 编译 和连接程序所识别。 用域。 和连接程序所识别。这种变量有效性的范围称变量的作 用域。 每个变量都有自己的作用域, 每个变量都有自己的作用域,其作用域与其定义语句在程序中出现的 位置有直接的关系,由此划分出局部变量和全局变量。 位置有直接的关系,由此划分出局部变量和全局变量。

第 4 章 四个作用域(scope)的用处

第 4 章 四个作用域(scope)的用处

1.了解四个作用域(scope)的用处。

2.了解el(Expression Language)。

4.1. 何为作用域先让我们看看效果:大概流程是这样的,我们访问04-01/index.jsp的时候,分别对pageContext, request, session, application四个作用域中的变量进行累加。

(当然先判断这个变量是不是存在,如果变量不存在,则要把变量初始化成1。

)计算完成后就从index.jsp执行forward跳转到test.jsp。

在test.jsp里再进行一次累加,然后显示出这四个整数来。

从显示的结果来看,我们可以直观的得出结论:1.page里的变量没法从index.jsp传递到test.jsp。

只要页面跳转了,它们就不见了。

2.request里的变量可以跨越forward前后的两页。

但是只要刷新页面,它们就重新计算了。

3.session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。

4.application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。

而作用域规定的是变量的有效期限。

1.如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。

从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

2.如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。

所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。

在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

3.如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。

所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1:分析下列程序的输出结果。
#include <iostream.h> void main() { double x,y; cout<<“Input double x and y:”; cin>>x>>y; double z=x+y; cout<<“x+y=”<<z<<endl; }
4.2.3 函数的引用调用(续)
int &fun(char, int &, int &) { if(cha>=„0‟&&cha<=„9‟) return n; else return c; }
4.3.1 函数参数的求值顺序
当一个函数带有多个参数时,C++语言没有规定函 数调用时实参的求值顺序; 编译器根据对代码进行优化的需要自行规定对实 参的求值顺序; 在实参中注意不要使用带有副作用的运算符,此 时可能产生二义性;
实现机制:系统将实参拷贝一个副本给形参(数 据值) ;
特点:形参值的改变不影响实参值;
4.2.2 函数的传值调用(续)
例4.3:分析下列程序的输出结果(传值调用)。 #include <iostream.h> 输出: void swap1(int x,int y) { x=9,y=5 int temp; a=5,b=9 temp=x; x=y; y=temp; cout<<"x="<<x<<", "<<"y="<<y<<endl; } void main() { int a(5),b(9); swap1(a,b); cout<<"a="<<a<<", "<<"b="<<b<<endl; }
4.2.2 函数的说明方法(续)
void fun2() { cout<<"It is in fun2. "<<endl; fun1(); cout<<"It is back in fun2. "<<endl; } void fun3() { cout<<"It is in fun3. "<<endl; } It is in main. It is back in fun1. 输 It is in fun2. It is back in fun2. It is in fun1. It is back in main. 出 It is in fun3.
产生二义性
可能的结果(按照编译器对实参求值顺序不同): 自左至右,两个实参的值分别为5和11; 自右至左,两个实参的值分别为5和10;
4.3.2 设置函数参数的默认值
C++中,在函数声明或定义时可以为一个或多个参 数指定缺省参数值; int add(int x,int y=10); 进行函数调用时,若未指定足够的实参,则编译 器将按从左向右的顺序用函数声明或定义中的缺省 值来补足所缺少的实参; add(15); add(15,10); 注意: 函数参数求值顺序与参数默认值补足顺序不同 参数求值顺序:由编译器决定求值方向; 参数默认值补足顺序:自左向右
例4.2:分析下列程序的输出结果。 #include <iostream.h> void fun1(),fun2(),fun3(); 函数原型声明 void main() { cout<<"It is in main. "<<endl; fun2(); cout<<"It is back in main. "<<endl; } void fun1() { cout<<"It is in fun1. "<<endl; fun3(); cout<<"It is back in fun1. "<<endl; }
4.1 函数的定义格式
改写4.1 #include <iostream.h> double sum_double(double x,double y){ return x+y;} void main() { double a,b; cout<<“Input double a and b:”; cin>>a>>b; double sum=sum_double(a,b); cout<<“sum=”<<sum<<endl; }
void main(){ int m=8; fun(a,m); cout<<a[7]<<endl; }
4.3.3 使用数组作为函数参数
4.3.2
设置函数参数的默认值(续)
在一个指定了缺省值的参数的右边,不能出现没 有指定缺省值的参数; void f(int x,int y=1,int z); 错误
例如:f(2,4); 理想:f(2,1,4),实际:z参数未被赋值
在给某个参数指定缺省值时,不仅可以是一个数 值,而且可以是任意复杂的表达式; int f(); …… void delay(int k,int time=f());
4.3.2
设置函数参数的默认值(续)
例4.9:分析下列程序的输出结果。 #include <iostream.h> int m(8); int add_int(int x,int y=7,int z=m); void main() { int a(5),b(15),c(20); int s=add_int(a,b); cout<<s<<endl; 输出: } 28 int add_int(int x,int y,int z){ return x+y+z; }
4.3.3 使用数组作为函数参数
例4.10:分析下列程序的输出结果。 #include <iostream.h> int a[8]={1,3,5,7,9,11,13};
void fun(int b[],int n){ for(int i=0;i<=n-1;i++) b[7]+=b[i]; }
void main(){ int m=8; fun(a,m); cout<<a[7]<<endl; }
4.2.3
函数的引用调用(C++特有)
引用调用的实现机制和特点 用法:调用函数的实参用变量名,被调用函数 的形参用引用;
实现机制:直接通过引用来改变实参的数据值; 特点:起到传址调用的作用,但比传址调用更 方便、更直接;
4.2.3 函数的引用调用(续)
例4.5:分析下列程序的输出结果(引用调用)。 #include <iostream.h> 输出: void swap3(int &x,int &y) { x=9,y=5 int temp; a=9,b=5 temp=x; x=y; y=temp; cout<<"x="<<x<<", "<<"y="<<y<<endl; } void main() { int a(5),b(9); swap3(a,b); cout<<"a="<<a<<", "<<"b="<<b<<endl; }
例4.7:由于使用对参数求值顺序不同的编译器造 成的二义性。
4.3.1 函数参数的求值顺序(续)
#include <iostream.h> int add(int x,int y) { return x+y; } void main() { int x(4),y(6); int z=add(++x,x+y); cout<<z<<endl; }
关于return语句的说明:
有返回值的return语句可以返回一个表达式的值, 从而实现函数之间的信息传递;
无返回值的函数必须用void说明其返回类型;
4.2.2 函数的传值调用
一、传值调用的分类 • 传值调用:传递变量本身的值(数据值); • 传址调用:传递变量的地址值; 二、传值调用的实现机制和特点 用法:调用函数的实参用常量、变量(数据)值 或表达式值,被调用函数的形参用变量;
4.2.4 函数的引用调用(续)
三种调用方式比较
传值调用 传址调用 实 常量、变量(数据) 地址值 参 值或表达式值 形 变量 指针 参 实现 实 参 拷 贝 一 个 副 形参指针直 机制 本给形参 接指向实参 特 形 参 的 变 化 不 影 形参的变化 点 响实参 影响实参 引用调用 变量名 引用 通过引用直 接指向实参 形参的变化 影响实参
4.2.2 函数的说明方法(函数的声明)
一、函数的说明原则 • 如果一个函数定义在先,调用在后,调用前可 以不必说明;
• 如果一个函数定义在后,调用在先,调用前 必须说明;
二、函数的说明方法(原型说明)
<类型> <函数名>(<参数表>);
三、示例 参数表中的参数 名称可以省略
4.2.2 函数的说明方法(续)
4.3.2
设置函数参数的默认值(续)
例4.8:分析下列程序的输出结果。 #include <iostream.h> void fun(int a=1,int b=3,int c=5) { cout<<"a="<<a<<", "<<"b="<<b<<", " <<"c="<<c<<endl; } void main() 输出: { a=1,b=3,c=5 fun(); a=7,b=3,c=5 fun(7); a=7,b=9,c=5 fun(7,9); fun(7,9,11); a=7,b=9,c=11 cout<<"OK! "<<endl; OK! }
相关文档
最新文档