8、C语言程序设计--函数

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

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

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

资源描述

第八章函数青岛农业大学理信学院例子:求多边形面积。AreaT=AreaT1+AreaT2+AreaT3求三角形面积:s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));T1T2T3Tabcdefg青岛农业大学理信学院程序s=(a+b+c)/2;area1=sqrt(s*(s-a)*(s-b)*(s-c));s=(d+e+c)/2;area3=sqrt(s*(s-d)*(s-e)*(s-c));s=(e+f+g)/2;area2=sqrt(s*(s-e)*(s-f)*(s-g));area=area1+area2+area3;T1T2T3Tabcdefg除了三角形的边长不一样之外,这三段代码几乎完全相同。青岛农业大学理信学院问题:是否有办法减少代码的重复呢?青岛农业大学理信学院floatTarea(floatx,floaty,floatz){ints,area;s=(x+y+z)/2;area=sqrt(s*(s-x)*(s-y)*(s-z));returnarea;}voidmain(){floatarea;area=Tarea(a,b,c)+Tarea(d,e,c)+Tarea(e,f,g);printf(“%f”,area);}函数返回C程序的构成一个C程序可由一个主函数main和若干个其他函数构成。通常,一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。C语言中,模块由函数来实现。青岛农业大学理信学院函数间的调用关系由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。青岛农业大学理信学院青岛农业大学理信学院主要内容一、函数的概念:定义、参数和返回值二、函数的调用三、数组作为函数参数四、局部变量和全局变量五、变量的存储类别六、内部函数和外部函数青岛农业大学理信学院一、函数的概念1、函数的定义:返回值类型函数名(参数1,……参数n){声明部分;语句部分;}遵循C语言标识符命名规范!如不需要可以省略没有参数的函数称为无参函数;否则,称为有参函数。例子青岛农业大学理信学院2、参数参数用于在主调函数和被调函数之间传递数据。函数定义时,括号中的参数称为形式参数,简称形参。函数被调用时,括号中的参数称为实际参数,简称实参。青岛农业大学理信学院例8.2调用函数时的数据传递#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(”%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d“,c);}运行情况如下:7,8↙Maxis8形参在此必须要指定形参的类型实参1、实参的类型应该与形参类型相同或者赋值兼容。2、实参必须有确定的值,可以是常量、变量或者表达式。青岛农业大学理信学院“值传递”1)函数定义时,形参并不分配内存空间;2)函数调用时,才为形参分配空间,并由实参将值传递给形参;该过程是一个单向的“值传递”;3)函数调用结束后,形参空间释放。注意:在内存中,实参和形参是不同的单元。青岛农业大学理信学院3、返回值函数的返回值指函数调用结束后返回给主调函数的值。青岛农业大学理信学院1)如何获得函数返回值?return语句:作用是将某个确定值返回给主调函数。形式:return(需要返回的值);intmax(intx,inty){returnxy?x:y;}括号可以省略,中间加空格分隔;需要返回的值可以是变量,也可以是表达式。青岛农业大学理信学院2)返回值类型函数定义时,由函数名前面的类型标识符指定。比如,intmax(intx,inty)注意:return语句后面的值类型要与返回值类型一致。如果不一致,也要求必须赋值兼容,并以函数定义时的类型为准,进行自动类型转换。青岛农业大学理信学院例8.3返回值类型与函数类型不同#includestdio.hintmax(floatx,floaty){floatz;z=xy?x:y;return(z);}voidmain(){floata,b;intc;scanf(”%f,%f”,&a,&b);c=max(a,b);printf(“Maxis%d“,c);}运行情况如下:7.2,6.5↙Maxis7青岛农业大学理信学院3)void类型如果不希望函数有返回值,可以在定义的时候,将函数返回值声明为void类型。此时,函数体中不得出现return语句。voidprintfstar(){printf(“***************\n”);}青岛农业大学理信学院二、函数的调用函数调用的一般形式:函数名(实参列表);有参函数:实参和形参应该个数相等,类型匹配。无参函数:实参列表省略,但括号不能省略。青岛农业大学理信学院1、函数调用的方式1)函数语句比如,printfstar();2)函数表达式c=max(a,b);3)函数参数m=max(a,max(b,c));青岛农业大学理信学院2、被调函数声明#includestdio.hintmax(intx,inty){return(xy?x:y);}voidmain(){inta,b,c;scanf(”%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d“,c);}#includestdio.hvoidmain(){intmax(intx,inty);inta,b,c;scanf(”%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d“,c);}intmax(intx,inty){return(xy?x:y);}青岛农业大学理信学院被调函数声明如果被调函数位于主调函数的后面,并且二者位于同一文件,则应该在主调函数中对被调函数作声明。作用:将函数名、参数个数、类型等信息通知编译系统,便于在编译阶段对函数调用进行合法性检查。青岛农业大学理信学院以上的声明称为函数原型声明(functionprototype)。两种形式:floatadd(float,float);floatadd(floata,floatb);青岛农业大学理信学院注意:“定义”与“声明”不同函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数的声明则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。青岛农业大学理信学院3、函数的嵌套调用被调函数中又调用了另外的函数,称为函数的嵌套调用。青岛农业大学理信学院例子#include“stdio.h”voidmain(){inti=10,j=20;intf1(intx,inty);intf2(intx,inty);i=f1(i,j);printf(“%d”,i);]intf1(intx,inty){x=x*y;y=f2(x,y);returnx+y;}intf2(intx,inty){returnx-y;}青岛农业大学理信学院4、函数的递归调用被调函数中间接或者直接调用了该函数本身,称为函数的递归调用。例如:intf(intx){inty,z;z=f(y);return(2*z);}直接调用了函数自身青岛农业大学理信学院间接调用intf(intx){inty,z;z=f1(y);return(2*z);}intf1(intx){returnf(x)*0.5+10;}青岛农业大学理信学院例分析:例8.8用递归方法求n!n!=n*(n-1)!(n1)1(n=1)intf(intn){if(n==1)return1;elsereturnn*f(n-1);}青岛农业大学理信学院三、数组作为函数的参数1、数组元素作为函数实参由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与变量作实参一样,是单向传递,即“值传递”方式。青岛农业大学理信学院例8.10有两个数组a和b,各有10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比……)。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,a[i]b[i]6次,b[i]a[i]3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。青岛农业大学理信学院#includestdio.hvoidmain(){intlarge(intx,inty);/*函数声明*/inta[10],b[10],i,n=0,m=0,k=0;printf(″enterarraya∶\n″);for(i=0;i<10;i++=)scanf(″%d″,&a[i]);printf(″\n″);printf(″enterarrayb∶\n″);for(i=0;i<10;i++=)scanf(″%d″,&b[i]);printf(″\n″);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}青岛农业大学理信学院printf(a[i]b[i]%dtimes\na[i]=b[i]%dtimes\na[i]b[i]%dtimes\n,n,m,k);if(nk)printf(arrayaislargerthanarrayb\n);elseif(nk)printf(arrayaissmallerthanarrayb\n);elseprintf(arrayaisequaltoarrayb\n);}large(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}青岛农业大学理信学院2、数组名作为函数参数用数组名作函数参数时,此时形参应当用数组名或指针变量。例8.11有一个一维数组score,内放10个学生成绩,求平均成绩。青岛农业大学理信学院#includestdio.hvoidmain(){floataverage(floatarray[10]);/*函数声明*/floatscore[10],aver;inti;printf(″input10scores:\n″);for(i=0;i<10;i++=scanf(″%f″,&score[i]);printf(″\n″);aver=average(score);printf(″averagescoreis%5.2f\n″,aver);}青岛农业大学理信学院floataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;return(aver);}运行情况如下:input10scores:100567898.576879967.57597↙averagescoreis83.40青岛农业大学理信学院第一种情况:形参以及对应的实参都是数组,要求二者类型一致、长度相同。青岛农业大学理信学院例8.12形参数组不定义长度#includestdio.hvoidmain(){floataverage(floatarray[],intn)floatscore_1[5]={98.5,97,91.5,60,55};floatscore_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf(“theaverageofclassAis%6.2f\n”,average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,average(score_2,1

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

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

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

×
保存成功