admin 管理员组

文章数量: 1184232


2024年2月18日发(作者:大气的博客模板)

隆回县职业中专学校教学、学习设计方案

专 业 科: 信息科 年级: 二 科目: C程序

方案设计: 史春水 方案审核: 备课节次:

章 节

课 题 用户自定义函数

学习内容 掌握C语言函数的定义格式和调用方法

学习重点 C语言函数的定义格式和调用方法

学习难点 C语言函数的调用

学 习 程 序

一、知识回顾 问题提出

1、想一想:C语言函数的组成结构?

2、C语言函数的调用过程?

二、自主学习 互动探究

知识点一:函数的定义

1 .无参函数的定义形式

类型标识符 函数名( )

{ 说明部分

语句 }

2. 有参函数的定义形式

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

{说明部分

语句}

方式1

函数返回值类型名 函数名(参数列表)

参数类型说明

{ 局部变量说明;

语句序列; } 如: int max(a,b)

int a,b;

方式2

函数返回值类型名 函数名(参数类型说明及参数列表)

{ 局部变量说明;

语句序列; } 如: int max(int a,int b)

3. “空函数”的定义形式

类型标识符 函数名( ) { }

【例7-1】定义符号函数sign。

int sign(x) /*函数返回值类型如未说明,默认为int,建议给出函数类型说明*/

int x; /*形式参数说明*/

{ int y; /*函数体局部变量*/

1

第7章 函数

y=x>0?1:(x==0?0:-1);

return y; /*返回函数值*/

}

知识点二:函数各部分作用:

1)函数的说明部分

函数说明部分用于描述函数的类型, 函数名, 参数表及参数类型。

(1)函数的类型说明

函数的类型即函数的返回值类型。若函数不提供返回值,则可定义其类型为: void。

例如: void putdata(int a)

(2) 函数名

函数名又称函数标识符。命名遵循C语言标识符的规定;函数名要反映函数完成的功能。

(3)参数表

参数表写在函数名后的( )内,由一个或多个变量标识符及类型标识符组成。

①参数表中的变量称为形式参数, 简称形参。

②若函数没有形参,则称为无参函数,其后“( )”不能省略。

③参数必须指定类型。形参的类型说明有两种:

方法1: int max(a,b)

int a,b;

方法2: int max(int a, int b)

2)函数体

函数体包括变量定义和执行语句序列。函数所完成的工作由函数体中一段程序实现。

Ø函数的返回值用返回语句return返回,形式:

return (返回值表达式);或 return 返回值表达式;

注意:如果函数的类型与return语句的表达式的类型不一致时, 则以函数的类型为准。返回时自动进行数据转换。

3)注意:函数不可以嵌套定义,但可以嵌套调用。

知识点三:函数的调用

函数语句的格式是:<被调函数名>([<实际参数表>])

(1)若调用无参函数,可省略实参表列,但要保留括号。

(2)实参表列中有多个参数时,要用逗号隔开。

(3)实参与形参的个数、类型应一一对应。

函数调用的方式是:函数语句调用、函数表达式调用和函数参数调用

1)函数语句。把函数作为一个语句,不要求返回值,只要求函数完成一定的操作。

printstar( );

2)函数表达式。函数出现在一个表达式中,要求带回一个确定的值参加运算。

c=2*max(a,b);

3)函数参数。函数调用的返回值作为另一次调用的实参。如: m=max(a,max(b,c));

方式1、采用函数语句形式调用函数

void max(int a,int b,int c)

{ int y;

y=(a>b)?a:b;

y=y>c?y:c;

printf("max=%dn",y);}

2

void main()

{int x,y,z,m;

scanf("%d,%d,%d",&x,&y,&z);

max(x,y,z); } /*采用函数语句形式调用函数max*/

方式2、函数表达式调用和函数参数调用

int max(int a,int b)

{ int y;

y=(a>b)?a:b;

return y;}

void main()

