第7章 第1课 函数的一般概念 函数的调用 数组作为函数的参数

本课主题: 函数的一般概念,函数的调用,数组作为函数的参数

教学目的: 掌握函数的作用,函数调用中参数、函数返回值的概念及作用。

教学重点: 函数参数、函数返回值的概念及作用。

教学难点: 函数参数、函数返回值的作用。

授课内容:

一、函数的作用

  可以把特定的功能集中由函数来完成。函数完成固定的规划好的功能,在程序编写中如果需要使用这样的功能就可以通过调用这个函数来实现。不管这个函数实现的功能有多复杂,调用它只需要很少的语句,而且调用形式是固定不变的。

  例:如果我们经常需要计算某两个自然数之间所有自然数的和,我们就可以写一个函数,以后需要使用这个功能时,就可通过简单的函数调用来完成了。

int totalbetween(int a,int b)
{int i;
  int sum=0;
  for(i=a;i<=b;i++)
    sum+=i;
  return sum;
}
main()
{
  int s;
  s=totalbetween(45,50);
  printf("%d\n",s);
  printf("%d\n" ,totalbetween(1,100));
}

二、函数定义的一般形式

1、 2、 3、
类型标识符 函数名(){说明部分语句} 类型标识符 函数名(形式参数表列) {说明部分语句} 类型标识符 函数名(){}

  示例:

chapter07-01.gif

三、函数参数和函数的返回值

  在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。两者的数据传递是通过函数参数完成的。

  在定义函数时函数名后面括号中的变量名称为“形式参数”/“形参”

  在调用函数时,函数名后面挌中的表达式称为“实际参数”/“实参”

chapter07-02.gif

四、注意问题

  1、函数的一般形式。

  2、函数参数与返回值的作用。

五、函数调用的一般形式

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

六、函数调用的方式

  可以有以下三种:函数语句、函数表达式、函数参数。在下图中第三、四条函数调用属函数参数调用方式。

chapter07-03.gif

七、对被调用函数的说明

1、什么是库函数?

上例中的totalbetween,printstar都是自定义函数,函数的功能是由自己决定的,也是由自已编写源代码的。printf函数则是库函数/标准函数,它是由编译系统提供的,函数的源代码未知,但并不妨碍我们使用它的功能。库函数有很多,我们可以通过软件手册和在线帮助获得它们的功能介绍和使用方法。

2、使用库函数时一般应把声明这个库函数的头文件包含进本文件。即在使用文该函数的文件开头用下面的语句:

\#include "stdio.h"

  stdio.h是一个文件,通常存放在TC目录下的include子目录中。这个文件中声明了许多库函数的返回值类型和形参信息。

chapter07-04.gif

3、为什么要为被调函数作说明?

  什么是被调函数说明?

chapter07-05.gif

  我们上面的例子中没有对被调函数作说明,程序也可以编译通过,原因是我们调用的函数的返回值都是整型的,另外,被调函数的定义发生在主调函数之前。这两种情况之中的任一种都可以省掉函数说明。

  最好的方法:在文件的开始就为所有被调函数作说明。

chapter07-06.gif

八、函数的嵌套调用

  C程序不可以在一个函数的定义体内定义另一个函数。但可以在函数的定义体内调用其它函数。这就是函数的嵌套调用。

  示例:

int max(int x,int y)
{
  return (x>y?x:y);
}
int max3(int x,int y,int z)
{
  int c;
  c=max(x,y);  /*在max3函数中又调用了其它函数*/
  return(max(c,z));
}
main()
{
  int a-3,b=5,c=4;
  max3(a,b,c);
}

九、我来试一试

  把计算学生平均成绩的功能用自定义函数完成。用参数决定要计算的学生序号,把计算结果用返回值返回。

  把计算课程平均成绩的功能用自定义函数完成。用参数决定要计算的课程序号,把计算结果用返回值返回。

  改写以前的学生成绩管理程序。

十、注意问题

  1、函数说明。

  2、函数调用时形参与实参的关系。

十一、数组元素做函数实参

  函数的实参可以是常量,变量,任意表达式,数组元素可以是表达式的组成部分,所以数组元素可以做函数的实参。

  例:两个一维数组,分别存放着10个同学跳远的二次成绩,现在要把每个同学的最好成绩挑出来作最后的成绩,并打印出来。请看下面的程序:

chapter07-07.gif

  注意实参的类型要和形参的类型一致。

十二、数组名作函数参数

  有时希望把整个数组传进被调函数中,比如经常计算数组中若干元素的平均值,想写一个函数完成这个任务,这个函数面对的参量就是数组。

  如上例,想计算该10位同学每次体育成绩的平均分,可以这样做:

chapter07-08.gif

十三、值传递与地址传递

  普通变量及数组元素作实参,只是把实参的值传递给形参,被调函数里的语句改变形参的值并不能影响实参变量的值。

  数组名作实参时,因为数组名即代表了数组的存储地址,所以是把数组的存储地址传递给了形参,被调函数中对形参数组的操作其实就是对实参数组的操作,它能影响实参数组的元素值。

  值传递与地址传递的区别主要是看传递的是参数的值还是参数的地址。

chapter07-09.gif

十四、用二维数组作函数参数

  可以用多维数组名作为实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。

  如:int array[3][10];

  或:int array[][10]; 是相同的。表示该形参接收列为10个元素的二维数组,行数不限。

十五、我来试一试

  好了,可以把以前求课程平均分的函数改一下,把存放课程成绩的数组做函数参数了。

  另外,写一个函数,可以对数组中某一指定范围的元素排序。例:

int a[100];
sort(a,3,20);可以把数组a中从第三个元素到第20个元素从小到大排列。

十六、注意问题

  1、形参与实参的对应关系。

  2、值传递与地址传递的区别。

十七、作业

标签: C程序设计, C语言, 函数

评论已关闭