C语言程序设计课程课件之第三章模块化程序设计_第1页
C语言程序设计课程课件之第三章模块化程序设计_第2页
C语言程序设计课程课件之第三章模块化程序设计_第3页
C语言程序设计课程课件之第三章模块化程序设计_第4页
C语言程序设计课程课件之第三章模块化程序设计_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计课程课件之第三章模块化程序设计C语言程序设计课程课件PPT之第三章模块化程序设计v 如果程序中有多个数,如果程序中有多个数,多处需要判断是否是素多处需要判断是否是素数,怎么办?反复书写数,怎么办?反复书写那段重复的代码?那段重复的代码?将判断素数的将判断素数的功能用一个独立的模块来功能用一个独立的模块来实现,即自定义函数;在实现,即自定义函数;在main函数中反复调用此函数中反复调用此功能模块就可以了。功能模块就可以了。for(i=2;i=x/2) printf(yesn); else printf(non);main三三 int a,b; printf(input a numb

2、er:); scanf(%d%d,&a,&b); sushu(a); sushu(b);实现了代码的复用;实现了代码的复用;编程效率高;代码编程效率高;代码少;少;功能分解,易于功能分解,易于实现;实现;便于合作开发大便于合作开发大型项目等。型项目等。1 1掌握函数定义的一般形式。掌握函数定义的一般形式。2 2掌握函数调用的两种方式。掌握函数调用的两种方式。3 3理解函数形参与实参的对应关系、参数传递理解函数形参与实参的对应关系、参数传递方法及函数返回值的概念。方法及函数返回值的概念。4 4掌握指针的含义。掌握指针的含义。5 5掌握指针作为函数参数的数据传递特点。掌握指针作为函

3、数参数的数据传递特点。 函数的定义函数的定义:应写在其它函数的外面,前:应写在其它函数的外面,前后都可以,但不能写在内部。后都可以,但不能写在内部。 函数的定义函数的定义 第一行写函数名和括号第一行写函数名和括号 第二行开始是函数体,用大括号扩起来,如:第二行开始是函数体,用大括号扩起来,如: 函数名称用户自定函数名称用户自定 函数定义的函数定义的:函数被调用在前面,而函数:函数被调用在前面,而函数定义书写在后面的,需要在使用该函数前进行定义书写在后面的,需要在使用该函数前进行声明。声明。 函数声明的形式:将函数定义的第一行信息重函数声明的形式:将函数定义的第一行信息重新写一遍,新写一遍,末尾

4、加分号末尾加分号。声明可以放在调用之声明可以放在调用之前的任意位置处。前的任意位置处。main三 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 );函数声明的几种变通形式:函数声明的几种变通形式:主调函数主调函数自定义函数自定义函数 有

5、参函数有参函数 无参函数无参函数 有返回值函数有返回值函数 无返回值函数无返回值函数无论有参、无参,无论有参、无参,函数名后的括号不函数名后的括号不能省略。能省略。通常也无返回值,仅需书写:通常也无返回值,仅需书写: void void 函数名三;函数名三;例如:例如: void clrscr void clrscr讲义讲义; void draw void draw讲义讲义 main main三三 draw draw三三; ; draw draw三三; ; 如果有返回值,则写明返回值类型,如果有返回值,则写明返回值类型, 例如例如 char getchar char getchar三;三; c

6、h=getchar ch=getchar三三; ;需写明参数的个数和类型:需写明参数的个数和类型: 如:如: 【强调】:【强调】:,类型,类型相同不能只写一个,例如下错误:相同不能只写一个,例如下错误: float fun(int m, n);float fun(int m, n);例如:求两个数的最大值的函数参数设计例如:求两个数的最大值的函数参数设计: max( ) 分析设计函数首部信息: 实验4-1-4: float fun(int n) 实验4-1-5: float fun(int m,int n) 实验4-1-7: void fun三有返回值函数,在函数体内用有返回值函数,在函数体内

7、用语句返回处理的结语句返回处理的结果值。果值。如:如:语句的两个功能:返回值、结束函数调用。语句的两个功能:返回值、结束函数调用。如果函数不返回值,则名称前写如果函数不返回值,则名称前写void,如:如:如果定义函数时名称前没写明类型,默认为如果定义函数时名称前没写明类型,默认为int类型类型,如:如:如果函数体内:如果函数体内return语句返回值的类型与语句返回值的类型与定义的函数名前类型不同,则以函数名前面的类型定义的函数名前类型不同,则以函数名前面的类型为准,系统会自动进行类型转换,可能会产生误差为准,系统会自动进行类型转换,可能会产生误差或错误。或错误。例:编写一个函数,其功能是求例

