C语言程序设计基础 6.函数_第1页
C语言程序设计基础 6.函数_第2页
C语言程序设计基础 6.函数_第3页
C语言程序设计基础 6.函数_第4页
C语言程序设计基础 6.函数_第5页
已阅读5页,还剩43页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 六 章 函 数函数的基本使用函数的嵌套调用函数的递归调用 变量存储特征宏函数的概念 k!n!+m!f=1;for(i=1; i=n; i+) f=f*i;scanf(%d%d%d, &m, &n, &k);fk=1;for(i=1; i=k; i+) fk = fk*i;fm=1;for(i=1; i=m; i+) fm = fm*i;fn=1;for(i=1; i=n; i+) fn = fn*i;printf(%fn, fm/(fn+fk);反复使用的代码段# include void main() int k, m, n; float fk, fm, fn; scanf(%d%d%d

2、, &m, &n, &k); fk=1; for(i=1; i=k; i+) fk = fk*i; fm=1; for(i=1; i=m; i+) fm = fm*i; fn=1; for(i=1; i=n; i+) fn = fn*i; printf(%fn, fm/(fn+fk);# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, &m, &n, &k); fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(

3、fn+fk);float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f;# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, &m, &n, &k); fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(fn+fk);float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i

4、; return f;mainscanfprintffact库函数自定义函数库函数main 主调函数fact 被调用函数调用定义函数的概念库函数 scanf() printf() sqrt()功能独立,反复使用的代码段 计算阶乘 fact() 模块化编程 学生成绩档案管理软件 成绩输入 成绩修改 成绩统计 成绩打印# include void main() int in; printf(1. INPUT 2.EDIT 3. PROCESS 4.PRINT 5.EXITn); while(1) printf(please input 1-5:); scanf(%d,&in); if (in=5)

5、 break; switch(in) case 1: input( ); break; case 2: edit( ); break; case 3: process( ); break; case 4: print( ); break; void input( ) /* .成绩输入 */ .void edit( ) /* 成绩修改 */ . 4个函数的定义void process( ) /* 成绩统计 */ .void print( ) /* 成绩打印 */ .函数的定义和调用void main() int m, n; float fk, fm, fn; float fact(int n);

6、 fm = fact(6); 调用定义float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f;函数的定义和调用返回值类型 函数名(形式参数表) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f;调用定义函数名(实际参数表)参数传递返回值类型 函数名(形式参数表) void mai

7、n() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i 形参函数的参数函数名(实际参数表)main() output( ); void output( ) printf(”*n”); printf(”* very good *n”); printf(”*n”);main( ) int x,y,z; scanf(“%d%d”,&x,&y); z=max(x, y); printf(“%d”,z);int max (int a ,

8、int b ) int c ; c=ab ? a : b ; return( c ) ;问题:实参可以是表达式吗?如果实参和形参的类型不一样?返回值类型 函数名(形式参数表) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; ib ? a : b ; return( c ) ;int问题:如果返回值的类型与return (exp) 中的exp不一致?实参 实参与形参 参数传递void main() int x,

9、 y, z; scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z)int max(int a , int b ) int c; c=ab ? a : b; return c;常量变量表达式形参:变量实参与形参 参数传递int max(int a , int b ) int c; c=ab ? a : b; return c;void main() int x, y, z; scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z)x 3y 5zabc 53551、实参与形参:个数相同、类型一致、按顺序传递

10、 2、实参 - 形参,值传递 单向 形参值的变化不会影响实参的值 实参和形参可以同名实参与形参 参数传递void main() int x, y, z; scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z)int max(int a , int b ) int c; c=ab ? a : b; return c;void main( ) int x, y; scanf(%d%d, &x, &y); swap(x, y); printf(%d%d, x, y);阅读程序void swap(int x, int y) int t; t = x; x

11、= y; y = t;输入 3 5函数的说明void swap(int a, int b) int t; t = a; a = b; b = t;void main( ) int x, y; scanf(%d%d, &x, &y); swap(x, y); printf(%d%d, x, y);void main( ) int x, y; scanf(%d%d, &x, &y); swap(x, y); printf(%d%d, x, y);void swap(int a, int b) int t; t = a; a = b; b = t;void swap(int a, int b);函数

12、在被调用前必须先定义或说明!函数调用小结函数调用时,实参计算值,复制给相应位置的形参;函数执行完后,通过return (exp),可返回结果。调用其他函数,必须先说明!有多个实参时 后面的先计算形参的改变不影响实参数量、类型、顺序一致一个结果分析函数调用过程# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, &m, &n, &k); fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(fn+fk);float f

