内容正文:
《C语言程序设计》
(清华大学出版)
同步教学
C 语言程序设计
第七章 函 数
2
第七章 函 数
第7章 函 数
7.1 函数定义和函数调用
7.2 函数的嵌套调用和递归调用
7.3 局部变量和全局变量
7.4 变量的存储类别
7.5 内部函数和外部函数
3
函数概述
程序设计有两大最高级的艺术
算法设计艺术
结构设计艺术
函数(function)是结构设计的最基本单位
“一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。” ——Geoffrey James的《编程之道》
函数是C 语言的基本组成单元。每个函数用来完成某一特定的功能。
把单一功能做成函数的方式,有利于软件的复用。
第七章 函 数
4
函数概述
C程序的函数有两种:
标准库函数:由系统提供,如:sqrt(x), exp(x)。
自定义函数: 用户自定义函数
第七章 函 数
5
7.1 函数定义和函数的调用
返回值类型 函数名 (参数表)
{
函数体
return 表达式;
}
返回值类型与return语句配合
如果不需要返回值,则应该用 void 定义返回值类型。
当函数执行到return语句时,就中止函数的执行,返回到调用它的地方。
函数内部可以定义只能自己使用的变量,称 内部变量。参数表里的变量也是内部变量
第七章 函 数
6
函数名命名
Windows风格函数名命名
用大写字母开头的单词组合而成
变量名形式
“名词”或者“形容词+名词”
如变量名OldValue与NewValue等
函数名形式
“动词”或者“动词+名词”(动宾词组)
如函数名GetMax()等
第七章 函 数
7
对函数接口加以注释说明
/* 函数功能:实现××××功能
函数参数:参数1,表示×××××
参数2,表示×××××
函数返回值: ×××××
*/
返回值类型 函数名 (参数表)
{
函数体
return 表达式;
}
第七章 函 数
8
【例7.1a】 计算两个整数的平均数
/*
函数功能: 计算平均数
函数入口参数: 整型x,存储第一个运算数
整型y,存储第二个运算数
函数返回值: 平均数
*/
int Average(int x, int y)
{ int result;
result = (x + y) / 2;
return result;
}
第七章 函 数
9
函数调用(call)
单向值传递
调用函数时,必须提供所有的参数
提供的参数个数、类型、顺序与定义时相同
有返回值时
放到一个数值表达式中,如c = max(a,b);
作为另一个函数调用的参数,如
c = max(max(a,b),c);
printf("%d
", max(a,b));
无返回值时
函数调用表达式,如display(a,b);
第七章 函 数
10
【例7.1b】 使用了Average函数的main()
#include <stdio.h>
int Average(int x, int y)
{
int result;
result = (x + y) / 2;
return result;
}
main()
{
int a = 12;
int b = 24;
int ave;
ave = Average(a, b);
printf("Average of %d and %d is %d.
", a, b, ave);
}
int Average(int x, int y)
{
int result;
result = (x + y) / 2;
return result;
}
main()
{
int a = 12;
int b = 24;
int ave;
ave = Average(a, b);
printf(……);
}
数据传递
执行顺序
第七章 函 数
11
函数原型(prototype)
调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare)
不对函数进行声明是非常危险的
声明时不要省略参数以及返回值的类型
第七章 函 数
12
#include <stdio.h>
int Average(int x, int y)
{
int result;
result = (x + y) / 2;
return result;
}
main()
{
int a = 12;
int b = 24;
int ave = Average(a, b);
printf("Average of %d and %d is %d.
", a, b, ave);
}
【例7.1】
第七章 函 数
13
#include <stdio.h>
int Average(int x, int y); /*声明Average()函数*/
main()
{
int a = 12;
int b = 24;
int ave = Average(a, b);
printf("Average of %d and %d is %d.
", a, b, ave);
}
int Average(int x, int y) /*计算两个整数的平均数*/
{
int result;
result = (x + y) / 2;
return result;
}
【例7.1】
第七章 函 数
14
7.2.1 函数的嵌套调用
在被调函数中,又调用了函数----嵌套调用
7.2 函数的嵌套调用和递归调用
main()
{
…
…
...
}
a 函数
{
…
…
}
b函数
{
…
…
…
}
①
③
④
⑤
⑥
⑦
②
第七章 函 数
15
【例7.7】 编写程序,输入n,m,求组合数
#include <stdio.h>
void main()
{ int m,n;
long cmn(int,int);
scanf("%d%d",&m,&n);
printf("cmn=%ld
", cmn(m,n) );
}
long Jc(int n)
{ int i; long t=1;
for(i=1;i<=n;i++) t*=i;
return (t);
}
long cmn(int m,int n)
{ return (Jc(m)/(Jc(n)* Jc(m-n) ));
}
第七章 函 数
16
7.2.2 函数的递归调用
当一个函数直接或间接的调用它自身时,称为函数的递归调用。
前者称为直接递归,后者称为间接递归
第七章 函 数
17
7.7.2 函数的递归调用
递归方法:
两步:递推、回归。
例如:求4!
4!=4*3! → 3!=3*2! → 2!=2*1! → 1!=1*0! → 0!=1
4!=4*6 ← 3!=3*2 ← 2!=2*1 ← 1!=1*1←0!=1
第七章 函 数
18
【例7.8】 用递归计算n!
#include <stdio.h>
long Jc(int n)
{ long f;
if(n==1||n==0) f=1;
else f=n*Jc( n-1);
return f;
}
void main()
{ long y; int n;
scanf("%d",&n);
y=Jc(n);
printf("%d!=%ld",n,y);
}
main函数
y=Jc(3)
jc函数
f=3*Jc(2)
jc函数
f=2*Jc(1)
jc函数
f=1
return 1
jc函数
f=2*Jc(1)
return 2
jc函数
f=3*Jc(2)
return 6
第七章 函 数
19
【例7.9】 把十进制整数按相反的顺序将各位数字打印出来。如:print(123456); 输出:654321
#include <stdio.h>
void print(long n)
{ if(n==0) return;
else
{ printf("%d",n%10);
print(n/10);
return;
}
}
void main()
{ long n;
scanf("%ld",&n);
print(n);
}
运行结果如下:
123456↙
654321
第七章 函 数
20
感谢观看
21
main�
f1�
f2�
f3�
f4�
f5�
f6�
f7�
f �����
����f�����
f1 �����
����f2�����
f2 �����
����f1�����
$$