650 likes | 672 Views
CSC 142 Computer Science II. Zhen Jiang West Chester University zjiang@wcupa.edu. Outline. Introduction (use of method) Declaring a method Calling a method Methods calling methods Control flow of method call Generalizing method Parameterization Multiple parameters Parameter mystery
E N D
CSC 142 Computer Science II Zhen Jiang West Chester University zjiang@wcupa.edu
Outline • Introduction (use of method) • Declaring a method • Calling a method • Methods calling methods • Control flow of method call • Generalizing method • Parameterization • Multiple parameters • Parameter mystery • Return values (vs. void) • Summary
public class FraggleRock { public static void main(String[] args) { System.out.println("Dance your cares away,"); System.out.println("Worry's for another day."); System.out.println("Let the music play,"); System.out.println("Down at Fraggle Rock."); System.out.println(); System.out.println("Dance your cares away,"); System.out.println("Worry's for another day."); System.out.println("Let the music play,"); System.out.println("Down at Fraggle Rock."); } } • Redundancy in programs
This is a space & timing problem: to find the redundancy of a certain part of program running at different time. Compared with the timing problem in loop: 1st, 2nd, 3rd … iterations Compared with the space problem in arrays: 1st, 2nd, 3rd … elements 1st, 2nd, 3rd … appearances of the same/similar procedure in your program!
public class FraggleRock { public static void singChorus() { System.out.println("Dance your cares away,"); System.out.println("Worry's for another day."); System.out.println("Let the music play,"); System.out.println("Down at Fraggle Rock."); } public static void main(String[] args) { singChorus(); System.out.println(); singChorus(); } } declaration, definition, body First time, four print lines repeated The second time, four prints repeated
static method: A group of statements given a name. To use a static method: 1. define it (write down the recipe) Write a group of statements and give it a name. 2. call it (cook using the recipe) Tell our program to execute the method.
public class FraggleRock { public static void singChorus() { System.out.println("Dance your cares away,"); System.out.println("Worry's for another day."); System.out.println("Let the music play,"); System.out.println("Down at Fraggle Rock."); } public static void main(String[] args) { singChorus(); System.out.println(); singChorus(); } } Method body, declaration, definition Method call, 1st time Method call, 2nd time
Declaring a static method The syntax for declaring a static method, Figure 5-3, p276: public class <class name> { ... public static void <method name>() { <statement>; <statement>; … <statement>; } }
Calling a static method The syntax for calling a static method (p276): <method name>();
Declaring a static method public static void printAffirmation() { System.out.println("I am good enough!"); System.out.println("I am smart enough!"); System.out.println("People like me!"); } Calling a static method (possibly multiple times) printAffirmation(); printAffirmation(); Output I am good enough! I am smart enough! People like me! I am good enough! I am smart enough! People like me!
Methods calling methods One static method can call another (e.g., Code 5-4, p281): public class MethodsExample { public static void main(String[] args) { message1(); message2(); System.out.println("Done with main."); } public static void message1() { System.out.println("This is message1."); } public static void message2() { System.out.println("This is message2."); message1(); System.out.println("Done with message2."); } } Output: This is message1. This is message2. This is message1. Done with message2. Done with main.
When a method is called, the execution "jumps" into that method executes all of the method’s statements "jumps" back to the statement after the method call Control flow of methods
public class MethodsExample { public static void main(String[] args) { message1(); message2(); ... } } Slide 12 (continue) public static void message1() { System.out.println("This is message1."); } public static void message2() { System.out.println("This is message2"); message1(); System.out.println("Done with message2."); } public static void message1() { System.out.println("This is message1."); } Output: This is message1. This is message2. This is message1. Done with message2. Done with main.
Example: Figure drawing ______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+ Write a program to print the figures. Use static methods to capture structure and and eliminate redundancy.
Version 1: Unstructured ______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+ Create an empty program with a skeletal header and main method. Copy the expected output into it, surrounding each line with System.out.println syntax. Run and verify that it produces the correct output.
// Suzy Student, CSC 142, Autumn 2012 // This program prints several assorted figures. // public class Figures1 { public static void main(String[] args) { System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println(); System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println("+--------+"); System.out.println(); System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("| STOP |"); System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println(); System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("+--------+"); } }
Version 2: Structured with redundancy ______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+ Identify the overall structure of the output, and divide the main method into several static methods based on this structure.
______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+ Identify the overall structure of the output, and divide the main method into several static methods based on this structure. The structure of the output: initial "egg" figure second "teacup" figure third "stop sign" figure fourth "hat" figure This structure can be represented by methods: drawEgg drawTeaCup drawStopSign drawHat
// Suzy Student, CSC 142, Autumn 2012 // Prints several assorted figures, with methods for structure. // public class Figures2 { public static void main(String[] args) { drawEgg(); drawTeaCup(); drawStopSign(); drawHat(); } // Draws a figure that vaguely resembles an egg. public static void drawEgg() { System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println(); } // Draws a figure that vaguely resembles a teacup. public static void drawTeaCup() { System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println("+--------+"); System.out.println(); }
// Draws a figure that vaguely resembles a stop sign. public static void drawStopSign() { System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("| STOP |"); System.out.println("\\ /"); System.out.println(" \\______/"); System.out.println(); } // Draws a figure that vaguely resembles a hat. public static void drawHat() { System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); System.out.println("+--------+"); } }
Version 3: Structured without redundancy ______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+ Further divide the program to eliminate all redundancy.
Further divide the program to eliminate all redundancy. The redundancy: top half of egg (purple) bottom half of egg (green) divider line (yellow) This redundancy can be fixed by methods: drawEggTop drawEggBottom drawLine ______ / \ / \ \ / \______/ \ / \______/ +--------+ ______ / \ / \ | STOP | \ / \______/ ______ / \ / \ +--------+
// Suzy Student, CSC 142, Autumn 2012 // Prints several figures, with methods for structure and redundancy. public class Figures3 { public static void main(String[] args) { drawEgg(); drawTeaCup(); drawStopSign(); drawHat(); } // draws redundant part that looks like the top of an egg public static void drawEggTop() { System.out.println(" ______"); System.out.println(" / \\"); System.out.println("/ \\"); } // draws redundant part that looks like the bottom of an egg public static void drawEggBottom() { System.out.println("\\ /"); System.out.println(" \\______/"); }
// Draws a figure that vaguely resembles an egg. public static void drawEgg() { drawEggTop(); drawEggBottom(); System.out.println(); } // Draws a figure that vaguely resembles a teacup. public static void drawTeaCup() { drawEggBottom(); System.out.println("+--------+"); System.out.println(); } // Draws a figure that vaguely resembles a stop sign. public static void drawStopSign() { drawEggTop(); System.out.println("| STOP |"); drawEggBottom(); System.out.println(); } // Draws a figure that vaguely resembles a hat. public static void drawHat() { drawEggTop(); System.out.println("+--------+"); } }
Generalizing Method Consider the task of drawing the following figures: ************* ******* *********************************** ********** * * ********** ***** * * * * ***** The lines and figures are similar, but not exactly the same.
public class Stars { public static void main(String[] args) { drawLineOf13Stars(); drawLineOf7Stars(); drawLineOf35Stars(); draw10x3Box(); draw5x4Box(); } public static void drawLineOf13Stars() { for (int i = 1; i <= 13; i++) { System.out.print("*"); } System.out.println(); } public static void drawLineOf7Stars() { for (int i = 1; i <= 7; i++) { System.out.print("*"); } System.out.println(); } public static void drawLineOf35Stars() { for (int i = 1; i <= 35; i++) { System.out.print("*"); } System.out.println(); } ... Observation: Methods are redundant. Would constants help us solve this problem? Other ideas?
What if we had the following? drawLine - A method to draw a line of any number of stars. drawBox - A method to draw a box of any size. 7 drawLine main ******* 13 drawLine ************* Character of each repetition General format of repetition
Parameterization parameterized method: A method that is given extra information (e.g. number of stars to draw) when it is called. The common part of all calls in a generalization: 1st, 2nd, 3rd, … parameter: A value passed to a method by its caller, mapping the difference of each call. Examples: System.out.println(“*”) or System.out.println(“**”) random.nextInt(10)
Parameterized method declaration syntax: public static void <name> (<type><name>) { <statement(s)>; } The scope of the parameter is the entire method. P286 Example: public static void printSpaces(int count) { for (int i = 1; i <= count; i++) { System.out.print(" "); } } Whenever printSpaces is called, the caller must specify how many spaces to print. count’s scope
passing an argument for parameter: Calling a parameterized method and specifying a value for its parameter(s). P283 Parameterized method call syntax: <name>(<expression>); Example: System.out.print("*"); printSpaces(7); System.out.print("**"); int x = 3 * 5; printSpaces(x + 2); System.out.println("***"); Output: * ** ***
When the parameterized method call executes: the value passed to the method is copied into the parameter variable the method's code executes using that value public static void main(String[] args) { printSpaces(7); printSpaces(13); } public static void printSpaces(int count) { for (int i = 1; i <= count; i++) { System.out.print(" "); } } 7 13 count:
value semantics: When primitive variables (such as int or double) are passed as parameters, their values are copied into the method's parameter variable. P288 (Code 5-6) Modifying the method’s parameter variable will NOT affect the the variable which was passed to the method. ... int x = 23; strange(x); System.out.println("2. x = " + x); // this x unchanged ... } public static void strange(int x) { x = x + 1; // modifies my x System.out.println("1. x = " + x); } Output: 1. x = 24 2. x = 23
ERROR: Not passing a parameter to a method that accepts parameters. printSpaces(); // ERROR: parameter value required ERROR: Passing a parameter of the wrong type. printSpaces(3.7); // ERROR: must be of type int The parameter must satisfy the domain of the method.
Change the Stars program to use parameterized methods. public class Stars { public static void main(String[] args) { drawLineOf13Stars(); drawLineOf7Stars(); drawLineOf35Stars(); draw10x3Box(); draw5x4Box(); } public static void drawLineOf13Stars() { for (int i = 1; i <= 13; i++) { System.out.print("*"); } System.out.println(); } public static void drawLineOf7Stars() { for (int i = 1; i <= 7; i++) { System.out.print("*"); } System.out.println(); } ...
// Prints several lines of stars. // Uses a parameterized method to remove redundancy. public class Stars2 { public static void main(String[] args) { drawLine(13); drawLine(7); drawLine(35); } // Prints the given number of stars plus a line break. public static void drawLine(int count) { for (int i = 1; i <= count; i++) { System.out.print("*"); } System.out.println(); } }
Multiple parameters Methods can accept as many parameters as you like, p286. When the method is called, it must be passed values for each of its parameters. Multiple parameters declaration syntax: public static void <name> (<type><name>, <type><name>, ..., <type><name>) { <statement(s)>; } Multiple parameters call syntax: <name>(<expression>, <expression>, ..., <expression>);
// Prints several lines and boxes made of stars. // Third version with multiple parameterized methods. public class Stars3 { public static void main(String[] args) { drawLine(13); drawLine(7); drawLine(35); System.out.println(); drawBox(10, 3); drawBox(5, 4); drawBox(20, 7); } // Prints the given number of stars plus a line break. public static void drawLine(int count) { for (int i = 1; i <= count; i++) { System.out.print("*"); } System.out.println(); }
// Prints a box of stars of the given size. public static void drawBox(int width, int height) { drawLine(width); for (int i = 1; i <= height - 2; i++) { System.out.print("*"); printSpaces(width - 2); System.out.println("*"); } drawLine(width); } // Prints the given number of spaces. public static void printSpaces(int count) { for (int i = 1; i <= count; i++) { System.out.print(" "); } } }
Exercise public static void main(String[] args) { printNumber(4, 9); printNumber(17, 6); printNumber(8, 0); printNumber(0, 8); } Output: 444444444 171717171717 00000000
public static void main(String[] args) { printNumber(4, 9); printNumber(17, 6); printNumber(8, 0); printNumber(0, 8); } Output: 444444444 171717171717 00000000 public static void printNumber(int number, int count) { for(int i=0; i<count; i++) { System.out.print(number); } System.out.println(); }
Write a method named printDiamond that accepts a height as a parameter and prints a diamond figure. * *** ***** *** * Write a method named multiplicationTable that accepts a maximum integer as a parameter and prints a table of multiplication from 1 x 1 up to that integer times itself.
Rewrite the following program to use parameterized methods: // Draws triangular figures of stars. public class Loops { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i - 1; j++) { System.out.print(" "); } for (int j = 1; j <= 10 - 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } for (int i = 1; i <= 12; i++) { for (int j = 1; j <= i - 1; j++) { System.out.print(" "); } for (int j = 1; j <= 25 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } } }
// Draws triangular figures using parameterized methods. public class Loops { public static void main(String[] args) { triangle(5); triangle(12); } // Draws a triangle figure of the given size. public static void triangle(int height) { for (int i = 1; i <= height; i++) { printSpaces(i - 1); drawLine(2 * height + 1 - 2 * i); } } }
Parameter mystery (value vs. object) • What does this code do? public static void main(String[] args) { int a = 7; int b = 35; System.out.println(a + " " + b); int temp = a; a = b; b = temp; System.out.println(a + " " + b); }
public static void main(String[] args) { int a = 7; int b = 35; System.out.println(a + " " + b); // swap a with b swap(a, b); System.out.println(a + " " + b); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; } • Does this work? Why or why not?
Class type vs. primitive type, P288-292 • When a primitive type of argument is passed for parameter, the value is copied. A method cannot change the value of an argument. • When an object is passed as a parameter, the object is not copied. The same object is referred to by both the original argument and the method's parameter. • If a method is called on the parameter, it will affect the original object that was passed to the method.
Object are reference value like this: Dog balto = new Dog(); Balto.name = “Balto”; name: breed: age: balto: “Balto” ? ? Variable, with slot in memory Reference, a pointer to the object’s data
p • Example: public static void main(String[] args) { Point p1 = new Point(2, 3); move(p1); } public static void move(Point p) { p.setLocation(-1, -2); } 3 x: 2 y: -2 -1 p1
What is the output of the following program? public class Mystery { public static void main(String[] args) { int x = 5, y = 9, z = 2; mystery(z, y, x); System.out.println(x + " " + y + " " + z); mystery(y, x, z); System.out.println(x + " " + y + " " + z); } } public static void mystery(int x, int z, int y) { x++; y = x - z * 2; x = z + 1; System.out.println(x + " " + y + " " + z); } } x: y: z: x: z: y: