SlideShare ist ein Scribd-Unternehmen logo
1 von 120
Downloaden Sie, um offline zu lesen
Dr. Martin Chapman
programming@kcl.ac.uk
martinchapman.co.uk/teaching
Programming Practice and Applications (4CCS1PPA)
Topic 5: Control Flow
Q: Can you think of an example, in real life, when we act differently based on certain conditions? 1
Thursday 20th October
To understand the different (additional) ways in which we
can alter the order in which our program is executed:
• Conditional statements (If statements)
• Iterative statements (Loops)
• Recursion
CONTROL FLOW: OBJECTIVES
2
Conditional Statements
3
Previously, we identified that by keeping the balance field in
our bank account private, we were correctly encapsulating
our code.
• We only allow users to interact with a set interface (e.g.
deposit and withdraw), rather than allowing them to
directly manipulate the internal state of an account
(i.e. the balance).
But this was not enough, and we needed some more syntax
to take full advantage of encapsulation.
REMEMBER: ENCAPSULATION (1)
4
VALIDATING PARAMETERS INSIDE A METHOD
5
public class BankAccount {
private double balance;
public void withdraw(double amount, int pin) {
}
Ensure pin is correct before:
If not, print:
balance = balance - amount;
System.out.println("Ah ah ah, you didn't say the magic word.");
Specifically, we need our program to make a decision, based
upon the pin supplied to the withdraw method, about whether
to proceed with the withdrawal or to reject the withdrawal.
DECISIONS
6
Proceed with
withdrawal
Reject
Supply pin
balance = balance - amount; System.out.println("Ah ah ah
In order to make a decision, we need to ask at least one question
with a yes or a no answer. This answer guides our program down a
distinct branch of execution.
FROM DECISIONS TO QUESTIONS
7
We ask questions because of
some uncertainty, which we
cannot account for when writing
our code. In this case, which pin
will be supplied to objects of our
class.
Is the
supplied pin
1234?
Proceed with
withdrawal
Reject
Supply pin
Yes No
balance = balance - amount; System.out.println("Ah ah ah
For simplicity, we will imagine
that the correct pin to every
account is 1234.
To be even more precise still, we need to phrase our question as
a condition (a state in the program), which is either true or false.
FROM QUESTIONS TO CONDITIONS
8
Pin is 1234.
Proceed with
withdrawal
Reject
Supply pin
True False
balance = balance - amount; System.out.println("Ah ah ah
We make utterances every day containing conditions that
are either true or false:
• It is ok to make students sit for three hours once a
week in order to learn programming. False.
• Academics receive generous salaries. False.
• Martin should be immediately promoted to Professor.
True.
ASIDE: CONDITIONS; MAKING STATEMENTS ABOUT THE WORLD
9
During your investigation of different primitive types
(Topic2-2), you should have experimented with the boolean
type.
The values that can be placed inside variables of a boolean
type are true and false.
Thus, for something to be used as a condition, it must
generate a boolean value when evaluated (e.g. when it is
printed).
There are a number of different ways to generate boolean
values.
GENERATING BOOLEAN VALUES
10
5678
Supply pin
Proceed with
withdrawal
Reject
True False
Pin is 1234.
The first way to generate boolean values is by making
numeric comparisons.
GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (1)
11
5678 == 1234
We call these relational
operators because they allow
us to express conditions as a
relationship between two
entities.
GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (2)
12
public class BooleanValuePrinter {
public static void main(String[] args) {
System.out.println(5678 == 1234);
}
}
5678 == 1234
Java Mathematical Notation Description
> > Greater than
>= ≥ Greater than or equal
< < Less than
<= ≤ Less than or equal
== = Equal
!= ≠ Not equal
There are other relational operators available to us to make
numeric comparisons, and thus generate boolean values.
GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (3)
13
So far we have seen both equals and double equals.
• Equals is used for assignment.
• Double equals is used for comparison.
It’s very common for programmers to mix the two up.
Currently, it’s easy for the compiler to catch this mistake.
ASIDE: EQUALS VS. DOUBLE EQUALS
14
System.out.println(5678 = 1234);
But in other circumstances this mistake may cause unexpected
behaviour.
int fiveSixSevenEight = 5678;
System.out.println(fiveSixSevenEight = 1234);
🤔
It might be helpful to view relational operators as a form of
very simple method, which (typically) takes two numbers as
input, performs a process, and then gives true or false as
output.
RELATIONAL OPERATORS AS METHODS
15
In reality there are specific bytecode instructions for
these operations, and an operand stack.
Open question: Do relational operators only operate on
numbers (or variables containing numbers)?
5678
==
1234
true
false
🖥
In the laboratory, use the template provided by the
BooleanValuePrinter class to experiment with generating
different boolean values from numeric comparisons.
• Try out all the different operators listed on Slide 13.
GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (4)
16Topic5-1
TESTING BOOLEAN VALUES (1)
17
Proceed with
withdrawal
Reject
True False
Pin is 1234.
But of course we don’t just want to generate boolean values from
conditions, we also want to test the resulting value, and thus alter the
execution order of our program depending on the result.
5678
Supply pin
5678 == 1234
if (
)
To do this, we need a
new piece of syntax
called an if statement:
The if statement surrounds
the condition in the same
way as the decision triangle,
determining the execution
order of our code.
balance = balance - amount; System.out.println("Ah ah ah
CONDITIONAL (IF) STATEMENTS (1)
18
{
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
5678 == 1234if ( )
balance = balance - amount;
Pin is 1234.
True
False
Proceed with
withdrawal
Reject
When we write an if statement, sections of our code are executed while other
sections of our code are not, depending on the boolean value generated by a
condition (in this example, this value is always false).
Like calling a method, this contradicts the typical line-by-line execution of a
program.
We can view the braces as being
equivalent to our arrows in the
previous diagram, directing the flow
of execution.
System.out.println("Ah ah ah
We make decisions based upon the boolean value of
conditions every day.
• Condition: It is a hot day today (`day equals hot’)
• If true: Throw on shorts and pink flip-flops.
• If false: Throw on bright yellow jumper.
ASIDE: REAL WORLD CONDITIONAL STATEMENTS
19
🙈
We can now put in place the necessary logic to complement our
encapsulated bank account class.
REMEMBER: ENCAPSULATION (3)
20
public void withdraw(double amount, int ) {
if ( == 1234 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
Because variables contain values, it
makes sense that we can replace values
in conditions (and thus to relational
operators) with variables. This allows us
to test unknown values.
If statements give us yet
more blocks of code in a
program.
Different sections of our code are executed depending on the
values passed to the method.
Once one of the conditional blocks
finishes, the JVM starts to execute
any code below the last block.
1234
1234
0000
0000pin
pin
REMEMBER: INITIAL DEPOSIT (OPTIONAL ELSE CLAUSE)
21
public class BankAccount {
private double balance;
public BankAccount(int initialDeposit) {
balance = initialDeposit;
}
We can also now avoid the issue of users making erroneous
initial deposits.
if ( initialDeposit > 0 ) {
}
As we can see here, the else clause
is optional.
When we don’t use an else statement, we can, if we choose
to, omit the braces from our if statement.
This can produce cleaner code.
ASIDE: OMITTING THE BRACES (1)
22
public class BankAccount {
private double balance;
public BankAccount(int initialDeposit) {
balance = initialDeposit;
}
if ( initialDeposit > 0 )
There are certain issues with omitting the braces from an if
statement:
• Only expression statements (statements that do not contain
variable declarations or control flow statements) can follow a
conditional without braces.
• There is a greater potential for error.
ASIDE: OMITTING THE BRACES (2)
23
I personally quite like this shorthand (lots of people do not), but I use it
carefully.
if ( initialDeposit > 0 )
balance = initialDeposit;
System.out.println("Balance deposited");
This may look like
both statements are
only executed if the
deposit is valid, but
the print statement is
actually always
executed.
Let’s try and apply these ideas in a different context.
Let’s model a book.
As before, let’s ask the question what’s the state
LECTURE EXERCISE: BOOK (1)
24
Behaviour isn’t always exhibited
by an object, it may also be
performed on that object.
• Current page
• Total pages
and behaviour of a book?
• Read a page
• Go back a page
• Read page number
LECTURE EXERCISE: BOOK (2), FIELDS
25
public class Book {
private int currentPage;
private int totalPages;
public Book(int totalPages) {
currentPage = 1;
this.totalPages = totalPages;
}
}
We’ll use a constructor to force a user to supply the total number of
pages (because the logic of our code will rely on this value), and to set
the default value for the current page when the book is first created.
LECTURE EXERCISE: BOOK (3), READ PAGE
26
public void readPage() {
if ( currentPage < totalPages ) {
currentPage = currentPage + 1;
}
}
It makes sense that we can only keep reading pages while there are
pages to read!
LECTURE EXERCISE: BOOK (4), TURN PAGE BACK
27
public void turnPageBack() {
if ( currentPage > 1 ) {
currentPage = currentPage - 1;
}
}
Similarly, it makes sense that we can only turn back as far as the first
page of the book.
LECTURE EXERCISE: BOOK (5), READ PAGE NUMBER
28
public int readPageNumber() {
return currentPage;
}
We add a simple accessor method to determine the current page.
LECTURE EXERCISE: BOOK (6)
29
public class Book {
private int currentPage;
private int totalPages;
public Book(int totalPages) {
currentPage = 1;
this.totalPages = totalPages;
}
public void readPage() {
if ( currentPage < totalPages ) {
currentPage = currentPage + 1;
}
}
public void turnPageBack() {
if ( currentPage > 1 ) {
currentPage = currentPage - 1;
}
}
public int readPageNumber() {
return currentPage;
}
}
LECTURE EXERCISE: BOOK (7), READING A BOOK
30
public class BookReader {
public static void main(String[] args) {
Book aGameOfThrones = new Book(704);
aGameOfThrones.readPage();
aGameOfThrones.readPage();
aGameOfThrones.readPage();
System.out.println(aGameOfThrones.readPageNumber());
aGameOfThrones.turnPageBack();
System.out.println(aGameOfThrones.readPageNumber());
}
}
Our Driver class does not always
have to literally be called driver.
Note how we can also encode some
information about the book using
the object name.
Let’s imagine that we want to secure our account even further,
by asking those withdrawing money to supply two pin numbers
(think two factor authentication), rather than just one.
How would this affect our conditional statement?
BACK TO OUR BANK ACCOUNT: BEEFING UP SECURITY (1)
31
public void withdraw(double amount, int firstPin, int secondPin) {
if ( firstPin == 1234 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
TESTING BOOLEAN VALUES (2)
32
First pin is 1234
Proceed with
withdrawal
Reject
True False
Pin is 1234.
Supply pins
Second pin is
4321
False
True
if (
)
We now have two
conditions, both of
which must
evaluate to true in
order for a
withdrawal to
proceed.
if (
)
We will imagine that the second
correct pin, for every account, is
4321.
firstPin == 1234
secondPin == 4321
We might first naturally try and
consider two separate if
statements.
But instead, because both
conditions lead to the same
outcomes, we should try and
capture them in one if statement.
By the same process as before, we formulate the following
code:
BANK ACCOUNT: BEEFING UP SECURITY (2)
33
public void withdraw(double amount, int firstPin, int secondPin) {
{
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
firstPin == 1234 secondPin == 4321
First pin is 1234
Second pin is
4321
How do we connect these
two conditions?
if ( )
Another way to generate boolean values, and thus construct
conditions, is to combine existing boolean values.
• These values may themselves have been generated by
other conditions (to an arbitrary level of nesting).
This is an idea you should be familiar with from logic.
GENERATING BOOLEAN VALUES (2): OTHER BOOLEAN VALUES (1)
34
GENERATING BOOLEAN VALUES (2): OTHER BOOLEAN VALUES (2)
35
A B A AND B
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE TRUE FALSE
A B A OR B
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
A NOT A
TRUE FALSE
FALSE TRUE
&&
We won’t consider bitwise operations or shifts in this course.
|| !
Conditional operators: Unary operator:
We make decisions based upon the boolean value of
(combined) conditions every day.
• Condition: It is a hot day today OR I love pink.
• If true: Throw on shorts and pink flip-flops.
• If false: Throw on bright yellow jumper.
ASIDE: REAL WORLD COMBINED CONDITIONAL STATEMENTS
36
In the case of our bank account, because we need both of
the pins to be correct, we select a logical and.
CONDITIONAL (IF) STATEMENTS (2)
37
public void withdraw(double amount, int firstPin, int secondPin) {
if ( firstPin == 1234 && secondPin == 4321 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
Here we generate a boolean value on the
left and the right, from separate
conditions, and then combine them into
a subsequent boolean value.
🙈
Again, depending on the values passed to our method,
different sections of our code are executed.
CONDITIONAL (IF) STATEMENTS (3)
38
public void withdraw(double amount, int firstPin, int secondPin) {
if ( firstPin == 1234 && secondPin == 4321 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
1234 4321
1234 4321true true
5678
5678falsetruefalse
🖥
In the laboratory, implement a variable pin system, such
that each account has a different correct pin.
Then, try out different security mechanisms. Here are some
(not strictly logical) ideas:
• Either pin can be correct.
• Only one pin should be correct.
• One pin cannot be equal to a certain value (a
honeypot?).
DIFFERENT SECURITY MECHANISMS
39Topic5-2
ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (1)
40
public class OperatorPrecedence {
public static void main(String[] args) {
System.out.println( 1 + 1 == 2 || 3 - 1 == 3 &&
5 == 5 && 7 > 4 && !false );
}
}
Now that we have the freedom to use different operators in
our program, a natural question to ask is in which order does
Java evaluate the different operators that we have seen so far?
I’ve used multiple lines here for space.
ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (2)
41
1 + 1 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && !false
1 + 1 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && true
2 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && true
2 == 2 || 2 == 3 && 5 == 5 && 7 > 4 && true
2 == 2 || 2 == 3 && 5 == 5 && true && true
Negation (unary):
Addition:
Subtraction (left to right because of equal precedence.):
(Non-equality) Relational Operators:
😴
We’ll update our notion of operator precedence once we’ve
looked at arithmetic in more detail.
ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (3)
42
true || false && true && true && true
true || false
true
Equality:
2 == 2 || 2 == 3 && 5 == 5 && true && true
Logical And:
Logical Or:
😴
ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (4): BRACKETS
43
true || false && false
( true || false ) && false
Like regular mathematics, we can change the order in which
statements are evaluated, and thus the resulting boolean
value, using brackets.
true
false
Always be conscious, in your own code, of the natural
precedence of operators, and whether you need to adjust this
to have a condition evaluated in the correct way.
I tend to use brackets to increase readability, even if the
natural ordering of the operators involved is fine.
• We will hopefully see examples of this going forward.
Let’s return to our book class, and update it slightly.
Let’s remove the obligation to supply a maximum page limit.
• Perhaps the book has no ending (George R.R. Martin…)
This requirement will necessitate two changes:
• The way in which the book object is constructed.
• The way in which we turn a page.
LECTURE EXERCISE: BOOK (8)
44
Remember multiple constructors give us different patterns we can
match when we create an object of a class.
LECTURE EXERCISE: BOOK (9), ADDITIONAL CONSTRUCTOR
45
private int currentPage;
private int totalPages;
public Book(int totalPages) {
currentPage = 1;
this.totalPages = totalPages;
}
public Book() {
currentPage = 1;
totalPages = 0;
}
this(0);
LECTURE EXERCISE: BOOK (10), READ PAGE LOGIC
46
public void readPage() {
if ( totalPages == 0 || currentPage < totalPages ) {
currentPage = currentPage + 1;
}
}
If there’s no maximum page, we can simply permit page turns for as
long as the user wishes.
What if we want to add an additional condition somewhere in our
program, that ensures we are only able to withdraw an amount from
our account if the result of that subtraction isn’t negative.
• In other words, we’re denying our user an overdraft (sounds like
my bank account).
BACK TO BANK ACCOUNT: NO OVERDRAFT (1)
47
public void withdraw(double amount, int firstPin, int secondPin) {
if ( firstPin == 1234 && secondPin == 4321 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
} balance - amount >= 0
We might try and add this condition into our existing if statement, but
then how do we construct an appropriate error message?
• It would confuse the user of our account, if they didn’t realise
the balance restriction, but entered both their pins in correctly.
BACK TO BANK ACCOUNT: NO OVERDRAFT (2)
48
public void withdraw(double amount, int firstPin, int secondPin) {
if ( firstPin == 1234 && secondPin == 4321 && balance - amount >= 0 ) {
balance = balance - amount;
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
}
As there’s no reassignment here, we can
test the result of an arithmetic operation
without affecting the value of the
operands involved.
TESTING BOOLEAN VALUES (3)
49
Our boolean
conditions
must now lead
to different
outcomes.
First pin is 1234
Reject (wrong pin)
Supply pins
Second pin is
4321
False
True
True False
firstPin == 1234
secondPin == 4321
if (
)
TESTING BOOLEAN VALUES (3)
50
Proceed with
withdrawal
Reject (wrong pin)
Second pin is
4321
True False
Balance
minus withdraw
amount is
positive
Reject (insufficient
funds)
False
True
secondPin == 4321
balance - amount >= 0
)
if (
)
Because the funds condition leads
to a different outcome it makes
sense to wrap it in a separate
conditional that occurs only if the
pin conditionals evaluate to true.
NESTED IF STATEMENTS (1)
51
if ( firstPin == 1234 && secondPin == 4321 ) {
if ( balance - amount > 0 ) {
balance = balance - amount;
} else {
System.out.println("Insufficient funds.");
}
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
firstPin == 1234 secondPin == 4321
balance - amount >= 0
Balance
minus withdraw
amount is
positive
First pin is 1234
Second pin is
4321
We then have the option to show
two distinct error messages.
When a conditional can only be evaluated in the event that a previous
conditional has been evaluated (i.e. it appears inside one of the braces of
another conditional), then we call that conditional a nested if statement.
NESTED IF STATEMENTS (2)
52
if ( firstPin == 1234 && secondPin == 4321 ) {
if ( balance - amount > 0 ) {
balance = balance - amount;
} else {
System.out.println("Insufficient funds.");
}
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
firstPin == 1234 secondPin == 4321
balance - amount >= 0
Once we have nested if statements, the dangers of omitting
the braces in a conditional statement become clearer:
ASIDE: OMITTING THE BRACES (3)
53
if ( firstPin == 1234 && secondPin == 4321 )
if ( balance - amount > 0 )
balance = balance - amount;
else
System.out.println("Insufficient funds.");
else
System.out.println("Ah ah ah, you didn't say the magic word.");
This isn’t
particularly
readable.
And if we were to
remove our inner
else, this code
may exhibit
unexpected
behaviour.
Although it isn’t indented, this else is now associated
with the inner (closest) if statement.
Given that we know a nested if is only executed in the presence of a previous
parent if, we could reformat those conditionals with a logical and as nested
ifs.
But, in most cases, this reduces readability and may result in code repetition.
ASIDE: NESTED IFS VS. LOGICAL AND
54
if ( firstPin == 1234 ) {
if ( secondPin == 4321 ) {
…
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
} else {
System.out.println("Ah ah ah, you didn't say the magic word.");
}
Back in our bank account, let’s imagine that we now do permit
those customers with an account the ability to obtain an overdraft,
but want to charge them (a simple form of) interest in doing so.
• If customers don’t go below zero with a withdrawal, they
aren’t charged any interest.
BANK ACCOUNT: PERMITTING AN OVERDRAFT
55
• Otherwise if customers go below £100 they are charged a one
off £20 fee.
• Otherwise if customers go below £200 they are charged a one
off £50 fee.
balance = balance - amount;
balance = balance - ( amount + 20 );
balance = balance - ( amount + 50 );
Note the
brackets
here
🙈
TESTING BOOLEAN VALUES (3)
56
Balance
minus withdraw
amount is
positive
Balance
minus withdraw
amount is less
than 100
Balance
minus withdraw
amount is less
than 200
Proceed with
withdrawal
Proceed with
withdrawal + 20
Proceed with
withdrawal + 50
Reject (insufficient
funds)
True
True
True
False
False
False
How do we approach this problem given the syntax we’ve
seen so far?
• We can’t use operators, because this implies that two
conditions will exist within the same if statement, but
each condition stated previously has a different
outcome.
• We can’t use nested if statements, because none of the
conditions depend on the prior conditions being
fulfilled.
• The most natural thing we can do at this stage is
probably the following:
MODELLING MULTIPLE ALTERNATIVES (1)
57
if ( balance - amount >= 0 ) {
balance = balance - amount;
} else {
System.out.println("Insufficient funds.");
}
if ( balance - amount <= -100 ) {
balance = balance - ( amount + 20 );
}
if ( balance - amount <= -200 ) {
balance = balance - ( amount + 50 );
}
MODELLING MULTIPLE ALTERNATIVES (2)
58
What’s wrong with this?
If someone has a balance
of £0 and withdraws
£200, this withdrawal will
happen twice, and they
will be charged an
additional £20 in fees
(not to mention the
misleading error
message).
We say that separated
conditionals like this
aren’t mutually exclusive.
0 200
0 200
20000-220
-220 200
-220 -220 200-470
THE ELSE IF STATEMENT
59
if ( balance - amount > 0 ) {
balance = balance - amount;
} else if ( balance - amount <= -200 ) {
balance = balance - ( amount + 50 );
} else if ( balance - amount <= -100 ) {
balance = balance - ( amount + 20 );
} else {
System.out.println("Insufficient funds.");
}
In order to have the
mutually exclusivity
we need, we have to
group our
conditionals in a set
of connected blocks
using a new piece of
syntax called an
else if statement.
Only the first block
with a satisfied
conditional will
execute.
Note how
order is
important.
The else block is still optional, but can be used
to specify default behaviour if none of the
conditions above are satisfied.
There is something we
could do to address
the mutual exclusivity
issue here.
We could return from
our method within
each if statement, and
thus not complete any
of the code following
that if statement if it
is satisfied.
Using multiple returns
for control flow is
contentious (more
later).
ASIDE: RETURN FROM VOID METHODS
60
public void withdraw(double amount) {
if ( balance - amount > 0 ) {
balance = balance - amount;
}
if ( balance - amount < -200 ) {
balance = balance - ( amount + 50 );
}
. . .
}
return;
return;
Even if a method is void, we can still
call the return command in order to
exit that method early.
If we want to execute different parts of our code based on
different conditions, we have the following constructs
available to us:
• If-else blocks When we want to test a single condition, or
logically combined conditions, with a distinct true-false
outcome.
• Nested if blocks When we to test a series of conditions,
with potentially different true-false outcomes.
• If-elseif-else blocks When we want to select one outcome
from a set of outcomes, each of which is predicated on an
individual (logically combined) condition.
SUMMARY: CONDITIONAL CONSTRUCTS
61
🤔
We have seen unary and binary operators, but there is also a (potentially
useful) ternary operator available to us, that allows us to express single
line if-else statements.
We could rephrase the following…
ALTERNATIVE CONDITIONAL SYNTAX (1): TERNARY OPERATOR (1)
62
balance = balance - amount >= 0 ? balance - amount : balance;
if ( balance - amount > 0 ) {
balance = balance - amount;
} else {
System.out.println("Insufficient funds.");
}
…as…
We call this the ternary operator.
🤔
ALTERNATIVE CONDITIONAL SYNTAX (1): TERNARY OPERATOR (2)
63
balance = balance - amount >= 0 ? balance - amount : balance;
We must start with an assignment.
We generate a boolean value.
The value to assign if the
boolean value generated is
true.
The value to assign if the
boolean value generated is
false.
We separate each part of the operator with an equals,
a question mark and then a colon, respectively.
`Assign our new balance to be the balance - amount, if the new
balance would be greater than zero, otherwise simply reassign
the same balance.’
🤔
We also have the opportunity to test for the presence of a
wide range of values with a small amount of syntax using a
switch statement.
ALTERNATIVE CONDITIONAL SYNTAX (2): SWITCH STATEMENTS
64
switch (pin) {
case 1234: balance = balance - amount;
break;
. . .
default: balance = balance;
break;
}
We also have the
option to supply a
default outcome, if
none of the
conditions are
matched.
Break
statements give
us the flexibility
to have the
same outcome
for multiple
cases.
Iterative Statements
65
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
Remember my self-centred code?
REMEMBER: CODE REPETITION (1)
66
public class MartinPrinter {
public void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
}
In order to understand what methods give us in practice
(repeatable sections of code), we captured this code in a method.
REMEMBER: CODE REPETITION (2)
67
Remember that methods also provide
us with a separation of functionality,
which we have now seen more examples
of (e.g. deposit and withdraw within a
bank account).
REMEMBER: LABELLING CODE (1)
68
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
`Print Martin’:
Go to `Print Martin’
Go to `Print Martin’
Go to `Print Martin’
But remember we still had to call the method multiple
times, which doesn’t reduce the number of lines we need
significantly:
REMEMBER: LABELLING CODE (2)
69
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
`Print Martin’:
Do the following 3 times:
It would be nice if we could do the following:
Go to `Print Martin’
Remember: Just because the JVM is instructed to move to a different
place in the program, this does not mean it can simply ignore what
it was asked to do previously (in this case, to call Print Martin three
times).
LOOPS
70
public class MartinPrinter {
public void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
}
We can achieve this by adding a loop into our code:
public class Driver {
public static void main(String[] args) {
MartinPrinter martinPrinter = new MartinPrinter();
for ( int index = 0; index < 3; index = index + 1 ) {
martinPrinter.printMartin();
}
}
}
🤓
for ( int index = 0; index < 3; index = index + 1 ) {
martinPrinter.printMartin();
}
Loops allow us to repeat sections of our code.
However, unlike method calls, we can make this repetition
happen automatically, as once we start a loop, we can ensure
that it runs by itself, until it reaches a stopping condition.
To control this automatic execution, we usually declare a
special index variable within the loop itself, which can be
used by the loop to track its own progress.
LOOP INDICES (1)
71
In Computer Science,
we often start counting
from zero.
We have now seen variables used in a number of settings:
• Storing primitive data.
• Storing copies of classes (as objects).
• As parameters in a method.
• Tracking the index of a loop.
ASIDE: THE VARIOUS USES OF VARIABLES
72
THE ANATOMY OF A FOR LOOP
73
A loop statement typically has three distinct sections to it.
Using the information in these sections, we can specify how
many times our loop, and thus the code inside it, should repeat.
for ( int index = 0; index < 3; index = index + 1 ) {
martinPrinter.printMartin();
}
While this boolean condition
(usually related to the
index) is satisfied, the loop
will continue running.
We use this section to
instruct the loop on how
to change the index
variable, and thus
approach its terminating
condition.
We declare our
index variable to
be a specific value
(usually 0).
Because we usually loop for a
certain number of iterations, we
call this a for loop.
The sections of our loop are
separated by semi-colons.
🙈
for ( int index = 0; index < 3; index = index + 1 ) {
martinPrinter.printMartin();
}
LOOP INDICES (2)
74
Index Loop Iteration
0 1
1 2
2 3
3 -
🖥
It’s important to carefully check the upper and lower
bounds when examining loop statements you find.
Slight changes to the the bounds of the loop can change the
number of iterations…
ASIDE: MIND YOUR BOUNDS
75Topic5-3
for ( int index = 0; index <= 3; index = index + 1 ) {
for ( int index = 1; index <= 3; index = index + 1 ) {
…or not…
Draw tables for each of these loops in order to determine
how many times they iterate, and the respective values of
the index variable.
It is so common to perform a single incrementation such as
this, that Java provides us with a shorthand way to express
the same operation in our programs:
ASIDE: PREFIX AND POSTFIX INCREMENT (1)
76
index = index + 1
These increments are actually another type of operator; a
unary operator which acts on a single input.
index++;
We actually have two choices about where we supply the `input’ to
this operator: either before the operator (as we have seen) or after.
We call the former a postfix increment, and the latter and prefix
increment.
If we use a postfix increment, the value of the variable will only be
incremented after the statement in which the postfix increment
appears has been evaluated.
If we use a prefix increment, the value of the variable will be
incremented before the statement in which the prefix increment
appears is evaluated.
ASIDE: PREFIX AND POSTFIX INCREMENT (2)
77
index++; ++index;
However, in a for loop, whether we select a pre or a postfix
increment is unimportant because we don’t use the value
generated by the increment within the increment statement
itself.
ASIDE: PREFIX AND POSTFIX INCREMENT (3)
78
int x = 0, y = 0;
System.out.println(x++);
System.out.println(++y);
It’s easy to confirm this using a simple print statement:
for ( int index = 0; index <= 3; index++ ) {
As is probably clear, it’s not always the case that the index
values in our loops increase, we can, if we choose to, also
instruct our loop to decrease an index value:
ASIDE: DECREMENTING LOOPS
79
for ( int index = 3; index >= 0; index—- ) {
We also have shorthand decrement.
In a similar vein, we have seen a more general form of
incrementation in our bank account example, that adds a
variable amount to an existing value:
ASIDE: ASSIGNMENT OPERATORS
80
balance = balance + amount;
Like the pre and postfix increments seen previously, we can
also shorten this statement to:
balance += amount;
And we have a decrement equivalent:
balance -= amount;
Let’s write a class to complement our BookReadercalled
AutomaticBookRead , which contains a method called
readBook that takes a book as a parameter, and reads a
number of pages from that book, as also specified in a
parameter.
Before each page is read, the program should print the page
we are currently on.
BACK TO BOOKS (1)
81
AutomaticBookReader
readBook
BookReader
BACK TO BOOKS (2)
82
public class AutomaticBookReader {
public void readBook(Book book, int pages) {
for ( int i = 0; i < pages; i++ ) {
System.out.println("On page: " + book.readPageNumber());
book.readPage();
}
}
}
We often shorten the word
index to `i’.
public class BookReader {
public static void main(String[] args) {
Book aGameOfThrones = new Book(704);
AutomaticBookReader automaticBookReader = new
automaticBookReader.readBook(aGameOfThrones, 10);
System.out.println("(Reading manually) on page: " +
}
}
BACK TO BOOKS (3)
83
AutomaticBookReader();
aGameOfThrones.readPageNumber());
Remember the number of pages read (the state) of the book
remains the same after we’ve `sent’ the book to the read book
method, and received it back (Topic 4, Slides 87 - 89).
Can we also use a loop to reduce the number of lines in our
Number Printer example?
REMEMBER: LABELLING CODE (2)
84
System.out.println("+------+");
System.out.println("| |");
System.out.println("+------+");
`Print number’:
<NUM>
Go to `Print number’ set NUM = 1
Go to `Print number’ set NUM = 2
Go to `Print number’ set NUM = 3
We don’t just want to
repeat the call to Print
Number, we also want to
change something on
each loop.
While the index declared within a loop is important for
tracking the progress of said loop, we can also leverage this
index in order to reduce unnecessary repetition while also
using it to make incremental changes inside the loop.
LEVERAGING THE LOOP INDEX (1)
85
LEVERAGING THE LOOP INDEX (2)
86
public class NumberPrinter {
public void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
}
public class Driver {
public static void main(String[] args) {
NumberPrinter numberPrinter = new NumberPrinter();
numberPrinter.printNumber(1);
numberPrinter.printNumber(2);
numberPrinter.printNumber(3);
}
}
LEVERAGING THE LOOP INDEX (3)
87
public class NumberPrinter {
public void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
}
public class Driver {
public static void main(String[] args) {
NumberPrinter numberPrinter = new NumberPrinter();
for ( int i = 1; i < 4; i++ ) {
numberPrinter.printNumber(i);
}
}
}
As the loop index is just a variable
declaration, it can be referenced
inside the loop.
Recall that it is typically the case that variables are only in scope
if they are referenced within the same block, or within a nested
block.
• Consider calling a field from within a method.
The same is true of loop (and indeed if) blocks: declared variables
can only be referenced within that block, or within nested blocks.
ASIDE: LOOP SCOPE
88
for ( int i = 1; i < 4; i++ ) {
System.out.println(i);
}
System.out.println(i);
This code will not
compile due to the
final line.
LEVERAGING THE LOOP INDEX (2): DIFFERENT INCREMENTS
89
public class NumberPrinter {
public void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
}
public class Driver {
public static void main(String[] args) {
NumberPrinter numberPrinter = new NumberPrinter();
for ( int i = 1; i < 4; i += 2 ) {
numberPrinter.printNumber(i);
}
}
}
As is probably clear, we can also
increment the loop as we wish,
and thus have further control
over the index we have
available for use within the loop
itself.
What will this print?
We can actually
write anything in
the final section
of the for loop,
so long as it is an
expression
statement (not
an assignment or
another control
flow statement).
🖥
Given the for loop syntax we’ve seen so far, here are some
simple problems to solve during your lab session:
• Sum the number from 0 to N (Aside: Do we need a loop
for this at all?).
• Print the multiples of 3 up until N.
• Find the first N Fibonacci numbers.
LOOPING WITH AN INDEX
90Topic5-4
Despite everything a loop index give us, sometimes, when
we want code to be repeated, it’s not always clear that
there’s a definitive index driving this repetition.
For example, let’s consider our old friend
________________________ and how it can be used in
conjunction with a loop to create a toy* timer.
LIFE WITHOUT INDICES (1)
91
*A timer you wouldn’t actually use in practice, because there are
much neater and safer ways to control the passage of time in
Java.
System.currentTimeMillis()
🙈
LIFE WITHOUT INDICES (2)
92
public class ToyJavaTimer {
public void oneSecondTimer() {
long start = System.currentTimeMillis();
long end = start + 1000;
System.out.println("Timing...");
System.out.println("End!");
}
}
We store our
start time, and
then use it to
determine an
end time.
for ( int index = 0; index < 3; index = index + 1 ) {
Keep looping while the current time is less
than the end time:
for ( ; System.currentTimeMillis() < end; ) {
Remember a
familiar for
loop…
From our pseudocode,
it should be clear
what our loop
condition is.
for (;System.currentTimeMillis() < end;) {
}
So we could
just omit them!
But unless we initialise our end variable in the
loop declaration, it’s less clear what the
initialisation and increment sections of a
traditional for loop should be replaced with.
? ?
We want to
block our
program from
running.
(This code can be
shortened).
🖥
WACKY FOR LOOPS
93Topic5-5
for (;;) {
printMartin();
}
Like the example seen previously, the for loop syntax is actually fairly
versatile.
So much so, that we can omit all of the contents of a for loop
declaration, leaving only the semi-colons.
In the laboratory, find out what this loop does, and experiment with
omitting other parts of the for loop definition while observing the
effect this has.
for (;System.currentTimeMillis() < end;) {
While this is a legal piece of Java syntax, it isn’t particularly
readable.
• It looks like the programmer has missed something.
For this reason, Java offers us another type of loop designed solely
to cause code to repeat while a certain condition is true.
FOR LOOPS VS. WHILE LOOPS: READABILITY
94
Rather than having three sections to its definition, this loop only
retains one from the for loop: the boolean condition.
while (System.currentTimeMillis() < end) {
for (;System.currentTimeMillis() < end;) {
ASIDE: THE BOOLEAN CONNECTION
95
Is the
current time
before the end
time?
Print `Timing’.
True
False
Print `End!’.
LIFE WITHOUT INDICES (3)
96
public class ToyJavaTimer {
public void oneSecondTimer() {
long start = System.currentTimeMillis();
long end = start + 1000;
while (System.currentTimeMillis() < end) {
System.out.println("Timing...");
}
System.out.println("End!");
}
}
public class Driver {
public static void main(String[] args) {
ToyJavaTimer toyJavaTimer = new ToyJavaTimer();
toyJavaTimer.oneSecondTimer();
}
}
🙈
In this example, we don’t strictly need anything to output within our loop.
So, we could simply end our loop statement with a semi-colon, and omit
the braces entirely.
ASIDE: LOOPS AND BRACES
97
public class ToyJavaTimer {
public void oneMinuteTimer() {
long start = System.currentTimeMillis();
long end = start + 1000;
while (System.currentTimeMillis() < end) {
System.out.println("Timing...");
}
System.out.println("End!");
}
}
public class ToyJavaTimer {
public void oneSecondTimer() {
long start = System.currentTimeMillis();
long end = start + 1000;
while (System.currentTimeMillis() < end);
System.out.println("End!");
}
}
But be careful, I’ve seen lots of bugs
arising from doing this unintentionally.
We cannot do
the same thing
with methods.
For loops and while loops can be semantically equivalent.
FOR LOOPS VS. WHILE LOOPS: SUMMARY (1)
98
for ( int index = 0; index < 3; index++) {
System.out.println(index);
}
int index = 0;
while ( index < 3 ) {
System.out.println(index);
index++;
}
😴
But for the purpose of readability, we typically employ them in
specific scenarios:
• For loops, with an initialisation, a boolean condition, and an
increment, when there are a set number of iterations we wish
to perform.
FOR LOOPS VS. WHILE LOOPS: SUMMARY (2)
99
• While loops, with a single boolean condition, when we do not know
how many iterations our loop will run for; we do not know at what
point the boolean condition will evaluate to false based on
(complex) actions within the loop.
for ( int index = 0; index < 3; index = index + 1 ) {
while (System.currentTimeMillis() < end) {
This is true of our timer with slight variations in the number of times the loop will
repeat within the one second time span, depending on the decisions of the OS.
For practice, let’s rewrite the loop from our
as a while loop.
BACK TO BOOK READING (1)
100
public class AutomaticBookReader {
public void readBook(Book book, int pages) {
for ( int i = 0; i < pages; i++ ) {
System.out.println("On page: " + book.readPageNumber());
book.readPage();
}
}
}
AutomaticBookReader
BACK TO BOOK READING (2)
101
public class AutomaticBookReader {
public void readBook(Book book, int pages) {
int i = 0;
while ( i < pages ) {
i++;
System.out.println("On page: " + book.readPageNumber());
book.readPage();
}
}
}
🖥
In the lab, try the following exercise, which more closely
necessitate the use of a while loop.
• Determine how many times 5 can be subtracted from a
number, N, before that number falls below zero.
And then restructure your previous for loops as while loops:
• Sum the numbers from 0 to N.
• Print the multiples of 3 up until N.
• Find the first N Fibonacci numbers.
LOOPING WITHOUT AN INDEX
102Topic5-6
😴
There are two other loop types available to us, the do while
loop and the advanced for loop but as these loops have
very specific uses we will look at these in Topic 6 and Topic
7, respectively.
SPECIALIST LOOPS: DO WHILE AND THE ADVANCED FOR
103
🤔
When we continue, we skip to the next loop iteration,
updating indices as we do, if they exist.
• We can use this to ignore sections of the code within a
loop under various conditions.
When we break, we terminate our loop early.
ASIDE: CONTENTIOUS CONTROL STRUCTURES: BREAK AND CONTINUE (1)
104
continue; break;
There are two specific ways we can control the flow of
execution within a loop:
🤔
Like the use of multiple returns within a method, both of
these control structures cause controversy because they can
result in poorly designed code.
• They work, but must be used carefully.
• As such, I won’t discuss them in too much detail, but I
want to draw your attention to their existence.
ASIDE: CONTENTIOUS CONTROL STRUCTURES: BREAK AND CONTINUE (2)
105
Special Topic: Recursion
106
🤔
It may have seemed excessive, given our loop syntax, that
we still have the method at all.
Instead, we could just call the code directly an arbitrary
number of times using the appropriate loop:
ASIDE: DROPPING THE PRINT MARTIN METHOD
107
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
Do the following N times:
But then we would lose the ability to call____________ from
other places in our program.
printMartin
printMartin
🤔
This opens up a wider debate about the use of methods and loops
for repeating code.
Methods and loops both enable the same code to be used
multiple times, and to be used in different ways, but they typically
serve different purposes.
• Methods are called multiple times manually by referencing a
label, whereas loops repeat automatically after writing the
loop statement.
• Methods can be referenced at different times throughout a
program, whereas the functionality within a loop is only
referenced by the loop itself while it iterates (remember
scope).
METHODS VS. LOOPS (1)
108
🤔
This opens up a wider debate about the use of methods and
loops for repeating code.
Methods and loops both enable the same code to be used
multiple times, and to be used in different ways, but they
typically serve different purposes.
• Other code can happen between method calls, whereas
the iterations of a loop typically happen in sequence.
• Methods are designed to capture sections of
functionality, so also have a structural purpose.
METHODS VS. LOOPS (2)
109
🤔
But it is true that loops and methods are closely connected
concepts.
Because these are closely connected concepts, we can, in
fact, use methods to create a looping effect in our code.
LOOPING WITH METHODS (1)
110
🤔
Let’s consider a simple for loop.
How can we recreate each element of this loop using a
method?
LOOPING WITH METHODS (2)
111
for ( int i = 0; i <= 10; i ++ ) {
System.out.println(i);
}
🤔
LOOPING WITH METHODS (3): THE ITERATION
112
for ( ) {
}
public void looper() {
looper();
}
In order to
create the
iterative effect
of the loop, we
have to call the
method within
itself.
If unchecked,
this call process
will naturally
run on
indefinitely.
🤔
LOOPING WITH METHODS (4): THE INDEX
113
for ( int i = 0; ) {
}
public void looper(int i) {
looper();
}
}
In order to
declare an
index that will
track the
progress of our
iterations, we
use a
parameter.
🤔
LOOPING WITH METHODS (5): UPDATING THE INDEX
114
for ( int i = 0; ; i ++ ) {
}
public void looper(int i) {
looper(++i);
}
}
Note the prefix
increment here,
otherwise our
loop will run
forever as the
value of i will be
lost in the next
call of the
method.
To update the
index variable,
we call the
method with an
incremented
value on each
iteration.
🤔
LOOPING WITH METHODS (6): THE LOOP CONDITION
115
for ( int i = 0; i <= 10; i ++ ) {
}
public void looper(int i) {
if ( i <= 10 ) {
looper(++i);
}
}
The loop
condition is an
if statement
within the
method,
determining
whether
another call to
the method
itself will take
place.
🤔
LOOPING WITH METHODS (7): THE WORK
116
for ( int i = 0; i <= 10; i ++ ) {
System.out.println(i);
}
public void looper(int i) {
if ( i <= 10 ) {
System.out.println(i);
looper(++i);
}
}
The lines from
inside our loop
typically appear
before the
method is
called again.
Constructing a solution to a problem which involves a
method calling itself is known as a recursive solution.
RECURSION
117
public void looper(int i) {
if ( i <= 10 ) {
System.out.println(i);
looper(++i);
}
}
In a recursive
solution we
typically have a
recursive case
which drives
the iteration…
…and a base
case which
stops the
iteration.
Determining a suitable base and recursive case is an
important task when constructing a recursive solution.
🖥
What happens if we do things after the recursive call?
• Why is this? Hint: remember, any statements we place in our
code will be executed by the JVM, even if the flow of control is
briefly redirected.
• Try this out in the laboratory, if you are interested.
STATEMENTS AFTER A RECURSIVE METHOD CALL
118Topic5-7
public void looper(int i) {
if ( i <= 10 ) {
looper(++i);
System.out.println(i);
}
}
🤐
Recursion can be used to create both powerful and elegant
solutions to problems.
• You will see more of recursion next year in 4CCS1DST.
RECURSION: GOING FORWARD
119
Dr. Martin Chapman
programming@kcl.ac.uk
martinchapman.co.uk/teaching
Programming Practice and Applications (4CCS1PPA)
Topic 5: Control Flow
These slides will be available on KEATS, but will be subject to
ongoing amendments. Therefore, please always download a new
version of these slides when approaching an assessed piece of work,
or when preparing for a written assessment. 120
Thursday 20th October

Weitere ähnliche Inhalte

Was ist angesagt?

Sistemas operativos distribuidos.
Sistemas operativos distribuidos.Sistemas operativos distribuidos.
Sistemas operativos distribuidos.Daniela Velasquez
 
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...Jason Augustine
 
Operating system security
Operating system securityOperating system security
Operating system securitySarmad Makhdoom
 
Paginacin y-segmentacion combinadas
Paginacin y-segmentacion combinadasPaginacin y-segmentacion combinadas
Paginacin y-segmentacion combinadasADOLFO BORJA
 
Booting process by Amar singh
Booting process by Amar singhBooting process by Amar singh
Booting process by Amar singhAmar Singh
 
Computing Environment
Computing EnvironmentComputing Environment
Computing Environmentkem warren
 
Chapter 13 - I/O Systems
Chapter 13 - I/O SystemsChapter 13 - I/O Systems
Chapter 13 - I/O SystemsWayne Jones Jnr
 
Presentacion virtualbox (carlos marti)
Presentacion virtualbox  (carlos marti)Presentacion virtualbox  (carlos marti)
Presentacion virtualbox (carlos marti)Carlos Marti Siso
 
Virtual memory
Virtual memoryVirtual memory
Virtual memoryrapunzel08
 
Introduction To Computer Security
Introduction To Computer SecurityIntroduction To Computer Security
Introduction To Computer SecurityVibrant Event
 
Cloud computing in iot seminar report
Cloud computing in iot seminar reportCloud computing in iot seminar report
Cloud computing in iot seminar reportSKS
 
Windows firewall
Windows firewallWindows firewall
Windows firewallVC Infotech
 

Was ist angesagt? (20)

Sistemas operativos distribuidos.
Sistemas operativos distribuidos.Sistemas operativos distribuidos.
Sistemas operativos distribuidos.
 
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...
RAID - (Redundant Array of Inexpensive Disks or Drives, or Redundant Array of...
 
Operating system security
Operating system securityOperating system security
Operating system security
 
Paginacin y-segmentacion combinadas
Paginacin y-segmentacion combinadasPaginacin y-segmentacion combinadas
Paginacin y-segmentacion combinadas
 
RAID CONCEPT
RAID CONCEPTRAID CONCEPT
RAID CONCEPT
 
Booting process by Amar singh
Booting process by Amar singhBooting process by Amar singh
Booting process by Amar singh
 
Computing Environment
Computing EnvironmentComputing Environment
Computing Environment
 
ethical hacking
ethical hackingethical hacking
ethical hacking
 
Chapter 13 - I/O Systems
Chapter 13 - I/O SystemsChapter 13 - I/O Systems
Chapter 13 - I/O Systems
 
RAID Review
RAID ReviewRAID Review
RAID Review
 
Ch02 System Threats and Risks
Ch02 System Threats and RisksCh02 System Threats and Risks
Ch02 System Threats and Risks
 
Presentacion virtualbox (carlos marti)
Presentacion virtualbox  (carlos marti)Presentacion virtualbox  (carlos marti)
Presentacion virtualbox (carlos marti)
 
File system
File systemFile system
File system
 
Virtual memory
Virtual memoryVirtual memory
Virtual memory
 
Disk formatting
Disk formattingDisk formatting
Disk formatting
 
Architecture of Linux
 Architecture of Linux Architecture of Linux
Architecture of Linux
 
Introduction To Computer Security
Introduction To Computer SecurityIntroduction To Computer Security
Introduction To Computer Security
 
Cloud computing in iot seminar report
Cloud computing in iot seminar reportCloud computing in iot seminar report
Cloud computing in iot seminar report
 
Windows firewall
Windows firewallWindows firewall
Windows firewall
 
Raid
Raid Raid
Raid
 

Ähnlich wie Programming in Java: Control Flow

CS101- Introduction to Computing- Lecture 23
CS101- Introduction to Computing- Lecture 23CS101- Introduction to Computing- Lecture 23
CS101- Introduction to Computing- Lecture 23Bilal Ahmed
 
Java input Scanner
Java input Scanner Java input Scanner
Java input Scanner Huda Alameen
 
Android Application Development - Level 3
Android Application Development - Level 3Android Application Development - Level 3
Android Application Development - Level 3Isham Rashik
 
Chapter 4.2
Chapter 4.2Chapter 4.2
Chapter 4.2sotlsoc
 
chap 2 : Operators and Assignments (scjp/ocjp)
chap 2 : Operators and Assignments (scjp/ocjp)chap 2 : Operators and Assignments (scjp/ocjp)
chap 2 : Operators and Assignments (scjp/ocjp)It Academy
 
Intro To C++ - Class 09 - Control Statements: Part 1
Intro To C++ - Class 09 - Control Statements: Part 1Intro To C++ - Class 09 - Control Statements: Part 1
Intro To C++ - Class 09 - Control Statements: Part 1Blue Elephant Consulting
 
How To Use IO Monads in Scala?
 How To Use IO Monads in Scala? How To Use IO Monads in Scala?
How To Use IO Monads in Scala?Knoldus Inc.
 
Intro To C++ - Class 10 - Control Statements: Part 2
Intro To C++ - Class 10 - Control Statements: Part 2Intro To C++ - Class 10 - Control Statements: Part 2
Intro To C++ - Class 10 - Control Statements: Part 2Blue Elephant Consulting
 
c++ Data Types and Selection
c++ Data Types and Selectionc++ Data Types and Selection
c++ Data Types and SelectionAhmed Nobi
 
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docxransayo
 
Chapter 3:Programming with Java Operators and Strings
Chapter 3:Programming with Java Operators and  StringsChapter 3:Programming with Java Operators and  Strings
Chapter 3:Programming with Java Operators and StringsIt Academy
 
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docx
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docxCourse.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docx
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docxvanesaburnand
 
Higgs Boson Challenge
Higgs Boson ChallengeHiggs Boson Challenge
Higgs Boson ChallengeRaouf KESKES
 
Chapter 3 : Programming with Java Operators and Strings
Chapter 3 : Programming with Java Operators and  StringsChapter 3 : Programming with Java Operators and  Strings
Chapter 3 : Programming with Java Operators and StringsIt Academy
 

Ähnlich wie Programming in Java: Control Flow (20)

Week 4
Week 4Week 4
Week 4
 
18 Jo P June 08
18 Jo P June 0818 Jo P June 08
18 Jo P June 08
 
CS101- Introduction to Computing- Lecture 23
CS101- Introduction to Computing- Lecture 23CS101- Introduction to Computing- Lecture 23
CS101- Introduction to Computing- Lecture 23
 
Java chapter 3
Java chapter 3Java chapter 3
Java chapter 3
 
Java input Scanner
Java input Scanner Java input Scanner
Java input Scanner
 
Android Application Development - Level 3
Android Application Development - Level 3Android Application Development - Level 3
Android Application Development - Level 3
 
Chapter 4.2
Chapter 4.2Chapter 4.2
Chapter 4.2
 
chap 2 : Operators and Assignments (scjp/ocjp)
chap 2 : Operators and Assignments (scjp/ocjp)chap 2 : Operators and Assignments (scjp/ocjp)
chap 2 : Operators and Assignments (scjp/ocjp)
 
Intro To C++ - Class 09 - Control Statements: Part 1
Intro To C++ - Class 09 - Control Statements: Part 1Intro To C++ - Class 09 - Control Statements: Part 1
Intro To C++ - Class 09 - Control Statements: Part 1
 
How To Use IO Monads in Scala?
 How To Use IO Monads in Scala? How To Use IO Monads in Scala?
How To Use IO Monads in Scala?
 
Intro To C++ - Class 10 - Control Statements: Part 2
Intro To C++ - Class 10 - Control Statements: Part 2Intro To C++ - Class 10 - Control Statements: Part 2
Intro To C++ - Class 10 - Control Statements: Part 2
 
c++ Data Types and Selection
c++ Data Types and Selectionc++ Data Types and Selection
c++ Data Types and Selection
 
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx
9 11 25 14 44 6 41 15 57 9 39 16 41 2 58 8 43 12 4.docx
 
00_Introduction to Java.ppt
00_Introduction to Java.ppt00_Introduction to Java.ppt
00_Introduction to Java.ppt
 
Chapter 3:Programming with Java Operators and Strings
Chapter 3:Programming with Java Operators and  StringsChapter 3:Programming with Java Operators and  Strings
Chapter 3:Programming with Java Operators and Strings
 
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docx
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docxCourse.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docx
Course.DS_Store__MACOSXCourse._.DS_StoreCourseassert.docx
 
Higgs Boson Challenge
Higgs Boson ChallengeHiggs Boson Challenge
Higgs Boson Challenge
 
Chapter 3 : Programming with Java Operators and Strings
Chapter 3 : Programming with Java Operators and  StringsChapter 3 : Programming with Java Operators and  Strings
Chapter 3 : Programming with Java Operators and Strings
 
Decision control
Decision controlDecision control
Decision control
 
Chapter 3
Chapter 3Chapter 3
Chapter 3
 

Mehr von Martin Chapman

Principles of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningPrinciples of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningMartin Chapman
 
Principles of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsPrinciples of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsMartin Chapman
 
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Martin Chapman
 
Technical Validation through Automated Testing
Technical Validation through Automated TestingTechnical Validation through Automated Testing
Technical Validation through Automated TestingMartin Chapman
 
Scalable architectures for phenotype libraries
Scalable architectures for phenotype librariesScalable architectures for phenotype libraries
Scalable architectures for phenotype librariesMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Using AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsUsing AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Principles of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwarePrinciples of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwareMartin Chapman
 
Principles of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwarePrinciples of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwareMartin Chapman
 
Principles of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthPrinciples of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthMartin Chapman
 
Principles of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcarePrinciples of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcareMartin Chapman
 
Principles of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsPrinciples of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsMartin Chapman
 
Principles of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgePrinciples of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgeMartin Chapman
 
Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Martin Chapman
 
Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Martin Chapman
 
Principles of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsPrinciples of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Using Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareUsing Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareMartin Chapman
 
Using CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingUsing CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingMartin Chapman
 

Mehr von Martin Chapman (20)

Principles of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningPrinciples of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learning
 
Principles of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsPrinciples of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systems
 
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
 
Technical Validation through Automated Testing
Technical Validation through Automated TestingTechnical Validation through Automated Testing
Technical Validation through Automated Testing
 
Scalable architectures for phenotype libraries
Scalable architectures for phenotype librariesScalable architectures for phenotype libraries
Scalable architectures for phenotype libraries
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Using AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsUsing AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patients
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Principles of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwarePrinciples of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical software
 
Principles of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwarePrinciples of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical software
 
Principles of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthPrinciples of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile health
 
Principles of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcarePrinciples of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcare
 
Principles of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsPrinciples of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systems
 
Principles of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgePrinciples of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledge
 
Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...
 
Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...
 
Principles of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsPrinciples of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systems
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Using Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareUsing Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research Software
 
Using CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingUsing CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotyping
 

Kürzlich hochgeladen

A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajanpragatimahajan3
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...Sapna Thakur
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphThiyagu K
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfsanyamsingh5019
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxheathfieldcps1
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...christianmathematics
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in DelhiRussian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhikauryashika82
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Disha Kariya
 
Class 11th Physics NEET formula sheet pdf
Class 11th Physics NEET formula sheet pdfClass 11th Physics NEET formula sheet pdf
Class 11th Physics NEET formula sheet pdfAyushMahapatra5
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfJayanti Pande
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdfSoniaTolstoy
 
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...PsychoTech Services
 

Kürzlich hochgeladen (20)

A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajan
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdf
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptx
 
Advance Mobile Application Development class 07
Advance Mobile Application Development class 07Advance Mobile Application Development class 07
Advance Mobile Application Development class 07
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
 
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in DelhiRussian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..
 
Class 11th Physics NEET formula sheet pdf
Class 11th Physics NEET formula sheet pdfClass 11th Physics NEET formula sheet pdf
Class 11th Physics NEET formula sheet pdf
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdf
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
 
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 

Programming in Java: Control Flow

  • 1. Dr. Martin Chapman programming@kcl.ac.uk martinchapman.co.uk/teaching Programming Practice and Applications (4CCS1PPA) Topic 5: Control Flow Q: Can you think of an example, in real life, when we act differently based on certain conditions? 1 Thursday 20th October
  • 2. To understand the different (additional) ways in which we can alter the order in which our program is executed: • Conditional statements (If statements) • Iterative statements (Loops) • Recursion CONTROL FLOW: OBJECTIVES 2
  • 4. Previously, we identified that by keeping the balance field in our bank account private, we were correctly encapsulating our code. • We only allow users to interact with a set interface (e.g. deposit and withdraw), rather than allowing them to directly manipulate the internal state of an account (i.e. the balance). But this was not enough, and we needed some more syntax to take full advantage of encapsulation. REMEMBER: ENCAPSULATION (1) 4
  • 5. VALIDATING PARAMETERS INSIDE A METHOD 5 public class BankAccount { private double balance; public void withdraw(double amount, int pin) { } Ensure pin is correct before: If not, print: balance = balance - amount; System.out.println("Ah ah ah, you didn't say the magic word.");
  • 6. Specifically, we need our program to make a decision, based upon the pin supplied to the withdraw method, about whether to proceed with the withdrawal or to reject the withdrawal. DECISIONS 6 Proceed with withdrawal Reject Supply pin balance = balance - amount; System.out.println("Ah ah ah
  • 7. In order to make a decision, we need to ask at least one question with a yes or a no answer. This answer guides our program down a distinct branch of execution. FROM DECISIONS TO QUESTIONS 7 We ask questions because of some uncertainty, which we cannot account for when writing our code. In this case, which pin will be supplied to objects of our class. Is the supplied pin 1234? Proceed with withdrawal Reject Supply pin Yes No balance = balance - amount; System.out.println("Ah ah ah For simplicity, we will imagine that the correct pin to every account is 1234.
  • 8. To be even more precise still, we need to phrase our question as a condition (a state in the program), which is either true or false. FROM QUESTIONS TO CONDITIONS 8 Pin is 1234. Proceed with withdrawal Reject Supply pin True False balance = balance - amount; System.out.println("Ah ah ah
  • 9. We make utterances every day containing conditions that are either true or false: • It is ok to make students sit for three hours once a week in order to learn programming. False. • Academics receive generous salaries. False. • Martin should be immediately promoted to Professor. True. ASIDE: CONDITIONS; MAKING STATEMENTS ABOUT THE WORLD 9
  • 10. During your investigation of different primitive types (Topic2-2), you should have experimented with the boolean type. The values that can be placed inside variables of a boolean type are true and false. Thus, for something to be used as a condition, it must generate a boolean value when evaluated (e.g. when it is printed). There are a number of different ways to generate boolean values. GENERATING BOOLEAN VALUES 10
  • 11. 5678 Supply pin Proceed with withdrawal Reject True False Pin is 1234. The first way to generate boolean values is by making numeric comparisons. GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (1) 11 5678 == 1234 We call these relational operators because they allow us to express conditions as a relationship between two entities.
  • 12. GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (2) 12 public class BooleanValuePrinter { public static void main(String[] args) { System.out.println(5678 == 1234); } } 5678 == 1234
  • 13. Java Mathematical Notation Description > > Greater than >= ≥ Greater than or equal < < Less than <= ≤ Less than or equal == = Equal != ≠ Not equal There are other relational operators available to us to make numeric comparisons, and thus generate boolean values. GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (3) 13
  • 14. So far we have seen both equals and double equals. • Equals is used for assignment. • Double equals is used for comparison. It’s very common for programmers to mix the two up. Currently, it’s easy for the compiler to catch this mistake. ASIDE: EQUALS VS. DOUBLE EQUALS 14 System.out.println(5678 = 1234); But in other circumstances this mistake may cause unexpected behaviour. int fiveSixSevenEight = 5678; System.out.println(fiveSixSevenEight = 1234);
  • 15. 🤔 It might be helpful to view relational operators as a form of very simple method, which (typically) takes two numbers as input, performs a process, and then gives true or false as output. RELATIONAL OPERATORS AS METHODS 15 In reality there are specific bytecode instructions for these operations, and an operand stack. Open question: Do relational operators only operate on numbers (or variables containing numbers)? 5678 == 1234 true false
  • 16. 🖥 In the laboratory, use the template provided by the BooleanValuePrinter class to experiment with generating different boolean values from numeric comparisons. • Try out all the different operators listed on Slide 13. GENERATING BOOLEAN VALUES (1): NUMERIC COMPARISONS (4) 16Topic5-1
  • 17. TESTING BOOLEAN VALUES (1) 17 Proceed with withdrawal Reject True False Pin is 1234. But of course we don’t just want to generate boolean values from conditions, we also want to test the resulting value, and thus alter the execution order of our program depending on the result. 5678 Supply pin 5678 == 1234 if ( ) To do this, we need a new piece of syntax called an if statement: The if statement surrounds the condition in the same way as the decision triangle, determining the execution order of our code. balance = balance - amount; System.out.println("Ah ah ah
  • 18. CONDITIONAL (IF) STATEMENTS (1) 18 { } else { System.out.println("Ah ah ah, you didn't say the magic word."); } 5678 == 1234if ( ) balance = balance - amount; Pin is 1234. True False Proceed with withdrawal Reject When we write an if statement, sections of our code are executed while other sections of our code are not, depending on the boolean value generated by a condition (in this example, this value is always false). Like calling a method, this contradicts the typical line-by-line execution of a program. We can view the braces as being equivalent to our arrows in the previous diagram, directing the flow of execution. System.out.println("Ah ah ah
  • 19. We make decisions based upon the boolean value of conditions every day. • Condition: It is a hot day today (`day equals hot’) • If true: Throw on shorts and pink flip-flops. • If false: Throw on bright yellow jumper. ASIDE: REAL WORLD CONDITIONAL STATEMENTS 19
  • 20. 🙈 We can now put in place the necessary logic to complement our encapsulated bank account class. REMEMBER: ENCAPSULATION (3) 20 public void withdraw(double amount, int ) { if ( == 1234 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } Because variables contain values, it makes sense that we can replace values in conditions (and thus to relational operators) with variables. This allows us to test unknown values. If statements give us yet more blocks of code in a program. Different sections of our code are executed depending on the values passed to the method. Once one of the conditional blocks finishes, the JVM starts to execute any code below the last block. 1234 1234 0000 0000pin pin
  • 21. REMEMBER: INITIAL DEPOSIT (OPTIONAL ELSE CLAUSE) 21 public class BankAccount { private double balance; public BankAccount(int initialDeposit) { balance = initialDeposit; } We can also now avoid the issue of users making erroneous initial deposits. if ( initialDeposit > 0 ) { } As we can see here, the else clause is optional.
  • 22. When we don’t use an else statement, we can, if we choose to, omit the braces from our if statement. This can produce cleaner code. ASIDE: OMITTING THE BRACES (1) 22 public class BankAccount { private double balance; public BankAccount(int initialDeposit) { balance = initialDeposit; } if ( initialDeposit > 0 )
  • 23. There are certain issues with omitting the braces from an if statement: • Only expression statements (statements that do not contain variable declarations or control flow statements) can follow a conditional without braces. • There is a greater potential for error. ASIDE: OMITTING THE BRACES (2) 23 I personally quite like this shorthand (lots of people do not), but I use it carefully. if ( initialDeposit > 0 ) balance = initialDeposit; System.out.println("Balance deposited"); This may look like both statements are only executed if the deposit is valid, but the print statement is actually always executed.
  • 24. Let’s try and apply these ideas in a different context. Let’s model a book. As before, let’s ask the question what’s the state LECTURE EXERCISE: BOOK (1) 24 Behaviour isn’t always exhibited by an object, it may also be performed on that object. • Current page • Total pages and behaviour of a book? • Read a page • Go back a page • Read page number
  • 25. LECTURE EXERCISE: BOOK (2), FIELDS 25 public class Book { private int currentPage; private int totalPages; public Book(int totalPages) { currentPage = 1; this.totalPages = totalPages; } } We’ll use a constructor to force a user to supply the total number of pages (because the logic of our code will rely on this value), and to set the default value for the current page when the book is first created.
  • 26. LECTURE EXERCISE: BOOK (3), READ PAGE 26 public void readPage() { if ( currentPage < totalPages ) { currentPage = currentPage + 1; } } It makes sense that we can only keep reading pages while there are pages to read!
  • 27. LECTURE EXERCISE: BOOK (4), TURN PAGE BACK 27 public void turnPageBack() { if ( currentPage > 1 ) { currentPage = currentPage - 1; } } Similarly, it makes sense that we can only turn back as far as the first page of the book.
  • 28. LECTURE EXERCISE: BOOK (5), READ PAGE NUMBER 28 public int readPageNumber() { return currentPage; } We add a simple accessor method to determine the current page.
  • 29. LECTURE EXERCISE: BOOK (6) 29 public class Book { private int currentPage; private int totalPages; public Book(int totalPages) { currentPage = 1; this.totalPages = totalPages; } public void readPage() { if ( currentPage < totalPages ) { currentPage = currentPage + 1; } } public void turnPageBack() { if ( currentPage > 1 ) { currentPage = currentPage - 1; } } public int readPageNumber() { return currentPage; } }
  • 30. LECTURE EXERCISE: BOOK (7), READING A BOOK 30 public class BookReader { public static void main(String[] args) { Book aGameOfThrones = new Book(704); aGameOfThrones.readPage(); aGameOfThrones.readPage(); aGameOfThrones.readPage(); System.out.println(aGameOfThrones.readPageNumber()); aGameOfThrones.turnPageBack(); System.out.println(aGameOfThrones.readPageNumber()); } } Our Driver class does not always have to literally be called driver. Note how we can also encode some information about the book using the object name.
  • 31. Let’s imagine that we want to secure our account even further, by asking those withdrawing money to supply two pin numbers (think two factor authentication), rather than just one. How would this affect our conditional statement? BACK TO OUR BANK ACCOUNT: BEEFING UP SECURITY (1) 31 public void withdraw(double amount, int firstPin, int secondPin) { if ( firstPin == 1234 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } }
  • 32. TESTING BOOLEAN VALUES (2) 32 First pin is 1234 Proceed with withdrawal Reject True False Pin is 1234. Supply pins Second pin is 4321 False True if ( ) We now have two conditions, both of which must evaluate to true in order for a withdrawal to proceed. if ( ) We will imagine that the second correct pin, for every account, is 4321. firstPin == 1234 secondPin == 4321 We might first naturally try and consider two separate if statements. But instead, because both conditions lead to the same outcomes, we should try and capture them in one if statement.
  • 33. By the same process as before, we formulate the following code: BANK ACCOUNT: BEEFING UP SECURITY (2) 33 public void withdraw(double amount, int firstPin, int secondPin) { { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } firstPin == 1234 secondPin == 4321 First pin is 1234 Second pin is 4321 How do we connect these two conditions? if ( )
  • 34. Another way to generate boolean values, and thus construct conditions, is to combine existing boolean values. • These values may themselves have been generated by other conditions (to an arbitrary level of nesting). This is an idea you should be familiar with from logic. GENERATING BOOLEAN VALUES (2): OTHER BOOLEAN VALUES (1) 34
  • 35. GENERATING BOOLEAN VALUES (2): OTHER BOOLEAN VALUES (2) 35 A B A AND B TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE A B A OR B TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE A NOT A TRUE FALSE FALSE TRUE && We won’t consider bitwise operations or shifts in this course. || ! Conditional operators: Unary operator:
  • 36. We make decisions based upon the boolean value of (combined) conditions every day. • Condition: It is a hot day today OR I love pink. • If true: Throw on shorts and pink flip-flops. • If false: Throw on bright yellow jumper. ASIDE: REAL WORLD COMBINED CONDITIONAL STATEMENTS 36
  • 37. In the case of our bank account, because we need both of the pins to be correct, we select a logical and. CONDITIONAL (IF) STATEMENTS (2) 37 public void withdraw(double amount, int firstPin, int secondPin) { if ( firstPin == 1234 && secondPin == 4321 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } Here we generate a boolean value on the left and the right, from separate conditions, and then combine them into a subsequent boolean value.
  • 38. 🙈 Again, depending on the values passed to our method, different sections of our code are executed. CONDITIONAL (IF) STATEMENTS (3) 38 public void withdraw(double amount, int firstPin, int secondPin) { if ( firstPin == 1234 && secondPin == 4321 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } 1234 4321 1234 4321true true 5678 5678falsetruefalse
  • 39. 🖥 In the laboratory, implement a variable pin system, such that each account has a different correct pin. Then, try out different security mechanisms. Here are some (not strictly logical) ideas: • Either pin can be correct. • Only one pin should be correct. • One pin cannot be equal to a certain value (a honeypot?). DIFFERENT SECURITY MECHANISMS 39Topic5-2
  • 40. ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (1) 40 public class OperatorPrecedence { public static void main(String[] args) { System.out.println( 1 + 1 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && !false ); } } Now that we have the freedom to use different operators in our program, a natural question to ask is in which order does Java evaluate the different operators that we have seen so far? I’ve used multiple lines here for space.
  • 41. ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (2) 41 1 + 1 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && !false 1 + 1 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && true 2 == 2 || 3 - 1 == 3 && 5 == 5 && 7 > 4 && true 2 == 2 || 2 == 3 && 5 == 5 && 7 > 4 && true 2 == 2 || 2 == 3 && 5 == 5 && true && true Negation (unary): Addition: Subtraction (left to right because of equal precedence.): (Non-equality) Relational Operators:
  • 42. 😴 We’ll update our notion of operator precedence once we’ve looked at arithmetic in more detail. ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (3) 42 true || false && true && true && true true || false true Equality: 2 == 2 || 2 == 3 && 5 == 5 && true && true Logical And: Logical Or:
  • 43. 😴 ASIDE: PRECEDENCE WITH MULTIPLE OPERATORS (4): BRACKETS 43 true || false && false ( true || false ) && false Like regular mathematics, we can change the order in which statements are evaluated, and thus the resulting boolean value, using brackets. true false Always be conscious, in your own code, of the natural precedence of operators, and whether you need to adjust this to have a condition evaluated in the correct way. I tend to use brackets to increase readability, even if the natural ordering of the operators involved is fine. • We will hopefully see examples of this going forward.
  • 44. Let’s return to our book class, and update it slightly. Let’s remove the obligation to supply a maximum page limit. • Perhaps the book has no ending (George R.R. Martin…) This requirement will necessitate two changes: • The way in which the book object is constructed. • The way in which we turn a page. LECTURE EXERCISE: BOOK (8) 44
  • 45. Remember multiple constructors give us different patterns we can match when we create an object of a class. LECTURE EXERCISE: BOOK (9), ADDITIONAL CONSTRUCTOR 45 private int currentPage; private int totalPages; public Book(int totalPages) { currentPage = 1; this.totalPages = totalPages; } public Book() { currentPage = 1; totalPages = 0; } this(0);
  • 46. LECTURE EXERCISE: BOOK (10), READ PAGE LOGIC 46 public void readPage() { if ( totalPages == 0 || currentPage < totalPages ) { currentPage = currentPage + 1; } } If there’s no maximum page, we can simply permit page turns for as long as the user wishes.
  • 47. What if we want to add an additional condition somewhere in our program, that ensures we are only able to withdraw an amount from our account if the result of that subtraction isn’t negative. • In other words, we’re denying our user an overdraft (sounds like my bank account). BACK TO BANK ACCOUNT: NO OVERDRAFT (1) 47 public void withdraw(double amount, int firstPin, int secondPin) { if ( firstPin == 1234 && secondPin == 4321 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } balance - amount >= 0
  • 48. We might try and add this condition into our existing if statement, but then how do we construct an appropriate error message? • It would confuse the user of our account, if they didn’t realise the balance restriction, but entered both their pins in correctly. BACK TO BANK ACCOUNT: NO OVERDRAFT (2) 48 public void withdraw(double amount, int firstPin, int secondPin) { if ( firstPin == 1234 && secondPin == 4321 && balance - amount >= 0 ) { balance = balance - amount; } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } As there’s no reassignment here, we can test the result of an arithmetic operation without affecting the value of the operands involved.
  • 49. TESTING BOOLEAN VALUES (3) 49 Our boolean conditions must now lead to different outcomes. First pin is 1234 Reject (wrong pin) Supply pins Second pin is 4321 False True True False firstPin == 1234 secondPin == 4321 if ( )
  • 50. TESTING BOOLEAN VALUES (3) 50 Proceed with withdrawal Reject (wrong pin) Second pin is 4321 True False Balance minus withdraw amount is positive Reject (insufficient funds) False True secondPin == 4321 balance - amount >= 0 ) if ( ) Because the funds condition leads to a different outcome it makes sense to wrap it in a separate conditional that occurs only if the pin conditionals evaluate to true.
  • 51. NESTED IF STATEMENTS (1) 51 if ( firstPin == 1234 && secondPin == 4321 ) { if ( balance - amount > 0 ) { balance = balance - amount; } else { System.out.println("Insufficient funds."); } } else { System.out.println("Ah ah ah, you didn't say the magic word."); } firstPin == 1234 secondPin == 4321 balance - amount >= 0 Balance minus withdraw amount is positive First pin is 1234 Second pin is 4321 We then have the option to show two distinct error messages.
  • 52. When a conditional can only be evaluated in the event that a previous conditional has been evaluated (i.e. it appears inside one of the braces of another conditional), then we call that conditional a nested if statement. NESTED IF STATEMENTS (2) 52 if ( firstPin == 1234 && secondPin == 4321 ) { if ( balance - amount > 0 ) { balance = balance - amount; } else { System.out.println("Insufficient funds."); } } else { System.out.println("Ah ah ah, you didn't say the magic word."); } firstPin == 1234 secondPin == 4321 balance - amount >= 0
  • 53. Once we have nested if statements, the dangers of omitting the braces in a conditional statement become clearer: ASIDE: OMITTING THE BRACES (3) 53 if ( firstPin == 1234 && secondPin == 4321 ) if ( balance - amount > 0 ) balance = balance - amount; else System.out.println("Insufficient funds."); else System.out.println("Ah ah ah, you didn't say the magic word."); This isn’t particularly readable. And if we were to remove our inner else, this code may exhibit unexpected behaviour. Although it isn’t indented, this else is now associated with the inner (closest) if statement.
  • 54. Given that we know a nested if is only executed in the presence of a previous parent if, we could reformat those conditionals with a logical and as nested ifs. But, in most cases, this reduces readability and may result in code repetition. ASIDE: NESTED IFS VS. LOGICAL AND 54 if ( firstPin == 1234 ) { if ( secondPin == 4321 ) { … } else { System.out.println("Ah ah ah, you didn't say the magic word."); } } else { System.out.println("Ah ah ah, you didn't say the magic word."); }
  • 55. Back in our bank account, let’s imagine that we now do permit those customers with an account the ability to obtain an overdraft, but want to charge them (a simple form of) interest in doing so. • If customers don’t go below zero with a withdrawal, they aren’t charged any interest. BANK ACCOUNT: PERMITTING AN OVERDRAFT 55 • Otherwise if customers go below £100 they are charged a one off £20 fee. • Otherwise if customers go below £200 they are charged a one off £50 fee. balance = balance - amount; balance = balance - ( amount + 20 ); balance = balance - ( amount + 50 ); Note the brackets here
  • 56. 🙈 TESTING BOOLEAN VALUES (3) 56 Balance minus withdraw amount is positive Balance minus withdraw amount is less than 100 Balance minus withdraw amount is less than 200 Proceed with withdrawal Proceed with withdrawal + 20 Proceed with withdrawal + 50 Reject (insufficient funds) True True True False False False
  • 57. How do we approach this problem given the syntax we’ve seen so far? • We can’t use operators, because this implies that two conditions will exist within the same if statement, but each condition stated previously has a different outcome. • We can’t use nested if statements, because none of the conditions depend on the prior conditions being fulfilled. • The most natural thing we can do at this stage is probably the following: MODELLING MULTIPLE ALTERNATIVES (1) 57
  • 58. if ( balance - amount >= 0 ) { balance = balance - amount; } else { System.out.println("Insufficient funds."); } if ( balance - amount <= -100 ) { balance = balance - ( amount + 20 ); } if ( balance - amount <= -200 ) { balance = balance - ( amount + 50 ); } MODELLING MULTIPLE ALTERNATIVES (2) 58 What’s wrong with this? If someone has a balance of £0 and withdraws £200, this withdrawal will happen twice, and they will be charged an additional £20 in fees (not to mention the misleading error message). We say that separated conditionals like this aren’t mutually exclusive. 0 200 0 200 20000-220 -220 200 -220 -220 200-470
  • 59. THE ELSE IF STATEMENT 59 if ( balance - amount > 0 ) { balance = balance - amount; } else if ( balance - amount <= -200 ) { balance = balance - ( amount + 50 ); } else if ( balance - amount <= -100 ) { balance = balance - ( amount + 20 ); } else { System.out.println("Insufficient funds."); } In order to have the mutually exclusivity we need, we have to group our conditionals in a set of connected blocks using a new piece of syntax called an else if statement. Only the first block with a satisfied conditional will execute. Note how order is important. The else block is still optional, but can be used to specify default behaviour if none of the conditions above are satisfied.
  • 60. There is something we could do to address the mutual exclusivity issue here. We could return from our method within each if statement, and thus not complete any of the code following that if statement if it is satisfied. Using multiple returns for control flow is contentious (more later). ASIDE: RETURN FROM VOID METHODS 60 public void withdraw(double amount) { if ( balance - amount > 0 ) { balance = balance - amount; } if ( balance - amount < -200 ) { balance = balance - ( amount + 50 ); } . . . } return; return; Even if a method is void, we can still call the return command in order to exit that method early.
  • 61. If we want to execute different parts of our code based on different conditions, we have the following constructs available to us: • If-else blocks When we want to test a single condition, or logically combined conditions, with a distinct true-false outcome. • Nested if blocks When we to test a series of conditions, with potentially different true-false outcomes. • If-elseif-else blocks When we want to select one outcome from a set of outcomes, each of which is predicated on an individual (logically combined) condition. SUMMARY: CONDITIONAL CONSTRUCTS 61
  • 62. 🤔 We have seen unary and binary operators, but there is also a (potentially useful) ternary operator available to us, that allows us to express single line if-else statements. We could rephrase the following… ALTERNATIVE CONDITIONAL SYNTAX (1): TERNARY OPERATOR (1) 62 balance = balance - amount >= 0 ? balance - amount : balance; if ( balance - amount > 0 ) { balance = balance - amount; } else { System.out.println("Insufficient funds."); } …as… We call this the ternary operator.
  • 63. 🤔 ALTERNATIVE CONDITIONAL SYNTAX (1): TERNARY OPERATOR (2) 63 balance = balance - amount >= 0 ? balance - amount : balance; We must start with an assignment. We generate a boolean value. The value to assign if the boolean value generated is true. The value to assign if the boolean value generated is false. We separate each part of the operator with an equals, a question mark and then a colon, respectively. `Assign our new balance to be the balance - amount, if the new balance would be greater than zero, otherwise simply reassign the same balance.’
  • 64. 🤔 We also have the opportunity to test for the presence of a wide range of values with a small amount of syntax using a switch statement. ALTERNATIVE CONDITIONAL SYNTAX (2): SWITCH STATEMENTS 64 switch (pin) { case 1234: balance = balance - amount; break; . . . default: balance = balance; break; } We also have the option to supply a default outcome, if none of the conditions are matched. Break statements give us the flexibility to have the same outcome for multiple cases.
  • 66. ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- Remember my self-centred code? REMEMBER: CODE REPETITION (1) 66
  • 67. public class MartinPrinter { public void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } } In order to understand what methods give us in practice (repeatable sections of code), we captured this code in a method. REMEMBER: CODE REPETITION (2) 67 Remember that methods also provide us with a separation of functionality, which we have now seen more examples of (e.g. deposit and withdraw within a bank account).
  • 68. REMEMBER: LABELLING CODE (1) 68 System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); `Print Martin’: Go to `Print Martin’ Go to `Print Martin’ Go to `Print Martin’ But remember we still had to call the method multiple times, which doesn’t reduce the number of lines we need significantly:
  • 69. REMEMBER: LABELLING CODE (2) 69 System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); `Print Martin’: Do the following 3 times: It would be nice if we could do the following: Go to `Print Martin’ Remember: Just because the JVM is instructed to move to a different place in the program, this does not mean it can simply ignore what it was asked to do previously (in this case, to call Print Martin three times).
  • 70. LOOPS 70 public class MartinPrinter { public void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } } We can achieve this by adding a loop into our code: public class Driver { public static void main(String[] args) { MartinPrinter martinPrinter = new MartinPrinter(); for ( int index = 0; index < 3; index = index + 1 ) { martinPrinter.printMartin(); } } }
  • 71. 🤓 for ( int index = 0; index < 3; index = index + 1 ) { martinPrinter.printMartin(); } Loops allow us to repeat sections of our code. However, unlike method calls, we can make this repetition happen automatically, as once we start a loop, we can ensure that it runs by itself, until it reaches a stopping condition. To control this automatic execution, we usually declare a special index variable within the loop itself, which can be used by the loop to track its own progress. LOOP INDICES (1) 71 In Computer Science, we often start counting from zero.
  • 72. We have now seen variables used in a number of settings: • Storing primitive data. • Storing copies of classes (as objects). • As parameters in a method. • Tracking the index of a loop. ASIDE: THE VARIOUS USES OF VARIABLES 72
  • 73. THE ANATOMY OF A FOR LOOP 73 A loop statement typically has three distinct sections to it. Using the information in these sections, we can specify how many times our loop, and thus the code inside it, should repeat. for ( int index = 0; index < 3; index = index + 1 ) { martinPrinter.printMartin(); } While this boolean condition (usually related to the index) is satisfied, the loop will continue running. We use this section to instruct the loop on how to change the index variable, and thus approach its terminating condition. We declare our index variable to be a specific value (usually 0). Because we usually loop for a certain number of iterations, we call this a for loop. The sections of our loop are separated by semi-colons.
  • 74. 🙈 for ( int index = 0; index < 3; index = index + 1 ) { martinPrinter.printMartin(); } LOOP INDICES (2) 74 Index Loop Iteration 0 1 1 2 2 3 3 -
  • 75. 🖥 It’s important to carefully check the upper and lower bounds when examining loop statements you find. Slight changes to the the bounds of the loop can change the number of iterations… ASIDE: MIND YOUR BOUNDS 75Topic5-3 for ( int index = 0; index <= 3; index = index + 1 ) { for ( int index = 1; index <= 3; index = index + 1 ) { …or not… Draw tables for each of these loops in order to determine how many times they iterate, and the respective values of the index variable.
  • 76. It is so common to perform a single incrementation such as this, that Java provides us with a shorthand way to express the same operation in our programs: ASIDE: PREFIX AND POSTFIX INCREMENT (1) 76 index = index + 1 These increments are actually another type of operator; a unary operator which acts on a single input. index++;
  • 77. We actually have two choices about where we supply the `input’ to this operator: either before the operator (as we have seen) or after. We call the former a postfix increment, and the latter and prefix increment. If we use a postfix increment, the value of the variable will only be incremented after the statement in which the postfix increment appears has been evaluated. If we use a prefix increment, the value of the variable will be incremented before the statement in which the prefix increment appears is evaluated. ASIDE: PREFIX AND POSTFIX INCREMENT (2) 77 index++; ++index;
  • 78. However, in a for loop, whether we select a pre or a postfix increment is unimportant because we don’t use the value generated by the increment within the increment statement itself. ASIDE: PREFIX AND POSTFIX INCREMENT (3) 78 int x = 0, y = 0; System.out.println(x++); System.out.println(++y); It’s easy to confirm this using a simple print statement: for ( int index = 0; index <= 3; index++ ) {
  • 79. As is probably clear, it’s not always the case that the index values in our loops increase, we can, if we choose to, also instruct our loop to decrease an index value: ASIDE: DECREMENTING LOOPS 79 for ( int index = 3; index >= 0; index—- ) { We also have shorthand decrement.
  • 80. In a similar vein, we have seen a more general form of incrementation in our bank account example, that adds a variable amount to an existing value: ASIDE: ASSIGNMENT OPERATORS 80 balance = balance + amount; Like the pre and postfix increments seen previously, we can also shorten this statement to: balance += amount; And we have a decrement equivalent: balance -= amount;
  • 81. Let’s write a class to complement our BookReadercalled AutomaticBookRead , which contains a method called readBook that takes a book as a parameter, and reads a number of pages from that book, as also specified in a parameter. Before each page is read, the program should print the page we are currently on. BACK TO BOOKS (1) 81 AutomaticBookReader readBook BookReader
  • 82. BACK TO BOOKS (2) 82 public class AutomaticBookReader { public void readBook(Book book, int pages) { for ( int i = 0; i < pages; i++ ) { System.out.println("On page: " + book.readPageNumber()); book.readPage(); } } } We often shorten the word index to `i’.
  • 83. public class BookReader { public static void main(String[] args) { Book aGameOfThrones = new Book(704); AutomaticBookReader automaticBookReader = new automaticBookReader.readBook(aGameOfThrones, 10); System.out.println("(Reading manually) on page: " + } } BACK TO BOOKS (3) 83 AutomaticBookReader(); aGameOfThrones.readPageNumber()); Remember the number of pages read (the state) of the book remains the same after we’ve `sent’ the book to the read book method, and received it back (Topic 4, Slides 87 - 89).
  • 84. Can we also use a loop to reduce the number of lines in our Number Printer example? REMEMBER: LABELLING CODE (2) 84 System.out.println("+------+"); System.out.println("| |"); System.out.println("+------+"); `Print number’: <NUM> Go to `Print number’ set NUM = 1 Go to `Print number’ set NUM = 2 Go to `Print number’ set NUM = 3 We don’t just want to repeat the call to Print Number, we also want to change something on each loop.
  • 85. While the index declared within a loop is important for tracking the progress of said loop, we can also leverage this index in order to reduce unnecessary repetition while also using it to make incremental changes inside the loop. LEVERAGING THE LOOP INDEX (1) 85
  • 86. LEVERAGING THE LOOP INDEX (2) 86 public class NumberPrinter { public void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } } public class Driver { public static void main(String[] args) { NumberPrinter numberPrinter = new NumberPrinter(); numberPrinter.printNumber(1); numberPrinter.printNumber(2); numberPrinter.printNumber(3); } }
  • 87. LEVERAGING THE LOOP INDEX (3) 87 public class NumberPrinter { public void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } } public class Driver { public static void main(String[] args) { NumberPrinter numberPrinter = new NumberPrinter(); for ( int i = 1; i < 4; i++ ) { numberPrinter.printNumber(i); } } } As the loop index is just a variable declaration, it can be referenced inside the loop.
  • 88. Recall that it is typically the case that variables are only in scope if they are referenced within the same block, or within a nested block. • Consider calling a field from within a method. The same is true of loop (and indeed if) blocks: declared variables can only be referenced within that block, or within nested blocks. ASIDE: LOOP SCOPE 88 for ( int i = 1; i < 4; i++ ) { System.out.println(i); } System.out.println(i); This code will not compile due to the final line.
  • 89. LEVERAGING THE LOOP INDEX (2): DIFFERENT INCREMENTS 89 public class NumberPrinter { public void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } } public class Driver { public static void main(String[] args) { NumberPrinter numberPrinter = new NumberPrinter(); for ( int i = 1; i < 4; i += 2 ) { numberPrinter.printNumber(i); } } } As is probably clear, we can also increment the loop as we wish, and thus have further control over the index we have available for use within the loop itself. What will this print? We can actually write anything in the final section of the for loop, so long as it is an expression statement (not an assignment or another control flow statement).
  • 90. 🖥 Given the for loop syntax we’ve seen so far, here are some simple problems to solve during your lab session: • Sum the number from 0 to N (Aside: Do we need a loop for this at all?). • Print the multiples of 3 up until N. • Find the first N Fibonacci numbers. LOOPING WITH AN INDEX 90Topic5-4
  • 91. Despite everything a loop index give us, sometimes, when we want code to be repeated, it’s not always clear that there’s a definitive index driving this repetition. For example, let’s consider our old friend ________________________ and how it can be used in conjunction with a loop to create a toy* timer. LIFE WITHOUT INDICES (1) 91 *A timer you wouldn’t actually use in practice, because there are much neater and safer ways to control the passage of time in Java. System.currentTimeMillis()
  • 92. 🙈 LIFE WITHOUT INDICES (2) 92 public class ToyJavaTimer { public void oneSecondTimer() { long start = System.currentTimeMillis(); long end = start + 1000; System.out.println("Timing..."); System.out.println("End!"); } } We store our start time, and then use it to determine an end time. for ( int index = 0; index < 3; index = index + 1 ) { Keep looping while the current time is less than the end time: for ( ; System.currentTimeMillis() < end; ) { Remember a familiar for loop… From our pseudocode, it should be clear what our loop condition is. for (;System.currentTimeMillis() < end;) { } So we could just omit them! But unless we initialise our end variable in the loop declaration, it’s less clear what the initialisation and increment sections of a traditional for loop should be replaced with. ? ? We want to block our program from running. (This code can be shortened).
  • 93. 🖥 WACKY FOR LOOPS 93Topic5-5 for (;;) { printMartin(); } Like the example seen previously, the for loop syntax is actually fairly versatile. So much so, that we can omit all of the contents of a for loop declaration, leaving only the semi-colons. In the laboratory, find out what this loop does, and experiment with omitting other parts of the for loop definition while observing the effect this has. for (;System.currentTimeMillis() < end;) {
  • 94. While this is a legal piece of Java syntax, it isn’t particularly readable. • It looks like the programmer has missed something. For this reason, Java offers us another type of loop designed solely to cause code to repeat while a certain condition is true. FOR LOOPS VS. WHILE LOOPS: READABILITY 94 Rather than having three sections to its definition, this loop only retains one from the for loop: the boolean condition. while (System.currentTimeMillis() < end) { for (;System.currentTimeMillis() < end;) {
  • 95. ASIDE: THE BOOLEAN CONNECTION 95 Is the current time before the end time? Print `Timing’. True False Print `End!’.
  • 96. LIFE WITHOUT INDICES (3) 96 public class ToyJavaTimer { public void oneSecondTimer() { long start = System.currentTimeMillis(); long end = start + 1000; while (System.currentTimeMillis() < end) { System.out.println("Timing..."); } System.out.println("End!"); } } public class Driver { public static void main(String[] args) { ToyJavaTimer toyJavaTimer = new ToyJavaTimer(); toyJavaTimer.oneSecondTimer(); } }
  • 97. 🙈 In this example, we don’t strictly need anything to output within our loop. So, we could simply end our loop statement with a semi-colon, and omit the braces entirely. ASIDE: LOOPS AND BRACES 97 public class ToyJavaTimer { public void oneMinuteTimer() { long start = System.currentTimeMillis(); long end = start + 1000; while (System.currentTimeMillis() < end) { System.out.println("Timing..."); } System.out.println("End!"); } } public class ToyJavaTimer { public void oneSecondTimer() { long start = System.currentTimeMillis(); long end = start + 1000; while (System.currentTimeMillis() < end); System.out.println("End!"); } } But be careful, I’ve seen lots of bugs arising from doing this unintentionally. We cannot do the same thing with methods.
  • 98. For loops and while loops can be semantically equivalent. FOR LOOPS VS. WHILE LOOPS: SUMMARY (1) 98 for ( int index = 0; index < 3; index++) { System.out.println(index); } int index = 0; while ( index < 3 ) { System.out.println(index); index++; }
  • 99. 😴 But for the purpose of readability, we typically employ them in specific scenarios: • For loops, with an initialisation, a boolean condition, and an increment, when there are a set number of iterations we wish to perform. FOR LOOPS VS. WHILE LOOPS: SUMMARY (2) 99 • While loops, with a single boolean condition, when we do not know how many iterations our loop will run for; we do not know at what point the boolean condition will evaluate to false based on (complex) actions within the loop. for ( int index = 0; index < 3; index = index + 1 ) { while (System.currentTimeMillis() < end) { This is true of our timer with slight variations in the number of times the loop will repeat within the one second time span, depending on the decisions of the OS.
  • 100. For practice, let’s rewrite the loop from our as a while loop. BACK TO BOOK READING (1) 100 public class AutomaticBookReader { public void readBook(Book book, int pages) { for ( int i = 0; i < pages; i++ ) { System.out.println("On page: " + book.readPageNumber()); book.readPage(); } } } AutomaticBookReader
  • 101. BACK TO BOOK READING (2) 101 public class AutomaticBookReader { public void readBook(Book book, int pages) { int i = 0; while ( i < pages ) { i++; System.out.println("On page: " + book.readPageNumber()); book.readPage(); } } }
  • 102. 🖥 In the lab, try the following exercise, which more closely necessitate the use of a while loop. • Determine how many times 5 can be subtracted from a number, N, before that number falls below zero. And then restructure your previous for loops as while loops: • Sum the numbers from 0 to N. • Print the multiples of 3 up until N. • Find the first N Fibonacci numbers. LOOPING WITHOUT AN INDEX 102Topic5-6
  • 103. 😴 There are two other loop types available to us, the do while loop and the advanced for loop but as these loops have very specific uses we will look at these in Topic 6 and Topic 7, respectively. SPECIALIST LOOPS: DO WHILE AND THE ADVANCED FOR 103
  • 104. 🤔 When we continue, we skip to the next loop iteration, updating indices as we do, if they exist. • We can use this to ignore sections of the code within a loop under various conditions. When we break, we terminate our loop early. ASIDE: CONTENTIOUS CONTROL STRUCTURES: BREAK AND CONTINUE (1) 104 continue; break; There are two specific ways we can control the flow of execution within a loop:
  • 105. 🤔 Like the use of multiple returns within a method, both of these control structures cause controversy because they can result in poorly designed code. • They work, but must be used carefully. • As such, I won’t discuss them in too much detail, but I want to draw your attention to their existence. ASIDE: CONTENTIOUS CONTROL STRUCTURES: BREAK AND CONTINUE (2) 105
  • 107. 🤔 It may have seemed excessive, given our loop syntax, that we still have the method at all. Instead, we could just call the code directly an arbitrary number of times using the appropriate loop: ASIDE: DROPPING THE PRINT MARTIN METHOD 107 System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); Do the following N times: But then we would lose the ability to call____________ from other places in our program. printMartin printMartin
  • 108. 🤔 This opens up a wider debate about the use of methods and loops for repeating code. Methods and loops both enable the same code to be used multiple times, and to be used in different ways, but they typically serve different purposes. • Methods are called multiple times manually by referencing a label, whereas loops repeat automatically after writing the loop statement. • Methods can be referenced at different times throughout a program, whereas the functionality within a loop is only referenced by the loop itself while it iterates (remember scope). METHODS VS. LOOPS (1) 108
  • 109. 🤔 This opens up a wider debate about the use of methods and loops for repeating code. Methods and loops both enable the same code to be used multiple times, and to be used in different ways, but they typically serve different purposes. • Other code can happen between method calls, whereas the iterations of a loop typically happen in sequence. • Methods are designed to capture sections of functionality, so also have a structural purpose. METHODS VS. LOOPS (2) 109
  • 110. 🤔 But it is true that loops and methods are closely connected concepts. Because these are closely connected concepts, we can, in fact, use methods to create a looping effect in our code. LOOPING WITH METHODS (1) 110
  • 111. 🤔 Let’s consider a simple for loop. How can we recreate each element of this loop using a method? LOOPING WITH METHODS (2) 111 for ( int i = 0; i <= 10; i ++ ) { System.out.println(i); }
  • 112. 🤔 LOOPING WITH METHODS (3): THE ITERATION 112 for ( ) { } public void looper() { looper(); } In order to create the iterative effect of the loop, we have to call the method within itself. If unchecked, this call process will naturally run on indefinitely.
  • 113. 🤔 LOOPING WITH METHODS (4): THE INDEX 113 for ( int i = 0; ) { } public void looper(int i) { looper(); } } In order to declare an index that will track the progress of our iterations, we use a parameter.
  • 114. 🤔 LOOPING WITH METHODS (5): UPDATING THE INDEX 114 for ( int i = 0; ; i ++ ) { } public void looper(int i) { looper(++i); } } Note the prefix increment here, otherwise our loop will run forever as the value of i will be lost in the next call of the method. To update the index variable, we call the method with an incremented value on each iteration.
  • 115. 🤔 LOOPING WITH METHODS (6): THE LOOP CONDITION 115 for ( int i = 0; i <= 10; i ++ ) { } public void looper(int i) { if ( i <= 10 ) { looper(++i); } } The loop condition is an if statement within the method, determining whether another call to the method itself will take place.
  • 116. 🤔 LOOPING WITH METHODS (7): THE WORK 116 for ( int i = 0; i <= 10; i ++ ) { System.out.println(i); } public void looper(int i) { if ( i <= 10 ) { System.out.println(i); looper(++i); } } The lines from inside our loop typically appear before the method is called again.
  • 117. Constructing a solution to a problem which involves a method calling itself is known as a recursive solution. RECURSION 117 public void looper(int i) { if ( i <= 10 ) { System.out.println(i); looper(++i); } } In a recursive solution we typically have a recursive case which drives the iteration… …and a base case which stops the iteration. Determining a suitable base and recursive case is an important task when constructing a recursive solution.
  • 118. 🖥 What happens if we do things after the recursive call? • Why is this? Hint: remember, any statements we place in our code will be executed by the JVM, even if the flow of control is briefly redirected. • Try this out in the laboratory, if you are interested. STATEMENTS AFTER A RECURSIVE METHOD CALL 118Topic5-7 public void looper(int i) { if ( i <= 10 ) { looper(++i); System.out.println(i); } }
  • 119. 🤐 Recursion can be used to create both powerful and elegant solutions to problems. • You will see more of recursion next year in 4CCS1DST. RECURSION: GOING FORWARD 119
  • 120. Dr. Martin Chapman programming@kcl.ac.uk martinchapman.co.uk/teaching Programming Practice and Applications (4CCS1PPA) Topic 5: Control Flow These slides will be available on KEATS, but will be subject to ongoing amendments. Therefore, please always download a new version of these slides when approaching an assessed piece of work, or when preparing for a written assessment. 120 Thursday 20th October