1、实例5.1】阅读实例程序,了解C语言程序的执行过程。,5.1了解C语言程序的执行过程,#include #include #define PI 3.14159 float 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 volum。
2、e (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; b=fabs(a); c=sup_area(b); d=volume(b); ,主函数,文件math.h,s=4*PI*r*r; return s;,sup_area函数,v=4.0/3.0*PI*r*r*r; return v;,volume函数,形参与实参 形式参数:定义函数时函数名后面括号中的变量。
3、名 实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者,main() int a,b,c; scanf(%d,%d, ,5.2函数参数及其传递方式,说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,5.2、函数参数及其传递方式,值传递方式 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被。
4、释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递,5.2、函数参数及其传递方式,/*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; ,例 交换两个数,课堂练习:调用自定义函数计算1n的和,编写程序,输入n的值,并调用自己编写的函数计算1至n的和。,主函数的流程图,主函数框架: m。
5、ain() int n=0,a=0; printf(Input n:); scanf(%d, ,自编函数的流程图,是,否,in,给i赋1,s=s+i,i增1,入口,定义i和s,返回s,自编函数框架: int sum_n(int n) 定义变量 计算1至n的和 将结果告知主函数 ,是,否,in,给i赋1,s=s+i,i增1,入口,定义i和s,返回s,#include int sum_n(int n); main() int n=0,a=0; printf(Input n:); scanf(%d, ,函数的原型说明,实参,int sum_n(int n) int i=0,s=0; for(i=1;。
6、 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个数以及加、减、乘、除中的某运算符号,并调用自。
7、己编写的函数计算相应的结果。,main() int a=0,b=0; char sym=0; float c=0.0; scanf(%d%c%d, ,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 *。
8、: c=a*b; return c; case /: if(b!=0) c=(float)a/b; return c; else printf(Devided by 0.n); getch(); exit(0); ,调用函数进行四则运算的过程,调用函数进行四则运算的过程,0,b,a,0,sym,0,c,主调函数,被调函数,950,嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数,5.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。
9、); void main() int a,b,c,d; scanf(%d%d%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=x10、。,计算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。
11、; 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; ,定义:函数直接或间接的调用自身叫函数的递归调用,说明 C编译系统对递归函数的自调用次数没有限制 每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x) int y,z; z=f(y); . return(2*z); ,递归调用,#includ。
12、e int fac(int n) int f; if(n<0) printf(n<0,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的阶乘,变量的属性 数据类型:变量所持有的数据的性质(操作属性) 存储属性 存储器类型:寄存器、静态存储区、动态存储区 生存期:变量在某一时刻存在-静态变量与动态变量 作用域:变量在某区域内有效-局部变量与全局变量 变量的存储类型 auto -自动型 。
13、register-寄存器型 static -静态型 extern -外部型 变量定义格式: 存储类型 数据类型 变量表;,概述 变量是对程序中数据的存储空间的抽象,如: int sum; auto int a,b,c; register int i; static float x,y;,5.4、变量的存储属性,局部变量-内部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在main中有效 不同函数中同名变量,占不同内存单元 形参属于局部变量 可定义在复合语句中有效的变量 局部变量可用存储类型:auto register static (默认为auto),局部变量与全局。
14、变量,5.4.1 内部变量和外部变量 5.4.2 动态存储变量和静态存储变量,5.4、 变量的存储类别,5.4.1 内部变量和外部变量,阅读下面程序,观察变量定义的位置,分析程序的运行结果。,运行结果: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。
15、,c); ,外部变量,内部变量,内部变量,内部变量,运行结果: a=2,b=9,c=6 a=3,b=9,c=1,存储方式 静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间 内存用户区,生存期 静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函数执行结束,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=5 a=5,b=7 a=5,b=9,静态存储变量。