8、:编写一个函数,其功能是求m的的n次方,即次方,即mn。分析:函数参数分析:函数参数 函数返回值函数返回值函数首部信息如下:函数首部信息如下: double fun(int m,int n) int i; double t=1; for(i=1;i=n;i+) t=t*m; main三三 int a,b; double c; printf(input two numbers:); scanf(%d%d,&a,&b); c=fun(a,b); printf(%.0lfn,c);return (表达式);表达式);return 表达式;表达式;形参在括号中定义形参在括号中定义后,直

9、接在函数中后,直接在函数中使用,不能再次定使用,不能再次定义。义。形参:定义时括号内的参数叫做形式参数,简称形参。形参:定义时括号内的参数叫做形式参数,简称形参。实参:调用是给予的实际数值叫做实际参数,简实参:调用是给予的实际数值叫做实际参数,简称实参。称实参。形参和实参:个数相同、类型一致、一一对应。形参和实参:个数相同、类型一致、一一对应。例如求例如求m的的n次方的函数:次方的函数: float fun(int m,int n)调用时如果求调用时如果求4的的5次方,只能书写次方,只能书写fun(4,5);不能写不能写为为fun(5,4);double fun(int m,int n) in

10、t i; double t=1; for(i=1;i=n;i+) t=t*m; main三三 int a,b; double c; printf(input two numbers:); scanf(%d%d,&a,&b); c=fun(a,b); printf(%.0lfn,c);实参可以是常量、变实参可以是常量、变量、表达式等。如:量、表达式等。如:fun(2,8) fun(3,1+5)double fun(int m,int n) int i; double t=1; for(i=1;i=n;i+) t=t*m; main三三 int a,b; printf(input

11、two numbers:); scanf(%d%d,&a,&b); printf(%.0lfn, fun(a,b);double jiecheng(int n) int i; double t=1; for(i=1;i=n;i+) t=t*i; main三三 int a,i; double b=0; scanf(%d,&a); for(i=1;i=a;i+) b=b+jiecheng(i); printf(%.0lfn,b);printf(%.0lfn, );编写一个函数,其功能画编写一个函数,其功能画m行行n列的矩形。列的矩形。分析:函数参数分析:函数参数 函数返回值

12、函数返回值函数首部信息如下:函数首部信息如下:voidvoid 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三);例例 全局变量举例全局变量举例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;编译出错因为全局变量的作用域因为全局

13、变量的作用域为为定义位置后定义位置后的任何的任何函数函数 全局变量意味着多个函数可使用它,全局变量意味着多个函数可使用它,就是说各函数之间通过全局变量产生了相就是说各函数之间通过全局变量产生了相互的值的影响,因此降低了函数的独立性,互的值的影响,因此降低了函数的独立性,使各函数间依赖型增强。使各函数间依赖型增强。应尽量少使用全局变量应尽量少使用全局变量int a=13,b=8;int sum三 int z; z=a+b; a+; b-; return(z);main三 printf(“a=%d,b=%d,a,b); printf(“sum=%d,sum三); printf(“a=%d,b=%d

14、,a,b);输出结果为:输出结果为:a=13,b=8;sum=21;a=14,b=7;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);例 全局变量与局部变量同名举例int i;main三 void prt三; for(i=0;i5;i+) prt三;void prt三 for(i=0;i5;i+) printf(“%c”,*); printf(“n”);例 全局变量副作用运行结果:运行结果:*局部局部变量的存储类别:动态存储变量和静态存储变量。变量的存

15、储类别:动态存储变量和静态存储变量。 auto动态存储变量是在程序运行时根据需要动态分配动态存储变量是在程序运行时根据需要动态分配存储空间。存储空间。函数被调用函数被调用时,分配给内存单元,调用结束后就时,分配给内存单元,调用结束后就释放内存单元。释放内存单元。 static静态存储变量局是指程序运行期间分配固定的存静态存储变量局是指程序运行期间分配固定的存储空间。每次函数调用结束后不释放空间,只有在主程储空间。每次函数调用结束后不释放空间,只有在主程序运行结束才释放内存单元。序运行结束才释放内存单元。 static静态变量在函数多次调用时,只赋一次初值,每次调静态变量在函数多次调用时,只赋一

