课程等2011程序设计基础函数_第1页
课程等2011程序设计基础函数_第2页
课程等2011程序设计基础函数_第3页
课程等2011程序设计基础函数_第4页
课程等2011程序设计基础函数_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计基础吴茜媛WU, XiyuanE-mail: August 29, 2022C语言的构成体系数据类型(运算符)基本数据类型:整型、实型等复杂数据类型:数组、指针、结构体等运算符语句(描述和控制操作步骤)支持结构化程序设计即C语言要有相应的语句来支持顺序、分支和循环结构函数C程序是由一系列函数组成的C程序运行的基本单元第八章 函数 结构化程序设计方法实际应用中当需要解决的问题很复杂或很庞大时,一般是将其分解为若干相对小且简单的子问题进行解决若子问题还比较复杂,可以重复上述过程一直细分到子问题可以用结构化程序设计的三种基本结构很容易解决为止采用“自顶向下,逐步求精”或“自底向上,逐步积累”

2、的设计策略子问题(子模块):完成某个特定的功能成绩管理数据录入数据查询数据维护数据统计结构化程序设计语言采用支持结构化程序的设计语言来实现支持顺序、选择和循环三种基本结构可以把程序分为各个子程序(子模块)每个子程序实现一个特定的功能C语言支持结构化程序设计用函数描述子模块(子问题)至少有一个main()函数(至少要解决一个问题)程序是由一系列函数组成(由多个子问题组成一个大问题)C语言函数概述分为两类标准库函数由系统提供,解决通用的问题,如输入输出、求sin等自定义的函数由程序员自己定义,解决程序员自己的特定问题C语言中,程序由一个主函数main( )和其他若干函数构成函数之间可以互相调用调用

3、函数即执行函数其他函数不能调用main函数,main函数由系统调用C语言函数概述主函数子函数1子函数2子函数n子函数21子函数22子函数n1子函数n2子函数n3子函数221函数之间的调用关系示意图举例问题:打印如下图案:*This day is so cool!*举例问题分析按照格式输出,总计两种格式“*.”This day.”算法:2种算法1:用printf用3个printf算法2:用自定义的函数,完成如下特定功能用一个函数打印“*.”用另一个函数打印”This day.”echoline() printf(“*n”);echotext() printf(“This day is so co

4、ol!);main() echoline(); /*打印“*.”*/ echotext(); /* ”This day.” */ echoline(); /*打印“*.” */函数概述程序设计中,常常将功能独立的模块或重复使用的功能定义成一个函数当在其他函数中需要这个功能时,只需简单调用这个函数这样做可以使程序结构比较简单,容易阅读,易于修改主要内容函数的定义函数的调用(使用)函数的声明August 29, 2022函数定义格式一般格式是: ( ) 用方括号括起,表示该部分内容可以省略。int max( int x, int y) int t; t = (xy) ? x:y ; return(

5、t); 函数定义格式说明用于确定这个函数的返回值的类型,如整型、实型、字符型等。定义了函数的名称,通过这个名称实现对某个函数进行调用。main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); int max(int x, int y) int t; t = (xy) ? x:y ; return(t); 函数定义格式说明规定了函数有什么样的参数可以省略若被省略,则该函数被称为无参函数;若形式参数有多个,用逗号隔开形参与形参的类型说明可以分开描述 如:fun (x,

6、y, z) int x, y, z;也可以放在一起,写成: fun (int x, int y, int z)int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); 函数定义格式说明规定了函数中要执行的语句用一对大括号括起来main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 程序运行结果: 5, 9 This max is: 9int max(int x, int y) int t; t = (xy

7、) ? x:y ; return(t); 函数调用格式一般格式: ()main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); int max(int x, int y) int t; t = (xy) ? x:y ; return(t); 函数调用格式说明调用函数时要给出被调用的函数名和一对括号如果这个函数是带参函数,并且有多个实参,要用逗号将实参变量隔开放在括号内。实参和形参必须个数相等,顺序依次一一对应。那么实参表列可以省略,但括号不能省略。main( ) i

