《C语言程序设计第七讲.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第七讲.ppt(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C语言程序设计语言程序设计主讲:杨雪青主讲:杨雪青华北水利水电学院计算中心华北水利水电学院计算中心1/16/20235.3模块的递归调用模块的递归调用 人们在解决一些复杂问题时,为了降低问题的复杂程人们在解决一些复杂问题时,为了降低问题的复杂程度(如问题的规模等),一般总是将问题逐层分解,最后度(如问题的规模等),一般总是将问题逐层分解,最后归结为一些最简单的问题。归结为一些最简单的问题。第六讲第六讲 模块程序设计模块程序设计(一一)1/16/2023例例5.5编写一个编写一个C函数,对于输入的参数函数,对于输入的参数n,依次打印输,依次打印输出自然数出自然数1到到n。这是一个很简单的问题
2、,实际上不用递归就能解决,其这是一个很简单的问题,实际上不用递归就能解决,其C函数如下:函数如下:#includestdio.hwrt(intn)intk;for(k1;kn;k)printf(%dn,k);return;1/16/2023解决这个问题还可以用以下的递归函数来实现:解决这个问题还可以用以下的递归函数来实现:#includestdio.hwrt1(intn)if(n!0)wrt1(n1);printf(%dn,n);return;1/16/2023自自己己调调用用自自己己的的过过程程称称为为递递归归调调用用过过程程。在在C语语言言中中,自己调用自己的函数称为递归函数。自己调用自己
3、的函数称为递归函数。递归分为直接递归与间接递归两种。递归分为直接递归与间接递归两种。所谓直接递归,是指直接调用函数本身。所谓直接递归,是指直接调用函数本身。1/16/20235.4程序举例程序举例例例5.6编编写写一一个个函函数数,其其功功能能是是判判断断给给定定的的正正整整数数是是否否是是素素数数,若是素数则返回函数值若是素数则返回函数值1,否则返回函数值,否则返回函数值0。其其C函数如下:函数如下:#includemath.hsushu(intn)intk,i,flag;ksqrt(double)n);i2;flag0;while(ik)&(flag0)if(n%i0)flag1;ii1;
4、return(!flag);1/16/2023例例5.8Hanoi塔问题。塔问题。相相传传古古代代印印度度有有一一座座Bramah庙庙,庙庙中中有有三三根根插插在在黄黄铜铜板板上上的的宝宝石石柱柱,在在其其中中的的一一根根柱柱子子上上放放了了64个个金金盘盘子子,大大盘盘在在下下,小小盘盘在在上上,称称为为Hanoi塔塔。有有一一天天,庙庙里里的的和和尚尚们们想想把把这这些些盘盘子子从从一一根根柱柱子子上上移移到到另另一一根根柱柱子子上上,规规定定每每次次只只允允许许移移动动一一个个盘盘子子,并并且且,在在移移动动过过程程中中都都不不允允许许出出现现大大盘盘子子压压在在小小盘盘子子上上面面的的
5、现现象象,但但在在移动盘子的过程中可以利用三根柱子中的任何一根。移动盘子的过程中可以利用三根柱子中的任何一根。为为了了使使问问题题具具有有普普遍遍性性,假假设设圆圆盘盘数数为为n,按按直直径径从从小小到到大大依依次次编编号号为为1,2,n;三三根根柱柱子子的的名名称称分分别别为为X,Y,Z。开开始始时时,n个个圆圆盘盘按按从从大大到到小小的的顺顺序序(即即下下面面放放大大圆圆盘盘,上上面面放放小小圆圆盘盘)放放在在X柱柱子子上上,现现在在要要将将X柱柱子子上上的的n个个圆圆盘盘移移到到Z柱柱子子上上,其其移移动动的原则如上所述。这个问题称为的原则如上所述。这个问题称为n阶阶Hanoi塔问题。塔
6、问题。1/16/2023可以写出可以写出C程序如下:程序如下:#includestdio.hmain()intn;charxX,yY,zZ;voidhanoi();printf(inputn);scanf(%d,&n);hanoi(n,x,y,z);voidhanoi(n,x,y,z)intn;charx,y,z;voidmove();1/16/2023if(n1)move(x,n,z);elsehanoi(n1,x,z,y);move(x,n,z);hanoi(n1,y,x,z);return;voidmove(x,n,z)intn;charx,z;printf(%c(%d)%cn,x,n,
7、z);1/16/20235.5编译预处理编译预处理编编译译预预处处理理功功能能是是C语语言言的的一一个个重重要要特特点点。所所谓谓编编译译预预处处理理,是是指指C语语言言编编译译系系统统首首先先对对程程序序模模块块中中的的编编译译预预处处理理命命令令进行处理。进行处理。C语言提供的编译预处理命令主要有以下语言提供的编译预处理命令主要有以下3种:种:(1)宏定义;)宏定义;(2)文件包含命令;)文件包含命令;(3)条件编译命令。)条件编译命令。编编译译预预处处理理命命令令一一般般是是在在函函数数体体的的外外面面。正正确确使使用用编编译译预预处理命令,可以编写出易于调试、易于移植的程序模块。处理命
8、令,可以编写出易于调试、易于移植的程序模块。1/16/20235.5.1 文件包含命令文件包含命令文文件件包包含含是是指指一一个个源源文文件件可可以以将将另另一一个个指指定定的的源源文文件件包包括括进进来。来。文件包含命令的一般形式为文件包含命令的一般形式为#include文件名文件名或或#include文件名文件名其其功功能能是是将将指指定定文文件件中中的的全全部部内内容容读读到到该该命命令令所所在在的的位位置置后后一起被编译。一起被编译。1/16/2023在使用文件包含命令时,要注意以下几个问题:在使用文件包含命令时,要注意以下几个问题:(1)当当#include命命令令指指定定的的文文件
9、件中中的的内内容容改改变变时时,包包含含这这个个文件的所有源文件都应该重新进行编译处理;文件的所有源文件都应该重新进行编译处理;(2)一一个个#include命命令令只只能能指指定定一一个个被被包包含含文文件件,如如果果需需要要包含多个文件,则要用多个包含多个文件,则要用多个#include命令实现;命令实现;(3)被被包包含含的的文文件件应应该该是是源源文文件件,不不能能是是经经编编译译后后的的目目标标文文件;件;(4)文文件件包包含含可可以以嵌嵌套套使使用用,即即被被包包含含的的文文件件中中还还可可以以使使用用#include命令;命令;(5)由由#include命命令令所所指指定定的的文
10、文件件中中可可以以有有任任何何语语言言成成分分,因因此此,通通常常可可以以将将经经常常使使用用的的、具具有有公公用用性性质质的的符符号号常常量量、带带参参数数的的宏宏定定义义以以及及外外部部变变量量等等集集中中起起来来放放在在这这种种文文件件中中,以以尽尽量量避避免一些重复操作。免一些重复操作。1/16/20235.5.2 条件编译命令条件编译命令C语语言言的的编编译译预预处处理理程程序序提提供供了了条条件件编编译译能能力力,以以便便使使同同一一个个源源程程序序在在不不同同的的编编译译条条件件下下能能够够产产生生不不同同的的目目标标代代码码文件。文件。1#ifdef,#else,#endif其
11、一般形式为其一般形式为#ifdef标识符标识符程序段程序段1#else程序段程序段2#endif 其其作作用用是是,如如果果“标标识识符符”已已经经定定义义过过(一一般般是是指指用用#define命命令令定定义义),则则程程序序段段1参参加加编编译译,而而程程序序段段2不不参参加编译;否则程序段加编译;否则程序段2参加编译,而程序段参加编译,而程序段1不参加编译。不参加编译。1/16/20232#ifndef,#else,#endif其一般形式为其一般形式为#ifndef标识符标识符程序段程序段1#else程序段程序段2#endif 其作用是,如果标识符没有定义过,则程序段其作用是,如果标识符
12、没有定义过,则程序段1参加编译,而程参加编译,而程序段序段2不参加编译;否则程序段不参加编译;否则程序段2参加编译,而程序段参加编译,而程序段1不参加编译。不参加编译。1/16/20233#if,#else,#endif其一般形式为其一般形式为#if常量表达式常量表达式程序段程序段1#else程序段程序段2#endif 其作用是,如果常量表达式的值为其作用是,如果常量表达式的值为“真真”(值非(值非0),则),则程序段程序段1参加编译,而程序段参加编译,而程序段2不参加编译;否则程序段不参加编译;否则程序段2参加参加编译,而程序段编译,而程序段1不参加编译。不参加编译。1/16/2023一、几
13、种循环的比较一、几种循环的比较 三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解。(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解。(尽管(尽管for循环功能强大,但是并不是在任何场合都可以不分条件使)。循环功能强大,但是并不是在任何场合都可以不分条件使)。例:将例:将50-100之间的能被之间的能被3整除的数输出(用三种循环结构实现
14、)整除的数输出(用三种循环结构实现)第五讲第五讲 循环结构程序设计循环结构程序设计(二二)/*用用while语句实现语句实现*/main()int i=50;while(i=100)if(i%3=0)printf(“%4d”,n);i+;1/16/2023二、循环的嵌套二、循环的嵌套 2.2.循环嵌套的执行过程循环嵌套的执行过程例例.写出下列程序的执行结果写出下列程序的执行结果#include main()int i,j;for(i=1;i=6;i+)for(j=1;j=i;j+)printf(*);printf(n);第六讲第六讲 模块程序设计模块程序设计(一一)1/16/2023相应的相应
15、的C程序如下:程序如下:#include stdio.hmain()int n,k;double s;for(n1;n10;nn1)s1.0;for(k1;kn;kk1)ss*k;printf(%2d!%16.7fn,n,s);第五讲第五讲 循环结构程序设计循环结构程序设计(二二)1/16/2023百钱买百鸡问题程序#include stdio.hmain()int x,y,z;printf(n cock hen chickn);for(x=0;x=19;x+)for(y=0;y=32;y+)z=100-x-y;if(5*x+3*y+z/3=100)&(z%3=0)printf(%5d,%5d,%5dn,x,y,z);第九讲第九讲 循环结构程序设计循环结构程序设计(三三)1/16/2023第五讲第五讲 循环结构程序设计循环结构程序设计(二二)#include main()int i,j;for(i=1;i=6;i+)for(j=1;j=i;j+)printf(*);printf(n);1/16/2023 作业:作业:P P113 113 4.07,4.09第三讲第三讲 选择结构程序设计选择结构程序设计1/16/20231/16/2023
限制150内