C语言程序设计第6章函数.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计第6章函数.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 函数
- 资源描述:
-
1、第6章 函数学习目标学习目标本章内容中我们将学习1用函数处理简单模块化问题2用函数处理数组中的模块化问题3函数的递归调用4函数的嵌套调用6.1函数的定义、调用及简单应用函数的定义、调用及简单应用 l学一学学一学 1函数定义的一般格式类型标识符 函数名(形式参数列表)声明部分 语句部分 此时称函数为有参函数,形式参数列表中的参数被称为形式参数,简称形参。有些函数可以没有参数,即:类型标识符 函数名()声明部分 语句部分 此时称函数为无参函数。学一学2函数的使用步聚函数在使用之前要先声明、定义,然后才能调用。3函数的调用根据函数是否具有返回值,将函数分为两类:有返回值的函数和没有返回值的函数。调用
2、没有返回值的函数时,只需要将函数做为一条语句处理即可:函数名(实参列表);其中实参列表中的参数称为实际参数,简称为实参。调用有返回值的函数时,有以下三种方式:1)把函数返回值赋给调用函数中的某个变量,即变量=函数名(实参列表);2)函数出现在一个表达式中参与运算,这种表达式称为函数表达式。3)函数调用作为一个函数的实参,实质上也是函数表达式调用的一种,因为函数的参数本来就要求是表达式形式。试一试l问题问题6.1:请在屏幕上输出一行15个”*”,如下图形所示*【解题步骤】1声明一个函数fnPrint;2在main()中调用fnPrint函数。fnPrint函数中算法如下:1定义一个循环变量;2构
3、造循环,每次输出一个*。流程图程序代码#include“stdio.h”void fnPrint();/*函数声明*/void fnPrint()/*函数定义*/int i;/*函数体部分*/for(i=0;i15;i+)printf(“*”);void main()fnPrint();/*调用函数*/试一试问题问题6.2:拓展问题4.1,输出3行,第一行3个,以后每行增加3个,输出图形如下:*分析:每行中输出的*个数分别是3、6、9,因为print函数的功能输出不确定个数的”*”,其具体的个数由主函数中的实参决定。【解题步骤】1声明一个函数fnPrint;2在main()中分别使用3、6、9
4、做实参调用fnPrint函数。fnPrint函数中算法如下:1设计形参为输出的*号的个数;2构造循环,输出多个*。流程图 【程序代码】#include“stdio.h”void fnPrint();/*函数声明*/void fnPrint(int n)/*函数定义*/int i;/*函数体部分*/for(i=0;iiNum2)return iNum1;/*将大值返回到调用函数处*/else return iNum2;void main()int iNum1,iNum2;printf(“nplease input two number:”);scanf(“%d%d”,&iNum1,&iNum2)
5、;printf(“the max of%d and%d is%d”,iNum1,iNum2,fnMax(iNum1,iNum2);练一练练一练l1拓展问题拓展问题6.3,分别编写函数求,分别编写函数求2个数的加、减、乘、除及余数。个数的加、减、乘、除及余数。l2编写一个函数,求编写一个函数,求n!。问题问题6.5问题问题6.5:相传古代印度国王舍罕要褒奖他的聪明能干的宰相达依尔(国际象棋发明者),问他需要什么,达依尔回答说:“国王只要在国际象棋的棋盘上第一个格子放一粒麦子,第二个格子放上二粒,第三个格子放四粒,以此类推,每一格加一倍,一直放到64格,我就感恩不尽了”。国王答应了,结果全印度的粮
6、食用完还不够。国王很纳闷,怎么也算不清这笔账。现在我们用C编程来算一下(1立方米数小麦大约1.42108 粒)。分析:第一格的麦子数1,即2的0次幂,第二格的麦子数是2,即2的1次幂,第3格的麦子数是4,即2的2次幂,依次类推,第64格的麦子数即2的63次幂,因此要求所放麦子的总数,应先求每个格子所放麦子数,即转化为求2n次幂的问题,因此可以将求2n次幂转化为一函数,避免代码的重复编写。【解题步骤】1定义一个累加变量dSum=0;2构造循环,以第几个格子做实参调用函数,将每格所放的麦子数计算出来并累加到dSum中;3输出总麦子数。函数中算法如下:1设计形参,接收格子数,定义一个s=1;2构造循
7、环,调用函数将每格所放的麦子数计算出来并累加到s中;3输出总麦子数。流程图程序代码#include“stdio.h”double fnPower(int iNum);double fnPower(int iNum)double s=1;int i;for(i=0;iiNum;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 s
8、um of wheat is%f”,dVol);练一练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=%dn”,a,b);void main()int a,b;a=1;b=2;
9、printf(“before call function:a=%d,b=%dn”,a,b);swap(a,b);printf(“after call function:a=%d,b=%dn”,a,b);小结:小结:函数使用的步骤1.函数声明:函数的使用有三大步骤:声明、定义和调用。被调用的函数需先声明后调用。但若定义位于调用前面,可省掉声明。为统一或标准化起见,一般将自定义的所有函数都在程序前面予以声明。函数定义:用C语句,或调用其它函数实现它的功能。函数调用。小结:函数的定义2无参函数的定义:类型标识符 函数名()声明部分 语句部分 有参函数的定义:类型标识符 函数名(形式参数列表)声明部分
10、 语句部分 例如:void fnPrint()即为无参函数,void fnPrint(int n)即为有参函数,fnPrint为函数名,void为函数的类型,即返回值的类型,void代表函数没有返回值,如果没有定义函数的类别,默认函数的类型为整型。小结:函数的形参与实参(1)在函数定义时说明的参数叫做形参,在函数调用时使用的参数叫做实参。例如:int fnMax(int iNum1,int iNum2)中,iNum1和iNum2即形参,定义形参时即说明形参的数据类型,多个形参之间用逗号隔开,形参为函数内定义的参数,为局部变量,只在函数执行时才有意义。函数执行完毕后,即释放该参数。iNum3=f
11、nSum(iNum1,iNum2)中,iNum1和iNum2即实参,是函数调用时使用的参数。实参可以是常量、变量、表达式或函数,无论实参是何种类型的数据,在执行函数调用时,必须有明确的值,以便把值传给形参。(2)在函数调用时,将实参的值复制一份,传递给形参,这种参数的传递方式称为值传递。变量做函数参数时是单向的值传递,只能从实形向形参传递,而不能由形参传回实参。(3)实参与形参占用不同的内存单元,即使同名也不影响。小结:函数的返回值函数可以比做一个加工厂,主函数比做一个公司,公司可以委拖加工厂对零件进行加工,在委托前应确定加工厂的性质,是手工的还是机械的,即函数的类型,送去的零配件即函数实参,
12、加工的过程其实就是函数的功能,公司只要最后的成品,即函数返回值。函数返回值用return语句实现,格式为:return();return语句的执行过程是先计算表达式的值,再将计算的结果返回给主调函数。小结:函数的调用分为有返回值的函数调用和无返回值的函数调用两种。(1)无返回值函数的调用:函数名(参数列表);当函数调用不需要返回值的时候,可由函数调用加上分号(;)实现,该函数调用作为一个独立语句使用。例如:fnPrint(3);(2)有返回值函数的调用可以有如下几种格式:把函数返回值赋给调用函数中的某个变量,即变量=函数名(实参列表);例如:iNum3=fnSum(iNum1,iNum2);将
13、函数的值赋给变量iNum3。函数出现在一个表达式中参与运算,这种表达式称为函数表达式。例如:printf(“the max of%d and%d is%d”,iNum1,iNum2,fnMax(iNum1,iNum2)中将函数调用做为一个表达式的值在printf函数中输出。函数调用作为一个函数的实参,实质上也是函数表达式调用的一种,因为函数的参数本来就要求是表达式形式。例如:iNum=fnMax(fnMax(iNum1,iNum2),fnMax(iNum3,iNum4),首先计算fnMax(iNum1,iNum2)和fnMax(iNum3,iNum4)的值,即两次调用函数fnMax(),计算完
14、后把函数的返回值再次做为fnMax()函数实参,再次调用函数fnMax(),计算最后结果是求四个数的最大值。数组作函数参数的应用数组作函数参数的应用学一学学一学1.数组元素做函数的实参数组元素做函数的实参数组元素做函数的实参,与其它同类数组元素做函数的实参,与其它同类型普通变量做实参并没有区别,在发型普通变量做实参并没有区别,在发生函数调用时,把数组元素的值传递生函数调用时,把数组元素的值传递给形参,实现单向值。其调用方式同给形参,实现单向值。其调用方式同普通变量一样。普通变量一样。试一试 问题问题6.6从键盘上输入一串字符,编写一个函数,统计字符串中小写字母的个数。分析:函数中只要判断字符是
15、否小写字母,如果是,则返回1,如果不是,返回0。在主函数中构造循环,以数组中每个元素为实参,调用函数。【解题步骤】1定义一个字符型数组,存放字符串;2定义一个整型变量用来保存小写字母的个数;3输入字符数组的值;4构造循环,以单个字符为实参调用函数计算字符串中小写字母的个数;5输出小写字母的个数。函数中的算法如下:1设计形参为单个字符;2判断字符变量是否小写字母,如果是,返回1,否则,返回0。流程图程序代码#include“stdio.h”int fnCount(char chChar);int fnCount(char chChar)if(chChar=a&chChar=z)/*判断字符cCh
16、ar是否是小写字母*/return 1;/*返回值1*/else return 0;void main()int iCount=0,i;char chString10;gets(chString);/*输入字符串*/for(i=0;chStringi!=0;i+)iCount+=fnCount(chStringi);/*计数累加*/printf(“n the sum of character is%d”,iCount);getch();练一练1.学院举行数据库大赛,有10名同学参赛,从键盘上输入每个同学的比赛成绩(百分制),编写函数,输出对应1,2,3等奖。(假定:90分以上为1等奖,80-9
17、0分之间为2等奖,60-80分之间3等奖)提示:将每个同学的参赛成绩做为函数的实参。在函数中构造一个形参,对每个形参进行判断,如果大于90分,返回值1,如果大于80分,小于90分,返回值2,如果大于60分,小于80分,返回值3.在主函数中,调用函数根据返回值分别输出一、二、三等奖。学一学学一学1数组名做函数的实参与形参数组名做函数参数时,既可以是形参,也可以做实参,要求形参和对应的实参都必须是类型相同的数组(或指向同类型数组的指针变量),并且都必须有明确的数组定义。2.地址传递数组名不但代表数组元素的共同名字,而且代表数组的首地址,即数组中第一个元素的地址,所以数组名作参数传递时,传递给形参的
18、是实参数组的首地址,换句话说,采用的不是“值传递”而是“地址传递”,即把实参的地址传递给形参。试一试试一试问题问题6.7学校举行知识竞赛,有10个学生参赛,请编写一个函数,求平均分。分析:函数的功能是求10个数的平均值,需要将平均值返回到调用函数中,因而,函数的类型应为平均值的类型,参数是10个学生的参赛成绩。【解题步骤】1定义一个float型数组,存放10个学生的参赛成绩;2定义一个float型变量存放平均分;3循环输入10个学生的比赛成绩;4以数组名为实参调用函数计算平均分,并将函数的返回值赋给平均分变量;5输出平均分。函数中的算法如下:1设计一个数组接收10个学生参赛成绩,定义一个变量f
19、Sum保存10个学生的总分,并赋初值为0;2构造一个循环将每个学生的分数累加到fSum中;3返回fSum/10的值。流程图程序代码#include“stdio.h”float fnAvg(float fScore110);float fnAvg(float fScore110)float fSum=0;int i;for(i=0;i10;i+)fSum=fSum+fScore1i;return fSum/10;/*返回平均值*/void main()int i;float fScore10,fAvg;for(i=0;i10;i+)scanf(“%f”,&fScorei);fAvg=fnAvg(
20、fScore);/*以数组名为实参调用函数*/printf(“n the sum of sugar is%f”,fAvg);getch();试一试问题问题6.8某系要选拔身高较高的同学,有N名同学参加选拔,请你将身高输入电脑,编写函数将身高按从低到高进行排序,并且输出排序后的结果。【解题步骤】1定义一个int型数组,存放N个学生的身高;2循环输入N个学生的身高;3调用函数将身高按从低到高进行排序;4输出排好序的身高。函数中的算法如下见问题问题6.5:流程图程序代码#include“stdio.h”#define N 10void fnSort(int iStu);void fnSort(int
21、 iStu)int i,k,t;for(k=1;k=k;i-)if(iStuiiStui-1)t=iStui;iStui=iStui-1;iStui-1=t;/*两个相邻的数交换*/void main()int i;int iGaoN;for(i=0;iN;i+)scanf(“%d”,&iGaoi);fnSort(iGao);/*以iGao为实参调用函数*/for(i=0;iN;i+)printf(“%d”,iGaoi);getch();练一练1拓展问题6.6,使用数组名作函数的实参和形参,实现问题6.6中求字符串中字符的个数。2.拓展问题6.7,分别编写两个函数求10个参赛学生中最高分和最低
22、分,在主函数中调用两个最高分最低分函数,并输出。3.编写函数实现从键盘上输入两个字符串。试一试问题问题6.9拓展问题6.8,参加选拔的学生中有一人退出了。请输入这个学生的身高,将这个同学的身高从排好序的数组中删除。分析:在此题中存在二个未知数,一个是数组,表示所有学生的身高,一个是退出的学生的身高,因此,函数的参数有两个。【解题步骤】1定义一个int型数组,存放n个学生的身高;2循环输入n个学生的身高;3.输入退出的学生的身高;4以数组名和退出学生身高做实参,调用函数将退出学生的身高从数组中删除;5在主函数输出所有学生的身高。函数中的流程如下:1.定义两个形参,一个保存所学生的身高,一个保存退
展开阅读全文