![教学第7章-函数及变量存储类型课件_第1页](http://file4.renrendoc.com/view/89f76ce31880fc0c497f713d548ee3d7/89f76ce31880fc0c497f713d548ee3d71.gif)
![教学第7章-函数及变量存储类型课件_第2页](http://file4.renrendoc.com/view/89f76ce31880fc0c497f713d548ee3d7/89f76ce31880fc0c497f713d548ee3d72.gif)
![教学第7章-函数及变量存储类型课件_第3页](http://file4.renrendoc.com/view/89f76ce31880fc0c497f713d548ee3d7/89f76ce31880fc0c497f713d548ee3d73.gif)
![教学第7章-函数及变量存储类型课件_第4页](http://file4.renrendoc.com/view/89f76ce31880fc0c497f713d548ee3d7/89f76ce31880fc0c497f713d548ee3d74.gif)
![教学第7章-函数及变量存储类型课件_第5页](http://file4.renrendoc.com/view/89f76ce31880fc0c497f713d548ee3d7/89f76ce31880fc0c497f713d548ee3d75.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章函数及变量存贮类型7.1函数基础与C程序结构7.2函数的定义和声明7.3函数的调用7.4函数的嵌套与递归7.5变量的存贮类别第七章函数及变量存贮类型7.1函数基础与C程序结构17.1函数基础与C程序结构7.1.1C程序的结构化设计思想图7.1C程序结构示意图7.1函数基础与C程序结构7.1.1C程序的结构化设27.1.2函数概述在C程序设计中,函数是独立的C程序模块,它完成一个特定任务并可选择是否将一个值返回调用程序。在C语言中,子程序被称为函数,它相应于其它高级语言中的过程(无返回值的子程序)和函数(通过函数名返回一个值的子程序)。一个C程序一般由多个函数组成,其中必须有一个且仅有一个名为main的主函数,其余为被main函数或其它函数调用的函数,无论main函数位于程序中什么位置,C程序总是从main函数开始执行。7.1.2函数概述在C程序设计中,函数是独3main函数可调用其它函数来实现所需的功能。被main函数调用的函数分为两类:一类是由系统提供的标准库函数,例如,标准输入输出函数(scanf,printf,getche,putchar,…)、数学计算函数(sin,cos,fabs,sqrt,…)、数据格式转换函数(atoi,atof,sscanf,sprintf,…)、字符串处理函数(strlen,strcpy,strcmp,…)和文件读写函数(fread,fwrite,fopen,…)等。这类函数可以由用户程序直接调用;另一类是用户在自己的程序中定义的函数,即需要由用户自己编写的函数。main函数可调用其它函数来实现所需的功能。4例7.1用户自定义函数——求数的平方。#include<stdio.h>longsquare(long);/*函数声明*/voidmain(){longin-num,result;printf("Inputaninteger:");scanf("%ld",&in-num);result=square(in-num);/*函数调用*/printf("\nThesquarenumberof%ldis%ld",in-num,result);}例7.1用户自定义函数——求数的平方。#includ5longsquare(longx)/*函数定义*/{longx-square;/*说明部分*/x-square=x*x;/*执行部分*/returnx-square;}Inputaninteger:100(输入)Thesquarenumberof100is10000(输出)longsquare(longx)67.2函数的定义和声明7.2.1函数的定义例7.2计算x的n次方,x=2,-3;(n=1,2,…9)。#include<stdio.h>intmain(void)/*测试power函数*/{inti;doublepower(int,int);/*函数声明*/for(i=1;i<10;i++)printf("power(2,%d)=%8.4f,power(-3,%d)=%11.4f\n",7.2函数的定义和声明7.2.1函数的定义例7.27 i,power(2,i),i,power(-3,i));return0;}doublepower(intx,intn)/*函数首部*/{inti;/*说明部分*/doublep;p=1;/*执行部分*/for(i=1;i<=n;i++)p*=x;return(p);/*返回p值*/} i,power(2,i),i,power(-3,8输出:power(2,1)=2.0000,power(-3,1)=-3.0000power(2,2)=4.0000,power(-3,2)=9.0000power(2,3)=8.0000,power(-3,3)=-27.0000power(2,4)=16.0000,power(-3,4)=81.0000power(2,5)=32.0000,power(-3,5)=-243.0000power(2,6)=64.0000,power(-3,6)=729.0000power(2,7)=128.0000,power(-3,7)=-2187.0000power(2,8)=256.0000,power(-3,8)=6561.0000power(2,9)=512.0000,power(-3,9)=-19683.0000输出:9函数名power是一个标识符,power函数具有double类型的返回值,它有两个int类型的参数x和n。{}括起来的部分是函数体,其中的说明部分“inti;doublep;”说明i、p是在power函数内部使用的局部变量。执行部分的“return(p);”语句将表达式p的值返回给main函数的调用处,p的值就是power函数的返回值(简称函数值)。函数定义的一般形式为:存贮类型标识符类型标识符函数名(形式参数表列及类型说明){说明部分语句部分}函数名power是一个标识符,power函数101)存贮类型标识符存贮类型标识符说明函数的存贮类型,它规定了函数可被调用的范围。可用于函数的存贮类型标识符有static和extern,指定为static的函数为静态函数,静态函数局部于它所在的文件,即只能由和它在同一文件中定义的函数调用;不指定存贮类型标识符时为缺省的存贮类型extern,缺省或指定为extern存贮类型的函数是外部函数,例如,例7.2中的power函数是外部函数。外部函数可以被任何函数调用。1)存贮类型标识符112)类型标识符C程序中定义的函数可以什么也不返回而只完成某项工作。无返回值的函数,类型标识符为void,又称为“空类型函数”,即此函数不向主调函数返回值,主调函数也禁止使用此函数的返回值。C程序中定义的函数也可以返回一个值,这时,类型标识符说明函数返回值的数据类型(常简称为“函数值的类型”或“函数的类型”),例如,例7.2中的power函数是一个double类型函数,main是int类型函数。函数的类型可以为任何基本类型、结构体和共用体类型。还可以定义返回值为指针的函数,但不能定义返回数组的函数。int型函数定义时可以省略类型标识符int,因为int是有返回值函数的缺省类型(提倡明确指出int)。2)类型标识符123)函数名函数名是一个标识符,一个程序中除主函数main外,其余函数的名字可以任意取,最好取有助于记忆的名字。考虑到与外部联接的需要,函数名一般不要超过6个字符长,如max(),power()和factor()等。外部函数的名字是作用于整个程序,因而外部函数相互之间不能同名。静态函数可以和外部函数同名,但同一文件中的函数不能同名。3)函数名134)参数表函数定义中的参数表说明函数参数的名称、类型和数目。参数表由零个或多个参数说明组成,如果函数没有参数,可只写一对括号(此为函数标志,不可省略),但最好将参数表指定为void。有多个参数时,多个参数之间用逗号隔开。函数定义中的参数表习惯上称为形参表。形参说明的一般形式为类型标识符形参名每个类型标识符对应于一个形参名,当有多个形参时,相互间用逗号隔开。4)参数表145)函数体和函数返回值函数定义中最外层{}括起来的部分称为函数体,函数体由说明部分和执行部分组成。说明部分是局部说明,执行部分是可执行语句的序列,完成本函数要完成的具体任务。局部说明中说明的变量和函数其有效范围局限于该函数内部,同形参一样,不能由其它任何函数存取(或调用)。函数体语法上是一个复合语句,它可以没有说明部分而只有执行部分,也可以两者都没有。因此最简单的合法函数是形参表为空(void)且函数体也为空的函数(称为哑函数),例如:voiddummy(void){}5)函数体和函数返回值157.2.2函数的声明函数声明的一般形式:存贮类型标识符类型标识符函数名(形参表);外部函数声明时可指定extern或存贮类型标识符缺省,静态函数声明时必须指定static;参数表可以只列出参数的类型名而不需给出参数名。例如:doublepower(int,int);和doublepower(intx,intn);是等价的。power函数是double类型,它有两个int参数。对于无参数表的函数,声明时参数表应指定为void。7.2.2函数的声明函数声明的一般形式167.3函数的调用7.3.1函数调用的方式和条件函数调用的一般形式为:函数名(实参1,实参2,…,实参n)()部分称为实参表,实参可以是常量、变量或表达式,有多个实参时,相互间用逗号隔开。实参和形参应在数目、次序和类型上一致。对于无参数的函数,调用时实参表为空,但()不能省。7.3函数的调用7.3.1函数调用的方式和条17(1)getch();getch函数调用作为语句出现。(2)c=getchar();getchar函数调用作表达式出现(赋值表达式的右操作数)。(3)while(putchar(getche())!=′?′);getche函数调用作为putchar函数调用的实参(表达式)出现,putchar函数调用作为关系表达式的左操作数(表达式)出现。(4)while((c=getch())!=′?′)putchar(c);putchar函数调用作为while语句的循环体(语句)出现。(1)getch();getch函数调用作18函数调用的一般过程为:(1)主调函数在执行过程中,一旦遇到函数调用,系统首先计算实参表达式的值并为每个形参分配存贮单元,然后把实参值复制到(送到或存入)对应形参的存贮单元中。实参与形参按位置一一对应。(2)将控制转移到被调用的函数,执行其函数体内的语句。(3)当执行return语句或到达函数体末尾时,控制返回到调用处,如果有返回值,同时回送一个值。然后从函数调用点继续执行主调函数后面的操作。函数调用的一般过程为:19除了正确地编写函数的定义及调用语句,要想成功地调用某个函数还必须满足下列四个条件之一:(1)被调用函数的定义出现在主调函数的定义之前。(2)在主调函数中或主调函数之前的外部对被调用函数进行声明。(3)被调用函数的返回值为int型。(4)被调用函数为标准函数时,在函数调用前已包含了相应的头文件。除了正确地编写函数的定义及调用语句,要想成207.3.2形参与实参的数值传递例7.3形参与实参的数值传递。voidswap(intx,inty){intz;z=x;x=y;y=z;}main(){inta,b;a=10;b=20;swap(a,b);printf("a=%d\tb=%d\n",a,b);}运行结果:a=10b=20
7.3.2形参与实参的数值传递例7.3形参与实参的21图7.2图7.222例7.4参数的求值顺序。voidmain(void){intx=0;printf("x=%d\n",x);printf("x++=%dx++=%d\n",x++,x++);printf("x=%d\n",x);}执行时输出:x=0x++=1x++=0x=2例7.4参数的求值顺序。voidmain(void237.3.3函数的返回值例7.5函数的返回值。max(floatx,floaty){if(x>=y)return(x);elsereturn(y);}main(){floata,b,c;scanf("%f%f",&a,&b);c=max(a,b);printf("max=%5.2f\n",c);}运行情况如下:2.55.6max=5.007.3.3函数的返回值例7.5函数的返回值。m247.4函数的嵌套与递归7.4.1函数的嵌套调用例7.6输入三个数,计算以它们作为两个底的半径和高所形成的圆台的体积。分析:已知圆台的上下底的半径,可用下式计算圆台的体积7.4函数的嵌套与递归7.4.1函数的嵌套调用25程序如下:#include<stdio.h>#include<math.h>#definePI3.1416floatarea(floatr){return(PI*r*r);}floatvolume(floatr1,floatr2,floath){floatv;v=h*(area(r1)+area(r2)+sqrt(area(r1)*area(r2)))/3.0;return(v);}程序如下:#include<stdio.h>26main(){floatr1,r2,h;printf("Pleaseinputr1r2h:\n");scanf("%f%f%f",&r1,&r2,&h);printf("Thevolumeis%f\n",volume(r1,r2,h));}运行结果Pleaseinputr1r2h:2.56.83.3Thevolumeis240.140762main()277.4.2函数的递归及条件递归是一种特殊的解决问题的方法,要用递归解决问题,应满足两个条件:(1)函数直接或间接地调用它本身;(2)应有使递归结束的条件。7.4.2函数的递归及条件递归是一种特殊的28例7.7用函数递归方法以字符串形式输出一个整数。#include<stdio.h>voidprintd(intn){if(n<0){putchar(′-′);n=-n;}if(n/10)/*n/10==0时,递归结束*/printd(n/10);/*递归调用*/putchar(n%10+′0′);/*以字符输出*/}voidmain(){intnumber;scanf("%d",&number);printd(number);}例7.7用函数递归方法以字符串形式输出一个整数。#i297.5变量的存贮类别7.5.1变量的作用域和生存期例7.8变量的作用域。
#include<stdio.h>intx=999;/*定义全局变量x*/voidprint-value(void);voidmain(){printf("%d\n",x);print-value();}voidprint-value(void){printf("%d\n",x);}输出:9999997.5变量的存贮类别7.5.1变量的作用域和生存期30例7.9变量的作用域。#include<stdio.h>voidprint-value(void);voidmain(){intx=999;/*定义局部变量x*/printf("%d\n",x);print-value();}voidprint-value(void){printf("%d\n",x);}例7.9变量的作用域。#include<stdi317.5.2动态存贮和静态存贮内存中供用户使用的存贮空间可分为程序区、动态存贮区和静态存贮区。程序区用来存放程序代码,动态存贮区和静态存贮区用来存放数据,即数据与处理数据的程序是分离的,这是面向过程的程序设计方法的特点。动态存贮和静态存贮是指C对数据存贮的两种方式。动态存贮是指存贮一些数据的存贮单元可在程序运行的不同时间分配给不同的数据,而静态存贮是指存贮单元在程序运行的整个过程中固定地分配给某些数据。7.5.2动态存贮和静态存贮内存中供用户327.5.3局部变量局部变量又称内部变量,是在一个函数内定义,其作用域限制在所定义的函数中。例7.10局部变量与全局变量同名。inta=1,b=2;/*定义全局变量a、b*/max(inta,intb)/*子函数中的局部变量a、b*/{intc;c=a>b?a:b;return(c);}main(){inta=8;/*定义局部变量a*/printf("%d",max(a,b));}运行结果:87.5.3局部变量局部变量又称内部变量,是337.5.4局部静态变量的使用例7.11静态局部变量的使用。voidf(){inta,b=3;staticintc,d=5;a=3;c=5;a++;b++;c++;d++;printf("%d\t%d\t%d\t%d\n",a,b,c,d);}main(){f();f();}运行结果:446644677.5.4局部静态变量的使用例7.11静态局部变量34例7.12打印1到5的阶乘。fac(intn){staticintf=1;f*=n;return(f);}main(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));}例7.12打印1到5的阶乘。fac(intn)35运行结果:1!=12!=23!=64!=245!=120运行结果:367.5.5全局变量全局变量(也称外部变量)是在所有函数、包括main函数之外定义的。全局变量是存放在静态存贮区中的,它的作用域是从全局变量定义之后直到该源文件结束的所有函数;通过用extern作引用说明,全局变量的作用域可以扩大到整个程序的所有文件。在定义全局变量时可以使用static存贮类型标识符,它与普通全局变量的区别在于变量的作用域。普通全局变量不仅对文件中的所有函数都是可见的,而且能被其它文件中的函数所用;而static型的全局变量仅对其所在文件中定义处之后的函数是可见的,不能被其它文件使用。这种差别适合于程序源代码包含在两个或多个文件中的情况。7.5.5全局变量全局变量(也称外部变量37全局变量初始化是在全局变量定义时进行的,且其初始化仅执行一次,若无显式初始化,则由系统自动初始化为与变量类型相同的0初值:整型变量初始化为整数0浮点型变量初始化为浮点数0.0字符型变量初始化为空字符′\0′在有显式初始化的情况下,初值必须是常量表达式。全局变量存放在静态存贮区中,全局变量在程序执行之前分配存贮单元,在程序运行结束后才被收回。全局变量初始化是在全局变量定义时进行的,且其初38例7.13输入以秒为单位的一个时间值,将其转化成“时:分:秒”的形式输出。将转换工作定义成函数。#include<stdio.h>inthh,mm,ss;voidconvertime(longseconds){hh=seconds/3600;mm=(seconds-hh*3600L)/60;ss=seconds-hh*3600L-mm*60;}voidmain(void){longseconds;例7.13输入以秒为单位的一个时间值,39printf("hh=%d,mm=%d,ss=%d\n",hh,mm,ss);printf("inputatimeinsecond:");scanf("%ld",&seconds);convertime(seconds);printf("%2d:%2d:%2d\n",hh,mm,ss);}执行时输出:hh=0,mm=0,ss=0inputatimeinsecond:41574(输入)11:32:54(输出)
printf("hh=%d,mm=%407.5.6寄存器变量例7.14计算s=x1+x2+x3+…+xn,x和n由终端输入。#include<stdio.h>longsum(registerintx,intn){longs;inti;registerintt;t=s=x;for(i=2;i<=n;i++){t*=x;s+=t;}7.5.6寄存器变量例7.14计算s=x1+x41return(s);}main(){intx,n;printf("Inputx,n:");scanf("%d%d",&x,&n);printf("s=%ld\n",sum(x,n));}
执行时输出:Inputx,n:45S=1364return(s);42第七章函数及变量存贮类型7.1函数基础与C程序结构7.2函数的定义和声明7.3函数的调用7.4函数的嵌套与递归7.5变量的存贮类别第七章函数及变量存贮类型7.1函数基础与C程序结构437.1函数基础与C程序结构7.1.1C程序的结构化设计思想图7.1C程序结构示意图7.1函数基础与C程序结构7.1.1C程序的结构化设447.1.2函数概述在C程序设计中,函数是独立的C程序模块,它完成一个特定任务并可选择是否将一个值返回调用程序。在C语言中,子程序被称为函数,它相应于其它高级语言中的过程(无返回值的子程序)和函数(通过函数名返回一个值的子程序)。一个C程序一般由多个函数组成,其中必须有一个且仅有一个名为main的主函数,其余为被main函数或其它函数调用的函数,无论main函数位于程序中什么位置,C程序总是从main函数开始执行。7.1.2函数概述在C程序设计中,函数是独45main函数可调用其它函数来实现所需的功能。被main函数调用的函数分为两类:一类是由系统提供的标准库函数,例如,标准输入输出函数(scanf,printf,getche,putchar,…)、数学计算函数(sin,cos,fabs,sqrt,…)、数据格式转换函数(atoi,atof,sscanf,sprintf,…)、字符串处理函数(strlen,strcpy,strcmp,…)和文件读写函数(fread,fwrite,fopen,…)等。这类函数可以由用户程序直接调用;另一类是用户在自己的程序中定义的函数,即需要由用户自己编写的函数。main函数可调用其它函数来实现所需的功能。46例7.1用户自定义函数——求数的平方。#include<stdio.h>longsquare(long);/*函数声明*/voidmain(){longin-num,result;printf("Inputaninteger:");scanf("%ld",&in-num);result=square(in-num);/*函数调用*/printf("\nThesquarenumberof%ldis%ld",in-num,result);}例7.1用户自定义函数——求数的平方。#includ47longsquare(longx)/*函数定义*/{longx-square;/*说明部分*/x-square=x*x;/*执行部分*/returnx-square;}Inputaninteger:100(输入)Thesquarenumberof100is10000(输出)longsquare(longx)487.2函数的定义和声明7.2.1函数的定义例7.2计算x的n次方,x=2,-3;(n=1,2,…9)。#include<stdio.h>intmain(void)/*测试power函数*/{inti;doublepower(int,int);/*函数声明*/for(i=1;i<10;i++)printf("power(2,%d)=%8.4f,power(-3,%d)=%11.4f\n",7.2函数的定义和声明7.2.1函数的定义例7.249 i,power(2,i),i,power(-3,i));return0;}doublepower(intx,intn)/*函数首部*/{inti;/*说明部分*/doublep;p=1;/*执行部分*/for(i=1;i<=n;i++)p*=x;return(p);/*返回p值*/} i,power(2,i),i,power(-3,50输出:power(2,1)=2.0000,power(-3,1)=-3.0000power(2,2)=4.0000,power(-3,2)=9.0000power(2,3)=8.0000,power(-3,3)=-27.0000power(2,4)=16.0000,power(-3,4)=81.0000power(2,5)=32.0000,power(-3,5)=-243.0000power(2,6)=64.0000,power(-3,6)=729.0000power(2,7)=128.0000,power(-3,7)=-2187.0000power(2,8)=256.0000,power(-3,8)=6561.0000power(2,9)=512.0000,power(-3,9)=-19683.0000输出:51函数名power是一个标识符,power函数具有double类型的返回值,它有两个int类型的参数x和n。{}括起来的部分是函数体,其中的说明部分“inti;doublep;”说明i、p是在power函数内部使用的局部变量。执行部分的“return(p);”语句将表达式p的值返回给main函数的调用处,p的值就是power函数的返回值(简称函数值)。函数定义的一般形式为:存贮类型标识符类型标识符函数名(形式参数表列及类型说明){说明部分语句部分}函数名power是一个标识符,power函数521)存贮类型标识符存贮类型标识符说明函数的存贮类型,它规定了函数可被调用的范围。可用于函数的存贮类型标识符有static和extern,指定为static的函数为静态函数,静态函数局部于它所在的文件,即只能由和它在同一文件中定义的函数调用;不指定存贮类型标识符时为缺省的存贮类型extern,缺省或指定为extern存贮类型的函数是外部函数,例如,例7.2中的power函数是外部函数。外部函数可以被任何函数调用。1)存贮类型标识符532)类型标识符C程序中定义的函数可以什么也不返回而只完成某项工作。无返回值的函数,类型标识符为void,又称为“空类型函数”,即此函数不向主调函数返回值,主调函数也禁止使用此函数的返回值。C程序中定义的函数也可以返回一个值,这时,类型标识符说明函数返回值的数据类型(常简称为“函数值的类型”或“函数的类型”),例如,例7.2中的power函数是一个double类型函数,main是int类型函数。函数的类型可以为任何基本类型、结构体和共用体类型。还可以定义返回值为指针的函数,但不能定义返回数组的函数。int型函数定义时可以省略类型标识符int,因为int是有返回值函数的缺省类型(提倡明确指出int)。2)类型标识符543)函数名函数名是一个标识符,一个程序中除主函数main外,其余函数的名字可以任意取,最好取有助于记忆的名字。考虑到与外部联接的需要,函数名一般不要超过6个字符长,如max(),power()和factor()等。外部函数的名字是作用于整个程序,因而外部函数相互之间不能同名。静态函数可以和外部函数同名,但同一文件中的函数不能同名。3)函数名554)参数表函数定义中的参数表说明函数参数的名称、类型和数目。参数表由零个或多个参数说明组成,如果函数没有参数,可只写一对括号(此为函数标志,不可省略),但最好将参数表指定为void。有多个参数时,多个参数之间用逗号隔开。函数定义中的参数表习惯上称为形参表。形参说明的一般形式为类型标识符形参名每个类型标识符对应于一个形参名,当有多个形参时,相互间用逗号隔开。4)参数表565)函数体和函数返回值函数定义中最外层{}括起来的部分称为函数体,函数体由说明部分和执行部分组成。说明部分是局部说明,执行部分是可执行语句的序列,完成本函数要完成的具体任务。局部说明中说明的变量和函数其有效范围局限于该函数内部,同形参一样,不能由其它任何函数存取(或调用)。函数体语法上是一个复合语句,它可以没有说明部分而只有执行部分,也可以两者都没有。因此最简单的合法函数是形参表为空(void)且函数体也为空的函数(称为哑函数),例如:voiddummy(void){}5)函数体和函数返回值577.2.2函数的声明函数声明的一般形式:存贮类型标识符类型标识符函数名(形参表);外部函数声明时可指定extern或存贮类型标识符缺省,静态函数声明时必须指定static;参数表可以只列出参数的类型名而不需给出参数名。例如:doublepower(int,int);和doublepower(intx,intn);是等价的。power函数是double类型,它有两个int参数。对于无参数表的函数,声明时参数表应指定为void。7.2.2函数的声明函数声明的一般形式587.3函数的调用7.3.1函数调用的方式和条件函数调用的一般形式为:函数名(实参1,实参2,…,实参n)()部分称为实参表,实参可以是常量、变量或表达式,有多个实参时,相互间用逗号隔开。实参和形参应在数目、次序和类型上一致。对于无参数的函数,调用时实参表为空,但()不能省。7.3函数的调用7.3.1函数调用的方式和条59(1)getch();getch函数调用作为语句出现。(2)c=getchar();getchar函数调用作表达式出现(赋值表达式的右操作数)。(3)while(putchar(getche())!=′?′);getche函数调用作为putchar函数调用的实参(表达式)出现,putchar函数调用作为关系表达式的左操作数(表达式)出现。(4)while((c=getch())!=′?′)putchar(c);putchar函数调用作为while语句的循环体(语句)出现。(1)getch();getch函数调用作60函数调用的一般过程为:(1)主调函数在执行过程中,一旦遇到函数调用,系统首先计算实参表达式的值并为每个形参分配存贮单元,然后把实参值复制到(送到或存入)对应形参的存贮单元中。实参与形参按位置一一对应。(2)将控制转移到被调用的函数,执行其函数体内的语句。(3)当执行return语句或到达函数体末尾时,控制返回到调用处,如果有返回值,同时回送一个值。然后从函数调用点继续执行主调函数后面的操作。函数调用的一般过程为:61除了正确地编写函数的定义及调用语句,要想成功地调用某个函数还必须满足下列四个条件之一:(1)被调用函数的定义出现在主调函数的定义之前。(2)在主调函数中或主调函数之前的外部对被调用函数进行声明。(3)被调用函数的返回值为int型。(4)被调用函数为标准函数时,在函数调用前已包含了相应的头文件。除了正确地编写函数的定义及调用语句,要想成627.3.2形参与实参的数值传递例7.3形参与实参的数值传递。voidswap(intx,inty){intz;z=x;x=y;y=z;}main(){inta,b;a=10;b=20;swap(a,b);printf("a=%d\tb=%d\n",a,b);}运行结果:a=10b=20
7.3.2形参与实参的数值传递例7.3形参与实参的63图7.2图7.264例7.4参数的求值顺序。voidmain(void){intx=0;printf("x=%d\n",x);printf("x++=%dx++=%d\n",x++,x++);printf("x=%d\n",x);}执行时输出:x=0x++=1x++=0x=2例7.4参数的求值顺序。voidmain(void657.3.3函数的返回值例7.5函数的返回值。max(floatx,floaty){if(x>=y)return(x);elsereturn(y);}main(){floata,b,c;scanf("%f%f",&a,&b);c=max(a,b);printf("max=%5.2f\n",c);}运行情况如下:2.55.6max=5.007.3.3函数的返回值例7.5函数的返回值。m667.4函数的嵌套与递归7.4.1函数的嵌套调用例7.6输入三个数,计算以它们作为两个底的半径和高所形成的圆台的体积。分析:已知圆台的上下底的半径,可用下式计算圆台的体积7.4函数的嵌套与递归7.4.1函数的嵌套调用67程序如下:#include<stdio.h>#include<math.h>#definePI3.1416floatarea(floatr){return(PI*r*r);}floatvolume(floatr1,floatr2,floath){floatv;v=h*(area(r1)+area(r2)+sqrt(area(r1)*area(r2)))/3.0;return(v);}程序如下:#include<stdio.h>68main(){floatr1,r2,h;printf("Pleaseinputr1r2h:\n");scanf("%f%f%f",&r1,&r2,&h);printf("Thevolumeis%f\n",volume(r1,r2,h));}运行结果Pleaseinputr1r2h:2.56.83.3Thevolumeis240.140762main()697.4.2函数的递归及条件递归是一种特殊的解决问题的方法,要用递归解决问题,应满足两个条件:(1)函数直接或间接地调用它本身;(2)应有使递归结束的条件。7.4.2函数的递归及条件递归是一种特殊的70例7.7用函数递归方法以字符串形式输出一个整数。#include<stdio.h>voidprintd(intn){if(n<0){putchar(′-′);n=-n;}if(n/10)/*n/10==0时,递归结束*/printd(n/10);/*递归调用*/putchar(n%10+′0′);/*以字符输出*/}voidmain(){intnumber;scanf("%d",&number);printd(number);}例7.7用函数递归方法以字符串形式输出一个整数。#i717.5变量的存贮类别7.5.1变量的作用域和生存期例7.8变量的作用域。
#include<stdio.h>intx=999;/*定义全局变量x*/voidprint-value(void);voidmain(){printf("%d\n",x);print-value();}voidprint-value(void){printf("%d\n",x);}输出:9999997.5变量的存贮类别7.5.1变量的作用域和生存期72例7.9变量的作用域。#include<stdio.h>voidprint-value(void);voidmain(){intx=999;/*定义局部变量x*/printf("%d\n",x);print-value();}voidprint-value(void){printf("%d\n",x);}例7.9变量的作用域。#include<stdi737.5.2动态存贮和静态存贮内存中供用户使用的存贮空间可分为程序区、动态存贮区和静态存贮区。程序区用来存放程序代码,动态存贮区和静态存贮区用来存放数据,即数据与处理数据的程序是分离的,这是面向过程的程序设计方法的特点。动态存贮和静态存贮是指C对数据存贮的两种方式。动态存贮是指存贮一些数据的存贮单元可在程序运行的不同时间分配给不同的数据,而静态存贮是指存贮单元在程序运行的整个过程中固定地分配给某些数据。7.5.2动态存贮和静态存贮内存中供用户747.5.3局部变量局部变量又称内部变量,是在一个函数内定义,其作用域限制在所定义的函数中。例7.10局部变量与全局变量同名。inta=1,b=2;/*定义全局变量a、b*/max(inta,intb)/*子函数中的局部变量a、b*/{intc;c=a>b?a:b;return(c);}main(){inta=8;/*定义局部变量a*/printf("%d",max(a,b));}运行结果:87.5.3局部变量局部变量又称内部变量,是757.5.4局部静态变量的使用例7.11静态局部变量的使用。voidf(){inta,b=3;staticintc,d=5;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 9-1生活需要法律 2法律保障生活 听课评课记录 新部编人教版七年级下册道德与法治
- 人教版地理七年级上册第四节《世界的气候》听课评课记录5
- 华师大版历史九年级上册第16课《启蒙运动》听课评课记录
- 户外广告制作合同范本
- 三方委托出口合同范本
- 二零二五年度知乎共享空间租赁合作协议
- SBS防水卷材购货合同范本
- 公司租赁合同范本
- 二零二五年度电影衍生品投资居间服务合同
- 2025年度男女双方婚前购房协议及婚后财产分割、债务处理及子女抚养协议
- 2024新沪教版英语(五四学制)七年级上单词默写单
- 电力两票培训
- TCCEAS001-2022建设项目工程总承包计价规范
- 2024.8.1十七个岗位安全操作规程手册(值得借鉴)
- 二次供水卫生管理制度及办法(4篇)
- 中学生手机使用管理协议书
- 给排水科学与工程基础知识单选题100道及答案解析
- 2024年土地变更调查培训
- 2024年全国外贸单证员鉴定理论试题库(含答案)
- 新版中国食物成分表
- DB11∕T 446-2015 建筑施工测量技术规程
评论
0/150
提交评论