(7)--ch7 C语言程序设计函数.ppt
《(7)--ch7 C语言程序设计函数.ppt》由会员分享,可在线阅读,更多相关《(7)--ch7 C语言程序设计函数.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 函数核心概念核心概念n结构化程序设计n自顶向下,逐步细化n近似树型的结构n在C语言中每个节点都是函数实现的,根是main函数,内部结点是调用孩子函数实现其功能n函数n具有独立功能的程序模块,由函数头和函数体组成,其中函数名、函数参数、函数返回值是非常重要的三个组成部分n函数名:给具有独立功能的程序模块取的一个标示符n函数参数:函数的接口,接收调用者传过来的值n函数返回值:即函数值,该函数执行数据处理,获得的一个值,返还给调用者学习目标学习目标n了解函数的基本概念及其分类n掌握函数的定义方法n了解函数说明的作用与方法n掌握函数的调用方法n掌握变量、函数的作用域和生命周期n掌握函数调用时参
2、数传递的特点n掌握递归函数的定义和使用章节内容章节内容7.1 求素数求素数7.2 俄罗斯方块的旋转 7.3 汉诺塔 7.4 明文与密文 7.5 内部函数和外部函数 7.1 求素数求素数 n案例:案例:编程实现打印出100200,400500以内的所有素数。#include#includevoid main()int i,m,k;for(k=101;k200;k=k+2)/*打印出100-200之间的素数*/m=(int)sqrt(k);for(i=2;i m)printf(%5d,k);for(k=401;k500;k=k+2)/*打印出400-500之间的素数*/m=(int)sqrt(k)
3、;for(i=2;im)printf(%5d,k);这种方法有几个不足:代码完全复制,使得源文件变长;复制代码要更换所使用的变量,否则会出错例例7.1 从键盘输入从键盘输入10个大于个大于1的正整数,的正整数,输出其中的素数。输出其中的素数。n设计自定义函数isprime(x),用来判断某数x是否为素数,如果x是素数,则返回1,否则返回0。#include#include void main()int i,k10;int isprime(int x);/*函数说明*/printf(输入10个数据:n);for(i=0;i10;i+)/*输入10个数据*/scanf(%d,&ki);printf
4、(上述数据中的素数有:n);for(i=0;i10;i+)/*打印输入的10个数据中的素数*/if(isprime(ki)/*函数调用*/printf(%3d,ki);printf(n);int isprime(int x)/*函数的定义*/int i;for(i=2;i=(int)sqrt(x);i+)if(x%i=0)return 0;/*x能被i除尽,不是素数*/return 1;/*如果x不能被所有的i整除,则x是素数*/函数返回值类型函数名函数参数n有了判断一个数是否为素数的函数之后,如果要求输出100200和400500之间的素数,在main函数中只需要使用两次循环即可,如下所示:
5、for(k=101;k200;k=k+2)if(isprime(k)printf(%5d,k);for(k=401;ky?x:y;return(z);例 有参函数(现代风格)int max(int x,y)int z;z=xy?x:y;return(z);例 空函数 dummy()函数体为空例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);函数类型 函数名(形参表)形参类型说明说明部分语句部分传统风格:例 有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);7.1.
6、2函数的参数和函数的值函数的参数和函数的值n形式参数和实际参数形式参数和实际参数n函数定义中的参数称为形参;函数定义中的参数称为形参;n函数调用中出现的参数称为实参函数调用中出现的参数称为实参;n主调函数把实参的值传送给被调函数的形参变量,从而实现主调函数向被调函数的数据传送。n 特点(1)形参变量只有在被调用时才分配存储空间,在调用结束时,即释放所分配的内存单元。(2)实参必须具有确定的值。(3)实参和形参在数量、类型、顺序上应严格一致,否则会发生类型不匹配的错误。(4)函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。(5)实参与形参分别占用不
7、同的存储单元。例例7.2形参与实参所占用的内存单元不同。形参与实参所占用的内存单元不同。#include void para_adress(int x)printf(形参x的地址:=0X%X;x=%dn,&x,x);void main()int i=10;printf(实参i的地址:=0X%x;i=%dn,&i,i);para_adress(i);某次运行的结果:实参i的地址:=0X12FF7C;i=10形参x的地址:=0X12FF2C;x=10例例7.3 验证实参到形参的单向值传递。验证实参到形参的单向值传递。#include void sum(int a,int s);/*函数说明*/vo
8、id main()int n=5,sm=0;printf(主函数实参:n n=%d,sm=%dn,n,sm);sum(n,sm);/*函数调用*/printf(函数执行后主函数实参:n n=%d,sm=%dn,n,sm);void sum(int a,int s)/*函数定义*/int i;printf(子函数:实参送到形参n a=%d,s=%d,a,s);s=0;for(i=1;i=a;i+)s=s+i;printf(子函执行后形参:n a=%d,s=%dn,a,s);运行结果:主函数实参:n=5,sm=0子函数:实参送到形参 a=5,s=0子函执行后形参:a=5,s=15函数执行后主函数实
9、参:n=5,sm=0n函数的值函数的值n函数的值是指函数被调用后函数执行的结果,函数执行结束后会将此值返回给主调函数。n说明:(1)函数的值只能通过return语句返回主调函数。return 语句的一般形式为:return 表达式;或者为:return(表达式);执行到任何一条return语句,则本函数执行结束,并返回主调函数,故每次调用只能有一个return 语句被执行,也只能返回一个函数值。(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。(3)如果函数值为整型,在函数定义时可以省去函数类型说明。但是最好不要省略,以提高程序的可读性。(
10、4)无返回值的函数,可以明确定义为“空类型”,类型说明符为void。7.1.3 函数说明与函数调用函数说明与函数调用函数说明n语言规定,所有函数在调用之前必先对函数返回值数据类型、函数名和函数的参数个数与各个参数的类型进行说明,这就是函数说明,又称函数原型,它类似函数定义时的函数头。它指明了该用户标示符是函数,是什么类型,什么参数列表。n函数说明由函数返回类型、函数名和参数表组成,并以分号结束;它与函数定义的返回值数据类型、函数名和参数表必须一致,否则会引起编译错误。n函数说明可以不包含参数的名字,但必须包含所有参数的类型,用逗号分开。这也意味着函数说明的参数名字可以与函数定义时名字不同。n例
11、如:int area(int,int);等价于 int area(int a,int b);n如果函数的定义出现在主调函数之前,则该函数的说明可以省略,即用函数的定义充当了函数说明,例如:#include void sum(int a,int s)/*函数定义*/void main()sum(n,sm);n库函数在调用之前同样也要进行函数说明,库函数的函数说明包含在相应的头文件(.h)里,故当需要用到库函数时,需要用#include 命令将头文件包含进来。n函数调用函数调用 在程序中,函数调用就是执行相应的函数,在程序中,函数调用就是执行相应的函数,它的一般形式为:它的一般形式为:函数名函数名
12、(实际参数表实际参数表)n如果函数有返回值,可以作为一个简单表达式使用,可以与其他操作数和操作符组成复杂表达式,也可以作为调用函数的实参n如果函数没有返回值,则该调用只能单独出现作为函数语句。在语言中,调用函数常用的方式有以下几种:n(1)赋值表达式的右值:例如:z=max(x,y);是一个赋值表达式,把max的返回值赋予变量z。这种方式要求函数是有返回值的。n(2)单独的函数语句:函数调用的一般形式加上分号即构成函数语句。例如:printf(%d,a);scanf(%d,&b);这两个函数都是以函数语句的方式调用函数,任何函数调用都可以作为函数语句形式出现,无论函数有无返回值。但如果函数没有
13、返回值,也只能以这种方式调用。n(3)函数作为实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如:printf(%d,max(x,y);n注:控制语句中的条件表达式中亦可以出现函数的调用,例如:if(isprime(x).在这种方式中,函数也是要求有返回值的。n在函数调用中实参有副作用,还应该注意实参求值顺序。求值顺序不同,计算的结果可能不同。所谓求值顺序是指对实参表中各实参表达式是自左至右顺序求值,还是自右至左顺序求值。对此,各系统的规定不一定相同,Visual C+是采用自右至左顺序求值。例例7.4函数作为赋值表达式
14、的右值函数作为赋值表达式的右值#include void main()int a,b,maxab;int max(int a,int b);/*函数说明*/printf(请输入两个数据a b:n);scanf(%d%d,&a,&b);maxab=max(a,b);printf(maxab=%dn,maxab);int max(int a,int b)/*函数的定义*/if(ab)return a;else return b;例例7.5 函数作为单独的函数语句函数作为单独的函数语句#include void chessboard();/*/函数说明*/void main()chessboard(
15、);void chessboard()printf(n);printf(“n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(you()n);printf(computer()n);printf(n);printf(n);printf(n);printf(n);printf(“n);printf(n);printf(n);printf(n);printf(n);printf(n);7.2 俄罗斯方块的旋转俄罗斯方块的旋转俄罗斯方块输出的图形基本上有七种:点阵方式是比较恰当的存储和输出方式
16、不同方向俄罗斯方块显示顺序不同方向俄罗斯方块显示顺序方向方向1的算法的算法俄罗斯方块旋转的主函数算法描述俄罗斯方块旋转的主函数算法描述n#include n#include /*用到了srand、rand函数*/n#include /*用到了time函数*/n#include /*用到了getch函数*/nint fk24=1,0,0,0,1,1,1,0;/*第2种图形*/nvoid drawfk(int fx)/*显示某种方块的方向fx图*/nnint i,j;nswitch(fx)nn case 0:/*方向0*/nn case 1:/*方向1*/nn case 2:/*方向2*/n n
17、case 3:/*方向3*/n n n方向方向0:for(i=0;i2;i+)for(j=0;j4;j+)if(fkij)printf();elseprintf();printf(n);break;方向方向1:for(i=0;i=0;j-)if(fkji)printf();elseprintf();printf(n);break;方向方向2:for(i=1;i=0;i-)for(j=3;j=0;j-)if(fkij)printf();elseprintf();printf(n);break;方向方向3:for(i=3;i=0;i-)for(j=0;j2;j+)if(fkji)printf();
18、elseprintf();printf(n);break;void main()int fx;char choice;srand(unsigned)time(NULL);/*播种子*/fx=rand()%4;do drawfk(fx);choice=getch();if(choice=L|choice=l)/*顺时针旋转*/fx=+fx%4;else fx=(fx+3)%4;system(cls);/*在Visual C+表示清除字符界面的函数*/while(choice!=27);变量的分类变量的分类n有了函数,可以使变量使用得更加灵活,为有了函数,可以使变量使用得更加灵活,为了更好使用,对
19、变量进行了划分了更好使用,对变量进行了划分n按照作用域分按照作用域分n局部变量局部变量n全局变量全局变量n按照生命周期分按照生命周期分n自动变量自动变量n静态变量静态变量n寄存器变量寄存器变量 7.2.1 局部变量和全局变量局部变量和全局变量n局部变量局部变量n局部变量是在函数内部定义的,其作用域仅限于函数内部,局部变量是在函数内部定义的,其作用域仅限于函数内部,所以局部变量也称为所以局部变量也称为内部变量内部变量,离开该函数后就不能再使用,离开该函数后就不能再使用该函数的内部变量了。该函数的内部变量了。说明:说明:(1)在主调函数内部定义的局部变量,在被调函数中也是无法)在主调函数内部定义的
20、局部变量,在被调函数中也是无法使用的,在被调函数中定义的局部变量在主调函数中也是无使用的,在被调函数中定义的局部变量在主调函数中也是无法使用的。法使用的。(2)形参变量是属于被调函数的局部变量,它仅仅在被调函数)形参变量是属于被调函数的局部变量,它仅仅在被调函数中可以使用。中可以使用。(3)允许在不同的函数中使用相同的变量名,它们代表不同的)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。对象,分配不同的单元,互不干扰,也不会发生混淆。(4)在复合语句中也可定义变量,其作用域只在复合语句花括)在复合语句中也可定义变量,其作用域只在复合语句花括号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 7-ch7 C语言程序设计函数 ch7 语言程序设计 函数
限制150内