C语言程序设计教案---第八章-函数

  • 格式:docx
  • 大小:23.67 KB
  • 文档页数:12

精心整理

第八章 函 数

课题: 第八章 函数 §1~§4

教学目的: 1、驾驭函数定义的一般形式

2、驾驭函数调用的一般形式

教学重点:

教学难点: 函数定义、调用的一般形式

形式参数和实际参数

步骤一 复习引导

一个C语言源程序可由一个主函数和假设干个协助函数组成。

由主函数调用其他函数,其他函数也可以相互调用。

步骤二 讲授新课

§8.1 概述

例8.1

main( )

{ printstar( );

print_message( );

printstar( );

}

printstar( )

{ printf( “ ********** \n”); }

print_message( )

{ printf(“How do you do ! \n”); }

说明:

 1、一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。

 2、一个C程序由一个或多个源程序文件组成。这样可以分别编写、分别编译,提高调度效率。

 3、C程序的执行从main 函数起先,在main函数中完毕整个程序的运行。

 4、全部函数都是平行的,即函数不能嵌套定义,函数可以相互调用,但不能调用main函数。

 5、从用户运用的角度看,函数有两种:标准函数(库函数)和用户自己定义的函数

 6、从函数的形式看,函数分为两类:无参函数和有参函数

§8.2 函数定义的一般形式

〔一〕无参函数的定义形式

类型标识符 函数名( )

{

函数体(包括声明局部和执行局部)

}

例: printstar( )

{ printf( “ ********** \n”); }

〔二〕有参函数定义的一般形式

类型标识符 函数名(形式参数表)

{

函数体(包括声明局部和执行局部)

} 精心整理

例如:int max(int x, int y)

{ int z;

z=x>y?x:y;

return (z);

}

〔三〕一个函数可以是空函数

如 dummy( ) { }

§8.3 函数参数和函数的值

〔一〕形式参数和实际参数 形式参数:定义函数时函数名后括号中的变量名,简称形参;

实际参数:调用函数时函数名后括号中的表达式,简称实参。

main( )

{ int a,b,c;

scanf(“%d,%d”,&a,&b);

c = max(a, b); /*调用max函数*/

printf(“max=%d”,c);

}

int max(int x ,int y) /*定义max函数*/

{ int z;

z=x>y?x: y;

return(z);

}

关于形参和实参的说明:

形参在未出现函数调用时,并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被安排内存单元。在调用完毕后,形参所占的内存单元也被释放。

2、实参可以是常量、变量或表达式,如:c = max(3,a+b);

但要求它们有确定的值。在调用时将实参的值赋给形参〔假如形参是数组名,那么传递的是数组的首地址,而不是变量的值。〕

3、在被定义的函数中,必需指定形参的类型;

4、实参与形参的类型应相同。

5、C语言规定,实参对形参的数据传递是“值传递”,即单向传递。在内存中,实参单元与形参单元是不同的单元。

〔二〕函数的返回值

1、return语句

return (表达式〕;

或:return 表达式;

或:return;

或:函数执行到最终遇到 “}”

精心整理

return语句的用途有二:

〔1〕用于完毕函数的执行并返回到调用者;

〔2〕用来向调用者传递一个返回值。

 留意:该语句对非void函数适用。

2、函数值的类型

如: int max(x,y)

char letter(c1, c2)

double min(x, y)

C语言默认函数返回值为int型。

3、函数值的类型和return语句中表达式的值不相同,那么以函数类型为准;

main()

{ float a, b; int c;

scanf(“%f,%f”,&a,&b);

c=max(a,b);

printf(“Max is %d\n”,c);

}

max(float x, float y)

{ float z;

z = x>y? x: y;

return (z);

}

假设输入的数据状况为:1.5, 2.5

那么输出的结果为:Max is 2

4、假如被调函数中没有return语句,那么函数带回一个不确定值。

5、为了明确表示“不带回值”,可以用“void ”定义“无类型”〔或称“空类型”〕。如:

void print_message( )

{ printf(“How do you do!\n”); }

§8.4 函数的调用

要正的确现函数间的相互调用需满意以下条件:

第一,被调用函数必需存在且允许调用;

其次,必需给出满意函数运行时要求的参数;

第三,在调用一个函数之前一般应当对被调用函数进展声明。

〔一〕函数声明的一般形式

函数类型 函数名(参数类型1,参数类型2, …, 参数类型n);

或:函数类型 函数名(参数类型1 参数名1,参数类型2 …);

如:int print(char format, …);

char fun2(int i, char p1);

float add(float , float);

留意:函数声明与函数定义不同! 精心整理

〔二〕函数调用的一般方法

函数调用形式: 函数名(实参表列);

1.函数语句

如:前述例子中的 print();

2.函数表达式

如:c=max(a,b);

3.函数参数

如:m=max(a, max(b,c));

printf(“%d”, max(a,b));

例:main( )

{ int i=2, p;

p=f(i, ++i);

printf(“%d”,p);

}

TC环境下,按自右而左的依次

求值。此例 f(i, ++i) ~ f(3,3)

例:计算组合C(m,n)=m!/(n!(m-n)!)

main()

{ int m, n;

long cmn, temp;

long factor(int);

scanf(“%d %d”,&m,&n);

cmn=factor(m);

temp=factor(n);

cmn=cmn/temp;

cmn=cmn/factor(m-n);

printf(“%ld\n”,cmn);

}

步骤三 课堂小结

1、 有参函数的定义形式

2、 形参和实参的区分

3、 函数的声明和调用

步骤四 布置作业

书面作业:〔第八章课后练习〕8.1

int f(int a, int b)

{ int c;

if (a>b) c=1;

else if(a= =b)c=0;

else c=-1

return(c);

}

精心整理

课题: 第八章 函数 §5~§7

教学目的: 1、驾驭函数的嵌套调用和递归调用

2、驾驭虚实结合

教学重点:

教学难点: 嵌套和递归调用、数组作为函数参数

递归调用、虚实结合

步骤一 复习引导

float root(float x1, float x2)

{ int i; float x,y,y1;

y1=f(x1);

do

{ x=xpoint(x1,x2);

y=f(x);

if (y*y1>0)

{y1=y; x1=x; }

else {y2=y; x2=x;}

}while(fabs(y)>=0.0001);

return(x);

}

步骤二、讲授新课

§8.6 函数的递归调用

干脆或间接调用自身的函数为递归函数。

一个问题采纳递归方法来解决时必需符合以下条件:

〔1〕可将一个问题转化为具有同样解法的规模较小的问题;

〔2〕必需有明确的完毕条件。

[例8.7]:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁,问第4个人的岁数,他说比第3个人大2岁,问第3个人的岁数,他说比第2个人大2岁,问第2个人,他说比第1个人大2岁,问第一个人,他说是10岁。请问第5个人的岁数?〔P158〕

分析:明显这是一个递归问题。即:

age(5)=age(4)+2

age(4)=age(3)+2

age(3)=age(2)+2

age(2)=age(1)+2

age(1)=10

程序:

age(int n)

{ int c;

if(n= =1) c=10;

else c=age(n-1)+2;

return (c);

}

main( )

{ printf(“%d”,age(5));

}