您好,欢迎访问三七文档
共90页第1页第八章C语言程序设计共90页第2页本章要点•函数的定义•函数的调用•函数间的数据传递•变量的存储类型•变量的作用范围•内部函数和外部函数共90页第3页•C程序是函数的集合体,每个函数是一个独立的程序模块。•有一个主函数,若干个子函数,程序总是从主函数开始执行。•函数可集中或分散存放在一个或多个源程序文件中。•所有子函数地位平等,可互相调用、自我调用。·引入函数的优点:减少重复编写程序的工作量;使程序便于调试和阅读。函数F1()main()F11()F2()F21()F22()C语言程序的结构8.1函数的概念和函数的定义共90页第4页数学函数math.h字符和字符串函数ctype.h,string.h输入/输出函数stdio.h动态存储分配函数calloc(),malloc()形式无参函数有参函数空函数库函数用户定义函数:C函数的分类共90页第5页[例]输入三个整数,计算它们的和并输出运算结果。intadd(intx,inty,intz){ints;s=x+y+z;returns;}函数示例定义的求和函数main(){inta,b,c,sum;scanf(%d,%d,%d,&a,&b,&c);sum=add(a,b,c);printf(sum=%d\n,sum);}调用求和函数共90页第6页8.1.2函数的定义定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作,即函数完成的功能。在程序中用到的所有函数,必须先定义,后使用。共90页第7页•定义函数的一般形式类型标识符函数名(形式参数表){[说明部分]语句}若无参数,写void或空。是被初始化的内部变量,寿命和可见性仅限于函数内部不说明类型,自动按整型处理.建议都指定类型函数体(一段程序,实现函数的功能)共90页第8页1.无参函数的定义形式类型标识符函数名(){[说明部分]语句}[例8-1]voidprint_message(){printf(Howareyou!\n);}共90页第9页[例8-2]intmax(intx,inty){intz;z=xy?x:y;returnz;}类型标识符函数名(形式参数表列){[说明部分]语句}intmax(x,y)intx,y;{intz;z=xy?x:y;returnz;}形参变量的说明(传统形式)形参变量的说明(现代形式)2.有参函数的定义形式共90页第10页3.形式参数说明•形式参数:在定义函数时函数名后面括弧中的变量名在形参表中说明的形参,在函数体中不再说明,可以同一般变量一样直接使用。形参调用前不占内存单元,调用时分配内存单元。调用结束后释放。形参是函数的内部变量,只在函数内部才有意义。对每个形参必须指明其名字和数据类型。多个形参用逗号分隔。共90页第11页例:有函数调用语句:inti=3;printf(”%d,%d”,i,++i);输出结果为:4,4分析输出函数的结果:自右向左:4,4自左向右:3,4避免这种不确定性:改为:inti=3,j;j=i;printf(”%d,%d”,i,++j);输出结果为:3,4共90页第12页8.1.3函数的调用1.函数调用的一般形式为:函数名(实际参数列表);或函数名(实际参数列表)说明:实参必须有确定的值,可以是常量、变量、表达式及函数调用。实参与形参的类型、个数、顺序必须一致。多个实参用逗号分隔。2.执行过程:•计算各个表达式(TC2.0,VC++6.0实参求值顺序按自右至左);•把得到值赋给对应的形参;•执行函数体;•遇到return语句或执行完最后一条语句,返回到函数调用处.共90页第13页(1)函数语句:(把函数调用作为一个语句)一般形式:函数名(实际参数表);使用情况:这种方式常用于调用一个可以忽略返回值或没有返回值的函数,只要求函数完成一定的操作。例如:print_message();3.函数调用的具体方式(2)函数表达式:(函数调用出现在一个表达式中)一般形式:变量名=函数表达式使用情况:这种表达式称为函数表达式。要求函数带回一个确定的值参加表达式的运算。例如:c=3+max(a,b);d=pow(c,i);e=f((x1,x2,x3),(y1,y2));函数有几个参数?共90页第14页•值传递:在函数调用时,实参将其值传递给形参。实参对形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传回来给实参。实参与形参占用不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。8.1.4函数参数的传递方式•值传递的优点:被调用的函数不可能改变调用函数中变量的值,而只能改变它的局部的临时副本。•值传递的缺点:每个形式参数仅能传递一个数据,不适用需要在函数之间传递大量数据。•地址传递:将实参的地址传递给形参,实参和形参指向同一内存空间,对形参的修改,可以直接影响实参。共90页第15页[例8-3]编写函数交换两个变量的值。#includestdio.hvoidswap(intx,inty){inttemp;temp=x;x=y;y=temp;printf(x=%d,y=%d\n,x,y);}intmain(){inta,b;a=5;b=10;printf(a=%d,b=%d\n,a,b);swap(a,b);printf(a=%d,b=%d\n,a,b);}运行结果:a=5,b=10x=10,y=5a=5,b=10共90页第16页8.1.5函数的返回值2.函数的返回值语句一般形式:return表达式;或return(表达式);功能:退出函数,将表达式的值带回主调函数,回到程序原来的位置继续执行。return语句也可以没有表达式,其作用是使程序执行的流程返回到调用函数。1.定义:通过函数调用使主调函数得到一个确定的值,称为函数的返回值。共90页第17页说明:•return语句只能把一个返回值传递给调用函数。•返回值的类型为定义的函数类型,若return语句中表达式类型与函数类型不一致,以函数类型为准。•返回值可以是有确定值的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。•无返回值的函数,定义为void类型(无类型函数)。•一个函数中可以有多个返回语句。•exit()函数由ANSCC定义的,功能是终止和关闭所有程序,结束程序执行,忽略返回值。0为正常退出非0为非正常退出。共90页第18页main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}[例8-4]intmax(intx,inty){intz;z=xy?x:y;return(z);}形参:通知系统要预留内存位置.实参:在运行时把值传给函数.把函数的结果赋给函数名形参与实参、函数名与返回值之间的关系共90页第19页[例8-5]用函数计算浮点数x的n次方,其中n为整型(n=0)doublepower(doublex,intn){doublep=1;inti;if(n0)for(i=1;i=n;i++)p=p*x;returnp;}main(){intn;doublex;scanf(“%d%lf”,&n,&x);printf(“%f”,power(x,n));}共90页第20页[例8-6]编写函数,将一个给定的整数转换成字符串。#includestdio.hvoidto_str(intn){charstring[10];inti=0;if(n0){putchar('-');n=-n;}while(n0){string[i++]=n%10+'0';n/=10;}while(--i=0)putchar(string[i]);}intmain(){printf(Theconvertedstring:);to_str(-123);return0;}运行结果:Theconvertedstring:-123共90页第21页[例8-7]编写函数,求1+1/2+1/3+…+1/n的值,并在主函数中调用它。#includestdio.hdoublecount(intn){inti;doublesum=0;if(n=0){printf(Dataerror!\n);return0;}else{for(i=1;i=n;i++)sum+=1.0/i;returnsum;}}intmain(){intn;doubles;printf(Pleaseinputthevalue:);scanf(%d,&n);s=count(n);printf(s=%6.2lf\n,s);}运行结果:Pleaseinputthevalue:5回车s=2.28共90页第22页8.1.6函数的声明问题的提出:C语言程序可由若干文件组成,每一个文件可以单独编译。一个源程序文件由一个或多个函数组成。在一个函数中调用另一个函数需要具备如下条件:1)函数必须是已经定义的函数;2)如果使用库函数,应该在文件开头包含库函数的信息;3)若函数使用在定义之前,必须在调用函数前对函数进行声明。同变量一样,函数的调用也应该遵循“先说明,后使用”的原则。1.函数声明的一般形式:类型标识符函数名(类型1形参1,类型2形参2,……);功能:通知编译程序函数值类型、参数个数及类型,为编译程序进行类型检查提供依据。共90页第23页main(){floatadd(floatx,floaty);floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sumis%f”,c);}/*定义add函数*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}对被调用函数的说明作为表达式被调用共90页第24页2.函数声明和函数定义的区别函数声明的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。函数定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数声明与函数定义的首部唯一区别:函数说明语句的()之后必须有分号,而函数定义头部的()之后没有分号。共90页第25页(1)被调用函数在主调函数之前定义floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b;scanf(“%f,%f,“&a,&b);printf(“sumis%f”,add(a,b));}3.可省略被调用函数声明的二种情况共90页第26页(2)在所有函数定义之前说明charletter(char,char);floatf(float,float);inti(float,float);main(){…….}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(float,float){……}在所有函数之前说明函数类型定义函数letter、f和i共90页第27页8.2数组作函数参数数组元素可以作函数的实参数组元素作为表达式的组成部分做函数的实参可以单向将值传递给形参。例如:inta[10];······x=power(a[6],5);数组名可以作函数的实参和形参实现批量数据的传递共90页第28页一维数组作函数参数,形参的写法为:类型说明符形参数组名[数组长度]例如:floataverage(floatarray[10]){…}main(){floatb[10];inti;for(i=0;i10;i++)scanf(“%f”,&b[i]);average(b);}8.2.1一维数组作函数参
本文标题:C语言课件-8
链接地址:https://www.777doc.com/doc-7027536 .html