• 沒有找到結果。

Flow of Control

N/A
N/A
Protected

Academic year: 2022

Share "Flow of Control"

Copied!
16
0
0

加載中.... (立即查看全文)

全文

(1)

Chapter 3

Flow of Control

Flow of Control Flow of Control

A i t i l fl f t l i J

As in most programming languages, flow of control in Java  refers to its branching and looping mechanisms

• Java has several branching mechanisms:  if-else, if, g and  switch statements

• Java has three types of loop statements:  the while, do- while and for statements

while, and for statements

• Most branching and looping statements are controlled by  Boolean expressions

l i l i h

– A Boolean expression evaluates to either trueor false – The primitive type booleanmay only take the values trueor 

false

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐2

Branching with an if-else Statement Branching with an if-else Statement

A if l t t t h b t t lt ti

• An if-else statement chooses between two alternative  statements based on the value of a Boolean expression

if (Boolean_Expression) Yes_Statement

else

No Statement_

– The Boolean_Expressionmust be enclosed in parentheses – If the Boolean_Expressionis true, then the Yes_Statement

is executed

– If the Boolean_Expressionis false, then the No_Statementis  executed

Compound Statements Compound Statements

E h d

• Each  Yes_Statement and  No_Statement branch of an  if-else can be a made up of a single  statement or many statements

statement or many statements

Compound Statement:  A branch statement that is  made up of a list of statements

made up of a list of statements 

– A compound statement must always be enclosed in a pair  of braces ({ })

of braces ({ })

– A compound statement can be used anywhere that a 

single statement can be used

(2)

Compound Statements Compound Statements

if (myScore > your Score) if (myScore > your Score) {

System.out.println("I win!");

wager = wager + 100;

} else {

System.out.println

("I wish these were golf scores.");

( g );

wager = 0;

}

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐5

Omitting the else Part Omitting the else Part

Th l t b itt d t bt i h t i ft ll d

• The else part may be omitted to obtain what is often called  an if statement

if (Boolean Expression)( _ p ) Action_Statement

– If the Boolean_Expression is true, then the  Action Statementis executed

Action_Statementis executed

– The Action_Statement can be a single or compound statement – Otherwise, nothing happens, and the program goes on to the next 

statement

if (weight > ideal)

calorieIntake = calorieIntake – 500;;

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐6

Nested Statements Nested Statements

• if-else statements and  if statements both  contain smaller statements within them

– For example, single or compound statements

• In fact, any statement at all can be used as a subpart  of an if-else or if statement, including another  if-else or  if statement

– Each level of a nested if-else or if should be indented  further than the previous level

Exception:  multiway if-else statements

Multiway if-else Statements Multiway if-else Statements

Th lti if l t t t i i l l if

• The multiway if-else statement is simply a normal if- else statement that nests another if-else statement at  every else y branch

– It is indented differently from other nested statements

– All of the Boolean_Expressions are aligned with one another,  and their corresponding actions are also aligned with one another and their corresponding actions are also aligned with one another – The Boolean_Expressionsare evaluated in order until one that 

evaluates to trueis found

h f l l

– The final elseis optional

(3)

Multiway if-else Statement Multiway if-else Statement

if (B l E i )

if (Boolean_Expression) Statement_1

else if (Boolean Expression) else if (Boolean_Expression)

Statement_2

.

else if (Boolean_Expression_n) Statement n

. . 

Statement_n else

Statement For All Other Possibilities _ _ _ _

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐9

The switch Statement The switch Statement

• The  switch statement is the only other kind of Java  statement that implements multiway branching

– When a switch statement is evaluated, one of a number  of different branches is executed

– The choice of which branch to execute is determined by a  controlling expression enclosed in parentheses after the  keyword switch

keyword switch

• The controlling expression must evaluate to a char, int, short,  or byte

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐10

The switch Statement The switch Statement

E h b h t t t i it h t t t t t ith th

• Each branch statement in a switch statement starts with the  reserved word case, followed by a constant called a case  label, followed by a colon, and then a sequence of statements , y , q