16、次初值,每次调用后保留当时的结果值。用后保留当时的结果值。局部变量的定义类型局部变量的定义类型 auto自动类型自动类型 如:如:atuo int i,a,b; static静态类型静态类型 如:如:static int x,y; register 寄存器类型寄存器类型 如:如:register int i;补充:如无特殊声明,默认为补充:如无特殊声明,默认为auto类型类型全局变量的定义类型全局变量的定义类型 static 静态类型(默认是静态类型(默认是static类型)类型) extern 外部类型外部类型 如:如:extern int s;补充:如无特殊声明,默认为补充:如无特殊声明,

17、默认为static类型类型int 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=13a=0,b=-10,n=13a=6,b=10,n=25模块化程序设计指 针普通函数参数值传递的特点普通函数参数值传递的特点函数函数ret

18、urn语句返回值的特点语句返回值的特点void swap(int x,int y)void swap(int x,int y) int t; int t; t=x; t=x; x=y; x=y; y=t; y=t; mainmain三三 int a,b; int a,b; printf(input a number:); printf(input a number:); scanf(%d%d,&a,&b); scanf(%d%d,&a,&b); swap(a,b); swap(a,b); printf(After changer a=%d,b=%dn,a,b);

19、 printf(After changer a=%d,b=%dn,a,b); 输入4,3输出after change:a=4, b=3本例说明:自定义函数中修改了形参变量的值,反过来不本例说明:自定义函数中修改了形参变量的值,反过来不会影响主调函数中实参的值。会影响主调函数中实参的值。问题的引入问题的引入1、能不能在自定义函数中通过修改形参而改变主调函数中、能不能在自定义函数中通过修改形参而改变主调函数中的变量值。的变量值。2、如果想同时返回多个处理值给主调函数怎么办?、如果想同时返回多个处理值给主调函数怎么办?例题例题1:编写函数分别返回双精度实数的整数部分和:编写函数分别返回双精度实数的整

20、数部分和小数部分。小数部分。例题例题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、传递地址

21、、传递地址2、间接访问、间接访问int fun(double a,double *b) int x; x=(int)a; *b=a-x; return x;main三三 double x,y; int c; scanf(%lf,&a); c=fun(x,&y); printf(“zhengshu %d,xiaoshu %lf,c,y); 解解 决决 方方 案案 使用指针类型的参数使用指针类型的参数1、定义指针参数、定义指针参数3、传递地址、传递地址通过演示的例题说明:通过演示的例题说明: 为什么有时需要在函数的参数中为什么有时需要在函数的参数中使用指针类型的参数?使用指针类型的

22、参数? 1.可以同时将多个函数处理结果返回给主调函可以同时将多个函数处理结果返回给主调函数。数。2.可以间接访问主调函数的实参变量,即将函数内可以间接访问主调函数的实参变量,即将函数内的值反向传递给实参变量。的值反向传递给实参变量。本节内容本节内容1 1 指针的概念指针的概念2 2 指针变量的定义和引用指针变量的定义和引用3 3 指针作为函数参数指针作为函数参数指针概念指针概念使用指针类型:目的是引用变量的内存地址,不通过变量的名使用指针类型:目的是引用变量的内存地址,不通过变量的名称,而是直接通过内存地址对变量进行操作。称,而是直接通过内存地址对变量进行操作。因为变量的作用域范围限制,有时是

23、不能直接用变量名访问某些变量的,因为变量的作用域范围限制,有时是不能直接用变量名访问某些变量的,如下例:如下例:牢记一个概念:指针就是变量的地址。牢记一个概念:指针就是变量的地址。void swapvoid swap三三 int t; int t; t=a; a=b; b=t; t=a; a=b; b=t; mainmain三三 int a,b; int a,b; printf(input a number:); printf(input a number:); scanf(%d%d,&a,&b); scanf(%d%d,&a,&b); swap(a,b); s

24、wap(a,b); printf(After changer a=%d,b=%dn,a,b); printf(After changer a=%d,b=%dn,a,b); 变量a、b是函数main中的局部变量,不能在swap函数中使用。此时,需要知道变量此时,需要知道变量a,b的地址,通过地址间接访问的地址,通过地址间接访问a,bv 不同类型的变量系统在编译时为其分配不同字节的存储空间,例不同类型的变量系统在编译时为其分配不同字节的存储空间,例如如int类型,分配类型,分配4个字节的连续空间,个字节的连续空间,float类型分配类型分配4个字节、个字节、double类型分配类型分配8个字节、个

