第7章函数(函数以及嵌套调用)_第1页
第7章函数(函数以及嵌套调用)_第2页
第7章函数(函数以及嵌套调用)_第3页
第7章函数(函数以及嵌套调用)_第4页
第7章函数(函数以及嵌套调用)_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

思考题#include<stdio.h>intmain(){inta,b,c,max;printf("Inputa,b,c:");scanf("%d%d%d",&a,&b,&c);max=a;if(max<b)max=b;if(max<c)max=c;printf("max=%d\n",max);}三个整数如何找最大值?一个非常庞大的程序,在100个不同的位置需要“三个整数如何找最大值”这个功能。。。。。第7章函数

7.1为什么要用函数7.2函数的定义7.3函数的调用7.4函数的声明7.5函数的嵌套调用

结构化程序设计要求一种自顶向下的设计方法,也就是将复杂的系统划分为相对独立的,功能较为单一功能的子系统的组合。每个子系统称为模块,在C语言中表现为函数。7.1为什么要用函数复杂问题main()abca1a2b1b2c1c2各模块之间的关系称之为接口优点:

函数实现的功能单一完整,可以独立设计,单独调试。易于维护,通用性强。main(){charans=‘y’;clrscr();cover();

/*调用软件封面显示函数*/password();

/*调用密码检查函数*/while(ans==’y’||ans==’Y’){question();

/*调用产生题目函数*/answers();/*调用接受回答函数*/marks();

/*调用评分函数*/results();

/*调用结果显示函数*/printf(“是否继续练习?(Y/N)\n”);ans=getch();}printf(“谢谢使用,再见!”);}/*定义所用函数*/显示软件封面检查密码

产生题目接受回答评判计分显示结果如果要继续练习告别词cover(){}/*软件封面显示函数*/password(){}/*密码检查函数*/question(){}/*产生题目函数*/answers(){}/*接受回答函数*/marks(){}/*评分函数*/results(){}/*结果显示函数*/复杂问题main()abca1a2b1b2c1c21、一个源文件由一个或多个函数组成。2、C程序执行总是从main函数开始,调用其它函数后总是回到main函数,最后在main函数中结束整个程序的运行。3、所有函数都是平行的、互相独立的,即在一个函数内只能调用其他函数,不能再定义一个函数(嵌套定义)。4、一个函数可以调用其他函数或其本身,但任何函数均不可调用main函数。1、系统库函数;

2、自定义函数。【例】计算xy的值(假设y为整型变量)请注意:C语言中没有乘方运算符解法1:调用库函数pow,计算xy

返回【例】调用函数,输出若干个“*”

voidmyprint(){inti=0;for(i=1;i<=20;i++)printf("*");printf("\n");}无参函数#include<stdio.h>输出一行20个“*”

voidmyprint_n(intn){inti=0;for(i=1;i<=n;i++)printf("*");printf("\n");}输出一行n个“*”

有参函数main(){myprint();myprint_n(5); myprint_n(10);myprint();}需要解决的问题:一个函数调用另一个函数,应具备什么条件?函数应该如何编写?各函数的位置在哪里?

7.2

函数的定义及参数函数的分类(用户角度):

1、系统库函数;

2、自定义函数。函数的分类(函数形式):

1、无参函数;

2、有参函数。函数应该先定义后使用1、无参函数主调函数不向被主调函数传递数据,无参函数可以带回或不带回函数值(不带回居多)1、无参函数定义格式:[数据类型]函数名()

{

说明部分执行语句

[return];

}函数的返回值通过函数体中的语句获得。return语句形式:return;return(x);returnx;void:函数无返回值缺省值:int#include<stdio.h>printstar(){printf("***************\n");}