– Each case label must be of the same type as the controlling expression – Case labels need not be listed in order or span a complete interval, but 

each one may appear only once each one may appear only once

– Each sequence of statements may be followed by a breakstatement  ( break;)

The switch Statement The switch Statement

Th l b ti l b l d d f lt

• There can also be a section labeled default:

– The defaultsection is optional, and is usually last – Even if the case labels cover all possible outcomes in a givenEven if the case labels cover all possible outcomes in a given 

switchstatement,  it is still a good practice to include a default section

• It can be used to output an error message, for exampleIt can be used to output an error message, for example

• When the controlling expression is evaluated, the code for  the case label whose value matches the controlling 

i i d

expression is executed

– If no case label matches, then the only statements executed are  those following the defaultlabel (if there is one)

(4)

The switch Statement The switch Statement

Th it h t t t d h it t

• The switch statement ends when it executes a  break statement, or when the end of the  switch statement is reached

statement is reached

– When the computer executes the statements after a case  label, it continues until a break statement is reached

If h b k i i d h f i

– If the break statement is omitted, then after executing  the code for one case, the computer will go on to execute  the code for the next case

– If the break statement is omitted inadvertently, the  compiler will not issue an error message

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐13

The switch Statement

switch (Controlling_Expression) {

case Case_Label_1:

St t t S 1

Statement_Sequence_1 break;

case Case_Label_2:

Statement Sequence 2 Statement_Sequence_2 break;

case Case Label n:. . . case Case_Label_n:

Statement_Sequence_n break;

default:

default:

Default_Statement Sequence break;

} }

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐14

The Conditional Operator

The conditional operator is a notational variant on certain forms of the

The Conditional Operator

The conditional operator is a notational variant on certain forms of the  if-elsestatement

Also called the ternary operator or arithmetic if – The following examples are equivalent:

– The following examples are equivalent:

if (n1 > n2) max = n1;

else max = n2;

vs.

max = (n1 > n2) ? n1 : n2;

The expression to the right of the assignment operator is a conditional  operator expression

operator expression

– If the Boolean expression is true, then the expression evaluates to the value of  the first expression (n1), otherwise it evaluates to the value of the second  expression (n2)

Boolean Expressions Boolean Expressions

A B l i i i th t i ith t

• A Boolean expression is an expression that is either true or  false

• The simplest Boolean expressions compare the value of two The simplest Boolean expressions compare the value of two  expressions

time < limit

yourScore == myScore

– Note that Java uses two equal signs (==) to perform equality testing:  

A single equal sign (=) is used only for assignmentg q g ( ) y g

– A Boolean expression does not need to be enclosed in parentheses,  unless it is used in an if-elsestatement

(5)

Java Comparison Operators Java Comparison Operators

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐17

Pitfall: Using == with Strings Pitfall:  Using == with Strings

Th lit i t ( ) tl t t t

• The equality comparison operator (==) can correctly test two  values of a primitive type

However when applied to two objects such as objects of the However, when applied to two objects such as objects of the  String class, == tests to see if they are stored in the same  memory location, not whether or not they have the same 

l value

• In order to test two strings to see if they have equal values,  use the method equals or equalsIgnoreCase use the method equals, or equalsIgnoreCase

string1.equals(string2)

string1.equalsIgnoreCase(string2)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐18

Lexicographic and Alphabetical Order Lexicographic and Alphabetical Order

Lexicographic ordering is the same as ASCII ordering and includes letters

Lexicographic ordering is the same as ASCII ordering, and includes letters,  numbers, and other characters

– All uppercase letters are in alphabetic order, and all lowercase letters are in  alphabetic order, but all uppercase letters come before lowercase letters alphabetic order, but all uppercase letters come before lowercase letters – If s1and s2are two variables of type Stringthat have been given String

values, then  s1.compareTo(s2) returns a negative number if s1comes  before s2in lexicographic ordering, returns zero if the two strings are equal,  and returns a positive number ifs2comes befores1

and returns a positive number if s2comes before s1

