函数与宏定义

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

15:27第1页第六章函数与宏定义§6.1函数概念§6.2变量作用域和存储类型§6.3内部函数与外部函数§6.4递归函数设计和调用§6.6综合范例15:27第2页例1-3#includestdio.hintadd(intx,inty);main(){inta,b,c;printf(“pleaseinputvalueofaandb:\n”);scanf(“%d%d”,&a,&b);c=add(a,b);printf(“sum=%d”,c);}intadd(intx,inty){returnx+y;}15:27第3页§6.1函数概念C语言允许把问题设计成一个一个的模块,程序通过调用模块功能来解决问题。这些模块通常都是通过函数来实现的,又可称其为函数模块。C语言中,函数可分为两类:函数是指完成一个特定工作的独立程序模块。库函数:由C语言系统提供定义如scanf()、printf()等函数自定义函数:需要用户自己定义15:27第4页•函数的组织使用结构化程序设计方法解决复杂的问题把大问题分解成若干小问题,小问题再进一步分解成若干更小的问题写程序时,用main()解决整个问题,它调用解决小问题的函数这些函数又进一步调用解决更小问题的函数,从而形成函数的嵌套调用15:27第5页main()函数1函数2……函数m函数1_1函数1_2函数m_1函数m_n……程序结构15:27第6页•main()也是一个函数,C程序由一个main()或多个函数构成。•程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。1、函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数add()返回两个数的和。2、函数完成一系列操作步骤,不需要回送任何运算结果。15:27第7页程序解析-计算圆柱体积例6-1输入圆柱体的高和半径,求圆柱体积,volume=π*r2*h。要求定义和调用函数cylinder(r,h)计算圆柱体的体积。15:27第8页例6-1源程序/*计算圆柱体积*/#includestdio.hintmain(void){doubleheight,radius,volume;doublecylinder(doubler,doubleh);/*函数声明*/printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);/*调用函数,返回值赋给volume*/volume=cylinder(radius,height);printf(Volume=%.3f\n,volume);return0;}15:27第9页例6-1源程序/*定义求圆柱体积的函数*/doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;/*计算体积*/returnresult;/*返回结果*/}Enterradiusandheight:3.010Volume=282.74315:27第10页§6.1.1函数定义函数定义的一般形式可以有两种。形式一:[存储类型符][返回值类型符]函数名([形参说明表]){函数语句体}形式二:[存储类型符][返回值类型型符]函数名([形参表])形参说明;{函数语句体}15:27第11页函数定义1:intabs_sum(intm,intn){if(m0)m=-m;if(n0)n=-n;return(m+n);}函数定义2:intabs_sum(m,n)intm,n{if(m0)m=-m;if(n0)n=-n;return(m+n);}15:27第12页1.返回运算结果的函数定义函数类型函数名(形参表)/*函数首部*/{/*函数体*/函数实现过程return表达式;}把函数运算的结果回送给主函数只能返回一个值函数返回值的类型没有分号doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}15:27第13页形参类型1参数1,类型2参数2,……,类型n参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明函数类型函数名(形参表){函数实现过程return表达式;}不能写成doubler,hdoublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}15:27第14页doublecylinder(doubler,doubleh)/*函数首部*/{/*函数体,写在一对园括号内*/doubleresult;result=3.1415926*r*r*h;/*计算圆柱体积*/returnresult;/*返回运算结果*/}分析函数的定义函数类型函数名形参表与函数类型一致15:27第15页2.不返回运算结果的函数定义void函数名(参数表)/*函数首部*/{/*函数体*/函数实现过程return;/*可以省略return*/}这类函数通常用于屏幕输出等表示不返回结果不能省略否则函数类型被默认定义为int15:27第16页例6-2输出5之内的数字金字塔。/*输出数字金字塔*/#includestdio.hintmain(void){voidpyramid(intn);/*函数声明*/pyramid(5);/*调用函数,输出数字金字塔*/return0;}122333444455555voidpyramid(intn)/*函数定义*/{inti,j;for(i=1;i=n;i++){/*需要输出的行数*/for(j=1;j=n-i;j++)/*输出每行左边的空格*/printf();for(j=1;j=i;j++)/*输出每行的数字*/printf(%d,i);/*每个数字的前后各有一个空格*/putchar('\n');}}15:27第17页15:27第18页6.1.2函数的调用•定义一个函数后,就可以在程序中调用这个函数。•调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。•调用自定义函数时,程序中必须有与调用函数相对应的函数定义。15:27第19页1.函数调用的形式和过程•使用返回值:volume=cylinder(radius,height);printf(“%f\n”,cylinder(radius,height));•完成操作:pyramid(5);常用于void类型函数的调用常用于返回结果的函数的调用常量、变量、表达式函数名(实参表)15:27第20页函数调用的过程•计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。•函数遇return或最后的大括号,返回主函数15:27第21页分析函数调用的过程#includestdio.hintmain(void){doubleheight,radius,volume;doublecylinder(doubler,doubleh);printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);printf(Volume=%.3f\n,volume);return0;}doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}调用函数实参形参执行函数中的语句返回调用它的地方15:27第22页2.参数传递•函数定义时的参数被称为形式参数(简称形参)doublecylinder(doubler,doubleh);•函数调用时的参数被称为实际参数(简称实参)volume=cylinder(radius,height);•实参形参在参数传递过程中,实参把值复制给形参。形参和实参一一对应:数量一致,类型一致,顺序一致形参:变量,用于接受实参传递过来的值实参:常量、变量或表达式单向传递15:27第23页3.函数结果返回•函数返回的两种情况完成确定的运算,有一个运算结果返回给主调函数。完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。•函数结果返回的形式:return表达式;return(表达式);15:27第24页【例6-3】定义判断奇偶数的函数even(n)定义一个判断奇偶数的函数even(n),当n为偶数时返回1,否则返回0。/*判断奇偶数的函数*/inteven(intn)/*函数首部*/{if(n%2==0)/*判别奇偶数*/return1;/*偶数返回1*/elsereturn0;/*奇数返回0*/}如何调用该函数?15:27第25页4.函数原型声明函数类型函数名(参数表);doublecylinder(doubler,doubleh);voidpyramid(intn);•函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。•如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。•函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。只写函数定义中的第1行(函数首部),并以分号结束。15:27第26页例1-3#includestdio.hintadd(intx,inty);main(){inta,b,c;printf(“pleaseinputvalueofaandb:\n”);scanf(“%d%d”,&a,&b);c=add(a,b);printf(“sum=%d”,c);}intadd(intx,inty){returnx+y;}函数声明函数调用函数定义15:27第27页//*******************************************//*程序:6_4.c(验证素数程序)*//*主要功能:可验证某数是否为素数*//*******************************************#includestdio.h//预编译命令#includemath.h//预编译命令intcheckprime(intb);//子函数声明intmain()//主函数{inta=0;//定义整型变量,初始化为0printf(请输入一个整数:a=“);//提示信息scanf(“%d”&a);//键盘输入一个整数//用实参a调用子函数,该子函数返回值作为if语句的分支条件if(checkprime(a)){//checkprime(a)为1printf(是素数“);}else{//checkprime(a)为0printf(“不是素数“);}}//主函数结束15:27第28页#includestdio.h//预编译命令#includemath.h//预编译命令intcheckprime(intb);//子函数声明intmain()//主函数{inta=0;//定义整型变量,初始化为0printf(请输入一个整数:a=“);//提示信息scanf(“%d”&a);//键盘输入一个整数15:27第29页//用实参a调用子函数,该子函数的//返回值作为if语句的分支条件if(checkprime(a)){//checkprime(a)为1printf(是素数“);}else{//checkprime(a)为0printf(“不是素数“);}}//主函数结束15:27第30页intcheckprime(intb)//子函数,b为形式参数{intk=0;//定义整型变量,并初始化for(k=2;k=sqrt((double)b);k++)//循环{if(b%k==0)//如果b能够被k整除,则返回

1 / 129
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功