




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章
函数HarbinEngineeringUniversity1实例例1:计算三个数m,n,k的最大公约数。计算过程:(1)计算m,n的最大公约数r1,(2)计算r1,k的最大公约数r.
问题:计算最大公约数的过程重复两次。例2:计算组合数c
计算过程:(1)分别计算m!,n!,(m-n)!
(2)m!/(n!*(m-n)!)
问题:计算阶乘的过程重复三次。解决方法:重复的过程编成函数,需要时调用。2高效程序的编写方法3逐步分解分而治之结构化程序设计强调层次性函数函数的概念什么是函数?有独立功能的程序段。函数的结构
函数首部
函数体intgac(inta,intb){intr;r=a%b;while(r!=0){a=b;b=r;r=a%b;}returnb;}函数首部函数体
函数首部:
函数值类型函数名函数参数4函数的概念为什么使用函数?实现结构化程序设计提高程序的编写效率C程序的结构
一个主函数若干个其它函数由主函数调用其他函数其他函数可以互相调用程序从主函数开始执行5函数的概念#include<stdio.h>voidmain(){voidprintstar();
voidprint_message();printstar();
print_message();
printstar();
}voidprintstar(){printf(“**********\n");}voidprint_message(){printf("Howdoyoudo!\n");}运行结果:**********Howdoyoudo!**********6函数的概念函数的种类
库函数
printf()
自定函数printstar()
主调函数main()
被调函数printstar()#include<stdio.h>voidmain(){voidprintstar();
voidprint_message();printstar();
print_message();
printstar();
}voidprintstar(){printf(“**********\n");}voidprint_message(){printf("Howdoyoudo!\n");}7函数的概念无参函数有参函数
voidpadd(inta,intb){printf("%d",a+b);}intadd(inta,intb){intc;c=a+b;
returnc;}有返回值函数无返回值函数voidprintstar(
){printf("******\n");}voidpstar(intn){intifor(i=1;i<=n;i++)printf("*");printf("\n");}8函数的定义一般形式
类型标识符函数名(参数列表)
{声明部分执行部分}说明类型标识符:函数返回值(函数值)的类型函数名:函数的标识,用以区分于其它函数。参数列表:与主调函数之间传递的数据。
声明部分:声明函数中用到的其它数据。
执行部分:完成函数功能的语句。9函数定义—函数参数参数的作用从主调函数向被调函数传递数据。什么时候需要参数
什么样的数据作为参数
完成函数指定功能时所需的原始数据参数怎样说明
参数类型1
参数名1,参数类型2
参数名2,......如:计算两个自然数a和b的最大公约数。
a和b的值。如:计算两个自然数a和b的最大公约数。
inta,intb10函数定义—返回值(函数值)函数值的作用从被调函数向主调函数传递数据什么时候需要函数值需要向主调函数反馈数据如何实现返回值
return表达式(return(表达式))return语句的执行过程求解表达式的值;将值传递给主调函数;结束函数的执行。11函数定义—无参、无返回值函数
实例:打印输出如下图形****************分析功能确定,不需从主调函数传递数据
无参无需向主调函数传递数据
无返回值
voidphoto(){inti,j;for(i=1;i<=4;i++){for(j=1;j<i;j++)printf("");for(j=1;j<=7-2*(i-1);
j++)printf("*");printf("\n");}}12函数定义—无参、无返回值函数一般形式
类型标识符函数名(参数列表)
{声明部分执行部分}一般形式
void函数名()
{声明部分执行部分}voidphoto(){inti,j;for(i=1;i<=4;i++){for(j=1;j<i;j++)printf("");for(j=1;j<=7-2*(i-1);j++)printf("*");printf("\n");}}13函数定义—有参、无返回值函数实例:打印若干连续的星号。*****…*分析星号的数量需从主调函数传递;
有参数打印输出,无需向主调函数传递数据;
无返回值。voidpstar(intn){inti;for(i=1;i<=n;i++)printf("*");printf("\n");}14函数定义—有参、无返回值函数一般形式
类型标识符函数名(参数列表)
{声明部分执行部分}一般形式
void函数名(类型名参数名…)
{声明部分执行部分}voidpstar(intn){inti;for(i=1;i<=n;i++)printf("*");printf("\n");}15函数定义—无参、有返回值函数实例:计算5!值分析初始值确定,不需从主调函数传递数据;
无参数功能是计算,需要向主调函数传递数据;
有返回值intfun(){inti,s=1;for(i=1;i<=5;i++)s=s*i;returns;}16函数定义—无参、有返回值函数intfun(){inti,s=1;for(i=1;i<=5;i++)s=s*i;
returns;}一般形式
类型标识符函数名(参数列表)
{声明部分执行部分}一般形式
类型名
函数名()
{声明部分执行部分}17函数定义—有参、有返回值函数实例:求两个自然数的最大公约数。分析
计算所需的数据需从主调函数传递数据;有参数,两个,整型计算数值,需向主调函数传递数据;有返回值,整型intgac(inta,intb){intr;r=a%b;while(r!=0){a=b;
b=r;
r=a%b;}returnb;}18函数定义—有参、有返回值函数intgac(inta,intb){intr;r=a%b;while(r!=0){a=b;
b=r;
r=a%b;}
returnb;}一般形式
类型标识符函数名(参数列表)
{声明部分执行部分}一般形式类型名函数名(类型名参数名…)
{声明部分执行部分}19函数定义函数定义的格式类型标示符函数名(形式参数表)
{函数体}例:int
sqare(intn)
{returnn*n;}参数有参函数各参数用逗号分隔,与变量说明方法相似无参函数“形式参数表”可以为空,也可用void返回值有返回值函数1、“类型标示符”说明返回值的类型,为int时可以省略,但不提倡2、“函数体”中必须有:return表达式;3、函数的返回值应与“类型标示符”的说明一致,
兼容的转换,不兼容的发生编译错误无返回值函数1、“类型标示符”必须为void2、“函数体”中可以有:return;
也可不用2021函数间数据的传递方法形式参数:定义函数时函数名后面括号中的变量名。实际参数:调用函数时函数名后面括号中的表达式大多数情况下,主调函数和被调用函数之间有数据传递的关系。在不同的函数之间传递数据,可以使用的方法:参数:通过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量22调用函数时的数据传递#include<stdio.h>intmax(intx,inty)/*定义有参函数max*/{ intz; z=x>y?x:y; returnz;}voidmain(){ inta,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("Maxis%d",c);}23调用函数时的数据传递#include<stdio.h>voidmain(){ intmax(intx,inty);/*对max函数的声明*/ inta,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("Maxis%d",c);}intmax(intx,inty)/*定义有参函数max*/{ intz; z=x>y?x:y; returnz;}函数的返回值通过return语句获得函数中可有多个return语句注意返回值的类型函数返回值类型和return不一致怎么办?以函数返回值类型为准(转换)函数没有return也会有返回值但没有意义不返回值就明确用void2425关于形参与实参的说明在定义函数中指定的形参,在未出现函数调用时,不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。实参可以是常量、变量或表达式,如:
max(3,a+b);
但要求它们有确定的值。在调用时将实参的值赋给形参。在被定义的函数中,必须指定形参的类型。实参与形参的类型应相同或赋值兼容。26关于形参与实参的说明在C语言中,实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。函数调用#include<stdio.h>voidmain(){floatadd(floatx,floaty);floata,b,c;
scanf(“%f,%f“,&a,&b);
c=add(a,b);printf(“sumis%f\n“,c);}floatadd(floatx,floaty)
{floatz;z=x+y;
return(z);}
27函数调用1.调用函数应具备的条件
(1)被调用函数必须是已经存在的库函数或自定义函数。
(2)调用库函数时,应在本程序文件开始,用#include使用命令将调用的库函数信息包含到本程序文件中。
(3)调用自定义函数,自定义函数与主调函数在同一文件中,应主调函数的声明部分对被调用函数作声明。28函数调用—函数声明及原型2.函数声明作用:把被调用函数的名字、类型、形参的类型及数量顺序通知编译系统,以便在调用该函数时进行对照、检查。声明方式:使用函数原型。3.函数原型(1)形式:
函数类型函数名(参数类型1,参数类型2,...);
函数类型函数名(参数类型1参数名1,floatadd(float,float);floatadd(floatx,floaty);如果被调函数在出现在主调函数之前,可不必声明。29函数调用—一般形式1.形式
函数名
(实参列表
)2.说明(1)实参常量:add(2,4)变量:add(x,y)表达式:add(x+2,y+1)(2)无参函数调用函数名()#include<stdio.h>voidmain(){floatadd(floatx,floaty);
floata,b,c;
scanf(“%f,%f”,&a,&b);
c=add(a,b);printf(“sumis%f\n“,c);}floatadd(floatx,floaty)
{floatz;z=x+y;
return(z);}
30函数调用—一般形式(3)实参与形参的对应
数量顺序类型(4)数据传递实参必须有确定值;将实参值传递给形参。#include<stdio.h>voidmain(){floatadd(floatx,floaty);
floata,b,c;
scanf(“%f,%f”,&a,&b);
c=sub(a,b);printf(“sumis%f\n”,c);}floatsub(floatx,floaty)
{floatz;z=x-y;
return(z);}
31函数调用—一般过程多函数程序的执行过程1)从主函数开始执行2)执行函数调用时计算实参值;形实结合:给形参分配空间,将实参值存储其中3)执行被函数4)被调函数执行结束时,返回主调函数;5)继续执行主调函数32函数调用—一般过程main()fun()返回①②④⑥⑦计算实参形实结合③返回到调用位置⑤调fun()结束33函数调用—一般过程实参求值顺序自左至右自右至左如果按自左至右顺序求实参的值,则函数调用相当于f(2,2)。如果按自右至左顺序求实参的值,则函数调用相当于f(3,2)
。
对于函数调用inti=2,p;p=f(i,i++);34函数调用—一般过程#include<iostream.h>voidSwap(inta,intb){ intt; t=a; a=b; b=t;}voidmain(){ intx=5,y=10;
Swap(x,y); printf(“x=%d,y=%d”,x,y);}x5y10a
b
510t5105x=5y=10结论:实参向形参的数据传递是:
单向值传递35函数的调用—调用的方式1.函数语句把函数调用作为一个语句。如printstar(),这时不要求函数带回值,只要求函数完成一定的操作。
要求:无返回值函数2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。
要求:有返回值函数。36函数的调用—嵌套调用嵌套调用函数:在调用一个函数的过程中,又调用另一个函数。37函数的调用—嵌套调用例:输入两个整数,求平方和。函数1:求一个数的平方。参数:一个a。返回值:a2函数2:求两个数的平方和。参数:2个过程:调用函数1,求每个的平方值;返回值:两个数的平方和。主函数:读入两个数,调用函数2,输出两个数的平方和。38函数的调用—嵌套调用#include<stdio.h>voidmain(){inta,b,c;intfun2(intx,inty);scanf(“%d%d”,&a,&b);c=fun2(a,b);printf(“%d",c);}intfun2(intx,inty){intfun1(intm);intc;c=fun1(x)+fun1(y);returnc;}intfun1(intm){return(m*m);}39函数的调用—递归调用函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身。例:求n!分析:计算n!的公式如下:intfun(intn){if(n<0)return-1;elseif(n==0)return1;elsereturnn*fun(n-1);}40函数的调用—递归调用递归过程的两个阶段:求4!递推:
4!=4×3!→3!=3×2!
→
2!=2×1!
→1!=1×0!
→0!=1未知已知回归:4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1未知已知41函数的调用—递归调用例
:有5个人坐在一起,问第5个人多少岁?
他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁问第3个人,说比第2个人大2岁问第2个人,说比第1个人大2岁问第1个人,他说是10岁。请问第5个人多大?42可以用一个函数来描述上述递归过程:intage(intn)/*求年龄的递归函数*/{ intc;/*c用作存放函数的返回值的变量*/ if(n==1)c=10; elsec=age(n-1)+2; returnc;}用一个主函数调用age函数,求得第5人的年龄。#include<stdio.h>voidmain(){ printf("%d",age(5));}递归形式递归终止条件修改递归条件函数的调用—递归调用可用递归求解的问题的特点
1)分支结构;
2)至少一个分支的值为确定值;
3)其它分支的求解过程与原问题相同,只是规模缩小。44Hanoi(汉诺)塔问题古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。Hanoi(汉诺)塔问题将n个盘子从A座移到C座可以分解为以下3个步骤:(1)将A上n-1个盘借助C座先移到B座上。(2)把A座上剩下的一个盘移到C座上。(3)将n-1个盘从B座借助于A座移到C座上。(1)将A上n-1个盘借助C座先移到B座上ABC(1)将A上n-1个盘借助C座先移到B座上ABC(1)将A上n-1个盘借助C座先移到B座上ABC(1)将A上n-1个盘借助C座先移到B座上ABC(1)将A上n-1个盘借助C座先移到B座上ABC(2)把A座剩下的一个盘移到C座上ABC(2)把A座剩下的一个盘移到C座上ABC(3)将n-1个盘从B座借助于A座移到C座上ABC(3)将n-1个盘从B座借助于A座移到C座上ABC(3)将n-1个盘从B座借助于A座移到C座上ABC(3)将n-1个盘从B座借助于A座移到C座上ABC(3)将n-1个盘从B座借助于A座移到C座上ABCHanoi塔问题的解法分析步骤分类:(1)将n-1个盘从一个座移到另一个座上(n>1)。(2)将1个盘从一个座上移到另一座上。对应程序:(1)voidhanoi(intn,charone,chartwo,charthree) /*将n个盘从one座借助two座,移到three座*/(2)voidmove(charx,chary)/*将盘子从x座移到y座*/Hanoi塔的C语言程序voidmove(charx,chary)/*将盘子从x座移到y座*/{ printf("%c-->%c\n",x,y);}voidhanoi(intn,charone,chartwo,charthree)/*将n个盘从one座借助two座,移到three座*/{ if(n==1)move(one,three);else{ hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}Hanoi塔的C语言程序#include<stdio.h>voidmain(){ intm; printf("inputthenumberofdiskes:"); scanf("%d",&m); printf("Thesteptomoveing%ddiskes:\n",m); hanoi(m,'A','B','C');}全局变量和局部变量#include<stdio.h>inta,b;voidfun(){a=100;b=200;}voidmain(){inta=5,b=7;fun();printf("%d%d\n",a,b);}分析程序运行结果全局变量局部变量62全局变量和局部变量局部变量在函数(复合语句)内部定义的变量。全局变量在函数外部定义的变量。两种变量的区别作用域不同(作用域:变量可以被使用的范围)
全局变量:定义点至源程序文件结束。局部变量:定义点至本函数(复合语句)结束63全局变量和局部变量#include"stdio.h"voidmain(){inta,b;scanf("%d%d",&a,&b);if(a<b){intt;t=a;a=b;b=t;}printf("%d,%d\n",a,b);}#include<stdio.h>
inta,b;voidfun(){a=100;b=200;}voidmain(){inta=5,b=7;fun();printf("%d%d\n",a,b);}64全局变量和局部变量#include<iostream.h>intx=5,y=10;voidSwap(){ intt; t=x; x=y; y=t;}voidmain(){ Swap(); printf(“x=%d,y=%d”,x,y);}分析程序运行结果65全局变量和局部变量关于局部变量(1)主函数中定义的变量(m,n)也只在主函数中有效,主函数不能使用其他函数中定义的变量。(4)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。(2)形式参数也是局部变量。(3)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,。66全局变量和局部变量关于全局变量全局变量可以在函数之间定义
作用域从声明点开始至源文件尾结束(4)在不必要时不要使用全局变量:(2)全局变量可以与局部变量同名
作用域重叠时,局部变量可见。(3)使用全局变量可以在不同的函数中传递数据。(5)全局变量定义时,若不初始化,值为0.67重新认识一下变量的定义变量定义格式:
[存储类型]数据类型变量表;变量的存储类型auto -----自动型register-----寄存器型static ------静态型extern-----外部型变量的存储类别变量的存储方式静态存储方式:在程序运行期间由系统分配固定的存储空间。
如:全局变量动态存储方式:在程序运行期间根据需要进行动态的分配存储空间。如:形式参数程序存储空间的组成:程序区:存储程序静态存储区:存储静态变量动态存储区:存储动态变量69变量的存储类别局部变量的存储类别静态局部变量:
使用static定义的变量
在静态存储区分配空间。自动变量:
未用static定义的变量在动态存储区分配空间。寄存器变量:#include<stdio.h>intf(inta){autointb=0;
staticintc=3;b=b+1;c=c+1;return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}70变量的存储类别#include<stdio.h>voidmain(){
intfac(intn);inti;
for(i=1;i<=5;i++)
printf(“%d\n”,fac(i));}intfac(intn){
staticintf=1;
f=f*n;
return(f);
}分析程序运行结果71变量的存储类别关于静态局部变量对静态局部变量是在编译时赋初值的,即只赋初值一次。如定义静态局部变量时不赋初值,编译时自动赋初值0(或空格)。静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它的。72变量的存储类别全局变量的存储类别外部变量:
用extern声明的全局变量。
用于扩展全局变量的使用域静态外部变量:用static声明的全局变量。
用于限制全局变量的使用域#include<stdio.h>voidmain(){intmax(int,int);intc;
externA,B;c=max(A,B);printf("%d\n",c);}
intA=13,B=-8;
intmax(intx,inty){intz;z=x>y?x:y;return(z);}73在多个文件的程序中声明外部变量文件file1.c中的内容为:/*定义外部变量*/inta;intb;文件file2.c中的内容为:#include<stdio.h>#include<stdlib.h>#include"file1.c"intmain(){ externa,b;a=1,b=2;printf("%d,%d\n",a,b);system("pause");}用static声明外部变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- D打印技术在个性化教育资源的开发考核试卷
- 期刊出版论文的开源出版趋势考核试卷
- 教育音像制品策划与制作考核试卷
- 文具行业个性化服务考核试卷
- 工业园区电动汽车充电需求分析考核试卷
- 健康生活方式与营养健康考核试卷
- 个人培训课件大全
- 买杭州新房合同范本
- 私人店铺租赁合同范本
- 2025届吉林省吉林地区高三上学期二模英语试题及答案
- GB/T 15934-2008电器附件电线组件和互连电线组件
- GA/T 765-2020人血红蛋白检测金标试剂条法
- 第2章-西周-春秋战国时期的音乐-1-3节课件
- 提高白云石配比对烧结生产的影响
- 公安基础知识考试题库(含各题型)
- 选矿试车方案
- 小课题专题研究参考题目
- 《最好的未来》合唱曲谱
- GB∕T 8081-2018 天然生胶 技术分级橡胶(TSR)规格导则
- 教学课件个人理财-2
- 航空航天概论(课堂PPT)
评论
0/150
提交评论