1、第七章 函数及变量存贮类型 第七章 函数及变量存贮类型 7.1 函数基础与函数基础与C程序结构程序结构7.2 函数定义和申明函数定义和申明7.3 函数调用函数调用7.4 函数嵌套与递归函数嵌套与递归7.5 变量存贮类别变量存贮类别 第1页第七章 函数及变量存贮类型 7.1 函数基础与函数基础与C程序结构程序结构 7.1.1 C程序结构化设计思想程序结构化设计思想 图 7.1 C程序结构示意图 第2页第七章 函数及变量存贮类型 7.1.2 函数概述函数概述 在C程序设计中,函数是独立C程序模块,它完成一个特定任务并可选择是否将一个值返回调用程序。在C语言中,子程序被称为函数,它对应于其它高级语言
2、中过程(无返回值子程序)和函数(经过函数名返回一个值子程序)。一个C程序普通由多个函数组成,其中必须有一个且仅有一个名为main主函数,其余为被main函数或其它函数调用函数,不论main函数位于程序中什么位置,C程序总是从main函数开始执行。第3页第七章 函数及变量存贮类型 main函数可调用其它函数来实现所需功效。被main函数调用函数分为两类:一类是由系统提供标准库函数,比如,标准输入输出函数(scanf,printf,getche,putchar,)、数学计算函数(sin,cos,fabs,sqrt,)、数据格式转换函数(atoi,atof,sscanf,sprintf,)、字符串处
3、理函数(strlen,strcpy,strcmp,)和文件读写函数(fread,fwrite,fopen,)等。这类函数能够由用户程序直接调用;另一类是用户在自己程序中定义函数,即需要由用户自己编写函数。第4页第七章 函数及变量存贮类型 例例 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 nu
4、mber of%ld is%ld,in-num,result);第5页第七章 函数及变量存贮类型 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 (输出)第6页第七章 函数及变量存贮类型 7.2 函数定义和申明函数定义和申明 7.2.1 函数定义函数定义例例 7.2 计算xn次方,x=2,-3;(n=1,2,9)。include int main(v
5、oid)*测试power函数 *int i;double power(int,int);/*函数申明 */for(i=1;i10;i+)printf(power(2,%d)=%8.4f,power(-3,%d)=%11.4fn,第7页第七章 函数及变量存贮类型 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(%
6、f%f,&a,&b);c=max(a,b);printf(max=%5.2fn,c);运行情况以下:2.5 5.6max=5.00 第24页第七章 函数及变量存贮类型 7.4 函数嵌套与递归函数嵌套与递归 7.4.1 函数嵌套调用函数嵌套调用 例例 7.6 输入三个数,计算以它们作为两个底半径和高所形成圆台体积。分析分析:已知圆台上下底半径,可用下式计算圆台体积 第25页第七章 函数及变量存贮类型 程序以下:include include define PI 3.1416 float area(float r)return(PI*r*r);float volume(float r1,float
7、 r2,float h)float v;v=h*(area(r1)+area(r2)+sqrt(area(r1)*area(r2)/3.0;return(v);第26页第七章 函数及变量存贮类型 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 第27页第七章 函数及变量存贮类型 7.4.2 函
8、数递归及条件函数递归及条件 递归是一个特殊处理问题方法,要用递归处理问题,应满足两个条件:(1)函数直接或间接地调用它本身;(2)应有使递归结束条件。第28页第七章 函数及变量存贮类型 例例 7.7 用函数递归方法以字符串形式输出一个整数。include void 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);第29页第七章
9、 函数及变量存贮类型 7.5 变量存贮类别变量存贮类别 7.5.1 变量作用域和生存期变量作用域和生存期 例例 7.8 变量作用域。include int x999;/*定义全局变量x */void print-value(void);void main()printf(%dn,x);print-value();void print-value(void)printf(%dn,x);输出:999 999 第30页第七章 函数及变量存贮类型 例例 7.9 变量作用域。include void print-value(void);void main()int x=999;/*定义局部变量x */p
10、rintf(%dn,x);print-value();void print-value(void)printf(%dn,x);第31页第七章 函数及变量存贮类型 7.5.2 动态存贮和静态存贮动态存贮和静态存贮 内存中供用户使用存贮空间可分为程序区、动态存贮区和静态存贮区。程序区用来存放程序代码,动态存贮区和静态存贮区用来存放数据,即数据与处理数据程序是分离,这是面向过程程序设计方法特点。动态存贮和静态存贮是指C对数据存贮两种方式。动态存贮是指存贮一些数据存贮单元可在程序运行不一样时间分配给不一样数据,而静态存贮是指存贮单元在程序运行整个过程中固定地分配给一些数据。第32页第七章 函数及变量存
11、贮类型 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 */printf(%d,max(a,b);运行结果:8 第33页第七章 函数及变量存贮类型 7.5.4 局部静态变量使用局部静态变量使用 例例 7.11 静态局部变量使用。void f()int a,b=3;static int c,d=
12、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 第34页第七章 函数及变量存贮类型 例例 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);第35页第七章 函数及变量存贮类型 运行结果:1!=1 2!=2 3!=6 4!=24 5!=120 第36页第七章 函数及变量存贮类型 7.5.5 全局变量全局变量 全局变
13、量(也称外部变量)是在全部函数、包含main函数之外定义。全局变量是存放在静态存贮区中,它作用域是从全局变量定义之后直到该源文件结束全部函数;经过用extern作引用说明,全局变量作用域能够扩大到整个程序全部文件。在定义全局变量时能够使用static存贮类型标识符,它与普通全局变量区分在于变量作用域。普通全局变量不但对文件中全部函数都是可见,而且能被其它文件中函数所用;而static型全局变量仅对其所在文件中定义处之后函数是可见,不能被其它文件使用。这种差异适合于程序源代码包含在两个或多个文件中情况。第37页第七章 函数及变量存贮类型 全局变量初始化是在全局变量定义时进行,且其初始化仅执行一次
14、,若无显式初始化,则由系统自动初始化为与变量类型相同0初值:整型变量初始化为整数0 浮点型变量初始化为浮点数0.0 字符型变量初始化为空字符0在有显式初始化情况下,初值必须是常量表示式。全局变量存放在静态存贮区中,全局变量在程序执行之前分配存贮单元,在程序运行结束后才被收回。第38页第七章 函数及变量存贮类型 例例7.13 输入以秒为单位一个时间值,将其转化成“时:分:秒”形式输出。将转换工作定义成函数。include int hh,mm,ss;void convertime(long seconds)hh=seconds/3600;mm=(seconds-hh*3600L)/60;ss=se
15、conds-hh*3600L-mm*60;void main(void)long seconds;第39页第七章 函数及变量存贮类型 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 (输出)第40页第七章 函数及变量存贮类型 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;第41页第七章 函数及变量存贮类型 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 第42页