• When performing an alphabetic comparison of strings (rather than a  lexicographic comparison) that consist of a mix of lowercase and  uppercase letters, use thecompareToIgnoreCasemethod instead uppercase letters, use the compareToIgnoreCasemethod instead

Building Boolean Expressions Building Boolean Expressions

When two Boolean expressions are combined using the "and" (&&)

When two Boolean expressions are combined using the "and" (&&)  operator, the entire expression is true provided both expressions are true

– Otherwise the expression is false

When two Boolean expressions are combined using the "or" (||)

When two Boolean expressions are combined using the  or (||)  operator, the entire expression is true as long as one of the expressions is  true

– The expression is false only if both expressions are falsep y p

• Any Boolean expression can be negated using the !operator

– Place the expression in parentheses and place the !operator in front of it

• Unlike mathematical notation, strings of inequalities must be joined byUnlike mathematical notation, strings of inequalities must be joined by &&&&

– Use (min < result) && (result < max)rather than    min <

result < max

(6)

Evaluating Boolean Expressions Evaluating Boolean Expressions

E th h B l i d t t l b h

• Even though Boolean expressions are used to control branch  and loop statements,  Boolean expressions can exist 

independently as well

– A Boolean variable can be given the value of a Boolean expression by  using an assignment statement

• A Boolean expression can be evaluated in the same way that  an arithmetic expression is evaluated

• The only difference is that arithmetic expressions produce a  number as a result, while Boolean expressions produce either  trueor falseas their result

boolean madeIt = (time < limit) && (limit < max);

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐21

Truth Tables

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐22

Short Circuit and Complete Evaluation Short‐Circuit and Complete Evaluation

J t k h t t h th l ti f th fi t t

• Java can take a shortcut when the evaluation of the first part  of a  Boolean expression produces a result that evaluation of  the second part cannot change

This is called short‐circuit evaluation or lazy evaluation

– For example, when evaluating two Boolean subexpressions joined by 

&&, if the first subexpression evaluates to false, then the entire  expression will evaluate to false, no matter the value of the second  subexpression

– In like manner, when evaluating two Boolean subexpressions joined by 

|| if th fi t b i l t t t th th ti

||, if the first subexpression evaluates to true, then the entire  expression will evaluate to true

Short Circuit and Complete Evaluation Short‐Circuit and Complete Evaluation

Th i h i h i i l i

• There are times when using short‐circuit evaluation can  prevent a runtime error

– In the following example, if the number of kidst e o o g e a p e, t e u be o dsis equal to zero, then s equa to e o, t e the second subexpression will not be evaluated, thus preventing a  divide by zero error

– Note that reversing the order of the subexpressions will not preventNote that reversing the order of the subexpressions will not prevent  this

if ((kids !=0) && ((toys/kids) >=2)) . . .

• Sometimes it is preferable to always evaluate both

• Sometimes it is preferable to always evaluate both  expressions, i.e., request complete evaluation 

– In this case, use the &and |operators instead of &&and ||

(7)

Precedence and Associativity Rules Precedence and Associativity Rules

B l d i h i i d b f ll

• Boolean and arithmetic expressions need not be fully  parenthesized

• If some or all of the parentheses are omitted Java will follow If some or all of the parentheses are omitted, Java will follow  precedence and associativity rules (summarized in the  following table) to determine the order of operations

If one operator occurs higher in the table than another, it has higher  precedence, and is grouped with its operands before the operator of  lower precedence 

If two operators have the same precedence, then associativity rules determine which is grouped first

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐25

Precedence  and  Associativity 

Rules

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐26

Evaluating Expressions Evaluating Expressions

• In general parentheses in an expression help to document the

• In general, parentheses in an expression help to document the  programmer's intent

– Instead of relying on precedence and associativity rules, it is best to include  most parentheses, except where the intended meaning is obvious

most parentheses, except where the intended meaning is obvious

Binding:  The association of operands with their operators

– A fully parenthesized expression accomplishes binding for all the operators in  an expression

