《C语言程序设计》第五章 函数

合集下载

C语言程序设计教程(第5章 函数)

C语言程序设计教程(第5章 函数)

22
信息科学与工程学院
作用域(可用域)与生存期
C语言中定义的变量都有一个起作用的范 围,称为变量的作用域。 程序运行时,变量被创建和被删除的时间 段,称为变量的生存期。
23
信息科学与工程学院
局部变量和全局变量
在一个函数内部定义的变量是内部变量, 它只在本函数内部范围内有效。也就是说 只有在本函数内才能使用它们。这些变量 称为“局部变量”。 在函数之外定义的变量称为外部变量,也 称为全局变量,在文件内的所有函数都能 使用它。它的有效范围为从定义变量的位 置开始到文件的结束。
4
信息科学与工程学院
5.1 问题的提出
C语言程序是由什么构成的? 函数 什么是函数?
能完成特定功能的功能块; 一般有输入参数 和返回值; 一次定义,可以调用多次。
一个C语言程序为什么需要不同的函数?
一个函数过大难于编写和维护; 一个函数的程序不利于协作; 代码和功能共享的需要。
5
信息科学与工程学院
6. 函数调用举例分析(见下页)
15
信息科学与工程学院
实参到形参是单向值传递 例2 求两个整数中的最大值
int max(int x,int y) /*函数定义*/ { int temp; if (x>y) temp=x; else temp = y; COPY return temp; } void main() { int a,b; scanf("%d,%d",&a,&b); a = max(a,b); /*函数调用*/ printf("\n max= %d \n",a); }
2
信息科学与工程学院
第5章 函数
本章需要掌握的知识点: 函数定义 函数说明 函数调用 形参和实参的关系 变量的存储类别

C语言程序设计第五章

