函数的设计与应用part1省公开课一等奖全国示范课微课金奖PPT课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章 函数设计与应用
5.1 C++SP及OOP程序结构框架 5.2 函数定义与调用 5.3 函数应用实例 5.4 赋值参数、引用参数及函数参数默认值设置 5.5 函数递归 5.6 内联函数 5.7 数组参数及函数间传递数据五种惯用方式(渠道) 5.8 标识符作用域 5.9 变量与函数存放类别 5.10 编译预处理
. 在整个程序全部文件或多个文件中有效; . 在某一文件开头处(各函数外)进行定义(类 似于单文件级全局变量),而后在其它一个(或多 个)文件开头处(各函数外)使用extern存放类 别进行说明; . 按名共享数据(各文件函数内经过使用相同变 量名,来代表那同一数据项)。
9第9页
5.1.2 C++OOP面向对象程序设计程序 框架(Object-Oriented Programming)
main(){ ... //函数体 }
func_11(){ ... //函数体
}
...
func_1i(){ ... //函数体
}
4第4页
...... //源程序文件2 ~源程序文件n-1
file_n.cpp(源程序文件n,设共用了m个函数) func_n1(){
... //函数体 }
...
func_nm(){ ... //函数体
程序执行后交互结果以下: z=4.90618 Input a=10 f(a)=50
19第19页
程序编制:
#include <iostream.h> double f (double x){
double y; y=(x*x+x+1)/2-5.5; return (y);
//对非void类型函数,必须有一个 //return语句,由它返回函数值 }
3)关于return语句
return语句(称为返回语句)含有以下三种使用格式: return; return <表示式>; return ( <表示式> );
第一个格式return用于马上从被调函数中返回, 当函数类 型为void时,应使用这种格式返回语句。
当函数类型为非void型时,应使用第二或第三种格式 return语句,此两种格式语句效果完全相同(可将第二种格 式看成是第三种格式省略形式),系统此时都将计算出表示 式值,并“携带”该值马上从被调函数中返回。
2第2页
5.1.1 C++SP结构程序设计程序框架(Structured Programming)
以函数为关键,其程序主体为一批函数定义 集合。
一 个 大 C++ 之 SP 结 构 程 序 主 体 ( 没 使 用 类 class类型)普通格式为(设共用了n个源程序 文件):
3第3页
file_1.cpp (源程序文件1,设共用了i+1个函数)
cout<<"the result of first call to 'printStar()':"<<endl;
printStar();
//对printStar第一次调用
cout<<"the result of second call to 'printStar()':"<<endl;
printStar();
从函数形式划分,可分为无参函数与有 参函数两类。对无参函数来说,调用它们时不 需要提供实际参数;而对有参函数进行调用时, 必须提供所需个数且含有相匹配数据类型实际 参数。
13第13页
2. 函数定义普通形式
分为无参函数与有参函数两种形式。 (1)无参函数定义普通形式
<函数类型> <函数名> () { <语句1> ... <语句n>
//对printStar第二次调用
}
29第29页
点评:
(1)将printStar定为void类型,是因为不需要它返回 任何值。
(2)按语句方式调用printStar(而不可作为表示式因 子,如3+printStar()/2等)。
(3)printStar函数中return用于马上从被调函数中 返回到主调函数处(跳转到调用语句下一语句处)去执行, 当函数类型为void时,应使用这种无返回值return语句。 实际上,因为本函数是在执行完函数体内全部语句后才返回, 此种情况下return语句能够缺省。
22第22页
(3)三种不正确使用方法
① f=(x*x+x+1)/2-5.5; 不可给函数名f赋值。
② return (f); 返回值类型应该是double,而非指针类型(函 数名相当于一个指针)。 ③ f(x)=(x*x+x+1)/2-5.5; 赋值号左端非变量(也即f(x)非左值)。
23第23页
程序编制:
#include <iostream.h>
void printStar(int k){ //k为形参,由调用处实参提供实际值
经过调用处提供不一样实参值来计算出其对应函数值、或实 现某种与传递过来那些不一样值相关某种功效。比如:
void printStar(int k) { ... } 就自定义了一个叫做printStar含有1个int型形参k函数,比 如可用它来实现打印出一行共k个“*”自定义功效。
15第15页
3. 函数调用
6第6页
5.变量之作用域(有效区域)四个层次
(1)块级别局部变量 . 在以左花括号开始以右花括号结束块(如,一个 复合语句)内说明,仅在那一个块内有效。
(2)单函数级局部变量 . 在函数体内说明,仅在那一函数体内有效(注意, 同一函数体内局部变量不可重名;但不一样函数内局 部变量是能够重名,它们分配不一样数据空间,表示 不一样数据项)。
}
21第21页
点评:
1)main中共出现了4次对自定义函数f调用。
2)编写f函数时3点注意: (1)f函数体内3行也可用以下一行来代替
return ((x*x+x+1)/2-5.5); return句括号内表示式值,即为整个函数返回值。
(2)return句也可使用另一格式,即能够不括起表1)/2-5.5; //OK!
7第7页
(3)单文件级全局变量
. 在整个文件(全部函数)或文件某个范围(函数 集)内有效;
. 在各函数之外某一位置(通常在文件开头处)进行 说明;有效范围(作用域)从“说明点”开始直至文 件末尾;
. 按名共享数据(各函数内经过使用相同变量名,来 代表那同一数据项)。
8第8页
(4)多文件级全局变量
}
通惯用于实现某种固定功效。比如: void printStar() { ... }
就自定义了一个叫做printStar无参函数,比如可用 它来实现打印出一行共10个“*”固定功效。
14第14页
(2)有参函数定义普通形式
<函数类型> <函数名>( <以逗号分割形参类型及名字表>){ <语句1> ... <语句n> }
编无参函数,void printStar(),它负责完成 固定功效:在同一行连续显示60个“*”。并编制 主函数main,对该函数实现调用,使程序执行后显 示结果以下:
the result of first call to 'printStar()': ************************************************************ the result of second call to 'printStar()': ************************************************************
在C++程序中,除main函数外,其它任一函 数执行都是经过在main函数中直接或间接地调用 该函数而引发。调用一个函数就是去执行该函数 之函数体过程。
对无参函数进行调用普通形式为: <函数名>()
比如:printStar();
16第16页
对有参函数进行调用普通形式为:
<函数名> ( <以逗号分割实参表> )
30第30页
4. 实例4 -- 一参函数
编一参函数,void printStar(int k),它负 责显示出k行“*”来,其中每行均显示连续8个 “*”。并编制主函数main,对该函数实现调用, 使程序执行后显示结果样式以下: k=? 3 ******** ******** ********
31第31页
比如:printStar(26);
其中实参表在参数个数、参数次序、以及参数类型 等方面要与被调函数形参表之间有一个一一对应相 互匹配关系。编译器将依据参数次序,来逐一实现 实参加对应形参“结合”,而后执行一遍函数体( 而完成此次函数调用)。
17第17页
4. 关于函数原型
当函数调用从书写次序上先于函数定义时, C++要求必须事先列出这一函数函数原型。 (1)无参函数定义函数原型
<函数类型> <函数名> (); (2)有参函数定义函数原型
<函数类型> <函数名> ( <以逗号分割形参类型 及名字表或仅形参类型表> );
注意,与函数定义普通形式相比,相当于用分号 代换了函数体,而成为其对应函数原型。
18第18页
5.3 函数应用实例
1. 实例1 -- 无须给出函数f原型
设 f(x) = (x*x+x+1)/2-5.5。 (1)求z = (f(2.5)+2*f(6))/f(4.3),并显示结果z。 (2)对任意输入一个实数a,求出f(a)并显示。
24第24页
2. 实例2 -- main在前而被调函数f 在后时,必须先列出函数f原型
设 f(x) = (x*x+x+1)/2-5.5。 (1)求z = (f(2.5)+2*f(6))/f(4.3),并显示结果z。 (2)对任意输入一个实数a,求出f(a)并显示。
程序执行后交互结果以下: z=4.90618 Input a=10 f(a)=50
以类(class)为关键,其程序主体 为一批类定义集合。
详见第7章。
10第10页
5.2 函数定义与调用 -- 参看书p1175.2节
1. 函数分类 . 从使用角度分类 . 从函数形式分类
11第11页
(1)从使用角度分类
从使用角度划分,可将函数分为:系统预定义标准 库函数(如,sin,abs等),以及由用户自定义函 数。
1第1页
5.1 C++SP及OOP程序结构框架 -- 参看书p382.4.1小节及p462.4.3小节
5.1.1 C++SP结构程序设计程序框架 (Structured Programming)
5.1.2 C++OOP面向对象程序设计程序 框 架 ( Object-Oriented Programming)
27第27页
程序编制:
#include <iostream.h> void printStar(){ //自定义无参函数printStar
for(int i=1; i<=60; i++) //显示60个“*” cout<<"*";
cout<<endl; return; }
28第28页
void main(){
函数的设计与应用51c的sp及oop程序结构框架52函数的定义与调用53函数应用实例54赋值参数引用参数及函数参数默认值的设置55函数的递归56内联函数57数组参数及函数间传递数据的五种常用方式渠道58标识符的作用域59变量与函数的存储类别510编译预处理51c的sp及oop程序结构框架参看书p38的241小节及p46的243小节511c的sp结构程序设计程序框架structuredprogramming512c的oop面向对象程序设计程序框架objectorientedprogramming511c的sp结构程序设计程序框架structuredprogramming以函数为核心其程序主体为一批函数定义的集合
程序中可直接使用(调用)系统预定义标准库函数, 但要求在调用前使用编译预处理指令include将对应 头文件包含进来。
由用户自定义函数与系统预定义标准库函数不一样 点在于,自定义函数函数名、参数个数、函数返回 值类型以及函数所实现功效等都完全由用户程序来 要求(指定)。
12第12页
(2)从函数形式分类
}
5第5页
使用关键点:
1.有且仅有一个main函数,从它开始执行, 它结束则整个程序结束。
2.除main函数外,还可设计任意多个自定 义函数,并可将它们划分存放于1至若干个源程 序文件中。
3.各函数“级别”相同,可相互调用,但不 可调main。
4.除上述主体部分外,如有必要,还可在函 数之外加入全局量说明及编译预处理指令等。
25第25页
程序编制:
#include <iostream.h> double f (double x);
//函数f原型
void main(){ …
}
//同上,从略
double f (double x) { …
}
//被调函数f详细定义 //同上,从略
26第26页
3. 实例3 -- 无参函数,实现固定功效
20第20页
void main(){
double z,a;
z=(f(2.5)+2*f(6))/f(4.3); //调用自定义函数f
cout<<"z="<<z<<endl;
cout<<"Input a=";
//提醒用户输入
cin>>a;
cout<<"f(a)="<<f(a)<<endl; //算出f(a)并输出
5.1 C++SP及OOP程序结构框架 5.2 函数定义与调用 5.3 函数应用实例 5.4 赋值参数、引用参数及函数参数默认值设置 5.5 函数递归 5.6 内联函数 5.7 数组参数及函数间传递数据五种惯用方式(渠道) 5.8 标识符作用域 5.9 变量与函数存放类别 5.10 编译预处理
. 在整个程序全部文件或多个文件中有效; . 在某一文件开头处(各函数外)进行定义(类 似于单文件级全局变量),而后在其它一个(或多 个)文件开头处(各函数外)使用extern存放类 别进行说明; . 按名共享数据(各文件函数内经过使用相同变 量名,来代表那同一数据项)。
9第9页
5.1.2 C++OOP面向对象程序设计程序 框架(Object-Oriented Programming)
main(){ ... //函数体 }
func_11(){ ... //函数体
}
...
func_1i(){ ... //函数体
}
4第4页
...... //源程序文件2 ~源程序文件n-1
file_n.cpp(源程序文件n,设共用了m个函数) func_n1(){
... //函数体 }
...
func_nm(){ ... //函数体
程序执行后交互结果以下: z=4.90618 Input a=10 f(a)=50
19第19页
程序编制:
#include <iostream.h> double f (double x){
double y; y=(x*x+x+1)/2-5.5; return (y);
//对非void类型函数,必须有一个 //return语句,由它返回函数值 }
3)关于return语句
return语句(称为返回语句)含有以下三种使用格式: return; return <表示式>; return ( <表示式> );
第一个格式return用于马上从被调函数中返回, 当函数类 型为void时,应使用这种格式返回语句。
当函数类型为非void型时,应使用第二或第三种格式 return语句,此两种格式语句效果完全相同(可将第二种格 式看成是第三种格式省略形式),系统此时都将计算出表示 式值,并“携带”该值马上从被调函数中返回。
2第2页
5.1.1 C++SP结构程序设计程序框架(Structured Programming)
以函数为关键,其程序主体为一批函数定义 集合。
一 个 大 C++ 之 SP 结 构 程 序 主 体 ( 没 使 用 类 class类型)普通格式为(设共用了n个源程序 文件):
3第3页
file_1.cpp (源程序文件1,设共用了i+1个函数)
cout<<"the result of first call to 'printStar()':"<<endl;
printStar();
//对printStar第一次调用
cout<<"the result of second call to 'printStar()':"<<endl;
printStar();
从函数形式划分,可分为无参函数与有 参函数两类。对无参函数来说,调用它们时不 需要提供实际参数;而对有参函数进行调用时, 必须提供所需个数且含有相匹配数据类型实际 参数。
13第13页
2. 函数定义普通形式
分为无参函数与有参函数两种形式。 (1)无参函数定义普通形式
<函数类型> <函数名> () { <语句1> ... <语句n>
//对printStar第二次调用
}
29第29页
点评:
(1)将printStar定为void类型,是因为不需要它返回 任何值。
(2)按语句方式调用printStar(而不可作为表示式因 子,如3+printStar()/2等)。
(3)printStar函数中return用于马上从被调函数中 返回到主调函数处(跳转到调用语句下一语句处)去执行, 当函数类型为void时,应使用这种无返回值return语句。 实际上,因为本函数是在执行完函数体内全部语句后才返回, 此种情况下return语句能够缺省。
22第22页
(3)三种不正确使用方法
① f=(x*x+x+1)/2-5.5; 不可给函数名f赋值。
② return (f); 返回值类型应该是double,而非指针类型(函 数名相当于一个指针)。 ③ f(x)=(x*x+x+1)/2-5.5; 赋值号左端非变量(也即f(x)非左值)。
23第23页
程序编制:
#include <iostream.h>
void printStar(int k){ //k为形参,由调用处实参提供实际值
经过调用处提供不一样实参值来计算出其对应函数值、或实 现某种与传递过来那些不一样值相关某种功效。比如:
void printStar(int k) { ... } 就自定义了一个叫做printStar含有1个int型形参k函数,比 如可用它来实现打印出一行共k个“*”自定义功效。
15第15页
3. 函数调用
6第6页
5.变量之作用域(有效区域)四个层次
(1)块级别局部变量 . 在以左花括号开始以右花括号结束块(如,一个 复合语句)内说明,仅在那一个块内有效。
(2)单函数级局部变量 . 在函数体内说明,仅在那一函数体内有效(注意, 同一函数体内局部变量不可重名;但不一样函数内局 部变量是能够重名,它们分配不一样数据空间,表示 不一样数据项)。
}
21第21页
点评:
1)main中共出现了4次对自定义函数f调用。
2)编写f函数时3点注意: (1)f函数体内3行也可用以下一行来代替
return ((x*x+x+1)/2-5.5); return句括号内表示式值,即为整个函数返回值。
(2)return句也可使用另一格式,即能够不括起表1)/2-5.5; //OK!
7第7页
(3)单文件级全局变量
. 在整个文件(全部函数)或文件某个范围(函数 集)内有效;
. 在各函数之外某一位置(通常在文件开头处)进行 说明;有效范围(作用域)从“说明点”开始直至文 件末尾;
. 按名共享数据(各函数内经过使用相同变量名,来 代表那同一数据项)。
8第8页
(4)多文件级全局变量
}
通惯用于实现某种固定功效。比如: void printStar() { ... }
就自定义了一个叫做printStar无参函数,比如可用 它来实现打印出一行共10个“*”固定功效。
14第14页
(2)有参函数定义普通形式
<函数类型> <函数名>( <以逗号分割形参类型及名字表>){ <语句1> ... <语句n> }
编无参函数,void printStar(),它负责完成 固定功效:在同一行连续显示60个“*”。并编制 主函数main,对该函数实现调用,使程序执行后显 示结果以下:
the result of first call to 'printStar()': ************************************************************ the result of second call to 'printStar()': ************************************************************
在C++程序中,除main函数外,其它任一函 数执行都是经过在main函数中直接或间接地调用 该函数而引发。调用一个函数就是去执行该函数 之函数体过程。
对无参函数进行调用普通形式为: <函数名>()
比如:printStar();
16第16页
对有参函数进行调用普通形式为:
<函数名> ( <以逗号分割实参表> )
30第30页
4. 实例4 -- 一参函数
编一参函数,void printStar(int k),它负 责显示出k行“*”来,其中每行均显示连续8个 “*”。并编制主函数main,对该函数实现调用, 使程序执行后显示结果样式以下: k=? 3 ******** ******** ********
31第31页
比如:printStar(26);
其中实参表在参数个数、参数次序、以及参数类型 等方面要与被调函数形参表之间有一个一一对应相 互匹配关系。编译器将依据参数次序,来逐一实现 实参加对应形参“结合”,而后执行一遍函数体( 而完成此次函数调用)。
17第17页
4. 关于函数原型
当函数调用从书写次序上先于函数定义时, C++要求必须事先列出这一函数函数原型。 (1)无参函数定义函数原型
<函数类型> <函数名> (); (2)有参函数定义函数原型
<函数类型> <函数名> ( <以逗号分割形参类型 及名字表或仅形参类型表> );
注意,与函数定义普通形式相比,相当于用分号 代换了函数体,而成为其对应函数原型。
18第18页
5.3 函数应用实例
1. 实例1 -- 无须给出函数f原型
设 f(x) = (x*x+x+1)/2-5.5。 (1)求z = (f(2.5)+2*f(6))/f(4.3),并显示结果z。 (2)对任意输入一个实数a,求出f(a)并显示。
24第24页
2. 实例2 -- main在前而被调函数f 在后时,必须先列出函数f原型
设 f(x) = (x*x+x+1)/2-5.5。 (1)求z = (f(2.5)+2*f(6))/f(4.3),并显示结果z。 (2)对任意输入一个实数a,求出f(a)并显示。
程序执行后交互结果以下: z=4.90618 Input a=10 f(a)=50
以类(class)为关键,其程序主体 为一批类定义集合。
详见第7章。
10第10页
5.2 函数定义与调用 -- 参看书p1175.2节
1. 函数分类 . 从使用角度分类 . 从函数形式分类
11第11页
(1)从使用角度分类
从使用角度划分,可将函数分为:系统预定义标准 库函数(如,sin,abs等),以及由用户自定义函 数。
1第1页
5.1 C++SP及OOP程序结构框架 -- 参看书p382.4.1小节及p462.4.3小节
5.1.1 C++SP结构程序设计程序框架 (Structured Programming)
5.1.2 C++OOP面向对象程序设计程序 框 架 ( Object-Oriented Programming)
27第27页
程序编制:
#include <iostream.h> void printStar(){ //自定义无参函数printStar
for(int i=1; i<=60; i++) //显示60个“*” cout<<"*";
cout<<endl; return; }
28第28页
void main(){
函数的设计与应用51c的sp及oop程序结构框架52函数的定义与调用53函数应用实例54赋值参数引用参数及函数参数默认值的设置55函数的递归56内联函数57数组参数及函数间传递数据的五种常用方式渠道58标识符的作用域59变量与函数的存储类别510编译预处理51c的sp及oop程序结构框架参看书p38的241小节及p46的243小节511c的sp结构程序设计程序框架structuredprogramming512c的oop面向对象程序设计程序框架objectorientedprogramming511c的sp结构程序设计程序框架structuredprogramming以函数为核心其程序主体为一批函数定义的集合
程序中可直接使用(调用)系统预定义标准库函数, 但要求在调用前使用编译预处理指令include将对应 头文件包含进来。
由用户自定义函数与系统预定义标准库函数不一样 点在于,自定义函数函数名、参数个数、函数返回 值类型以及函数所实现功效等都完全由用户程序来 要求(指定)。
12第12页
(2)从函数形式分类
}
5第5页
使用关键点:
1.有且仅有一个main函数,从它开始执行, 它结束则整个程序结束。
2.除main函数外,还可设计任意多个自定 义函数,并可将它们划分存放于1至若干个源程 序文件中。
3.各函数“级别”相同,可相互调用,但不 可调main。
4.除上述主体部分外,如有必要,还可在函 数之外加入全局量说明及编译预处理指令等。
25第25页
程序编制:
#include <iostream.h> double f (double x);
//函数f原型
void main(){ …
}
//同上,从略
double f (double x) { …
}
//被调函数f详细定义 //同上,从略
26第26页
3. 实例3 -- 无参函数,实现固定功效
20第20页
void main(){
double z,a;
z=(f(2.5)+2*f(6))/f(4.3); //调用自定义函数f
cout<<"z="<<z<<endl;
cout<<"Input a=";
//提醒用户输入
cin>>a;
cout<<"f(a)="<<f(a)<<endl; //算出f(a)并输出