print_message(){printf("Howdoyoudo!\n");}main(){printstar();print_message();printstar();}请思考:用函数的形式,打印输出20个星号#include<stdio.h>try1(){ intx=3; x++; return(x);}main(){ inti,x; for(i=0,x=0;i<=2;i++) x+=try1(); printf("%d\n",x);}【例】输入两数据,求最大值。(用函数解决)#include<stdio.h>max(){inta,b,z;scanf("%d,%d",&a,&b);z=a>=b?a:b;return(z);}voidmain(){intx;x=max();printf("%d",x);}#include<stdio.h>intmax(){intz;z=a>=b?a:b;return(z);}voidmain(){intx;inta,b;scanf("%d,%d",&a,&b);x=max();printf("%d",x);}数据怎么传递?2、有参函数定义格式:[数据类型]函数名(形参类型形参名1,形参类型形参名2,……){

说明部分执行语句

[return];}调用:

函数名(实参1,实参2……..);#include<stdio.h>intmain(){inta,b,z;scanf("%d,%d",&a,&b);

z=max(a,b);printf("%d",z);}intmax(intx,inty){intz;z=x>=y?x:y;

return(z);}主函数函数体函数的返回值通过函数体中的return语句获得。函数名(用标识符命名),引用函数的标志,并得到结果。函数参数说明表。定义!引用!函数定义是要确定函数的名称、函数的类型、函数的参数及函数的功能。3、形式参数和实际参数#include<stdio.h>voidmain(void){inta,b,z;scanf(“%d,%d”,&a,&b);z=max(a,b);

printf(“%d”,z);}

int

max(intx,inty){intz;z=x>=y?x:y;

return(z);}形式参数:在定义函数时,函数名后面括弧中的变量名。注意:形参未出现函数调用时,不占内存中的存储单元。只在调用时才分配内存单元,调用结束后,形参所占的内存单元也被释放。实际参数:在调用函数时,函数名后面括弧中的表达式。形参与实参的说明:1、形参与实参一一对应,且类型应相同。2、实参可以是常量、变量或表达式,但要有确定的值。在调用时将实参的值赋给形参变量。3、在被定义的函数中,必须指定形参的类型。4、实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。#include<stdio.h>voidmain(void){inta,b,c;scanf(“%d,%d”,&a,&b);

c=max(a,b);printf(“%d”,c);}

intmax(intx,inty){intz;z=x>=y?x:y;

return(z);}23abXy23z3#include<stdio.h>intexchange(inti,intj){intk;printf("i=%d,j=%d\n",i,j);k=i;i=j;j=k;printf("i=%d,j=%d\n",i,j);}intmain(){intm=1,n=10;printf("m=%d,n=%d\n",m,n);exchange(m,n);printf("m=%d,n=%d\n",m,n);};运行输出:;m=1,n=10(函数调用前)i=1,j=10(函数中参数交换前)i=10,j=1(函数中参数交换后)m=1,n=10(函数调用后)intmax(void){floatz;…

returnz;/*z先转化为整型*/}4、函数的返回值

⑴函数可以通过一个return语句返回一个值,也可以不返回值,此时应在定义函数时用void类型加以说明。⑵函数中可以出现多个return语句,执行到哪一个return语句,哪一个就起作用,返回值,且返回调用函数,继续执行。intmax(intx,inty){if(x>=y)returnx;elsereturny;}⑶返回值的类型应与函数的类型一致,如不一致,以函数类型为准,先转换为函数类型后,再返回。#include<stdio.h>intmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f,",&a,&b);c=max(a,b);printf("maxis%d\n",c);return0;}intmax(floatx,floaty){floatz;z=x>y?x:y;return(z);}1.52.62.62变为2补充定义空函数一般形式为:类型名函数名(

){

}先用空函数占一个位置,以后逐步扩充好处:以后扩充新功能方便,7.4

函数的声明在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?1.首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。但光有这一条件还不够。2.如果使用库函数,还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。3.如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明。函数原型声明函数原型函数原型的一般形式为:1.函数类型函数名(参数类型1,参数类型2……);2.函数类型函数名(参数类型1,参数名1,参数类型2,参数名2……);

声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。函数的“定义”和“声明”的区别?#include<stdio.h>voidmain(){floatadd(floatx,floaty);

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)

{floatz;

z=x+y;

return(z);}#include<stdio.h>floatadd(floatx,floaty){floatz;

z=x+y;

