《哈工大计算机c语言考研期中期末考试必备c4》由会员分享,可在线阅读,更多相关《哈工大计算机c语言考研期中期末考试必备c4(89页珍藏版)》请在金锄头文库上搜索。
1、哈尔滨工业大学 计算机学院,2003年8月,C语言程序设计,傅忠传,第四章函数与结构化设计方法,该章的学习内容,学点什么哪?,掌握函数原型(prototype)及其,函数定义和函数原型说明的方法及二者的区别。掌握函数的参数传递方式与函数调用方法。 理解掌握变量的作用域和存储类的概念。,1.通过C语言的学习,牢固树立起函数的概念,及其使用规则 。,2.理解函数的作用域及其存储类及其自动变量与静态局部变量在应用中的区别。,*3.在实际应用中,学习和体会采用结构化设计方法(模块化)解决问题 的思想。,本章的学习难点,本章目录,函数*宏定义变量的作用域和存储类*模块化程序设计方法*应用设计实例多文件方
2、式组织的程序,本章目录,函数 1.1.函数有关概念及其分类 1.2.函数的定义 1.3.函数的返回值 1.4.函数的调用与参数传递 1.5.函数原型的说明*宏定义变量的作用域和存储类*模块化程序设计方法*应用设计实例多文件方式组织的程序,C程序的基本结构,函数的基本概念,(1) project 工程:是由一个或多个C程序源文件组成。一个源程序是由一个或多个函数组成。 一个源程序是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。其扩展名为 .h或 .c。,(3)C程序的执行从main()函数开始。没有main( )函数的程序,不能执行。 调用其他函数后流程回到main函数,在
3、main函数结束整个程序运行。 main函数是系统定义的。,(4)主函数可以调用任意子函数,而子函数不能调用主函数。 子函数的地位是平等的,相互独立,相互无从属关系,可以相互调用。 子函数可以直接或间接地自己调用自己,即递归调用。,函数的分类(1),标准函数(库函数) 使用:用#include 命令将调用函数所需头 文件包含到源文件中之后可直接调用。,从用户角度看:,如:scanf、printf、sqrt、getchar等,用户自定义函数:先定义而后使用(调用)! 用户自定义函数使用的一般过程:,函数定义,函数说明,函数调用,无参函数 int a( ) ,函数的分类(2),从函数的形式看:,有
4、参函数 int max( x , y ) ,主调函数调用被调函数时,不能传递参数(数据)。一般用来执行指定的一组操作。,函数的定义,(1)传统风格函数定义: 类型 函数名(形参表列) 形参说明 说明部分 语句 ,形参表列是用逗号分隔的形参,形参又称为形式参数、哑元、虚参、虚拟参数。在形参说明中,说明形参表中每个形参的类型。,类型:函数类型,用来说明本函数返回值的类型。当函数返回值是整型或不要求返回值时,可省略类型说明。无返回值可用“空类型” void,函数定义时的参数称为行参;函数调用时的参数称为实参。,(2)函数的现代定义方式,类型 函数名 (形参说明表列) 说明部分 语句,函数体,将形参说
5、明包含到形参列表中,即在 列出形参的同时,说明形参类型。形参列表:类型 参数1,类型 参数2, ,类型 参数n,传统定义举例 现代定义举例 int add(x, y) int add(int x, int y) int x, y; ,程序举例1,定义求两个整数和的函数。,int add(int x, int y)int z; z=x+y; return(z);,当函数不需要参数时,省略形参表列和形参说明,但不能省略括号,函数名后的括号内为空,即为无参函数。Void print_info( )printf(-n); printf(Welcome to HIT.n); printf(-n);,函数
6、定义说明,当函数为有参函数时,应对其全部参数进行数据类型说明。,函数使用标识符给函数命名,即取名原则与变量名相同。Int max(float x, float y)float z; z=xy?x: y; return(z); ,函数名前面的类型即为函数的类型。 函数的类型实际上是函数返回值的类型。当被调函数无返回值时,实际上就是带回的是一个不确定的值,可用“void”定义“无类型”(或称“空类型”)。当函数的返回值为整型时,函数名前的数据类型可以省略。,形参表列中,形参与形参间用“,”分隔。 形参说明是对形式参数的数据类型的说明。,在定义函数中指定的形参,在未被调用时,他们不占用内存单元,只有
7、在该函数被调用时,函数中的形参才被分配内存单元。,函数的返回值,功能,将被调函数中的结果值返回给主调函数。,语句,return(返回值表达式);,举例,int add(int x, int y)int z; z=x+y; return(z);,函数返回说明,当函数要求返回函数值时,函数体内最后执行的语句应为返回语句return。一个函数中可以有一条或多条return语句,只有被执行到的return语句才起作用。当函数不需要返回值时 ,后面不加括号和表达式,也可没有return。,当函数值的类型和return语句后的表达式类型不一致时,则以函数类型为准。对数值型数据可自动转换。int max(f
8、loat x, float y)float z; z=xy?x: y; return(z); ,有些系统可省略return后的括号。 return _ 表达式;4. “函数类型就是函数中return语句后表达式的类型”是错误的!5.return语句完成了被调函数向主调函数值传递的功能。,函数定义的程序举例2,下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中的错误是:void add(float a, float b) float c; c=a+b; return c;,void add(float a, float b),float add(float a, float b)
9、,函数的调用,格式,函数名(实参表列),与调用标准函数相同,说明,当调用无参函数时,实参表列为空。 int fun( ) n=fun( ) ; fun( ); ,有参函数进行调用时,实参列表中各参数以逗号分隔,且实参与形参应在个数、类型、位置一一对应。,实参可以是常量、变量或表达式,调用函数前应保证每个实参都有确定值。 在调用时将实参值传给虚参。,形参在调用函数前不占用内存的存储空间;只有在函数被调用时,系统才分配临时存储空间;当函数退出,返回被调函数时,该存储空间被释放。Debug,形参变量和实参变量占据不同的存储单元。,实参和形参的数据传递是单向值传递(即只有实参传递给形参,而不能由形参传
10、回数据给实参)。,程序举例(3),输入两个整数,求其中最大者并打印。,#include main( )int a, b, c; scanf(%d,%d, ,xy?x : y,函数调用方式,调用方式,函数调用语句,函数表达式,函数参数,print_star(n);,void print_star(int n)int i; for(i=1; ieps; n+) s+=t; t=n*t/(2*n+1); return ( ); /*函数的返回值*/main( ) /*主函数*/double x,p; printf(nPlease enter a precision: ); scanf( %lf ,
11、,s=0.,t=1.0,n=1,2.0*s,实参,形参,调用,return,p=pi(x),函数原型的说明,在一个函数中调用另一个函数时,应具备什么条件?,被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。,如果使用库函数,一般还应该在本文件开头用 #include 命令将调用有关库函数所需要用到的信息“包含”到本文件中来。#include 标准输入输出函数#include 标准数学计算函数,如果使用用户自己定义的函数,而且该函数与调用它的函数 (即主调函数) 在一个文件中时,应在主调函数的说明部分或主调函数之前对被调函数作声明。函数声明的一般形式:类型 函数名(类型1,类型2,) ; 类型 函数名(类型1 参数名1,);,函数声明的一般形式:类型 函数名(类型1,类型2,) ; 类型 函数名(类型1 参数名1,);举例:float add(float a, float b);float add(float, float);,早期版本的C语言,函数声明方式不是采用函数原型,而只声明函数名和函数类型。举例:float add( );,有些系统在函数调用前,不对函数作声明时,编译系统会把第一次遇到的该函数形式(函数定义和函数调用)作为函数声明,并将函数类型默认为int型。 因而,如果函数类型为整形,可以在函数调用前不必作函数声明。,