C语言程序设计模板.ppt

上传人:牧羊曲112 文档编号:5426433 上传时间:2023-07-05 格式:PPT 页数:41 大小:626.50KB
返回 下载 相关 举报
C语言程序设计模板.ppt_第1页
第1页 / 共41页
C语言程序设计模板.ppt_第2页
第2页 / 共41页
C语言程序设计模板.ppt_第3页
第3页 / 共41页
C语言程序设计模板.ppt_第4页
第4页 / 共41页
C语言程序设计模板.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言程序设计模板.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计模板.ppt(41页珍藏版)》请在三一办公上搜索。

1、1,第七章,函 数,2,第七章 函数,一、函数概述 二、函数的定义和返回值 三、函数的调用 四、函数的说明 五、局部变量和全局变量 六、变量的存储类别 七、嵌套调用和递归调用 八、函数的存储类型 九、函数程序举例,主要内容,end,3,一、函数概述,C程序结构,第七章 函数,4,一个C程序可由一个主函数和若干个函数构成。由主函数调用其他函数。其他函数可以相互调用。同一函数可以被一个或多个函数调用任意多次。,基本概念,分 类,从用户使用的角度看:标准函数和用户自定义函数从函数的形式看:无参函数和有参函数,第七章 函数,back,5,(一)、举例(二)、函数的定义(三)、函数的返回值,二、函数的定

2、义和返回值,第七章 函数,back,6,(一)、举例,先来看一个函数使用的例子,输入两个数,输出最大值。(判断的两个数的最大值用函数),main()int a,b,c;c=max(a,b);printf(“The max is%d”,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);,函数调用,函数定义,第七章 函数,7,(二)、函数定义,类型标识符 函数名(形参列表)声明部分 语句部分,int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);,函数首部,函数体,格式,int

3、:函数类型max:函数名int x,int y:形参及其定义,声明部分:int z;说明函数内部用到的变量。语句部分:if.说明函数的功能return(z)返回函数的结果,第七章 函数,8,(三)、函数的返回值,1、函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句。只有一个起作用。,2、return(z);return z;,3、如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。,4、如果被调用函数中没有return语句,一般表示此函数完成一定操作,并不带回任何值。,5、为了明确表示“不带回值”,可以用“void”定义“无类型”

4、。,第七章 函数,9,例 无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;,printstar()printf(*);main()int a;a=printstar();printf(%d,a);,void printstar()printf(*);main()int a;a=printstar();printf(%d,a);,正确。函数printstar()没有说明类型表示整型,在main()中,语句a=printstar();执行函数调用,因为在函数定义时没有定义返回值,所以返回一个随机整数。运行结果:*1010就是返回的随机

5、整数。,错误!在编译时将提示下列信息:cannot convert from void to int即不能将void转换为int,举例,第七章 函数,10,三、函数的调用,(一)、函数调用可以有两种方式(二)、函数的参数传递(三)、函数调用的语法要求,第七章 函数,back,11,(一)函数调用可以有两种方式,函数调用出现在表达式中 例:c=max(a,b)是一个赋值表达式 函数调用以语句的形式出现 例:若调用hello函数,可用以下语句:hello();,第七章 函数,12,格式,函数名(实参列表),方式,1。函数语句 printstar()2。函数表达式 c=a*max(a,b)3。函数参

