280 likes | 451 Views
第七章 函数. 概述 函数的定义 函数参数和函数值 函数的调用 局部变量和全局变量 动态变量与静态变量. 7.1 概述 7.2 函数的定义 7.3函数参数和函数值. 7.1 概述. 例1:打印如下所示图案. ********* hello *********. 例1 : #include<stdio.h> void main( ) { printf(“*********<br>”); printf(“ hello!<br>”); printf(“*********<br>”); }. 例1(续) :.
E N D
第七章 函数 概述 函数的定义 函数参数和函数值 函数的调用 局部变量和全局变量 动态变量与静态变量
7.1 概述 7.2 函数的定义 7.3函数参数和函数值
7.1 概述 例1:打印如下所示图案 ********* hello *********
例1: #include<stdio.h> void main( ) { printf(“*********\n”); printf(“ hello!\n”); printf(“*********\n”); }
例1(续): #include<stdio.h> void printstar( ) { printf("*********\n"); } void main( ) { printstar( ); printf(" hello!\n"); printstar( ); }
编制复杂大程序的一种有效方法:模块化,即把一个较大的问题分解成若干个功能相对独立的子问题,每个子问题由一个模块实现。一个程序是由若干个程序模块组成的,在C语言中,这样的模块通过函数实现。编制复杂大程序的一种有效方法:模块化,即把一个较大的问题分解成若干个功能相对独立的子问题,每个子问题由一个模块实现。一个程序是由若干个程序模块组成的,在C语言中,这样的模块通过函数实现。
C语言是一种函数语言,C程序由一个或多个函数组成,每个函数都有自己的名字,实现特定的功能。一个C程序必须有且只能有一个主函数main()函数。程序的执行从main()函数开始,在此过程中,遇到函数调用语句便暂时中断main( )函数的执行,将流程转到被调函数,执行完被调函数或遇到return语句再返回到主函数,继续执行main()函数。程序最终在main()函数中结束。 一个 函数的应用涉及3个环节:函数定义、函 数声明与函数调用。
7.2 函数的定义 一个C函数的定义由函数头部和函数体 两部分组成,形式如下: 例如:void main () 函数头部 { 函数体 } 一般包括:声明部分 执行部分
1、无参函数的定义格式 形如: voidprintstar( ) { printf(“*********\n”); } 函数类型 函数名 函数体
2、有参函数的定义格式 形如: int max( int x, int y) { int z; z=x>y?x:y; return z; } 函数名 函数参数类型 函数类型 函数参数名 函数体
例2 求一个数的绝对值 #include<stdio.h> int absvalue(int a) { if(a>=0) return a; else return -a; } void main( ) { int x, abs; scanf(“%d”,&x); abs= absvalue(x); printf(“\nThe absolute value is:%d\n”,abs); }
函数头部一般包括函数名、函数类型、函数 参数名、函数参数类型。 (1)函数类型说明符定义函数返回值的类型,如缺 省,默认int型。 (2)函数名,即函数的名称,与变量的命名规则相同 (3)形参表中形参的个数可以是一个、多个或没有。 函数被调用前,形参的值是不确定的,当函数被 调用时,才给它分配存储单元,并把实参的值传 递给形参,使其具有确定的值。 (4)函数必须定义在其它函数外部。
例3:取a,b之中较大者,赋值给变量c,然后输出c的值。例3:取a,b之中较大者,赋值给变量c,然后输出c的值。 #include<stdio.h> void main( ) { int a,b,c; int max(int x,int y); scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); } int max(int x,int y) { int z; if(x>y) z=x; else z=y; return z; }
说明: (1) 定义函数时函数名后面的变量称为形式参数 (简称形参)。在主调函数中调用一个函数时, 函数名后面的参数称为实际参数(简称实参)。(2)之所以被称为形参是因为函数被调用前,系统 不为函数定义中的参数分配存储单元。函数被 调用时,才为它分配存储单元。调用结束,形 参所占的内存单元也被释放。 说明:
(3)调用函数时,大多数情况下,主调函数和被(3)调用函数时,大多数情况下,主调函数和被 调用函数之间有数据传递关系。 有参函数调用时,实参与形参按顺序对应 结合。C语言规定,实参对形参的数据传递是 “单向的值传递”,即只能由实参传递给形参, 不能由形参传递给实参。
a 5 b 8 5 8 x y a 5 b 8 8 5 x y 例4 #include<stdio.h> void main( ) { int a=5,b=8; change(a,b); printf("a=%d,b=%d\n",a,b); } change(int x,int y) { int t; t=x;x=y;y=t; printf("x=%d,y=%d\n",x,y); } 形参值变化,实参不变 引申:要想通过调用change函数交换 a,b的位置,需使用指针动态分配内存 运行结果: x=8,y=5 a=5,b=8
三、函数的返回值 1、函数的返回值通过函数中的return语句 获得,如果需要从被调函数带回一个函 数值(供主调函数使用),被调函数必 须有return语句。 格式:return(表达式);或 return 表达式; 2、函数类型说明符定义函数返回值的类型, 如缺省,默认int型。
3、如果被调函数中没有return语句,函数不 是不带回值,而是带回一个不确定的值。 4、一个函数可以有一个以上的return语句。 例: if(x>y) {z=x*y;return(z);} else {w=(x*y)/(x+y);return(w);} 5、为了明确表示“不带回值”,可以用void 定义为“空类型”。 例:void printstar( ) { printf(“*********\n”); }
2、写出程序的运行结果 #include<stdio.h> void main( ) { int a=10,b=20; int av; av=aver(a,b); printf("%d,%d,%d\n",a,b,av); } int aver(int a,int b) { a+=b; b=a/2; printf("%d,%d\n",a,b); return b; }
三、对被调用函数的声明和函数原型 #include<stdio.h> void main( ) {int a=10,b=20; float av; float aver(int a,int b); av=aver(a,b); printf("%d,%d,%f\n",a,b,av); } float aver(int a,int b) {a+=b; b=a/2.0; printf("%d,%d\n",a,b); return b; }
一个函数调用另一个函数需要具备哪些条件 1、被调用函数必须是已经存在的函数; 2、如果使用库函数, 一般还应在本文件开头用 #include命令将调用有关库函数所需要的信 息包含进本文件中。 3、如果使用用户自己定义的函数, 而且被调用 函数在主调函数的后面,一般还应在主调 函数中对被调用函数进行声明,将有关信息 通知编译系统。
练习: 1、以下方式定义的函数fun: fun(int x) { printf(“%d”,x); } A)返回值为void类型 B)无法确定返回值类型 C)返回值为int类型 D)没有返回值
2、C语言中函数的返回值类型是由[ ]决定的。 A)return语句的表达式类型 B)调用该函数的主调函数类型 C)调用函数临时决定的 D)定义函数所指定的函数类型
练习3、写出程序的运行结果 #include<stdio.h> void main( ) {incx( ); incy( ); incx( ); incy( ); } incx( ) { int x=0; printf("x=%d\n",++x); } incy( ) {int y=0; printf("y=%d\n",y); }
练习: 4、写出程序的运行结果 #include"stdio.h" num() { int a=15,b=10; int x,y; x=a-b;y=a+b; return; } void main() {int x,y; int a=7,b=5; x=a+b; y=a-b; num(); printf("x=%d,y=%d\n",x,y); }
程序设计: (1)在主函数中输入球体的半径, 分别调用函数求出球的表面积和体积,并输出计算结果。 (2)在主函数中输入一个四位数,调用一个 函数输出这四个字符。
#define PI 3.14 #include<stdio.h> float area(float r) {return 4*PI*r*r; } float volumn(float r) { return 4.0/3*PI*r*r*r; } void main( ) {float r; printf(" please input radius:" ); scanf(“%f”,&r); printf("area is %f\n",area(r)); printf("volumn is %f\n",volumn(r)); }
#include<stdio.h> void main( ) {void zifu(int a); int a; printf("Input an int\n"); scanf("%d",&a); zifu(a); } void zifu(int b) {int qian,bai,shi,ge; qian=b/1000; bai=b%1000/100; shi=b%100/10; ge=b%10; printf("qian=%d,bai=%d,shi=%d,ge=%d\n",qian,bai,shi,ge); }