《第四讲 函数.ppt》由会员分享,可在线阅读,更多相关《第四讲 函数.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计教程语言程序设计教程计算机等级考试培训第四讲 函数计算机基础教研室何进C语言程序设计教程语言程序设计教程内容概述模块化程序设计方法模块化程序设计方法函数的定义、声明和调用函数的定义、声明和调用形参和实参形参和实参函数和数组的关系函数和数组的关系函数的递归调用函数的递归调用变量的作用域变量的作用域C语言程序设计教程语言程序设计教程模块化程序设计方法对于大的编程,逻辑关系复杂,程序编写显得困难和容易出错,其方法是:把大问题分解为若干小问题处理,即分解为若干个模块来完成,最后装配。在C中,通常是用函数来实现程序的模块化,一个函数就是一个单一功能的模块。C程序执行总是从main函数开始,
2、调用其它函数后总是回到main函数,在 main函数中结束程序的运行所有函数都是平行的、互相独立的 一个函数可以调用其他函数或其本身(递归调用),但任何函数均不可调用main函数。系统函数:系统为我们定义了很多的标准函数,包含在INCLUDE文件夹的H文件中,只要做了#include 声明,就可以使用。自定义函数:系统函数总是有限的,不能包括全部的需要,用户也可以定义自己需要的函数,建立自己的H文件C语言程序设计教程语言程序设计教程函数的定义函数:能实现特定目标的子程序(或模块),可以接受数据(参能实现特定目标的子程序(或模块),可以接受数据(参数)和返回数据(函数值)数)和返回数据(函数值)
3、函数使用三部曲:函数的定义、说明和调用函数的定义方法 ()函数体语句函数体语句函数可定义在主函数以前,可定义在主函数之后,也可定义在其他函数可定义在主函数以前,可定义在主函数之后,也可定义在其他的文件中。的文件中。函数的类型是指返回值的类型,若需要返回值,则在函数体中,必函数的类型是指返回值的类型,若需要返回值,则在函数体中,必须有返回语句:须有返回语句:return 表达式表达式,否则,函数无返回值,类型为,否则,函数无返回值,类型为void(空)空)C语言程序设计教程语言程序设计教程函数的定义函数定义范例:float sum(float a,float b)float c;c=a+b;re
4、turn c;void hello(void)printf(“Hello,How do you do!n”);C语言程序设计教程语言程序设计教程函数的说明和调用函数的原型说明:若要在main()函数和其他函数中调用已经定义好的函数,在调用语句前必须做原型说明:float sum(float,float);函数的调用:函数名(实参表)程序执行流程转向由函数名指定的被调用函数。实参数一一对应地传递给函数定义中的形参数。执行函数定义中的函数体。执行结束,通过return语句将值返回到调用处。程序执行流程返回调用处。执行后面的语句。C语言程序设计教程语言程序设计教程函数的说明和调用范例1:用函数的方法
5、求解下列问题:输入一个整数,求它的阶乘并输出。分析:求一个数的阶乘,可以定义一个函数,在主函数中输入整数 n,调用函数后,得到阶乘,然后再输出,分工:主函数输入和输出数据,而函数内处理数据课堂定义和调用范例2:用函数的方法,输出1到1000之间的全部质数。改进:将函数的定义放在文件:MYCPP.H中,然后再调用。C语言程序设计教程语言程序设计教程函数的形参和实参形参:函数定义时,指定的内部的变量列表。实参:函数调用时,要传递给函数进行处理的数据列表,而形参变量,是来接受这些数据的,处理完后,返回处理的结果。黑板上画图演示void change(int a,int b)/*函数定义函数定义*/a
6、+;b-;/*改变参数的值改变参数的值*/printf(“%d,%dn”,a,b);mian()int x=1,y=1;change(x,y);/*函数调用函数调用*/printf(“%d,%dn”,x,y);/打印实参的值打印实参的值*/C语言程序设计教程语言程序设计教程函数的形参和实参说明:此调用为传值调用实参可以任意表达式和常量,但是形参必须是变量,它们互为独立的存储空间,互相不干扰。形参和实参必须个数相同、顺序相同、类型相同。函数调用结束后,形参的分配空间被释放若形参和实参为一个数组名,则调用为传地址调用,实际参数和形式参数是同一存储空间,形参数据的改变就等于是实参数据的改变。传地址调
7、用范例:编写函数,逆序存储字符串并输出C语言程序设计教程语言程序设计教程函数的递归调用直接递归调用:直接递归调用:调用函数的过程中又调用该函数本身,调用函数的过程中又调用该函数本身,自己调用自己。自己调用自己。间接递归调用:间接递归调用:调用调用f1函数的过程中调用函数的过程中调用f2函数,而函数,而f2中又需要调用中又需要调用f1。以上均为无终止递归调用。为了让这种调用终止,一般以上均为无终止递归调用。为了让这种调用终止,一般要用要用if语句来控制使递归过程到某一条件满足时结束。语句来控制使递归过程到某一条件满足时结束。范例:用递归法求阶乘范例:用递归法求阶乘C语言程序设计教程语言程序设计教
8、程函数的递归调用编程思想:设计一个函数(递归函数),这个函数不断使用下一编程思想:设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处级值调用自身,直到结果已知处选择控制结构选择控制结构其一般形式是:其一般形式是:递归函数名递归函数名f(参数(参数n)if(n=初值初值)结果结果=常量;常量;else 结果结果=含含f(x-1)的表达式;的表达式;return 结果结果;对于阶乘:当对于阶乘:当n为为0或者或者1时,时,n!=1 当当n大于大于1时,时,n!=n*(n-1)!编程实现编程实现C语言程序设计教程语言程序设计教程函数的递归调用用递归算法计算用递归算法计算Fib
9、onacci数列问题。输入一个数列问题。输入一个n,输出前输出前n项的和项的和 1 (n=1)提示:提示:fib(n)=1 (n=2)fib(n-1)+fib(n-2)(n1)不断用新方法解决旧问题不断用新方法解决旧问题C语言程序设计教程语言程序设计教程命令行参数命令行参数命令行参数:在运行:在运行main()程序的时候,向主程序传递程序的时候,向主程序传递的数据。的数据。在在C中程序是在操作系统环境下运行的,因此中程序是在操作系统环境下运行的,因此main()函函数和其他函数一样,也可以带有参数。从操作系统传递数和其他函数一样,也可以带有参数。从操作系统传递信息到信息到main()中最常用的
10、方法是使用命令行参数。中最常用的方法是使用命令行参数。void main(int argc,char*argv)C语言程序设计教程语言程序设计教程命令行参数其中的两个特殊的内部形参数:其中的两个特殊的内部形参数:argc 命令行参数个数,比实际参数个数多命令行参数个数,比实际参数个数多1;*argv 字符型指针数组,每个元素分别为指向命令字符型指针数组,每个元素分别为指向命令行参数(字行参数(字 符串常量)的指针。符串常量)的指针。例如:例如:argv0 指向程序本身;指向程序本身;argv1 指向命令行参数第一个字符串常数;指向命令行参数第一个字符串常数;argv2 指向命令行参数第二个字符
11、串常数;指向命令行参数第二个字符串常数;argc和和argv是习惯常用的参数名,也可另取名字。是习惯常用的参数名,也可另取名字。C语言程序设计教程语言程序设计教程命令行参数下面程序说明了命令行参数的使用方法,其功能是打印命令行参下面程序说明了命令行参数的使用方法,其功能是打印命令行参数。数。#include main(int argc,char*argv)int icount=0;while(icountcla.exe data element statement 运行结果:运行结果:arg0:claarg1:dataarg2:elementarg3:statementC语言程序设计教程语言程
12、序设计教程变量的存储类型register型(寄存器型)型(寄存器型)变量值存放在运算器的寄存器中变量值存放在运算器的寄存器中存取速度快,一般存取速度快,一般只允许只允许2-3个,且限于个,且限于char型和型和int型型 auto型(自动变量型)型(自动变量型)变量值存放在主存储器的动态存储区(堆栈方式)。变量值存放在主存储器的动态存储区(堆栈方式)。在函数中定义以上两个类型的变量以后,只能属于该函在函数中定义以上两个类型的变量以后,只能属于该函数,函数的调用结束时,变量的存储空间便被释放,不数,函数的调用结束时,变量的存储空间便被释放,不能被保存下来。下次调用时,又给变量重新分配存储空能被保
13、存下来。下次调用时,又给变量重新分配存储空间。间。C语言程序设计教程语言程序设计教程变量的存储类型static型(静态变量型)型(静态变量型)变量值存放在主存储器的静态存储区,程序执行开始至变量值存放在主存储器的静态存储区,程序执行开始至结束,始终占用该存储空间,但在某个函数中定义的,结束,始终占用该存储空间,但在某个函数中定义的,也只能在该函数中有效,不能被其他的模块所访问。也只能在该函数中有效,不能被其他的模块所访问。extern型(外部变量型)型(外部变量型)同上,但作用范围大大拓宽,可以被其他模块和函数所同上,但作用范围大大拓宽,可以被其他模块和函数所访问。访问。以上两种均属于以上两种
14、均属于“静态存储静态存储”性质,即从变量定义处开性质,即从变量定义处开始,在整个程序执行期间其值都存在。始,在整个程序执行期间其值都存在。C语言程序设计教程语言程序设计教程局部变量和全局变量局部变量局部变量函数内部或复合语句内定义的变量函数内部或复合语句内定义的变量 全局变量全局变量在函数之外定义的变量在函数之外定义的变量【注意注意】所有全局变量加不加所有全局变量加不加static,都属于静态存储,如不赋,都属于静态存储,如不赋初值,取初值为初值,取初值为0(数值型)或空格(字符型)(注意与(数值型)或空格(字符型)(注意与函数内部定义的函数内部定义的static型局部变量的区别)型局部变量的
15、区别)如果在同一个源文件中,全局变量与局部变量同名,则如果在同一个源文件中,全局变量与局部变量同名,则在局部变量作用范围内,全局变量不起作用。在局部变量作用范围内,全局变量不起作用。C语言程序设计教程语言程序设计教程局部变量和全局变量求程序运行结果求程序运行结果int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return c;main()int a=8;printf(%dn,max(a,b);C语言程序设计教程语言程序设计教程局部变量和全局变量求程序运行结果求程序运行结果void num()extern int x;int y;int a=15,b=10;
16、x=a-b;y=a+b;int x,y;main()int a=7,b=5;x=a+b;y=a-b;num();printf(%d,%dn,x,y);C语言程序设计教程语言程序设计教程课堂练习设函数fun的定义形式为void fun(char ch,float x)则以下对函数fun的调用语句中,正确的是A)fun(abc,3.0);B)t=fun(D,16.5);C)fun(65,2.8);D)fun(32,32);C语言程序设计教程语言程序设计教程课堂练习以下程序的输出结果是void reverse(int a,int n)int i,t;for(i=0;in/2;i+)t=ai;ai=a
17、n-1-i;an-1-i=t;main()int b10=1,2,3,4,5,6,7,8,9,10;int i,s=0;reverse(b,8);for(i=6;i10;i+)s+=bi;printf(%dn,s);A)22 B)10 C)34 D)30C语言程序设计教程语言程序设计教程课堂练习下列说法错误的是A)函数调用时,函数名必须与所调用的函数名字完全相同B)实参的个数必须与形式参数的个数一致C)实参可以是表达式,在类型上必须与形参一一对应匹配D)C语言规定,函数必须先定义,后调用(函数的返回值类型为int或char时除外)C语言程序设计教程语言程序设计教程课堂练习请阅读以下程序:#in
18、cludevoid fun(int s)static int j=0;dosj+=sj+1;while(+j2);main()int k,a10=1,2,3,4,5;for(k=1;k3;k+)fun(a);for(k=0;k5;k+)printf(%d,ak);上面程序的输出是A)34756 B)23445 C)35745 D)12345C语言程序设计教程语言程序设计教程课堂练习以下对C语言函数的有关描述中,正确的是A)在C语言中调用函数时,只能把实参的值传给形参,形参的值不能传送给实参B)C函数既可以嵌套定义又可以递归调用C)函数必须有返回值,否则不能使用函数D)函数必须有返回值,返回值类
19、型不定C语言程序设计教程语言程序设计教程课堂练习下面程序的文件名为t.exe,在DOS下输入的命令行参数如下:t to meet me则程序输出的结果是#include stdio.hmain(argc,argv)int argc;char*argv;int i;printf(%dn,argc);A)3 B)4 C)2 D)以上答案都不正确C语言程序设计教程语言程序设计教程课堂练习以下程序的输出结果是int f()static int i=0;int s=1;s+=i;i+;return s;main()int i,a=0;for(i=0;i5;i+)a+=f();printf(%dn,a);A)20 B)24 C)25 D)15C语言程序设计教程语言程序设计教程课堂练习在C语言中,变量的隐含存储类别是A)auto B)static C)extern D)无存储类别