Method - Temple University

advertisement
Method - CIS 1068
Program Design and Abstraction
Zhen Jiang
CIS Dept.
Temple University
SERC 347, Main Campus
Email: zhen.jiang@temple.edu
3/15/2016
1
Table of Contents










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

3/15/2016
2
Procedural decomposition
using methods
3/15/2016
3

Redundancy in programs
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.");
}
}
3/15/2016
4




This is a space & timing problem: to locate
the redundancy of any part of program
running at any 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!
3/15/2016
5
finclaration,
definition,
body
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.");
}
First time, four print
lines repeated
public static void main(String[] args) {
singChorus();
System.out.println();
singChorus();
}
The second time,
four prints repeated
}
3/15/2016
6


static method: A group of statements
given a name.
To use a static method:
1. define it

Write a group of statements and give it a name.
2. call it

(write down the recipe)
(cook using the recipe)
Tell our program to execute the method.
3/15/2016
7
Method signature
public class FraggleRock {
Method body
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.");
}
Method call, 1st time
public static void main(String[] args) {
singChorus();
System.out.println();
singChorus();
}
Method call, 2nd time
}
3/15/2016
8
Declaring a static method

The syntax for declaring a static method:
public class <class name> {
...
public static void <method name>() {
<statement>;
<statement>;
…
<statement>;
}
}
3/15/2016
9
Calling a static method

The syntax for calling a static method
(cooking using the recipe):
<method name>();
3/15/2016
10

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!
3/15/2016
11
Methods calling methods
Output:

One static method can call another (p310):
public class MethodsExample {
public static void main(String[] args) {
message1();
message2();
System.out.println("Done with main.");
}
This is message1.
This is message2.
This is message1.
Done with message2.
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.");
}
}
3/15/2016
12
Control flow of methods

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
3/15/2016
13
Output:
This is message1.
This is message2.
This is message1.
Done with message2.
Done with main.
public class MethodsExample {
public static void main(String[] args) {
message1();
message2();
...
}
}
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.");
}
3/15/2016
14
Example: Figure
drawing

Write a program to print the figures. Use static
methods to capture structure and and eliminate
redundancy.
______
/
\
/
\
\
/
\______/
\
/
\______/
+--------+
______
/
\
/
|
\
\
STOP |
/
\______/
______
/
\
/
\
+--------+
3/15/2016
15
______
/
\
/
\
\
/
\______/
\
Version 1: Unstructured
/
\______/
+--------+

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.
______
/
\
/
|
\
\
STOP |
/
\______/
______
/
\
/
\
+--------+
3/15/2016
16
// Suzy Student, CSE 142, Autumn 2047
// 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("+--------+");
}
}
3/15/2016
17
______
/
\
/
\
\
/
\______/
\
/
\______/
+--------+
______
/
\
/
|
\
\
STOP |
/
\______/
Version 2: Structured with
redundancy

Identify the overall structure of the output, and
divide the main method into several static
methods based on this structure.
______
/
\
/
\
+--------+
3/15/2016
18
______
/
\
/
\

\
/
Identify the overall structure of the output, and
divide the main method into several static
methods based on this structure.
\______/
\
/
\______/
+--------+
______
/
\
/
|
\
\
STOP |
/
\______/
______
/
\
/
\
+--------+
3/15/2016
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
19
// Suzy Student, CSE 142, Autumn 2047
// 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();
}
3/15/2016
20
// 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("+--------+");
}
}
3/15/2016
21
______
/
\
/
\
\
/
\______/
\
/
\______/
+--------+
______
/
\
/
|
\
\
STOP |
/
\______/
Version 3: Structured without
redundancy

Further divide the program to eliminate all
redundancy.
______
/
\
/
\
+--------+
3/15/2016
22
______
/
\
/
\

\
/
\______/
\
/
\______/
+--------+
______
/
\
/
|
\
\
STOP |
/
\______/
______
/
\
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
/
\
+--------+
3/15/2016
23
// Suzy Student, CSE 142, Autumn 2047
// 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(" \\______/");
}
3/15/2016
24
// 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("+--------+");
}
}
3/15/2016
25
BBBBB
B
B
BBBBB
B
B
BBBBB
AAAA
A
A
AAAAAA
A
A
N
N
NNN N
N NNN
N
N
AAAA
A
A
AAAAAA
A
A
N
N
NNN N
N NNN
N
N
Exercise

