1、第七章 函数及变量存贮类型 7.1 函数基础与函数基础与C程序结构程序结构7.2 函数的定义和声明函数的定义和声明7.3 函数的调用函数的调用7.4 函数的嵌套与递归函数的嵌套与递归7.5 变量的存贮类别变量的存贮类别 7.1 函数基础与函数基础与C程序结构程序结构 7.1.1 C程序的结构化设计思想程序的结构化设计思想 图 7.1 C程序结构示意图 C程序源程序2源程序1main()数据定义源程序n自定义函数说明部分执行部分7.1.2 函数概述函数概述 在C程序设计中,函数是独立的C程序模块,它完成一个特定任务并可选择是否将一个值返回调用程序。在C语言中,子程序被称为函数,它相应于其它高级语
2、言中的过程(无返回值的子程序)和函数(通过函数名返回一个值的子程序)。一个C程序一般由多个函数组成,其中必须有一个且仅有一个名为main的主函数,其余为被main函数或其它函数调用的函数,无论main函数位于程序中什么位置,C程序总是从main函数开始执行。main函数可调用其它函数来实现所需的功能。被main函数调用的函数分为两类:一类是由系统提供的标准库函数,例如,标准输入输出函数(scanf,printf,getche,putchar,)、数学计算函数(sin,cos,fabs,sqrt,)、数据格式转换函数(atoi,atof,sscanf,sprintf,)、字符串处理函数(strl
3、en,strcpy,strcmp,)和文件读写函数(fread,fwrite,fopen,)等。这类函数可以由用户程序直接调用;另一类是用户在自己的程序中定义的函数,即需要由用户自己编写的函数。例例 7.1 用户自定义函数求数的平方。include long square(long);/*函数声明 */void main()long in-num,result;printf(Input an integer:);scanf(%ld,&in-num);result=square(in-num);/*函数调用 */printf(nThe square number of%ld is%ld,in-n
4、um,result);long square(long x)/*函数定义 */long x-square;/*说明部分 */x-square=x*x;/*执行部分 */return x-square;Input an integer:100 (输入)The square number of 100 is 10000 (输出)7.2 函数的定义和声明函数的定义和声明 7.2.1 函数的定义函数的定义例例 7.2 计算x的n次方,x=2,-3;(n=1,2,9)。include int main(void)*测试power函数 *int i;double power(int,int);/*函数声明
5、 */for(i=1;i10;i+)printf(power(2,%d)=%8.4f,power(-3,%d)=%11.4fn,i,power(2,i),i,power(-3,i);return 0;double power(int x,int n)/*函数首部 */int i;/*说明部分 */double p;p=1;/*执行部分 */for(i=1;i=y)return(x);else return(y);main()float a,b,c;scanf(%f%f,&a,&b);c=max(a,b);printf(max=%5.2fn,c);运行情况如下:2.5 5.6max=5.00 7
6、.4 函数的嵌套与递归函数的嵌套与递归 7.4.1 函数的嵌套调用函数的嵌套调用 例例 7.6 输入三个数,计算以它们作为两个底的半径和高所形成的圆台的体积。分析分析:已知圆台的上下底的半径,可用下式计算圆台的体积)(312211SSSShV程序如下:include include define PI 3.1416 float area(float r)return(PI*r*r);float volume(float r1,float r2,float h)float v;v=h*(area(r1)+area(r2)+sqrt(area(r1)*area(r2)/3.0;return(v);
7、main()float r1,r2,h;printf(Please input r1 r2 h:n);scanf(%f%f%f,&r1,&r2,&h);printf(The volume is%fn,volume(r1,r2,h);运行结果Please input r1 r2 h:2.5 6.8 3.3The volume is 240.140762 7.4.2 函数的递归及条件函数的递归及条件 递归是一种特殊的解决问题的方法,要用递归解决问题,应满足两个条件:(1)函数直接或间接地调用它本身;(2)应有使递归结束的条件。例例 7.7 用函数递归方法以字符串形式输出一个整数。include v
8、oid printd(int n)if(n0)putchar(-);n=-n;if(n/10)/*n/10=0时,递归结束*/printd(n/10);/*递归调用*/putchar(n%10+0);/*以字符输出*/void main()int number;scanf(%d,&number);printd(number);7.5 变量的存贮类别变量的存贮类别 7.5.1 变量的作用域和生存期变量的作用域和生存期 例例 7.8 变量的作用域。include int x999;/*定义全局变量x */void print-value(void);void main()printf(%dn,x)
9、;print-value();void print-value(void)printf(%dn,x);输出:999 999 例例 7.9 变量的作用域。include void print-value(void);void main()int x=999;/*定义局部变量x */printf(%dn,x);print-value();void print-value(void)printf(%dn,x);7.5.2 动态存贮和静态存贮动态存贮和静态存贮 内存中供用户使用的存贮空间可分为程序区、动态存贮区和静态存贮区。程序区用来存放程序代码,动态存贮区和静态存贮区用来存放数据,即数据与处理数据的
10、程序是分离的,这是面向过程的程序设计方法的特点。动态存贮和静态存贮是指C对数据存贮的两种方式。动态存贮是指存贮一些数据的存贮单元可在程序运行的不同时间分配给不同的数据,而静态存贮是指存贮单元在程序运行的整个过程中固定地分配给某些数据。7.5.3 局部变量局部变量 局部变量又称内部变量,是在一个函数内定义,其作用域限制在所定义的函数中。例例 7.10 局部变量与全局变量同名。int a=1,b=2;/*定义全局变量a、b */max(int a,int b)/*子函数中的局部变量a、b */int c;c=ab?a:b;return(c);main()int a=8;/*定义局部变量a */pr
11、intf(%d,max(a,b);运行结果:8 7.5.4 局部静态变量的使用局部静态变量的使用 例例 7.11 静态局部变量的使用。void f()int a,b=3;static int c,d=5;a=3;c=5;a+;b+;c+;d+;printf(%d t%d t%d t%dn,a,b,c,d);main()f();f();运行结果:4 4 6 64 4 6 7 例例 7.12 打印1到5的阶乘。fac(int n)static int f=1;f*=n;return(f);main()int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);运行结果
12、:1!=1 2!=2 3!=6 4!=24 5!=120 7.5.5 全局变量全局变量 全局变量(也称外部变量)是在所有函数、包括main函数之外定义的。全局变量是存放在静态存贮区中的,它的作用域是从全局变量定义之后直到该源文件结束的所有函数;通过用extern作引用说明,全局变量的作用域可以扩大到整个程序的所有文件。在定义全局变量时可以使用static存贮类型标识符,它与普通全局变量的区别在于变量的作用域。普通全局变量不仅对文件中的所有函数都是可见的,而且能被其它文件中的函数所用;而static型的全局变量仅对其所在文件中定义处之后的函数是可见的,不能被其它文件使用。这种差别适合于程序源代码
13、包含在两个或多个文件中的情况。全局变量初始化是在全局变量定义时进行的,且其初始化仅执行一次,若无显式初始化,则由系统自动初始化为与变量类型相同的0初值:整型变量初始化为整数0 浮点型变量初始化为浮点数0.0 字符型变量初始化为空字符0在有显式初始化的情况下,初值必须是常量表达式。全局变量存放在静态存贮区中,全局变量在程序执行之前分配存贮单元,在程序运行结束后才被收回。例例7.13 输入以秒为单位的一个时间值,将其转化成“时:分:秒”的形式输出。将转换工作定义成函数。include int hh,mm,ss;void convertime(long seconds)hh=seconds/3600
14、;mm=(seconds-hh*3600L)/60;ss=seconds-hh*3600L-mm*60;void main(void)long seconds;printf(hh=%d,mm=%d,ss=%dn,hh,mm,ss);printf(input a time in second:);scanf(%ld,&seconds);convertime(seconds);printf(%2d:%2d:%2dn,hh,mm,ss);执行时输出:hh0,mm0,ss0 input a time in second:41574 (输入)11:32:54 (输出)7.5.6 寄存器变量寄存器变量 例例 7.14 计算 s=x1x2x3xn,x和n由终端输入。include long sum(register int x,int n)long s;int i;register int t;t=s=x;for(i=2;in;i+)t*=x;s+=t;return(s);main()int x,n;printf(Input x,n:);scanf(%d%d,&x,&n);printf(s=%ldn,sum(x,n);执行时输出:Input x,n:4 5 S=1364