25、字节、char类型分配类型分配1个字节。个字节。v 所谓变量的地址就是这一连续内存空间的首地址编号。所谓变量的地址就是这一连续内存空间的首地址编号。v可使用可使用“&”运算符取出变量的地址,例如:运算符取出变量的地址,例如:变量的地址变量的地址main三三int a; float b; double x; char c; printf(a address is %xn,&a); printf(b address is %xn,&b); printf(x address is %xn,&x); printf(c address is %xn,&c);是一个

26、单独的变量,需要单独定义和赋值。是一个单独的变量,需要单独定义和赋值。它的里面存放的是另外一个变量的内存单元地址。它的里面存放的是另外一个变量的内存单元地址。2 2 指针变量的定义和引用指针变量的定义和引用定义形式:定义形式:基类型基类型 *指针变量名;指针变量名;举例:举例:int *p;char *m;指针指针p只能存放一个整型变只能存放一个整型变量的地址,指针量的地址,指针m只能存放只能存放char类型变量的地址。类型变量的地址。定义形式:定义形式: 基类型基类型 *指针变量名;指针变量名;举例:举例:int *p; float *m;赋值:赋值:int *p,a; p=&a;赋

27、值后,指针赋值后,指针p就指向了变量就指向了变量a,以后可以通过指针,以后可以通过指针p实现实现对变量对变量a的间接访。的间接访。指针变量只能赋地址值指针变量只能赋地址值pa5&a使用:使用:int *p,a; p=&a; *p=6;通过地址通过地址间接访问间接访问变量变量a,此处相当于此处相当于a6;此处的此处的*是间接访问符(或指向运算符)是间接访问符(或指向运算符)取存储单元的内容取存储单元的内容 ,注意与乘运算符不同。注意与乘运算符不同。 * 只能作用于指针变量。只能作用于指针变量。总结:总结:指针定义:指针定义:指针赋值:指针赋值:指针使用:指针使用:1. 等价式:等

28、价式:*p a int a,*p; p=&a; /* p指向指向a */ *p=6 /* 间接访问形式间接访问形式 */ a=5; /* 直接访问形式直接访问形式 */void fun(int *x,int *y) *x=*x+2; *y=*y+3;main三三 int a,b; printf(input a, b:); scanf(%d%d,&a,&b); fun(&a,&b); printf(after call a=%d,b=%dn,a,b); 参数的定义参数的定义参数在函数内的使用参数在函数内的使用实参的形式实参的形式ab11实参实参a函数调用函

29、数调用形参形参*x传递传递地址地址&a指针类型参数传递指针类型参数传递*x= *x +2v指针类型的形参,本质上传递的是指针类型的形参,本质上传递的是地址地址,因此值的传递是,因此值的传递是双向性双向性的,既可由实参将值传入函数,也可在函数内部的,既可由实参将值传入函数,也可在函数内部将值传回给实参。将值传回给实参。普通函数参数值传递的特点普通函数参数值传递的特点编写函数,求两个数的最大公约数和最小公倍数。编写函数,求一个数的各位数字之和,并判断它是否是素数。编写函数计算银行存款需要多少年才能翻一番,假设银行存款年利率为1.9 %,当时的金额是存款本金的多少倍?编写函数,将主调函数中两

30、个变量值分别乘2和除2。补充赋值补充赋值可以进行初始化,也可以使用赋值语句可以进行初始化,也可以使用赋值语句,但但必须赋地址值必须赋地址值。(1)、初始化:、初始化: int a, *s=&a; int *f=NULL;(2)、赋值语句、赋值语句 int a, *s; s=&a; s=20XX;注意:不能给指针变量赋一个整数值。注意:不能给指针变量赋一个整数值。注意:只能用同类型变量的地址进行赋值!注意:只能用同类型变量的地址进行赋值! 如定义:如定义:int *s; float f; 则则 s=&f;是非法的。;是非法的。表示空指针,即表示空指针,即不指向任何单元,不指向任何单元,在头文件中定义。在头文件中定义。int *s=&a,a;补充:指针变量可以进行的操作补充:指针变量可以进行的操作(1)赋值:)赋值:int a,*p1=&a,*p2; p2=p1;(2)输出:)输出:printf(“%x”,p1);(3)增减:)增减:p1+; p2-; p1+=4; (只能和一个整数

温馨提示

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

评论

0/150

提交评论