640 likes | 647 Views
This chapter introduces program modules in Java, focusing on methods, the Math class, and recursion. It explains how methods modularize programs, demonstrates the usage of math methods in the Math class, and explores the concept of recursion.
E N D
Chapter 6 - Methods Outline6.1 Introduction6.2 Program Modules in Java6.3 Math Class Methods6.4 Methods6.5 Method Definitions6.6 Argument Promotion6.7 Java API Packages6.8 Random-Number Generation6.9 Example: A Game of Chance6.10 Duration of Identifiers6.11 Scope Rules6.12 Recursion6.13 Example Using Recursion: The Fibonacci Series6.14 Recursion vs. Iteration6.15 Method Overloading6.16 Methods of Class JApplet6.17 (Optional Case Study) Thinking About Objects: Identifying Class Operations
6.1 Introduction • Modules • Small pieces of a problem • e.g., divide and conquer • Facilitate design, implementation, operation and maintenance of large programs
6.2 Program Modules in Java • Modules in Java • Methods • Classes • Java API provides several modules • Programmers can also create modules • e.g., programmer-defined methods • Methods • Invoked by a method call • Returns a result to calling method (caller) • Similar to a boss (caller) asking a worker (called method) to complete a task
main worker1 worker2 worker3 worker4 worker5 Fig. 6.1 Hierarchical boss-method/worker-method relationship.
6.3 Math Class Methods • Class java.lang.Math • Provides common mathematical calculations • Calculate the square root of 900.0: • Math.sqrt( 900.0 ) • Method sqrt belongs to class Math • Dot operator (.) allows access to method sqrt • The argument900.0 is located inside parentheses
6.4 Methods • Methods • Allow programmers to modularize programs • Makes program development more manageable • Software reusability • Avoid repeating code • Local variables • Declared in method definition • Parameters • Communicates information between methods via method calls
6.5 Method Definitions • Programmers can write customized methods
Declare result to store square of number Method init invokes method square (next slide) Method square returns int that result stores 1 // Fig. 6.3: SquareIntegers.java 2 // A programmer-defined square method 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class SquareIntegers extends JApplet { 11 12 // set up GUI and calculate squares of integers from 1 to 10 13 public void init() 14 { 15 // JTextArea to display results 16 JTextArea outputArea = new JTextArea(); 17 18 // get applet's content pane (GUI component display area) 19 Container container = getContentPane(); 20 21 // attach outputArea to container 22 container.add( outputArea ); 23 24 int result; // store result of call to method square 25 String output = ""; // String containing results 26 27 // loop 10 times 28 for ( int counter = 1; counter <= 10; counter++ ) { 29 30 // calculate square of counter and store in result 31 result = square( counter ); 32 33 // append result to String output 34 output += "The square of " + counter + 35 " is " + result + "\n"; SquareIntegers.javaLine 24Declare result to store square of number Line 31Method init invokes method squareLine 31Method square returns int that result stores
y is the parameter of method square Method square returns the square of y 36 37 } // end for structure 38 39 outputArea.setText( output ); // place results in JTextArea 40 41 }// end method init 42 43 // square method definition 44 public int square( int y ) 45 { 46 return y * y; // return square of y 47 48 }// end method square 49 50 } // end class SquareIntegers SquareIntegers.javaLine 44y is the parameter of method squareLine 46Method square returns the square of y
6.5 Method Definitions (cont.) • General format of method:return-value-type method-name( parameter-list ){ declarations and statements} • Method can also return values: return expression;
User inputs three Strings Convert Strings to doubles Method init passes doubles as arguments to method maximum 1 // Fig. 6.4: Maximum.java 2 // Finding the maximum of three doubles 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class Maximum extends JApplet { 11 12 // initialize applet by obtaining user input and creating GUI 13 public void init() 14 { 15 // obtain user input 16 String s1 = JOptionPane.showInputDialog( 17 "Enter first floating-point value" ); 18 String s2 = JOptionPane.showInputDialog( 19 "Enter second floating-point value" ); 20 String s3 = JOptionPane.showInputDialog( 21 "Enter third floating-point value" ); 22 23 // convert user input to double values 24 double number1 = Double.parseDouble( s1 ); 25 double number2 = Double.parseDouble( s2 ); 26 double number3 = Double.parseDouble( s3 ); 27 28 // call method maximum to determine largest value 29 double max = maximum( number1, number2, number3 ); 30 31 // create JTextArea to display results 32 JTextArea outputArea = new JTextArea(); 33 Maximum.javaLines 16-21User inputs three StringsLines 24-26Convert Strings to doubles Line 29Method init passes doubles as arguments to method maximum
Method maximum returns value from method max of class Math 34 // display numbers and maximum value 35 outputArea.setText( "number1: " + number1 + 36 "\nnumber2: " + number2 + "\nnumber3: " + number3 + 37 "\nmaximum is: " + max ); 38 39 // get the applet's GUI component display area 40 Container container = getContentPane(); 41 42 // attach outputArea to Container c 43 container.add( outputArea ); 44 45 } // end method init 46 47 // maximum method uses Math class method max to help 48 // determine maximum value 49 public double maximum( double x, double y, double z ) 50 { 51 return Math.max( x, Math.max( y, z ) ); 52 53 }// end method maximum 54 55 } // end class Maximum Maximum.javaLine 51Method maximum returns value from method max of class Math
6.6 Argument Promotion • Coercion of arguments • Forcing arguments to appropriate type to pass to method • e.g., System.out.println( Math.sqrt( 4 ) ); • Evaluates Math.sqrt( 4 ) • Then evaluates System.out.println() • Promotion rules • Specify how to convert types without data loss
6.7 Java API Packages • Packages • Classes grouped into categories of related classes • Promotes software reuse • import statements specify classes used in Java programs • e.g., import javax.swing.JApplet;
6.8 Random-Number Generation • Java random-number generators • Math.random() • ( int ) ( Math.random() * 6 ) • Produces integers from 0 - 5 • Use a seed for different random-number sequences
Produce integers in range 1-6 Math.random returns doubles. We cast the double as an int 1 // Fig. 6.7: RandomIntegers.java 2 // Shifted, scaled random integers. 3 4 // Java extension packages 5 import javax.swing.JOptionPane; 6 7 public class RandomIntegers { 8 9 // main method begins execution of Java application 10 public static void main( String args[] ) 11 { 12 int value; 13 String output = ""; 14 15 // loop 20 times 16 for ( int counter = 1; counter <= 20; counter++ ) { 17 18 // pick random integer between 1 and 6 19 value = 1 + ( int ) ( Math.random() * 6 ); 20 21 output += value + " "; // append value to output 22 23 // if counter divisible by 5, 24 // append newline to String output 25 if ( counter % 5 == 0 ) 26 output += "\n"; 27 28 } // end for structure 29 30 JOptionPane.showMessageDialog( null, output, 31 "20 Random Numbers from 1 to 6", 32 JOptionPane.INFORMATION_MESSAGE ); 33 34 System.exit( 0 ); // terminate application 35 RandomIntegers.javaLine 19Produce integers in range 1-6Line 19Math.random returns doubles. We cast the double as an int
36 } // end method main 37 38 } // end class RandomIntegers RandomIntegers.java
Produce integers in range 1-6 Increment appropriate frequency counter, depending on randomly generated number 1 // Fig. 6.8: RollDie.java 2 // Roll a six-sided die 6000 times. 3 4 // Java extension packages 5 import javax.swing.*; 6 7 public class RollDie { 8 9 // main method begins execution of Java application 10 public static void main( String args[] ) 11 { 12 int frequency1 = 0, frequency2 = 0, frequency3 = 0, 13 frequency4 = 0, frequency5 = 0, frequency6 = 0, face; 14 15 // summarize results 16 for ( int roll = 1; roll <= 6000; roll++ ) { 17 face = 1 + ( int ) ( Math.random() * 6 ); 18 19 // determine roll value and increment appropriate counter 20 switch ( face ) { 21 22 case1: 23 ++frequency1; 24 break; 25 26 case2: 27 ++frequency2; 28 break; 29 30 case3: 31 ++frequency3; 32 break; 33 RollDie.javaLine 17Produce integers in range 1-6Line 20Increment appropriate frequency counter, depending on randomly generated number
34 case4: 35 ++frequency4; 36 break; 37 38 case5: 39 ++frequency5; 40 break; 41 42 case6: 43 ++frequency6; 44 break; 45 46 } // end switch structure 47 48 } // end for structure 49 50 JTextArea outputArea = new JTextArea(); 51 52 outputArea.setText( "Face\tFrequency" + 53 "\n1\t" + frequency1 + "\n2\t" + frequency2 + 54 "\n3\t" + frequency3 + "\n4\t" + frequency4 + 55 "\n5\t" + frequency5 + "\n6\t" + frequency6 ); 56 57 JOptionPane.showMessageDialog( null, outputArea, 58 "Rolling a Die 6000 Times", 59 JOptionPane.INFORMATION_MESSAGE ); 60 61 System.exit( 0 ); // terminate application 62 63 } // end method main 64 65 } // end class RollDie RollDie.java
6.9 Example: A Game of Chance • Craps simulation • Roll dice first time • If sum equals 7 or 11, the player wins • If sum equals 2, 3 or 12, the player loses • Any other sum (4, 5, 6, 8, 9, 10) is that player’s point • Keep rolling dice until… • Sum matches player point • Player wins • Sum equals 7 or 11 • Player loses
Method init starts JApplet and initializes GUI (Chapter 12 covers GUI in detail) 1 // Fig. 6.9: Craps.java 2 // Craps 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class Craps extends JApplet implements ActionListener { 12 13 // constant variables for game status 14 final int WON = 0, LOST = 1, CONTINUE = 2; 15 16 // other variables used 17 boolean firstRoll = true; // true if first roll of dice 18 int sumOfDice = 0; // sum of the dice 19 int myPoint = 0; // point if no win/loss on first roll 20 int gameStatus = CONTINUE; // game not over yet 21 22 // graphical user interface components 23 JLabel die1Label, die2Label, sumLabel, pointLabel; 24 JTextField die1Field, die2Field, sumField, pointField; 25 JButton rollButton; 26 27 // set up GUI components 28 public void init() 29 { 30 // obtain content pane and change its layout to 31 // a FlowLayout 32 Container container = getContentPane(); 33 container.setLayout( new FlowLayout() ); 34 Craps.javaLine 28Method init starts JApplet and initializes GUI
JTextFields that output dice results JTextField that outputs sum of dice JTextField that outputs player’s point JButton for rolling dice 35 // create label and text field for die 1 36 die1Label = new JLabel( "Die 1" ); 37 container.add( die1Label ); 38 die1Field = new JTextField( 10 ); 39 die1Field.setEditable( false ); 40 container.add( die1Field ); 41 42 // create label and text field for die 2 43 die2Label = new JLabel( "Die 2" ); 44 container.add( die2Label ); 45 die2Field = new JTextField( 10 ); 46 die2Field.setEditable( false ); 47 container.add( die2Field ); 48 49 // create label and text field for sum 50 sumLabel = new JLabel( "Sum is" ); 51 container.add( sumLabel ); 52 sumField = new JTextField( 10 ); 53 sumField.setEditable( false ); 54 container.add( sumField ); 55 56 // create label and text field for point 57 pointLabel = new JLabel( "Point is" ); 58 container.add( pointLabel ); 59 pointField = new JTextField( 10 ); 60 pointField.setEditable( false ); 61 container.add( pointField ); 62 63 // create button user clicks to roll dice 64 rollButton = new JButton( "Roll Dice" ); 65 rollButton.addActionListener( this ); 66 container.add( rollButton ); 67 } 68 Craps.javaLines 38 and 45JTextFields that output dice resultsLine 52JTextField that outputs sum of dice Line 59JTextField that outputs player’s point Line 64JButton for rolling dice
Method invoked when user presses JButton If first roll, invoke method rollDice If sum is 7 or 11, user wins If user rolls 2, 3 or 12, user loses If sum is 4, 5, 6, 8, 9 or 10, that sum is the point 69 // process one roll of dice 70 public void actionPerformed( ActionEvent actionEvent ) 71 { 72 // first roll of dice 73 if ( firstRoll ) { 74 sumOfDice = rollDice(); // roll dice 75 76 switch ( sumOfDice ) { 77 78 // win on first roll 79 case7: case11: 80 gameStatus = WON; 81 pointField.setText( "" ); // clear point field 82 break; 83 84 // lose on first roll 85 case2: case3: case12: 86 gameStatus = LOST; 87 pointField.setText( "" ); // clear point field 88 break; 89 90 // remember point 91 default: 92 gameStatus = CONTINUE; 93 myPoint = sumOfDice; 94 pointField.setText( Integer.toString( myPoint ) ); 95 firstRoll = false; 96 break; 97 98 } // end switch structure 99 100 } // end if structure body 101 Craps.javaLine 70Method invoked when user presses JButtonLines 73-74If first roll, invoke method rollDiceLines 79-82If sum is 7 or 11, user winsLines 85-88If sum is 2, 3 or 12, user losesLines 91-96If sum is 4, 5, 6, 8, 9 or 10, that sum is the point
If subsequent roll, invoke method rollDice If sum equals point, user wins; If sum equals 7, user loses Method rollDice uses Math.random to simulate rolling two dice return dice sum 102 // subsequent roll ofdice 103 else { 104 sumOfDice = rollDice(); // roll dice 105 106 // determine game status 107 if ( sumOfDice == myPoint ) // win by making point 108 gameStatus = WON; 109 else 110 if ( sumOfDice == 7 ) // lose by rolling 7 111 gameStatus = LOST; 112 } 113 114 // display message indicating game status 115 displayMessage(); 116 117 } // end method actionPerformed 118 119 // roll dice, calculate sum and display results 120 public int rollDice() 121 { 122 int die1, die2, sum; 123 124 // pick random die values 125 die1 = 1 + ( int ) ( Math.random() * 6 ); 126 die2 = 1 + ( int ) ( Math.random() * 6 ); 127 128 sum = die1 + die2; // sum die values 129 130 // display results 131 die1Field.setText( Integer.toString( die1 ) ); 132 die2Field.setText( Integer.toString( die2 ) ); 133 sumField.setText( Integer.toString( sum ) ); 134 135 return sum; // return sum of dice 136 Craps.javaLine 104If subsequent roll, invoke method rollDiceLines 107-111If sum equals point, user wins; If sum equals 7, user losesLines 125-126Method rollDice uses Math.random to simulate rolling two diceLine 135return dice sum
137 } // end method rollDice 138 139 // determine game status and display appropriate message 140 // in status bar 141 public void displayMessage() 142 { 143 // game should continue 144 if ( gameStatus == CONTINUE ) 145 showStatus( "Roll again." ); 146 147 // game won or lost 148 else { 149 150 if ( gameStatus == WON ) 151 showStatus( "Player wins. " + 152 "Click Roll Dice to play again." ); 153 else 154 showStatus( "Player loses. " + 155 "Click Roll Dice to play again." ); 156 157 // next roll is first roll of new game 158 firstRoll = true; 159 } 160 161 } // end method displayMessage 162 163 } // end class Craps Craps.java
6.10 Duration of Identifiers • Identifier duration • Lifetime • Period during which identifier exists in memory • Automatic duration • Local variables • Static duration • Identifier scope • Defines where identifier can be referenced
6.11 Scope Rules • Scope • Portion of the program that can reference an identifier • Class scope • Begins at opening brace ({) and ends at closing brace (}) • e.g., methods and instance variables • Block scope • Begins at identifier declaration and ends at closing brace (}) • e.g., local variables and method parameters
Instance variable x has class scope Local variable x has block scope Method start uses local variable x 1 // Fig. 6.10: Scoping.java 2 // A scoping example. 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class Scoping extends JApplet { 11 JTextArea outputArea; 12 13 // instance variable accessible to all methods of this class 14 int x = 1; 15 16 // set up applet’s GUI 17 public void init() 18 { 19 outputArea = new JTextArea(); 20 Container container = getContentPane(); 21 container.add( outputArea ); 22 23 } // end method init 24 25 // method start called after init completes; start calls 26 // methods useLocal and useInstance 27 public void start() 28 { 29 int x = 5; // variable local to method start 30 31 outputArea.append( "local x in start is " + x ); 32 33 useLocal(); // useLocal has local x 34 useInstance(); // useInstance uses instance variable x Scoping.javaLine 14Instance variable x has class scopeLine 29Local variable x has block scopeLine 31Method start uses local variable x
A second variable x has block scope Method useLocal uses local variable x Method useInstance uses instance variable x 35 useLocal(); // useLocal reinitializes local x 36 useInstance(); // instance variable x retains its value 37 38 outputArea.append( "\n\nlocal x in start is " + x ); 39 40 } // end method start 41 42 // useLocal reinitializes local variable x during each call 43 public voiduseLocal() 44 { 45 int x = 25; // initialized each time useLocal is called 46 47 outputArea.append( "\n\nlocal x in useLocal is " + x + 48 " after entering useLocal" ); 49 ++x; 50 outputArea.append( "\nlocal x in useLocal is " + x + 51 " before exiting useLocal" ); 52 53 } // end method useLocal 54 55 // useInstance modifies instance variable x during each call 56 public void useInstance() 57 { 58 outputArea.append( "\n\ninstance variable x is " + x + 59 " on entering useInstance" ); 60 x *= 10; 61 outputArea.append( "\ninstance variable x is " + x + 62 " on exiting useInstance" ); 63 64 } // end method useInstance 65 66 } // end class Scoping Scoping.javaLine 45A second variable x has block scopeLines 47-51Method useLocal uses local variable xLines 58-62Method use-Instance uses instance variable x
6.12 Recursion • Recursive method • Calls itself (directly or indirectly) through another method • Method knows how to solve only a base case • Method divides problem • Base case • Simpler problem • Method now divides simpler problem until solvable • Recursive call • Recursive step
Final value = 120 5! 5! 5! = 5 * 24 = 120 is returned 5 * 4! 5 * 4! 4! = 4 * 6 = 24 is returned 4 * 3! 4 * 3! 3! = 3 * 2 = 6 is returned 3 * 2! 3 * 2! 2! = 2 * 1 = 2 is returned 2 * 1! 2 * 1! 1 returned 1 1 (a) Procession of recursive calls. (b) Values returned from each recursive call. Fig. 6.11 Recursive evaluation of 5!.
Invoke method factorial Test for base case (method factorial can solve base case) 1 // Fig. 6.12: FactorialTest.java 2 // Recursive factorial method 3 4 // Java core packages 5 import java.awt.*; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class FactorialTest extends JApplet { 11 JTextArea outputArea; 12 13 // initialize applet by creating GUI and calculating factorials 14 public void init() 15 { 16 outputArea = new JTextArea(); 17 18 Container container = getContentPane(); 19 container.add( outputArea ); 20 21 // calculate the factorials of 0 through 10 22 for ( long counter = 0; counter <= 10; counter++ ) 23 outputArea.append( counter + "! = " + 24 factorial( counter ) + "\n" ); 25 26 } // end method init 27 28 // Recursive definition of method factorial 29 public long factorial( long number ) 30 { 31 // base case 32 if ( number <= 1 ) 33 return1; 34 FactorialTest.javaLine 24Invoke method factorialLines 32-33Test for base case (method factorial can solve base case)
Else return simpler problem that method factorial might solve in next recursive call 35 // recursive step 36 else 37 return number * factorial( number - 1 ); 38 39 } // end method factorial 40 41 } // end class FactorialTest FactorialTest.javaLine 37Else return simpler problem that method factorial might solve in next recursive call
6.13 Example Using Recursion: The Fibonacci Series • Fibonacci series • Each number in the series is sum of two previous numbers • e.g., 0, 1, 1, 2, 3, 5, 8, 13, 21…fibonacci(0) =0fibonacci(1) =1fibonacci(n) = fibonacci(n -1) + fibonacci( n –1 ) • fibonacci(0) and fibonacci(1) are base cases • Golden ratio (golden mean)
1 // Fig. 6.13: FibonacciTest.java 2 // Recursive fibonacci method 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class FibonacciTest extends JApplet 12 implements ActionListener { 13 14 JLabel numberLabel, resultLabel; 15 JTextField numberField, resultField; 16 17 // set up applet’s GUI 18 public void init() 19 { 20 // obtain content pane and set its layout to FlowLayout 21 Container container = getContentPane(); 22 container.setLayout( new FlowLayout() ); 23 24 // create numberLabel and attach it to content pane 25 numberLabel = 26 new JLabel( "Enter an integer and press Enter" ); 27 container.add( numberLabel ); 28 29 // create numberField and attach it to content pane 30 numberField = new JTextField( 10 ); 31 container.add( numberField ); 32 33 // register this applet as numberField’s ActionListener 34 numberField.addActionListener( this ); 35 FibonacciTest.java
Method actionPerformed is invoked when user presses Enter We use long, because Fibonacci numbers become large quickly Pass user input to method fibonacci 36 // create resultLabel and attach it to content pane 37 resultLabel = new JLabel( "Fibonacci value is" ); 38 container.add( resultLabel ); 39 40 // create numberField, make it uneditable 41 // and attach it to content pane 42 resultField = new JTextField( 15 ); 43 resultField.setEditable( false ); 44 container.add( resultField ); 45 46 } // end method init 47 48 // obtain user input and call method fibonacci 49 public void actionPerformed( ActionEvent e ) 50 { 51 long number, fibonacciValue; 52 53 // obtain user’s input and conver to long 54 number = Long.parseLong( numberField.getText() ); 55 56 showStatus( "Calculating ..." ); 57 58 // calculate fibonacci value for number user input 59 fibonacciValue = fibonacci( number ); 60 61 // indicate processing complete and display result 62 showStatus( "Done." ); 63 resultField.setText( Long.toString( fibonacciValue ) ); 64 65 } // end method actionPerformed 66 FibonacciTest.javaLine 49Method actionPerformed is invoked when user presses EnterLine 51We use long, because Fibonacci numbers become large quicklyLines 54-59Pass user input to method fibonacci
Test for base case (method fibonacci can solve base case) Else return simpler problem that method fibonacci might solve in next recursive call 67 // Recursive definition of method fibonacci 68 public long fibonacci( long n ) 69 { 70 // base case 71 if ( n == 0 || n == 1 ) 72 return n; 73 74 // recursive step 75 else 76 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 77 78 } // end method fibonacci 79 80 } // end class FibonacciTest FibonacciTest.javaLines 71-72Test for base case (method fibonacci can solve base case)Lines 75-76Else return simpler problem that method fibonacci might solve in next recursive call
f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) + f( 0 ) return 1 return 1 return 0 Fig. 6.14 Set of recursive calls to method fibonacci (f in this diagram).
6.14 Recursion vs. Iteration • Iteration • Uses repetition structures (for, while or do/while) • Repetition through explicitly use of repetition structure • Terminates when loop-continuation condition fails • Controls repetition by using a counter • Recursion • Uses selection structures (if, if/else or switch) • Repetition through repeated method calls • Terminates when base case is satisfied • Controls repetition by dividing problem into simpler one
6.14 Recursion vs. Iteration (cont.) • Recursion • More overhead than iteration • More memory intensive than iteration • Can also be solved iteratively • Often can be implemented with only a few lines of code