8、nt a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); int max(int x, int y) int t; t = (xy) ? x:y ; return(t); 函数调用格式说明当实参和对应形参类型不一致时,先将实参的类型转换成形参的类型后再传递。如果这个函数是无参函数,那么实参表列可以省略,但括号不能省略。main( ) float a, b; int c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This ma

9、x is: %dn”, c); int max(int x, int y) int t; t = (xy) ? x:y ; return(t); 说明在C语言中,可以将函数调用当成一个表达式如果在这个表达式后加一个分号,就成为函数调用语句echonum(i, j); 如果不加分号,函数调用相当于一个普通的表达式,称之为函数表达式,此表达式的类型由定义函数时规定的函数类型决定c = max(a, b)函数实参的求值顺序在各C语言系统中是不一样,有的是从左到右,有的是从右到左。函数调用规则被调用函数必须是已经存在的函数、库函数或用户已定义过的函数。如果使用库函数,还要在使用库函数的源文件开头用#i

10、nclude声明库函数所在的头文件。头文件是以字母h作为后缀名,在头文件中包含了对库函数的说明。没有头文件就不能对库函数进行调用。如果使用用户自定义的函数,还要在主调函数中说明用户函数的返回值类型。空函数定义格式 ( ) 在结构化程序设计中,可将那些功能较复杂、作用较为次要的函数先定义成空函数集中精力编写那些基本的、常用的函数,边编写边调试最后再一步一步的完善各个函数作用:可以调试好一个函数后,再调试下一个,而不用将所有的函数都写完了再进行程序调试这样的程序可读性好,易调试,易维护,易扩充说明x,y是形式参数函数定义时的参数a,b是实际参数函数调用时的参数程序执行顺序是:运行主函数main当执

11、行c=max(a,b);语句时,调用函数maxmax函数的运行结果由return语句返回main函数中输出结果int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 函数的参数形式参数与实在参数定义函数时:函数名后括号内的变量表列就称为形式参数表,简称形参。调用函数时:函数名后括号内的变量表列被称为实在参数表,简称实参。形参随函数的调用而产生,随函