Write a program to print the block letters
spelling "banana". Use static methods to
capture structure and and eliminate redundancy.
AAAA
A
A
AAAAAA
A
A
3/15/2016
26
Generalizing Method

Consider the task of drawing the following figures:
*************
*******
***********************************
**********
*
*
**********
*****
*
*
*
*
*****

The lines and figures are similar, but not exactly the same.
3/15/2016
27
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();
}
...
3/15/2016

Observation: Methods are
redundant.


Would constants help us
solve this problem?
Other ideas?
28

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.
main
7
13
drawLine
*******
drawLine
*************
Character of each
repetition
3/15/2016
General format of
repetition
29
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)
3/15/2016
30

Parameterized method declaration syntax:
public static void <name> (<type> <name>) {
<statement(s)>;
}

The scope of the parameter is the entire method. P284

Example:
public static void printSpaces(int count) {
for (int i = 1; i <= count; i++) {
System.out.print(" ");
}
}

count’s scope
Whenever printSpaces is called, the caller must specify how many
spaces to print.
3/15/2016
31

passing an argument for parameter: Calling a parameterized
method and specifying a value for its parameter(s). P291

Parameterized method call syntax:

Example:
<name>(<expression>);
System.out.print("*");
printSpaces(7);
System.out.print("**");
int x = 3 * 5;
printSpaces(x + 2);
System.out.println("***");
Output:
*
3/15/2016
**
***
32

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);
count:
}
13
7
public static void printSpaces(int count) {
for (int i = 1; i <= count; i++) {
System.out.print(" ");
}
}
3/15/2016
33

value semantics: When primitive variables (such as int or double)
are passed as parameters, their values are copied into the method's
parameter variable. P287-291

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);
...
}
public static void strange(int x) {
x = x + 1; // modifies my x
System.out.println("1. x = " + x);
}
3/15/2016
// this x unchanged
Output:
1. x = 24
2. x = 23
34

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.
3/15/2016
35

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();
}
...
3/15/2016
36
// 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();
}
}
3/15/2016
37
Multiple parameters


Methods can accept as many parameters as you like.
 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>);
3/15/2016
38
// 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();
}3/15/2016
39
// 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(" ");
}
}
}
3/15/2016
40
Exercise
public static void main(String[] args) {
printNumber(4, 9);
printNumber(17, 6);
printNumber(8, 0);
printNumber(0, 8);
}
Output:
444444444
171717171717
00000000
3/15/2016
41
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();
}
3/15/2016
42

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.
3/15/2016
43

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();
}
}
}
3/15/2016
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();
}
44
// 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);
}
}
3/15/2016
45
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);
}
3/15/2016
46
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?
3/15/2016
47



Class type vs. primitive type, P345!
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.

3/15/2016
If a method is called on the parameter, it will affect the
original object that was passed to the method.
48

Object are reference value like this:
Dog balto = new Dog();
balto.name = “Balto”;
balto:
Variable,
with slot in
memory
3/15/2016
name: breed:
“Balto
?
”
age:
?
Reference, a
pointer to the
object’s data
49

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);
}
p1
x: -1
2
3
y: -2
p
3/15/2016
50

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);
x:
System.out.println(x + " " + y + " " + z);
mystery(y, x, z);
System.out.println(x + " " + y + " " + z);
}
}
x:
y:
z:
z:
y:
public static void mystery(int x, int z, int y) {
x++;
y = x - z * 2;
x = z + 1;
System.out.println(x + " " + y + " " + z);
}
}
3/15/2016
51


P342-344
ParametersDemo.java and DemoSpecies.java
3/15/2016
52
Return Values (vs. Void)


return: To send a value out as the result of a
method, which can be used in an expression.
A return value is like the opposite of a parameter.



Parameters pass information in from the caller to the
method.
Return values pass information out from a method to its
caller.
How would this be useful?
3/15/2016
53

Java has a class called Math that has several useful static methods
to perform mathematical calculations.
Method name
Description
abs(value)
absolute value
cos(value)
cosine, in radians
log(value)
logarithm base e
log10(value)
logarithm base 10
max(value1, value2)
larger of two values
min(value1, value2)
smaller of two values
pow(base, exponent)
base to the exponent power
random()
random double between 0 and 1
round(value)
nearest whole number
sqrt(value)
square root
3/15/2016
54

