C语言程序设计第6章函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题6.4
问题6.4:从键盘上输入两个同学的身高,通过调用函数, 输出较高的同学的身高。 【解题步骤】 1.定义两个变量iNum1,iNum2保存输入的数据; 2.调用函数以iNum1,iNum2为实参,求两个数的较大值; 3.输出两个数的较大值。 函数中算法如下: 1.设计两个形参 2.判断两个数的大小,如果第一个数大,则返回第一个 数;否则返回第二个数。
【解题步骤】
1.定义一个累加变量dSum=0; 2.构造循环,以第几个格子做实参调用函数,将 每格所放的麦子数计算出来并累加到dSum中; 3.输出总麦子数。 函数中算法如下: 1.设计形参,接收格子数,定义一个s=1; 2.构造循环,调用函数将每格所放的麦子数计算 出来并累加到s中; 3.输出总麦子数。
小结:函数的形参与实参
(1)在函数定义时说明的参数叫做形参,在函数调用时使用的参数 叫做实参。 例如:int fnMax(int iNum1,int iNum2)中,iNum1和iNum2即形参,定 义形参时即说明形参的数据类型,多个形参之间用逗号隔开,形参 为函数内定义的参数,为局部变量,只在函数执行时才有意义。函 数执行完毕后,即释放该参数。 iNum3=fnSum(iNum1,iNum2)中,iNum1和iNum2即实参,是函数调 用时使用的参数。实参可以是常量、变量、表达式或函数,无论实 参是何种类型的数据,在执行函数调用时,必须有明确的值,以便 把值传给形参。 (2)在函数调用时,将实参的值复制一份,传递给形参,这种参数 的传递方式称为值传递。变量做函数参数时是单向的值传递,只能 从实形向形参传递,而不能由形参传回实参。 (3)实参与形参占用不同的内存单元,即使同名也不影响。
N
i<=15
Y
输出1个*
i++
fnPrint结束
程序代码
#include “stdio.h” void fnPrint(); void fnPrint() { int i; for(i=0;i<15;i++) printf(“*”); } void main() { fnPrint(); }
/*函数声明*/ /*函数定义*/ /*函数体部分*/
小结:函数的返回值
函数可以比做一个加工厂,主函数比做一个公司, 公司可以委拖加工厂对零件进行加工,在委托 前应确定加工厂的性质,是手工的还是机械的, 即函数的类型,送去的零配件即函数实参,加 工的过程其实就是函数的功能,公司只要最后 的成品,即函数返回值。函数返回值用return语 句实现,格式为: return (<表达式>); return语句的执行过程是先计算表达式的值,再将 计算的结果返回给主调函数。

流程图
fnSum开始
开始
定义iSum iSum=iNumber1+iNumber2
定义iNum1,iNum2,iNum3 输入iNum1,iNum2
iNum3=fnSum(iNum1,iNum2)
返回iSum
输出 iNum1,iNum2,iNum3 结束
fnSum结束
【程序代码】
#include “stdio.h” int fnSum(int iNumber1,int iNumber2); int fnSum(int iNumber1,int iNumber2) { int iSum; iSum=iNumber1+iNumber2; return iSum; /*将isum的值返回到调用函数处*/ } void main() { int iNum1,iNum2,iNum3; printf(“\nplease input two number:”); scanf(“%d%d”,&iNum1,&iNum2); iNum3=fnSum(iNum1,iNum2); /*将fnSum函数的返回值赋给iNum3*/ printf(“the sum of %d and %d is %d”,iNum1,iNum2,iNum3); }
小结:函数使用的步骤
1. •函数声明:函数的使用有三大步骤:声 明、定义和调用。被调用的函数需先声明 后调用。但若定义位于调用前面,可省掉 声明。为统一或标准化起见,一般将自定 义的所有函数都在程序前面予以声明。 •函数定义:用C语句,或调用其它函数实 现它的功能。 • 函数调用。
小结:函数的定义
第6章 函数
学习目标
本章内容中我们将学习 1用函数处理简单模块化问题 2用函数处理数组中的模块化问题 3函数的递归调用 4函数的嵌套调用
6.1函数的定义、调用及简单应用
学一学 1.函数定义的一般格式 类型标识符 函数名( 形式参数列表 ) { 声明部分 语句部分 } 此时称函数为有参函数,形式参数列表中的参数被称为形式参数,简 称形参。有些函数可以没有参数,即: 类型标识符 函数名( ) { 声明部分 语句部分 } 此时称函数为无参函数。
学一学
2.函数的使用步聚 函数在使用之前要先声明、定义,然后才能调用。 3.函数的调用 根据函数是否具有返回值,将函数分为两类:有返回值的函数和没有返 回值的函数。 调用没有返回值的函数时,只需要将函数做为一条语句处理即可: 函数名 (实参列表); 其中实参列表中的参数称为实际参数,简称为实参。 调用有返回值的函数时,有以下三种方式: 1)把函数返回值赋给调用函数中的某个变量,即 变量=函数名(实参列表); 2)函数出现在一个表达式中参与运算,这种表达式称为函数表达式。 3)函数调用作为一个函数的实参,实质上也是函数表达式调用的一种, 因为函数的参数本来就要求是表达式形式。
试一试
问题6.1:请在屏幕上输出一行15个”*”,如 下图形所示 ************** 【解题步骤】 1.声明一个函数fnPrint; 2.在main()中调用fnPrint函数。 fnPrint函数中算法如下: 1.定义一个循环变量; 2.构造循环,每次输出一个*。

流程图
fnPrint开始 定义i=0
2.无参函数的定义:类型标识符 函数名( ) { 声明部分 语句部分 } 有参函数的定义:类型标识符 函数名( 形式参数列表 ) { 声明部分 语句部分 } 例如:void fnPrint()即为无参函数,void fnPrint(int n)即为 有参函数,fnPrint为函数名,void为函数的类型,即返 回值的类型,void代表函数没有返回值,如果没有定义 函数的类别,默认函数的类型为整型。
/*调用函数*/
试一试
问题6.2:拓展问题4.1,输出3行,第一行3个,以后每行增加3个,输 出图形如下: *** ****** ********* 分析:每行中输出的*个数分别是3、6、9,因Baidu Nhomakorabeaprint函数的功能输出 不确定个数的”*”,其具体的个数由主函数中的实参决定。 【解题步骤】 1.声明一个函数fnPrint; 2.在main()中分别使用3、6、9做实参调用fnPrint函数。 fnPrint函数中算法如下: 1.设计形参为输出的*号的个数; 2.构造循环,输出多个*。
练一练
1.拓展问题6.3,分别编写函数求2
个数的加、减、乘、除及余数。 2.编写一个函数,求n!。
问题6.5
问题6.5:相传古代印度国王舍罕要褒奖他的聪明能干的 宰相达依尔(国际象棋发明者),问他需要什么,达依 尔回答说:“国王只要在国际象棋的棋盘上第一个格子 放一粒麦子,第二个格子放上二粒,第三个格子放四粒, 以此类推,每一格加一倍,一直放到64格,我就感恩不 尽了”。国王答应了,结果全印度的粮食用完还不够。 国王很纳闷,怎么也算不清这笔账。现在我们用C编程 来算一下(1立方米数小麦大约1.42×108 粒)。 分析:第一格的麦子数1,即2的0次幂,第二格的麦子数 是2,即2的1次幂,第3格的麦子数是4,即2的2次幂, 依次类推,第64格的麦子数即2的63次幂,因此要求所 放麦子的总数,应先求每个格子所放麦子数,即转化为 求2n次幂的问题,因此可以将求2n次幂转化为一函数, 避免代码的重复编写。
流程图
开始
fnPower开始 定义i=0,s=1
定义i=1
定义dVol,dEvery,dSum
dSum=0
i<=iNum
Y
N
i<=64
Y
N
dEvery=fnPower(i);
dSum=dSum+dEvery
s=s*2 i++ 返回iNum2
i++
dVol= dSum/1.42e8;
输出dVol
fnPower结束
练一练
1.拓展问题6.5,如果每格中所放的麦子不是2,而应该是由键盘上输入的任意一 个数,应该怎么编程。 提示:因为每格所放麦子数是未知数,函数的参数变成两个,一个参数表示每格 所放麦子数,另外一个表示第几格。即:double fnPower(int iNum1,int iNum2) 2.查看下面程序的执行结果: #include “stdio.h” void swap(int a,int b) { int t; t=a; a=b;b=t; printf(“in the function:a=%d,b=%d\n”,a,b); } void main() { int a,b; a= 1; b=2; printf(“before call function:a=%d, b=%d\n”,a,b); swap(a,b); printf(“after call function:a=%d, b=%d\n”,a,b); }
流程图
fnMax开始
N
开始
定义iNum1,iNum2,iNum3
iNum1>iNum2
Y
输入iNum1,iNum2
返回iNum1
返回iNum2
fnMax(iNum1,iNum2)
输出iNum1,iNum2, fnMax(iNum1,iNum2)
fnMax结束
结束
【程序代码】
#include “stdio.h” int fnMax(int iNum1,int iNum2); int fnMax(int iNum1,int iNum2) { if(iNum1>iNum2) return iNum1; /*将大值返回到调用函数处*/ else return iNum2; } void main() { int iNum1,iNum2; printf(“\nplease input two number:”); scanf(“%d%d”,&iNum1,&iNum2); printf(“the max of %d and %d is %d”,iNum1,iNum2,fnMax(iNum1,iNum2)); }
试一试
问题6.3:请编写一个小计算器的求和函数,从键盘上 输入两个数据,输出两数之和。 【解题步骤】 1.定义两个变量iNum1,iNum2保存输入的数据; 2.以iNum1,iNum2为实参调用函数求两个数之和; 3.输出两个数之和。 函数中算法如下: 1.设计两个形参, 2.定义变量iSum保存两个数的和; 3.计算两个数的和,并保存到iSum中; 4.返回iSum的值。
结束
程序代码
#include “stdio.h” double fnPower(int iNum); double fnPower(int iNum) { double s=1; int i; for (i=0;i<iNum;i++) s=s*2; return s; } void main() { double dSum=0,dEvery,dVol; int i; for(i=0;i<=64;i++) { dEvery=fnPower(i); /*以i为实参调用fnPower函数*/ dSum=dSum+dEvery; } dVol= dSum/1.42e8; printf(“the sum of wheat is %f”,dVol); }
流程图
fnPrint开始 定义i=0
开始
i<=n
Y N
调用fnPrint(3)
输出1个*
调用fnPrint(3)
i++
调用fnPrint(3)
fnPrint结束
结束
【程序代码】
#include “stdio.h” void fnPrint(); /*函数声明*/ void fnPrint(int n) /*函数定义*/ {int i; /*函数体部分*/ for(i=0;i<n;i++) printf(“*”); } void main() { fnPrint(3); /*调用函数*/ fnPrint(6); /*调用函数*/ fnPrint(9); /*调用函数*/ }
相关文档
最新文档