第十七讲函数(1)
学时:2学时
授课形式:板书+多媒体讲解+实例程序演示
主要内容及时间安排(课堂90分钟, 80分钟讲课,5分钟复习,5分钟总结):
(1)模块化程序结构的概念、C语言程序结构回顾(5分钟);
(2)函数调用简单例子分析(10分钟);
(3)函数的定义方法(三种有参、无参、空函数)(10分钟)
(4)函数参数和函数值(参数传递方法、参数类型对应关系、函数返回值的含义、返回值的类型等)(20分钟)
(5)简单函数定义和调用举例(40分钟)
(6)总结、习题布置和下一节知识点提要(习题8.1、8.3、8.4,下一节函数的使用深入、变量的作用域、变量的存储分类等)(5分钟)
重点:函数定义方法、函数调用方法、函数参数传递方法、返回值的使用和类型确定;
难点:函数调用方法、函数参数传递方法。
教学内容细节:
一、以具体实例引出函数的优点及函数的作用
例题:打印行列数不同的*号组成的多个矩形,比如打印3*4的、5*6、9*9的。
例题2:求连加和。输入的数不同;
例题3:程序规模方面考虑,如果有些题目太大,把所有程序都编在主函数中,主函数可读性会下降,规模结构也不尽合理。
所以可以考虑将部分程序功能做成功能包(函数),什么时候需要这个功能,什么时候调用这个功能包,这时只写功能包的名字就好了。代码的重用性增强、程序结构简化、可读性强、结构性强。
二、函数的定义方法
定义函数的一般形式如下:
类型标识符函数名(形式参数列表)
{声明部分;
执行部分;}
说明:
(1)类型标识符:C语言的数据类型,包括基本数据类型、指针、结构体等;
(2)函数名:符合C语言用户标识符的命名规则;
(3)形式参数列表:与从主调函数中传过来的参数相对应的形式参数列表,根据实际情况可有可无,但是小
扩号必须要有;与形参对应的是实参,主调函数中变量成为实际参数,实际参数在程序运行时分配空间,直到程序结束,空间释放,而形式参数什么时侯调用什么时候分配空间,子函数调用结束空间就释放。
(4){}:大括号必须要有,表示函数体的开始(左括号)和结束(用return或右括号)
特殊说明:
函数定义有两种形式:传统方式和现代方式,上面的是现代方式,传统方式的形参放在小括号外进行说明,小括号内只写上参数列表,对于参数类型不做说明,具体说明放在小括号和大括号之间。
对于函数体中用到的局部变量(不是用来接收主调函数传过来的变量),需要放到函数体中进行声明,就像我们以前设计主函数的函数体是一样的。
例1:两个数求最大值
int max(int x,int y)
{int t;
if(x>y) t=x;
else t=y;
return(t);}
分析:
(1)这个函数定义属于现代类型,函数返回值为两
个整数的较大值,所以函数类型需要说明为int类型;
(2)形式参数是两个,也就是主调函数需要给它两个值,让它在函数体内进行操作,形参的命名可以随意;
(3)在函数体中为了保存两个数中的最大值,新定义一个局部变量t,这个变量不能放在形参列表中,否则会要求主调函数传过来3个参数;
(4)return的作用是返回到主调函数,从哪调用的返回到哪。然后子函数结束。
三、函数的调用方法
依据上个例子,进行函数调用,只有产生函数调用,子函数才会起作用,否则子函数不起作用。
#include
main()
{
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max=%d",c);
}
int max(int x,int y)
{
int t;
if(x>y) t=x;
else t=y;
return(t);
}
四、关于return的说明
return的作用是将值返回到主调函数,其后的小括号可省略,但要用空格将返回的值和return分开。
每个子函数只能执行一次return,只要执行return 就返回到主调函数,return后的语句将不被执行。
return后的值类型和函数定义时的类型说明标识符一致,否则会出错,如果不一致编译也没有出错,则返回值的类型以类型说明符为准。
return语句不是子函数必须的,有的子函数只是执行具体功能语句,并不返回值,所以可以没有return语句。
return每次只能返回一个值,如果想返回多个值,就要考虑其他方法了。
五、关于变量类别及作用范围的说明
变量的类型包括:
Auto:自动变量,定义变量时默认的设置,使用时分配空间;
Static:静态变量,值一旦更改不能被二次初始化,只能用改变之后的值,一般考试时,这种定义往往放在子
函数中。如果定义了整形的静态变量,并没有赋初值,则
默认为0;
Register:寄存器变量,类似于auto只不过是放在
计算机CPU的寄存器中,运算速度比较快,但不能定义太多。
六、简单函数调用程序的设计
例1、设计函数实现求n!。
例2、设计函数实现数组的排序;注意交换两个数也
用函数实现;
七、其他练习题
(1)若函数中有定义语句:int k; ,则
A)系统将自动给k赋初值0 B)这时k中的值无
定义
C)系统将自动给k赋初值-1 D)这时k中无任何
值
(2)设函数中有整型变量n,为保证其未赋初值
的情况下初值为0,应选择的存储类别是
A)auto B)register C)static D)auto或register
(3)在C 语言中,只有在使用时才占用内存单元的
变量,其存储类型是
A)auto和 register B)extern 和register
C)auto 和static D)static 和register (4)有以下程序
#include
int f(int x,int y)
{ return((y-x)*x);}
main( )
{int a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf(“%d\n”,d);
}
程序运行后的输出结果是
A)10 B)9 C)8 D)7
(5)有以下程序
#include
void f(int *p,int *q);
main( )
{int m=1,n=2,*r=&m;
f(r,&n); printf(“%d,%d”,m,n);
}
void f(int *p,int *q)
{p=p+1; *q=*q+1;}
程序运行后的输出结果是
A)1,3 B)2,3 C)1,4 D)1,2 (6)有以下程序
#include
void fun(int a,int b)
{int t;
t=a;a=b;b=t;
}
main()
{int c[10]={1,2,3,4,5,6,7,8,9,0},i;
for(i=0;i<10;i+=2)
fun(c[i],c[i+1]);
for(i=0;i<10;i++) printf("%d,",c[i]);
printf("\n");
}
程序运行的结果是
A)1,2,3,4,5,6,7,8,9,0,
B)2,1,4,3,6,5,8,7,0,9,
C)0,9,8,7,6,5,4,3,2,1,
D)0,1,2,3,4,5,6,7,8,9,
(7)有以下程序
#include
int a=1;
int f(int c)
{static int a=2;
c=c+1;
return (a++)+c;
}
main()
{int i,k=0;
for(i=0;i<2;i++)
{int a=3; k+=f(a);}
k+=a;
printf("%d\n",k);
}
程序的运行结果为
A)14 B)15 C)16 D)17