《荆州职业技术学院C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《荆州职业技术学院C语言程序设计.ppt(39页珍藏版)》请在三一办公上搜索。
1、第七章 函数,C语言程序设计,课程讲义,2006年4月,上一章节课程回顾,数组的基本概念一维数组的定义和引用二维数组的定义和引用字符数组,首页,上页,下页,节,末页,结束,7.1概述,7.2函数定义的一般形式,7.3函数参数和函数的值,7.4数组作为函数参数,7.5函数的嵌套调用和递归调用,7.6全局变量和局部变量,7.7变量的存储属性,6.9程序举例,第7章 函数,首页,上页,下页,节,末页,结束,本次课主要内容,重点:一、重点掌握函数的定义、声明及传值 与调用。二、熟悉函数的嵌套与递归调用。三、掌握变量的作用域与存储类别,难点:一、形参与实参之间的值传递二、函数的嵌套与递归调用,本章主要内
2、容,函数,一、函数C语言中,程序是由函数来实现的。函数可分为(1):标准库函数(2)用户自定义函数。在C语言中,至少要有一个main()函数,程序的执行是从main()函数开始的,也是由主函数结束的。函数的调用过程如图:,7.1函数的概述,其中,每个方框相当于一个模块,而每个函数相当于一个输入输出系统。,例如:要设计一个如下图所示的管理程序:,花括弧内是函数体,它包括声明和语句部分,8.2 函数定义的一般形式,一、函数的定义与声明1、定义:存储类型 数据类型 函数名(带类型的形表)声明部分 语句 例如:int max(int x,int y)int z;z=xy?x:y;return(z);,
3、Return(z)的作用是将z的值作为函数值带回到主调函数中。在函数定义时已指定函数max函数为整型,在函数体中定义了z为整型,两者类型一致,将z作为函数max的值带回调用函数。,8.2 函数定义的一般形式,例L8-2-1.C:计算表达式的值 x x+1(x0)float y(float x)if(x0)return(x*xx+1);else return(x*x*x+x+3);注意:当有多个return语句时,每个return语句后面的表达式的类型应相同。,y=,8.2 函数定义的一般形式,如:func(int n)if(n10)return(2*x+3);else return;编译时,由
4、于第二个return语句而给出警告。说明:1)存储类型(后面讲)2)数据类型:指函数返回值的类型。若缺省函数类型,一律按整型处理。3)只有自定义函数而没有main()函数的程序是没有意义的。(例L82-1),8.2 函数定义的一般形式,2、函数的声明 数据类型 函数名(类型标记符 形参,);注意后面的“;”不要丢了。它与定义不同,一个函数一般要经过声明才能使用(就好象变量一样必须先声明才能使用),除非它在调用函数(main函数)的前面定义。只有当返回的数据类型为int,数据类型才可省略。如:main()double new_style(int,double);/*函数声明*/Double ne
5、w_style(int a,double x)/*函数定义*/,函数声明后面有“;”,函数定义后面没有“;”,8.3函数参数和函数的值,一、关于形参和实参的说明:1、形参只有当调用时才临时分配存储元。2、实参一定要有确定的值,可以是表式。3、实参和形参的类型应相同或赋值相容,并且实参的个数与形参的个数一致。,参数的传递是通过调用来完成的,分为按值传递和按址传递。,8.3函数参数和函数的值,二、函数的返回(return 语句)return 返回值表达式;return后面表达式的类型必须和函数定义时函数名前的类型保持一致。return语句有三种形式:1、return;(没有返回值)2、return
6、 表达式;3、return(表达式);,三、函数的调用函数名(实参表);(如果是有返回值的函数,则可将调用结果赋值给别的变量,若是无值函数,则不能赋值,只能单独调用;)四、形参、实参、参数的传递形参:定义函数的参数。实参:调用函数时有具体值的参数。,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);
7、是按值传递的按址传递放在指针里面讲。,程序运行结果:x=5,y=3a=3,b=5,Main()float x,y;float y(float);scanf(“%f”,float y(float x)if(x0)return(x*xx+1);else return(x*x*x+x+3);,#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),形参为整形,
8、二、数组名作为函数参数,有一个一唯数组score,内放10个学生的分数,求平均成绩。,#define N 10main()float scoreN,avg;float average(float arrN);int i;printf(Please input%d score:n,N);for(i=0;iN;i+)scanf(%f,形参和实参都用数组名,数组名作为函数参数,实参数组和形参数组类型应保持一致。在被调用函数中声明的数组大小是不起任何作用的。因为C编译系统对形参数组大小不作检查,形参数组名只代表一个地址,在调用时将实参数组的首地址传到形参数组名,也就是说,形参数组并不在内存中重新申请数
9、组的空间,而是和实参数组共占存储单元。,#define N 10main()float scoreN,avg;float average(float arrN);int i;printf(Please input%d score:n,5);for(i=0;i5;i+)scanf(%f,#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;j3;j+)if(i=j
10、|i+j=2)sum+=aij;return(sum);,嵌套与递归调用:嵌套调用:在调用一个函数的过程中又调用另一个函数。递归调用:一个函数直接或间接地调用本身。例L8_5_1.c 求n!的值#include“stdio.h”long factor(int);main()int i;scanf(“%d”,8.5函数的嵌套调用和递归调用,函数,long factor(int x)if(x=1|x=0)retur(1);else return(x*factor(x1);,程序中不应出现无终止的递归调用,用if语句来控制,只有在某一条件成立时才继续执行递归调用,否则就不再继续。,8.6全局变量和局
11、部变量,1、全局变量:是在函数之外定义的变量,它的有效范围是从定义它的地方开始,到整个程序结束的任何地方。2、局部变量:在一个函数内定义的变量,只在本函数内有效,这种变量就是局部变量。,Main()int a,b;int c;c=a+b;,8.6全局变量和局部变量,fun(int a,int b)int c;c=ab?a:b;return c;main()int a=7,b=10;fun(a,b);printf(max=%dn,d);,int d;d=fun(a,b);,8.6全局变量和局部变量,#include“stdio.h”int a=3,b=5;/*在函数体外定义的变量*/Main()
12、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;b=c;,例L8_6_1.c 交换两个变量的值,变量a,b是外部变量,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;,8.7变量的
13、存储属性,变量的存储类型有:register型:寄存器类型auto 型:自动型(缺省的都是auto型)static 型:静态型一、自动变量 auto 数据类型 变量名=初值表达式,;不作特殊说明的变量都是自动变量。它用之则建、用完即撤,仅在函数体内或复合语句内建立和有效,存储在内存的动态数据区中。例L8_7_1.c,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变量是局部变量,在赋值之前,其
14、值是不确定的,,8.7变量的存储属性,二、register变量(寄存器变量)与auto变量完全相同,只是速度快,存储在CPU的寄存器中。,#include“stdio.h”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();,8.7变量的存储属性,三、static 变量(静态变量)auto变量是在程序运行过程中建立的,是动态建立、动态撤消。而静态变量是在程序一开始就
15、建立的,不撤消直到程序结束。因而其值具有可继承性,但它只能在本程序内使用。,结果为:1,2,3,一般需要保留函数上一次的调用结果时,就定义成静态变量,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);,#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;o
16、ne();printf(%d,%dn,x,y);,x,y是全局变量,a,b是局部变量,只在one函数体内有效,运行结果:15,35,a,b是只在main函数内有效的局部变量,#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是全局变量,运行结果:14,4,#include stdio.hthree()extern int x,y;int a=25,b=10;x=a-b;
17、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,35,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。一个C程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用多次。要正确使用程序,一定要了解函数的正确使用。即掌握,1、函数的一般定义、以及形式参数与实参之间的值的传递。、函数的调用,以及函数的嵌套调用与递归调用。,本章小结,在C语言函数的定义和引用中,以下描述正确的是_A.必须有形式参数B.也可以没有形式参数C.数组名不能作为形式参数D.形式参数必须是变量名,本题考核了函数的定义形式。正确答案是B。,课堂同步:做做与练练,【练8.1】,试题分析,选择正确的选项:,C语言规定,函数返回值的类型是由_决定的 return语句中的表达式类型 调用该函数时的主调函数类型调用该函数时由系统临时 在定义函数时所指定的函数类型,本题考核了函数定义时函数类型。正确答案是D。,课堂同步:做做与练练,【练8.2】,试题分析,选择正确的选项:,课堂同步:课后练习与作业,1、编写一个函数,判断任一整数是否为素数,用main()函数调用并测试之。,2、用递归方法求n!。,