第八讲第九讲第6章函数、存储类和预处理程序.ppt
作业程序:P86.13#includestdio.hmain()int i,j,k;for(i=0;i=3;i+)for(j=0;j=i;j+)printf();for(k=0;k=3;k+)printf(*);printf(n);,打印九九乘法表#includestdio.hmain()int i,j,k;for(i=1;i=9;i+)printf(%4d,i);printf(n);for(i=1;i=36;i+)printf(-);printf(n);for(i=1;i=9;i+)for(j=1;j=9;j+)printf(%4d,i*j);printf(n);,P86 上机题#includestdio.hmain()int n,m,sum,i=0,j=0,k=0,h=0;double av;while(1)printf(请输入两门课成绩(如果结束输入两个0):);scanf(%d%d,第6章 函数、存储类和预处理程序,6.1 函数概述*引例*函数的定义*函数使用说明 C语言中有标准库函数和自定义函数。C程序往往由多个函数组成,其中必有一个名为main的主函数,由main来调用其他函数,同一函数可以被一个或多个函数调用一次或多次。,函数使用说明*函数和C程序的关系*主函数,子函数及其关系*调用*程序执行过程,函数调用关系图,函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数:解决用户的专门需要从函数形式无参函数有参函数,#include long power(int x,int n)int i;long p;for(i=1,p=1;i=n;i+)p*=x;return p;main()int w=2;long r;r=power(w,2);printf(”The result is%ld”,r);,【例6.1】函数定义的一个实例。,6.2 函数的定义一般格式,合法标识符,函数返回值类型缺省int型无返回值void,函数体,例 有参函数(现代风格)int max(int x,int y)int z;z=xy?x:y;return(z);,例 无参函数 printstar()printf(“*n”);或 printstar(void)现代风格 printf(“*n”);,6.3 函数参数及其传递方式6.3.1 形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式,例8.2 比较两个数并输出大者,main()int a,b,c;scanf(%d,%d,说明:1.实参必须有确定的值.实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等办法,使实参获得确定的值。2.形参必须指定类型3.形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用时转换4.形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放5.参数传递方式-值传递方式,6.3.1 函数参数及其传递方式,说明5.参数传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递,6.3.2 函数的返回值函数的返回值通过函数体中的return语句获得形式:return;或 return r;或 return(r);return语句的功能:返回调用函 数,并将“返回值表达式”的值带给调用函数。说明:若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换若无return语句,遇时,自动返回调用函数void型函数(如果明确表示不需返回值,可用void作函数的数据类型。)一个函数中可以有多条return语句。,例 函数返回值类型转换,main()float a,b;int c;scanf(%f,%f,输入:1.5,2.5输出结果:Max is 2,6.4 函数的调用6.4.1调用形式 函数名(实参表);,main()int a,b,c;scanf(%d,%d,说明:实参与形参个数相等,类型一致,按顺序一 一对应 实参表求值顺序,因系统而定(Turbo C 自右向左),main()int i=2,p;p=f(i,+i);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);,例8.4 参数求值顺序,main()int i=2,p;p=f(i,i+);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);,运行结果:0,运行结果:1,6.4.2函数说明一般形式:函数类型 函数名(形参类型 形参名,.);作用:告诉编译系统函数类型、参数个数及类型,以便检验下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前文件一开头,在所有函数之前,对所用函数作了说明,#include main()double fun(int n);int n;scanf(%d,6.5 函数的嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数,例:#include printstar()printf(“*n”);printmessage()printf(“Hello,Worldn”);printstar();main()printstar();printmessage();,运行结果:*Hello,World*,printmessage();,6.6 函数的递归调用定义:函数直接或间接的调用自身叫函数的递归调用,说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x)int y,z;z=f(y);.return(2*z);,例6.8:用函数递归调用求斐波纳奇数列(Finonacci)。,#include stdio.hlong fib(int n)if(n=1)return 1;else if(n=2)return 1;else return fib(n-1)+fib(n-2);main()long r;r=fib(5);printf(“fib(5)=%d”,r);,注意:为防止递归调用无终止地进行,必须在函数内有终止递归调用的手断。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。递归函数的两个要素:递归公式 结束条件,例 求n的阶乘,#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=0,