C语言第06章(函数)

发布时间:2021-06-08

。。。

主讲:王钰淇

。。。

本章要点

函数的定义、说明与调用 函数之间参数传递规则 变量的存储类型与特性 函数递归的概念与执行过程 递归程序的编程方法

。。。

学习内容第1节 第2节 第3节 第4节 第5节 第6节 第7节 第8节 函数的定义与说明 函数调用与返回 函数间参数传递 变量的存储类型和作用域 内部函数与外部函数 函数的递归 函数应用举例 库函数简介

。。。

函数概述—模块化一、程序模块化结构 模块化程序结构 模块化程序特点

主模块 模块1 模块11 模块2 模块21

程序模块相对独立,简化设计, 限制错误; 集体开发,缩短开发周期; 积木式组装,共享模块,减少 重复; 易于维护、裁剪、移植和扩充。

模块22

。。。

函数概述—模块化采用模块化程序设计的优越性: 控制程序设计的复杂性 提高软件的可靠性

提高软件开发的效率 提高软件的可维护性

提高程序的重用性

。。。

函数概述—模块化 C程序是函数的集合体,每 个函数是一个独立的程序 模块; 有一个主函数,若干个子 main ( ) 函数 函数,程序总是从主函数 开始执行; F1 ( ) F2 ( ) 函数可集中或分散存放在 一个或多个源程序文件中。 F11 ( ) F21 ( ) F22 ( ) 所有子函数地位平等,可 互相调用、自我调用。

二、C程序的结构

。。。

函数概述—函数的分类C函数的分类 库函数 数学函数 #include “math.h” 字符和字符串函数 ctype.h,string.h I/O函数 stdio.h 动态存储分配函数

用户定义函数 形式

无参函数 有参函数 空函数

。。。

函数概述—用户定义函数用户定义函数 void main( ) 例 { printf(“This is C program\n”); } 函数main调用了函数printf Printf()是一个库函数 为了完成一个特定的任务,在程 序开发中一般要定义若干函数。

。。。

函数的定义与说明

三、C函数的结构与定义 函数的一般形式: 数据类型 函数名 (形式参数表) { 语句组 } 1.数据类型是说明函数中由return语句返回的值的类型, 我们称这个数据类型为该函数的类型 2.函数名是标识符,是函数定义中唯一不可省略的 3.形式参数表是用逗号分隔开的一组变量名。( )不可 省略。形式参数表中的参数简称为形参(形式参数表 的格式为:类型 形参,类型 形参,….) 4.形式参数说明是对形式参数表中每个参数的类型说明 5.{}括起来的部分是函数体。{}不可省略

。。。

函数的定义与说明1.C语言中一个最简单的函数: dummy ( ) /* 函数名:dummy */ { }

没有数据类型说明、形参和形参说明,函数体为空。

。。。

函数定义——实例这个程序能单独执行吗? 2.求阶乘函数facto的定义。 long facto (int x ) { long y; for (y=1; x>0; --x) y*=x; return (y); } 函数

形式参数列表

函数体 函数返回值

。。。

函数定义——实例求两个变量的最大值3.求两个变量的最大值。 void main( ) { int a,b,c; printf(“Enter a,b\n”); scanf(“%d,%d”,&a,&b ); c = max(a,b); printf(“Max=&d”,c); } int max (int x,int y) { int z; z = x>y?x:y ; return (z); }

函数调用

形式参数列表:是 用‘,’分开的一 组变量,用来接收 调用时传入的数据

。。。

函数定义注意事项

函数定义注意事项

1.如果有形式参数,则应指定形式参数名及其类型。

2.形式参数表中说明的形式参数只要在形式参数说明中 说明一次即可,在函数体中不需再说明,可直接使用。 3.函数体内部的变量说明与形参说明的含义不一样。 前者说明一个局部于函数体的一般变量,后者说明一 个用于函数间传送数据的形式变量。 在概念上截然不同,在函数中的作用完全不同。 在函数体内部一般变量与形参的使用方法完全一样。