12、数的结束而消亡的。定义时,不开辟内存空间,只有当函数被调用时,形参才在内存中开辟空间调用结束后,形参自动从内存中被释放掉int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 函数的参数形式参数与实在参数定义函数时:函数名后括号内的变量表列,称为形式参数表,简称形参。调用函数时:函数名后括号内的变量表列,称为实在参数表,简称实参。int max(x

13、, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 形参定义形参类型在函数定义中,必须规定形参的类型有两种定义方式 int max(x, y, z) 或int max(int x, int y, float z) int x, y; float z; 实参定义实参用于给相应的形参赋值在调用函数前,实参必须要有一个确切的值可以是常量、变量或表达式实参与形参的关系赋

14、值与被赋值的关系遵守赋值运算的一切规则int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 实参与形参的结合实参与形参的结合方式是“单向赋值传递”实参与形参是不同的变量分别占有各自的内存空间即使实参与形参变量的名称一样也是不同的变量在函数被调用时,形参的值是由实参传递过来的,独立占有内存空间在被调用函数中对形参的改变,不会对实参的值进行任何改变i

15、nt max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 例子 int echonum( int i, int j ) int t; t = i; i = j; j = t; printf(“In function i = %d, j = %dn”, i, j); main( ) int i = 6, j = 8; echonum(i, j); pri

16、ntf(“Out function i = %d, j = %dn”, i, j); 程序运行结果:In function i = 8, j = 6Out function i = 6, j = 8函数的返回值如果被调用函数要向调用函数返回一个值,那么需要使用return语句。一般格式如下: return ();或 return ;功能将表达式的值作为函数的返回值返回,结束本次函数调用并回到调用函数语句处。如果只想从函数返回而不想带回返回值,可以使用不带表达式的方式,即: return;也可以省略不写return语句说明函数中可以有多个return语句,执行到哪个return语句,就从那一个r

17、eturn语句返回。return只能返回一个值,而不能返回多个值。return(表达式)语句中的表达式值的类型应与定义函数时函数的类型一致。若函数中没有return语句,不代表函数没有返回值,只能说明函数的返回值是个不确定的数。若函数没有返回值,可以用void关键字来定义函数,表示“无类型”,如:void echoline()一般情况下,如果函数没有返回值,一定要将函数定义为void类型的。函数声明C语言中,变量使用遵循“先定义,后使用”int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a, b, c;

18、 scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 有3种方式对函数进行声明第一种int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int max(); int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 函数声明有3种方式对函数进行声明第二种int max(x, y) int x, y; int

19、t; t = (xy) ? x:y ; return(t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 函数的声明有3种方式对函数进行声明第三种int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(t); int max(); /求两数中较大者main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This m

20、ax is: %dn”, c); 函数的声明函数声明小结一般形式 ( );C语言规定如下情况,可以不在主调函数中说明函数的返回值类型如果被调用函数的返回值为整型或字符型时,可不进行说明已讲主要内容函数的定义函数的调用形式参数和实际参数函数的声明August 29, 2022函数的调用主函数子函数1子函数2子函数n子函数21子函数22子函数n1子函数n2子函数n3子函数221函数之间的调用关系示意图函数的调用函数的嵌套调用函数的递归调用August 29, 2022函数的嵌套调用#include int q();int p();main( ) int i , j , k; i = 0; j =

21、1; k = 2; k = q(0, k); printf(“%4d %4d %4dn”, i,j,k);int q(int h, int j) int i; i = j; if (h = 0) j = p(j); else i = p(i); printf(“%4d %4d %4dn”, i, j, h); return(j); int p(int i) return(+i); k=q(0,k); 调用q(h,j)函数h被赋值为0;j被赋值为2;执行q函数操作q函数返回值为3;运行结果:230013函数的嵌套调用main( )函数调用q( h,j)函数main( )函数结束q( )函数p(

22、)函数调用p( i )函数q( )函数结束p( )函数结束h=0,j=2i=2i=2i=3返回3j=3返回3j=1k=3i=0k=2函数的嵌套调用小结在C语言中,所有函数之间的关系是平等的,没有谁比谁高一级的问题但从调用关系上来看,函数的嵌套调用表现在某个函数在执行过程中,又可以调用另外一个函数即函数在执行过程中,不是执行完一个函数再去执行另一个函数,而是可以在任何需要的时候对其他函数进行调用#include int q();int p();main( ) int i , j , k; i = 0; j = 1; k = 2; k = q(0, k); printf(“%4d %4d %4dn

23、”, i,j,k); k = q(1, k); printf(“%4d %4d %4dn”, i,j,k); j = q(2, j); printf(“%4d %4d %4dn”, i,j,k); int q(int h, int j) int i; i = j; if (h = 0) j = p(j); else i = p(i); printf(“%4d %4d %4dn”, i, j, h); return(j); int p(int i) return(+i); 函数的嵌套调用#include int q();int p();main( ) int i , j , k; i = 0;

24、j = 1; k = 2; k = q(0, k); printf(“%4d %4d %4dn”, i,j,k); k = q(1, k); printf(“%4d %4d %4dn”, i,j,k); j = q(2, j); printf(“%4d %4d %4dn”, i,j,k); int q(int h, int j) int i; i = j; if (h = 0) j = p(j); else i = p(i); printf(“%4d %4d %4dn”, i, j, h); return(j); int p(int i) return(+i); k=q(0,k); 调用q(h

25、,j)函数h被赋值为0;j被赋值为2;执行q函数操作q函数返回值为3;运行结果:230013431013212013k=q(1,k); 调用q(h,j)函数h被赋值为1;j被赋值为3;执行q函数操作q函数返回值为3;j=q(2,j); 调用q(h,j)函数h被赋值为2;j被赋值为1;执行q函数操作q函数返回值为3;嵌套调用(1)main( )函数调用q( h,j)函数printf()q( )函数p( )函数调用p( i )函数q( )函数结束p( )函数结束h=0,j=2i=2i=2i=3返回3j=3返回3j=1k=3i=0k=2输出:230printf()输出:013嵌套调用(2)调用q(

26、h,j)函数q( )函数p( )函数调用p( i )函数q( )函数结束p( )函数结束h=1,j=3i=3i=3i=4返回4i=4返回3j=1k=3i=0k=3输出:013printf()输出:431printf()嵌套调用(3)调用q( h,j)函数q( )函数p( )函数调用p( i )函数q( )函数结束p( )函数结束h=2,j=1i=1i=1i=2返回2i=2返回1j=1j=1i=0k=3输出:013printf()输出:212printf()main( )函数结束函数的调用主函数子函数1子函数2子函数n子函数21子函数22子函数n1子函数n2子函数n3子函数221函数之间的调用关

