- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法讲解/view/1068668.htm
动画演示
自己玩一下
数组作为函数的参数
两个完全不同的概念
以数组元素作为函数的参数
——实参是数组元素,对应的形参是变量
以数组名作为函数的参数
——实参和形参都是数组名
数组元素作为函数的参数
数组元素作为实参——形参是普通变量,
调用方式 有无参数
函数的返回值 库函数(内部函数) 用户自定义函数
无参函数 有参函数
有返回值(有类型) 无返回值(空类型void)
函数的定义
函数首部
int max(int x,int y) { int z; 指定函数的类型 if (x>y) z=x; 指定参数名称和类型 else z=y; return z; 函数的功能 }
例:最大公约数函数和最小公倍数函数
求最大公约数的算法: ①从1开始,逐个找公约数,直至两数中较小 的一个; ②辗转求余(循环结构实验指导有流程图); ...... 求最小公倍数的算法: ①从两数中较大的一个开始,由小到大找公 倍数,直至找到; ②两数的乘积 / 两数的最大公约数。
函数的嵌套调用
调用最小公倍数函数(两数乘积/两数的最大
函数的参数
形式参数和实际参数
形参在函数调用时分配内存单元,调用结束
后释放;
实参可以是常量、变量、表达式 实参与形参的数目、类型应一致 C语言中,实参向形参传递其值——“值传
递”,不传递地址,形参值变化不影响实参
函数的返回值
通过函数体return语句中的表达式值获
得,例如: int max(int x,int y)
值传递
int main( ) { int a[11],i; float fac(int n); for (i=1;i<=10;i++) {a[i]=i; printf("%d!=%.0f\n",a[i],fac(a[i])); } return 0; 等价于普通变量 }
float fac(int n) { float t=1; int i; for(i=1;i<=n;i++) t=t*i; return t; }
函数的概念
int main( ) { void stars(int, char); void stars(int n,char c) int n=20; { stars(10,'%'); int i; printf("Hello!\n"); for (i=1;i<=n;i++) stars(5,'-'); printf("%c",c); printf("Bye!\n"); printf("\n"); stars(n,'$'); } return 0; 两个参数,无返回值 }
第7章 函数
引例
求阶乘n!
int i,n; float fac=1; printf("n="); scanf("%d",&n); for(i=1;i<=n;i++) fac=fac*i; printf ("%d!=%.0f\n",n,fac);
引例
求任意3个正整数的阶乘的和 a!+b!+c!
fa=1; for(i=1;i<=a;i++) fa=fa*i; fb=1; for(i=1;i<=b;i++) fb=fb*i; fc=1; for(i=1;i<=c;i++) fc=fc*i; printf("%d!+%d!+%d!=%.0f",a,b,c,fa+fb+fc);
公约数),当中需要调用最大公倍数函数
函数的嵌套调用:在一个被调用的函数中调
用另一个函数
例:P183 例7.5
函数的递归调用
概念:在一个被调用的函数中直接 或间接地调用函数本身
n! = 1 , n (n-1)! , n=0,1 n>1
函数的递归调用
递归的另一个典型实例 ——汉诺塔(P.189例7.8)
函数的调用
函数(实参列表) 调用有返回值的函数,应注意返回值 的处理,如赋值或输出等。 例如: c=max(a,b);
或
printf("%d",max(a,b));
函数的参数
形式参数(形参,Formal parameter):
定义函数时首部括号中定义的变量
实际参数(实参,Actual parameter):
指定函数名
函数体
函数首部,不是语 句,行尾无分号
函数的返回值,类 型与首部定义一致
函数的定义
关于函数类型的说明
无返回值的函数类型为void; 有返回值的函数,其类型根据返回值
类型决定;省略类型时默认为int(建议
不要省略)
函数的调用
调用函数的准备工作——包含或声明
调用库函数应在C文件开头部分使用
无返回值的函数
函数的概念
int main( ) { void stars(int n); int n=20; stars(10); printf("Hello!\n"); stars(5); printf("Bye!\n"); stars(n); return 0; }
void stars(int n) { int i; for (i=1;i<=n;i++) printf("*"); printf("\n"); } 有参数,无返回值
float factorial(int n) { int i; float fac; fac=1; for(i=1;i<=n;i++) fac=fac*i; return fac; }
引例
求任意3个正整数的阶乘的和 a!+b!+c! 使用函数可减少程序的重复段落 使用函数可使程序功能相对独立,
#include<头文件名> 要调用其他自定义函数,应在本函数 体开始的声明部分加上被调用函数的声 明(与函数首部内容相同的一个语句), 供编译时使用——如果被调用函数出现 在本函数之前可省略此部分 详见7.4节
函数的调用
函数(实参列表)
调用无返回值的函数可以把上述函数 直接作为语句使用,以完成其功能。 例如: stars(10);
复合语句内有效的变量(“花括号内有效”)
全局变量(外部变量)——在一个模块内
多个函数中均有效
扩展的外部变量——在多个程序文件的函
数中有效(extern)
变量作用域——局部变量和全局变量
局部变量——函数内定义,只在该函数有效
#include <stdio.h> int main() { int a,b,c; ...... } float fac(int n) { float t=0; ...... return t;}
便于维护——模块化的程序设计
应用程序
源程序文件1
函数1 函数2 函数3
源程序文件2 函数1 函数2
C应用程序的构成
函数的概念
#include <stdio.h> int main ( ) { int max(int x,int y); int a, b, c; scanf ("%d,%d",&a,&b); c=max (a,b); printf ("max=%d",c); return 0; }
int max(int x,int y) { int z; if (x>y) z=x; else z=y; return z; }
程序必备的 main函数
有返回值的函数
函数的概念
上述问题也可只用一个main函数实现 int main ( ) { int a, b, c; scanf ("%d,%d",&a,&b); if (a>b) c=a; else c=b; printf ("max=%d",c); return 0; }
形参为数组, 不指定大小
数组作为函数的参数
以数组名作为函数的参数——注意事项
形参和实参都是数组名,类型要一致; 形参中不指定数组大小,指定无实际作用; 形参数组名获得实参首元素的地址,即形参第
一个元素与实参第一个元素占用相同的地址—— 这就是“地址传递”方式,形参值改变会引起实 参值的变化
为了使形参获得实参数组的大小(元素个数),
主函数中不存在 变量n和t fac函数中不存 在变量a和b
变量作用域——局部变量和全局变量
局部变量——复合语句内定义,只在语句内 有效
int main() { int i; for (i=0;i<=10;i++) { int k; k=i*2; printf("%d\n",k); } printf("%d\n",i); printf("%d\n",k); }
数组作为函数的参数
以数组名作为函数的参数——实参向形参 传递首元素地址
int main( ) { int max(int a[ ],int n); int x[6],i; for(i=0;i<=5;i++) scanf("%d",&x[i]); printf("max=%d",max(x,6)); return 0; } 实参为数组名 int max(int a[ ],int n) { int m,i; m=a[0]; for (i=1;i<n;i++) if (a[i]>m) m=a[i]; return m; }