。。。

函数说明 四、函数说明 在调用函数之前,要先进行函数说明–“说明”与“定义” 的区别: “说明”就是说明函数返回值的类型。 “定义”是给出函数的程序体。

函数说明的一般形式 数据类型 函数名(形参列表); –数据类型必须与函数定义时的函数类型一致。数据类型是定义的函数的返回值类型。

–函数说明与函数定义的格式区别:函数说明语句的()后是分号,而函数定义()后是{}。

。。。

函数说明

例:调用max函数的程序 void main() { int a,b,c; int max(int x,int y); scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); } int max(int x,int y){ int z; z = x>y?x:y ; return (z); }

函数说明函数调用

函数定义

。。。

函数说明

在下列情况下,可以省略函数说明: –当函数的返回值为整型或字符型时,如果在 同一个文件中既定义函数,又调用该函数, 则不论定义函数与调用函数在源程序中的位 置关系如何,都可以省去函数说明。 –如果被调用函数的返回值不是整型或字符型, 但函数定义和函数调用在同一个文件中,且 函数定义在调用该函数之前,则可以省去在 调用函数中对被调用函数的函数说明。

。。。

函数调用 一、函数调用 函数的调用形式: 函数名( 实际参数表 );函数调用时实际参数表中给出的变量简称为“实参”。 实参的数量、类型和排列顺序必须与函数定义时形式 参数表中形参的数量、类型和排列顺序一致。 函数调用的过程 在一个函数中调用另一个函数时,程序将控制从调用 函数处转移到被调用函数,并且执行被调用函数。 在执行完被调用函数的所有语句或者遇到return语句 时,程序的控制要返回到调用函数中原来调用函数的 地方继续执行。

。。。

函数的调用与返

回形式参数 例:调用max函数的程序 void main() int max(int x,int y) /*4*/ 实际参数 {int a,b,c; {int z; /*5*/ int max(int x,int y);/*1*/ if(x>y)z=x; /*6*/ scanf("%d,%d",&a,&b);/*2*/ else z=y; /*7*/ c=max(a,b); /*3*/ return(z); /*8*/ printf("max=%d\n",c);/*9*/ } } /*10*/ 函数调用 返回函数值 接收 返回值 程序执行顺序?

。。。

函数的调用与返回void main() /*1*/ {int a,b,c; scanf("%d,%d",&a,&b);/*2*/ /*3*/ c=max(a,b); printf("max=%d\n",c);/*9*/ /*10*/ } int max(int x,int y) /*4*/ /*5*/ {int z; /*6*/ if (x>y) z=x; /*7*/ else z=y; /*8*/ return(z); } 断点保护断点和 现场,转向11

入口虚实结合 a->x,b->y 返回断点 恢复现场 带回函数值

。。。

函数的调用与返回void main() 函数返回后max中的x,y,z是否存在? {int a,b,c; scanf("%d,%d",&a,&b); 输入6,7 c=max(a,b); 运行结果: printf("max=%d,%d,%d\n",c,a,b); printf("max=%d,%d,%d\n",z,x,y); z=7,6,7 } max=7,6,7 int max(int x,int y) {int z; 编译时显示出错信息: if (x>y) z=x; C2065: 'z' : undeclared identifier error else z=y; printf("z=%d,%d,%d\n",z,x,y); return(z); }

。。。

max函数中的变量是否和main中的同名变量冲突?void main() {int a,b,c; int a,b,c,z=10; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d,%d\n",c,a+b); printf("max=%d,%d\n",c,z); } int max(int x,int y) {int z,a=3,b=4; 函数返回时释放了 if (x>y) z=x; max中的全部变量 else z=y; printf("z=%d,%d\n",z,a+b); return(z); } 输入6,8 运行结果: z=8,7 max=8,14 输入6,8 运行结果: z=8,7 max=8,10

    精彩图片

    热门精选

    大家正在看