资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。谢谢您,4.3 while 循环(二),例题:用while循环求1!+2!+.+100!,分析:,先求出n!,然后在累加,第1页,第五章 函数,5.1 使用函数编写程序入门,5.2 自己编写几个函数程序,5.3 变量与函数,第2页,本章关键点,怎样定义函数?怎样调用函数?怎样申明函数?,什么是函数参数?在函数调用时,参数是怎样传递?,在使用函数过程中,要注意哪些问题?怎样确定函数参数?,怎样使用局部变量和全局变量?,什么是静态变量?,第3页,5.1 使用函数编写程序入门,5.1.1 第一个使用函数程序(计算圆柱体体积)解析,5.1.2 函数定义,例题5-2 输出数字金字塔,5.1.3 函数调用及说明,第4页,5.1.1 第程序计算圆柱体积,例5-1,输入圆柱体高和半径,求圆柱体积,volume=,*r,2,*h,。,要求定义和调用函数,cylinder(r,h),计算圆柱体体积。,第5页,例5-1源程序,/*计算圆柱体积*/,#include,void main(),double height,radius,volume;,double cylinder(double r,double h);,/*,函数申明,*/,printf(Enter radius and height:);,scanf(“%lf,%lf,volume=,cylinder(radius,height),;,/*调用函数,返回值赋给volume*/,printf(Volume=%.3fn,volume);,第6页,例5-1源程序,double cylinder(double r,double h),/*定义求圆柱体积函数*/,double result;,result=3.1415926*r*r*h;/*计算体积*/,return result;,/*返回结果*/,运行结果:,Enter radius and height:,3.0,10,Volume=282.743,第7页,5.1.2 函数定义,函数是指完成一个特定工作独立程序模块。,库函数:由C语言系统提供定义,如scanf()、printf()等函数,自定义函数:需要用户自己定义,如计算圆柱体体积函数cylinder(),main()也是一个函数,C程序由一个main()或多个函数组成。,程序中一旦调用了某个函数,该函数就会完成一些特定工作,然后返回到调用它地方。,函数经过运算,得到一个明确运算结果,并需要回送该结果。比如,函数cylinder()返回圆柱体积。,函数完成一系列操作步骤,不需要回送任何运算结果。,第8页,1返回运算结果函数定义,函数类型 函数名(形参表),/*函数首部*/,/*函数体*/,函数实现过程,return 表示式;,把函数运算结果回送给主函数,只能返回一个值,函数返回值类型,没有分号,double cylinder(double r,double h),double result;,result=3.1415926*r*r*h;,return result;,第9页,1)形参说明:,类型1 参数1,类型2 参数2,类型n 参数n,参数之间用逗号分隔,每个参数前面类型都必须分别写明,函数类型 函数名(形参表),函数实现过程,return 表示式;,不能写成 double r,h,double cylinder(,double r,double h,),double result;,result=3.1415926*r*r*h;,return result;,第10页,double cylinder(double r,double h),/*,函数首部,*/,/*,函数体,写在一对大括号内,*/,double result;,result=3.1415926*r*r*h;/*,计算圆柱体积,*/,return result;,/*返回运算结果*/,2)分析函数定义,函数类型,函数名,形参表,与函数类型一致,第11页,2不返回运算结果函数定义,void,函数名(参数表)/*函数首部*/,/*函数体*/,函数实现过程,return;,/*能够省略return*/,这类函数通惯用于屏幕输出等,表示不返回结果,不能省略,不然,函数类型被默认定义为int,第12页,例5-2 输出5之内数字金字塔。,/*输出数字金字塔*/,#include,void main(),void pyramid(int n);,/*,函数申明,*/,pyramid(5);,/*调用函数,输出数字金字塔*/,void pyramid(int n),/*,函数定义,*/,int i,j;,for(i=1;i=n;i+)/*需要输出行数*/,for(j=1;j=n-i;j+)/*输出每行左边空格*/,printf();,for(j=1;j=i;j+)/*输出每行数字*/,printf(%d,i);/*每个数字前后各有一个空格*/,putchar(n);,1,2 2,3 3 3,4 4 4 4,5 5 5 5 5,第13页,5.1.3 函数使用及调用说明,定义一个函数后,就能够在程序中调用这个函数。,调用标准库函数时,在程序最前面用,#include,命令包含对应头文件。,调用自定义函数时,程序中必须有与调用函数相对应函数定义。,第14页,1函数调用形式和过程,使用返回值:,volume=,cylinder(radius,height),;,printf(“%f n”,cylinder(radius,height),);,完成操作:,pyramid(5);,惯用于void类型函数调用,惯用于返回结果函数调用,常量、变量,函数名,(,实参表,),第15页,1)函数调用执行过程,计算机在执行程序时,从主函数main开始执行,假如碰到某个函数调用,主函数被暂停执行,转而执行对应函数,该函数执行完后,将返回主函数,然后再从原先暂停位置继续执行。,函数遇return或最终大括号,返回主函数,第16页,2)用程序分析函数调用过程,#include,void main(),double height,radius,volume;,double cylinder(double r,double h);,printf(Enter radius and height:);,scanf(%lf%lf,volume=,cylinder(radius,height),;,printf(Volume=%.3fn,volume);,double cylinder(double r,double h),double result;,result=3.1415926*r*r*h;,return result;,调用,函数,实参,形参,执行函数中语句,返回调用它地方,第17页,2参数传递,函数,定义,时参数被称为,形式参数,(简称,形参,),double cylinder(double,r,double,h,);,函数,调用,时参数被称为,实际参数(简称实参,),volume=cylinder,(radius,height);,实参,形参,在参数传递过程中,实参把值复制给形参。,形参和实参,一一对应,:数量一致,类型一致,次序一致,形参,:变量,用于接收实参传递过来值,实参,:常量、变量,单向传递,第18页,3函数结果返回,函数返回两种情况,完成确定运算,有一个运算结果返回给主调函数。,完成指定工作,没有确定运算结果需返回给主调函数(函数类型void)。,函数结果返回形式:,return 表示式;,return (表示式);,第19页,4函数原型申明,函数类型 函数名(参数表);,double cylinder(double r,double h);,void pyramid(int n);,函数必须先定义后调用,将主调函数放在被调函数后面,就像变量先定义后使用一样。,假如自定义函数在主调函数后面,就需要在函数调用前,加上函数原型申明。,函数申明作用:说明函数类型和参数情况,以确保程序编译时能判断对该函数调用是否正确。,只写函数定义中第1行(函数首部),并以分号结束。,第20页,5.2 自己使用函数编写程序,例5-6 输入精度e,使用格里高利公式求近似值,准确到最终一项绝对值小于e。要求定义和调用函数 funpi(e)求近似值。,例5-4,求两个数最大值,例5-5 求阶乘问题,第21页,程序5-4 两个数球求最大值(无参数传递),第22页,两个数求最大值(有参数传递,函数定义在main之前),第23页,函数定义在main之前,第24页,例5-5 求阶乘问题。输入一个正整数n,输出n!。,#include /*编译预处理命令*/,void main()/*主函数*/,int n;/*变量定义*/,int factorial(int n);/*函数申明*/,scanf(%d,/*输入一个整数*/,printf(“%dn”,factorial(n);/*调用函数计算阶乘*/,int factorial(int n)/*定义计算 n!函数*/,int i,fact=1;,for(i=1;i=e),item=flag*1.0/denominator;,sum=sum+item;,flag=-flag;,denominator=denominator+2;,return sum*4;,Enter e:,0.0001,pi=3.1418,第27页,上机作业:,1、用函数实现三个数求最大值。(分有参数传递和无参数传递两种)(2分),2、用函数实现Fibonacci序列:1,1,2,3,5,8,13,(求出10位)(1分),第28页,5.3 变量与函数,5.3.1 局部变量和全局变量,5.3.2 变量生命周期和静态局部变量,第29页,5.3.1 局部变量和全局变量,局部变量,在函数内定义变量(包含形参),作用范围:,本函数内部,定义在复合语句内变量,作用范围:复合语句内部,全局变量,在函数以外定义变量,不隶属于任一函数。,作用范围:,从定义处到源文件结束,(包含各函数),第30页,例5-6 在复合语句中定义局部变量。,#include,int main(void),int a;,a=1;,/*复合语句开始*/,int b=2;,b=a+b;,a=a+b;,/*复合语句结束*/,printf(%d ,a);,return 0;,b:小范围内暂时变量,4,第31页,例5-7 全局变量定义,#include stdio.h,int x;,/*定义全局变量x*/,int f(),int x=4;,/*x为局部变量*/,return x;,int main(void),int a=1;,x,=,a,;/*对全局变量 x 赋值*/,a=f();/*a值为4*/,int b=2;,b=a+b;/*b值为4*/,x,=,x,+b;/*全局变量运算*/,printf(%d%d,a,x,);,return 0;,4,7,若局部变量与全局变量同名,局部变量优先,第32页,变量作用范围示例,int x=1;,void main(),int a=2;,.,int b=3;,.,f();,.,int t=4;,void f(),int x=5,b=6;,.,int a=7;,x=?a=?b=?,b=?,x=5 b=6 t=4 a没定义,x=?b=?t=?a=?,第33页,自动变量(,auto,):普通局部变量,int x,y;,auto,int x,y;,char c1;,auto,char c1;,函数调用时,定义变量,分配存放单元。,函数调用结束,收回存放单元。,全局变量:从,程序执行开始,到程序结束,存放单元一直保持。,变量生命周期,变量从定义开始分配存放单元,到运行结束存放单元被回收整个过程。,5.3.2 变量生命周期和静态局部变量,第34页,存放类型:,动态存放:自动变量,静态存放:全局变量、,静态局部变量,用户存放空间,存放区,数,据,区,静态存放区,动态存放区,第35页,static,类型名 变量表,作用范围:局部变量,生命周期:全局变量,静态局部变量,第36页,例5-9 静态局部变量示例,#include,void fun(int k);,int main(void),int k;,for(k=1;k=3;k+),fun(k);,return 0;,void fun(int k),static int a;,printf(%d,a);,a+=k;,0,1,3,静态变量会记住前一次调用时留下来值,静态变量初值为0,第37页,附加例题1.找出500以内全部素数。,第38页,例2 求Fibonacci序列:1,1,2,3,5,8,13,1,1,2,3,5,8,13,x1 x2 x,x1 x2 x,x1=x2=1;,x=x1+x2;,x1=x2;,x2=x;,x1=1;,x2=1;,printf(%6d%6d,x1,x2);/*输出头两项*/,for(i=1;i=8;i+)/*循环输出后8项*/,x=x1+x2;/*计算新项*/,printf(%6d,x);,x1=x2;/*更新x1和x2*/,x2=x;,第39页,
展开阅读全文