函数与编译预处理PPT学习教案_第1页
函数与编译预处理PPT学习教案_第2页
函数与编译预处理PPT学习教案_第3页
函数与编译预处理PPT学习教案_第4页
函数与编译预处理PPT学习教案_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1函数与编译预处理函数与编译预处理教学目的和基本要求:教学目的和基本要求:要求学生了解模块化程序设计的思想,掌握函数的定义及调用,理解变量的作用域与存储方式的概念,理解编译预处理的概念。 教学重点:教学重点:函数的定义及调用、递归调用、变量的作用域。 第1页/共75页第2页/共75页任务模块模块模块函数函数函数函数函数函数第3页/共75页main( ) int a,b,n=0,I; for(a=200;a=998;a+) for(I=2;Ia;I+) if(a%I=0) break; if(a=i) b=a+2; for(I=2;Ib;I+) if(b%I=0) break; if(b=

2、i) n+; printf(“n%d”,n);我们注意到,程序中用 筐住的部分是完成了相同的功能,即判断一个数(a或b)是否是素数。我们可以考虑用一个独立的函数来完成判断素数的功能,在主函数中调用此函数即可。如下:main( ) int a,b,n=0; int f(int x); for(a=200;a=998;a+) if(f(a)=1) b=a+2; if(f(b)=1) n+; printf(“n%d”,n);int f(int x) int I; for(I=2;Ix;I+) if(x%I=0) break; if(x=I) return 1; else return 0;下面我们详

3、细介绍函数调用的格式和语法规定。第4页/共75页第5页/共75页第6页/共75页想要调用标准的库函数,就必须include。#includemain()printf(“%d”,1024*768);调用printf函数时,必须include第7页/共75页可以把完成一个任务的过程写成函数。int A_to_a(int capital)int small; if (capital=A & capital=Z) small= capital (A-a); return small;返回值类型名函数名注意不要与已有库函数重名参数说明和参数列表调用函数时输入参数的格式要与之相同定义局部变量最好只

4、使用局部变量,这样将方便调试。返回值如果不需返回则可return 0;另外请注意这样的判断,如写成Acapitalb) y=a; else y=b;第11页/共75页自定义函数在调用前应先声明。使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、类型、次序相一致。#include “stdio.h”void main()float x,y; int n; float power (float x, int n); scanf(%f,%d, &x, &n); y = power(x, n); printf(“%8.2f”,y

5、);float power( float x, int n) int i; float t=1; for(i=1; i=n; i+) t = t * x; return t; 第12页/共75页第13页/共75页第14页/共75页第15页/共75页同样的,在调用m=max(a,b)时,其形参的值是a和b而m将会得到y的值调用时:m=max(3,6); m=max(a,b); 括号里是形式参数返回值括号里是实参在这一句调用时,形参的值是3和6其返回值y将被赋给调用语句中的m第16页/共75页第17页/共75页第18页/共75页第19页/共75页第20页/共75页函数的功能就是输出函数的功能就是输