27、系示意图函数的递归调用问题求n!问题分析阶乘的定义:有2种算法设计编码实现问题分析第(2)种在定义阶乘时,又使用了阶乘的定义可以使用函数,定义一个计算阶乘的函数函数的递归调用算法设计step1: 输入n;step2: 调用计算阶乘的函数facl(n);step3: 输出f。其中,函数facl(n)为计算n阶乘的函数,详细算法如下:step1: 如果 n=1,则result=1;否则result=n*facl(n-1)。step2: 返回result。函数的递归调用long facl(); /计算阶乘的函数的声明main()int n; /保存用户输入的数字long f; /保存计算的结果pri

28、ntf(“Please input n: ”); /提示用户输入nscanf(“%d”,&n); /接受用户输入f=facl(n); /计算阶乘的函数的调用printf(“n!=%ldn”,f); /打印结果long facl(n) /计算阶乘的函数的定义int n;long result;if (n=1) result =1; else result =n*facl(n-1); /又调用函数facl()自身return(result);函数的递归调用facl( n)函数result =n*facl(n-1); facl( )函数结束main( )函数main( )函数结束若n=3scanf(

29、“%d”,&n); f=facl(n); if (n=1)200032001200632007facl( n)函数result =n*facl(n-1); facl( )函数结束if (n=1)202022021facl( n)函数result =1;facl( )函数结束if (n=1)205012051return(result);return(result);return(result);函数的递归调用如果在调用函数时,被调用函数又是函数本身,这种调用被称为函数的递归调用采用递归方法解决的问题一般应符合以下条件:可以把该问题化为一个新问题,新问题的解决方法与原问题的解决方法相同,只是所处

30、理的对象有规律的递增或递减,相对简单一些。通过转换最终使问题得到解决。必须有一个结束递归的条件。递归程序由两大部分构成:当某一条件成立时不再进行递归调用,即结束递归。当条件不成立时仍然进行递归调用。例子在进行人口普查时,人口普查员问一户农家的主人:“你家有几个孩子?” 主人答:“五个”,“您大孩子多大了?”“比老二大两岁”,“那老二多大了?”“比老三大两岁”,“那老三多大了?”“比老四大两岁”,“那老四多大了?”“比老五大两岁”,“那老五多大了?”“老五一岁了。” 求其中任意一个孩子的年龄?算法设计编码实现问题分析问题分析: 设老大表示为1,老二表示为2,AGE(1)表示老大的年龄,则可以列一

31、组式子:AGE(1) = AGE(2) +2; AGE(2) = AGE(3 )+2; AGE(3) = AGE(4) +2; AGE(4) = AGE(5) +2; AGE(5) = 1;例子算法设计step1: 输入第x个孩子;step2: 结果 a = AGE(x);step3: 输出a。其中,函数AGE(x)为计算第x个孩子年龄b的函数,详细算法如下: step1:如果 x=5,则b=1;否则b=AGE(x+1)+2。 step2:返回b。例子int age(); /计算年龄的函数main( ) int m, x; printf(“请输入要求第几个孩子的年龄:”); /提示用户输入 s

32、canf(“%d”,&m); /接受用户输入 x = age(m); printf (“第%d个孩子的年龄是%d!n”, m, x);int age( int n ) int x; if (n = 5) x = 1; else x = age(n+1)+2; return ( x ) ;举例验证歌德巴赫猜想对于任何大于等于6的偶数,都可以用两个素数之和表示。要求:定义一个求素数的函数,它有一个整型参数,当参数值为素数时返回1,否则返回0。如: 6=3+3, 8=3+5, 98=19+79算法设计编码实现问题分析问题分析:什么是素数如何找到某两个数的和,等于已知的偶数采用遍历尝试法如何判断这两个