C语言程序设计第五章
通过编写程序,实现对数组的访问、修改 、排序等操作。例如,实现一个程序,将 一个数组中的所有元素进行排序,或者找 到数组中的最大值和最小值。
05 案例分析
案例一:条件语句在程序中的应用
总结词
条件语句是C语言中用于根据不同条件执行不同操作的语句,通过if、else if和else关键 字实现。
详细描述
编程练习二:循环语句应用
总结词
理解并掌握while和for循环的使用
详细描述
通过编写程序,实现重复执行某段代 码直到满足特定条件,或者根据需要 重复执行某段代码指定次数。例如, 计算1到100的累加和,或者打印出0 到99的所有偶数。
编程练习三:数组操作应用
总结词
理解并掌握数组的基本操作
VS
详细描述
详细描述
数组在程序中用于存储和处理同一种类型的 数据元素,例如存储一组学生的成绩、计算 一组数据的平均值等。数组操作包括数组的 声明、初始化、访问和修改等。通过循环语 句可以方便地遍历数组元素并进行处理。数 组操作在程序中具有广泛的应用,是C语言
中重要的数据结构和算法之一。
06 总结与展望
本章总结
详细描述
C语言中的数组是一种存储相同类型元素的线性数据结构。可以通过索引访问数 组元素,进行赋值、交换、排序等操作。同时,C语言还提供了字符串操作函数, 如strcpy、strcat、strlen等。
语法点三:数组操作
01
示例代码
02
```c
int array[10]; // 声明一个包含10个整数的数组
详细描述
循环语句在程序中用于重复执行一段代码, 例如打印1到10的数字、计算一定数量的累 加和等。循环语句可以嵌套使用,以实现更 复杂的循环结构和算法。循环语句通常与条 件语句结合使用,以控制循环的执行条件和 次数。

C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第五章 课后答案

C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第五章 课后答案
void main()
{
double e,x,cos;
printf("Enter two numbers e and x :"); /*输入两个数e,x */
scanf("%lf%lf",&e,&x);
cos=funcos(e,x); /*调用函数funcos */
printf("The result of cos(%lf) is %lf.\n",x,cos);
printf("sign(%lf)=%d\n",x,y); /*输出x的符号*/
}
int sign(double x) /*定义函数sign */
{
int y;
if(x>0)y=1;
else if(x==0)y=0;
else y=-1;
return y;
}
练习5-2
#include <stdio.h>
#include <stdio.h>
int even(int n); /*声明函数even */
void main()
{
int num,sum=0;
printf("Enter the first number :"); /*输入第一个数*/
scanf("%d",&num);
while(num>0)
{
{
int i,j;
for(i=1;i<=n;i++) /*共n行金字塔*/
{
for(j=1;j<=n-i;j++)printf(" "); /*输出每行左边的空格*/

《C语言程序设计课件》第五章—函数

《C语言程序设计课件》第五章—函数
这里的表达式有时是常量或变量,有时是复杂 的表达式。return语句返回表达式的值。
float average(float a, float b) {
float c; c=(a+b)/2; return c; }
float average(float a, float b) {
return (a+b)/2; }
如果return语句中表达式的类型和在函数首部 指定的返回值类型不一致,那么系统会把表达 式的类型隐式转换成返回值类型。例如: int ave(float a, float b) { float c; c=(a+b)/2; return c; } 例如函数调用ave(1.0,2.0)的返回结果为1。
a3
b4
【例5-2】显示提示信息 /* 程序5-2 */ #include <stdio.h> void showinfo( ) {
printf(“This is a minus.\n”); } int main( ) {
int a,b; scanf(“%d%d”,&a,&b); if(a<0) showinfo( ); if(b<0) showinfo( ); return 0; }
swap(a, b);
printf("a=%d,b=%d\n", a, b);
}
程序执行过程如下: ①main函数定义变量a、b并初始化。
a3
b4
②main函数调用函数swap,实参a、b将值传 递给形参x、y。
a3
3x
b4
4y
③swap函数交换x、y的值。
4x
3y
④返回main函数,输出a、b的值,a、b的值 没有改变。

第5章 函数与带参数宏 《C语言程序设计及应用教程》课件-PPT课件

第5章 函数与带参数宏  《C语言程序设计及应用教程》课件-PPT课件

5.2 函数的嵌套与递归调用
函数的嵌套调用
不允许嵌套定义,函数间平行的、独立。 C中的函数:
允许嵌套调用。
main( ) 调用函数a 结束
a函数
调用函数b
b函数
【例5-7】 输入两个整数,求平方和
#include <stdio.h>
int fun1(int x,int y)
int fun1(int x,int y);
斐波那契数列");
for(i=0;i<N;i++)
{
printf("%d\t",iF[i]);
if((i+1)%10==0)
printf("\n");
}
printf("\n");
}
int Sum(int iF[],int n); void main() { int i,Fibonacci[N],m,n; //生成斐波那契数列 CreateFibonacci(Fibonacci); //输出斐波那契数列 PrintFibonacci(Fibonacci); //求数列前n项的和 printf(" 请输入要求和的项数 n(n<%d): ",N); scanf("%d",&n); m=Sum(Fibonacci,n); printf("\n 斐波那契数列前 %d项的和:%4d\n",n,m);}
第5章 函数与带参数宏 ?C语言 程序设计及应用教程?课件
5.1 函数的声明、定义与调用
5.1.1 函数的声明与定义 5.1.2 函数调用 5.1.3 函数参数传递 5.1.4 主函数中的参数

《C语言程序设计》教案 第五章 函数

《C语言程序设计》教案 第五章 函数
难点:指针、数组和函数的配合使用。
讲课进程和时间分配:
(1)指针、数组和函数的配合使用典型例题分析(40分钟);
(2)变量的作用域分析,变量的存储分类(15分钟);
(3)函数的嵌套调用(30分钟)
(4)习题布置和下一节内容提要(1分钟)
讨论、思考题、作业:
实验指导书习题
参考资(含参考书、文献等):
难点:函数的传址调用。
讲课进程和时间分配:
(1)数组名作为函数参数的典型例题分析(30分钟);
(2)指针作为函数参数时的典型例题分析(40分钟);
(3)学生练习(15分钟)
(4)总结、习题布置和下一节内容提要(5分钟)
讨论、思考题、作业:
实验指导书习题
参考资料(含参考书、文献等):
叶斌陈世强. C语言程序设计.北京:科学出版社
2
授课时间
教学目的和要求(分掌握、熟悉、了解三个层次):
3.熟练掌握变量的作用域和存储类别的知识;
4.掌握指针和数组与函数的配合使用;
5.掌握函数的嵌套调用。
教学内容(包括基本内容、重点、难点):
基本内容:指针和数组作为函数参数;变量作用域和存储类别;函数的嵌套调用;
重点:函数的使用方法、函数的嵌套调用;
重点:函数定义方法、函数调用方法、函数参数传递方法、返回值的使用和类型确定;
难点:函数调用方法、函数参数传递方法。
讲课进程和时间分配:
(1)模块化程序结构的概念、C语言程序结构回顾(5分钟);
(2)函数调用简单例子分析(10分钟);
(3)函数的定义方法(三种有参、无参、空函数)(10分钟)
(4)函数参数和函数值(参数传递方法、参数类型对应关系、函数返回值的含义、返回值的类型等)(20分钟)

C语言程序设计-第5章--函数

C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }

c语言程序设计5(函数)

c语言程序设计5(函数)

参数的传递
1. 函数调用时,被调函数中的形参被分配 临时的存储单元,实参的值赋给形参变量 2. 实参可以是常量、变量或表达式 3. 实参的个数、类型和顺序必须与形参一致 4. 形参与实参各占一个独立的存储空间,调 用结束后,形参单元被释放
形参值的改变不会影响实参-----值传递
例:P134 main( ) { int v1=10, v2=20; printf(“v1=%d v2=%d\n”,v1,v2); printf(“_ do swap _\n”); swap(v1,v2); printf(“v1=%d v2=%d\n”,v1,v2); } void swap(int x, int y) { int temp; v1=10 v2=20 temp=x; _ do swap _ x=y; y=temp; v1=10 v2=20 }
自定义函数的应用实例
P136 例3:输出“九 九表”。 它是一个
9行9列的二维表格,
加上一个行标题和一
个列标题,显示出来
应该是10行10列。
#include <stdio.h> void drawLine(int n,char ch); /* 连续显示n个ch字符 */ main() { int i,j; printf("\n 9.9 table\n"); /* 显示表名 */ drawLine(30, '='); /* 显示每列的标题 */ printf("\n 1 2 3 4 5 6 7 8 9"); drawLine(30, '='); for (i=1; i<=9; i++) { /* 显示每行的内容 */ printf("\n%3d", i); for (j=1; j<=9; j++) printf("%3d", i*j); if (i<9) drawLine(30, '-'); else drawLine(30, '='); } void drawLine(int n, char ch) /*连续显示n个ch字符*/ } { int i; putchar('\n'); /*换行*/ for (i=1; i<=n; i++) putchar(ch); /*连续显示n个字符ch*/ }

C语言完整函数教程

C语言完整函数教程
最新课件
提纲
24
5.2.3 函数的调用
• 函数是一段封装的代码,能完成预定好的、独 立的任务,能被其他函数所调用。那么,如何 调用一个函数?
• 函数的调用和执行的实质是控制转移,调用函
数时,将控制转到被调用的函数,被调函数执
行结束时,则将控制转回主调函数,继续执行
后续的操作 。 主主程函序数
①②
子子函程数序1
Y
素数 N
– 求一个整数的逆数:该 功能在判断一个整数是 否回文数中也被用到;
输出num num=num+1
– 判断一个数是否素数: 该功能在对整数进行素 数分解中用到。
求可逆素数
最新课件
4
5.1 子程序设计
• 能否将完成上述独立功能的代码包装成一个单 元,并且可以供其他代码来调用?--答案是可 以使用子程序
int x;
4. 把收转的换参后数的个实际数参、数参(数实类参)的
}
for (x = 1; x <= 10; x++)实参 printf(“%4d”,square(2 * x)); 5. 形参 函数调用 6.
值型送和入参形数式顺参数序(,形编参译)器中。
运用行函调数用原函型数中校的验语函句数;调 用是否正确。
最新课件 3
5.1 子程序设计
numß 1000;
num≤9999 判断num是否素数
Y
num是素数 N
计算num的逆数reverseNum
• 本程序中判断素数的代码 会出现两次;
• 判断素数、求整数逆数这 两个功能是独立的功能, 且在多个程序中都有可能 用到:
判断reverseNum是否素数
reverseNum是

《C语言程序设计》第五章 函数

《C语言程序设计》第五章 函数

在执行过程中,每递归 调用一次,就引用一组 全新的自动变量,完全 独立于上层调用的变量 ,即各层递归调用的变 量各自独立。可插入一 个打印语句给以证明。
运行结果: n=123 n=12 n=1 123
5.7 变量的存储类型及其作用域
C程序中每一个变量和函数都有两个属性:
数据类型和存储类别。
char short int 数据类型确定 数据的存放形式 、值域及允许的 运算等。
个限定词,以限制函数的调用范围。省略存储类别隐 指外部函数,可供其它文件中的函数调用;静态函数 只能被本程序文件的函数调用。
提示: 在定义和说明变量时,应按照变 量的作用范围以及它们在存储单元 中保持值的时间长短的需要,对它 们的存储类别进行说明限定。
(1) 局部变量及其作用域
函数内部定义的变量统称为局部变量 ,包括形参变量,由于存放在动态区, 故也称为动态变量。
三点说明:
若不返回值,则用void类型定义函数。 void printmessage( ){ „„ }
5.3 函数的返回值与函数类型说明
函数的类型应与return中的表达式类 型一致,函数类型决定返回值的类型
三点说明:
一个函数可以有多个return语句。可采用形式: return(表达式); return; //带值返回 //不带值返回
5.3 函数的返回值与函数类型说明
函数的类型应与return中的表达式类 型一致,函数类型决定返回值的类型
三点说明:
若return后面括号中的表达式为非整型,则必须在 函数名前冠以函数的类型说明。函数类型决定返回值 的类型。
5.3 函数的返回值与函数类型说明
函数的类型应与return中的表达式类 型一致,函数类型决定返回值的类型

C程序设计(第四版)第5章 函数

C程序设计(第四版)第5章 函数

5.3 变量的作用域与存储属性
4、寄存器变量(register):存放在寄存器中 的局部变量称为寄存器变量。寄存器变量定义 格式如下: register 数据类型 变量名;
变量存放在寄存器中,其处理速度要比存放在内存 中的自动变量快得的多。 受硬件的影响,寄存器变量的数目很有限。 并不是所有变量都可以定义为寄存器变量,只有局 部变量,并且只能是int,char等类型的变量才能定 义成寄存器变量。 寄存器变量的作用域与自动变量相同。
5.1 函数的定义
5.1.2 函数的定义
函数定义就是确定该函数完成什么功能,函数 定义的一般格式如下: 函数类型 函数名(形式参数表) /*函数首部*/ { /*函数体*/ 数据定义语句序列; 执行语句序列; }
说明: 1、函数首部 (1)函数类型:指本函数返回值的数据类型,可以是C语言 中规定的各种类型。有的函数并不需要返回值,这时可以 用类型标识void明确表示该函数无返回值。默认的返回值 类型是int。 (2)函数名:必须是一个合法的标识符 (3)形式参数表:定义函数时的参数称为形式参数,简称 形参。形参表中,可以没有参数,也可以有多个参数。如 果没有参数,这样的函数叫做无参函数,相反则称为有参 函数,当有多个参数时,参数之间用逗号隔开,并且须分 别说明参数的类型。 2、函数体 (1)函数体由位于最外层的一对大括号标识。函数体用以 实现函数的功能。 (2)return语句:用以返回函数的值,其格式为: return 表达式; 或者 return (表达式)
p,q的作用范围
c1,c2的作用范围
5.3 变量的作用域与存储属性
5.3.2 变量的存储属性
变量的存储属性是从时间的角度研究变量的生命周期, 它是指在程序运行期间变量的存在期限。 从变量的生命周期来看,有两种存储属性:静态存储和 动态存储。静态存储是指在程序运行期间,分配固定的 存储空间;动态存储是指在程序运行期间,根据需要进 行动态分配存储空间。 在定义一个变量时,其实不仅需要说明其数据类型,还 应说明其存储属性。所以定义一个变量的完整格式应该 是: [存储属性] 数据类型 变量名1[,变量名2,„,变量名n];

C语言教程第5章函数

C语言教程第5章函数

C语言教程第5章函数
C语言支持函数式编程方法,允许在程序中使用函数来撰写代码,函
数可以使程序模块化,把大的程序分解成小的功能块,使代码可复用,提
高程序的可读性和可维护性。

本章主要介绍C语言中函数的基本概念、声明及使用方法,以及函数
的参数传递和返回值。

1.函数概念及声明
在C语言中,我们可以定义函数来实现其中一种特定功能,它可以接
收参数,并返回一个结果。

在定义函数时,需要指定函数的返回值类型、
函数名及参数列表:
return_type function_name (parameter_list)
//函数代码
其中,返回值类型(return_type)可以是任意的C语言数据类型,
函数名(function_name)要求必须是唯一的,参数列表
(parameter_list)是由括号内的参数名和参数类型组成的,用逗号分隔。

2.函数调用
定义完函数后可以在程序中使用它,函数调用的格式为:
return_type function_name (parameter_list)
其中,return_type是函数的返回值类型,function_name是函数名,parameter_list是参数列表,这里用实际的参数替换参数列表。

3.函数参数传递
在C语言中,参数传递有三种方式:传值调用,传地址调用和传指针调用。

(1)传值调用
传值调用是最常见的参数传递方式,也是默认的参数传递方式。

四川大学《c语言程序设计》课件-第5章 函数

四川大学《c语言程序设计》课件-第5章 函数

用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列 可执行语句序列 return ;
}
return语句后无需 任何表达式
【例】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
函数定义(Function definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数出口
返回运算的结果
函数定义(Function definition)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算 –计算类,如打印阶乘表的程序…… –判断推理类,如排序、查找……
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程 序会成什么样子?
–实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
C程序的存储类别 – auto型(自动变量) – static型(静态变量) – extern型(外部变量) – register型(寄存器变量)
变量的存储类型( Storage Class)
变量的生存期(Lifetime )
The lifetime of a variable is the period of time during which memory is allocated to the variable

C语言第五章 函数

C语言第五章 函数

11
5.2函数的调用 5.2函数的调用
主函数main 主函数main …… int main( ) {…… func1(……); func1(……); …… a=func2 ……) a=func2(……); return 0; } func1 func1 double func1 ……) func1(……) { …… }
2
第五章 函数
C程序 源程序文件1 源程序文件i 源程序文件n
预编译命令
函数1
函数n
声明部分
执行部分
C程序结构
必须有且只能有一个名为main的主函数。 必须有且只能有一个名为main的主函数。 main的主函数 程序的执行总是从main函数开始, main函数开始 C程序的执行总是从main函数开始, main中结束 中结束。 在main中结束。
第五章
函数
1
第五章 函数
模块化程序设计 基本思想: 基本思想:将一个大的程序按功能分割成 一些小模块。 一些小模块。 特点: 特点: 各模块相对独立、功能单一、 各模块相对独立、功能单一、结构清 晰、接口简单 控制了程序设计的复杂性 提高元件的可靠性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充 开发方法: 自上向下,逐步分解, 开发方法: 自上向下,逐步分解,分而治之
13
5.2函数的调用 5.2函数的调用
【例5-1】 输出两个整数的值。 输出两个整数的值。 #include <stdio.h> void fun(int x, int y) { printf(”%d,%d”, x, y); } int main( ) { int iFirst, iSecond; iFirst = 123; iSecond = 99; fun(iFirst, iSecond); return 0; }

C 程序设计__第5章_函数

C  程序设计__第5章_函数

2008-2009-2 C++程序设计
6
函数
5.1.2 函数的声明
函数声明也称函数模型或函数原型。 函数声明的一般格式为:
函数类型名 函数名(形式参数表);
例如:设有一函数定义为
float fun(char a, int b, float c) { 函数体 }
则对fun函数的声明为: float fun(char m, int n, float i);//末尾要加上分号
void print() { printf("c language"); }
这样系统就保证不使函数带回任何值。
2008-2009-2 C++程序设计
15
函数
3.函数调用的形式
函数通过下列三种方式完成函数调用:
函数调用语句
在一个函数调用的后面加上“;”作为一条语句。如:printf();
函数表达式
一个C++程序是由若干个源程序文件构成的,而一个源程 序文件是由若干个函数构成。
函数类型
从用户的角度看,有两种不同的函数:
库函数 用户自定义函数
库函数也称标准函数,由C++系统提供。 用户自定义函数则需要用户先定义,后使用。
2008-2009-2 C++程序设计
4
函数
5.1.1函数的定义
函数的定义格式
由实参把数据传给形参,并且存储单元与形参是不同的单元。 调用结束后,形参单元被释放,而实参单元保留并维持原值。
2008-2009-2 C++程序设计
13
函数
2.函数的返回值
函数的返回值是通过函数中的return语句“返回”的。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

float average( float array[], int n ){ int i; float aver, sum=array[0]; max=min=array[0]; for( i=1; i<n; i++ ){ if( array[i]>max ) max=array[i]; if( array[i]<min ) min=array[i]; sum=sum+array[i]; } aver=sum/n; return(aver); }
4 fac(n) fac(3)
…else return( n*fac( n-1 ));
int fac(int n){ if(n==0) return(1); else return(n*fac(n-1)); }
fac(2) fac(1)
…return( n*fac( n-1 ));
… return( n*fac( n-1 ));
实参可以是:数组名、指针变量、字符串常量、 指定单元的起始地址等
特点:通过传递数组或某一存储单元的起始地址, 使被调函数可利用此地址来访问(存取)相应存储单 元的数据,实质上为通过存储单元共享,达到数据双 向传递的目的。
5.2 函数的参数传递
注意: 函数调用时要求实参与形参在 个数、顺序、类型上必须匹配一致.
24
1 2 3 4
方向 4*6=24 … return( n*fac( n-1 )); fac(1) 6 3*2=2 …return( n*fac( n-1 ));
2
fac(0) 2*1=2 …return( n*fac( n-1 )); 1 1*1=1 …return( 1 );
fac(2)
递推
栈:先进后出。保存数据
数 据 类 型
int float double ……
long
int
unsigned
存储类别(确定存储区域)
auto 限 定 说 明 每 次 进 入 函数时自动分配存储单元, 退出调函数时系统自动收 回存储单元的局部变量; 存 储 类 别 register 限 定 说 明 寄 存 器变量; extern 限 定 说 明 外 部 (全局)变量; static 限 定 说 明 静 态 的 局部静态变量、局部静态 数组、静态外部变量等。
一个数值 通过return语句返回一个值 或 一个地址
传值方式(单向传递) 形实参数传递结合 或 传地址方式(双向传递 )
通过外部(全局)变量进行数据传递。
5.6 函数的递归调用
C语言的函数除了main()函数,都可以递归调用,但 不能递归定义,即不能在函数内部定义另一个函数, 但可以直接或间接地调用自己。 递归的概念:通俗地讲,用自身的结构来描述自身 就称为“递归”。这里指函数直接或间接的自己调用 自己。 具有递归特性的问题,用递归调用描述它们就非常 方便。
第五章 函数
★ 内容提要:
函数的定义形式 函数的参数传递 函数的返回值与类型 函数间的数据联系 函数的递归调用 变量的存储类别与作用域
函数的定义
函数的参数传递
返回值与类型 函数间的数据联系 函数的递归调用 存储类别与作用域
第五章 函数
C程序由一个主函数main()和若干个其 它函数构成,执行时由主函数调用其它 函数,其它函数可以互相调用,同一个 函数也可以被一个或多个函数调用任意 多次。
1 当n 0,递归结束条件 求n! n * (n 1)! 当n不等于0,递推公式
① 递归调用点,此 时整个表达式的运算 还没有完成,必须返 回一个值参与运算后, 求出整个表达式的值, 然后再返回上一层递 归调用点。递归调用 点也是返回点。 ②保护现场:保存 数据,以便返回时再 使用;保存返回地址 等
在复合语 句内定义 的C有效 局部变量 C有效
float fa(int a){ int b, c; …… } void main(){ int a, b, c; …… { int c; c=a+b; …… } …… }
a,b,c作用域
没有指定类 别作auto处理。 内层定义的 局部变量优先。 局部动态变 量的初值不定。
三点说明:
若不返回值,则用void类型定义函数。 void printmessage( ){ „„n中的表达式类 型一致,函数类型决定返回值的类型
三点说明:
一个函数可以有多个return语句。可采用形式: return(表达式); return; //带值返回 //不带值返回
//相当于double x,y,z;
说明:函数内定义的变量,若不指定存储类别,则作 auto变量处理。函数外定义的变量为全局变量。
完整的函数定义形式: 存储类别 数据类型 函数名(形参表){ …… } static int max( int x, int y ){ return( x>y? x : y ); } 说明:函数的存储类别只能使用extern, static这两
在执行过程中,每递归 调用一次,就引用一组 全新的自动变量,完全 独立于上层调用的变量 ,即各层递归调用的变 量各自独立。可插入一 个打印语句给以证明。
运行结果: n=123 n=12 n=1 123
5.7 变量的存储类型及其作用域
C程序中每一个变量和函数都有两个属性:
数据类型和存储类别。
char short int 数据类型确定 数据的存放形式 、值域及允许的 运算等。
局部变量 C有效
b,c 的 作 用 域
在复合语 句内定义 的C有效 局部变量 C有效
(2) 寄存器变量及其作用域
为了提高执行效率,允许将局部变量 的值放在运算器的寄存器中,需要时直 接从寄存器取出参加运算。 说明:只有局部自动变量和函数的形 参可以作为寄存器变量,并且类型只限 于int、char和指针类型。
1 2 3 4
栈:先进后出。保存数据
fac(0)
…return( n*fac( n-1 )); …return( 1 );
运行结果:输入:4 输出:24
4 fac(n) fac(3)
…else return( n*fac( n-1 ));
int fac(int n){ if(n==0) return(1); else return(n*fac(n-1)); }
作用域:本函数内有效
float fa(int a){ int b, c; …… } void main(){ int a, b, c; …… { int c; c=a+b; …… } …… }
a,b,c作用域
局部变量 C有效
b,c 的 作 用 域
说明: 函数内定义 的变量只限本函 数 内 有 效 , main()函数中定 义的变量也只有 主函数内有效。 不同函数中 定义的变量可以 同名,各自代表 不同的对象,互 不干扰。 形参也是局 部变量。
个限定词,以限制函数的调用范围。省略存储类别隐 指外部函数,可供其它文件中的函数调用;静态函数 只能被本程序文件的函数调用。
提示: 在定义和说明变量时,应按照变 量的作用范围以及它们在存储单元 中保持值的时间长短的需要,对它 们的存储类别进行说明限定。
(1) 局部变量及其作用域
函数内部定义的变量统称为局部变量 ,包括形参变量,由于存放在动态区, 故也称为动态变量。
1
例[5-2]:把整数n用十进制字符串的形式打印出来。
print( n ){ int i; printf("n=%-5d\n", n); if(n<0){ putchar('-'); n=-n; } if((i=n/10)!=0) print( i ); putchar(n%10+'0'); } void main(){ print(123); putchar('\n'); }
内存中的用户区 用户程序区: 静态存储区:数据 的生存周期同程序 运行期,即变量能 保持到程序运行结 束 动态存储区:数据 (存储单元)随函 数的调用而存在, 随函数的返回而消 失(存储单元回收)
完整的变量定义形式: 存储类别 数据类型 变量名表列;
main(){ static float a, b, c; auto double x, y, z; …… }
输入:99 45 78 97 100 67.5 89 92 66 43 输出:max=100.00 min= 43.00 averge= 77.65
float max=0, min=0; //定义外部变量max, min float average(float array[], int n){ int i; float aver,sum=array[0]; max=min=array[0]; for(i=1; i<n; i++){ if(array[i]>max) max=array[i]; if(array[i]<min) min=array[i]; sum=sum+array[i]; } aver=sum/n; return(aver); } void main(){ float ave, score[10]; int i; for(i=0; i<10; i++) scanf("%f",&score[i]); ave=average( score, 10); printf("max=%f\nmin=%f\naverge=%6.2f\n", max,min,ave); }
例[8-3]:求1!∼5!的阶乘. int fac(int n){ register int i, f=1; for( i=1; i<=n; i++ ) f=f*i; return( f ); } void main(){ int i; for( i=1; i<=5; i++ ) printf( "%d!=%3d\n", i, fac(i) ); }
相关文档
最新文档