13、act(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; 例T6-1 1!+2!+n!算法:k =1 to n s=s+f f=k! k+s=0;for(k=1;k=n;k+) f=fact(k); s=s+f; float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return(f);例T6-2 x+x2+xn算法:k =1 to n s=s+f f= xk k+s=0;for(k=1;k=n;k+) f=mypow(x,k); s=s+f; float

14、mypow(float x, int n) int i; float f=1; for(i=1; i=n; i+) f = f*x; return(f);例T6-3 编写函数 比较2个变量是否相等equal(x, y)当x=y, 返回1 否则, 返回0int equal(int x, int y) if(x=y) return 1; else return 0;void main( ) int x, y; scanf(%d%d, &x, &y); if(equal(x,y) printf(x=y); else printf(x!=y);int equal(int x, int y) retur

15、n(x=y);例T6-4 输出100200间所有素数算法:m =100 to 200 if m是素数 print mint prime(int m) int i, n=sqrt(m); for(i=2; in) return 1; else return 0;for(m=100; m=200; m+) if(prime(m) printf(%d,m) prime(m)if m是素数,返回1 否则,返回0函数的顺序调用和嵌套调用顺序调用void main( ) f1( ); f2( ); f1() f2() mainf1f2mainf1f2函数的顺序调用和嵌套调用嵌套调用void main( )

16、 f1( ); f1() f2( ); f2() mainf1f2mainf1f2例 求三角形面积 area=s(s-a)(s-b)(s-c)s=(a+b+c)/2mainareasmainareas# include # include void main() float a, b, c; float area(float a, float b, float c); float s(float a, float b, float c); scanf(%f%f%f, &a, &b, &c); printf(%fn, area(a, b, c);float area(float a, float

17、 b, float c) float ss; ss=s(a,b,c); return sqrt(ss*(ss-a)*(ss-b)*(ss-c); float s(float a, float b, float c) return (a+b+c)/2;递归式递归出口函数的递归调用(递归函数)求n!递归定义 n! = n * (n-1)! (n 1) n! = 1 (n = 0,1)void main() float fact(int n); printf(%fn, fact(5); float fact(int n) float res; if(n=0 | n=1) res=1; else re

18、s = n*fact(n-1); return res; fact(n)=n*fact(n-1);递归函数求 n! 的实现过程 fact(3) 3*fact(2) 2*fact(1)126float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; 函数的递归调用(递归函数)用递归实现的问题,满足两个条件:问题可以逐步简化成自身较简单的形式(递归式)n! = n * (n-1)! n n-1i = n + i i=1 i=1递归最终能结束(递归出口)两个条件缺一不可解决递归问题的两个着

19、眼点变量作用范围(作用域) 在函数内定义的变量(包括形参)。局部变量 作用范围:本函数内部。 定义在复合语句内的变量。 作用范围:复合语句内部。全局变量:在函数以外定义的变量,不从属于任一函数。作用范围:从定义处到源文件结束(包括各函数)变量作用范围示例区分局部变量和全局变量int x=1;void main( ) int a=2; . int b=3; . f( ); .int t=4 ;void f( ) int x=5, b=6; .int a=7; x=? a=? b=?b=? x=? b=? t=? a=? x=1 a=2 b=3b没定义 x=5 b=6 t=4 a没定义 若局部变量

20、与全局变量同名,局部变量优先变量作用范围示例int x=1;int f(int x) return(x+); main( ) int y; y=f(2) ; x=f(x) ; printf(“%d%d”, y, x);x=1变量作用范围如果局部变量与全局变量同名,局部变量优先。不要滥用全局变量。副作用int x=1;void f1() x+;void f2() x=5;void main( ) x=10; f1(); printf(%d , x); f2(); printf(%d , x);11 5变量存储形式和生存期1、动态存储自动变量(auto): 普通的局部变量int x, y; aut

21、o int x, y;char c1; auto char c1;函数调用时,才定义变量,分配存储单元;函数调用结束,收回存储单元。即使对同一函数的几次调用,分配的存储单元也不同。 fact(3) 3*fact(2) 2*fact(1)126float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; n=3n=2n=1变量存储形式2、静态存储在静态存储区分配单元执行程序时定义变量,分配单元,运行结束时收回。全局变量静态局部变量 静态全局变量int k;main() int i; k=

22、2; for(i=4; i0; i-) fun();fun() int j=2; printf(j=%d, k=%dn, j, k); k=k*k; j=j*j;示例j=2, k=2j=2, k=4j=2, k=16j=2, k=256作用域生存期int gobal=1;void fun();void main() int i; for(i=0; i3; i+) fun();void fun() int local=1; static int static_local=1; printf(gobal=%d, local=%d, static_local=%dn,gobal, local, st

23、atic_local); gobal+; local+; static_local+;静态局部变量gobal=1, local=1, static_local=1 gobal=2, local=1, static_local=2 gobal=3, local=1, static_local=3 作用域生存期int gobal=1;void fun();void main() int i; for(i=0; i3; i+) fun();void fun() int local=1; static int static_local=1; printf(gobal=%d, local=%d, sta

24、tic_local=%dn,gobal, local, static_local); gobal+; local+; static_local+;变量的初始化作用域生存期int local;local=1;static int static_local;static_local=1;等价吗?静态变量初值为0变量存储形式3、外部变量extern int x; 4、寄存器变量register int k;某些系统对寄存器变量的使用会比普通变量运行速度快,但中寄存器变量与auto变量等价。程序模块结构文件模块的连接 #include F1.cvoid main() int n; long t; sc

25、anf(%d, &n); t = fact(n); printf(%ldn, t); 文件名 F1.clong fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i;return res; 文件名 F2.clong fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i;return res; void main() int n; long t; scanf(%d, &n); t = fact(n); printf(%ldn, t); 文件名 F

26、1.c程序模块结构一、文件包含 可以实现一个文件把另一个文件的全部内容包含进来。 格式: # include 文件名 说明:1、#include 不是语句,无需分号。2、如果要连接多个文件,可用多个include包含,顺序按调用关系,被调的应在调用的前面。允许多层调用。3、.文件与.性质相同,都是程序文件,.文件突出了头文件(head)的性质。4、include有两种写法: #include ”file1.c #include 只在tcinclude 文件夹下找 适用于系统头文件 除此之外,还到程序所在文件夹下查找 适用于自定义头文件 二、使用工程文件extern long fact(int k);void main() int n; long t; scanf(%d, &n); t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论