6、数 m=max(a,max(b,c),main()int a,b,c;c=max(a,b);printf(“The max is%d”,c);,函数调用,第七章 函数,13,举例,C(m,n)=m!/(n!*(m-n)!)(mn),main()float c;int m,n;float fac(int x);printf(“input m,n:”);scanf(“%d%d”,input m,n:5 3,The result is 10.0,第七章 函数,14,(二)、函数的参数传递,计算实在参数的值,为形式参数分配存储单元,将实在参数的值传给对应的形式参数。通过return语句将返回值返回到调

7、用处,释放形式参数所分配的内存单元。因此,形参只在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。函数之间还可以通过全局变量传递参数,将在本章后续内容中介绍。在C语言中,数据只能从实参传给形式参数,而不能把形式参数的值传回给实在参数,称为“按值传递”,既单向传递。,第七章 函数,15,实际参数与形式参数的关系,对应关系,个数对应顺序对应类型对应(类型相同或赋值相容),传递关系,实参传递给形参值传递(单向传递),第七章 函数,形参:定义函数时函数名后面括号 中的变量名,形参:定义函数时函数名后面括号中的变量名,说明:(1)形参在函数被调用前不占内存;(2)函数调用时为形参分配内存

8、;调用结束,释放内存(3)实参可以是常量、变量或表达式(4)在被定义的函数中,必须指 定形参的类型(5)形参与实参类型一致,个数相同(6)若形参与实参类型不一致,自 动按形参类型转换(函数调用 转换)(7)实参对形参与进行“值传递”(8)形参与实参占用不同的内存 单元,单向传递,16,(三)、函数调用的语法要求,函数调用的语法要求函数调用时,函数名必须与定义的函数名完全一致。实参可以是常量、变量、表达式、函数等,在进行函数调用时,它们都必须具有确定的值,实参的个数必须与形参的个数相等,顺序一致,类型匹配,否则会发生“类型不匹配”的错误。被调函数类型是int或char以外的函数,应先定义或说明,

9、后使用。,第七章 函数,17,四、函数的说明,(一)、函数说明的形式 其一般形式如下:数据类型 函数名(类型名 形式参数1,类型名 形式参数2,);或者也可以省略形式参数的名字,写成下面形式:数据类型 函数名(类型名1,类型名2);如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用 当被调函数的定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用,第七章 函数,18,(二)函数说明的位置 函数说明可以放在两个位置:主调函数的说明部分 所有函数外部,被调用之前,第七章 函数,back,19,五、局部变量和全局变量,局部变量定义:在函数内定义,只在本函数

10、内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量局部变量可用存储类型:auto register static(默认为auto),全局变量-外部变量定义:在函数外定义的变量有效范围:从定义变量的位置开始到本源文件结束应尽量少使用全局变量,第七章 函数,20,第七章 函数,21,例 不同函数中同名变量(局部变量),main()int a,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()int a,b;a=6;b=7;printf(sub:a

11、=%d,b=%dn,a,b);,运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4,第七章 函数,22,float max,min;float average(float array,int n)int i;float sum=array0;max=min=array0;for(i=1;imax)max=arrayi;else if(arrayimin)min=arrayi;sum+=arrayi;return(sum/n);main()int i;float ave,score10;/*Input*/ave=average(score,10);printf(ma

12、x=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);,例 全局变量,第七章 函数,back,23,六、变量的存储类别,变量定义的一般形式如下:存储类型标识符 数据类型变量名,变量名,;(一)auto变量:局部变量可以定义为auto型,而全局变量不能被说 明成此类型对于局部变量,如果没有指定存储类型、或使用了 auto说明符,糸统就认为所定义的变量具有自动类别。因此,int x;等价于auto int x;auto变量的存储单元被分配在内存的动态存储区。每当进入函数体或复合语句时,糸统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作它用。因

13、此,这类局部变量的作用域是从定义的位置起,到函数体或复合语句结束为止。所有自动类存储单元都是在进入这些局部变量所在的函数体或复合语句时生成,退出其所在的函数体或复合语句时消失。这就是自动类局部变量的“生存期”。当再次进入函数体或复合语句时,系统将为它们另行分配存储单元;未赋初值的自动变量其值不确定。自动变量的赋初值是在程序运行过程中进行的,每进入一次函数体或复合语句,就赋一次初值。,第七章 函数,24,寄存器变量也是自动类变量。它与auto类变量的区别在于:用register定义的变量占CPU中的寄存器,而auto类的变量占用内存的动态存储区。程序运行时访问寄存器的速度要比访问内存的速度快得多

14、。因此,当程序对运行速度有较高要求时,把那些频繁引用的少数变量定义为寄存器类型,可以显著地提高运行速度。在使用寄存器类型的变量时需要注意:(1)CPU中的寄存器是有限的,因此只能说明少量(两个左右)的寄存器变量。(2)register型变量的值是存放在CPU中的寄存器中,而不是放在内存中,所以register型变量没有地址。也就不能对它们进行求地址运算。(3)register型变量的说明应尽量放在靠近使用的地方,用完之后尽快释放,以提高寄存器的利用率。(4)局部变量可以说明为register型,而全局变量不能被说明成此类 型。,(二)register变量,第七章 函数,25,(三)static

15、变量,static变量的存储单元被分配在内存的静态存储区中,它们在程序开始运行前就分配了固定的存储单元,在程序运行过程中占用的存储单元始终不变,只有在程序结束后,才释放所占用的内存单元。对于局部变量和全局变量都可以说明成static类型。静态局部变量如果进行初始化,只有第一次执行定义语句时随着定义而进行初始化。当退出所定义的函数或复合语句时,将保留当时值,再次进入所定义的函数或复合语句时,不重新定义,所以也不重新初始化,此时,该变量的值是上次离开时的值。静态局部变量如果不进行初始化,C语言编译系统将自动为其赋予零。,第七章 函数,26,例:static局部变量应用举例。,#include ma

16、in()int i,s;int f(int m);for(i=1;i=5;i+)s=f(i);printf(i=%d,s=%dn,i,s);int f(int m)static int t=1;t=t*m;return(t);,主函数中5次调用f 函数,f 函数中的局部变量t是静态变量,所以只有第一次调用时初始化为1,以后4次调用时都不再初始化,而引用上次函数调用结束时的值。全局变量无论是否被说明成static类型,都将占用静态存储区。只是说明成静态的全局变量将不能被其它编译单位所引用。,第七章 函数,27,(四)extern说明的外部变量,1)在同一编译单位内用extern说明符来扩展全局变

17、量的作用域全局变量是在函数外部定义的变量,它的作用域是从定义点开始到本源程序文件结束。如果全局变量的定义不在文件的开头,在定义点之前的函数想引用该外部变量,则应在引用之前用extern对该变量作说明。这样定义点之前的函数就可以引用该全局变量了。即在同一编译单位内扩展了全局变量的作用域。2)在不同编译单位内用extern说明符来扩展全局变量的作用域一个程序可由一个或多个源程序文件组成。对于由多个源程序文件组成的程序,并且每个编译单位均需要引用同一个全局变量,这时若在每个文件中都定义这个全局变量,则在“连接”时将会出现“重复定义”的错误。解决的办法是在其中一个文件中定义所有的全局变量,其它文件中用

