书签 分享 收藏 举报 版权申诉 / 69
上传文档赚钱

类型C语言程序设计第6章函数.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3377122
  • 上传时间:2022-08-25
  • 格式:PPT
  • 页数:69
  • 大小:795.50KB
  • 【下载声明】
    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.定义两个形参,一个保存所学生的身高,一个保存退

    23、出学生的身高;2.构造循环,对每个身高进行比较,是否等于退出学生身高,如果相等的话,将后面学生依次前移一个位置。流程图程序代码#include“stdio.h”#define N 10 void fnDelete(int iStu,int num)int i,k;for(i=0;iN-1;i+)if(iStui=num)/*判断删除的位置*/for(k=i;kN-1;k+)iStuk=iStuk+1;/*删除位置后每个元素往前移动一个*/break;void main()int i,iNum;int iGaoN;for(i=0;iN;i+)scanf(“%d”,&iGaoi);scanf(“%

    24、d”,&iNum);fnDelete(iGao,iNum);/*调用删除数据的函数*/for(i=0;iN-1;i+)printf(“%d”,iGaoi);getch();想一想1拓展问题6.8,后来又来了一个同学参加身高选拔,请将这个同学的身高插入到已经排好序的队伍当中,请编写函数实现这一过程。(可参考第5章的问题5.6)2.编写一个小的程序,使之能够具有增加、删除、排序、查找等功能,并可选择性的多次操作?小结:数组做函数的参数的两种方式:数组元素做函数的实参;数组名做函数的实参和形参。(1)数组元素是一个变量,数组元素做实参与普通变量做实参的情况类似,是把数组元素值复制一份,拷贝给形参,形

    25、参的值不能传回实参,实参与形参之间是单向的值传递的关系。例:在问题6.6中,函数调用语句iCount+=fnCount(chStringi);中,把chStringi的值复制一份,传递给函数定义中的变量chChar,在函数中完成对chChar变量的运量。(2)数组名可以做函数的实参和形参,数组名代表数组在内存中的首地址,因此,实参与形参之间采用地址传递,实参可以将数据传递给形参,形参对数据操作后,将修改后的值返回到实参。例:在问题6.7中,定义了int型数组iGaoN,在函数调用语句fnSort(iGao)中,用iGao即数组名作实参,将数组的首地址传递给形参,在函数void fnSort(i

    26、nt iStu)中,对数组iStu进行排序后,将排好序的数组返回到调用函数处,因此在主函数中,打印出来的iGao数组即是排好序的数组。数组名做函数的参数需要注意以下几点:用数组名做函数参数,应该在调用函数和被调用函数中分别定义数组,且数组类型必须一致,否则,结果会出错。C语言编译系统对形参数组大小不做检查,所以形参数组可以不指定大小,如果指定形参数组的大小,则实参数组的大小必须大于形参数组,否则,形参数组中会有部分元素没有确定的值,而导致计算错误。小结:值传递与地址传递(1)值传递的特点:实参与形参各自占据独立的存储单元。调用时,将实参的值传入形参单元。在被调用的函数内,访问相应的形参单元。函

    27、数调用结束后,释放形参单元。(2)地址传递的特点:数组名作参数,是将实参数组的首地址传给形参数组,从而使形参数组与实参数组共用同一段内存空间,所以,形参数组元素的值发生变化,即实参数组元素的值发生变化。形参数组的长度可以不定义,如果要定义数组长度,那么长度必须小于实参数组长度。函数的嵌套调用与递归调用 1.函数的嵌套函数的嵌套就函数定义而言,就函数定义而言,C语言不支持函数的嵌套定义,即在定语言不支持函数的嵌套定义,即在定义一个函数时不能在函数体内再定义另一个函数,因此,义一个函数时不能在函数体内再定义另一个函数,因此,所有的函数定义都是平行的。但就函数调用来说,所有的函数定义都是平行的。但就

    28、函数调用来说,C语语言支持嵌套的函数调用。言支持嵌套的函数调用。函数的嵌套调用是指,在执行被调用函数时,被调用函数函数的嵌套调用是指,在执行被调用函数时,被调用函数又调用了其它函数。又调用了其它函数。2.函数的递归函数的递归函数的递归调用是指,一个函数在它的函数体内,直接或函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用该函数本身,能够递归调用的函数是一种递间接地调用该函数本身,能够递归调用的函数是一种递归函数。显然,递归调用是嵌套调用的特例归函数。显然,递归调用是嵌套调用的特例 试一试试一试问题问题6.10编程计算s=1!+2!+3!+20!的值。分析:观察表达式可以得知,应先计

    29、算n!,然后再计算阶乘之和,所以应该有两个函数,一个函数计算n!,另外一个函数计算阶乘之和。【解题步骤】1定义一个长整型变量保存阶乘之和;2以长整型变量作实参调用函数求阶乘之和;3输出阶乘之和。求阶乘之和的函数的算法:1定义一个长整型变量lSum保存阶乘之和;2构造循环,分别调用函数求1-n的阶乘并累加到lSum中;3将lSum返回到调用函数。求阶乘的函数的算法:1设计一个长整型变量为形参,定义一个长整型变量lFact保存阶乘之和,赋初值为1;2构造循环,将1-n的乘积并累乘到lFact中;3将lFact返回到调用函数。流程图fnFact结束定义i=1,lFact=1i=nlFact=lFac

    30、t*ii+fnFact开始YN返回lFact定义i=1,lSum=0i=ni+fnFactSum开始YN返回lSumfnFactSum结束lSum+=fnFact(i)开始 定义iNum,lFactSum结束输入iNumlFactsum=fnFactSum(iNum)输出iNum,lFactsum程序代码l#include llong fnFact(int n)l int i;l long lFact=1;l for(i=1;i=n;i+)l lFact=lFact*i;l return lFact;lllong fnFactSum(int n)l int i;l long lSum=0;l

    31、for(i=1;i=n;i+)l lSum+=fnFact(i);/*调用fnFact函数*/l return lSum;llvoid main()l int iNum;l long lFactsum;l printf(nInput a number(=12):);l scanf(%d,&iNum);l lFactsum=fnFactSum(iNum);/*调用fnFactSum函数*/l printf(n1!+2!+3!+%d!=%ldn,iNum,lFactsum);l试一试l问题问题6.11有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人多少岁?他说比第3个人大2岁。

    32、问第3个人多少岁?他说比第2个人大2岁。问第2个人多少岁?他说比第1个人大2岁。问第1个人多少岁?他说是10岁。请问第5个人多大。l分析:要求第5个人的年龄就比须先知道第4个人的年龄,而第4个人的年龄也不知道,要求第4个人的年龄,就比须知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄又取决于第一个人的年龄,每一个人的年龄又比前一个人大2岁,即:lfnAge(5)=fnAge(4)+2lfnAge(4)=fnAge(3)+2lfnAge(5)=fnAge(2)+2lfnAge(5)=fnAge(1)+2lfnAge(1)=10解题步骤【解题步骤】1.主函数中调用求年龄函

    33、数,计算第5个人年龄并输出。求年龄函数的算法:1定义一个整型变量保存年龄;2.判断是否为第一个人,如果是第一个,则年龄=10,否则继续调用年龄函数。流程图fnAge开始fnAge结束iAge=10N是否为1NYiAge=fnAge(n-1)+2返回iAge程序清单#include int fnAge(int n);int fnAge(int n)/*定义递归函数*/int iAge;if(n=1)iAge=10;/*终止条件*/else iAge=fnAge(n-1)+2;/*递归调用*/return iAge;void main()printf(第5个人的年龄是%dn,fnAge(5);练一

    34、练练一练练一练13个同学进行踢毽子比赛,编写一个函数,求出踢的个数最多和最少的差。提示:分别编写二个函数求三个数的最大和最小值。然后再编写一个函数,调用最大值和最小值函数求差,将求差的结果返回。2利用递归求n!。提示:n!可以写成递归公式:fact(n)=1 n=1或者n=0 fact(n)=fact(n-1)*n n1小结:函数嵌套调用lC语言不支持函数的嵌套定义,所有的函数定义都是平行的。但就函数调用来说,C语言支持嵌套的函数调用。嵌套调用为结构化程序设计提供了基本的支持。l调用函数的特点:l(1)无论函数在何处被调用,调用结束后,其流程总是返回到调用该函数的地方。l(2)C语言支持多层函

    35、数调用。小结:函数的递归调用l函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用该函数本身,能够递归调用的函数是一种递归函数。语言的特点之一是允许函数的递归调用。显然,递归调用是嵌套调用的特例。说明如下:l(1)递归函数主要用于解决具有递归性质的问题。l(2)C语言编译系统对递归函数自调用次数没有限制,但是通常情况下,递归过程不是无限制的进行下去,每个递归函数应确定函数的出口,即结束递归调用的条件。例如问题6.11中,n=1即是本递归的出口条件。l(3)编写递归函数有两个要点:确定递归公式和根据公式确定递归函数的出口。学一学:学一学:内部变量与外部变量变量必须先定义后使用。变量的定义

    36、可以在函数内部、函数外部及复合语句的内部。如果变量定义在某函数或复合语句内部,则称该变量为内部变量(也称为局部变量),如果变量的定义在所有函数外部,则称该变量为外部变量(也称为全局变量)。局部变量只在本函数范围内有效,即局部变量的作用域仅仅局限于定义它的函数内;全局变量的作用域是从它定义的位置开始到本源文件的结束,即位于全局变量的定义后面的所有函数都可以使用此变量。学一学:动态存储变量、静态存储变量及寄存器变量动态存储变量(也称自动类变量)是指那些当程序的流程转到函数时才开辟内存单元,执行结束后又立即被释放的变量。定义方式为:auto 数据类型 变量名静态存储变量则是指在整个程序运行期间分配固

    37、定存储空间的变量。定义方式为:static 数据类型 变量名寄存器变量只能出现在函数内部,寄存器变量的值存放在寄存器中(寄存器被认是一种超高速的存储器),这样对这种变量存取速度就很快,因此寄存器量主要用来存放循环变量,以提高程序的执行速度。定义方式为:register 数据类型 变量名学一学:内部函数和外部函数内部函数(也称静态函数)是指只被文本文件内的其它函数调用的函数,而外部函数是指被文本文件内、外其它函数调用的函数。内部函数的定义格式如下:static 数据类型 函数名(形式参数列表)声明部分;执行部分;动态函数的定义格式如下:extern 数据类型 函数名(形式参数列表)声明部分;执行

    38、部分;试一试问题问题6.12分析以下程序,指明哪些是内部变量,哪些是外部变量?#include“stdio.h”int iA=100,iB=10;/*定义外部变量*/void fnSum()int iC;/*定义内部变量*/iC=iA+iB;printf(“%d,”,iC);void main()int iA=1,iC;/*定义内部变量*/iC=iA+iB;printf(“%d,”,iC);fnSum();练一练 1 指出以下程序中,哪些是外部变量,哪些是内部变量,哪个寄存器变量?及其作用域?#include“stdio.h”int iA=100,iB=10;void fnSum1(int i

    39、A,int iB)int iC;iA=2;iB=2;iC=iA+iB;printf(“%d,”,iC);void fnSum2()int iC;iC=iA+iB;printf(“%d,”,iC);void main()int iA=1,iB=1;register int iC;fnSum(iA,iB);fnSum2();iC=iA+iB;printf(“%d”,iC);试一试问题问题6.13分析以下程序,指明哪些是动态变量和静态变量?l#include“stdio.h”lint fnMyfun()l auto int iX=1;/*动态变量*/l static int iY=1;/*静态变量*

    40、/l iX=iX+2;l iY=iY+2;l return iX+iY;llvoid main()l register int i;/*寄存器变量*/lint iSum;l for(i=1;iiNum2)return iNum1;else return iNum2;第二同学的程序保存在f2.c文件,程序如下:#include“stdio.h”int min(int iNum1,int iNum2)if(iNum1iNum2)return iNum1;else return iNum2;第三同学的程序保存在f3.c文件,程序如下:void main()int iNum1=2,iNum2=3;pr

    41、intf(“%d”,max(iNum1,iNum2);printf(“%d”,min(iNum1,iNum2);解题步骤:由这三个文件组成的源程序可按如下步骤运行:编辑文件.编辑以上文件后分别存入在f1.c,f2.c,f3.c。创建项目文件,在新编辑窗口内输入c:f1.c c:f2.c c:f3.c(如果文件在当前目录,则可省略路径名),并将此文件保存为f123.prj,注意扩展名必须是.prj。加入项目名,通过”project”菜单下选”project name”命令,显示的对话框内输入f123.prj,回车。这时,再观察”project name”命令,该命令的右侧加入了项目名f123.p

    42、rj。编译连接。按F9键分别将f1.c、f2.c、f3.c编译后,连接产生f123.exe。运行程序,按CTRL+F9键运行程序。小结:小结:内部变量和外部变量在函数外定义的变量称为外部变量(也称全局变量)。全局变量的作用域是从它定义的位置开始到本源文件的结束,即位于全局变量的定义后面的所有函数都可以使用此变量。在函数内定义的变量称内部变量(也称局部变量),它只在本函数范围内有效,即局部变量的作用域仅仅局限于定义它的函数内。因此,在函数内不能使用其它函数内定义的变量,不同函数内可以有同名的局部变量。内部变量和外部变量可以同名,但是表示的是不同的变量。小结:自动变量、静态变量和存储器变量(1)在

    43、函数内定义的变量,如果不指定存储类型,那么它就是自动类存储变量。准确地讲,应在变量前加上auto 关键字,如:auto int iA;由于C编译器规定,函数内定义的变量缺省存储类型就是auto,所以,关键字auto可以省略。前面章节中出现的变量都是auto变量,当这些变量被说明时,它们的存储类信息都是缺省的,并且这些变量的说明均出现在函数内部。自动变量一旦定义就只能在说明该变量的函数或复合语句中出现才有效。离开上述区域,对该变量的引用是无效的,不合法的。换句话说,自动型变量在动态存储区内分配存储单元,函数返回时,系统将放弃这些存储单元,随之其单元的数据也就消失了。在初始化方面,每调用一次函数时

    44、都要赋一次初值,且默认初值不确定,小结:自动变量、静态变量和存储器变量(2)如果希望在函数调用结束后仍然保持函数中定义的局部变量的值,则可以将该局部变量定义为静态局部变量。其方法是在前面加上static 关键字,如:static int iA;静态局部变量在静态存储区中分配存储单元.因此,在函数调用结束后,它的值并不消失,其值能够保持连续性。在变量初始化方面,静态局部变量在编译过程中赋初值,且只赋一次初值。在程序运行时其初值已经确定,以后调用函数时不再过程中赋初值,而且连续保留上一次函数调用时的结果。静态局部变量的默认初值为0。(3)寄存器(register)变量只能出现在函数内部,在它前面必须有关键词register,当一变量被说明为register变量时,其值存放在寄存器中(寄存器可以认为是一种超高速的存储器),这样对寄存器变量的存取速度就很快,因此寄存器变量通常用来存放循环变量,用来提高程序执行速度。理论上讲,定义为寄存器变量的个数是没有限制的,但实际上可用寄存器变量的个数受机器硬件特性的限制,能够说明为寄存器变量的数据类型只有char,short int,unsigned int,int 和指针型。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C语言程序设计第6章函数.ppt
    链接地址:https://www.163wenku.com/p-3377122.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库