return(z);}voidmain(){

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}注意:函数的“定义”和“声明”的区别:函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。7.3

函数的调用1、函数调用的一般形式函数名(实参表列);函数和变量一样,在其主调函数中必须“先声明,后使用”。注意关系:函数定义--制造函数函数使用--声明(准备使用)调用(使用函数)2、函数调用的方式函数语句形式:如printf_star();(这时不要求函数带回值,只要求函数完成一定的操作)2、函数调用的方式函数表达式形式:c=max(a,b)*2;(这时要求函数带回一个确定的值以参加表达式的运算)2、函数调用的方式函数参数:c=max(a,max(b,d));#include<math.h>

longmyfac(intn){inti=0;longy=1;for(i=1;i<=n;i++)y=y*i;returny;}

main(){intn=0;doubley=0;longz=0;scanf("%d",&n);y=sqrt(n);z=myfac(n);printf(“n=%d,y=%lf,z=%ld\n",n,y,z);}4442.0#include<math.h>

longmyfac(intn){inti=0;longy=1;for(i=1;i<=n;i++)y=y*i;returny;}

main(){intn=0;doubley=0;longz=0;scanf("%d",&n);y=sqrt(n);z=myfac(n);printf(“n=%d,y=%lf,z=%ld\n",n,y,z);}4n=4,y=2.000000,z=24实参主调函数被调函数444程序总是从主函数开始执行2.024形参要调用另一函数,应注意:(1)被调函数必须存在(2)被调函数的定义位置正确尽量采用“自顶向下、逐步细化、模块化”的方法编写程序回顾:(1)调用时函数名要一致(2)实参与形参个数相同、类型一致(3)实参与形参可以同名,但占不同的存储单元。无参函数:[数据类型]函数名(){

说明部分执行语句

[return];}有参函数:[数据类型]函数名(形参类型:形参名1,形参类型:形参名2,……){

说明部分执行语句

[return];}函数的定义函数的声明(函数原型+;)函数原型的一般形式为:1.函数类型函数名(参数类型1,参数类型2……);2.函数类型函数名(参数类型1,参数名1,参数类型2,参数名2……);

函数的调用函数调用的一般形式为:函数名(实参列表);执行下列程序后,变量i的值应为(A). intma(intx,inty){returnx*y;}main() {inti; i=5; i=ma(i,i-1)-7; }A)13 B)17 C)19 D)以上都错执行下列程序后,变量a的值应为(D).

intf(intx){

returnx+3;

}main(){

inta=1;

while(f(a)<10)

a++;}A)11B)10C)9D)7下列程序结构中,不正确的是(A,B)。A)main()B)main(){floata,b,c;{floata,b,c;scanf("%f,%f",&a,&b);scanf("%f,%f",&a,&b);c=add(a,b);c=add(a,b);...........}}intadd(floatx,floaty)floatadd(floatx,floaty){...}{...}C)floatadd(floatx,floaty);D)floatadd(floatx,floaty)main(){...}{floata,b,c;main()scanf("%f,%f",&a,&b);{floata,b,c;c=add(a,b);scanf("%f,%f",&a,&b);......c=add(a,b);}.....floatadd(floatx,floaty)}{...}请思考:若输入一个整数10,以下程序的运行结果.#include<stdio.h>voidmain(){inta,e[10],c,i=0;

intsub(int);scanf("%d",&a);while(a!=0){c=sub(a);a=a/2;e[i]=c;i++;}for(;i>0;i--)printf("%5d",e[i-1]);}intsub(inta){intc;c=a%2;returnc;}【练习】调用mysum,求1+2+3+…+nprintf("Inputdata:");scanf("%d",&n);y=mysum(n);printf(“%d,%ld",n,y);intn=0;longy=0;main(){}inti=0;longsum=0;for(i=1;i<=n;i++)sum=sum+i;returnsum;longmysum(intn)}{练习:编程求1!+2!+…n!.1、数据n从主程序中获得;2、编写子函数完成求解。#defineN3#include<stdio.h>voidmain(){ints(intn);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论