荆州职业技术学院C语言程序设计7

上传人:ni****g 文档编号:567950487 上传时间:2024-07-22 格式:PPT 页数:40 大小:307.50KB
返回 下载 相关 举报
荆州职业技术学院C语言程序设计7_第1页
第1页 / 共40页
荆州职业技术学院C语言程序设计7_第2页
第2页 / 共40页
荆州职业技术学院C语言程序设计7_第3页
第3页 / 共40页
荆州职业技术学院C语言程序设计7_第4页
第4页 / 共40页
荆州职业技术学院C语言程序设计7_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《荆州职业技术学院C语言程序设计7》由会员分享,可在线阅读,更多相关《荆州职业技术学院C语言程序设计7(40页珍藏版)》请在金锄头文库上搜索。

1、首页首页 上页上页 下页下页节节末页末页结束结束第七章第七章 函数函数 C语言程序设计语言程序设计 课程讲义课程讲义 2006年年4月月2021/6/161首页首页 上页上页 下页下页节节末页末页结束结束上一章节课程回顾上一章节课程回顾数组的基本概念数组的基本概念一维数组的定义和引用一维数组的定义和引用二维数组的定义和引用二维数组的定义和引用字符数组字符数组首页首页 上页上页 下页下页节节末页末页结束结束2021/6/162首页首页 上页上页 下页下页节节末页末页结束结束 7.1 概述概述 7.2 函数定义的一般形式函数定义的一般形式 7.3 函数参数和函数的值函数参数和函数的值 7.4 数组

2、作为函数参数数组作为函数参数 7.5 函数的嵌套调用和递归调用函数的嵌套调用和递归调用 7.6 全局变量和局部变量全局变量和局部变量 7.7 变量的存储属性变量的存储属性 6.9 程序举例程序举例 第第7章章 函数函数首页首页 上页上页 下页下页节节末页末页结束结束2021/6/163首页首页 上页上页 下页下页节节末页末页结束结束本次课主要内容本次课主要内容重点:重点:一、重点掌握函数的定义、声明及传值一、重点掌握函数的定义、声明及传值 与调用。与调用。二、二、熟悉函数熟悉函数的嵌套与递归调用。的嵌套与递归调用。三、掌握变量的作用域与存储类别三、掌握变量的作用域与存储类别难点:难点:一、形参

3、与实参之间的值传递一、形参与实参之间的值传递二、函数的嵌二、函数的嵌套与递归调用套与递归调用本章主要本章主要内容内容2021/6/164首页首页 上页上页 下页下页节节末页末页结束结束函数一、函数C语言中,程序是由函数来实现的。函数可分为(1):标准库函数(2)用户自定义函数。在C语言中,至少要有一个main ( )函数,程序的执行是从main( )函数开始的,也是由主函数结束的。函数的调用过程如图:f11( )f21( )f31( )f1( )f11( );f2( )f11( );f22( );main( )f1( );f2( );2021/6/165首页首页 上页上页 下页下页节节末页末页

4、结束结束7.1函数的概述函数的概述其中,每个方框相当于一个模块,而每个函数相当于一个输入输出系统。inout例如:要设计一个如下图所示的管理程序:高等院校事务管理办公室管理教务管理科研管理财务管理图书管理后勤管理人事管理2021/6/166首页首页 上页上页 下页下页节节末页末页结束结束花括弧内是函数体,它包括声明和语句部分8.2 函数定义的一般形式函数定义的一般形式一、函数的定义与声明1、定义:存储类型 数据类型 函数名(带类型的形表) 声明部分 语句 例如:int max(int x,int y) int z; z=xy?x:y; return(z); Return(z)的作用是将z的值作

5、为函数值带回到主调函数中。在函数定义时已指定函数max函数为整型,在函数体中定义了z为整型,两者类型一致,将z作为函数max的值带回调用函数。2021/6/167首页首页 上页上页 下页下页节节末页末页结束结束8.2 函数定义的一般形式函数定义的一般形式例L8-2-1.C:计算表达式的值 x x+1 (x0)float y (float x ) if (x10) return (2*x+3); else return; 编译时,由于第二个return语句而给出警告。说明:1)存储类型(后面讲) 2)数据类型:指函数返回值的类型。若缺省函数若缺省函数类型,一律按整型处理。类型,一律按整型处理。

