2011第三章模块化程序设计(改).ppt_第1页
2011第三章模块化程序设计(改).ppt_第2页
2011第三章模块化程序设计(改).ppt_第3页
2011第三章模块化程序设计(改).ppt_第4页
2011第三章模块化程序设计(改).ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 模块化程序设计 3.1 3.1 模块化程序设计思想模块化程序设计思想 3.2 3.2 函数定义函数定义 3.3 3.3 函数调用函数调用 3.4 3.4 函数的原型与声明函数的原型与声明 3.5 3.5 函数的嵌套与递归函数的嵌套与递归 3.6 3.6 库函数库函数 3.7 3.7 变量的作用域与存储类型变量的作用域与存储类型 3.8 3.8 指针与函数指针与函数 1 3.1 模块化程序设计思想 模块化是指解决一个复杂问题时模块化是指解决一个复杂问题时自顶向下自顶向下逐层把系统划分逐层把系统划分 成若干模块的过程。成若干模块的过程。 每个模块完成一个特定的子功能,所有的模块按某种方法每个模块完成一个特定的子功能,所有的模块按某种方法 组装起来,成为一个整体,完成整个系统所要求的功能。组装起来,成为一个整体,完成整个系统所要求的功能。 把整个程序划分为若干个把整个程序划分为若干个功能单一、相对独立功能单一、相对独立、较易求解较易求解 的程序模块,然后分别予以实现,最后再把所有的程序模块整的程序模块,然后分别予以实现,最后再把所有的程序模块整 合起来,这种在程序设计中逐步分解、分而治之的策略,被称合起来,这种在程序设计中逐步分解、分而治之的策略,被称 为模块化程序设计方法。为模块化程序设计方法。 C C语言中用语言中用函数函数实现模块的功能。实现模块的功能。 2 例例3.1 3.1 求表达式求表达式 的值。其中,的值。其中,K K、MM、N N是正整数。是正整数。 分析:分别计算分析:分别计算K K、MM、N N的阶乘。的阶乘。 定义函数:定义函数:intint fact(intfact(int n); n); / /计算参数计算参数n n的阶乘的阶乘 fact(K): fact(K): 计算计算K!K! fact(M): fact(M): 计算计算M!M! fact(N): fact(N): 计算计算N!N! 原原表达式即为:表达式即为: fact(K)/fact(K)/( (fact(M)+fact(N)fact(M)+fact(N) ) 3 #include doubledouble fact(intfact(int f) f) doubledouble r=1; r=1; intint i; i; for (i=1; i intint max(intmax(int x, x, intint y) y) intint z; z; if (xy) z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); void main( )void main( ) intint a,b,c; a,b,c; scanf(“%d%dscanf(“%d%d“, “, c=c=max(a, b)max(a, b); ; printf(“maxprintf(“max=%dn“, c);=%dn“, c); 4 3.2 函数定义 在在C C语言中,函数分为以下两种:语言中,函数分为以下两种: (1) (1) 库函数库函数 是由系统提供的,用户不用定义,只需用是由系统提供的,用户不用定义,只需用#include#include包含其包含其 头文件,即可直接使用。如:头文件,即可直接使用。如:printfprintf( )( )、scanfscanf( )( )、sqrtsqrt( )( )等。等。 (2) (2) 自定义函数:自定义函数: 这种函数是根据具体需求按自己的意愿编写的,以完成相这种函数是根据具体需求按自己的意愿编写的,以完成相 应的功能。应的功能。 5 1 1、函数定义的形式:、函数定义的形式: 函数类型函数类型 函数名函数名( (形式参数表列形式参数表列) ) 变量声明部分变量声明部分 语句部分语句部分 2 2、说明:、说明: 、函数名:、函数名:用户给函数起的名字,必须符合标识符命名规则,用户给函数起的名字,必须符合标识符命名规则, “ “见名知义见名知义” ” 、函数类型、函数类型:即函数值(返回值)的类型即函数值(返回值)的类型 若返回值为若返回值为 intint 或或 charchar 类型,可省略不写;类型,可省略不写; 若函数无返回值,函数定义时若函数无返回值,函数定义时应写上应写上voidvoid intint max(intmax(int x, x, intint y) y) voidvoid main( ) main( ) 6 、形式参数表列:说明参数的个数和类型、形式参数表列:说明参数的个数和类型 vv作用作用: : 表示从主调函数中表示从主调函数中接收数据的个数接收数据的个数及及每个数据的类型每个数据的类型 vv书写格式书写格式 : : 每一个参数都要每一个参数都要分别写上数据类型和参数名分别写上数据类型和参数名;参参 数之间数之间以逗号分隔以逗号分隔,无参数时一般写上,无参数时一般写上 voidvoid 或什么也不写或什么也不写 float max(float a, float b, float c)float max(float a, float b, float c) /* /* 从主调函数中接收从主调函数中接收3 3个数据,均为个数据,均为floatfloat类型类型 返回结果为返回结果为floatfloat型数据型数据 * */ / 形参不能写成:形参不能写成: float a, b, c float a, b, c 、变量说明:定义函数中用到的、变量说明:定义函数中用到的除形参以外除形参以外的其它变量;即的其它变量;即 形参不能再次定义形参不能再次定义( (或者说不能定义与形参同名的变量或者说不能定义与形参同名的变量) ) 、语句部分:完成函数功能的语句序列。、语句部分:完成函数功能的语句序列。 7 3 3、例:、例: 、编写一个函数,打印一行信息、编写一个函数,打印一行信息“ “How do you do!”How do you do!” printf(“Howprintf(“How do you do!n“); do you do!n“); _ print( print( _ _ ) ) voidvoid void main( )void main( ) print( );print( ); #include 经验经验1 1:数据已知或固定:数据已知或固定 则不需要作为参数传递;则不需要作为参数传递; 值事先不确定则需要参数值事先不确定则需要参数 传递!传递! 经验经验2 2:不要求计算结果:不要求计算结果 或没有计算出一个数值则或没有计算出一个数值则 不需要返回值。不需要返回值。 8 、求整数、求整数x x的的n n次幂(次幂(n0n0,且为整数且为整数) _ powerpower( (_) ) intint x x, , intint n ndoubledouble for (i=1; i 9 、将指定的字符打印、将指定的字符打印n n次次 _ print( print(_) ) char char chch, , intint n nvoidvoid for (i=1; i 主函数应包含哪些内容:主函数应包含哪些内容: void main( )void main( ) 变量定义变量定义 输入数据输入数据 处理处理 - - 函数调用函数调用 输出结果输出结果 10 第三章 模块化程序设计 3.1 3.1 模块化程序设计思想模块化程序设计思想 3.2 3.2 函数定义函数定义 3.3 3.3 函数调用函数调用 3.4 3.4 函数的原型与声明函数的原型与声明 3.5 3.5 函数的嵌套与递归函数的嵌套与递归 3.6 3.6 库函数库函数 3.7 3.7 变量的作用域与存储类型变量的作用域与存储类型 3.8 3.8 指针与函数指针与函数 复习:复习: 11 3.1 模块化程序设计思想 模块化是指解决一个复杂问题时模块化是指解决一个复杂问题时自顶向下自顶向下逐层把系统划分逐层把系统划分 成若干模块的过程。成若干模块的过程。 每个模块完成一个特定的子功能,所有的模块按某种方法每个模块完成一个特定的子功能,所有的模块按某种方法 组装起来,成为一个整体,完成整个系统所要求的功能。组装起来,成为一个整体,完成整个系统所要求的功能。 把整个程序划分为若干个把整个程序划分为若干个功能单一、相对独立功能单一、相对独立、较易求解较易求解 的程序模块,然后分别予以实现,最后再把所有的程序模块整的程序模块,然后分别予以实现,最后再把所有的程序模块整 合起来,这种在程序设计中逐步分解、分而治之的策略,被称合起来,这种在程序设计中逐步分解、分而治之的策略,被称 为模块化程序设计方法。为模块化程序设计方法。 C C语言中用语言中用函数函数实现模块的功能。实现模块的功能。 12 3.2 函数定义 在在C C语言中,函数分为以下两种:语言中,函数分为以下两种: (1) (1) 库函数库函数 是由系统提供的,用户不用定义,只需用是由系统提供的,用户不用定义,只需用#include#include包含其包含其 头文件,即可直接使用。如:头文件,即可直接使用。如:printfprintf( )( )、scanfscanf( )( )、sqrtsqrt( )( )等。等。 (2) (2) 自定义函数:自定义函数: 这种函数是根据具体需求按自己的意愿编写的,以完成相这种函数是根据具体需求按自己的意愿编写的,以完成相 应的功能。应的功能。 13 1 1、函数定义的形式:、函数定义的形式: 函数类型函数类型 函数名函数名( (形式参数表列形式参数表列) ) 变量声明部分变量声明部分 语句部分语句部分 2 2、说明:、说明: 、函数名:函数名:用户给函数起的名字,必须符合标识符命名规则,用户给函数起的名字,必须符合标识符命名规则, “ “见名知义见名知义” ” 、函数类型函数类型:即函数值(返回值)的类型即函数值(返回值)的类型 、形式参数表列:形式参数表列:说明参数的个数和类型说明参数的个数和类型 、变量说明:变量说明:定义函数中用到的除形参以外的其它变量;即定义函数中用到的除形参以外的其它变量;即 形参不能再次定义形参不能再次定义( (或者说不能定义与形参同名的变量或者说不能定义与形参同名的变量) ) 、语句部分:语句部分:完成函数功能的语句序列。完成函数功能的语句序列。 14 3.3 函数调用 3.3.1 3.3.1 函数调用的形式函数调用的形式 1 1、形式:、形式: 函数名函数名( (实参表列实参表列) ); ; 2 2、说明、说明 、实参表列由到多个、实参表列由到多个实参名实参名组成组成 ,实参之间用逗号分隔,实参之间用逗号分隔 、实参与形参的个数应相等,类型、实参与形参的个数应相等,类型 应一致,顺序要一一对应应一致,顺序要一一对应 、调用无参函数的格式为:、调用无参函数的格式为: 函数名函数名( )( ); ; #include intint max(max(intint x x, , intint y y) ) intint z; z; if (xy) z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); voidvoid main( ) main( ) intint a,b,c; a,b,c; scanf(“%d%dscanf(“%d%d“, “, c= c=max(max(a a, , b b) ); ; printf(“maxprintf(“max=%dn“,c);=%dn“,c); 15 3 3、函数调用的方式、函数调用的方式 、函数调用语句函数调用语句: 无返回值函数的调用无返回值函数的调用 由函数调用加上分号构成,在主调函数中可作为一个独立的语由函数调用加上分号构成,在主调函数中可作为一个独立的语 句;此时不要求函数带回返回值句;此时不要求函数带回返回值 printf(“Thisprintf(“This is a C program“); is a C program“); 、函数表达式函数表达式: 函数调用作为一个运算对象出现在表达式中,此时要求函数带函数调用作为一个运算对象出现在表达式中,此时要求函数带 回一个确定的值以参加表达式的运算回一个确定的值以参加表达式的运算 c=c=max(a, b)max(a, b); ;y=2*y=2*pow(x,2.5)pow(x,2.5); ; 、函数参数函数参数: 函数调用作为另一个函数的实参,其值作为一个实际参数传给函数调用作为另一个函数的实参,其值作为一个实际参数传给 被调函数的形参;此时也要求函数带回一个确定值被调函数的形参;此时也要求函数带回一个确定值 m=max(a, m=max(a, max(b, c)max(b, c); );printf(“%dnprintf(“%dn“, “, max(a, b)max(a, b); ); 16 3.3.2 函数间的参数传递 定义函数的目的是为了实现某个特定功能。当函数被调定义函数的目的是为了实现某个特定功能。当函数被调 用时,一般需要给它传递一些数据,供它直接处理或辅助它用时,一般需要给它传递一些数据,供它直接处理或辅助它 实现具体的功能。实现具体的功能。 把需要参数的函数称为把需要参数的函数称为“ “有参函数有参函数” ”,不需要参数的函数,不需要参数的函数 称为称为“ “无参函数无参函数” ”。 形式参数:形式参数:定义函数定义函数时函数名后面括号内的变量时函数名后面括号内的变量,简称,简称形参形参 实际参数:实际参数:调用函数调用函数时函数名后面括号内的变量时函数名后面括号内的变量,简称,简称实参实参 #include intint max(max(intint x x, , intint y y) ) return(xy?x:y); return(xy?x:y); void main( )void main( ) intint a, b, c; a, b, c; scanf(“%d%dscanf(“%d%d“, “, c=max( c=max(a a, , b b); ); printf(“Maxprintf(“Max=%d.n“, c);=%d.n“, c); 形参形参 实参实参 17 定义函数时需要解决的问题:定义函数时需要解决的问题: qq有没有参数:从主调函数中传递数据;有没有参数:从主调函数中传递数据; 参数的个数:参数的个数: 参数的类型:参数的类型:intint、floatfloat、doubledouble、charchar或指针或指针 qq是否有返回值:向主调函数返回计算结果是否有返回值:向主调函数返回计算结果 返回值的类型:返回值的类型: 编写函数的原则:编写函数的原则: 数据的输入输出均在主调函数中进行,通过参数将要计数据的输入输出均在主调函数中进行,通过参数将要计 算的数据传入被调函数,由被调函数进行计算,并通过返回算的数据传入被调函数,由被调函数进行计算,并通过返回 值返回计算结果。值返回计算结果。 18 例例3.2 3.2 输入两个整数,计算其平均值。要求用函数实现平均值输入两个整数,计算其平均值。要求用函数实现平均值 的计算。的计算。 qq有没有参数:有有没有参数:有 参数的个数:参数的个数:2 2 参数的类型:参数的类型:intint qq是否有返回值:有是否有返回值:有 返回值的类型:返回值的类型:float float 或或 doubledouble doubledouble average(average(intint x,intx,int y y) ) double result; double result; result=(x+y)/2.0; result=(x+y)/2.0; return(result); return(result); void main( )void main( ) intint a,b; a,b; double double aveave; ; scanf(“%d%d“, ); aveave= =average(a,b)average(a,b); ; printf(“aveprintf(“ave=%.1fn“,ave);=%.1fn“,ave); 19 说明:说明: 、程序在编译时不为形参分配存储空间,只有、程序在编译时不为形参分配存储空间,只有当函数被调用时,当函数被调用时, 形参才被分配存储空间形参才被分配存储空间,并,并在调用结束后释放所占的存储空间在调用结束后释放所占的存储空间。 、形参只能是变量;而实参可以是、形参只能是变量;而实参可以是常量常量、变量变量、表达式表达式或或具有返具有返 回值的函数调用回值的函数调用,但要求它们但要求它们有确定的值有确定的值。调用时将实参的值赋给。调用时将实参的值赋给 形参。形参。 m=max(m=max(3 3, , a+ba+b); /*); /* x=3; y=a+b; x=3; y=a+b; */*/ m=max(m=max(a a, , max(b, c) max(b, c) ); /* ); /* x=a; y=max(b,c); x=a; y=max(b,c); */*/ 、实参与形参的个数应相等,类型应一致。、实参与形参的个数应相等,类型应一致。 、规定,实参对形参的数据传递是、规定,实参对形参的数据传递是“ “值传递值传递” ”,即,即单向传递单向传递。只只 能由实参传给形参,而不能由形参传回来给实参能由实参传给形参,而不能由形参传回来给实参。在内存中,实参。在内存中,实参 与形参占有不同的内存单元。与形参占有不同的内存单元。 20 #include void void sum(intsum(int x, x, intint y, y, intint z) z) x=10; y=20; z=x+y; x=10; y=20; z=x+y; printf(“xprintf(“x=%d, y=%d, z=%dn“, x,y,z);=%d, y=%d, z=%dn“, x,y,z); void main( )void main( ) intint a=1, b=2, c=0; a=1, b=2, c=0; sum(a, b, c); sum(a, b, c); printf(“aprintf(“a=%d, b=%d, c=%dn“, a,b,c);=%d, b=%d, c=%dn“, a,b,c); x=10, y=20, z=30x=10, y=20, z=30 a=1, b=2, c=0a=1, b=2, c=0 21 3.3.3 函数的返回值 intint max(max(intint x x, , intint y y) ) intint z; z; z=xy?x:y; z=xy?x:y; return(z);return(z); 1 1、函数的返回值是通过、函数的返回值是通过returnreturn语句语句获得的。获得的。 returnreturn语句的作用是语句的作用是终止当前函数的执行终止当前函数的执行并并将一个确定值带回主调将一个确定值带回主调 函数中函数中 returnreturn语句的一般形式是:语句的一般形式是: returnreturn( (表达式表达式) ); ;或: 或:returnreturn 表达式表达式; ; 2 2、函数返回值的类型:在定义函数时指定、函数返回值的类型:在定义函数时指定 intint max(intmax(int x, x, intint y) y)double double power(intpower(int x, x, intint y) y) 语言规定,凡不指定类型的函数,自动按语言规定,凡不指定类型的函数,自动按整型整型( (intint) )处理。处理。 max(intmax(int x, x, intint y) y)intint max(intmax(int x, x, intint y) y) 22 函数值的类型函数值的类型与与returnreturn语句中语句中表达表达 式的类型式的类型应一致应一致;若不一致,则;若不一致,则以函数以函数 类型为准类型为准(自动转换(自动转换)。)。 intint max(double x, double y) max(double x, double y) return(xy?x:y); return(xy?x:y); 3 3、一个函数可以有多个、一个函数可以有多个returnreturn语句,但每个语句,但每个returnreturn后的表达式类型后的表达式类型 要相同;当执行到其中任何一个要相同;当执行到其中任何一个returnreturn语句时会立即返回主调函数语句时会立即返回主调函数 4 4、对于、对于有返回值的函数有返回值的函数,若,若returnreturn语句后面语句后面没有表达式没有表达式,或,或没有没有 returnreturn语句语句,此时,此时带回一个不确定的返回值带回一个不确定的返回值。 return;return; 5 5、为了明确表示、为了明确表示“ “不带回值不带回值” ”,可以用,可以用voidvoid定义定义 “ “无类型无类型” ”(或称(或称“ “空类型空类型” ”,即无返回值)。,即无返回值)。 void void main( )main( ) 23 例例1 1:定义一个函数,判断整数:定义一个函数,判断整数mm是否是素数。是素数返回整是否是素数。是素数返回整 数数1 1,不是返回,不是返回0 0。 isPrimeisPrime( )( ) intint m mintint k=k=sqrt(msqrt(m); ); for (i=2; i #include #include #include #include 、若用户自己定义的函数、若用户自己定义的函数在主调函数之后在主调函数之后,则应在主调函数,则应在主调函数 之前对被调用的函数作之前对被调用的函数作声明声明 定义定义:对函数功能的确定;包括指定函数名、函数类型、形参及类对函数功能的确定;包括指定函数名、函数类型、形参及类 型、函数体等。型、函数体等。- - 一个完整的函数一个完整的函数 声明声明:将函数的名字、函数类型以及形参的类型、个数和顺序通知将函数的名字、函数类型以及形参的类型、个数和顺序通知 编译系统。编译系统。 - - 由函数首部加分号构成由函数首部加分号构成 26 3.4 函数的原型与声明 在函数调用之前应当对所调用的函数进行声明,指出该函在函数调用之前应当对所调用的函数进行声明,指出该函 数的返回值的类型以及形参的个数和类型,编译器据此对函数数的返回值的类型以及形参的个数和类型,编译器据此对函数 调用进行语法检查,保证函数使用的正确性。调用进行语法检查,保证函数使用的正确性。 1 1、函数声明的格式:、函数声明的格式: 函数类型函数类型 函数名函数名( ( 形参表形参表 ) ); ; float fun(double a, float fun(double a, intint b, float c) b, float c) 可以声明为以下几种形式:可以声明为以下几种形式: float fun(double a, float fun(double a, intint b, float c) b, float c); ; float fun(double, float fun(double, intint, float), float); ; float fun(double x, float fun(double x, intint y, float z) y, float z); ; 27 2 2、说明:、说明: 、函数声明的位置:一种是在主调函数、函数声明的位置:一种是在主调函数 中对被调函数进行函数声明;另一种是在中对被调函数进行函数声明;另一种是在 所有函数的外部进行函数声明(推荐)。所有函数的外部进行函数声明(推荐)。 、如果被调函数出现在主调函数之前,、如果被调函数出现在主调函数之前, 可以不必进行声明。可以不必进行声明。- -(推荐)(推荐) #include intint max(intmax(int x, x, intint y); y); void main( )void main( ) intint max(intmax(int x, x, intint y) y) #include intint max(intmax(int x, x, intint y) y) void main( )void main( ) 28 3.5 函数的嵌套与递归 3.5.1 3.5.1 函数的嵌套调用函数的嵌套调用 语言的函数定义都是互相平行的、独立的,即不允许嵌语言的函数定义都是互相平行的、独立的,即不允许嵌 套定义函数(即在一个函数内部定义另一个函数);套定义函数(即在一个函数内部定义另一个函数); 但是,可以嵌套调用函数,即程序在调用一个函数的过程但是,可以嵌套调用函数,即程序在调用一个函数的过程 中,该被调函数又可以调用其它函数。中,该被调函数又可以调用其它函数。 void main( )void main( ) : : fun( );fun( ); : : void void funfun( void )( void ) : : g( );g( ); : : main函数 fun函数 g函数 调用 调用 嵌套 调用 29 例:计算例:计算2-n2-n之间所有素数的和。之间所有素数的和。 void main( )void main( ) 输入输入n(nn(n是整数是整数 ) ) 求和求和 - - s=sum(n)s=sum(n) 输出输出 s s intint sum(intsum(int n) n) for (i=2,s=0;i #include #include intint isPrime(intisPrime(int m) m) intint i,k; i,k; k= k=sqrt(msqrt(m); ); for (i=2;i1): “); n(n1): “); scanf(“%d“, ); s=sum(n)s=sum(n); ; printf(“sprintf(“s= =%d%dn“,s);n“,s); 31 函数在被调用的过程中,又直接或间接地调用自身,则称函数在被调用的过程中,又直接或间接地调用自身,则称 函数的递归调用。这种函数也被称为递归函数。语言允许函函数的递归调用。这种函数也被称为递归函数。语言允许函 数的递归调用。数的递归调用。 3.5.2 3.5.2 函数的递归调用函数的递归调用 例例3.5 3.5 用递归方法求整数用递归方法求整数n n的阶乘的阶乘n!n!。 分析:一般来说,分析:一般来说,n!n!描述成为:描述成为: n!n!= =1*2*3*(n-1)*n1*2*3*(n-1)*n 但是,变换一下,就可以将其描述成为:但是,变换一下,就可以将其描述成为: n!n!= =n*(n-1)*3*2*1n*(n-1)*3*2*1= =n*(n-1)!n*(n-1)! 32 #include double double fact(intfact(int n) n) if ( if (n intint max(max(intint x x, , intint y y) ) intint z; z; if (xy) z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); voidvoid main( ) main( ) intint a,b,c; a,b,c; scanf(“%d%dscanf(“%d%d“, “, c= c=max(max(a a, , b b) ); ; printf(“maxprintf(“max=%dn“,c);=%dn“,c); 1 1、局部变量局部变量: 指在一个函数或复合语句内部(位于一对花括号之间)定指在一个函数或复合语句内部(位于一对花括号之间)定 义的变量;只在本函数或复合语句的范围内有效义的变量;只在本函数或复合语句的范围内有效 x x、y y、z z的有效范围的有效范围 a a、b b、c c的有效范围的有效范围 37 2 2、说明:、说明: 、mainmain函数中定义的变量是局部变量,只能在函数中定义的变量是局部变量,只能在mainmain函数中使用函数中使用 、不同函数中可以使用相同名字的变量,它们占用不同的内存、不同函数中可以使用相同名字的变量,它们占用不同的内存 单元,互相独立单元,互相独立 、形式参数也是局部变量、形式参数也是局部变量 、复合语句中定义的变量,其作用域只是本复合语句、复合语句中定义的变量,其作用域只是本复合语句 void main( )void main( ) intint a, b a, b; ; intint c; c; c=a+b; c=a+b; c c在此范围内有效在此范围内有效 a a、b b在此范围内有效在此范围内有效 38 #include void main( )void main( ) intint i, i,a=0a=0; ; for (i=1; i intint p=1, q=5; p=1, q=5; float f1( float f1( intint a ) a ) float r ; float r ; : : intint s; s; intint f2( f2( intint b , b , intint c ); c ); intint sum; sum; : : float m, n;float m, n; void main( )void main( ) float x, y; float x, y; : : 全局变量全局变量p p和和 q q的有效范围的有效范围 全局变量全局变量s s的的 有效范围有效范围 全局变量全局变量mm和和 n n的有效范围的有效范围 41 3 3、说明:、说明: 、全局变量、全局变量增加了函数间的数据联系增加了函数间的数据联系; 由于在同一文件中的所有函数都能使用全局变量由于在同一文件中的所有函数都能使用全局变量, , 所以可所以可 以利用全局变量从函数中以利用全局变量从函数中得到一个以上的返回值得到一个以上的返回值 全局变量名的第一个字母常用全局变量名的第一个字母常用大写字母大写字母表示表示 、建议不要过多的使用全局变量建议不要过多的使用全局变量 全局变量在程序的执行过程中全局变量在程序的执行过程中 一直占用存储单元一直占用存储单元 它使函数的独立性降低它使函数的独立性降低 会降低程序的清晰性会降低程序的清晰性 #include intint k; k; void show( )void show( ) for ( for (k k=1; kb ? a : b; c=ab ? a : b; return(c); return(c); void main( )void main( ) intint a=8 a=8; ; printf(“%dprintf(“%d“, max(a, b) );“, max(a, b) ); 形参形参a a、b b的作用域的作用域 全局变量全局变量a a、b b不起作用不起作用 局部变量局部变量a a的作用域的作用域 全局变量全局变量b b的作用域的作用域 全局变量全局变量a a不起作用不起作用 43 3.7.2 变量的存储类型 变量的存储类型是指存储变量值的内存类型变量的存储类型是指存储变量值的内存类型。它决定变。它决定变 量量何时创建何时创建、何时销毁何时销毁以及它的值将以及它的值将保存多久保存多久。 变量的存储类型可分为变量的存储类型可分为“ “静态存储静态存储” ”和和“ “动态存储动态存储” ”两种。两种。 qq 静态存储变量静态存储变量通常是在变量定义时就分配存储单元并一通常是在变量定义时就分配存储单元并一 直保持不变,直到整个程序结束。全局变量即属于此类存储直保持不变,直到整个程序结束。全局变量即属于此类存储 方式。方式。 qq 动态存储变量动态存储变量是在程序执行过程中,使用到它时才分配是在程序执行过程中,使用到它时才分配 存储单元,使用完毕立即释放。如存储单元,使用完毕立即释放。如形参形参,函数被调用时才分,函数被调用时才分 配内存单元,函数调用完毕立即释放。如果一个函数被多次配内存单元,函数调用完毕立即释放。如果一个函数被多次 调用,则反复地分配、释放形参变量的存储单元。调用,则反复地分配、释放形参变量的存储单元。 44 比较下列两个程序的输出结果:比较下列两个程序的输出结果: #include void void fun(intfun(int x) x) intint a=0; a=0; a+=2; a+=2; printf(“xprintf(“x=%d,a=%dn“,x,a);=%d,a=%dn“,x,a); void main( )void main( ) intint i; i; for (i=1;i void void fun(intfun(int x) x) staticstatic intint a=0; a=0; a+=2; a+=2; printf(“xprintf(“x=%d,a=%dn“,x,a);=%d,a=%dn“,x,a); void main( )void main( ) intint i; i; for (i=1;i void void fun(intfun(int x) x) staticstatic intint a=0; a=0; a+=2; a+=2; printf(“xprintf(“x=%d,a=%dn“,x,a);=%d,a=%dn“,x,a); void main( )void main( ) intint i; i; for (i=1;i void void swap(swap(intint x, x, intint y y) ) intint temp; temp; temp=x; temp=x; x=y; x=y; y=temp; y=temp; 55 用全局变量实现:用全局变量实现: #include intint a,b; a,b; void swap( )void swap( ) intint temp; temp; temp=a; temp=a; a=b; a=b; b=temp; b=temp; void main( )void main( ) printf(“Inputprintf(“Input a,b:“); a,b:“); scanf(“%d%d“, ); printf(“aprintf(“a=%d,b=%dn“,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论