Vous êtes sur la page 1sur 18

State Machines

29-Nov-14

What is a state machine?

A state machine is a different way of thinking about


computation
A state machine has some number of states, and
transitions between those states
Transitions occur because of inputs
A pure state machine only knows which state it is
init has no other memory or knowledge

This is the kind of state machine you learn about in your


math classes
When you program a state machine, you dont have that
restriction
2

State machine I/O

State machines are designed to respond to a sequence


of inputs, such as

The individual characters in a string


A series of external events

State machines may produce output (often as a result


of transitions)
Alternatively, the result of a state machine may be
the state it ends up in

Example I: Even or odd

The following machine determines whether the number of As


in a string is even or odd

Circles represent states; arrows represent transitions

A
start

even
A
anything but A

odd
anything but A

Inputs are the characters of a string


The output is the resultant state
4

Error states

Some state machines may have a error state with the


following characteristics:

An unexpected input will cause a transition to the error state


All subsequent inputs cause the state machine to remain in
the error state

Simplifying drawings I

State machines can get pretty complicated


We can simplify the drawing by leaving out the error
state

The error state is still part of the machine


Any input without a transition on our drawing is assumed to
go to the error state

Another simplification: Use * to indicate all other


characters

This is a convention when drawing the machineit does not


mean we look for an asterisk in the input

Example II: Nested parenthesis

The following example tests whether parentheses are properly


nested (up to 3 deep)
(

OK

start

)
(

Error

How can we extend this machine to handle


arbitrarily deep nesting?
7

Nested parentheses II

Question: How can we use a state machine to


check parenthesis nesting to any depth?
Answer: We cant (with a finite number of states)

We need to count how deep we are into a parenthesis


nest: 1, 2, 3, ..., 821, ...
The only memory a state machine has is which state it
is in

However, if we arent required to use a pure state


machine, we can add memory (such as a counter)
and other features
8

Nested parentheses III


( do count=1
start

OK
) and count==1
do count=0

( do count++

) and count>1
do count--

This machine is based on a state machine, but it


obviously is not just a state machine
9

The states of a Thread

A Thread is an object that represents a single flow of


execution through a program
A Threads lifetime can be described by a state machine

waiting

start

ready

running

dead

10

German vocabulary tutor I

I once wrote a program to provide memorization drill on


English-German vocabulary

Words were presented in English


The user had to type in the German translation
A word was considered learned when the user answered
correctly three times in a row

Each word pair (English + German) could be thought of


as a state machine

11

German vocabulary tutor II

wrong

wrong
start

0th right

1st right

wrong

2nd right

3rd right

out

Whats the value in thinking of this as a state machine?

Answer: By measuring the percentage correct from each state,


I was better able to adjust the difficulty of the study session

12

Example: Making numbers bold

In HTML, you indicate boldface by surrounding the


characters with <b> ... </b>
Suppose we want to make all the integers bold in an HTML
pagewe can write a state machine to do this
end of input
output </b>

digit
output <b>digit

start
NORMAL
*: output *

NUMBER

end

digit
output digit

nondigit
output </b>nondigit
13

State machines in Java

In a state machine, you can have transitions from any


state to any other state
This is difficult to implement with Javas loops and if
statements
The trick is to make the state a variable, and to
embed a switch (state) statement inside a loop

Each case is responsible for resetting the state variable as


needed to represent transitions

14

Outline of the bold program


void run() {
int state = NORMAL;
for (int i = 0; i < testString.length(); i++) {
char ch = testString.charAt(i);
switch (state) {
case NORMAL: { not inside a number }
case NUMBER: { inside a number }
}
}
if (state == NUMBER) result.append("</b>");

15

The two states


case NORMAL:
case NUMBER:
if (Character.isDigit(ch)) {
if (!Character.isDigit(ch)) {
result.append("<b>" + ch);
result.append("</b>" + ch);
state = NUMBER;
state = NORMAL;
break;
break;
}
}
else {
else {
result.append(ch);
result.append(ch);
}
}
break;
break;

16

Conclusions

A state machine is a good model for a number of


problems

You can think of the problem in terms of a state machine


but not actually do it that way (e.g. German vocabulary)
You can implement the problem as a state machine (e.g.
making integers bold)
Best done as a switch inside some kind of loop

Pure state machines have some severe limitations

Java lets you do all kinds of additional tests and actions;


you can ignore these limitations

17

The End

18

Vous aimerez peut-être aussi