6、3)只有自定义函数而没有main()函数的程序是没有意义的。(例L82-1)2021/6/169首页首页 上页上页 下页下页节节末页末页结束结束8.2 函数定义的一般形式函数定义的一般形式2、函数的声明 数据类型 函数名 (类型标记符 形参 , );注意后面的“;”不要丢了。它与定义不同,一个函数一般要经过声明一个函数一般要经过声明才能使用(就好象变量一样必须先声明才能使用),除非它在调用函才能使用(就好象变量一样必须先声明才能使用),除非它在调用函数(数(main函数)的前面定义。函数)的前面定义。只有当返回的数据类型为int,数据类型才可省略。如:main( ) double new_st

7、yle ( int, double ); /*函数声明*/ Double new_style (int a, double x) /*函数定义*/ 函数声明后面有“;”函数定义后面没有“;”2021/6/1610首页首页 上页上页 下页下页节节末页末页结束结束8.3函数参数和函数的值函数参数和函数的值一、关于形参和实参的说明:1、形参只有当调用时才临时分配存储元。2、实参一定要有确定的值,可以是表式。3、实参和形参的类型应相同或赋值相容,并且实参的个数与形参的个数一致。参数的传递是通过调用来完成的,分为按值传递和按址传递。2021/6/1611首页首页 上页上页 下页下页节节末页末页结束结束8

8、.3函数参数和函数的值函数参数和函数的值二、函数的返回(return 语句) return 返回值表达式;return后面表达式的类型必须和函数定义时函后面表达式的类型必须和函数定义时函数名前的类型保持一致。数名前的类型保持一致。 return语句有三种形式: 1、return; (没有返回值没有返回值) 2、return 表达式; 3、return (表达式);2021/6/1612首页首页 上页上页 下页下页节节末页末页结束结束三、函数的调用函数名 (实参表);(如果是有返回值的函数,则可将调用结果赋值给别的变量,若是无值函数,则不能赋值,只能单独调用;)四、形参、实参、参数的传递形参:定

9、义函数的参数。实参:调用函数时有具体值的参数。2021/6/1613首页首页 上页上页 下页下页节节末页末页结束结束8.3函数参数和函数的值函数参数和函数的值例L8_3_1.cmain( ) int a=3, b=5; void swap( int , int ); (函数申明) swap (a, b); printf(“a=%d, b=%dn”, a, b);void swap (int x, int y) int temp; temp=x; x=y; y=temp; printf(“x=%d , y=%d n”, x, y);是按值传递的按址传递放在指针里面讲。Main()函数:调用Swa

10、p函数传递值35ab35xy 3temp程序运行结果:x=5,y=3a=3,b=52021/6/1614首页首页 上页上页 下页下页节节末页末页结束结束函数调用函数声明函数定义,其位置可以在main()前,这样可以省略函数申明。也可以在main()后。Main() float x,y; float y(float); scanf(“%f”,&x); Printf(“y=%8.2fn”,y(x);float y (float x ) if (x0) return (x*xx+1); else return (x*x*x+x+3);2021/6/1615首页首页 上页上页 下页下页节节末页末页结束

11、结束实参为数组元素#include stdio.hmain()int a3,i,m; int max(int,int); printf(Please input 3 int:n); for(i=0;ib?a:b);8.4、数组作为函数参数数组元素和简单变量具有相同的特性,因此可以作为函数的实参来出现。(L8_4_1)形参为整形2021/6/1616首页首页 上页上页 下页下页节节末页末页结束结束二、数组名作为函数参数有一个一唯数组score,内放10个学生的分数,求平均成绩。2021/6/1617首页首页 上页上页 下页下页节节末页末页结束结束形参形参实参实参#define N 10main(

12、)float scoreN,avg; float average(float arrN); int i; printf(Please input %d score:n,N); for(i=0;iN;i+)scanf(%f,&scorei); avg=average(score); printf(Average score is %7.2fn,avg);float average(float arrN)int i; float sum=0.0,aver; for(i=0;iN;i+) sum=sum+arri; aver=sum/N; return(aver);形参和实参都用数组名2021/6/

13、1618首页首页 上页上页 下页下页节节末页末页结束结束数组名作为函数参数实参数组和形参数组类型应保持一致。在被调用函数中声明的数组大小是不起任何作用的。因为C编译系统对形参数组大小不作检查,形参数组名只代表一个地址,形参数组名只代表一个地址,在调用时将实参数组的首地址传到形参数组名,也就是说,形参数组并不在内存中形参数组并不在内存中重新申请数组的空间,而是和实参数组共重新申请数组的空间,而是和实参数组共占存储单元。占存储单元。2021/6/1619首页首页 上页上页 下页下页节节末页末页结束结束根据需要另设一个参数传递需要处理的数组元素的个数数组元素要参加处理的实际个数#define N 1

