• / 75
  • 下载费用:25 金币  

计算机软件及应用五函数PPT课件

关 键 词:
计算机软件及应用 软件PowerPoint
资源描述:
第五章 *1 l 本章要点 • • 函数的概念函数的概念 • • 函数的定义与调用函数的定义与调用 • • 函数的递归调用函数的递归调用 • • 变量的作用域变量的作用域 • • 函数的作用域函数的作用域 Date2 5.1 概述 5.2 函数的定义 5.3 函数的返回值 5.4 函数的调用 5.5 函数参数及其传递方式 5.6 函数的嵌套与递归调用 5.7 数组作为函数参数 5.8 变量的存储属性 5.9 内部函数与外部函数 l 主要内容 Date3 5.1 概述 v模块化程序设计 n基本思想:大程序按功能分割成小模块 n特点: l各模块相对独立、功能单一、结构清晰、接口简单 l控制了程序设计的复杂性 l缩短开发周期 l避免程序开发的重复劳动 l易于维护和功能扩充 n开发方法: 自上向下 逐步分解 分而治之 Date4 C程序结构 v C是模块化程序设计语言 Date5 } 或 printstar(void ) { printf(“**********\n”); } 函数类型 函数名() { 声明部分 语句部分 } 不能省略 Date9 n2、有参函数 形式 例 有参函数 int max(int x,int y) { int z; z=xy?x:y; return(z); } 例 有参函数 int max (int x, y) { int z; z=xy?x:y; return(z); } 函数类型 函数名(形式参数表列) { 声明部分 语句部分 } Date10 n3、空函数 函数类型 函数名() { } 注:表明只调用,不做事 例 空函数 dummy( ) { } 函数体为空 Date11 函数类型 函数名(形参表) 形参类型说明 { 说明部分 语句部分 } v 传统风格: 例 传统风格 int max(x,y) int x,y; { int z; z=xy?x:y; return(z); } Date12 v返回语句 n形式:return(表达式); return 表达式; return; n功能:把值从被调用函数返回到主调用函数 5.3 函数的返回值 Date13 n说明: n函数中可有多个return语句,但只能返回一个值 n若无return语句,遇}时,自动返回调用函数 n类型不一致自动转换成函数调用类型 nvoid型函数,无return语句 n不加类型时自动按整型处理 n从哪里调用仍返回哪个地方 例 无返回值函数 void swap(int x,int y ) { int temp; temp=x; x=y; y=temp; } Date14 void print( ) /* void类型,不能有return语句*/ { int i ; for( i=1; i void main() { int f(int a,int b); /* 函数声明 */ int i=2,p; p=f(i,++i); /* 函数调用 */ printf(“%d\n“,p); } 例 实参求值的顺序 Date19 int f(int a,int b) /* 函数定义 */ { int c; if(ab) c=1; else if(a==b) c=0; else c=-1; return(c); } Date20 如果按自左至右顺序求实 参的值,则函数调用相当 于f(2,3) 如果按自左至右顺序求实 参的值,则函数调用相当 于f(3,3) 对于函数调用 int i=2,p; p=f(i,++i); Date21 n函数语句: 例 printstar(); printf(“Hello,World!\n”); n函数表达式: 例 m=max(a,b)*2; n函数参数: 例 m=max(a,max(b,c)); v 调用方式 Date22 n对被调用函数具备条件: n必须是已存在的函数 n库函数: #include n用户自定义函数: 函数类型说明 v 被调函数声明和函数原型 Date23 n函数原型 n一般形式: 函数类型 函数名(形参类型 [形参名],… ); 或 函数类型 函数名(); n作用:告诉编译系统函数类型 参数个数 类型,以便检 验 n函数定义与函数说明不同 n函数说明位置:在程序的数据说明部分(函数内或外) Date24 例 对被调用的函数作声明 #include void main() { float add(float x, float y); /*对被调用函数add的声明*/ float a,b,c; scanf("%f,%f“,&a,&b); c=add(a,b); printf("sum is %f \n“,c); } float add(float x,float y) /*函数首部*/ { float z; /* 函数体 */ z=x+y; return(z);或return z; } Date25 例 对被调用的函数作声明 # include float add(float x,float y) /*函数首部*/ { float z; /* 函数体 */ z=x+y; return(z);或return z; } void main() { float a,b,c; scanf("%f,%f“,&a,&b); c=add(a,b); printf("sum is %f \n“,c); } Date26 v形参与实参 n形参:定义函数时函数名后面括号中的变量名 u位置:在被调函数首部( )中说明的变量 u格式:类型 变量1,类型 变量2,……类型 变量n u功能:其作用是接收调用函数传递过来的实参值 , 所以形参只能是变量(存储单元形式)。 5.5 函数参数及其传递方式 例如:int f( int x, int, n, float y) 形式参数 { } 每个变量名 前要有类型 Date27 n实参:调用函数时函数名后面括号中的表达式 Ø位置:出现在函数调用的( )中。 Ø格式:函数名(实参1,实参2,……实参n) Ø实参的形式:表达式、函数、变量、数。 Ø功能:将调用函数中的数据传递到被调函数中。 例:c=max(2,3); Date28 例 调用函数时的数据传递 #include void main() { int max(int x,int y); /* 对max函数的声明 */ int a,b,c; scanf("%d,%d“,&a,&b); c=max(a,b); printf(“Max is %d“,c); } Date29 int max(int x,int y)/*定义有参函数max */ { int z; z=x>y?x∶y; return(z); } 运行情况如下: 7,8↙￿ Max is 8 Date30 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“, c=max(a,b); printf(“Max is %d“,c); } max(int x, int y) { int z; z=xy?x:y; return(z); } 形参 实参 例 比较两个数并输出大者 Date31 void output( int n) { int i; for( i=1; i main() { int x=7,y=11; printf(“x=%d,\ty=%d\n“,x,y); printf(“swapped:\n“); swap(x,y); printf(“x=%d,\ty=%d\n“,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 例 交换两个数 Date35 n方式:函数调用时,将数据的存储地址作为参数传递给形参 n特点: n形参与实参占用同样的存储单元 n“双向”传递 n实参和形参必须是地址常量或变量 n 地址传递方式 Date36 /*ch9_3.c*/ swap(p1,p2) int *p1,*p2; { int p; p=*p1; *p1=*p2; *p2=p; } main() {int a,b; scanf(“%d,%d“, printf(“a=%d,b=%d\n”,a,b); printf(“swapped:\n”); swap( printf(”a=%d,b=%d\n“,a,b); } 例 交换两个数 a 59 b 调前: a 5 9 b 调swap: p1 long factorial(int n); main() { int n1,n2; long a; scanf(“%d,%d“, a=sum(n1,n2); printf(“a=%1d“,a); } long sum(int a,int b) { long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); } long factorial (int n) { long rtn=1; int i; for(i=1;i 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“, d=dif(a,b,c); printf(“Max-Min=%d\n“,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=x int fac(int n) { int f; if(n1) Date43 5.7 数组作为函数参数(课本p159) v 数组元素作函数实参——值传递 例 两个数组大小比较 4 3 2 1 0 5 a 56 23 12 10 76 88 4 3 2 1 0 5 b 21 23 43 98 66 54 n=0 m=0 k=0 i n=0 m=0 k=1 i n=0 m=1 k=1 i n=1 m=1 k=1 i n=1 m=1 k=2 i n=2 m=1 k=2 i n=3 m=1 k=2 a和b为有10个元素的整型数组 比较两数组对应元素 变量n,m,k记录a[i]b[i], a[i]==b[i], a[i]k,认为数组ab 若n main() { int a[10],b[10],i,n=0,m=0,k=0; printf(“Enter array a:\n“); for(i=0;iy) flag=1; else if(x float average(int stu[10], int n); void main() { int score[10], i; float av; printf(“Input 10 scores:\n“); for( i=0; i void swap2(int x[]) { int z; z=x[0]; x[0]=x[1]; x[1]=z; } main() { int a[2]={1,2}; swap2(a); printf(“a[0]=%d\na[1]=%d\n“,a[0],a[1]); } 地址传递 例 数组元素与 数组名作函数参数比较 Date48 void sort(int array[],int n) { int i,j,k,t; for(i=0;imax) max=array[i]; else if(array[i]y?x:y; return(z); } main() { extern int a,b; printf(“max=%d“,max(a,b)); } int a=13,b=-8; 运行结果:max=13 extern int a,b; int max() { int z; z=ab?a:b; return(z); } main() { printf(“max=%d“,max()); } int a=13,b=-8; 例 外部变量定义与说明 Date61 int a=3,b=5; /* a,b为外部变量*/ a,b作用范围 max(int a, int b) /*a,b为局部变量 */ { int c; c=ab?a:b;形参a、b作用范围 return(c); } main() { int a=8;/*a为局部变量 */局部变量a作用范围 printf(“max=%d“,max(a,b));全局变量b的作用范围 } 运行结果:max=8 例 外部变量与局部变量同名 Date62 n存储方式 n静态存储:程序运行期间分配固定存储空间 n动态存储:程序运行期间根据需要动态分配存储空间 n内存用户区 生存期 静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函 数执行结束 v 动态变量与静态变量 Date63 程序区 静态存储区 动态存储区 全局变量、局部静态变量 形参变量 局部动态变量(auto register) 函数调用现场保护和返回地址等 动态存储方式分为: Date64 静态动态 存储方式 程序整个运行期间函数调用开始至结束生存期 编译时赋初值,只赋一次 每次函数调用时 赋初值 自动赋初值0或空字符 不确定未赋初值 静态存储区 动态区存储区寄存器 局部变量外部变量 作用域定义变量的函数或复合语句内本文件其它文件 register局部staticauto外部static外部 存储类别 v 变量存储类型 Date65 u局部变量默认为auto型 uregister型变量个数受限,且不能为long, double, float型 u局部static变量具有全局寿命和局部可见性 u局部static变量具有可继承性 uextern不是变量定义,可扩展外部变量作用域 Date66 #include int i=1; main() { static int a; register int b=-10; int c=0; printf(“-----MAIN------\n“); printf(“i:%d a:%d \ b:%d c:%d\n“,i,a,b,c); c=c+8; other(); printf(“-----MAIN------\n“); printf(“i:%d a:%d \ b:%d c:%d\n“,i,a,b,c); i=i+10; other(); } other() { static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(“-----OTHER------\n“); printf(“i:%d a:%d \ b:%d c:%d\n“,i,a,b,c); b=a; } 例 变量的寿命与可见性 Date67 -------Main------ i:1 a:0 b:-10 c:0 ------Other------ i:33 a:4 b:0 c:15 -------Main----- i:33 a:0 b:-10 c:8 -------Other------- i:75 a:6 b:4 c:15 全局i1 main: a0 b:-10 register main:c0 静态 存储区 动态 存储区 other: a2 other: b0 other: c10 8 4 33 15 4 43 other: c10 6 75 15 6 Date68 5.9 内部函数和外部函数 区分根据:函数能否被其他源文件调用 vv内部函数内部函数 含义:函数只能被本文件中其他函数所调用 形式:static 类型标识符 函数名(形参表) 例如: static int fun ( int a , int b ) Date69 v外部函数 含义:可供其它文件调用 形式:在函数首部左端加extern 例如:extern int fun (int a, int b) 在需要调用此函数的文件中,用extern对函数作声明 ,表示该函数是在其他文件中定义的外部函数 。 Date70 例 有一个若干字符的字符串,今输入一个字符, 要求程序将字符串中该字符删去。用外部函数 实现。 Date71 File.c(文件1) #include void main() { extern void enter_string(char str[]); extern void detele_string(char str[],char ch); extern void print_string(char str[]);/*以上3行声明在本函 数中将要调用的在其他文件中定义的3个函数*/ char c; char str[80]; scanf(“%c“, detele_string(str,c); print_string(str); } Date72 file2.c(文件2) #include void enter_string(char str[80]) /* 定义外部函数 enter-string*/ { gets(str); /*向字符数组输入字符串*/ } Date73 file3.c(文件3) void delete_string(char str[],char ch) /*定义外部函数 delete_string */ { int i,j; for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i]; str[i]='\0'; } Date74 运行情况如下: abcdefgc↙￿￿ (输入str) c↙ ￿￿ (输入要删去的字符) abdefg (输出已删去指定字符的字符串) file4.c(文件4) #include void print_string(char str[]) { printf(“%s\n“,str); } Date75
展开阅读全文
  麦档网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:计算机软件及应用五函数PPT课件
链接地址:https://www.maidoc.com/p-15698510.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

[email protected] 2018-2020 maidoc.com版权所有  文库上传用户QQ群:3303921 

麦档网为“文档C2C模式”,即用户上传的文档所得金币直接给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的金币归上传人(含作者)所有。
备案号:蜀ICP备17040478号-3  
川公网安备:51019002001290号 


收起
展开