6、出35个个-调用调用: putline( ); 应该的语句形式应该的语句形式 i=putline( ); 是错的是错的第21页/共75页a=function(x,y);或者function(x,y);取返回值只是操作解决更复杂问题时可以嵌套调用。n n) )! !( (m mn n! !m m! !C Cn nm mlong fac(int k)long f=1; int i; for(i=1;i=n;i+) f=f*i; retrun f;long combination(int n ,int m)long c; int i; c=fac(m)/(fac(n)*fac(m-n) ); ret

7、run c;主函数:main( ) int n,m; long c; scanf(“%d,%d”, &n,&m); c=combination (n,m); prnit(“%ld”, c); 理论上可以a(b(d(e(x),c(f)般嵌套无数层。第22页/共75页函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。void a( ). a( );.void a( ). b( ); .void b( ). a( ); .递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变

8、得容易解决,写出的程序较简短。第23页/共75页由于 n!= n*(n-1)! 是递归定义所以求n! (n-1)! (n-1)! (n-2)!(n 2)! (n-3)! 0!的问题, 根据公式有0!=1。 再反过来依次求出1!,2!直到最后求出n!。第24页/共75页long fac( int n)long f; if (n=0) f=1; else f=n* fac(n-1); return f;main( )long y; int n; scanf(“%d”,&n); y=fac(n); printf(“%d!=%ld”,n,y); 刚开始的时候,这个n是前面输入的需要阶乘的n所以

9、在这里带入的值是n而这个函数里又调用了本身,不过参数已经变成了n-1所以这里再次调用时参数已经变成了n-1注意:上次调用fac(n)还没有完,只是由于遇到了fac(n-1)而执行fac(n-1)去了.而在调用fac(n-1)时同样遇到了要调用fac(n-2)的问题,于是一层一层的包裹下去,每次调用的时候都会在内部调用一个结构相同但变量不同的函数,直到。直到调用到fac(0)时,由于内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1fac(0)已经执行完毕,它的返回值被fac(1)中的f=n*fac(n-1)语句赋给了f值,同时返回了f。而这个返回的f又被fac(2)乘上

10、当前的n值以后继续返回f直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。第25页/共75页第26页/共75页第27页/共75页第28页/共75页第29页/共75页第30页/共75页第31页/共75页编译程序会提示出错: Undefined symbol a 和 Undefined symbol b 。为什么?第32页/共75页注意与局部变量同名的处理 局部变量屏蔽全局变量不同函数中同名局部变量互不干扰 第33页/共75页 3 3、局部变量 C C语言程序是由函数组成的,有且只能有一个语言程序是由函数组成的,有且只能有一个mainmain函数。函数。

11、变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。按照变量定义语句出现的位置,可以分为:按照变量定义语句出现的位置,可以分为:局部变量:局部变量:在函数或复合语句内定义;在函数或复合语句内定义; 只在该函数或复合语句中才能使用。只在该函数或复合语句中才能使用。 全局变量:全局变量:在函数外定义;在函数外定义; 从它被定义的位置起从它被定义的位置起, ,在在之后的之后的所有函数中有效。所有函数中有效。形式参数:形式参数:定义为函数的参数;定义为函数的参数; 只在该函数中才能使用。只在该函数中才能使用。第34页/共75页 在

12、函数内部说明的变量或者在复合语句中定义的变量称为局部变量。其作用范围是其所在的函数或复合语句。在函数内部说明的变量或者在复合语句中定义的变量称为局部变量。其作用范围是其所在的函数或复合语句。第35页/共75页 又称全程变量或外部变量,在函数外部说明。其作用范围从它被定义的位置起,在之后的程序段中都是起作用的。又称全程变量或外部变量,在函数外部说明。其作用范围从它被定义的位置起,在之后的程序段中都是起作用的。4、全局变量第36页/共75页 如果在全局变量定义之前的函数想引用该外部变量,则应该在该函数中用关键字如果在全局变量定义之前的函数想引用该外部变量,则应该在该函数中用关键字externext

13、ern作作“外部变量说明外部变量说明”。第37页/共75页int a, b; int a, b; void swap( ) void swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf( printf(“swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b); ,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”);); scanf( scanf(“%d,%d%d,%d”, &a, &b);, &a

14、, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:a=%d,b=%d”,a,b); ,a,b); Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=3,b=5main:a=3,b=5运行结果运行结果第38页/共75页int a, b; int a, b; void swap( ) void swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf( printf(“

15、swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b); ,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”);); scanf( scanf(“%d,%d%d,%d”, &a, &b);, &a, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:a=%d,b=%d”,a,b); ,a,b); 运行结果运行结果int a,b;int a,b;程序在编译时,屏幕将程序在编译时,屏幕将提示有错误提示有错误: :

16、 Undefine symbol Undefine symbol a a Undefine symbol Undefine symbol b b第39页/共75页int a, b; int a, b; void swap( ) void swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf( printf(“swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b); ,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”););

17、 scanf( scanf(“%d,%d%d,%d”, &a, &b);, &a, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:a=%d,b=%d”,a,b); ,a,b); 运行结果运行结果int a,b;int a,b;int a=5,b=3;int a=5,b=3;Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=5,b=3main:a=5,b=3第40页/共75页f1:t1=8,t2=12,a=8,b=10main

18、:a=2,b=10第41页/共75页结论:全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽(不影响),应小心使用程序输出结果为:t1=4,t2=12,b=100a=2,b=4第42页/共75页静态存储类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为永久存储。动态存储类型变量只生存在某一段时间内。例如,函数的形参和函数体或分程序中定义的变量, 只是在程序进入该函数或分程序时才分配存储空间, 当该函数或分程序执行完后,变量对应的存储空间又被撤销了。2.c语言中每一个变量有两个属性语言中每一个变量有两个属性:数据类型数据类型,存储特性存储特性完整的变量定义:

19、 存储特性 数据类型 变量名;第43页/共75页第44页/共75页静态变量只初始化一次结果:2 1 4 (a,b,c) 7 (f(a)2 1 5 82 1 6 9第45页/共75页寄存器寄存器变量只限于整型、字符型、指针型的局部变量。寄存器变量是动态变量,而且数目有限, 一般仅允许说明两个寄存 器变量。例如: register int d; register char c;第46页/共75页第47页/共75页 源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。n 预处理命令包括执行宏定义执行宏定义(宏替换宏替换)、包含文件和、包含文件和条件编译条件编译。第48页/共75页第4

温馨提示

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

评论

0/150

提交评论