33、数是素数举例问题分析:什么是素数除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,1535,所以15不是素数;13除了等于131以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。举例问题分析:如何找到某两个数的和,等于已知的偶数将已知的偶数n分为两数之和n1+n2, 采用遍历尝试法初始化n1=1n1+,从2开始取值尝试,则n2=n-n1;判断n1和n2是不是素数:若是,则表示为这两个数的和即可;若不是,转上一步继续尝试 举例问题分析:如何判断是素数(可定义一个函数check(),实现此功能)遍历以上到n1的平方根以下的每一个整数,是不是能整除n1; 若都不能整

34、除的话,则n1是素数。(这是最基本的方法)举例算法:Step1: 输入n, 令n1=1Step2: n1+; n2=n-n1; 注:因为1不是素数,故n1要从2开始取值为便于循环操作统一,此处初始化n1=1,然后执行统一的n1+操作Step3: 若 (check(n1)&check(n2)为真,则printf(“%d=%d+%d”,n, n1, n2);否则,转Step2举例算法:其中的check(x)函数,算法如下 for (i=2; i=(int)sqrt(x); i+) if ( x%i = 0 ) /判断是否能整除x,若能则返回假(0) return 0; return 1;#incl

35、ude stdio.h#include math.hint check(); /函数说明(声明)/主函数main() int n, n1, n2; printf(请输入一个不小于6的偶数:);scanf(%d,&n);n1=1;do n1+; n2=n-n1; if (check(n1)&check(n2) /函数的调用 break;while (!check(n1)|(!check(n2);printf(%d=%d+%dn,n,n1,n2);/判断是否是素数的函数check的定义int check(x)int x; int i;for (i=2; iy) ? x:y ; return(t);

36、 main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); /* 实参 */ printf (“This max is: %dn”, c); 函数的参数单个常量、变量作为函数参数一维数组作为函数参数多维数组作为函数参数August 29, 2022数组作为函数参数数组元素作函数参数(“单向赋值传递”)前面学过:一个变量可以作为函数的实参数组元素就是一个一个的变量数组名作函数参数(“地址传递”)数组名代表数组存储空间的首地址整个数组被传递到被调用函数中int a5;a0=10;a1=20;a2=30; 单向值传递“单向值传递”将数

37、组元素作为函数的参数使用规则与变量作为函数参数的规则一样int max(x, y) /* 形参 */ int x, y; int t; t = (xy) ? x:y ; return(t); main( ) int a2; int c; scanf (“%d, %d”, &a0, &a1); c = max(a0, a1); /* 实参 */ printf (“This max is: %dn”, c); 地址传递“地址传递”数组名作为函数参数传递的是数组的首地址实质是实参数组与形参数组共占有一块内存单元而不是将所有的数组元素全部复制到形参数组中int max(int b2) /* 形参 */

38、 int t; t = (b0b1) ? b0:b1 ; return(t); main( ) int a2; int c; scanf (“%d, %d”, &a0, &a1); c = max(a); /* 实参 */ printf (“This max is: %dn”, c); 7 0编号为2000的字节200120022003a0a1ab地址传递的说明实参数组与形参数组的类型必须一致若不一致,则按形参定义数组的方式来解释实参数组“值传递”(单向赋值传递)实参给形参单向赋值改变形参的值,不影响实参的值。“地址传递”实质是实参数组与形参数组共占有一块内存单元则,可以在被调函数中对主调函数

39、中的数组进行修改,使主调函数可以从被调函数获得多个值。地址传递的说明数组名作为函数的参数,只是传递数组的首地址,故在形参定义时也可不定义数组的大小这样可用于处理任何长度的数组但需要通过传递其它参数等方式保证不要越界使用数组。int max(int b) /* 形参 */ int t; t = (b0b1) ? b0:b1 ; return(t); main( ) int a2; int c; scanf (“%d, %d”, &a0, &a1); c = max(a); /* 实参 */ printf (“This max is: %dn”, c); 例 8.13 用选择法对数组中10个整数按

40、由小到大排序。 所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。未排序时的情况:a0 a1 a2 a3 a4 3 6 1 9 4 将5个数中最小的数1与a0对换: 1 6 3 9 4 将余下的4个数中最小的数3与a1对换 1 3 6 9 4 将余下的3个数中最小的数4与a2对换 1 3 4 9 6 将余下的2个数中最小的数6与a3对换 1 3 4 6 9 程序:#include void main() void sort(int ,int ); int ,; printf(enter the array