Side Effects:  When, in addition to returning a value, an expression  changes something, such as the value of a variable

The assignment, increment, and decrement operators all produce side effects

Rules for Evaluating Expressions Rules for Evaluating Expressions

P f bi di

• Perform binding 

– Determine the equivalent fully parenthesized expression using the  precedence and associativity rules

• Proceeding left to right, evaluate whatever subexpressions  can be immediately evaluated

Th b i ill b d h d

– These subexpressions will be operands or method arguments, e.g.,  numeric constants or variables

• Evaluate each outer operation and method invocation as soon  p

as all of its operands (i.e., arguments) have been evaluated

(8)

Loops Loops

Loops in Java are similar to those in other high‐level  languages

• Java has three types of loop statements:  the while,  the  do-while , and the  for statements

The code that is repeated in a loop is called the body of the  loop

Each repetition of the loop body is called an iteration of  the loop

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐29

while statement while statement

A hil t t t i d t t ti f d (i

• A while statement is used to repeat a portion of code (i.e.,  the loop body) based on the evaluation of a Boolean 

expression p

The Boolean expression is checked before the loop body is executed

• When false, the loop body is not executed at all

Before the execution of each following iteration of the loop body the – Before the execution of each following iteration of the loop body, the 

Boolean expression is checked again

• If true, the loop body is executed again

If f l h l d

• If false, the loop statement ends

– The loop body can consist of a single statement,  or multiple  statements enclosed in a pair of braces ({ })

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐30

while Syntax while Syntax

while (Boolean_Expression) Statement

Or Or

while (Boolean_Expression) {

{

Statement_1 Statement_2 Statement_Last }

. . .

}

do-while Statement do-while Statement

A d hil t t t i d t t ti f d

• A do-while statement is used to execute a portion of code  (i.e., the loop body), and then repeat it based on the 

evaluation of a Boolean expression

– The loop body is executed at least once

The Boolean expression is checked after the loop body is executed – The Boolean expression is checked after each iteration of the loop 

b d body

• If true, the loop body is executed again

• If false, the loop statement ends

D 't f t t t i l ft th B l i

• Don't forget to put a semicolon after the Boolean expression – Like the while statement, the loop body can consist of a single 

statement,  or multiple statements enclosed in a pair of braces ({ })

(9)

do-while Syntax do-while Syntax

do

Statement

while (Boolean Expression); e ( oo ea _ p ess o );

Or do

{ {

Statement_1 Statement_2 _ Statement_Last

} while (Boolean Expression);

. . .

} while (Boolean_Expression);

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐33

Algorithms and Pseudocode Algorithms and Pseudocode

• The hard part of solving a problem with a computer program is not dealing

• The hard part of solving a problem with a computer program is not dealing  with the syntax rules of a programming language

• Rather, coming up with the underlying solution method is the most  difficult part

difficult part

An algorithm is a set of precise instructions that lead to a solutionAn algorithm is normally written in pseudocode, which is a mixture of 

programming language and a human language, like English

p g g g g g g , g

– Pseudocode must be precise and clear enough so that a good programmer can  convert it to syntactically correct code

– However, pseudocode is much less rigid than code:  One needn't worry about 

th fi i t f t d l i i bl f l

the fine points of syntax or declaring variables, for example

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐34

The for Statement The for Statement

Th f t t t i t l d t t th h

• The for statement is most commonly used to step through  an integer variable in equal increments

• It begins with the keyword for, followed by three  g y y

expressions in parentheses that describe what to do with one  or more controlling variables

– The first expression tells how the control variable or variables are p initialized or declared and initialized before the first iterationThe second expression determines when the loop should end, based 

on the evaluation of a Boolean expression before each iteration – The third expression tells how the control variable or variables are 

updated after each iteration of the loop body

The for Statement Syntax The for Statement Syntax

f (I iti li i B l E i U d t )

for (Initializing; Boolean_Expression; Update) Body

• The Body may consist of a single statement or a list of  statements enclosed in a pair of braces ({ })

• Note that the three control expressions are separated by two,  not three, semicolons

• Note that there is no semicolon after the closing parenthesis

• Note that there is no semicolon after the closing parenthesis 

at the beginning of the loop 

(10)

Semantics of the for Statement

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐37

for Statement Syntax and Alternate Semantics for Statement Syntax and Alternate Semantics

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐38

for Statement Syntax and Alternate Semantics

The Comma in for Statements The Comma in for Statements

A f l t i lti l i iti li ti ti

• A for loop can contain multiple initialization actions  separated with commas

– Caution must be used when combining a declaration with multiple  ti

actions

– It is illegal to combine multiple type declarations with multiple actions,  for example

T id ibl bl it i b t t d l ll i bl t id

– To avoid possible problems, it is best to declare all variables outside  the forstatement

• A for loop can contain multiple update actions, separated 

ith l

with commas, also

– It is even possible to eliminate the loop body in this way

• However, a for , loop can contain only one Boolean  p y

expression to test for ending the loop

(11)

Infinite Loops Infinite Loops

• A  whiledo-while , or  for loop should be  designed so that the value tested in the Boolean  expression is changed in a way that eventually expression is changed in a way that eventually  makes it false, and terminates the loop

• If the Boolean expression remains true, then the  If the Boolean expression remains true, then the  loop will run forever, resulting in an  infinite loop

– Loops that check for equality or inequality (== or !=) 

i ll t thi d h ld b

are especially prone to this error and should be  avoided if possible

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐41

Nested Loops Nested Loops

L b t d j t lik th J t t

Loops can be nested, just like other Java structures

– When nested, the inner loop iterates from beginning to end for each  single iteration of the outer loop

int rowNum, columnNum;

for (rowNum = 1; rowNum <=3; rowNum++) {

for (columnNum = 1; columnNum <=2;

columnNum++))

System.out.print(" row " + rowNum +

" column " + columnNum);

System.out.println();

System.out.println();

}

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐42

