程序设计技术.ppt
《程序设计技术.ppt》由会员分享,可在线阅读,更多相关《程序设计技术.ppt(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序设计技术程序设计语言和算法描述C程序设计入门C程序的控制结构函数与程序结构指针与函数构造数据类型与指针位运算文件C语言应用第四章模块化程序设计基础4.1模块化基本概念4.2程序设计中实现模块化的方法4.3程序设计中标识符的作用域和生存期4.4递归方法的实现4.1模块化基本概念模块化概念 模块化就是将一个大的复杂的程序根据模块化就是将一个大的复杂的程序根据“分而治之,分而治之,各个击破各个击破”的原则划分成为若干个模块,的原则划分成为若干个模块,每个模块完每个模块完成一个相对独立的子功能,将这些模块按成一个相对独立的子功能,将这些模块按某种方式搭某种方式搭接起来就构成了解决总体问题的程序。接
2、起来就构成了解决总体问题的程序。4.1模块化基本概念对软件进行模块化可以得到如下好处:(1)软件具有模块化结构,所有软件开发工作可以如同搭软件具有模块化结构,所有软件开发工作可以如同搭积木积木那样,把各个功能模块进行组合。模块相对独立,任一那样,把各个功能模块进行组合。模块相对独立,任一模块中模块中的错误不易扩散到其他模块中去,从而提高了软件开发的错误不易扩散到其他模块中去,从而提高了软件开发的效率的效率和软件的可靠性。和软件的可靠性。(2)由于模块的功能是单一完整、相对独立的,所以每个由于模块的功能是单一完整、相对独立的,所以每个模块都可以单独地设计它的算法,单独进行编写和调模块都可以单独地
3、设计它的算法,单独进行编写和调试。对于大型软件的开发,采用模块化结构,可以由试。对于大型软件的开发,采用模块化结构,可以由多个程序设计人员参与进行集体性开发,从而加快软多个程序设计人员参与进行集体性开发,从而加快软件开发速度、缩短软件开发周期。件开发速度、缩短软件开发周期。(3)采用模块化程序设计技术开发的计算机软件投入运行采用模块化程序设计技术开发的计算机软件投入运行后,在进行软件维护时,能够进行整个系统的调试,后,在进行软件维护时,能够进行整个系统的调试,也可以进行单一模块的调试。对单一模块的调试和修也可以进行单一模块的调试。对单一模块的调试和修改不会影响到其它模块的功能。当软件系统需要扩
4、充改不会影响到其它模块的功能。当软件系统需要扩充时,只需增加相应功能模块,而不会涉及到整个软件时,只需增加相应功能模块,而不会涉及到整个软件系统。因此,采用模块化程序设计技术开发的计算机系统。因此,采用模块化程序设计技术开发的计算机软件具有良好的维护性。软件具有良好的维护性。4.1模块化基本概念信息隐蔽和局部化概念信息的隐蔽指的是在设计和确定模块时,应该使得模块内包含的所有信息(数据和执行代码)对于那些不需要这些信息的其他模块来说是不可访问的。也就是说,应该将模块与模块之间的关系尽可能限制在最小的范围之内。信息的局部化指的是在划分和确定模块时,将那些关系密切的软件元素在物理位置上尽可能靠近。例
5、如,在程序设计对数据元素的局部化以保证数据元素只能在程序的局部范围内使用。4.2程序设计中实现模块化的方法#includestdio.hvoidmain()inta,b;intfac(int);for(a=1;a=5;a+)b=fac(a);printf(%d!=%dn,a,b);int fac(int c)int fac(int c)int m,s;int m,s;s=1;s=1;for(m=1;m=c;m+for(m=1;m=c;m+)s=s*m;s=s*m;return(s);return(s);4.2程序设计中实现模块化的方法一、函数的定义和声明C语言函数定义的现代风格形式如下:返回值
6、类型说明符函数名(形式参数表及其说明)函数的操作对象(数据)定义和说明部分函数的执行语句部分4.2程序设计中实现模块化的方法类型名类型名 函数名(类函数名(类型名型名 形参形参1,类型名,类型名 形参形参2,)说明语句;说明语句;执行语句;执行语句;函数首部(函数头)函数体例:两个数之和的函数。doubleadd(doublex,doubley)doublez;z=x+y;return(z);函函数数体体:中的内容,包括说明语句和执行语句。空空函函数数:函数体为空的函数,例,便于扩充和细化程序。注:(1)函数的定义是平行的,不允许在一个函数的内部再定义一个函数。(2)函数值的类型为int或ch
7、ar时,可省略;不需返回函数值时,可用类型名void。(3)多个形参以逗号分隔。(4)不同函数中的局部变量可以同名。4.2程序设计中实现模块化的方法从上面例子可以看出函数的定义内容为:1函数类型(既函数值类型)2函数名3形式参数的数目、类型4函数体内容4.2程序设计中实现模块化的方法函数的返回值类型说明符规定了函数返回值的函数的返回值类型说明符规定了函数返回值的数据类型。例如,上面例子中数据类型。例如,上面例子中double数据类型数据类型说明了函数说明了函数fac被执行后可以得到一个被执行后可以得到一个double数数据类型的数据。据类型的数据。C语言规定,如函数的返回值是整型(int)或者
8、是字符型(char)时,函数的返回值类型说明符可以缺省;如果所定义的函数没有(或不需要有)返回值,则函数的返回值类型为void(空类型)。4.2程序设计中实现模块化的方法函数名函数名是为所定义的函数取的名字,函数名是函数名是为所定义的函数取的名字,函数名是C C语言中语言中合法的标识符。函数名后的圆括号是函数的标志,合法的标识符。函数名后的圆括号是函数的标志,即即使函数没有形式参数也不能省略。除主函数使函数没有形式参数也不能省略。除主函数mainmain()()外,其余的函数名均可以由用户自己取名,但在外,其余的函数名均可以由用户自己取名,但在同一同一程序的各个源文件中的函数不能重名。程序的各
9、个源文件中的函数不能重名。4.2程序设计中实现模块化的方法形式参数函数定义时填入的参数我们称之为形式参数,简称形参,它们同函数内部的局部变量作用相同。形式参数写在函数名后面的一对圆括号内,它主要有两个作用:(1)表示将从主调函数中接收的信息。函数的形式参数及其说明表是为函数接收外来数据提供变量名称以便在函数中使用,它规定了传递数据的类型和数目。如:int f(int a,float b)表示将从主调函数中接收一个int型和一个float型数据。形式参数之间应以调号相隔。无形式参数时,圆括号可以为空,也可以使用void声明它为空。如 int f()与 int f(void)两者完全等价,但是圆括
10、号不能省掉。(2)在函数体中形式参数是可以被引用的,可以输入、输出、被赋以新值或参与运算。4.2程序设计中实现模块化的方法函数体函数体是由变量定义部分和C语句组成。在函数体中定义的变量只有在执行该函数时才存在。函数体中也可以不定义变量,而只有语句。也可以二者皆无。如:void nothing()这是一个空函数,调用它不产生任何有效操作,但却是一个符合C语言语法的合法函数。4.2程序设计中实现模块化的方法函数执行的最后一个操作是返回。函数返回的基本格式有如下两种:第一种即有返回值格式:return;第二种即无返回值格式:(函数必须定义为void类型,也可省略返回语句return)return;对
11、于第一种有返回值的语句其执行过程如下:先计算出表达式的值;若表达式的类型和函数类型不同时,将表达式的类型自动转换为函数类型,这种转换是强制性的,可能出现不保值的现象;将计算出表达式的值传给主调函数,然后将程序控制权交给主调函数。此时主调函数接管控制权,继续执行主调函数后的语句。对于第二种无返回值的语句其执行过程如下:当被调函数执行到return;语句时,若无return语句,在执行完函数的最后一个语句之后,从概念上讲,是遇到了函数的结束符“”(当然这个花括号实际上并不会出现在目标码中,但我们可以这样理解),将程序控制权交回给主调函数,此时主调函数接管控制权,继续执行主调函数中调用该被调函数的后
12、继语句。有时在函数中设立了多个终止点以简化函数、提高效率。切记,一个函数可以有多个返回语句,但函数执行到任何一个return语句都会将程序控制权交给主调函数。此时主调函数接管控制权,继续执行主调函数后的语句。如下所示,函数在s1、s2相等时返回1,不相等时返回-1。int find_char(char s 1,char s 2)if(s1=s2)return 1;elsereturn-1;4.2程序设计中实现模块化的方法函数的申明在主调函数中,要对本函数将要调用的函数的特在主调函数中,要对本函数将要调用的函数的特征事征事先进行必要的声明。所谓先进行必要的声明。所谓“声明声明”是指向编译系是指向
13、编译系统提供统提供必要的信息:函数名,函数的返回值的类型,函必要的信息:函数名,函数的返回值的类型,函数参数参数的个数、类型及排列次序,以便编译系统对函数的个数、类型及排列次序,以便编译系统对函数的数的调用进行检查。例如,检查形参与实参类型是否调用进行检查。例如,检查形参与实参类型是否一一致,使用函数返回值的类型是否正确。致,使用函数返回值的类型是否正确。4.2程序设计中实现模块化的方法(1)如何申明系统函数的申明系统函数的申明 使使用用标标准准的的库库函函数数时时,由由于于系系统统定定义义的的标标准准库库函数的说明都函数的说明都集集中中在在一一些些称称为为“头头文文件件”的的文文本本文文件件
14、中中,在在程程序中如果要调用序中如果要调用系系统统的的标标准准库库函函数数时时,也也要要在在程程序序的的适适当当位位置置写写上:上:#includeinclude 或或#include include“相相应应头头文文件件”将将调用有关库函数调用有关库函数时的必要信息包含的本源文件中来。例如:时的必要信息包含的本源文件中来。例如:#include include 或或#inlcude inlcude“stdio.h”“stdio.h”用户自定义函数的申明用户自定义函数的申明4.2程序设计中实现模块化的方法自定义的函数其声明的一般格式为:类型标识符 函数名(类型标识符 形参,类型标识符 形参,)
15、;这些信息就是函数定义中的第一行(称函数头)的内容,也称函数模型(或函数原型)。设有一函数的定义为:double funa(double a,int b,float c)函数体4.2程序设计中实现模块化的方法正确完整的函数声明应为:double funa(double a,int b,float c);(注意末尾的分号)这里的形参的名字并不重要,重要的是形参类型,故函数声明又可以不写形参名,即 double funa(double,int,float);但不能只写形参名,不写形参的类型。如:double funa(a,b,c);(错)一般也不能不写函数的类型,如:funa(double a,i
16、nt b,float c);(错)只有函数返回值为I n t或char时,函数标识符才可以省掉。形参的次序也不能写错,如:double funa(int b,float c,double a);(错)4.2程序设计中实现模块化的方法例4-1对被调函数的声明示例。#includevoidmain()longfac(intx);/*对函数fac的声明*/intn;printf(Inputthenumbern:);scanf(%d,&n);printf(%d!=%ldn,n,fac(n);longfac(intx)/*函数fac的定义*/longy;for(y=1;x0;-x)y*=x;return
17、y;4.2程序设计中实现模块化的方法(2)何时不对被调函数进行声明:被调函数的返回值数据类型是整型或字被调函数的返回值数据类型是整型或字符型时,此时系统自动按整型进行隐式符型时,此时系统自动按整型进行隐式声明;声明;被调函数的定义出现在主调函数之前时,被调函数的定义出现在主调函数之前时,其原因是编译系统此时已经知道了被调其原因是编译系统此时已经知道了被调函数的所有特征;函数的所有特征;4.2程序设计中实现模块化的方法例4-2对被调函数不必声明的示例。#include long fac(int x)/*函数函数fac的定义出现在主调函数之前的定义出现在主调函数之前*/long y;for(y=1
18、;x0;-x)y*=x;return y;void main()int n;printf(Input the number n:);scanf(%d,&n);printf(%d!=%ldn,n,fac(n);4.2程序设计中实现模块化的方法(3)申明的位置在所有的函数之前;在所有函数的外部;在调用函数的内部的说明部分;4.2程序设计中实现模块化的方法函数调用时的参数传递方式传值调用传引用(传地址值)调用传值调用方式传值方式是一种数据复制的方式,在这种方式下,实际参数通过复制的方式传递给形式参数,因此被传递的数据在被调函数中无论怎样变化,都不会影响该数据在主调函数中的值。函数调用时的步骤:函数调
19、用时的步骤:1 1、建立形式参数和局部、建立形式参数和局部变量变量2 2、实际参数拷贝到对应、实际参数拷贝到对应形式参数形式参数3 3、控制转到被调函数执、控制转到被调函数执行行4 4、退出被调函数时撤消、退出被调函数时撤消其形式参数和局部变量其形式参数和局部变量n n二、函数的调用和数据传递二、函数的调用和数据传递二、函数的调用和数据传递二、函数的调用和数据传递 4.2程序设计中实现模块化的方法例4-3函数调用时值参数传递示例。#includeintchange(intx,inty);voidmain()intm=10,n=20;printf(m=%d,n=%dn,m,n);printf(%
20、dn,change(m,n);printf(m=%d,n=%dn,m,n);intchange(intx,inty)x+,y+;printf(“x=%d,y=%dn”,x,y);returnx+y;程序运行的结果为:m=10,n=2032m=10,n=20/*请仔细分析并回答为什么输出这个结果*/4.2程序设计中实现模块化的方法调用时调用时形参形参y形参形参x10201020实参实参m实参实参n形参形参y形参形参x实参实参a实参实参b10201121执执行行完完交交换换后后图图4.24.2程序设计中实现模块化的方法Question?在语言中,可以用几种方式调用函数:(1 1)函数表达式。函数作
21、为表达式的一项,出现在表)函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。式要求函数是有返回值的。(2 2)函数语句。函数语句。C C语言中的函数可以只进行某些操作语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立而不返回函数值,这时的函数调用可作为一条独立的语句。的语句。(3 3)函数实参。函数作为另一个函数调用的实际参数)函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行出现。这种情况是把该函数的返回值作为实参进行传送,因此要
22、求该函数必须是有返回值的。传送,因此要求该函数必须是有返回值的。4.2程序设计中实现模块化的方法函数的调用应注意的几点:(1 1)调调用用函函数数时时,函函数数名名称称必必须须与与具具有有该该功功能能的自定义函数名称完全一致。的自定义函数名称完全一致。(2 2)实实参参在在类类型型上上按按顺顺序序与与形形参参,必必须须一一一一对对应应和和匹匹配配。如如果果类类型型不不匹匹配配,C C编编译译程程序序将将按按赋赋值值兼兼容容的的规规则则进进行行转转换换。如如果果实实参参和和形形参参的的类类型型不不赋赋值值兼兼容容,通通常常并并不不给给出出出出错错信信息息,且且程序仍然继续执行,只是得不到正确的结
23、果。程序仍然继续执行,只是得不到正确的结果。(3 3)如果实参表中包括多个参数,对实参的求)如果实参表中包括多个参数,对实参的求值顺序随系统而异。有的系统按自左向右顺序值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反求实参的值,有的系统则相反。Turbo CTurbo C和和MS MS C C是按自右向左的顺序进行的是按自右向左的顺序进行的 。4.2程序设计中实现模块化的方法例4-4 编程求出所有的两位的“绝对素数”,所谓“绝对素数”是指一个素数,当它的数字位置对换后仍然是素数。解题思想:对于任意两位数解题思想:对于任意两位数n n,首先调用函数首先调用函数primeprim
24、e判判断断n n是否是素数,如果是否是素数,如果n n是素数,则调用函数是素数,则调用函数reversereverse求求数字位置对换后的数,函数数字位置对换后的数,函数primeprime判断其是否是素判断其是否是素数,如果数,如果reversereverse(n n)也是素数,也是素数,n n是是“绝对素数绝对素数”,输输出出n n。函数函数primeprime()()是一个判断素数的通用函数,返回值是一个判断素数的通用函数,返回值为为0 0时表示非素数,返回值为时表示非素数,返回值为1 1时表示为素数。其算法时表示为素数。其算法描述如下:描述如下:4.2程序设计中实现模块化的方法算法:p
25、rime(a)/*表示prime从主调函数接收a*/算法开始定义标志量b,循环变量k;If(a=2)then返回值 1;else if(a能被2整除)then返回值 0;Else b=1,k=3 while(k=a的平方根 并且b=1)if(a能被k整除)thenb=0 b=0 k=k+2k=k+2 返回返回b b;算法算法结结束束 4.2程序设计中实现模块化的方法reverse(int a)函数是求a各位数字前后位置对换后的整数的通用函数,如12345各位数字前后位置对换后转换为54321,其本思路:采用a%10求出a的个位,然后a=a/10,重复前面的操作,直到a=0。同时注意:如1234
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 技术
限制150内