18、extern对此变量进行说明。这样可以在不同编译单位内用extern说明符来扩展全局变量的作用域。注意:全局变量的说明与全局变量的定义不同:全局变量的定义只能出现一次,而全局变量的说明可出现多次(因为定义点之前可以有多个函数都可引用该全局变量),第七章 函数,28,例:在不同编译单位内 extern说明符应用举例。,/*文件1:file_a.c*/#include int x=10;/*定义外部变量x和y*/main()void sub();/*在主调函数中说明被调函数sub是void类型*/sub();/*调用函数sub*/printf(x=%dn,x);/*文件2:file_b.c*/vo

19、id sub(void)/*函数sub定义在另一个文件中*/extern int x;/*说明定义在另一个文件中的外部变量x*/x-=5;,程序运行结果如图 在file_a中定义的全局变量x,在file_b中用extern进行说明就可以使用了,扩展了全局变量的作用域。,第七章 函数,back,29,七、嵌套调用和递归调用,(一)、嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数。,第七章 函数,30,例 求三个数中最大数和最小数的差值,int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int

20、 z);void main()int a,b,c,d;scanf(%d%d%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=xy?x:y;return(rz?r:z);,第七章 函数,31,(二)、递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,成为函数的递归调用。举例:用递归方法求n!。,float fac(int n)float

21、f;if(n0)printf(n0,dataerror!);f=-1;else if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);,void main()int n;float y;printf(input a inter numer:);scanf(%d,第七章 函数,back,32,八、函数的存储类型,函数一旦定义后就可被其它函数调用。但当一个源程序由多个源文件组成时,在一个源文件中定义的函数能否被其它源文件中的函数调用呢?为此,语言又把函数分为两类:外部函数和静态函数。,第七章 函 数,33,(一)外部函数,当定义一个函数时,如果在函数的返回值类型前加

22、上说明符extern,则表示此函数是“外部函数”。C语言规定,如在函数定义中省略extern,则隐含为extern。所以,我们以前所定义的函数都属于外部函数。例如函数首部可以写为:extern float max(float x,float y)外部函数在整个源程序中都有效。在一个源文件的函数中调用其它源文件中定义的外部函数时,应在调用语句所在的函数的说明部分用extern对被调用的函数进行说明。,第七章 函 数,34,外部函数应用实例,/*文件1:file1.c*/#include stdio.hextern void f()/*外部函数定义*/void ff();printf(This i

23、s the first programn);ff();/*调用另一个函数 ff()*/void ff()printf(This is the second programn);/*文件2:file2.c*/#include stdio.hmain()extern void f();/*外部函数说明,表示f函数在其它源文件中*/int i;for(i=0;i2;i+)f();/*主函数中调用函数f()*/,程序运行结果如图,整个程序由两个文件组成。在文件file2.c中主函数main调用f函数,而f函数的定义在文件file1.c中,因此,在main函数中使用extern对f函数加以说明。通过此例

