1、第五讲,Java方法,授课方式:投影演示 教学目标:让学生掌握方法的基本概念 教学内容:1、方法定义的格2、方法的参数和值 教学重点:形参和实参的概念,返回值 教学难点:形参和实参的运用 课时安排:2课时,第5讲 方法,方法的概述 方法定义 方法的参数与值 方法的调用 方法的嵌套调用 方法的递归调用 变量的作用域,方法的概述,方法对执行重复或共享的任务很有用,可以在代码中的许多不同位置调用方法优点: 方法允许将程序分为不连续的逻辑单元。 便于程序的修改,方法的分类,从方法和过程两种功能这一角度 有返回值方法 无返回值方法 从主调方法和被调方法之间数据传递的角度 无参方法 有参方法,【实例】 求
2、 n!,创建一个C#程序,并定义一个方法Factor(n),计算n!,输入n的值,调用Factor(n)方法计算1!至n!,并在屏幕上输出。(如下图n=9时的结果),请输入n的值:9 1!=1 2!=2 3!=6 4!=24 5!=120 6!=720 7!=5040 8!=40320 9!=362880,代码分析与讨论,static void Main(string args) Scanner input = new Scanner(System.in);System.out.println(“请输入n的值:“);int n=0;long f;n =input.nextInt( );MyMa
3、th mymath = new MyMath();for (int i = 1; i =n; i+)f = mymath. Factor(i);System.out.println(i+“!=“+f); ,Class MyMathpublic long Factor(int n)long fa = 1;for (int i = n; i = 1; i-)fa *= i;return fa; ,方法定义的格式,无参方法的定义形式 返回类型 方法名() 声明部分语句,有参方法定义的一般形式 返回类型 方法名(形式参数表列) 声明部分语句,【实例】求两个数中的大数,Public class MyMa
4、th public int max(int a, int b) if (a b) return a;else return b; ,static void Main(string args) Scanner input = new Scanner(System.in);int x,y,z;MyMath mymath = new MyMath();System.out.print(“请输入两个数字:“);x = input.nextInt();y = input.nextInt();z= mymath.max(x,y);System.out.println(“最大数字为:“+z); ,方法的参数
5、与值,形式参数和实际参数 返回值方法的返回值是通过方法体中的return语句获得的,return语句后面表达式的值为方法的返回值。,【实例】 形参与实参,static void Main(string args)int n=0;Scanner input = new Scanner();MyMath mymath = new MyMath();System.out.print(“input numbern“);n = input.nextInt( ); mymath.s(n);System.out.println(“n=“+n);Console.Read();,public class MyM
6、ath public int s(int n)int i;for(i=n-1;i=1;i-)n=n+i;System.out.println(“n=“+n);return n; ,习题,1、编写一个程序,输入一个球的半径(double类型),然后调用sphereVolum计算并显示球的体积。计算球的体积的公式是:Volum=4/3*pi*Radius3)2、编写方法intergerPower(base,exponect),返回base的exponent次幂值。例如:intergerPower(3,4)=34设exponent是一个正整数,base也是一个整数。编写程序调用intergerPow
7、er方法。,方法的调用,在程序中是通过对方法的调用来执行方法体的 #语言中,方法调用的一般形式为:方法名(实际参数表) 【提示】在方法调用中,参数值的数量、类型和顺序必须与方法头中的参数完全对应。,参数传递,方法的定义是在类的设计中进行的,方法的使用是在实际运行中进行的,定义方法的时候使用形式参数(形参),而调用方法时候,用实际参数(实参)取代形式参数,这个过程称为参数传递。向方法传递参数有两个方法,一个是“传值”,另一个是“传引用”。,传值,值传递就是实参将值复制给形参,系统要为形参开设存储空间,以接受传递的值,此时形参成为一个实在的局部变量 实参和形参脱离关系,形参在方法中参与运算,在运算
8、中发生的任何变化都不会影响实参,【实例】 值传递,static void Main(string args) int i = 1, j = 2;MyMath mymath = new MyMath( );mymath.Swap(i, j);System.out.println(“i=“ + i + “j=“ + j);,编译上述代码,程序将输出: i=1,j=2,public class MyMath public void Swap(int x, int y) int temp = x;x = y;y = temp; ,方法的嵌套调用 方法的递归调用 变量的作用域,方法的嵌套调用,#语言允许
9、在一个方法的定义中出现对另一个方法的调用。这样就出现了方法的嵌套调用。,【实例】方法的嵌套调用,题目:计算s=22!+32! 解题思路: 本题可编写两个方法,一个是用来计算平方值的方法f1,另一个是用来计算阶乘值的方法f2。主方法先调f1计算出平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,然后返回f1,再返回主方法,在循环程序中计算累加和。,代码分析与讨论,public class MyMath public long f1(int p) int k;long r;k=p*p;r=f2(k);return r; public long f2(int q) long c=1;int
10、i;for(i=1;i=q;i+)c=c*i;return c; ,static void Main(string args) int i;long s=0;for (i=2;i=3;i+)s=s+f1(i);System.out.println (“s=“+s); ,方法嵌套的练习,已知组合数 求对于任意m、n时的值。,方法的递归调用,一个方法在它的方法体内调用它自身称为递归调用。这种方法称为递归方法。 在递归调用中,主调方法又是被调方法。执行递归方法将反复调用其自身,每调用一次就进入新的一层。,例如有方法f如下: public int f(int x) int y;z=f(y);retur
11、n z; ,简单方法递归的例子,计算n!,public int Factorial( int n ) int p = n;if( n1 )p *=Factorial(n-1);return p; ,【实例】Hanoi塔问题,题目要求:一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图11-4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。,【实例】Hanoi塔问题,解题思路: 当n大于等于2时,移动的过程可分解为三个步骤: 第一步 把A上的n-1个圆盘
12、移到B上; 第二步 把A上的一个圆盘移到C上; 第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n-1个圆盘从一个针移到另一个针上,这里的n=n-1。,【实例】Hanoi塔问题,Public class Hanoi public void move(int n,char x,char y,char z)if(n=1)System.out.println(x+“”+z);elsemove(n-1,x,z,y);System.out.println(x+“”+z);move(n-1,y,x,z); ,【实例】Hanoi塔问题,s
13、tatic void Main(string args)int h;Scanner scan = new Scanner(System.in);Hanoi hanoi = new Hanoi( );System.out.println(“input number:“);h= scan.nextInt();System.out.println(“the step to moving “+h+” diskes:“);hanoi.move(h,a,b,c); ,递归方法的练习,编写一个递归方法,该方法由用户输入两个数num和n,可以计算num的n次方。,综合习题,编写一个求水仙花数的方法,然后通过主
14、方法调用该方法求100999之间的全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数本身。例如:153就是一个水仙花数:153=1*1*1+5*5*5+3*3*3,综合习题,请编写一个函数,输出整数m的全部素数因子。例如:m=120时,素数因子为:2,2,2,3,5,局部变量,在程序中,任何变量都有生命期、作用域和可见性的变化。C#的局部的语法区域是指方法或方法内的代码块。,Public class Program int x;void RangeTesting(int i) int x;x = i;for (int j = i; j 6; j+) x += j;System
15、.out.print(“在代码块中 x=“+x); System.out.print(“局部变量x离开代码块,仍在方法中,x=“+ x);System.out.print(“字段x在方法中,字段x=“+this.x); void TestingAgain()System.out.print(“离开局部变量x所在的方法,x=“+ x); ,【实例】,代码分析与讨论,static void Main(string args)Program mys = new Program();mys.RangeTesting(3);mys.TestingAgain();System.out.println(“在
16、Main方法中,x=“ + mys.x);,静态多态(方法重载),不止是构造方法可以重载,其实任何方法都能重载方法重载:就是在同一个类中具有相同名称,执行基本相同操作,但是使用不同的参数列表的一组方法编译器通过参数的个数和类型确定调用重载方法的哪个版本例:System.out.println(String);System.out.println(int);,重载类型,参数类型不同int add(int,int);float add(float,float); 参数个数不同int add(int,int);int add(int,int,int); 注意:若参数类型和个数都相同,返回类型不同不算
17、重载,方法重载的作用域规则,重载机制只有在方法声明的同一作用域内才有效,class first public:void display(); class second public:void display(); ,void main() first object1;second object2;/没有发生方法重载 object1.display()object2.display(); ,讲解习题,1、编写minimum3方法,求3个浮点数种的最小值。由用户输入3个值,调用minimum3方法确定最小值,并显示该最小值。 2、计算机在教育中的作用越来越大。编写一个程序帮助小学生学习乘法。利用M
18、ath.Random产生两个正的一位整数,并显示出题目,如:6乘3的积是多少?学生在提示下输入结果。程序检查该学生的答案,如果答案正确,打印出“非常棒”,并再出一道题。如果答案错误,打印字符串“不对,请再试一次”再让学生重做该题,直到做正确为止。利用一个方法来产生题目。,讲解习题,3、更复杂的计算机辅助教学系统可以监测学生在一段时间内的表现。修改习题2的程序累计回答问题的正确和错误次数。在学生回答10个问题以后,程序计算出回答问题的正确率,若低于75%,程序应打印出“请你的老师给你辅导一下”。,讲解习题,4、如下图所示的程序中,若实参a与形参x以引用调用(call by reference)的
19、方式传递信息,则输出结果为_;若实参a与形参x以值调用(call by value)的方式传递信息,那么输出结果为_。,讲解习题,5、如下图所示的程序中,若调用f1(x)时,参数传递采用传值方式,调用f2(y)时,参数传递采用引用方式,则输出结果为_;若调用f1(x)时,参数传递采用引用方式,调用f2(y)时,参数传递采用传值方式,则输出结果为_。,讲解习题,9、请编写一个模拟轮盘赌的程序。该轮盘赌机器随机地在035之间选择一个数字,游戏者可以打奇/偶赌或打具体数的赌。赢得奇/偶数赌时游戏以2比1获奖,但如果轮盘赌机器选中0则所有奇/偶赌都输掉。如果游戏者打一个具体数的赌,而轮盘赌机器正好选中此数,则他以35比1获奖。,总结,方法定义 方法的参数与值 方法的调用 方法的嵌套调用 方法的递归调用 变量的作用域,抽象,爬行动物类,哺乳动物类,动物类,抽象,从具体到抽象,