资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
【实实例例5.1】阅阅读读实实例例程程序序,了了解解C语言程序的执行过程。语言程序的执行过程。 返回返回5.1了解C语言程序的执行过程#include #include #define PI 3.14159float sup_area(float r);float volume(float r);main() float a=-5,b,c,d; b=fabs(a); c=sup_area(b); d=volume(b); printf(c=%f,d=%fn,c,d);预处理命令预处理命令 函数原型说明函数原型说明 主主函函数数 float sup_area(float r) float s; s=4*PI*r*r; return s;float volume (float r) float v; v=4.0/3.0*PI*r*r*r; return v;sup_area函数的定义函数的定义(计算球的计算球的表面积表面积)volume函数的定函数的定义义(计算计算球的体积球的体积)运行结果:运行结果:c=314.158997,d=523.598328 fabs函数函数 其它函数其它函数a=-5;a=-5;b=fabs(a);b=fabs(a);c=sup_area(b);c=sup_area(b);d=volume(b);d=volume(b); 主函数主函数文件文件math.hs=4*PI*r*r;s=4*PI*r*r;return s;return s;sup_area函数函数v=4.0/3.0*PI*r*r*r;v=4.0/3.0*PI*r*r*r;return v;return v;volume函数函数形参与实参l形式参数:定义函数时函数名后面括号中的变量名l实际参数:调用函数时函数名后面括号中的表达式c=max(a,b);(main 函数)(max 函数)max(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参实参5.2函数参数及其传递方式说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式5.2、函数参数及其传递方式l值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递5.2、函数参数及其传递方式711x:y:调用前:调用结束:711x:y:/*ch7_2.c*/#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp例例 交换两个数交换两个数课堂练习:调用自定义函数计算课堂练习:调用自定义函数计算1n1n的和的和编编写写程程序序,输输入入n的的值值,并并调调用用自己编写的函数计算自己编写的函数计算1至至n的和。的和。主模块主模块计算计算1至至n的和的和开始开始定义定义n和和a输入输入n的值的值调用调用自编函数自编函数计算计算1至至n之和之和输出结果输出结果结束结束主函数的流程图主函数的流程图主函数框架:主函数框架:main() int n=0,a=0; printf(Input n:); scanf(%d,&n); a=1至至n的和的和 printf(%dn,a);自编函数的流程图自编函数的流程图是是否否in给给i赋赋1s=s+ii增增1入口入口定义定义i和和s返回返回s自编函数框架:自编函数框架:int sum_n(int n) 定义变量定义变量 计算计算1至至n的和的和 将结果告知主函数将结果告知主函数 是是否否in给给i赋赋1s=s+ii增增1入口入口定义定义i和和s返回返回s#include int sum_n(int n);main() int n=0,a=0; printf(Input n:); scanf(%d,&n); a=sum_n(n); printf(The sum(1-%d) is:%dn,n,a); 函数的原型说明函数的原型说明 实参实参int sum_n(int n) int i=0,s=0; for(i=1; i=n; i+) s=s+i; return s; 函数名函数名int sum_n(int n) int i=0,s=0; for(i=1; i=n; i+) s=s+i; return s; 形参形参int sum_n(int n) int i=0,s=0; for(i=1; i=n; i+) s=s+i; return s; 通知计算结果通知计算结果int sum_n(int n) int i=0,s=0; for(i=1; i=n; i+) s=s+i; return s; 计算结果的类型计算结果的类型作业:调用自定义函数进行四则运算编编写写程程序序,输输入入2个个数数以以及及加加、减减、乘乘、除除中中的的某某运运算算符符号号,并并调调用用自自己编写的函数计算相应的结果。己编写的函数计算相应的结果。main() int a=0,b=0; char sym=0;float c=0.0; scanf(%d%c%d,&a,&sym,&b);c=cal(a,sym,b); printf(%d%c%d=%fn,a,sym,b,c); float cal(int a,char sym,int b) #include float cal(int a,char sym,int b);空函数空函数 编译无误时编写编译无误时编写cal函数函数主调函数主调函数被调函数被调函数自自顶顶向向下下,逐逐步步细细化化 float cal(int a,char sym,int b) float c=0.0;switch(sym) case +: c=a+b; return c; case -: c=a-b; return c; case *: c=a*b; return c; case /: if(b!=0) c=(float)a/b; return c; else printf(Devided by 0.n); getch(); exit(0); 调用函数进行四则运算的过程调用函数进行四则运算的过程0ba0sym0c主主调调函函数数2538*调用函数进行四则运算的过程调用函数进行四则运算的过程0ba0sym2538*basym950c0c主主调调函函数数被被调调函函数数2538*950嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数main( )调用函数a结束a函数b函数调用函数b5.3、 函数的嵌套与递归调用#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数例例 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值练习:用嵌套调用的方法进行计算练习:用嵌套调用的方法进行计算编编写写fac函函数数,该该函函数数的的功功能能是是计计算算n! , 再再 调调 用用 该该 函函 数数 , 计计 算算1!+3!+5!+19!的值。的值。计算计算n!的函数代码框架:的函数代码框架:float fac(int n) int i=0; float f=1.0; 计算计算n! 将结果告知主调函数将结果告知主调函数此函数的主调函数是此函数的主调函数是sum sum函数的框架:函数的框架:float sum(int n) int i=0; float s=0.0; 计算计算fac(1)、fac(3)、fac(n)之和之和 将结果告知主调函数将结果告知主调函数 此函数的主调函数是此函数的主调函数是main #include float fac(int n);float sum(int n);main() float s=0; s=sum(19); printf(s=%.0fn,s); float sum(int n) int i=0; float s=0.0; for(i=1; i=n; i=i+2) s=s+fac(i); return s; 嵌套调用嵌套调用 float fac(int n) int i=0; float f=1.0; for(i=1; i=n; i+) f=f*i; return f; 定义:函数直接或间接的调用自身叫函数的递归调用f( )调f调f2调f1f1( )f2( )说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);递归调用递归调用#include int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);例例 求求n n的阶乘的阶乘变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto -自动型register-寄存器型static -静态型extern -外部型变量定义格式: 存储类型 数据类型 变量表;概述变量是对程序中数据的存储空间的抽象如: int sum; auto int a,b,c; register int i; static float x,y;5.4、变量的存储属性l局部变量-内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:auto register static (默认为auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例 不同函数中同名变量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 复合语句中变量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);运行结果:5 4 3 2 1例 复合语句中变量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);例 不同函数中同名变量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4局部变量与全局变量5.4.1 内部变量和外部变量内部变量和外部变量5.4.2 动态存储变量和静态存储变量动态存储变量和静态存储变量5.4、 变量的存储类别返回返回5.4.1 内部变量和外部变量阅阅读读下下面面程程序序,观观察察变变量量定定义义的的位置,分析程序的运行结果。位置,分析程序的运行结果。#include int a=3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);main() int a=8,z;Z=max(a,b); printf(max=%d,z);运行结果:max=8例例 外部变量与局部变量外部变量与局部变量#include void fun(int c);int a=3,b=5,c=0;main() int c=1; fun(c); printf(a=%d,b=%d,c=%dn,a,b,c);void fun(int c) int a=1; a=2*a; int c=2; b=a+b+c; c=c+5; printf(a=%d,b=%d,c=%dn,a,b,c); 外部变量外部变量 内部变量内部变量 内部变量内部变量 内部变量内部变量 运行结果运行结果:a=2,b=9,c=6a=3,b=9,c=1 l存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间l内存用户区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束 5.4.2动态变量与静态变量5.4.2 动态存储变量和静态存储变量阅阅读读下下面面程程序序,观观察察变变量量的的开开辟辟与与释释放放时时间间,分分析析程程序序的的运运行行结果。结果。#include void fun();main() int i=0; for(i=1; i=3; i+) fun();void fun() auto int a=3; static int b=3; a=a+2; b=b+2; printf(a=%d,b=%dn,a,b); 动态存储变量动态存储变量 运行结果运行结果:a=5,b=5a=5,b=7a=5,b=9静态存储变量静态存储变量
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号