您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 第7章_用函数实现模块化程序设计.
1、第7章用函数实现模块化程序设计——C程序设计第7章函数本章要点函数的定义和调用函数的参数和返回值函数的嵌套和递归调用变量的作用域第7章函数主要内容为什么要用函数(7.1)怎样定义函数(7.2)调用函数(7.3)对被调函数的声明和函数原型(7.4)函数的嵌套调用(7.5)函数的递归调用(7.6)数组作为函数参数(7.7)局部变量和全局变量(7.8)变量的存储方式和生存期(7.9)关于变量的声明和定义(7.10)内部函数和外部函数(7.11)第7章函数为什么要用函数(7.1)模块化程序设计引入:若问题较复杂,只有main函数,则函数太长、太复杂,导致跟踪、调试、维护困难。基本思想:将一个程序按功能分割成一些程序模块,每个程序模块作为一个源程序文件。一个源程序文件由若干个函数组成。一个C程序由一个主函数和若干个子函数组成的。各模块(源文件)独立编码、调试、再集成。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性易理解易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之第7章函数为什么要用函数(7.1)。
2、C程序结构C程序源程序文件1源程序文件2源程序文件n预编译命令函数1函数m说明部分执行部分……第7章函数为什么要用函数(7.1)例7.1函数调用的简单例子返回#includestdio.h//例7.1voidmain(){voidprintstar();/*对printstar函数声明*/voidprint_message();/*对print_message函数声明*/printstar();/*调用printstar函数*/print_message();/*调用print_message函数*/printstar();/*调用printstar函数*/}voidprintstar()/*定义printstar函数*/{printf(***************\n);}voidprint_message()/*定义print_message函数*/{printf(Howdoyoudo!\n);}运行结果:***************Howdoyoudo!***************第7章函数说明:C是函数式语言。必须有且只能有一个名为main的主函数。C程序的执行。
3、总是从main函数开始,在main中结束。函数不能嵌套定义,可以嵌套调用。函数间的调用关系:由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。为什么要用函数(7.1)第7章函数函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式主调函数是否向被调函数传递数据。无参函数例:getchar()有参函数例:putchar(c)使用库函数的要点:函数功能函数参数的数目和顺序,及各参数意义和类型函数返回值意义和类型需要使用的包含文件为什么要用函数(7.1)第7章函数怎样定义函数(8.2)无参函数定义的一般形式类型标识符函数名(){声明部分语句部分}如:例7.1中的printstar和print_message函数例7.1函数值类型为int类型时可缺省合法标识符有参函数定义的一般形式类型标识符函数名(形式参数表列){声明部分语句部分}形式参数表列一般形式:类型标识符1形参名1,…,类型标识符n形参名n合法标识符如:intmax(intx,inty){intz;z=xy?x:y;return(z);}。
4、第7章函数怎样定义函数(8.2)空函数一般形式:类型标识符函数名(){}如:voiddummy(){}说明:主调函数调用空函数时,只表明这里要调用一个函数,但函数本身什么工作也不做等,以后扩充函数功能时补充上。第7章函数调用函数(7.3)函数调用的形式:函数名(实参表列)实参表列的一般形式:表达式1,表达式2,…,表达式n说明:如果是调用无参函数,则形式为:函数名()()不能省实参与形参个数相等,类型一致(一般情况下),按顺序一一对应。实参表求值顺序视系统而定(TurboC,VC++自右向左)。实参前不能加类型标识符。例1:函数的调用。//例1intmain(){inta,b,t;intmax(int,int);scanf(%d,%d,&a,&b);t=max(a,b);printf(Maxis%d,t);return0;}intmax(intx,inty){intz;z=xy?x:y;return(z);}第7章函数调用函数(7.3)函数调用的方式函数语句如:printstar();用于调用无返回值的函数或不利用函数返回值的情况。函数表达式如:t=ma。
5、x(a,b);c=2*max(a,b);函数调用出现在一个表达式中。注意:此形式不能用于调用无返回值的函数。函数参数函数调用作为一个函数的实参(无返回值的函数不适用)。如:m=max(a,max(b,c));printf(%d,max(a,b));第7章函数调用函数(7.3)形式参数和实际参数形式参数(形参):定义函数时函数名后面括号中的参数实际参数(实参):调用函数时函数名后面括号中的参数例7.2调用函数时的数据传递。//例7.2intmax(intx,inty){intz;z=xy?x:y;return(z);}#includestdio.hintmain(){inta,b,t;intmax(intx,inty);scanf(%d,%d,&a,&b);t=max(a,b);printf(Maxis%d,t);return0;}t=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=xy?x:y;return(z);}运行结果:输入:7,8输出:Maxis8第7章函数调用函数(7.3)形参和实参的说明:形参用标识符表示(一。
6、种局部变量),实参用表达式表示。调用函数时,实参必须有确定的值。形参必须指定类型。形参与实参类型一致(一般情况下),个数相同。若形参与实参类型不一致,自动按形参类型转换——函数调用转换。形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,实参单元仍保留并维持原值。也就是说,形参与实参占用不同的内存单元。实参向形参的数据传递是单向的“值传递”,只由实参传给形参,不能由形参传回给实参。//例7.2intmax(intx,inty){intz;z=xy?x:y;return(z);}#includestdio.hintmain(){inta,b,t;intmax(intx,inty);scanf(%d,%d,&a,&b);t=max(a,b);printf(Maxis%d,t);return0;}第7章函数711x:y:调用前:调用结束:711x:y:例2参数传递数据是单向传值:交换两个变量的值。//例2#includestdio.hintmain(){intx=7,y=11;voidswap(int,int);printf(x=%d,\ty=%d\n,x。
7、,y);printf(swapped:\n);swap(x,y);printf(x=%d,\ty=%d\n,x,y);return0;}voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:7temp函数调用中的数据传递(7.3.2,7.3.4)第7章函数调用函数(7.3)函数调用的过程在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。将实参对应的值传递给形参在执行max函数期间,由于形参已经有值,就可以利用形参进行有关的运算通过return语句将函数值带回到主调函数调用结束,形参单元被释放主调函数与被调函数间的数据传递途径参数:通过形式参数和实际参数返回值:用return语句返回计算结果全局变量第7章函数调用函数(7.3)函数的返回值(函数值)返回语句形式:return(表达式);或return表达式;或return;如:intmax(intx,inty){intz;z=xy。
8、?x:y;return(z);}功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。说明:return语句中至多只能含一个表达式,即至多只能返回一个函数值函数中可有多个return语句,但每次调用只执行其中之一。若无return语句,执行遇最后一个}时,自动返回调用函数。定义函数时指定的函数值类型一般应该和return语句中的表达式类型一致。若函数值类型与return语句中表达式值的类型不一致,以函数值类型为准,自动进行类型转换。关于void型函数returnz;return(xy?x:y);第7章函数调用函数(7.3)例7.3将例7.2稍作改动,将在max函数中定义的变量z改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。#includestdio.h//例7.3intmain(){intmax(floatx,floaty);floata,b;intc;scanf(%f,%f,,&a,&b);c=max(a,b);printf(maxis%d\n,c);return0;}intmax(floatx,floaty){float。
9、z;z=xy?x:y;return(z);}第7章函数#includestdio.h//例3intmain(){intf(inta,intb);inti=2,p;p=f(i,++i);printf(%d\n,p);return0;}intf(inta,intb){intc;if(ab)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例3实参求值顺序#includestdio.h//例3intmain(){intf(inta,intb);inti=2,p;p=f(i,i++);printf(%d\n,p);return0;}intf(inta,intb){intc;if(ab)c=1;elseif(a==b)c=0;elsec=-1;return(c);}运行结果:0运行结果:1函数调用中的数据传递(7.3.2,7.3.4)第7章函数711x:y:调用前:调用结束:711x:y:例4函数的调用举例:交换两个数(传值)。#includestdio.h//例2intmain(){intx=7,y=11;voidswap(int,int);printf(x=%。
10、d,\ty=%d\n,x,y);printf(swapped:\n);swap(x,y);printf(x=%d,\ty=%d\n,x,y);return0;}voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:7temp调用函数(7.3)第7章函数例2函数的调用举例:交换两个数(传地址)。a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:调用函数(7.3)voidswap(int*p1,int*p2)//例4{intp;p=*p1;*p1=*p2;*p2=p;}intmain(){inta,b;voidswap(int*,int*);scanf(%d,%d,&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n,a,b);return0;}第7章函数函数调用中的数据传递(7。
本文标题:第7章_用函数实现模块化程序设计.
链接地址:https://www.777doc.com/doc-2111606 .html