The break and continue Statements The break and continue Statements

• The break statement consists of the keyword break followed by a semicolon

– When executed, the break, statement ends the nearest  enclosing switch or loop statement

• The continue statement consists of the keyword  continue followed by a semicolon

continue followed by a semicolon

– When executed, the continuestatement ends the current  loop body iteration of the nearest enclosing loop statement – Note that in aNote that in a forforloop, theloop, the continuecontinuestatement transfersstatement transfers 

control to the update expression

• When loop statements are nested, remember that any break or continue statement applies to the innermost break or continue statement applies to the innermost, 

The Labeled break Statement The Labeled break Statement

• There is a type of break statement that, when used in  nested loops, can end any containing loop, not just the  innermost loop

innermost loop

• If an enclosing loop statement is labeled with an  Identifier, then the following version of the break  statement will exit the labeled loop, even if it is not the  innermost enclosing loop:

break someIdentifier;

break someIdentifier;

To label a loop, simply precede it with an Identifier and a 

colon:

(12)

The exit Statement The exit Statement

A b k ill d l i h

• A break statement will end a loop or switch  statement, but will not end the program

Th i ill i di l d h

• The  exit statement will immediately end the  program as soon as it is invoked:

S t it(0)

System.exit(0);

• The exit statement takes one integer argument

B t diti t i d t i di t l

– By tradition, a zero argument is used to indicate a normal  ending of the program

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐45

Loop Bugs Loop Bugs

Th ki d f l

• The two most common kinds of loop errors are  unintended infinite loops and off‐by‐one errors

A ff b i h l t th l b d

– An off‐by‐one error is when a loop repeats the loop body  one too many or one too few times

• This usually results from a carelessly designed Boolean test y y g expression

– Use of == in the controlling Boolean expression can lead to  an infinite loop or an off by one error

an infinite loop or an off‐by‐one error

• This sort of testing works only for characters and integers, and  should never be used for floating‐point

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐46

Tracing Variables Tracing Variables

T i i bl i l t hi i bl

Tracing variables involves watching one or more variables  change value while a program is running

• This can make it easier to discover errors in a program and  p g debug them

