为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C语言函数课件

2018-12-03 49页 ppt 1MB 101阅读

用户头像 个人认证

一米阳光

暂无简介

举报
C语言函数课件C语言程序设计 模块化程序设计——函数孙小松**C语言程序设计 第6章模块化程序设计--函数§6.1函数的概念C程序结构●C程序结构如图所示1.一个C程序可以分为若干个函数2.每个程序有且只有一个主函数(main),其他都是子函数3.子函数可以相互调用,但主函数不能被 调用4.一个C源程序由一个或多个文件构成,每个文件就是一个编译单位C语言程序设计 第6章模块化程序设计--函数●说明:1.一个C程序的执行从主函数(main)开始,调用其他函数后仍回到main主函数结束.2.每个子函数...
C语言函数课件
C语言程序设计 模块化程序设计——函数孙小松**C语言程序设计 第6章模块化程序设计--函数§6.1函数的概念C程序结构●C程序结构如图所示1.一个C程序可以分为若干个函数2.每个程序有且只有一个主函数(main),其他都是子函数3.子函数可以相互调用,但主函数不能被 调用4.一个C源程序由一个或多个文件构成,每个文件就是一个编译单位C语言程序设计 第6章模块化程序设计--函数●说明:1.一个C程序的执行从主函数(main)开始,调用其他函数后仍回到main主函数结束.2.每个子函数都是平行的,任何子函数都不从属于其他函数3.从用户角度,函数可以分为:☆标准函数,即库函数☆用户自定义函数4.从函数形式可以分为:☆无参函数:printstar()☆有参函数:printf(“hello”)#include<stdio.h>voidprintStar(){printf(“*******************\n”);}voidprintMessage(){printf(“Hello,world.\n”);printStar();}voidmain(){printStar();printMessage();}C语言程序设计 第6章模块化程序设计--函数函数定义的一般形式●函数定义的一般形式:类型说明函数名([形式参数说明]){函数体}形式参数说明方法:数据类型变量名[,类型变量名]●无参数函数定义形式:类型说明函数名(){函数体}voidprintHello(){printf(“hello!\n”);}●有参数函数定义形式:类型说明函数名(形式参数说明){函数体}intsum(intx,inty){intz;z=x+y;return(z);}C语言程序设计 第6章模块化程序设计--函数●函数体一般情况下,函数体有两部分组成:{[局部变量说明]语句;}局部变量说明:函数体内的变量.其有效范围仅在本函数体内起作用,离开本函数无意义.intsum(intx,inty){intz;//局部变量定义z=x+y;return(z);}C语言程序设计 第6章模块化程序设计--函数函数的参数和函数的值●一个程序由若干个函数组成,各函数调用时经常要传递一些数据,即调用函数把数据传递给被调用函数,经过被调用函数处理后,得到一个确定的结果,在返回调用函数时,将结果带回调用函数.#include<stdio.h>intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}主函数子函数..c=max(a,b);..intmax(intx,inty)...return(z);各函数之间数据往来通过参数传递和返回语句实现C语言程序设计 第6章模块化程序设计--函数函数参数:用于函数间数据的传递形式参数:定义函数时给出的参数实际参数:调用函数时给出的参数#include<stdio.h>intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}对于函数max有两个形式参数x,y形式参数x和y只在max函数中使用a,b是主函数中定义的变量,当main函数调用max函数时.a,b成为max的实际参数调用时,实际参数的值赋给形参进行处理例:max接受到两个值: 89max返回89一、形式参数和实际参数C语言程序设计 第6章模块化程序设计--函数#include<stdio.h>intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);} 说明:1.定义函数时,必须说明形参的类型,形参只能是变量(包括数组).不能是常量或达式2.函数被调用之前,形参和子函数中的变量不占内存,调用结束返回,形参所占的内存被收回.3.实参可以是常量、变量或表达式.因为传递过来的是具体数值.4.实参和形参类型必须一致(或可以安全转换).5.C语言中,实参和形参传递的是”按值传递”,即单向传递,只与参数相对位置有关,而与变量名无关intb,intaintc;c=(a>b)?a:b;return(c);1320main-amain-bmax-amax-b1320C语言程序设计 第6章模块化程序设计--函数#include<stdio.h>intsum(inta,intb){a=a+b;b=a+b;return(a);}voidmain(){inta=1,b=3,c;c=sum(a,b);printf(“sumof%d,%dis%d\n”,a,b,c);}阅读下面程序,写出运行结果函数被调用之前,形参和子函数中的变量不占内存,调用结束返回,形参所占的内存被收回.实参和形参传递的是”值传递”,即单向传递,只与参数相对位置有关,而与变量名无关sumof1,3is4C语言程序设计 第6章模块化程序设计--函数二、函数返回值#include<stdio.h>intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}函数值也就是函数的返回值,是一个具体确定的值.①函数使用return语句返回值。②一个函数内可以有多个return语句,执行到任何return语句,函数都将立即返回到调用函数if(x>y)return(x);elsereturn(y);③return后面的()可以省略,可以返回一个表达式,先求解表达式的值,再返回.intmax(intx,inty){returnx>y?x:y;}1.返回函数值的方法C语言程序设计 第6章模块化程序设计--函数#include<stdio.h>intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}2.函数值的类型①函数的类型即函数值的类型.例如,函数max是int型,函数的返回值也是int型.②省略了类型说明的函数就是int型.③return中表达式的值一般和函数类型相同.④如果不一致,则需要进行类型转换.以函数类型为准.C语言程序设计 第6章模块化程序设计--函数3.不需要返回的函数①如果函数中没有return,认为是一个过程,可以使用类型void.②如果一个函数被声明void类型,就不允许再引用它的返回值。只能单纯调用它。#include<stdio.h>voidprintStar(){printf(“*******************\n”);}voidprintMessage(){printf(“Hello,world.\n”);printStar();}voidmain(){printStar();printMessage();}C语言程序设计 第6章模块化程序设计--函数函数的调用一、函数调用一般形式一般形式:函数名(实参列表)说明:①如果调用无参函数,实参表列可以忽略,但括号不能省.②实参个数和形参个数相同.③实参和形参类型一一对应,必要时会进行类型转换.注意:不同系统中,实参的计算顺序不同.一般认为从右到左计算和赋值.一般在调用函数前计算出实参的值例1读程序,写出结果#include<stdio.h>intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;returnc;}voidmain(){inti=2,p;p=f(i,++i);printf(“%d”,p);}C语言程序设计 第6章模块化程序设计--函数二、函数调用方式1、函数语句形式为:函数(实参表列);例如:printMessage();printf(“%d”,p);说明:这种方式不要求函数带返回值,函数只执行一定操作.2、函数表达式函数的返回值参与运算例如:m=max(a,b);m=3*max(a,b);printf(“%d”,max(a,b));说明:这种方式的函数不能用于void类型C语言程序设计 第6章模块化程序设计--函数三、函数调用的执行过程①从右到左的顺序,计算实参中各表达式值.②按照位置,将实参的值一一传递给形参.③执行被调用函数.④当遇到return(表达式)语句时,计算表达式的值并返回主调函数.X=-0.600000,iabs(x)=1.000000C语言程序设计 第6章模块化程序设计--函数四、函数的原形在程序中调用函数需满足以下条件:①被调用函数必须存在,且必须遵循“先定义后使用”的原则②如果被调用函数的定义在主调函数之后,可以在调用之前给出原形说明.原形说明:类型说明函数名(参数类型,参数类型…)C语言程序设计 第6章模块化程序设计--函数函数的嵌套调用嵌套调用是指在一个函数的函数体中又调用了其他函数.程序执行过程:第一层第二层第三层main()printStar(){{printStar();……}printfMessage()printMessage();{……printStar();printStar();{……}}}结束#include<stdio.h>voidprintStar(){printf(“*******************\n”);}voidprintMessage(){printf(“Hello,world.\n”);printStar();}voidmain(){printStar();printMessage();}C语言程序设计 第6章模块化程序设计--函数例3编程求:重复三次不同的阶乘运算,只是每次的值不同.将求阶乘的过程编程一个函数fac,以不同的参数值来调用fac#include<stdio.h>#include<math.h>floatfac(intk);{floatt=1.0;inti;for(i=2;i<=k;i++)t*=i;returnt;}voidmain(){floatc;intm,n;printf(“inputm,n:”);scanf(“%d%d”,&m,&n);c=fac(n)/(fac(m)*fac(n-m));printf(“%.0f\n”,c);}C语言程序设计 第6章模块化程序设计--函数 许多数学函数都是使用递归调用形式定义的:函数的递归调用当n=1时当n>1时当n=0时当n!=1时C语言程序设计 第6章模块化程序设计--函数 函数的递归调用是指在调用一个函数时又直接或间接调用函数本身. 直接调用 间接调用 递归调用必须引入一个循环条件控制递归结束,否则进入死循环.C语言程序设计 第6章模块化程序设计--函数 例4有5个人坐在一起,问第5个人多少岁?答:比第4个人大2岁;第4个人说他比第三个人大2岁;第3个人比第2个人大2岁,第2个人比第1个人大2岁.而第1个人有10岁.问第5个人多少岁?C语言程序设计 第6章模块化程序设计--函数 函数调用过程#include<stdio.h>intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}voidmain(){printf(“%d“,age(5));}C语言程序设计 第6章模块化程序设计--函数例5用递归调用求n!阶乘(n>=0)使用循环做:floatfac(intn){floatf=1;if(n>=0)for(i=2;i<=n;i++)f*=i;elsef=-1;returnf;}#include<stdio.h>floatfac(intn){floatf;if(n>1)f=fac(n-1)*n;elseif(n==0||n==1)f=1;elsef=-1;returnf;}voidmain(){intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);if(y<0)printf(“error:%d\n”,n);elseprintf(“%d!=%.0f\n”,n,y);}C语言程序设计 第6章模块化程序设计--函数根据变量的作用域不同,可分为局部变量和全局变量两种。1.变量的作用域变量的作用域:变量起作用的范围。①局部变量:在函数内部或某个控制块的内部定义的变量。局部变量的作用域:函数内部。作用:增强了函数模块的独立性。②全局变量:在函数外面定义的变量称为全局变量。全局变量的作用域:从该变量定义的位置开始,直到源文件结束。作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。§6.2变量的作用域C语言程序设计 第6章模块化程序设计--函数局部变量和全局变量的作用域如图所示:结束┆inti;main(){floata,b;……{chars;……}function();……}intk;voidfuction();{intm;……}局部变量s的作用域局部变量a,b的作用域全局变量i的作用域全局变量k的作用域局部变量的作用域C语言程序设计 第6章模块化程序设计--函数阅读程序【例6-4】的程序,了解变量作用域。请注意区分局部变量和全局变量的作用域。程序:example6_4.cC语言程序设计 第6章模块化程序设计--函数变量的存储类别一、变量的动态存储和静态存储全局变量和局部变量变量的作用域静态存储和动态存储变量的存储类别:生存期内存中供用户使用的空间有:①代码区②静态存储区:编译时分配空间③动态存储区:执行时分配空间变量或函数的属性:C语言程序设计 第6章模块化程序设计--函数二、局部变量的存储类别1、自动类别存储在动态存储区,用auto说明如:intfunc1(inta){autointb,c=3;……}形参a,变量b,c都是自动变量,调用函数时,系统给它们分配存储空间,函数调用结束时,自动释放空间.通常auto可以省略C语言程序设计 第6章模块化程序设计--函数2、局部静态变量占用静态存储,用static说明说明:①局部静态变量,属于静态存储类别,在程序执行的整个过程中,都不释放存储空间.②局部静态变量在编译时赋值,仅赋值一次.③如果定义局部静态变量没有赋初值,系统会自动赋初值.④局部静态变量,只有在定义它的函数内被引用(它存在,但不被其他函数引用)如果f不定义成static是什么结果?f=1;j=1;fac(1):f=f*n=1*1=1;输出1!=1;j=2;fac(2):f=f*n=1*2=2;输出2!=2;j=3;fac(3):f=f*n=2*3=6;输出3!=6;j=4;fac(4):f=f*n=6*4=24;输出4!=24;C语言程序设计 第6章模块化程序设计--函数3、寄存器变量存储在寄存器中,用register说明说明:①计算机的寄存器个数有限.②寄存器变量对寄存器占有是动态的③有的系统对寄存器变量转化为自动变量处理,而有的系统会自动设置寄存器变量.C语言程序设计 第6章模块化程序设计--函数三、全局变量的存储类别 全局变量都存放在静态的存储区。 用static关键字声明的全局变量,只能在本文件内使用。 没有用static关键字的全局变量可以在别的文件中使用extern关键字声明为外部变量,并在该文件中作为全局变量使用。尽量少使用全局变量/*a.c*/intmax;voidcalcMax(inta[],intn){......}/*main.c*/externintmax;voidmain(){...printf(“%d”,max);...}/*a.c*/staticintmax;voidcalcMax(inta[],intn){......}/*main.c*/externintmax;voidmain(){...printf(“%d”,max);...}错!max未定义错!不能引用maxC语言程序设计 第6章模块化程序设计--函数四、存储类别小结1、变量的定义方法[存储类别]数据类型变量名……2、变量的划分按作用域划分:按生存期按变量的存放位置C语言程序设计 第6章模块化程序设计--函数自定义的函数有两种:内部函数和外部函数。1.内部函数若函数的存储类型为static型,则称其为内部函数(内部函数又称为静态函数),它表示在由多个源文件组成的同一个程序中,该函数只能在其所在的文件中使用,在其他文件中不可使用。内部函数的声明形式:static<返回值类型><函数名>(<参数>);例如:staticintStatistic();2.外部函数若函数的存储类型定义为extern型,则称其为外部函数,它表示该函数能被其他源文件调用。函数的默认存储类型为extern型。§6.3内部函数与外部函数C语言程序设计 第6章模块化程序设计--函数外部函数的应用示例。下面的程序由3个文件组成:file1.c、file2.c、example6_6.c。在file1.c、file2.c中分别定义了两个外部函数;在example6_6.c中可以分别调用这两个函数。1.file1.c/*file1.c外部函数定义*/externintadd(intm,intn){return(m+n);}2.file2.c/*file2.c外部函数定义*/externintmod(inta,intb){return(a%b);}C语言程序设计 第6章模块化程序设计--函数3.example6_6.c#include<stdio.h>externintmod(inta,intb); /*外部函数声明*/externintadd(intm,intn); /*外部函数声明*/main(){intx,y,result1,result2,result;printf("Pleaseenterxandy:\n");scanf("%d%d",&x,&y);result1=add(x,y); /*调用file1中的外部函数*/printf("x+y=%d\n",result1);if(result1>0)result2=mod(x,y); /*调用file2中的外部函数*/result=result1-result2;printf("mod(x,y)=%d\n",result2);printf("(x+y)-mod(x,y)=%d\n",result);}C语言程序设计 第6章模块化程序设计--函数关于程序的几点说明(1)在程序file1.c、file2.c中的函数定义可以不需要extern加以说明,默认为外部函数。(2)在example6_6.c中对外部函数的声明也可以不用extern加以说明,默认为外部函数。(3)由多个源文件组成一个程序时,main()函数只能出现在一个源文件中。(4)由多个源文件组成一个程序时,有3种连接方式:①将各源文件分别编译成目标文件,得到多个目标文件(.obj后缀),然后用连接命令把多个.obj文件连接起来。C语言程序设计 第6章模块化程序设计--函数②建立项目文件(.prj后缀或.dsw后缀),具体操作可参阅各种C语言集成开发环境说明。③使用文件包含命令。请参阅本章6.6节。(5)如果将file1.c或file2.c中的extern改成static,则主程序在编译时无法通过。(6)在程序file1.c或file2.c中,也可以互相调用其外部函数。Turboc的连接接命令为tlink例如:tlinkexample6_6.obj+file1.obj+file2.obj结果:生成一个example6_6.exe文件。C语言程序设计 第6章模块化程序设计--函数§6.4编译预处理作用:在对源程序编译之前做一些处理,生成扩展C源程序种类 宏定义#define 文件包含#include 条件编译#if--#else--#endif等格式: “#”开头 占单独书写行 语句尾不加分号C语言程序设计 第6章模块化程序设计--函数 1宏定义不带参数宏定义 一般形式#define宏名(标识符)[宏体](字符串) 功能:用指定标识符(宏名)代替字符序列(宏体)如#defineYES1#defineNO0if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展开后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”); 宏展开:预编译时,用宏体来替换宏名---不作语法检查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);说明:1.定义位置:任意(一般在函数外面)2.作用域:从定义命令到文件结束3.#undef可终止宏名作用域格式:#undef宏名5.宏定义可嵌套,不能递归例#defineMAXMAX+10()4.引号中的与宏名相同也不置换例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展开:printf(“2*PI=%f\n”,3.14159*2);6.宏定义中使用必要的括号()例#defineWIDTH80#defineLENGTHWIDTH+40var=LENGTH*2;宏展开:var=WIDTH+40*2var=80+40*27.只是简单替代,标识符不占内存空间8.一般宏名使用大写字母形式.宏定义中的宏体为一串字符串,不应看成是数值!预处理时,用宏名代替宏体——宏展开#define——宏定义命令inputradius:2l=12.5664s=12.5664v=33.5103C语言程序设计 第6章模块化程序设计--函数带参数宏定义 一般形式:#define宏名(参数表)宏体例#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”说明: 1.宏展开:不仅宏体替换,还要进行形参替换 2.宏体及各形参外一般应加括号() 3.宏名与参数之间不能有空格例#defineS(a,b)a*b………..area=S(3,2);宏展开:area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:z=((x+y)*(x+y));①②③从左到右进行置换,不是参数的字符保留C语言程序设计 第6章模块化程序设计--函数<>C语言程序设计 第6章模块化程序设计--函数5.带参的宏与函数区别ch9-5.cC语言程序设计 第6章模块化程序设计--函数 2文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include<文件名>处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译<>直接按标准目录搜索(存放C的库函数头文件)“”先在当前目录搜索,再搜索标准目录可指定路径C语言程序设计 第6章模块化程序设计--函数被包含文件内容 源文件(*.c) 头文件(*.h)宏定义数据结构定义函数说明等文件包含可嵌套C语言程序设计 第6章模块化程序设计--函数例文件包含举例Ch9_82.cC语言程序设计 第6章模块化程序设计--函数 3条件编译概念:在某个条件成立的情况下才对某一部分进行编译。三种格式:格式二  形式:  作用:如果标识符没有被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译格式三  形式:  作用:如果指定的常量表达式1值为真(非零),则对程序段1进行编译,否则如果指定的常量表达式2值为真(非零),则对程序段2进行编译,否则对程序段n进行编译格式一  形式:  作用:如果标识符已经被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译#ifdef标识符程序段1[#else程序段2]#endif#ifndef标识符程序段1[#else程序段2]#endif#if常量表达式1程序段1[#elif常量表达式2程序段2#else程序段n]#endifC语言程序设计 第6章模块化程序设计--函数条件编译的优点1,可以提高C源程序的通用性#ifDOS#defineINTEGER_SIZE16#elifWIN32#defineINTEGER_SIZE32#else#defineINTEGER_SIZE64#endif2,可以使调试程序等过程变得灵活3,可以减少目标程序的长度#defineDEGUG1...#ifdefDEBUGprintf(“x=%d,y=%d\n”,x,y);#endif#include<stdio.h>#defineCIRCLE1voidmain(){ floatc,r,s; c=2;#ifCIRCLE r=3.1415962*c*c; printf(“areaofroundis:%f\n",r);#else s=c*c; printf("areaofsquareis:%f\n",s);#endif}C语言程序设计 第6章模块化程序设计--函数程序举例 编写函数swap用于交换两个整数的值,例如,设a=3,b=4,调用函数swap后,得a=4,b=3.#include<stdio.h>voidswap(intx,inty){intt;t=x;x=y;y=t;}voidmain(){inta,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d%d\n”,a,b);}不能实现,因为值传递,a=3,b=4,x=4,y=3子函数内实现了交换,因为是值传递,主函数中得a,b的值并未改变.方法2:全局变量#include<stdio.h>intx,y;//全局变量voidswap(){intt;t=x;x=y;y=t;}voidmain(){scanf(“%d%d”,&x,&y);swap();printf(“%d%d\n”,x,y);}方法3:数组参数传递#include<stdio.h>voidswap(intx[2]){intt;t=x[0];x[0]=x[1];x[1]=t;}voidmain(){intx[2];scanf(“%d%d”,&x[0],&x[1]);swap(x);printf(“%d%d\n”,x[0],x[1]);}C语言程序设计 Endofchap6宏定义中的宏体为一串字符串,不应看成是数值!预处理时,用宏名代替宏体——宏展开#define——宏定义命令inputradius:2l=12.5664s=12.5664v=33.5103从左到右进行置换,不是参数的字符保留ch9-5.cCh9_82.c
/
本文档为【C语言函数课件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索