41、); for(;) scanf(,); sort(,); printf(the sorted array); for(;) printf(,); printf(); void sort(int array,int )/*排序函数*/ int ,; for(;) ; for(;) if(array array) =; =arrayk; arrayk=arrayi; arrayi=t; 多维数组作函数参数当数组是多维数组时,要注意形参数组的定义格式以二维数组为例:第一维的大小可以不指定;第二维的大小不能省略;如 int x10是正确的int x4是不合法的x是不合法的因为系统无法知道数组x是多少行

42、多少列函数的参数单个常量、变量作为函数参数一维数组作为函数参数多维数组作为函数参数August 29, 2022变量作用域变量的作用域指变量起作用的范围在C语言中,如果按作用域的不同,变量分为:局部变量全局变量局部变量局部变量在一个函数内部定义的变量作用域在本函数范围内即局部变量只在定义它的函数内部起作用,在其它函数内不起作用#include int q();int p();main( ) int i , j , k; i = 0; j = 1; k = 2; k = q(0, k); printf(“%4d %4d %4dn”, i,j,k);int q(int h, int j) int

43、i; i = j; if (h = 0) j = p(j); else i = p(i); printf(“%4d %4d %4dn”, i, j, h); return(j); int p(int i) return(+i); 函数q的局部变量:1)变量i2)形式参数h,j函数main的局部变量:1)变量i, j, k函数p的局部变量:1)形式参数i;说明main函数也是一个函数,它内部定义的变量只能在main函数内部使用,而在其它函数内部不能使用main函数内部定义的变量。不同的函数中可以使用相同的变量名,但它们是属于不同函数的变量分配不同的内存空间它们的作用域是不同的形参是局部变量作用范

44、围在定义它的函数内在定义形参时,和函数体内的变量不能重名在复合语句内部也可以定义变量,这些变量的作用域只在本复合语句中全局变量全局变量在函数外部定义的变量作用域从定义变量的位置开始到该程序源文件结束全局变量int x, y;float f1(int a) float a, b; int f2(int c) int z ; main( ) int m, n ; 全局变量x、y的作用域全局变量a、b的作用域说明在一个函数内部,既可以使用本函数定义的局部变量,也可以使用在此函数前定义的全局变量全局变量使得函数间多了一种传递信息的方式如果在一个程序中各个函数都要对同一个信息进行处理,就可以将这个信息定

45、义成全局变量采用这种方式,可以从函数内部得到多个计算值说明尽量不要使用全局变量因为结构化的程序设计要求各模块(函数)间的藕合性要尽量小、内聚性要高即各模块间传递的信息要尽量少、各模块的独立性要高若要在定义全局变量的前面,使用全局变量也要遵循“先定义,后使用”使用extern关键字,对要使用的全局变量进行声明即告诉系统,要使用的这个变量是被定义过的。变量作用域变量的作用域指变量起作用的范围在C语言中,如果按作用域的不同,变量分为:局部变量全局变量计算机内存分配计算机系统内存分为系统区:存放操作系统(OS)相关等内容用户区:存放用户程序和数据等用户程序在运行时,用户区的内存被分为动态存储区存放变量

46、:称为动态变量,如局部变量、函数调用时的相关信息等静态存储区:存放的变量,称为静态变量其中的变量在程序的整个运行期间都存在程序区August 29, 2022变量的属性C语言中,变量有两个属性数据类型决定给变量开辟多少内存空间如int型:占2个字节由用户指定存储方式(类别)存储在内存中什么区域动态存储区:一般存局部变量等静态存储区:一般存全局变量主要由系统指定,用户也可以指定(自定义)August 29, 2022存储类别关键字存储方式(类别)动态存储类别静态存储类别: static自动存储类别: auto寄存器存储类别:register外部存储类别说明: extern 存储类别auto: 自