Many IDEs (Integrated Development Environments) have a  built‐in utility that allows variables to be traced without built in utility that allows variables to be traced without  making any changes to the program

• Another way to trace variables is to simply insert temporary  output statements in a program

output statements in a program

System.out.println("n = " + n); // Tracing n – When the error is found and corrected, the trace statements can 

i l b t d t

simply be commented out

General Debugging Techniques General Debugging Techniques

• Examine the system as a whole – don’t assume the Examine the system as a whole  don t assume the  bug occurs in one particular place

• Try different test cases and check the input values

• Try different test cases and check the input values

• Comment out blocks of code to narrow down the 

ff di d

offending code

• Check common pitfalls

• Take a break and come back later

• DO NOT make random changes just hoping that the DO NOT make random changes just hoping that the 

change will fix the problem!  

(13)

Debugging Example (1 of 9) Debugging Example (1 of 9)

• The following code is supposed to present a The following code is supposed to present a  menu and get user input until either ‘a’ or ‘b’ 

is entered is entered.

String s = "";

char c = ' ';

Scanner keyboard = new Scanner(System.in);

do {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s.toLowerCase();

c = s.substring(0,1);

}

while ((c != 'a') || (c != 'b'));

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐49

Debugging Example (2 of 9) Debugging Example (2 of 9)

Result: Syntax error:

Result: Syntax error:

c = s.substring(0,1); : incompatible types found: java.lang.String

• Using the “random change” debugging

j g g

required: char

Using the  random change  debugging  technique we might try to change the data  type of c to String to make the types type of c to String, to make the types  match

• This results in more errors since the rest of the  code treats c like a char

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐50

Debugging Example (3 of 9) Debugging Example (3 of 9)

• First problem: substring returns a String, use First problem:  substring returns a String, use  charAt to get the first character:

String s = "";

char c = ' ';

Scanner keyboard = new Scanner(System.in);

do {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s ke boa d ne t() s = keyboard.next();

s.toLowerCase();

c = s.charAt(0);

}

Debugging Example (4 of 9) Debugging Example (4 of 9)

do { {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

System.out.println("String s = " + s);

s toLowerCase();

s.toLowerCase();

System.out.println("Lowercase s = " + s);

c = s.charAt(0);

System.out.println("c = " + c);

} }

while ((c != 'a') || (c != 'b'));

Sample output:

E t 'A' f ti A 'B' f ti B

Enter 'A' for option A or 'B' for option B.

A

String s = A Lowercase s = A

(14)

Debugging Example (5 of 9) Debugging Example (5 of 9)

• The following code is supposed to present a The following code is supposed to present a  menu and get user input until either ‘a’ or ‘b’ 

is entered is entered.

do {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s = s.toLowerCase();

c = s.charAt(0);

}

while ((c != 'a') || (c != 'b'));

However, it’s still stuck in an infinite loop. What to try next?

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐53

Debugging Example (6 of 9) Debugging Example (6 of 9)

• Could try the following “patch” Could try the following  patch

do { {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s = s.toLowerCase();

c = s.charAt(0);

if ( c == 'a') break;

if (c == 'b') break;

}

while ((c != 'a') || (c != 'b'));

Thi k b t it i l ! C id d di t it it d ’t fi th

This works, but it is ugly! Considered a coding atrocity, it doesn’t fix the underlying problem. The boolean condition after the while loop has also become meaningless. Try more tracing:

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐54

Debugging Example (7 of 9) Debugging Example (7 of 9)

do { {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s = s.toLowerCase();

c = s.charAt(0);( );

System.out.println("c != 'a' is " + (c != 'a'));

System.out.println("c != 'b' is " + (c != 'b'));

System.out.println("(c != 'a') || (c != 'b')) is "

+ ((c != 'a') || (c != 'b')));(( ) || ( )));

}

while ((c != 'a') || (c != 'b'));

Sample output:

Sample output:

Enter 'A' for option A or 'B' for option B.

A

c != 'a' is false c != 'b' is true c != b is true

(c != 'a') || (c != 'b')) is true