{ int x,y,z,m;

scanf("%d,%d,%d",&x,&y,&z);

m=max(x,y); m=max(m,z);

printf(“max=%dn”,m);/*表达式调用形式 */

m=max(x,y);

printf("max=%dn",max(m,z)); } /*函数参数调用形式*/

三、案例分析 明确新知

【例7-2】 定义函数power(x,n), 求x的n次方。

函数定义如下:

int power( int x, int n) /*被调函数*/

{ int i;

float t=1;

for(i=1;i<=n;i++)

t=t*x; /* 1*x*x*…*x 共乘n次 */

return t; } /* 返回t的值 */

main()

{ int a,b,s;

scanf("%d %d",&a,&b);

s=power(a,b);/*主调函数*/

printf("%d",s);

}

【例7-3】编写计算x的n次乘方的程序。

#include "stdio.h”

main( )

{ float x, y;

int n;

float power (float x, int n);

scanf("%f,%d", &x, &n);

y = power(x, n); printf(“%8.2f”,y); }

float power( float x, int n)

{ int i;

float t=1;

for(i=1; i<=n; i++)

t=t*x;

3

return t; }

思考:请对照例2、例3两个程序,二者在结构上有什么区别?

四、仿真演练,检测达标

1、以下正确的函数定义是( )。

A)double fun(int x , int y) B)double fun(int x ; int y)

C)double fun(int x , int y) ; D)double fun(int x,y)

2、C语言规定,函数返回值的类型是由( )决定的。

A)return语句中的表达式类型 B)调用该函数时的主调函数类型

C)调用该函数时由系统临时 D)在定义函数时所指定的函数类型

3、在如下函数调用语句:

func(rec1,rec2+rec3,(rec4,rec5));则函数调用语句中,含有的实参个数是( )。

A)3 B)4 C)5 D)语法错误

4、有如下程序:

void f(int x,int y)

{ int t;

if (x

}

main()

{ int a=4,b=3,c=5;

f(a,b);f(a,c);f(b,c);

printf(“%d %d,%dn”,a,b,c);

}

则执行后语句的结果是( )

A)3,4,5 B)5,3,4 C)5,4,3 D)4,3,5

5、以下关于函数的叙述中正确的是( )

)每个函数都可以被其它函数调用(包括main函数)

)每个函数都可以被单独编译

)每个函数都可以单独运行

)在一个函数内部可以定义另一个函数

6、有以下程序运行后的输出结果是( )

#define P 3

void F(int x){return (P*x*x);}

main()

{ printf("%dn",F(3+5));}

A)192 B)29 C)25 D)编译出错

五、课后作业 自我提高

【1】上机演练上述程序并写好实习总结。

【2】思考:函数的定义格式与调用方式在操作运行过程中要注意哪些方面的问题?

六、总结反思

1、通过学习是否对函数的定义与调用的知识点有所理解与掌握。

2、对该节内容学习过程中,你如何理解函数的定义与调用方式。

3、通过学习你是否掌握函数的组成结构。

4

隆回县职业中专学校教学、学习设计方案

专 业 科: 信息 年级: 二 科目: C程序 班级:

方案设计: 刘小华 方案审核: 备课节次: 第 节

章 节

课 题 函数的参数传递与返回值

学习内容 掌握函数调用中的数据传递方法与返回值类型的确定

学习重点 C语言函数的参数传递

学习难点 C语言函数的参数传递

学 习 程 序

一、知识回顾 问题提出

1、想一想:C语言函数的定义格式?

2、C语言函数的调用方式?

二、自主学习 互动探究

知识点一:形式参数与实际参数

形参:在定义函数时函数名后括弧中的变量名称。

实参:在调用函数时函数名后括弧中的表达式。

功能:用于主调函数和被调函数之间的数据传递。

c=max( a , b ); /* 主函数main中*/

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

{

int z;

z=x>y?x:y;

return(z);

}

注意:实参与形参要在个数、类型、位置上要一一对应。

知识点二:函数参数的传递方式:

(1)传值过程。传值过程是指把实参的值传递给形参作为其初始值开始运算。