47、动存储类别 说明此变量要存储在内存的动态存储区由系统根据函数情况,自动完成内存的分配和回收如: int sub() auto int y=0; /auto可以缺省 y+; return (y); main() int i; for (i=0; i2; i+) printf(“%3d”, sub();运行结果: 1 1存储类别register:寄存器存储类别说明此变量要存储在寄存器中,不在内存中比存储在内存中,读取速度快一些C语言系统,把register当做auto类别处理如: main() register int i; for (i=0; j1000; i+) printf(“%5d”,i)

48、; 存储类别static:静态存储类别说明变量要存储在内存的静态存储区在编译时创建,在整个源文件结束时,才收回空间如: int sub() static int y=0; y+; return (y); main() int i; for (i=0; i2; i+) printf(“%3d”, sub(); 运行结果: 1 2extern标识符作用echo() int i; for (i=0; i5; i+) printf(“%d”, a+); main() int a=1; echo(); echo() int i; for (i=0; i5; i+) printf(“%d”, a+); i

49、nt a=1; main() echo(); echo() extern int a; int i; for (i=0; i5; i+) printf(“%d”, a+); int a=1; main() echo(); 外部存储类别说明: extern extern标识符说明要使用的变量是外部定义的全局变量在内存中不创建新的变量extern int a;echo() for (int i=0; i5; i+) printf(“%d”, a+); echo2() printf(“%d”, a); int a=1; main() echo(); 注意若有多个源文件呢?文件f2.cf2() ext

50、ern int a; printf(“ %d in f2()n”, a); 文件f1.c:echo() extern int a; int i; for (i=0; i5; i+) printf(“%4d”, a+); int a=1;main() echo(); f2(); f3(); 文件f3.cint a=20;f3() printf(“ %d in f3()n”, a); 注意文件f2.cf2() extern int a; printf(“ %d in f2()n”, a); 文件f1.c:echo() extern int a; int i; for (i=0; i5; i+) p

51、rintf(“%4d”, a+); static int a=1;main() echo(); f2(); f3(); 文件f3.cint a=20;f3() printf(“ %d in f3()n”, a); 如果全局变量用static修饰,是说只对本文件内有效。变量作用域变量的作用域指变量起作用的范围在C语言中,如果按作用域的不同,变量分为:局部变量全局变量内部函数和外部函数例子:文件f2.cf2() extern int a; printf(“%d in f2()n”, a); 文件f1.c:echo() extern int a; int i; for (i=0; i5; i+) p

52、rintf(“%d”, a+); static int a=1; main() echo(); f2(); f3(); 文件f3.cint a=20;f3() printf(“%d in f3()n”, a); 若要求f3()只能在本文件内使用内部函数文件f2.cf2() extern int a; printf(“%d in f2()n”, a); 文件f1.c:echo() extern int a; int i; for (i=0; i5; i+) printf(“%d”, a+); static int a=1; main() echo(); f2();f3(); 文件f3.cint

53、a=20;static void f3() printf(“%d in f3()n”, a); f3()只能在本文件内使用外部函数文件f2.cf2() extern int a; printf(“%d in f2()n”, a); 文件f1.c:echo() extern int a; int i; for (i=0; i5; i+) printf(“%d”, a+); static int a=1; main() echo(); f2();f3(); 文件f3.cint a=20;static void f3() printf(“%d in f3()n”, a); f2()在其他文件中也能使

54、用f3()只能在本文件内使用外部函数文件f2.cextern void f2() extern int a; printf(“%d in f2()n”, a); 文件f1.c:extern void f2();extern void f3();echo() extern int a; int i; for (i=0; i5; i+) printf(“%d”, a+); int a=1; main() echo(); f2(); f3(); 文件f3.cint a=20;void f3() printf(“%d in f3()n”, a); f2()在其他文件中也能使用,可省略extern在文件中对要调用的函数进行说明,可省略extern例子问题:有个短信服务器,提供短信发送、接收、存储等服务用户可通过接收服务和发送服务访问它其他的服务是不对外的请实现一个服务器原型,包含接收、发送和存储功能存储服务接收服务发送服务编辑服务例子问题分析短信服务器端程序对外的接口服务发送服务接收服务内部的处理服务存储服务其他服务用户端程序用户可通过以下它提供的接口服务访问它:通过发送服务,向短信服务器发信息通过接收服务,从短信服务器中取信息例子算法设计短信服务器端程序对外的

温馨提示

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

评论

0/150

提交评论