内容正文:
第六章 程序的模块化--函数
1
CONTENTS
目录
01
02
函数的分类
函数的认知
03
自定义函数及其应用
04
函数的调用
CONTENTS
目录
05
06
函数的递归调用
函数的嵌套调用
07
数组作为函数的参数
08
变量的作用域
C语言
知识树
My First Template
函数的调用(值与址)
C语言程序设计
5
C语言
本次任务
任意输入两个数通过函数调用完成交换两个数的值。
C语言程序设计—函数的调用
My First Template
C语言
任务分析
#include "stdio.h"
void main()
{
int x,y,temp;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("x=%d,\ty=%d
",x,y);
temp=x;
x=y;
y=temp;
printf("交换后x=%d,\ty=%d
",x,y);
}
基本实现
函数的调用—任务分析
My First Template
交换任务
输入两
个数
交换
大小
函数
C语言
任务初探
#include "stdio.h"
swap(int a,int b);
void main()
{
int x,y,temp;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(x,y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int a,int b)
{ int temp;
temp=a; a=b; b=temp;
}
函数的调用—任务初探
My First Template
C语言
通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数。
调用形式 函数名(实参表);
说明:实参与形参个数相等,类型一致,按顺序一一对应,实参必须有确定的值,形参必须指定类型。
函数调用
函数语句:
例 printf("我是一个好人!
");
函数表达式:
例 c= tolower ('T');
函数参数:
例 m=max(a,max(b,c));
函数的调用—相关知识
My First Template
C语言
库函数调用:
由C语言系统提供;
用户无须定义,也不必在程序中作类型说明;
只需在程序前包含有该函数定义的头文件;
自定义函数调用:
用户在程序中根据需要而编写的函数;
如果自定义函数在主调函数的后面,需要在调用前声明
函数调用说明
#include "stdio.h"
#include "math.h"
void main()
{
int n=3,p;
p=pow(2,n);
printf("%d
",p);
}
#include "stdio.h"
int add(int x,int y);
void main()
{
int sum,a=10,b=20;
sum=add(a,b);
printf("%d
",sum);
}
int add(int x,int y)
{ return x+y; }
函数的调用—相关知识
My First Template
C语言
参数传递方式
1、值传递方式
方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值
特点:形参与实参占用不同的内存单元,单向传递。
2、址传递方式
方式:函数调用时,将数据的存储地址作为参数传递给形参
特点:形参与实参占用同样的存储单元;“双向”传递;实参和形参必须是地址常量或变量
地址:ED2F
形参
5
实参
地址:EF3D
5
地址:ED2F
形参
实参
地址:EF3D
5
EF3D
8
函数的调用—相关知识
My First Template
C语言
地址的表示
EF3D
C语言中取一个变量的地址用“&” 符号。如:int a ; &a表示取a的地址
存储地址,使用指针(数据类型)变量。格式: int *p; int * 代表指针类型,p为变量名。
内存
10
int x
ED53
地址
变量
数据
ED53
int *p
指针
在指针定义(int *p)后:
p表示地址
*p表示取地址里面的值。
函数的调用—相关知识
My First Template
C语言
任务再分析
#include "stdio.h"
swap(int a,int b);
void main()
{
int x,y;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(x,y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int a,int b)
{ int temp;
temp=a; a=b; b=temp;
}
7
11
x:
y:
调用前:
调用结束:
7
11
x:
y:
调用:
7
11
a:
b:
7
11
x:
y:
swap:
7
11
x:
y:
11
7
a:
b:
temp
值传递
函数的调用—任务再分析
My First Template
C语言
任务实现
#include "stdio.h"
swap(int *a,int *b);
void main()
{
int x,y;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(&x,&y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int *a,int *b)
{ int temp;
temp=*a; *a=*b; *b=temp;
}
7
11
x:
y:
调用前:
调用结束:
11
7
x:
y:
调用:
7
11
a:
b:
7
11
x:
y:
swap:
x:
y:
11
7
a:
b:
temp
函数的调用—任务实现
My First Template
函数的嵌套调用
C语言程序设计
15
C语言
知识点回顾
C语言程序设计—函数的嵌套调用
程序模块化—函数
函数调用
参数传递的方式
My First Template
C语言
本次任务
利用函数嵌套计算
S=22!+32!
C语言程序设计—函数的嵌套调用
My First Template
C语言
函数的嵌套调用—函数嵌套调用的过程
main( )
a函数
调用函数a
调用函数b
b函数
结束
嵌套调用
C规定:函数定义不可嵌套,但可以嵌套调用函数
My First Template
C语言
函数的嵌套调用—函数嵌套调用的过程
#include <stdio.h>
int dif(int x,int y,int z);
int max(int x,int y,int z);
int min(int x,int y,int z);
void main()
{ int a,b,c,d;
scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);
printf("Max-Min=%d
",d);
}
int dif(int x,int y,int z)
{ return max(x,y,z)-min(x,y,z); }
int max(int x,int y,int z)
{ int r;
r=x>y?x:y;
return(r>z?r:z);
}
int min(int x,int y,int z)
{ int r;
r=x<y?x:y;
return(r<z?r:z);
}
main( )
调用函数dif
dif函数
调用函数min
max函数
min函数
例子:求三个数中最大值与最小值的差
输出结束
调用函数max
My First Template
C语言
函数的嵌套调用—任务分析
任务分析
本题是求S=22!+32!
可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。
主函数先调f1计算出平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,然后返回f1,再返回主函数,在循环程序中计算累加和。
My First Template
C语言
函数的嵌套调用—任务实现与总结
任务实现
#include<stdio.h>
long f2(int q)
{
long c=1;
int i;
for(i=1;i<=q;i++)
c=c*i;
return c;
}
long f1(int p)
{
int k;
long r;
k=p*p;
r=f2(k);
return r;
}
main()
{ int i;
long s=0;
for (i=2;i<=3;i++)
s=s+f1(i);
printf("
s=%ld
",s);
}
运行结果
My First Template
$$