C语言模块化程序设计_图文_第1页
C语言模块化程序设计_图文_第2页
C语言模块化程序设计_图文_第3页
C语言模块化程序设计_图文_第4页
C语言模块化程序设计_图文_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、Rose 第三章模块化程序设计济南大学Rose引出如果程序中有多个数,多处需要判断是否是素数,怎么办?反复书写那段重复的代码?解决办法:将判断素数的功能用一个独立的模块来实现,即自定义函数;在main 函数中反复调用此功能模块就可以了。for(i=2;i=x/2printf(yesn;else printf(non;济南大学Rosemain( int a,b;printf(input a number:;scanf(%d%d,&a,&b;sushu(a;sushu(b;模块化的优点:实现了代码的复用;编程效率高;代码少;功能分解,易于实现;便于合作开发大型项目等。void sushu(int

2、xint i;for(i=2;i=x/2 printf(yesn;else printf(non;教学要求1.掌握函数定义的一般形式。2.掌握函数调用的两种方式。3.理解函数形参与实参的对应关系、参数传递方法及函数返回值的概念。4.掌握指针的含义。5.掌握指针作为函数参数的数据传递特点。3.2 函数的定义函数的定义位置:应写在其它函数的外面,前后都可以,但不能写在内部。函数的定义形式:第一行写函数名和括号第二行开始是函数体,用大括号扩起来,如:函数名称用户自定函数定义的基本知识函数定义的声明:函数被调用在前面,而函数定义书写在后面的,需要在使用该函数前进行声明。函数声明的形式:将函数定义的第一

3、行信息重新写一遍,末尾加分号。void sushu(int x ;main( sushu(a;void sushu(int x 声明可以放在调用之前的任意位置处。济南大学Rosemain( float add(float x,float y; float a,b,c;scanf(%f,%f,&a,&b;c=add(a,b;printf(sum is %f,c;float add(float x, float y float z;z=x+y;return(z;float add(float a,float b;float add(float ,float ;函数声明的几种变通形式:函数定义的高级

4、知识函数的参数函数的返回值参数返回值int sushu(int x济南大学Rose 函数的形式分类1有参函数无参函数函数的形式分类2有返回值函数无返回值函数无论有参、无参,函数名后的括号不能省略。济南大学Rose 无参函数定义通常也无返回值,仅需书写:void 函数名(;例如:void clrscr(;特点:空括号void draw( main( draw(;draw(; 如果有返回值,则写明返回值类型,例如char getchar(;ch=getchar(;济南大学Rose 有参函数定义需写明参数的个数和类型:类型函数名(类型参数1,类型参数2,如:int sushu(int n;float

5、 fun(int m,int n;【强调】:形参定义时需分别写明它们的类型,类型相同不能只写一个,例如下错误:float fun(int m,n;例如:求两个数的最大值的函数参数设计:max( floatfloat x, float y济南大学Rose 函数定义分析练习分析设计函数首部信息:实验4-1-4:float fun(int n实验4-1-5:float fun(int m,int n实验4-1-7:void fun(济南大学Rose 有返回值函数定义有返回值函数,在函数体内用return语句返回处理的结果值。如:int sushu(int x int i;for(i=2;i=x/2;

6、i+if(x%i=0 return 0;return 1; return语句的两个功能:返回值、结束函数调用。如果函数不返回值,则名称前写void,如: void draw(int x,int y如果定义函数时名称前没写明类型,默认为int类型,如:draw(int x,int y【注意】:如果函数体内return语句返回值的类型与定义的函数名前类型不同,则以函数名前面的类型为准,系统会自动进行类型转换,可能会产生误差或错误。?函数定义练习例:编写一个函数,其功能是求m 的n 次方,即m n 。分析:函数参数函数返回值2个,int 类型参数返回值为float 或double 类型函数首部信息如

7、下:double fun(int m,int n济南大学Rosedouble fun(int m,int n int i; double t=1;for(i=1;i=n;i+t=t*m;return t;main( int a,b; double c;printf(input two numbers:;scanf(%d%d,&a,&b;c=fun(a,b;printf(%.0lfn,c;return (表达式;return 表达式;形参在括号中定义后,直接在函数中使用,不能再次定义。济南大学Rose函数调用济南大学Rose 形参和实参形参:定义时括号内的参数叫做形式参数,简称形参。实参:调用是

8、给予的实际数值叫做实际参数,简称实参。形参和实参:个数相同、类型一致、一一对应。例如求m的n次方的函数:float fun(int m,int n调用时如果求4的5次方,只能书写fun(4,5;不能写为fun(5,4;返回值函数调用 int i; double t=1;for(i=1;i=n;i+t=t*m;return t;main( int a,b; double c;printf(input two numbers:;scanf(%d%d,&a,&b;c=fun(a,b;printf(%.0lfn,c;赋值实参可以是常量、变量、表达式等。如:fun(2,8fun(3,1+5返回值函数调用

9、输出 int i; double t=1;for(i=1;i=n;i+t=t*m;return t;main( int a,b;printf(input two numbers:;scanf(%d%d,&a,&b;printf(%.0lfn, fun(a,b;返回值函数调用 int i; double t=1;for(i=1;i=n;i+t=t*i;return t;main( int a,i; double b=0;scanf(%d,&a;for(i=1;i=a;i+b=b+jiecheng(i;printf(%.0lfn,b;表达式运算有返回值函数调用b=jiecheng(a;b=b+ji

10、echeng(i;printf(%.0lfn, jiecheng(a;总结:将函数调用看做一个可以利用的值。函数调用一般不作为独立语句存在。jiecheng(a;?无返回值函数调用编写一个函数,其功能画m 行n 列的矩形。分析:函数参数函数返回值2个,int 类型参数无返回值,为void函数首部信息如下:void draw(int m,int n济南大学Rose void draw(int m,int n int i,j;for(i=1;i=m;i+ for(j=1;ib?a:b;return(z;main( printf(a=%d,b=%d,a,b;printf(max=%d,max(;济南

11、大学Rose 例全局变量举例int max(int x, int y int z;z=xy?x:y;return(z;main( printf(a=%d,b=%d,a,b; printf(max=%d,max(a,b; int a=13,b=-8;编译出错因为全局变量的作用域为定义位置后的任何函数济南大学Rose全局变量意味着多个函数可使用它,就是说各函数之间通过全局变量产生了相互的值的影响,因此降低了函数的独立性,使各函数间依赖型增强。应尽量少使用全局变量济南大学Roseint a=13,b=8;int sum( int z;z=a+b;a+; b-;return(z;main(printf

12、(a=%d,b=%d,a,b;printf(sum=%d,sum(;printf(a=%d,b=%d,a,b;输出结果为:a=13,b=8;sum=21;a=14,b=7;济南大学Rose 例全局变量与局部变量同名举例int a=3,b=5;max(int a, int b int c;c=ab?a:b;return(c;main( int a=8;printf(max=%d,max(a,b;济南大学Rose 例全局变量副作用int i;main( void prt(;for(i=0;i5;i+prt(;void prt( for(i=0;i5;i+printf(%c,*;printf(n;运

13、行结果:*Rose 动态存储变量和静态存储变量局部变量的存储类别:动态存储变量和静态存储变量。auto动态存储变量是在程序运行时根据需要动态分配存储空间。函数被调用时,分配给内存单元,调用结束后就释放内存单元。static静态存储变量局是指程序运行期间分配固定的存储空间。每次函数调用结束后不释放空间,只有在主程序运行结束才释放内存单元。static静态变量在函数多次调用时,只赋一次初值,每次调用后保留当时的结果值。Rose 变量的声明类型局部变量的定义类型auto自动类型如:atuo int i,a,b;static静态类型如:static int x,y;register寄存器类型如:reg

14、ister int i;补充:如无特殊声明,默认为auto类型全局变量的定义类型static静态类型(默认是static类型extern 外部类型如:extern int s;济南大学Roseint n=1;void func( static int a=2;int b=5;a+=2; b+=5; n+=12;printf(a=%d,b=%d,n=%dn,a,b,n;main( int a=0,b=-10;printf(a=%d,b=%d,n=%dn,a,b,n;func(;printf(a=%d,b=%d,n=%dn,a,b,n;func(;a=0,b=-10,n=1a=4,b=10,n=1

15、3a=0,b=-10,n=13a=6,b=10,n=25济南大学Rose3.9模块化程序设计指针济南大学Rose 普通函数参数值传递的特点单向、值传递函数return语句返回值的特点只能返回一个值济南大学Rose void swap(int x,int y int t;t=x;x=y;y=t;main( int a,b;printf(input a number:;scanf(%d%d,&a,&b;swap(a,b;printf(After changer a=%d,b=%dn,a,b;输入4,3输出after change:a=4, b=3本例说明:自定义函数中修改了形参变量的值,反过来不会

16、影响主调函数中实参的值。济南大学Rose问题的引入1、能不能在自定义函数中通过修改形参而改变主调函数中的变量值。2、如果想同时返回多个处理值给主调函数怎么办?例题1:编写函数分别返回双精度实数的整数部分和小数部分。例题2:编写函数交换两个变量的值,并在主函数中输出结果。void fun(int *x,int *y int t;t=*x;*x=*y;*y=t;main(int a,b;printf(input a, b:;scanf(%lf%d,&a,&b;fun(&a,&b;printf(after call a=%d,b=%dn,a,b;1、定义指针参数2、间接访问3、传递地址2、间接访问int

温馨提示

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

评论

0/150

提交评论