24、可知,使用extern声明就能够在一个文件中调用其它文件中定义的函数,即把一个函数的作用域扩展到说明它的另一个文件中。,第七章 函 数,35,(二)静态函数,定义函数时,如果在函数的返回值类型前加上说明符static,则表示此函数是“静态函数”。例如:static float max(float x,float y)静态函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用。静态函数也称为内部函数。但此时静态static的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。因此在不同的源文件中定义同名的静态函数不会引起混淆。,第七章 函 数,back,36,九、函数程序举

25、例,编写判断一个整数m是否 为素数的函数。,#include#include int prime(int m)int i;for(i=2;i=sqrt(m);i+)if(m%i=0)return 0;return 1;main()int n;printf(Please input a integer numer:);scanf(%d,分析:函数prime有一个整型参数m,函数功能是如果m是素数就返回1,否则返回0。,第七章 函 数,37,编写函数fun按如下公式:,#include float fun(int n)int i;float a;a=1;for(i=2;i=n;i+)a=1/(5+

26、a);return a;main()printf(A10=%.2fn,fun(10);,A1=1,A2=1/(5+A1),A3=1/(5+A2),An=1/(5+An-1)计算A10的值。分析:变量a中放计算结果,先把公式中第一项放到a中,要计算An,只要将a=1/(5+a);这条语句重复n-1次即可完成。,第七章 函 数,38,#include char mylower(char ch)if(ch=a,编写函数mylowerr(ch),把ch中的大写字母转换成小写字母作为函数值返回,其它字符不变。,编写函数统计输入的一串字符(用字符结束输入)中英文字母个数。分析:这是一个计数问题,函数名叫c

27、ountch,它是一个无参函数,函数的功能这样来实现:反复输入字符,对于每一个输入的字符,若不是,就判断其是否英文字母,是就计数,否则不计数,直到输入的字符是为止。把计数器中的结果返回。,#include int countch();main()int n;n=countch();printf(n=%dn,n);int countch()int cn=0;char ch;while(ch=getchar()!=)if(ch=A,第七章 函 数,39,编写函数sum(int n)用来求,和数作为返回值。这里f(x)=x2+1。分析:这是一个函数嵌套调用问题,主函数调用sum函数,sum函数调用f

28、函数。这里的函数名与题目中的一致。f函数和sum函数功能都很简单明了。这里不再赘述。,#include int sum(int);int f(int);main()int a,b;printf(Enter a integer number:);scanf(%d,第七章 函 数,40,在屏幕上显示杨辉三角形,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1,分析:杨辉三角形的特点是:第1例和对角线上的数据为1,其它每一个数据都是它上一行同一列与它左边那列俩个数据之和,若用公式可表示为:,1(y=1 或 y=x)c(x,y)=c(x-1,y-1)+c(x-1,y)其中x表示行数,y表示列数,c(x,y)表示x行y列上的数据。显然用递归函数比较容易解决。,#include main()int c(int x,int y);int i,j,n;printf(Input n=);scanf(%d,/*递归调用函数c*/,第七章 函 数,41,本章结束!,谢谢观看!,back,end,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号