14、0main()float scoreN,avg; float average(float arrN); int i; printf(Please input %d score:n,5); for(i=0;i5;i+)scanf(%f,&scorei); avg=average(score,5); printf(Average score is %7.2fn,avg);float average(float arr,int n)int i; float sum=0.0,aver; for(i=0;in;i+) sum=sum+arri; aver=sum/n; return(aver);2021

15、/6/1620首页首页 上页上页 下页下页节节末页末页结束结束实参为数组名形参定义二维数组的维数及每一维的大小,可以缺省第一维的大小#include stdio.hmain()int a33=1,1,1,1,1,1,1,1,1; int s(int aa3); clrscr(); printf(sum=%dn,s(a);int s(int a3)int sum=0; int i,j; for(i=0;i3;i+)for(j=0;jb?a:b; return c;main()int a=7,b=10; fun(a,b); printf(max=%dn,d);int d;d=fun(a,b);20

16、21/6/1625首页首页 上页上页 下页下页节节末页末页结束结束在函数fun()中,虽然没有定义变量a,b,但由于它们定义在程序的最前面,是全程变量,凡是在定义该变量的后面定义的函数均可以引用它们。8.6全局变量和局部变量全局变量和局部变量#include “stdio.h”int a=3, b=5; /*在函数体外定义的变量*/Main( ) void fun( ); printf(“ a= %d , b=%d n ” , a, b); fun ( ); printf(“ a= %d , b=%d n ” , a, b);void fun (void) int c ; c=a; a=b;

17、b=c; 例L8_6_1.c 交换两个变量的值变量a,b是外部变量2021/6/1626首页首页 上页上页 下页下页节节末页末页结束结束8.6全局变量和局部变量全局变量和局部变量 2、用extern声明外部变量,用以扩充外部变量的作用域。(1)在一个文件内声明外部变量:如:L8_6_1 main( ) void gx( ) int x, y; void gy( ) 还可用它在不同的程序中使用,如 在file1.c 中引用 file2.c中定义的变量x, y。extern int x, y;x,y原作用域 x,y新的作用域2021/6/1627首页首页 上页上页 下页下页节节末页末页结束结束8.

18、7变量的存储属性变量的存储属性 变量的存储类型有:register型:寄存器类型auto 型:自动型(缺省的都是auto型)static 型:静态型一、自动变量 auto 数据类型 变量名=初值表达式 , ;不作特殊说明的变量都是自动变量不作特殊说明的变量都是自动变量。它用之则建、用完即撤,仅在函数体内或复合语句内建立和有效,存储在内存的动态数据区中。例L8_7_1.c2021/6/1628首页首页 上页上页 下页下页节节末页末页结束结束程序一进入main()函数,变量x就被创建,当程序运行到此局部范围内(即花括号内)时创建,用完即撤消,即释放变量。当程序运行到函数prt()内部时,变量x才被

19、创建,离开函数时,就被撤消main( )int x=1; clrscr(); void prt(void); int x=3; prt( ); printf(x=%dn,x); printf(%dn,x);void prt(void) int x=5; printf(%dn,x);总之,总之,auto变量是局部变量,变量是局部变量,在赋值之前,其值是不确定的,2021/6/1629首页首页 上页上页 下页下页节节末页末页结束结束 8.7变量的存储属性变量的存储属性二、register变量(寄存器变量)与auto变量完全相同,只是速度快,存储在CPU的寄存器中。#include “stdio.h

20、”void m_table(void) register int i, j; for (i=1 ; i=9 ; i+) for (j=1 ; j=i ; j+) printf(“%d * %d =%d ”, j, i, j*i); putchar ( I=j)? n : t ); Main() void m_table( ); m_table( );2021/6/1630首页首页 上页上页 下页下页节节末页末页结束结束8.7变量的存储属性变量的存储属性三、static 变量(静态变量)auto变量是在程序运行过程中建立的,是动态建立、动态撤消。而静态变量是在程序一开始就建立的,不撤静态变量是在

