《C语言程序设计》课程().ppt
《《C语言程序设计》课程().ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》课程().ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C语言程序设计语言程序设计 任课教师:任课教师:金金 丹丹 电子邮箱:电子邮箱:第第5 5章章 函数函数函数:clrscr()功能:是清屏,将插入点置于0行0列.clrscr();第 5 章 函数 模块化程序设计是面向过程程序设计的很重要的方法,C语言中的函数表达了这种思想。本章主要介绍:1、函数的定义2、模块化程序设计的实现方法3、函数的定义及函数的调用方式4、内部函数和外部函数的定义和调用方法等。5.1 C 函数与C程序结构模块化程序特点:模块化程序具备逻辑清晰、层次清楚的特点结构;具体应用:在C源程序中,用户可将算法分解成一个个相对独立的函数模块,称为用户函数,然后,通过函数调用来使
2、用这些函数。模块化程序设计C语言的函数作为一个模块一般应依据下面两个原那么:(1)界面清晰。函数的处理子任务明确,函数之间数据传递越少越好。(2)大小适中。假设函数太大,处理任务复杂,导致结构复杂,程序可读性较差;反之,假设函数太小,那么程序调用关系复杂,这样会降低程序的效率。模块化软件结构的示意图 一个一个C语言程序由主函数和假设干个语言程序由主函数和假设干个0个用户个用户函数组成;函数组成;C语言中的函数没有隶属关系,语言中的函数没有隶属关系,即所有的函数都是独立定义的,不能嵌套定义。即所有的函数都是独立定义的,不能嵌套定义。函数是通过调用来执行的,允许函数间互相调用,也允许直接或间接的递
3、归调用其自身;【例【例5.1】用户定义一个无参函数用来输出信息。】用户定义一个无参函数用来输出信息。void printstar()printf(printf(*nn););main函数函数可以调用任何一个函数,而其他函可以调用任何一个函数,而其他函数不能调用数不能调用main函数函数;例如:;例如:main()printstar()【例5.2】编写一个有参函数程序,求长方形的面积。float area(float a,float b)float s;s=a*b;return s;/*return带回函数值,S就是返回值*/main()float aver,x,y;scanf(“%f%f”,&
4、x,&y);area=area(x,y);/*调用函数,得到返回值*/printf(“%f”,area);调用另一个函数的函数称为主调函数、被调用的函数称为被调函数;函数的四种形式:a)从使用的角度来分为用户函数和系统函数 b)从形式上分成有参函数和无参函数 c)从作用的范围分为外部函数和内部函数 d)从返回值的角度分成有返回值函数和无返回值函数void printstar()/*用户函数、无参、无返回值用户函数、无参、无返回值*/float area(float a,float b)/*用户函数,有参、有返回值用户函数,有参、有返回值*/printf(“*n)/*系统函数,有参、有返回值系统
5、函数,有参、有返回值*/getchar()/*系统函数,无参、有返回值系统函数,无参、有返回值*/5.2 函数的定义及构成函数要先定义后使用函数要先定义后使用,函数定义的一般格式为:函数定义的一般格式为:存储类型存储类型 数据类型数据类型 函数名函数名(形式参数表形式参数表)说明局部说明局部 语句局部语句局部 通常把函数名和形参的说明局部称为通常把函数名和形参的说明局部称为“函数头函数头,用花括号括起来的局部称为,用花括号括起来的局部称为“函数体。函数体。函数具有以下特征(1)存储类型 定义函数时存储类型 可以是extern或static两种关键字说明(2)数据类型 定义函数时数据类型是用来说
6、明该函数返回值的类型,可以是整型、字符型、实型、指针型和其它构造类型。如果省略,那么系统默认为int型。(3)函数名 函数名是一个标识符,它的命名规那么同变量相同。(4)形式参数表 形式参数简称形参)的说明形式如下:数据类型 形式参数1,数据类型 形式参数2,(5)函数体 由 括起来的局部称为函数体。由说明局部和语句局部组成(6)函数的返回值 返回值可以是常数、变量或表达式,也可以是指针,但不能是数组名或函数名。return 表达式;return 表达式;例如:return s;关于关于return语句说明如下:语句说明如下:1.1.如果不需要从被调函数带回返回值可以不要如果不需要从被调函数带
7、回返回值可以不要returnreturn语句。一种情况是将函数类型定义为语句。一种情况是将函数类型定义为voidvoid型,也叫空类型型,也叫空类型.例如:例如:void printstar()2 2、还可以用不带表达式的还可以用不带表达式的returnreturn作为函数的作为函数的逻辑结尾,这时,逻辑结尾,这时,returnreturn的作用是将控制权的作用是将控制权交给调用函数,而交给调用函数,而不是返回一个值不是返回一个值。也可以。也可以不用不用returnreturn。returnreturn;return语句是函数的逻辑结尾,不一定是函数的最后一条语句,一个函数中允许出现多个ret
8、urn语句,但每次只能有一个return语句被执行。if(x0)return-1;else if(x=0)return 0;else return 1;-1 x0Y=5.3 函数的调用使函数得以运行称为函数的调用使函数得以运行称为函数的调用函数调用格式函数调用格式:函数名函数名(实参表实参表);函数的调用过程是:函数的调用过程是:(1)如果是有参函数,那么如果是有参函数,那么C系统首先为函数的形式参数系统首先为函数的形式参数分配存储单元,将实参的值计算出后依次赋予对应的形参,分配存储单元,将实参的值计算出后依次赋予对应的形参,称为值传递传值,在称为值传递传值,在C语言中这种数据传递是单向的。语
9、言中这种数据传递是单向的。(2)执行函数体,根据函数中的数据类型定义,系统为执行函数体,根据函数中的数据类型定义,系统为其中的变量分配存储单元并执行函数体中的可执行语句。其中的变量分配存储单元并执行函数体中的可执行语句。当执行到当执行到“返回语句时,计算返回值返回主调函数继续返回语句时,计算返回值返回主调函数继续运行程序,如果是无返回值函数,那么省略此操作。系统运行程序,如果是无返回值函数,那么省略此操作。系统将释放本函数体中定义的变量静态型变量不释放,同将释放本函数体中定义的变量静态型变量不释放,同时收回分配给形参的存储单元。如果是时收回分配给形参的存储单元。如果是“无参函数,那无参函数,那
10、么无需进行参数传递。么无需进行参数传递。input three integers:10 20 30sum=60int sum(int x,int y,int z)int m;m=x+y+z;return m;#include main()int i,j,k,s;printf(“input three integers:);scanf(“%d%d%d,&i,&j,&k);while(!(i=0&j=0&k=0)s=sum(i,j,k);printf(sum=%dn,s);【例【例5.3】编写程序,计算】编写程序,计算3个不为个不为0的整数之和的整数之和例如,求两个数中的最大数#include m
11、ax(float x,float y)float z;z=(xy)?x:y;return z;main()float a,b;int c;scanf(“%f,%f,&a,&b);c=max(a,b);rintf(“Max is%dn,c);函数调用时要注意以下问题:函数调用时要注意以下问题:(1)如果实参表中包含多个实参,那么各实参用如果实参表中包含多个实参,那么各实参用逗号隔开,实参与形参的个数应相等,且类型应逗号隔开,实参与形参的个数应相等,且类型应一致。一致。(2)函数的调用也可以出现在表达式中。这时要函数的调用也可以出现在表达式中。这时要求函数带回一个确定的值以参加表达式的运算。求函数
12、带回一个确定的值以参加表达式的运算。s=5*sum(i,j,k);(3)对实参表求值的顺序对实参表求值的顺序Turbo C是按从右到左是按从右到左的顺序求值。的顺序求值。【例5.4】写出程序运行结果。#include int f(int a,int b)if(ab)return 1;else if(a=b)return 0;else return-1;main()int i=2,p;p=f(i,+i);/*传递的都是3*/printf(“%d,p);结果为:0(4)函数定义 的类型就是返回值的类型;函数调用时,如果return中的表达式类型与函数类型不一致,那么编译系统自动将表达式的类型转换成
13、函数的类型后返回。int max(float x,float y)float z;z=(xy)?x:y;return z;/*返回整型值*/输入:3.5,4.8(4)调用函数与被调用函数的相对位置关系 一个程序文件中可能包含假设干个函数,函数在其中所处的位置代表函数定义的顺序,同时也决定了它的作用域。假设:调用点位于被调用函数后那么不需说明,而调用点位于被调用函数前,那么必须进行函数声明后才能调用。声明时要说明被调用函数的返回值的类型、函数名、函数的形式参数表,其中形参都要在形参表中一一列举。函数声明的 格式为:类型名 被调用函数的函数名()【例5.5】编写函数,求一个整数的阶乘。#inclu
14、de main()int n;long fac(int);printf(input an integer:);scanf(%d,&n);printf(%d!=%ld,n,fac(n);input an integer:5 5!=120long fac(int x)int i;long y;if(x0)printf(data errorn);else for(i=1,y=1;i=x;i+)y=y*i;return y;假设被调用函数的函数值是整型或字符型,那么均可省略上述函数声明。例如,求两个数中的最大数如果已在所有函数定义之前,在函数的外部已做了函数声明,那么在各个主调函数中不必对所调用的函数
15、再作声明。例如:float f1(float,float);char f2(char);int f3(float);main()float f1(float a,float b)char f2(char c)int f3(float d)在main中不用对函数f1,f2,f3进行声明。(5)函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一个函数。C语言不允许嵌套定义,但可以嵌套调用。【例5.6】计算组合数 分析:分析:1、设计一个求阶乘的子函数、设计一个求阶乘的子函数 flog fac(int x)2、设计一个子函数、设计一个子函数 long cmn(int m,int n),回
16、收回收3个阶乘数,个阶乘数,其中其中m,n为的两个参数;定义一个变量为的两个参数;定义一个变量long fc,使之带回使之带回返回值;返回值;3、主函数调用、主函数调用cmn函数;函数;cmn函数三次调用函数三次调用fac函数;函数;4、在主函数中读入、在主函数中读入m、n的值,并分析的值,并分析m和和n的情况,最后的情况,最后输出计算结果。输出计算结果。#include main()int m,n;long fac(int);long cmn(int,int);printf(“input two integers:);scanf(“%d,%d,&m,&n);if(mn|m0|n0)print
17、f(“input error!n);else printf(“%ld,cmn(m,n);long fac(int x)/*在前在前*/int i;long y;for(i=1,y=1;i=x;i+)y=y*i;return y;long cmn(int m,int n)/*在后在后*/long fc;fc=fac(m);fc=fc/fac(n);fc=fc/fac(m-n);return fc;input two integers:9,5 126input two integers:4,8 input error!复 习1、模块化程序设计方法:函数4种形式2、调用函数的方法:值传递数据类型、函
18、数的位置#include#includefloat f()float f()int s=1;int s=1;float i,n=1,d=0,m;float i,n=1,d=0,m;scanf(%f,&n);scanf(%f,&n);for(i=1;in+1;i+)for(i=1;in+1;i+)m=s/i;m=s/i;d=d+m;d=d+m;s=-s;s=-s;return d;return d;调用与返回调用与返回main()main()float s;float s;s=f();s=f();printf(“%fn printf(“%fn,s);,s);传值main()int a,is_no
19、t=10;scanf(%d,&a);is_not=runnian(a);printf(%d,is_not);#include#include int runnian(int runnian(int bint b)int c;int c;if(b%100!=0&b%4=0|b%100=0&b%400!=0)if(b%100!=0&b%4=0|b%100=0&b%400!=0)c=1;c=1;else c=0;else c=0;return(c);return(c);5.4 函数的递归调用 C语言允许函数进行递归调用。即在调用一个函数的过程中,又出现直接或间接地调用该函数本身。前者称为直接递归,后
20、者称为间接递归。递归调用的函数称为递归函数。由于递归非常符合人们的思维习惯,而且许多数学函数、算法或数据结构都是递归定义的,因此递归调用颇具实用价值。、递归函数的特点递归函数常用于解决那些需要分屡次求解,并且每次求解过程根本类似的问题;递归函数内部对自身的每一次调用都会导致一个与原问题相似而范围要小的新问题;构造递归函数的关键在于寻找递归算法和终结条件;终结条件是为了终结函数的递归调用而设置的一个标记;注意:递归调用不应也不能无限制的执行下去,所以必须设置一个条件来检验是否需要停止递归函数的调用。终止条件的设置可以通过分析问题的最后一步求解而得到。、递归函数的设计递归问题的一般描述:用递归函数
21、求n!递归结束的条件:f(k)=常量递归计算公式:f(n)=含有f(n-1)的表达式函数递归的一般结构:数据类型 f(n)if(n=k)return(常量);else return(f(n-1)的表达式);【例5.7】用递归函数求n!。分析:首先将求n!的函数拿来用1、如果求n!可以通过求(n-1)!完成、而求(n-1)!必须要求出(n-2)!,以次类推,直到最后求出1!。这就是递归调用公式;2、那么当n为1时可得出结果就是1,1就是结束条件;有这种规律的计算问题就可以设计递归函数调结构程序#include 例例5.7float fac(int n)float f;if(n 1)f=fac(n
22、-1)*n;else if (n=0|n=1)f=1;else f=-1;return f;void main()int n;float y;printf(Input a integer number:);scanf(%d,&n);y=fac(n);if(y 0)printf(Error:%d 0,n);else printf(%d!=%.ld,n,y);【例5.8】用递归函数求fibonacci数列的某一项的值。#include int fib(int i)if(i=1&i=2)return 1;else return fib(i-1)+fib(i-2);main()int i;printf
23、(“Input the item of fibonacci:);scanf(%d,&i);printf(fib(%d)=%dn,i,fib(i);input the item of fibonacci:10fib(10)=55例 有5个人坐在一起,问第5个人多少岁?答,比第4个人大2岁。第4个人说他比第3个人大2岁,第3个人比第2个人大2岁,第2个人比第1个人大2岁,问第1个人时答复是10岁。第5个人到底多大?计算公式:计算公式:10(n=1)递归条件递归条件age(n)=age(n-1)+2(n 1)公式公式age(5)age(5)=age(4)+2=18age(4 )age(4)=age(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 课程
限制150内