Professional Documents
Culture Documents
函数的引 入: 做练习
【 Ex4_1_1 】输入 x ,求 sinx 的值 和 x 的平方根 。
【 Ex4_1_2 】输入 x , y ,求 它们 的最大 值。
【 Ex4_1_3 】输入 x , y , z, 调用求 最大 值的函 数求 其
最大 值。
【 Ex4_1_4 】输入 x , y ,调用 函数 求其最 大公 约数 。
【 Ex4_1_5 】输入 整数 m , 用判 素数函 数进 行判 别。
void PrintHead( ){
cout<<“********************”;
cout<<“* Example Table *”;
cout<<“********************”;
}
( 2 )有参 函数的 定义 格式:
《函 数返 回值类 型》 函数名 ( 形参列 表 ){…}
调用与 定义 要相匹 配。
函数 的调 用格式 :
函数 名 ( ) // 无参函 数
函数 名 ( 实参表 ) // 有参函数
调试【 例 5.1 】
5.1
结束
5.2 函数的形参、实参、返回值
和函数原型说明
1 函数的 形参和 实参
调用函 数相 当于代 公式 的过 程,实 参值带 入形 参进行
处理 。
例【 5.2 】实参 与形参 变量 的对应 关系 (p64-65)
2 函数的 返回值
函数值 返回 主调函 数的 唯一 途径: return 语句。语 句
格式 为
return ( 表达式 );
将表达 式的 值转换 为函 数返 回值类 型返回 给主 调函数
。
maxi(int a,int b){return a>b?a:b;}
float maxf(float x,float y){return x>y?x:y;}
void main(){
float x=3.4, y=5.6;
char c1=‘a’, c2=‘b’;
int i=20, j=30;
cout<<maxi(x,y)<<endl;
cout<<maxf(x,y)<<endl;
cout<<maxi(c1,c2)<<endl;
cout<<maxf(c1,c2)<<endl;
cout<<maxi(i+j,45+y)<<endl;
}
int maxf(float x,float y){return x>y?x:y;}
void main(){
float x=3.4, y=5.6;
cout<<maxi(x,y)<<endl;
}
问: 打印 结果是 ?
3 函数原 型说明
协调 “结 构化设 计的 思想” 与“先 定义 后调用 ”之 间
的矛 盾。 说明格 式即 函数头 ,但 可以 省略形参 名。
4 传值调 用
形参 和实 参的结 合方 式有传 值和传 引用 方式。 将实 参
值传 递给 形参变 量的 结合方 式称 为传值 调用。 请看 下例:
【 P68 例】 交换 变量值。
5 C++ 库函 数
C++ 定义 了许 多函数 ,并 分类定 义在不 同的 文件中 。
使用 库函 数必需 将定 义该函 数的 文件包 含在程 序头 部。
5.2
结束
void swap(float x,float y){
float t;
t=x; x=y; y=t;
}
void main(){
float a=40,b=70;
cout<<a<<‘\t’<<b<<endl;
swap(a,b);
cout<<a<<‘\t’<<b<<endl;
}
5.3 作用域和存储类
首先 了解 :程序 的内 存分配 。
1 作用域
( 1 )块作用 域
在块中 定义 的标识 符, 作用 域为该 块,即 只能 在这个
块中 使用 该变量 。例 如:
if(x>y){
int t;
t=x; x=y; y=t;
}
#include<iostream.h>
void locoal();
int i=10, j=20; // 全局变量
void main(){
int i=100,j=200,k=300; // 局部 变量
cout<<“i="<<i<<"\tj="<<j<<"\tk="<<k<<endl;
cout<<"::i="<<::i<<"\t::j="<<::j<<"\tk="<<k<<endl;
locoal();
cout<<"i="<<i<<"\tj="<<j<<"\tk="<<k<<endl;
}
void locoal(){
int i=1000,j=2000;
cout<<"i="<<i<<"\tj="<<j<<"\tk="<<k<<endl;
}
( 2 )函数作 用域
在函数 中定 义的标 识符 ,作 用域为 该函数 。实 际上函
数也 是一 个块, 因此 也属于 块作 用域。
( 3 )函数原 型作 用域
在函数 原型 中定义 的标 识符 ,作用 域仅在 函数 原型中
,故 变量 名可以 省略 。
局部 变量 ( 局部作用 域 ) 与 “栈”
块执 行开 始 / 结束时系 统自 动分配 / 释放空间 。
( 4 )文件作 用域
在函数 之外 定义的 标识 符, 具有文 件作用 域。
A柱 B柱 C柱
怎么找 出原 则性解 法?
对比另 一个问 题: 求 n !。
1 n0
n! 1 n 1
n*(n-1)! n 1
n! 用什么思 想求 出的?
——“ 大事化小 、小 事化了 ”。
fac(int n){
if(n==0) return 1;
else return n*fac(n-1);
}
演示【 例 5.4 】,说明 递归 程序的 执行 过程。
fac(int n){
cout<<n<<'\t';
int f;
if(n==0) f=1;
else f=n*fac(n-1);
cout<<f<<'\t';
return f;
}
递归函数 在调 用时包 含两 个过程 :“递 ”和 “归
”。
递——“ 大事 化小” ,最 终“了 ”在递 归终 止条
件。故 终止 条件必 须明 确, 否则将 导致无
穷递。
【例 5.5 】求 fibonacci 数列前 20 项。
5.4
结束
5.5 内 联 函数
1 内联函 数的作 用。
2 内联函 数的定 义。
5.5
结束
5.6 具有缺省参数的函数
一般情况 下函 数形参 和实 参个数 要一致 。但 有些情 况
下也 有不 一致的 。
一个程序 的完 整执行 流程 为:
源程序文件 编译 编译 目标文件
临时文件 库文件等
.cpp 预处理 .obj
连
接
运行 可执行文件
运行结果
.exe
编译预 处理 由系统 的编 译预 处理程 序完成 。编 译预处
理指 令全 部由 # 打头。
按照功 能, 编译预 处理 分为 宏定义 、文件 包含 和条件
编译 。
5.8.1 宏定义
5.8.2 文件包含
5.8.3 程序的多文 件组织
5.8.1 宏定义
宏定 义分 为不带 参宏 定义和 代参宏 定义 。
不带 参宏 定义格 式为 :
#define 宏名 标识 符 字 符或字 符串
例如 :
#define n 30
#define pai 3.14
带参 宏定 义格式 为:
#define 宏名 标识 符 ( 参数表 ) 使用参数 的字 符或
字符 串
例如 :
#define area(r) pai*(r)*(r)
#define s(a,b) (a)+(b)
请看练习 4_2 宏定 义。
5.8.1
结束
5.8.2 文件包含
文件 包含 是将被 包含 的文件 嵌入到 include 指令所 在
位置 。使 被包含 文件 成为编 译对 象的一 部分。 如库 函数的
使用 。
指令 格式 为 :
#include< 文件 名 .h> // 标准搜 索,用 于库文 件
或
#include” 文件名 .h” // 先搜 索当 前目录 ,用 于自定
义
// 库文 件
自定 义头 文件的 使用 。请看 一个练 习 self_head ,输出
100 - 200 之间的素 数。将 判断 素数的 函数 放在自 定义 头
文件 中。
关于 条件 编译, 请大 家自学 相关内 容。
5.8.2
结束
5.8.3 程序的多文件组织
第5
章结
束