21、程序一开始就建立的,不撤消直到程序结束。因而其值具有可继承性,消直到程序结束。因而其值具有可继承性,但它只能在本程序内使用。结果为:1, 2, 3一般需要保留函数上一次的调用结果时,就定义成静态变量Void incr(void) static int x=0; x+; printf(“%d n ” , x );例L8-7-2.cmain( ) void incr(void); incr( ); incr( ); incr( );2021/6/1631首页首页 上页上页 下页下页节节末页末页结束结束上一次的结果,即n-1的阶乘对静态局部变量赋初值时在编译时进行的,也就是整个程序的运行过程中,它已

22、经有初值,以后每次调用函数时不再重新赋初值而保留了上一次的运行结果。Static变量例8-7-3.c:打印1到5的阶乘值int fac(int n)static int f=1; f=f*n; return(f);main()int i; for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);2021/6/1632首页首页 上页上页 下页下页节节末页末页结束结束#include stdio.hint x,y;one()int a,b; a=25,b=10; x=a-b; y=a+b; return;main()int a,b; a=9,b=5; x=a+b; y=a-b

23、; one(); printf(%d,%dn,x,y);x,y是全局变量 a,b是局部变量,只在one函数体内有效运行结果:15,35a,b是只在main函数内有效的局部变量2021/6/1633首页首页 上页上页 下页下页节节末页末页结束结束#include stdio.hint x,y;two()int a=25,b=10; int x,y; a=25,b=10; x=a-b; y=a+b; return;main()int a=9,b=5; x=a+b; y=a-b; two(); printf(%d,%dn,x,y);x,y是全局变量a,b,x,y是局部变量。在two函数体内有效a,b

24、,x,y是在main()内有效的局部变量运行结果:14,42021/6/1634首页首页 上页上页 下页下页节节末页末页结束结束#include stdio.hthree()extern int x,y; int a=25,b=10; x=a-b; y=a+b; return;int x,y;main()int a=9,b=5; x=a+b; y=a-b; three(); printf(%d,%dn,x,y);运行结果:15,352021/6/1635首页首页 上页上页 下页下页节节末页末页结束结束 一个较大的程序一般应分为若干个程序模块,每一个模一个较大的程序一般应分为若干个程序模块,每一

25、个模块用来实现一个特定的功能。一个块用来实现一个特定的功能。一个C程序可由一个主函数和程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用多次。以互相调用。同一个函数可以被一个或多个函数调用多次。要正确使用程序,一定要了解函数的正确使用。即掌握要正确使用程序,一定要了解函数的正确使用。即掌握1、函数的一般定义、以及形式参数与实参之间的值、函数的一般定义、以及形式参数与实参之间的值的传递。的传递。、函数的调用,以及函数的嵌套调用与递归调用。、函数的调用,以及函数的嵌套调用与递归调用。

26、本本章章小小结结2021/6/1636首页首页 上页上页 下页下页节节末页末页结束结束在在C语言函数的定义和引用中,以下描述正确的是语言函数的定义和引用中,以下描述正确的是_A. 必须有形式参数必须有形式参数B. 也可以没有形式参数也可以没有形式参数C. 数组名不能作为形式参数数组名不能作为形式参数D. 形式参数必须是变量名形式参数必须是变量名本题考核了函数的定义形式。正确答案是本题考核了函数的定义形式。正确答案是B。课堂同步:课堂同步: 做做与练练做做与练练 【练练8.1】试题分析试题分析选择正确的选项:选择正确的选项: 2021/6/1637首页首页 上页上页 下页下页节节末页末页结束结束

27、C语言规定,函数返回值的类型是由语言规定,函数返回值的类型是由_决定的决定的 A.return语句中的表达式类型语句中的表达式类型 B.调用该函数时的主调函数类型调用该函数时的主调函数类型C.调用该函数时由系统临时调用该函数时由系统临时 D.在定义函数时所指定的函数类型在定义函数时所指定的函数类型本题考核了函数定义时函数类型。正确答案是本题考核了函数定义时函数类型。正确答案是D。课堂同步:课堂同步: 做做与练练做做与练练 【练练8.2】试题分析试题分析选择正确的选项:选择正确的选项: 2021/6/1638首页首页 上页上页 下页下页节节末页末页结束结束课堂同步:课堂同步:课后练习与作业课后练习与作业 1、编写一个函数,判断任一整数是否为素数,用、编写一个函数,判断任一整数是否为素数,用main()函数调用并测试之函数调用并测试之 。2、用递归方法求、用递归方法求n! 。 2021/6/1639首页首页 上页上页 下页下页节节末页末页结束结束 结束语结束语若有不当之处,请指正,谢谢!若有不当之处,请指正,谢谢!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号