7.2 函数的定义
和单纯的函数调用不同,我们现在是函数的设计者,是提供函数给别人或者自己使用的。设计者需要确定函数的名字,它需要什么参数,得到什么结果,以及它是怎么计算出来的。
下面我们来看一个简单的函数,数学函数f(x)=3x+4的java实现:
public static int func(int x){
int y=3*x+4;
return y;
}
这个函数就是f(x)=3*x+4的Java语言版本。下面逐一说明函数定义的各种要素:
函数名:函数的名称,命名规则和变量一致,在这个例子里,函数名是func。
函数计算结果的类型:func前面的int代表了这个函数计算出来的结果是int类型的。void表示没有返回值,例如main函数。
参数:输入的内容,自变量。和初中代数不同的是,自变量是有类型的,这里是int类型。参数可以有多个,以逗号分隔,每个参数都要写明类型在前面。注意,这里不要理解成定义一个变量,而是指这个参数是什么类型。
函数体:做出计算的代码。大括号内的代码。
返回值:也就是返回应变量的值,最终函数计算的结果,由return来表达这个语法,return后的值就是函数计算的值。
public static这两个关键字必须写上,否则无法被main函数调用,这两个关键字的意义,下一章节会有解释。
调用函数就是使用函数进行计算:
public static int func(int x){ int y=3*x+4; return y;}public static void main(String[]args){ int a=6; int b=func(a); System.out.println(b);}这是一个完整的函数定义,以及调用的代码。以下几点是需要注意的:
1.函数func和main函数是平行关系,它们都属于类Test,代码上体现就是都在Test的大括号范围内。
2.func和main函数的位置没有关系,只要定义正确,不管在main函数的前后,main函数都能调用到。
3.我们称为main函数调用func函数,func函数被调用。
4.函数名通常是小写开头,命名规则和变量名相同
调用func函数的代码:“int b=func(a);”。具体细节为:a的值是6,func(a)就相当于把6这个值传入到函数func中。然后这个值会赋给func的参数x,然后运算后y的值是22,最后return y把22这个值返回,也就是函数的计算结果。
这里func(a)将得到计算结果(根据 func函数定义来计算),然后把这个值赋给变量b。
func怎么得到计算的结果值呢?秘密就是return语句——第4行语句“return y;”。return后面的表达式,就是整个函数的值。如果里面的return语句写成了这样:“return 4;”那么这个函数不管是什么输入,中间计算的是什么(也就是代码1的第3行代码的计算),计算出来的结果都是4。
练习题
-
完成下列练习1.关于函数,下列说法错误的是: (2分) [选择]A.
B. 函数是一个功能的抽象
C. 函数一次定义,多次调用
D. 函数的内部,也可以调用别的函数
E. 函数的定义和调用不能在同一个文件内2.(*)定义函数,用Java写出函数f(x)=x*x+5x+6,x的类型double类型,返回类型也是double,函数名字就使用f (10分) [编程]3.(**)定义一个函数absolute,以一个整数为参数,返回该整数的绝对值。 (10分) [编程]4.定义函数f,用Java写出分段函数 (10分) [编程]当x小于-5的时候,f(x)=x+10;
当x大于等于-5小于等于5的时候,f(x)=x*x-20 ;
当x大于5的时候,f(x)= -x+10。
函数名是f,x是int类型,返回类型int5.定义一个函数divide3,以一个整数为参数,返回值是布尔类型,判断该整数能否被3整除。如果是则返回true,否则返回false。 (10分) [编程]6.定义一个函数year,以一个整数为参数,返回值是布尔类型boolean。 (10分) [编程]函数判断整数是否是闰年。如果是则返回true,否则返回false(闰年的条件是能被4整除但不能被100整除,或者能被400整除)。7.针对上一题的f函数,补充下列的main函数代码,使得函数调用正确 (6分) [编程填空]public class Test{ /* 上一题f函数定义的地方 */ public static void main(String[]args){ /* 计算f(0),把计算结果赋给s */ double s=0; ; System.out.println(s); /* 计算f(1),把计算结果赋给s */ ; System.out.println(s); /* 计算f(-1),把计算结果赋给s */ ; System.out.println(s); }}8.针对上一题的absolute函数,补充下列的main函数代码,使得函数调用正确 (6分) [编程填空]public class Test{ /* 上一题absolute函数定义的地方 */ public static void main(String[]args){ /* 计算0的绝对值,把计算结果赋给s */ double s=0; ; System.out.println(s); /* 计算100的绝对值,把计算结果赋给s */ ; System.out.println(s); /* 计算-25的绝对值,把计算结果赋给s */ ; System.out.println(s); }}9.针对上一题的divide3函数,补充下列的main函数代码,使得函数调用正确 (4分) [编程填空]按提示写函数调用public class Test{ /* 上一题divide3函数定义的地方 */ public static void main(String[]args){ boolean b=false; /* 用divide3判断某个能被3整除的数字(int范围内任意一个),把计算结果赋给b */ ; System.out.println(b); /* 用divide3判断某个不能被3整除的数字(int范围内任意一个),把计算结果赋给b */ ; System.out.println(b); }}10.针对上一题的year函数,补充下列的main函数代码,使得函数调用正确 (6分) [编程填空]public class Test{ /* 上一题year函数定义的地方 */ public static void main(String[]args){ /* 计算2004年是否是闰年 */ System.out.println( ); /* 计算1600年是否是闰年 */ System.out.println( ); /* 计算1800年是否是闰年 */ System.out.println( ); }} -
打印三角形1.(****)定义一个函数print,打印下面的形状 (10分) [编程(无自动批改)]参数就是层数(层数是奇数):
*
***
*****
*******
*****
***
*
提示:使用两个循环打印。public class Test{ /* print函数定义的地方 */ public static void main(String[]args){ print(7); }}2.设计一个函数printTriangle打印一个直角三角形 [编程(无自动批改)]此题参考6.2二重循环的1.3题
函数printTriangle,没有返回值,参数是直角三角形的层数,例如下面的图形是printTriangle(5)调用的结果:
*
***
*****
*******
*********
(注意*号之间没有空格)