《《吉大康辉老师讲C语言》第五章函数.ppt》由会员分享,可在线阅读,更多相关《《吉大康辉老师讲C语言》第五章函数.ppt(21页珍藏版)》请在三一办公上搜索。
1、第五章 函数5.1函数和C程序结构,函数是构成 C 程序的基本单位;一个 C 程序中所含函数的个数没有限制,但必须有 main()函数;整个 C 程序从 main()开始执行,各函数之间的关系是平行的,无主次之分,可返回值,也可不返回。C 函数可分为库函数和自编函数。调用 C 标准库函数时用#include,例如:#include“math.h”,5.2 函数的构成及定义,函数的构成如下:类型 函数名(形参表)形参说明 内部说明和定义 函数执行部分 同一函数的定义在同一程序中只能出现一次。,5.3 函数的参数及返回值 5.3.1形式参数和实际参数,形参:定义函数时,函数名后面圆括号中的参数;实
2、参:调用函数时,函数名后面圆括号中的参数,可以是变量、常量、表达式;实参的个数和类型应与形参的个数和类型按定义时的顺序完全一致;实参和形参分别占据不同的存储单元;形实结合采用值传递,即实参的值单向传给形参,实参的值并不改变。,例如:main()int a,b;a=2;b=5;swap(x,y);printf(“a=%d,b=%dn”,a,b);swap(x,y)int x,y;int t;t=x;x=y;y=t;printf(“x=%d,y=%dn”,x,y);,运行结果:x=5,y=2a=2,b=5,t,2,5,2,5,2,5.3.2 函数的返回值,函数的返回值是通过函数中的return语句
3、得到;其语法为:return(表达式)或 return 表达式先求解表达式,然后返回该表达式的值;一个函数中可有多个return语句,当执行到该函数的任一条return语句时,都从该函数返回;如果不需要从函数返回值,则函数中可以没有return语句,或return语句后不带有任何表达式。,main()int i;for(i=1;i1;-n)value*=n;return(value);,运行结果:1!is 1 2!is 2 3!is 6 4!is 24 5!is 120,5.3.2 函数的返回值,例:main()int score=85;char grade;grade=stog(score)
4、;printf(“score%d is grade%cn”,score,grade);stog(s)int s;if(s94)return(A);else if(s84)return(B);else if(s69)return(C);else if(s59)return(D);else return(F);,5.3.2 函数的返回值,5.4 函数的调用,函数调用的一般形式:函数名(实参列表);过程调用:不引用被调用函数的返回值;函数调用:引用被调用函数的返回值;例如:putchar(a);getchar();ch=getchar();putchar(getchar();,main()int a
5、,b;a=fa();b=fb();printf(“a=%dn b=%dn”,a,b);fa()int val;val=100;return(val);fb()int val;val=100;,运行结果:a=100 b=750,5.4 函数的调用,函数的类型是指函数返回值的类型;对返回值不是int或char的函数,必须在定义时给出类型说明。例如:main()int i=2;while(i256)printf(“%dn”,i=square(i);square(x)int x;return(x*x);,5.5 函数的类型及说明,运行结果:416256,main()float i=1.5;while(
6、i256.0)printf(“%fn”,i=square(i);square(x)/*Square the integer x*/int x;return(x*x);,运行结果:-28672.0000001024.000000,5.5 函数的类型及说明,5.5 函数的类型及说明,在main中对函数类型进行说明:类型 被调用函数名();将函数的定义放在main前面;一个函数只能被“定义”一次,可“说明”多次,“定义”与“说明”不同;每个函数可当成外部变量,即全局的。只能以“过程调用”的函数,一般应定义为“void”类型,C编译不再为其返回值分配存储单元。,main()float i=1.5;wh
7、ile(i256.0)printf(“%fn”,i=square(i);/*Square a float or double x*/double square(x)double x;/*line 9*/return(x*x);,运行结果testc:9:square redeclared,5.5 函数的类型及说明,main()float i=1.5;double square();while(i256.0)printf(“%fn”,i=square(i);/*Square a float or a double x*/double square(x)double x;return(x*x);,运
8、行结果:2.2500005.06250025.628906656.840836,5.5 函数的类型及说明,函数的递归调用:在函数中又调用了其本身;递归调用又分为直接递归调用和间接递归调用;,5.6 函数的递归调用,直接递归调用 a()a();,间接递归调a()b();b()a();,递归与嵌套循环的区别:编写递归之前,应先给出递归的边界条件和递推公式。,若没有递归无从终止,若没有,不是递归,循环的嵌套:陷入死循环main()for(;)printf(“we are boy.n”);,函数的递归调用 main()printf(“we are boy.n”);main();终止于系统空间耗尽之时,
9、5.6 函数的递归调用,例如:n!可递归定义如下:,factorial(n)/*Return n!*/int n;if(n=1)/*边界条件判断*/return(1);else return(n*factorial(n-1);/*递推公式*/,main()int i;for(i=1;i=5;+i)printf(%d!is%dn,i,factorial(i);factorial(n)int n;if(n=1)return(1);else return(n*factorial(n-1);,利用factorial(i)求出1!-5!的程序:,运行结果:1!is 12!is 23!is 64!is 2
10、45!is 120,Hanoi塔问题,main()hanoi(3,A,B,C);hanoi(n,a,b,c)int n;char a,b,c;if(n=1)printf(“%c%cn”,a,c);else hanoi(n-1,a,c,b);printf(“%c%cn”,a,c);hanoi(n-1,b,a,c);,3,2,1,边界条件:h(1)=1递推公式:h(n)=2h(n-1)+1,习 题,1、编写一个程序它从键盘读入一个整数,然后将该整数的所有正因子输出。,#include“stdio.h”main()int n,d;scanf(“%d”,2、有20级楼梯,一次可以迈一级或二级,则爬完此楼梯有几种方法?,算法:设爬n级楼梯供有C(n)种方法,则 c(1)=1,c(2)=1 c(n)=c(n-1)+c(n-2)(n=3),#include“stdio.h”main()printf(“%d”,c(20);c(n)int n;if(n=2)return(1);return(c(n-1)+c(n-2);,