实参变量和形参变量是两个不同的变量,即使名称相同,也会被分配不同的存储单元,相互之间的联系只是形参变量的初值来自于实参变量,以后的操作则各不相干。如果形参变量的值以后在被调用函数中被修改,不会影响实参变量的值。一旦结束被调函数的执行,返回到主调函数,形参则将对应的存储单元释放了,而实参仍然存在并参与主调函数以后的操作。

(2)传地址过程。在函数调用中,有时需要主调函数与被调函数共享一个变量或一批变量,即两个函数对同一存储单元进行赋值或引用操作,这种类型的参数传递被称为“传地址过程”。所以实参往往是含有取地址运算符“&”的变量地址、数组名或指针变量,形参用指针变量或数组来接收,通过地址的传递,实参与形参指向同一个存储单元或存储区域,这样,形参所指变量值的改变反过来会导致实参所指变量值的变化。

【例7-4】 编程输入两个数, 输出其中较大的。(值传送)

5

第7章 函数

#include “stdio.h”

main( )

{ int a, b, m;

int max(int, int );

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

m = max(a, b);

printf(“max=”,m);}

int max(int x, int y)

{ int t;

if (x>y) t = x;

else t = y;

return t; }

若程序运行时输入为: 10,5

便有输出为: 10

【例7-5】程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序:(地址传送)

void sort(int a[],int n)

{int i,j,t;

for(i=0;i

for(j=i+1;j

if(a[i]

}

main()

{int aa[10]={1,2,3,4,5,6,7,8,9,10},i;

sort(&aa[3],5);

for(i=0;i<10;i++) printf("%d,",aa[i]);

printf("n"); }

程序运行后的输出结果是( )。

A) 1,2,3,4,5,6,7,8,9,10 B) 10,9,8,7,6,5,4,3,2,1

C) 1,2,3,8,7,6,5,4,9,10 D) 1,2,10,9,8,7,6,5,4,3

知识点三:函数的返回值

C语言中,函数可以将执行结果以一个值的形式返回到函数调用点,再对结果值进行处理,这个结果值就是函数的返回值。返回值表达式在return语句中定义,返回值表达式类型即为函数的类型,在函数的头部定义,即函数名前的返回值类型。

return语句的格式是:return <(表达式)>;

(1)若函数的首部省略了函数返回值的类型名,则默认函数返回值为int型。

(2)return语句中的表达式的值就是所求函数的值。此表达式的类型必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,并由系统自动转换。

(3)返回值只能有一个,圆括号里不能出现两个或两个以上的表达式。

三、案例分析 明确新知

【例7-6】有以下程序若运行时输入:1234<回车>,程序的输出结果是( )

6

scanf("%d",&x);

y=sub(sub(sub(x)));

printf("%dn",y);

【例7-7】有以下程序执行后的输出结果是( )

char fun(char x,char y)

{ if(x

return y;

}

main( )

{ int a='9',b='8',c='7';

printf("%cn",fun(fun(a,b),fun(b,c )));

} }

四、仿真演练,检测达标

1、请看下面的程序,分析结果为什么是这样?

void exchange(int a,int b)

{

int tmp;

tmp=a;a=b;b=tmp;

}

main()

{

int x,y;

scanf("%d%d",&x,&y);

exchange(x,y);

printf("x=%d,y=%d",x,y);

}

运行情况:输入3 5↙ 则输出为:x=3,y=5

2、分析下面的程序,执行后结果是( )

int f(int b[][4])

{ int i,j,s=0;

for(j=0;j<4;j++)

{ i=j;

if(i>2) i=3-j;

s+=b[i][j];

}

return s;

}

main( )

{ int a[4][4]={{1,2,3,4},{0,2,4,5},{3,6,9,12},{3,2,1,0}};

printf("%dn",f(a) );

}

7

3、有以下程序运行后的输出结果是( )

#define N 20

fun(int a[],int n,int m)

{int i,j;

for(i=m;i>=n;i--)

a[i+1]=a[i];

}

main()