Math method call syntax:
Math.<method name>(<parameter(s)>)

Examples:

double squareRoot = Math.sqrt(121.0);
System.out.println(squareRoot);
// 11.0
int absoluteValue = Math.abs(-50);
System.out.println(absoluteValue);
// 50
System.out.println(Math.min(3, 7) + 2);
// 5
Notice that the preceding calls are used in expressions;
they can be printed, stored into a variable, etc…
3/15/2016
55


The Math methods do not print results to the console.
Instead, each method evaluates to produce (or return) a
numeric result, which can be used in an expression.
Math.abs
-42
42
main
2.71
3
3/15/2016
Math.round
56

Evaluate the following expressions:







Math.abs(-1.23)
Math.pow(3, 2)
Math.pow(10, -2)
Math.sqrt(121.0) - Math.sqrt(256.0)
Math.ceil(6.022) + Math.floor(15.9994)
Math.abs(Math.min(-3, -5))
Math.max and Math.min can be used to bound numbers.
Consider an int variable named age.


What statement would replace negative ages with 0?
What statement would cap the maximum age to 40?
3/15/2016
57

Declaring a method that returns a value (p277):
public static <type> <name>(<parameters>) {
<statement(s)>;
}

Returning a value from a method:
return <expression>;

Example:
// Returns the given number cubed (to the third power).
public static int cube(int number) {
return number * number * number;
}
3/15/2016
58

ERROR: Writing statements after a return statement.
public static int increment(int x) {
return (x + 1);
x = x + 1;
// ERROR: statement unreachable!
}

ERROR: Confusing the return variable with a variable in the calling method, AKA
ignoring the return value.
public class ReturnExample {
public static void main(String[] args) {
int x = 1;
addOne(x);
System.out.println("x = " + x);
}
public static int addOne(int x) {
x = x + 1;
return x;
}
}
3/15/2016
59

Write a method called isFactor that accepts two
integers as parameters, and returns true if the first is a
factor of the second.
3/15/2016
60

Methods can return different values under different
conditions:
public static int min(int a, int b) {
if (a > b) {
return b;
} else {
return a;
}
}
public static String message(int place) {
if (place == 1) {
return "You won!";
} else {
return "If you're not first, you're last!";
}
}
3/15/2016
61
public static int min(int a, int b) {
if (a > b) {
return b;
}
}


The compiler will complain about a "missing return
statement". Why?
ERROR: Not returning a value in every path. In the
above example, what if a <= b?
3/15/2016
62
public static int min(int a, int b) {
if (a > b) {
return b;
} else if (a <= b) {
return a;
}
}


It still produces the "missing return statement" error. Why?
 To our eyes, it is clear that all paths (greater, equal, less) do
return a value.
 But the compiler thinks that if/else if code might choose not
to execute any branch, so it refuses to accept this code.
How can we fix it?
3/15/2016
63

Write a program that prompts the user for a maximum
integer and prints out a list of all prime numbers up to that
maximum. Here is an example log of execution:
Maximum number? 50
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
15 total primes
3/15/2016
64
import java.util.*;
public class PrintPrimes {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
printPrimes(getNumber(console));
}
public static int countFactors(int num) {
int count = 0;
for (int i = 1; i <= num; i++) {
if (num % i == 0) {
count++;
}
}
return count;
}
...
3/15/2016
65
public static int getNumber(Scanner console) {
System.out.print("Maximum number? ");
return console.nextInt();
}
public static void printPrimes(int max) {
int numPrimes = 0;
if (max >= 2) {
System.out.print(2);
numPrimes++;
for (int i = 3; i <= max; i++) {
if (countFactors(i) == 2) {
numPrimes++;
System.out.print(", " + i);
}
}
System.out.println();
}
System.out.println(numPrimes + " total primes");
}
}
3/15/2016
66
Summary








Procedure decomposition
Method declaration, p277
Method call & control flow
 Exercises on slide 26
Scope of local variable, p284-285, p290
Figure drawing, sample code, slides 18-25
Parameter and argument, p291
Primitive type (p291) vs. class type (p339-345)
 DemoSpecies on slide 52
Return (vs. void) , p277
3/15/2016
67
Download