资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
函数,模块化程序设计 基本思想:将一个程序按功能分成若干个程序模块,每一个模块实现一个特定的功能。(或实现某一操作,或实现计算出一个值等)。,P155,主函数,main() ,预处理命令,以#开头的,子函数1,类型名 函数名1(参数) ,子函数n,类型名 函数名n(参数) ,C程序,一个C程序由一个或多个源程序文件组成,可以分别编译,统一执行。 一个源程序文件由一个或多个函数组成,编译程序以文件为单位进行编译的。 C 是函数式语言,C的组成单位是函数。 一个源程序必须有且只有一个名为main的主函数 C程序的执行总是从main函数开始,在main函数中结束整个程序的运行。 所有函数都是平行独立的,无主次、相互包含之分。函数不能嵌套定义,可以嵌套调用,基本概念,P156,函数分类 从用户角度 标准函数(库函数,如,math.h 、stdio.h、string.h、ctype.h等) 用户自定义函数 从函数形式 无参函数 有参函数,基本概念,P156,函数类型名 函数名(形参类型说明表) 说明部分 执行部分 ,函数定义的一般形式,用户自定义的合法标识符,例 有参函数 int max(int x,int y) int z; z=xy?x:y; return(z); ,例 空函数 void fun( ) ,函数体为空,例 无参函数 int main( ) ,P157,函数体,函数类型名 函数名(类型名 形参1,类型名 形参2,.) 说明部分 语句部分 ,有情提醒:有参函数定义时参数定义格式,函数类型名 函数名(形参1,形参2,) 形参类型说明 说明部分 语句部分 ,子函数编写: 类型名 子函数名(参数) 数据类型说明 功能算法 返回结果 ,【函数编程】求两个整数的最大数,主函数编写: main() 数据类型说明 数据输入 调用子函数 数据输出 ,两部分: 1.主函数编写。 2.子函数编写(完成求最大值的功能)。,int max(x,y) int x,y; int z; z=xy?x:y; return(z); ,【函数编程】求两个整数的最大值,#include int max( int x,int y ) int z; z=xy?x:y; return(z); main() int a,b,m_ab; scanf(%d%d, ,注意 不同点,子函数,主函数,返回语句 形式: return(表达式); 或 return 表达式; 或 return; (无返回值) 功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。,函数的返回值,P160,#include int max( int x,int y ) int z; z=xy?x:y; return(z); main() int a,b,m_ab; scanf(%d%d, ,a,b,2,3,m_ab,3,x,y,2,3,z,3,max(a,b)函数值,【函数编程】求两个整数的最大值的执行过程,max=3,说明: 函数的返回值通过return语句获得。只能有一个值返回。 函数中可有多条return语句,执行任何一条return语句,立即返回到调用函数。 函数中也可无return语句。无return语句时,执行到函数最后一个“ ” 时,自动返回调用函数。 函数值(函数的返回值)有数据类型。 若定义函数时的类型名与return语句中表达式值(函数返回值)的类型不一致时以函数类型为准,实现自动转换。 void型函数(空类型),无返回值。,函数的返回值,P160,x -x+1 (x=0),y=,【函数编程】计算下列分段函数的值,#include float fy (float x ) float y; if (x0) y=x*x - x+1; else y=x*x*x+x+3; return y; main() float x,y; scanf(%f, ,if (x0) return (x*x - x+1); else return (x*x*x+x+3);,子函数编写: 类型名 子函数名(参数) 数据类型说明 功能算法 返回结果 ,主函数编写: main() 数据类型说明 数据输入 调用子函数 数据输出 ,不带返回值的函数可说明为void型。void类型无返回值。,如果函数的类型和return表达式中的类型不一致,则以函数类型为准。对数值型数据,实现类型自动转换。,当函数有返回值时,其函数返回值的数据类型,由定义函数时指定数据类型决定。,float fy (float x ) /*函数值为实型 */ int y; if (x0) y=x*x - x+1; else y=x*x*x+x+3; return y; ,函数的类型决定函数返回值的类型,进一步说明:,形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,求两个数的最大值。,#include int max( int x, int y ) int z; z=xy?x:y; return(z); void main() int a,b,c; scanf(%d,%d,P158,函数参数,形参,实参,实参必须有确定的值 形参必须指定类型 形参与实参个数相同,类型相一致,若形参与实参类型不一致,自动按形参类型转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放。因此,形参只有在函数内部有效。,函数参数使用小结,#include int fun(int x,int m) float j=3.6; j+=m; m*=x+j; return m+j; 参 main() int j=4,m=2,k; k=fun(j,m); printf(%d,%d,k,m); ,例:阅读下列程序,运行后的输出结果是,j,m,4,2,k,3.6,x,m,4,2,j,24,fun(j,m)函数值,24,2,m+j (24.6),5.6,19,形参,实参,调用形式 函数名(实参表);,函数的调用,说明: 实参与形参个数相等,类型一致,按顺序一一对应 实参表求值顺序,因系统而定(Turbo C 自右向左),P161,函数语句: printf(“Hello,World!n”); 函数表达式: m=max(a,b)*2; 函数参数: printf(“%d”,max(a,b); m=max(a,max(b,c);,调用方式,P162,P202 8.1 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。,#include int fun1 ( int a, int b) int r; while(r=a%b)!=0) a=b; b=r; return b; ,void main ( ) int a,b,df,sc; printf(Input a,bn); scanf(“%d%d”, ,int fun2(int x,int y,int m) return(x*y/m); ,#include char upper (char c ) c+=32; return c; char lower(char c) c-=32; return c; main() char s79; int i=0; gets(s); while(si!=0) if(si=A ,函数定义,函数调用,【函数编程】编写两个函数,其中一个函数实现大写字母转换为小写字母,另一函数实现小写字母转换大写字母。由主函数实现输入任意一个字符串。,函数定义,#include main() char s79; int i=0; gets(s); while(si!=0) if(si=A,函数说明,函数定义,函数调用,【函数编程】编写两个函数,其中一个函数实现大写字母转换为小写字母,另一函数实现小写字母转换大写字母。由主函数实现输入任意一个字符串。,char upper(char c),lower(char c);,(被调)函数的说明,函数说明的一般形式(P165):,函数类型 函数名(形参类型1,形参类型2, ),作用:告诉编译系统函数类型、参数个数及类型,以便检验,函数类型 函数名(形参类型1 形参1,形参类型2,形参2, ),P163,函数定义与函数说明不同 函数说明位置:在调用函数的数据说明部分的位置处。 当被调函数在调用函数的之后时需对被调函数加以说明 下列情况下,可对被调函数省去函数说明 若函数类型是int型 被调用函数定义出现在主调函数之前,(被调)函数的说明的要点,值传递方式 方式:函数调用时,为形参分配单元,并将实参的值传给形参;调用结束,形参单元被释放,实参单元仍保留并维持原值。(单向传递),参数传递方式:值传递、地址传递,形参,实参,数值 表达式 变量,变量,例:以下程序运行后,输出结果是,#include fun(int x,int y,int z) x=x+y+z; y=y/2; z=x+y; if(x%2) return x; if(y!=0) return y; return z; main() int x=10,y=21,z=30,d; d=fun (5,y%2,z); printf(%dn,d); printf(%d %d %d ,x,y,z); ,10,21,30,5,1,30,5 1,36,0,36,fun函数值,36,若子函数省略了类型定义,默认为整型,地址传递 方式:函数调用时,将数据的存储地址作为参数传递给形参,形参与实参占用同样的存储单元,实现“双向”传递。,形参,实参,一维数组名,二维数组名,参数传递方式:值传递、地址传递,一维数组 二维数组,一维数组,#include void main() int a10=23,-1,12,-3,-7,-8,46,6,78,34,i,num; int count(int a10 ); num=count( a ); for(i=0;i0) n+=1; else bi=0; return n;,一维数组名作函数参数,实现地址传递,函数定义 形参为一维数组,0,0,0,0,结论:地址传递时,形参值的变化影响实参值的变化。,P177,例: 读下列程序,当输入1479时,写出其运行结果。,#include void str(int n, char s ) int i= 0; do si+=n%10+0; n/=10; while (n); si=0; ,void main ( ) int m; char a50; scanf (%d, ,形参一维数组的长度可以省略,友情提醒: n%10+0 将一个整数数值转换为一个数字字符,#include #include int fun (char str79) /* int func (char str ) */ int i,j; i=0; j=strlen(str)-1; while(i=j) if(stri+!=strj-) return 0; return 1; void main ( ) char str79; int flag; gets(str); flag=fun(str); if( flag ) printf(%s is Huiwen string,str); else printf(%s is not Huiwen string,str); ,【函数编程】函数的功能是判断一个字符串是不是“回文串”。若是返回1,否则返回0 。,fun(str),void main() int a24=13,2,4,5
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号