{ int i,a[N]={1,2,3,4,5,6,7,8,9,10};

fun(a,2,9);

for(i=0;i<5;i++)

printf("%d",a[i]);

}

A)10234 B)12344 C)12334 D)12234

4、有如下程序执行后语句的结果是( ):

#include"string.h"

void fun(char s[],int p,int k)

{int i;

for(i=p;i

s[i]=s[i+2];

}

main()

{char s[]="abcdefg";

fun(s,3,strlen(s));

puts(s);

}

5、有以下程序运行后的输出结果是( )

f(int b[],int m,int n)

{ int i,s=0;

for(i=m;i

return s;}

main()

{ int x,a[]={1,2,3,4,5,6,7,8,9,};

x=f(a,3,7);

printf("%d",x);

}

五、课后作业 自我提高

【1】上机演练上述程序并写好实习总结。

【2】思考:函数的定义格式与调用方式在操作运行过程中要注意哪些方面的问题?

六、总结反思

1、通过学习是否对函数的定义与调用的知识点有所理解与掌握。

2、对该节内容学习过程中,你如何理解函数的定义与调用方式。

3、通过学习你是否掌握函数的组成结构。

8

隆回县职业中专学校教学、学习设计方案

专 业 科: 信息科 年级: 二 科目: C程序

方案设计: 史春水 备课节次: 2节 第 2 节

章 节

课 题 函数的递归调用

学习内容 掌握函数的递归调用

学习重点 递归调用

学习难点 C语言函数的参数传递、递归调用

学 习 程 序

一、知识回顾 问题提出

回顾:1、C语言函数的调用方式有哪些?

2、函数的嵌套调用

二、自主学习 互动探究

知识点:函数递归调用

定义:一个函数在它的函数体内直接或间接地调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身。递归调用分为直接递归和间接递归,直接递归是在函数中调用了本身,如图1。间接递归是函数调用了别的函数,别的函数又调用了自己,如图2。

第7章 函数

图1 图2

【例1】以下程序运行后的输出结果是( )。

int f(int a[], int n)

{ if (n>=1) return f(a, n-1)+a[n-1];

else return 0;

}

main()

{ int aa[5]={1,2,3,4,5}, s;

s=f(aa, 5); printf("%dn", s);

}

9

【解析】:如下调用过程

调用点主调函数s=f(aa, 5);把参数传递给int f(int a[], int n)时,则让数组a指向数组aa的首地址,且n=5;执行以下过程

f(a,4)+a[4]

回溯

f(a,3)+a[3]

递归

f(a,2)+a[2]

f(a,1)+a[1]

f(a,0)+a[0]

说明:递归调用一旦出现,往往会多次发生,发生多层的递归调用,但不管递归调用要发生多少次,最终有一个终点,即当调用到某一层次时,由于满足某个条件而停止继续递归下去,从而产生一个转折点,开始逐级返回的过程(回溯)。因此递归过程中一定要包含相关的判断语句,作为递归终止条件的描述。

三、案例分析 明确新知

1、下面程序的运行结果是( )

long fun(int n)

{ if(n>2) return(fun(n-1)+fun(n-2));

else return (2);

}

main()

{ printf("%ldn",fun(3));}

2、有以下程序运行后的输出结果是( )

fun(int x)

{ if(x/2>0) fun(x/2);

printf("%d",x);

}

main()

{ fun(6);

}

四、仿真演练,检测达标

1、有如下程序执行后语句的结果是( )

#include

int fun(int a,int b)

{ if (a%b==0)

return b;

else return fun(b,a%b);

}

10

main()

{ int a=20,b=24;

printf("fun(%d ,%d)=%d",a,b,fun(a,b));

}

5、描述函数的功能,并写出程序的输出结果( )

void conv(int n)

{

if(m>=2)

conv(m/2);

printf(“%d”,m%2);

}

main()

{

conv(13);

}

五、课后作业 自我提高

【1】上机演练上述程序并写好实习总结。

【2】思考:函数嵌套调用与递归在操作运行过程中要注意哪些方面的问题?

11


本文标签: 函数 调用 类型 定义 递归