Debugging Example (8 of 9) Debugging Example (8 of 9)

• Fix: We use && instead of || Fix:  We use && instead of ||

do { {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s = s.toLowerCase();

c = s.charAt(0);

}

while ((c != 'a') && (c != 'b'));

(15)

Debugging Example (9 of 9) Debugging Example (9 of 9)

• Even better:  Declare a boolean variable to control  the do‐while loop.  This makes it clear when the loop  exits if we pick a meaningful variable name. p g

boolean invalidKey;

do { {

System.out.println("Enter 'A' for option A or 'B' for option B.");

s = keyboard.next();

s = s.toLowerCase();

c = s.charAt(0);

c s.charAt(0);

if (c == 'a')

invalidKey = false;

else if (c == 'b') invalidKey = false;

invalidKey false;

else

invalidKey = true;

}

while (invalidKey);

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐57 while (invalidKey);

Assertion Checks Assertion Checks

A i i h ( ) hi b

An assertion is a sentence that says (asserts) something about  the state of a program

– An assertion must be either true or false, and should be true if aAn assertion must be either true or false, and should be true if a  program is working properly

– Assertions can be placed in a program as comments

• Java has a statement that can check if an assertion is true

• Java has a statement that can check if an assertion is true

assert Boolean_Expression;

– If assertion checking is turned on and the g Boolean Expression_ p evaluates to false, the program ends, and outputs an assertion  failed error message

– Otherwise, the program finishes execution normally, p g y

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐58

Assertion Checks Assertion Checks

A th l t i i ti i

• A program or other class containing assertions is  compiled in the usual way

• After compilation a program can run with assertion

• After compilation, a program can run with assertion  checking turned on or turned off

– Normally a program runs with assertion checking turned  y p g g off

• In order to run a program with assertion checking  turned on use the following command (using the turned on, use the following command (using the  actual  ProgramName ):

java –enableassertions ProgramName java enableassertions ProgramName

Preventive Coding Preventive Coding

• Incremental Development

– Write a little bit of code at a time and test it  before moving on

• Code Review

• Code Review

– Have others look at your code

• Pair Programming

– Programming in a team, one typing while the Programming in a team, one typing while the 

(16)

Generating Random Numbers Generating Random Numbers

• The Random class can be used to generate  pseudo‐random numbers

p

– Not truly random, but uniform distribution based  on a mathematical function and good enough in on a mathematical function and good enough in  most cases

• Add the following import

• Add the following import

import java.util.Random;

• Create an object of type Random

R d d R d ()

Random rnd = new Random();

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐61

Generating Random Numbers Generating Random Numbers

• To generate random numbers use the nextInt()  method to get a random number from 0 to n‐1 

int i = rnd.nextInt(10); // Random number from 0 to 9

• Use the nextDouble() method to get a random  () g number from 0 to 1 (always less than 1)

double d = rnd.nextDouble(); // d is >=0 and < 1

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 3‐62

Simulating a Coin Flip

Simulating a Coin Flip

參考文獻

相關文件

We will check techniques to address the difficulty of storing or inverting the Hessian. But before that let’s derive the

By the similar reasoning of pumping lemma, if some non-S variable appears at least twice in a path from root, then the looping part between the two occurrences can be repeated as

Although the vocabularies of recognizable gestures have been expanded during the past decade [8], interactive expressions are still restricted due to the limit of gestures and

(Note that the representation theorem concludes that each one linear transformation can be represented by a unique matrix up to the. considering

In view of the unique continuation property for the linear convection equation with L 2 coefficients in R 2 [13], the assumption of γ ∈ W 1,2 is most likely optimal for the

With the help of the pictures and the words below, write a journal entry about what happened.. Write at least

Choose the one alternative that best completes the statement or answers the question.?. 1) Which of the following is an illustration of the law of

1) A 25.0 mL sample of a solution of a monoprotic acid is titrated with a 0.115 M NaOH solution. The titration curve above was obtained. The titration curve above was obtained.