Chapter 4 Statement Forms - PowerPoint PPT Presentation

About This Presentation
Title:

Chapter 4 Statement Forms

Description:

This program adds a list of integers. Enter values, one per line, using 0 ... else { println(year ' is not a leap year.'); Four forms of if statements ... – PowerPoint PPT presentation

Number of Views:28
Avg rating:3.0/5.0
Slides: 46
Provided by: qiao
Category:
Tags: chapter | forms | leap | list | of | statement | years

less

Transcript and Presenter's Notes

Title: Chapter 4 Statement Forms


1
Chapter 4Statement Forms
2
Statement types
  • Simple statements
  • expression
  • println(The total is total .)
  • (method call)
  • 2. Compound statements
  • statement1
  • ...
  • statementn

3
  • Control statements
  • Conditional statements if, switch
  • Iterative statements for, while
  • Example Add more than 2 integers
  • Three startegies
  • Duplicating the code in Add2Integers
  • Repeating the input cycle a predetermined number
    of times
  • Repeating the input cycle until the user enters a
    special sentinel value

4
  • public class Add4Integers extends ConsoleProgram
  • public void run()
  • println(This program adds four
    integers.)
  • int n1 readInt( ? )
  • int n2 readInt( ? )
  • int n3 readInt( ? )
  • int n4 readInt( ? )
  • int total n1 n2 n3 n4
  • println(The total is total
    .)
  • Difficult to generalize
  • Cumbersome to add 100 values

5
The repeat-N-times idiom
  • for (int i 0 i lt N i)
  • statements to be repeated
  • header line for (int i 0 i lt N i)
  • body statements to be repeated

6
  • /
  • file AddNIntegers.java
  • ------------------------------
  • This program adds a predefined number of
    integers
  • and them prints the total. To change the
    number of
  • integers, change the definition of N_VALUES
  • /
  • Import acm.program.

7
  • public class AddNIntegers extends
    ConsoleProgram
  • public void run()
  • println(This program adds N_VALUES
    integers.)
  • int total 0
  • for (i 0 i lt N_VALUES i)
  • int value readInt( ? )
  • total value
  • println(The total is total
    .)
  • / specifies the number of values /
  • private static final int N_VALUES 4

8
Tracing the program
  • public void run()
  • println(This program adds N_VALUES
    integers.)
  • int total 0
  • for (i 0 i lt N_VALUES i)
  • int value readInt( ? )
  • total value
  • println(The total is total
    .)
  • N_VALUES (4)
  • total (0)
  • i (0)
  • value ( )

9
The repeat-until-sentinel
  • Read numbers until the user signals the end of
    input data.
  • Sentinel A special value, not a legitimate data
    value, signals the end of input data.
  • Examples
  • Add a list of integers
  • sentinel 0
  • Average grades
  • Sentinel -1

10
Repeat-until sentinel idiom
  • while (true)
  • prompt user and read in a value
  • if (value sentinel) break
  • rest of the loop body

11
A sample output
  • This program adds a list of integers.
  • Enter values, one per line, using 0
  • to signal the end of the list.
  • ? 1
  • ? 2
  • ? 3
  • ? 0
  • This total is 6.

12
  • /
  • File AddIntegerList.java
  • --------------------------------
  • This program reads integers one per line until
    the
  • user enters a special sentinel value to signal
    the
  • end of the input. At that point, the program
    prints
  • the sum of the numbers entered so far.
  • /
  • import acm.program.

13
  • public class AddIntegerList extends
    ConsoleProgram
  • public void run()
  • println(This program adds a list
    of integers.)
  • println(Enter values, one per
    line,)
  • println(using SENTINEL to
    signal the end of the list.)
  • int total 0
  • while (true)
  • int value readInt( ?
    )
  • if (value SENTINEL)
    break
  • total value
  • println(The total is total
    .)
  • / Specifies the value of the sentinel /
  • private static final int SENTINEL
    0

14
Tracing the program
  • int total 0
  • while (true)
  • int value readInt( ?
    )
  • if (value SENTINEL)
    break
  • total value
  • println(The total is total
    .)
  • SENTINEL (0)
  • total (0)
  • value ( )

15
Average grade
  • Changes
  • new variable int count
  • new variable double average
  • SETINEL -1
  • comments

16
public class AverageGrade extends
ConsoleProgram public void run()
println(This program calculates
average grades.) println(Enter
grades, one per line,)
println(using SENTINEL to signal the end
of the list.) int total 0
int count 0 while
(true) int value
readInt( ? ) if (value
SENTINEL) break total
value count
double average (double)
total / count println(The average
is average .) / Specifies the
value of the sentinel / private static
final int SENTINEL -1
17
Zeros are not counted
  • int total 0
  • int count 0
  • while (true)
  • int value readInt( ?
    )
  • if (value SENTINEL)
    break
  • if (value gt 0)
  • total value
  • count
  • double average (double) total /
    count
  • println(The average is average
    .)

18
What if count 0?
  • int total 0
  • int count 0
  • while (true)
  • int value readInt( ?
    )
  • if (value SENTINEL)
    break
  • if (value gt 0)
  • total value
  • count
  • if (count 0)
  • println(No grades entered.)
  • else / count gt 0 /
  • double average (double) total
    / count
  • println(The average is
    average .)

19
Example IsLeapYear.java
  • /
  • File IsLeapYear.java
  • --------------------------
  • This program reads in a year and determines
    whether it is a
  • leap year. A year is a leap year if it is
    divisible by four, unless
  • it is divisible by 100. Years divisible by 100
    are leap years only
  • if divisible by 400.
  • /
  • Import acm.program.

20
  • public class IsLeapYear extends
    ConsoleProgram
  • public void run()
  • println(This program checks for
    leap years.)
  • int year readInt(Enter year
    )
  • boolean isLeapYear (((year
    4) 0) ((year 100) ! 0))

  • ((year 400) 0)
  • if (isLeapYear)
  • println(year is a leap
    year.)
  • else
  • println(year is not a leap year.)

21
Four forms of if statements
  • Single-line
  • if (condition) statement
  • Multiline
  • if (condition)
  • statements
  • if-else
  • if (condition)
  • statement1
  • else
  • statement2

22
  • Cascading
  • if (condition1)
  • statements1
  • else if (condition2)
  • statements2
  • ...
  • else
  • statements

23
Example Sign of x
  • If x gt 0, sign(x) 1 if x lt 0, sign(x) -1 if
    x 0, sign(x) 0.
  • Using a table

x gt 0 lt 0
lt 0 0
sign(x) 1 -1 0
24
The ? operator
  • condition ? expressionT expressionF
  • equivalent to
  • if (condition)
  • expressionT
  • else
  • expressionF

25
Examples
  • Max (x gty)? x y
  • println(nItems item ((nItems 1) ?
    s)
  • found.)

26
The switch statement
  • switch (e)
  • case c1
  • statements1
  • break
  • case c2
  • statements2
  • break
  • ... more case clauses ...
  • default
  • statements
  • break
  • Useful when program must choose among several
    cases.

27
Good programming practice
  • Although a break is not necessary for each case,
    it is advised to include a break at the end of
    each case.
  • Although a default clause is optional, it is
    advised to include a default clause unless you
    are absolutely sure that you have covered all the
    cases (using a table).

28
Example
  • public void run()
  • println(This program shows the number of
    days in a month.)
  • int month readInt(Enter numeric month
    (Jan 1) )
  • switch (month)
  • case 2
  • println(28 days (29 in leap
    years))
  • break
  • case 4 case 6 case 9 case 11
  • println(30 days)
  • break
  • case 1 case 3 case 5 case 7 case
    8 case 10 case 12
  • println(31 days)
  • break
  • default
  • println(Illegal month
    number)
  • break

29
The while statement
  • while (condition)
  • statements
  • The conditional test is performed only at the
    beginning of a loop cycle. If the condition
    happens to become false at some point in the
    middle of the loop, the program doesnt notice
    the fact until it has executed a complete cycle.
    At that point, the program evaluates the test
    condition again. If it is still false, the loop
    terminates.
  • If you must quit loop inside a cycle, use break.
    See later.

30
Example DigitSum
  • Pseudo code
  • public void run()
  • println(This program sums the digits in
    an integer.)
  • int n readInt(Enter a positive
    integer )
  • int dsum 0
  • for each digit in the number, add that
    digit to dsum
  • println(The sum of the digits is dsum
    .)

31
  • Find digits in an integer
  • 1729 10 9
  • 1729 / 10 172
  • ...
  • 1 10 1
  • 1 / 10 0
  • / for each digit in the number, add that digit
    to dsum /
  • while (n gt 0)
  • dsum n 10
  • n / 10

32
  • public void run()
  • println(This program sums the digits in
    an integer.)
  • int n readInt(Enter a positive
    integer )
  • int dsum 0
  • while (n gt 0)
  • dsum (n 10)
  • n n /10
  • println(The sum of the digits is dsum
    .)
  • Trace the program.

33
Loop terminationg
  • When you use a while loop in a program, it is
    important to make sure the loop eventually
    terminates.
  • while (n gt 0)
  • dsum n 10
  • n / 10
  • Infinite loop!
  • Find out the command sequence on your computer
    which stops an infinite loop.

34
The loop-and-half patterns
  • while (true)
  • prompt user and read in a value
  • if (value sentinel) break
  • process the data value
  • or the sentinel-based loop
  • Prompt user and read in a value
  • while (value ! sentinel)
  • process the data value
  • prompt user and read in a value

35
  • Two drawbacks of the sentinel-based loop
  • The order of the operations in the loop in
    unnatural, hard to follow. (Process the data
    value, then read in a new value.)
  • Duplication of code presents a serious
    maintenance problem. Subsequent edits to one copy
    might not be made in the other.

36
The for statement
  • for (init test step)
  • statements
  • Example countdown
  • Int START 10
  • for (int t START t gt 0 t--)
  • println(t)
  • println(Liftoff!)

37
  • The expressions init, test, and step are each
    optional, but semicolons must appear.
  • If init is missing, no initialization is
    performed
  • If test is missing, it is assumed to be true
  • If step is missing, no action occurs between loop
    cycles.
  • for ( ) is equivalent to while (true)

38
Effect of each of the following for statements
  • for (int i 0 i lt N i)
  • for (int i 1 i lt 10 i)
  • for (int n 99 i gt 1 n - 2)
  • for (int x 1 x lt 1024 x 2)

39
Simple graphic animation
  • Moving a square diagonally.
  • / File AnimatedSquare.java
  • ------------------------------------
  • This program animates a square so that it
    moves from the
  • upper left corner of the window to the lower
    right corner.
  • /
  • import acm.graphics.
  • import acm.program.

40
  • public class AnimatedSquare extends
    GraphicsProgram
  • public void run()
  • GRect square new
    Grect(0,0,SQUARE_SIZE, SQUARE_SIZE)
  • square.setFilled(true)
  • add(square)
  • double dx (double) (getWidth()
    SQUARE_SIZE) / N_STEPS
  • double dy (double) (getHeight()
    SQUARE_SIZE) / N_STEPS
  • for (int i 0 i lt N_STEPS i)
  • square.move(dx, dy)
  • pause(PAUSE_TIME)
  • / private constants /
  • private static final int N_STEPS 1000
  • private static final int PAUSE_TIME
    20
  • private static final int SQUARE_SIZE
    50

41
for vs while
  • for (init test step)
  • statements
  • is equivalent to
  • Init
  • while (test)
  • statements
  • step
  • Prefer for over while, when you have choice.

42
Nested for statements
  • 2D applications.
  • Example Checkerboard
  • /
  • File Checkerboard.java
  • --------------------------------
  • This program draws a checkerboard. The
    dimensions of
  • checkerboard are specified by the constants
    N_ROWS and
  • N_COLIMNS, and the size of the square is
    chosen so that the
  • checkerboard fills the available vertical
    space.
  • /
  • import acm.graphics.
  • import acm.program.

43
  • public class Checkerboard extends
    GraphicsProgram
  • public void run()
  • double sqSize (double)
    getHeight() / N_ROWS
  • for (int i 0 i lt N_ROWS i)
  • for (int j 0 j lt
    N_COLUMNS j)
  • double x j sqSize
  • double y i sqSize
  • GRect sq new
    GRect(x, y, sqSize, sqSize)
  • sq.setFilled(((i j)
    2) ! 0)
  • add(sq)
  • / for j /
  • / for i /
  • / private constants /
  • private static final int N_ROWS 8
  • private static final int N_COLUMNS 8

44
Using for with floating-point data
  • double h 0.1
  • for (double x 1.0 x lt 2.0 x h)
  • println(x)
  • Output
  • 1.0
  • 1.1
  • 1.2000000000000002
  • ...
  • 1.9000000000000008

45
Why?
  • Decimal 0.1 cannot be exactly represented in
    binary. During the assignment h 0.1, decimal
    0.1 is rounded to it closest double
    floating-point, which is slightly larger than
    0.1.
  • Caution more rounding errors occur during
    addition.
  • for (double x 0.0 x lt 0.5 x h)
  • println(x)
  • The final value of x is 0.5 exact.
Write a Comment
User Comments (0)
About PowerShow.com