《计算机程序设计基础C语言》教案总学时36第29学时一第30学时授课内容第5章模块化编程一一函数的定义、声明、调用教学目的掌握函数定义、调用、声明;函数参数传递方式和要求了解函数递归调用重点:函数定义、调用、声明重点函数参数传递方式难点难点:函数参数传递方式-传址教引言学讲授安一、模块化程序设计排复杂问题的解决方法一般会是把原问题分解成若干个规模较小的问题加以解决,并可以类推的继续向下分解。结构化程序设计的基本思想之一是程序的"模块化"(module)。所谓"模块化"就是把一个较为复杂的大程序化分成若于个功能相对独立的程序块,每个程序块实现一个功能。在C语言中,这样的程序块被称为函数。函数是C程序的基本模块,C语言被称为函数式语言。从一个例子说起:求n个垫圈的面积总和。在这个程序中我们使用了3个函数。其中main(函数用于输入和输出,而计算求和以及垫圈面积分别用独立的函数sum()和area()完成。几点体验:·函数sum,area要先声明,后使用;·函数sum,area通过参数表中的参数n,d1,d2传递数据,以return语句从函数名sum,area获得返回的函数值。·函数的参数n,d1,d2都是有类型的
《计算机程序设计基础C语言》教案 总学时36 第 29学时 — 第 30学时 授课内容 第5章 模块化编程——函数的定义、声明、调用 教学目的 和要求 掌握函数定义、调用、声明;函数参数传递方式 了解函数递归调用 重点 难点 重点: 函数定义、调用、声明 函数参数传递方式 难点: 函数参数传递方式-传址 教 学 安 排 引言 讲授 一、模块化程序设计 复杂问题的解决方法一般会是把原问题分解成若干个规模较小的问题加以解 决,并可以类推的继续向下分解。 结构化程序设计的基本思想之一是程序的"模块化" (module)。所谓"模块化"就 是把一个较为复杂的大程序化分成若干个功能相对独立的程序块,每个程序块 实现一个功能。 在C语言中,这样的程序块被称为函数。 函数是C程序的基本模块,C 语言被称为函数式语言。 从一个例子说起:求n个垫圈的面积总和。 在这个程序中我们使用了3个函数。其中main()函数用于输入和输出,而计算 求和以及垫圈面积分别用独立的函数sum()和area()完成。 几点体验: ● 函数sum,area要先声明,后使用; ● 函数sum,area通过参数表中的参数n,d1,d2传递数据,以return语句从函数名 sum,area获得返回的函数值。 ●函数的参数n,d1,d2都是有类型的
·函数参数的传递遵循NOT原则Number、Order、Type必须一致二、函数的定义所有的函数定义,包括主函数mainO,都是平行的,函数可以嵌套调用或相互调用,但不能嵌套定义。调用者称为主调函数,被调用的函数称为被调函数。函数自己调用自己,称为递归调用main函数是主函数,它可以调用其它函数,而不允许被其它函数调用。C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序C源程序中必须有,也只能有1个main函数。1函数的分类1.从用户角度分类:库函数:由C系统提供,用户无须定义,不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。如printfO、scanfO)、getcharo)、putcharo...用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。如例中sum(intn)、area(floatd1,floatd2)2.从函数执行过程分类:有返回值函数,无返回值函数3.从函数定义形式分类:有参函数,无参函数函数的定义形式11.无参函数的定义形式类型标识符函数名0声明部分语句部分1类型标识符:说明函数返回值的数据类型;若缺省,则为int类型;若函数无值,则定义为void类型函数名:由用户自己命名,合法的标识符无参函数可以有也可以有返回值,但无返回值的较常见。无返回值函数的类型标识符是void。void lineOkprintf("~~~~ln");1【例】无返回值的无参函数举例#include<stdio.h>#include<conio.h>void line(t无参函数定义printf("~~~~ln");
●函数参数的传递遵循NOT原则: Number、Order、Type必须一致 二、函数的定义 所有的函数定义,包括主函数main(),都是平行的,函数可以嵌套调用或相互 调用,但不能嵌套定义。 调用者称为主调函数,被调用的函数称为被调函数。 函数自己调用自己,称为递归调用。 main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main 函数,最后由main函数结束整个程序 C源程序中必须有,也只能有1个main函数。 l 函数的分类 1. 从用户角度分类: 库函数: 由C系统提供,用户无须定义,不必在程序中作类型说明,只需在程 序前包含有该函数原型的头文件即可在程序中直接调用。如 printf()、scanf()、 getchar()、putchar(). 用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序 中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明, 然后才能使用。 如例中sum(int n)、area(float d1,float d2) 2. 从函数执行过程分类: 有返回值函数,无返回值函数 3. 从函数定义形式分类: 有参函数,无参函数 l 函数的定义形式 1. 无参函数的定义形式 类型标识符 函数名(){ 声明部分 语句部分 } 类型标识符:说明函数返回值的数据类型;若缺省,则为 int 类型;若函数无 值,则定义为 void 类型 函数名:由用户自己命名,合法的标识符 无参函数可以有也可以有返回值,但无返回值的较常见。 无返回值函数的类型标识符是 void。 void line(){ printf("~~~~~~~~~~~~~~~\n"); } 【例】无返回值的无参函数举例 #include <stdio.h> #include <conio.h> void line(){ // 无参函数定义 printf("~~~~~~~~~~~~~~~\n");
1mainOtprintf("Hello \n");line();/无参函数调用printf("Follow me!n");line(;getch);【例】有返回值的无参函数#include<stdio.h>#include <conio.h>mainOtif(test0==1)printf(" return 1 In");elseprintf(" return 0 In");1inttestOtreturn 1;^2.有参函数的定义形式函数类型函数名(形参类型说明表)(说明部分语句部分1形参类型说明表:说明函数参数的个数和类型三、函数的参数和函数的返回值1.函数的形参和实参在定义函数时,有参函数名后面括弧中的变量名称为形式参数(formalparameter),简称形参;在调用函数时,函数名后面括弧中的表达式称为实际参数(actuaparameter),简称实参。主调函数和被调函数之间的信息交换可以通过实参与形参的结合和return语句来实现,称为按值调用(callbyvalue)
} main(){ printf(" Hello !\n"); line(); // 无参函数调用 printf(" Follow me !\n"); line(); getch(); } 【例】有返回值的无参函数 #include <stdio.h> #include <conio.h> main(){ if(test() == 1) printf(" return 1 \n"); else printf(" return 0 \n"); } int test(){ return 1; } 2. 有参函数的定义形式 函数类型 函数名(形参类型说明表){ 说明部分 语句部分 } 形参类型说明表:说明函数参数的个数和类型 三、函数的参数和函数的返回值 1. 函数的形参和实参 在定义函数时,有参函数名后面括弧中的变量名称为形式参数(formal parameter),简称形参; 在调用函数时,函数名后面括弧中的表达式称为实际参数(actual parameter),简称实参。 主调函数和被调函数之间的信息交换可以通过实参与形参的结合和return语句 来实现,称为按值调用(call by value)
:形参与实参的特点:形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后,则不能再使用该形参。实参可以是常量、变量、表达式、函数调用等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等方法使实参获得确定值。·函数参数表的一致性原则(NOT):函数调用中实参的数目(Number)必须与函数原型中形参的数目一致。:函数调用中实参的顺序(Order)必须与函数原型中形参的对应顺序一致。:函数调用中实参的数据类型(Type)必须与函数原型中对应形参的数据类型一致。:函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。在函数调用过程中,形参的值发生改变,而实参中的值不会变化。如果要将被调函数的结果返回主调函数,则应使用return语句并体现为主调函数名。2.函数的返回值返回语句形式:return表达式或return (表达式);功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数。说明:函数中可有多个return语句,但只执行第一个,若无return语句,遇1时,自动返回调用函数,若函数类型与return语句中表达式值的类型不一致,按函数类型为准,自动转换--函数调用转换语句return0;结束main0程序运行,返回正常值(把控制权交还给操作系统)对函数返回值说明:1)函数的值只能通过return语句返回主调函数。2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数的类型为准,编译系统会自动进行类型转换。3)若不要求被调函数有返回值,可以不使用return语句,或在return后面只有一个分号,即写成return;4)对于不返回函数值的函数,函数类型可以明确定义为"空类型",即"void"。总结:函数的调用方式和被调用的函数必须具备的条件函数的调用方式语句方式如:line():用于void型函数表达式方式如:c=sum(a,b);参数方式如:m=max(c,max(a,b));
● 形参与实参的特点: 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存 单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后,则不 能再使用该形参。 实参可以是常量、变量、表达式、函数调用等,无论实参是何种类型的量,在 进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此 应预先用赋值、输入等方法使实参获得确定值。 ● 函数参数表的一致性原则(NOT) ● 函数调用中实参的数目(Number)必须与函数原型中形参的数目一致。 ● 函数调用中实参的顺序(Order)必须与函数原型中形参的对应顺序一致。 ● 函数调用中实参的数据类型(Type)必须与函数原型中对应形参的数据类 型一致。 ● 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参, 而不能把形参的值反向地传送给实参。在函数调用过程中,形参的值发 生改变,而实参中的值不会变化。如果要将被调函数的结果返回主调函 数,则应使用return语句并体现为主调函数名。 2. 函数的返回值 返回语句形式: return 表达式; 或 return (表达式); 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函 数。 说明: 函数中可有多个return语句,但只执行第一个,若无return语句,遇 } 时,自动 返回调用函数,若函数类型与return语句中表达式值的类型不一致,按函数类 型为准,自动转换-函数调用转换 语句 return 0; 结束main()程序运行,返回正常值0(把控制权交还给操作系统) 对函数返回值说明: 1) 函数的值只能通过return语句返回主调函数。 2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则 以函数的类型为准,编译系统会自动进行类型转换。 3)若不要求被调函数有返回值,可以不使用return语句,或在return后面只有 一个分号,即写成 return; 4)对于不返回函数值的函数,函数类型可以明确定义为"空类型",即"void"。 总结:函数的调用方式和被调用的函数必须具备的条件 ● 函数的调用方式 语句方式 如:line(); 用于void型函数 表达式方式 如:c=sum(a,b); 参数方式 如:m=max(c,max(a,b));
:被调用的函数必须具备的条件被调用的函数必须是已经存在的函数若调用库函数,应该在文件开头用#include命令将所需的信息包含到本文件中来。如:#include<stdio.h>或#include"math.h"若使用自定义函数,该函数与主调函数应该在同一个文件中。一般应该在文件开头或主调函数中对被调函数进行说明。但有两个例外:①整型或字符型函数可以不说明②被调函数写在主调函数之前可以不说明四、函数的声明除int型或char型函数外,若主调用函数在被调用函数之前,必须在调用前用被调用函数的函数原型作声明。函数声明(declaration)的方式采用函数原型(Function Prototype)函数原型一般形式为:类型说明符被调函数名(类型形参,类型形参...);或为:类型说明符被调函数名(类型,类型...);例如:int max(int a,int b);也可以写为int max(int,int);函数定义与函数声明的区别:1函数定义是指对函数功能的建立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。2E函数声明的作用是在程序的编译阶段对被调函数的合法性进行全面检查,将函数名、函数返回值的类型以及形参的类型、个数和顺序通知编译系统,以便在调用时系统进行对照检查。3简而言之,函数的声明是将函数定义中的第1行(函数首部)复制后再加一个分号。·可以省略函数声明的几种情况1被调函数的函数定义出现在主调函数之前,在主调函数中可以不对被调函数声明而直接调用。2整型或字符型函数可以不加声明。系统将自动对被调函数返回值按整型处理。3如果在文件的开头对函数统一进行了声明,则在各调用函数中可不再对被调用函数加以声明。4调用库函数时不必进行声明,只需用#include包含相应的头文件(标准库函数的原型在系统提供的相应头文件中)。五、函数的调用C语言中,函数调用的一般形式为:函数名(实际参数表);。函数调用的方式1)函数语句:函数调用的一般形式加上分号即构成函数语句
● 被调用的函数必须具备的条件 被调用的函数必须是已经存在的函数 若调用库函数,应该在文件开头用#include命令将所需的信息包含到本文件中 来。 如:#include <stdio.h> 或 #include "math.h" 若使用自定义函数,该函数与主调函数应该在同一个文件中。 一般应该在文件开头或主调函数中对被调函数进行说明。但有两个例外: ①整型或字符型函数可以不说明 ②被调函数写在主调函数之前可以不说明 四、函数的声明 除int型或char型函数外,若主调用函数在被调用函数之前,必须在调用前用被 调用函数的函数原型作声明。函数声明(declaration)的方式采用函数原型 (Function Prototype) 函数原型一般形式为: 类型说明符 被调函数名(类型 形参,类型 形参.); 或为: 类型说明符 被调函数名(类型,类型.); 例如: int max(int a,int b); 也可以写为: int max(int,int); ● 函数定义与函数声明的区别: 1 函数定义是指对函数功能的建立,包括指定函数名、函数类型、形参及 其类型、函数体等,它是一个完整的、独立的函数单位。 2 函数声明的作用是在程序的编译阶段对被调函数的合法性进行全面检 查,将函数名、函数返回值的类型以及形参的类型、个数和顺序通知编 译系统,以便在调用时系统进行对照检查。 3 简而言之,函数的声明是将函数定义中的第1行(函数首部)复制后再 加一个分号。 ● 可以省略函数声明的几种情况 1 被调函数的函数定义出现在主调函数之前,在主调函数中可以不对被调 函数声明而直接调用。 2 整型或字符型函数可以不加声明。系统将自动对被调函数返回值按整型 处理。 3 如果在文件的开头对函数统一进行了声明,则在各调用函数中可不再对 被调用函数加以声明。 4 调用库函数时不必进行声明,只需用#include包含相应的头文件(标准 库函数的原型在系统提供的相应头文件中)。 五、函数的调用 C语言中,函数调用的一般形式为: 函数名(实际参数表); ● 函数调用的方式: 1)函数语句:函数调用的一般形式加上分号 即构成函数语句