# Section 5.2. If Blocks

[Page 201]

### 5.2. If Blocks

An If block allows a program to decide on a course of action based on whether certain conditions are true or false.

#### If Block

A block of the form:

```
If condition Then

action1

Else

action2

End If

```

causes the program to take action1 if condition is true and action2 if condition is false. Each action consists of one or more Visual Basic statements. After an action is taken, execution continues with the line after the If block. Figure 5.1 contains the pseudocode and flowchart for an If block.

##### (This item is displayed on pages 201 - 202 in the print version)

The following program finds the larger of two numbers input by the user . The condition is

```
num1 > num2

```

and each action consists of a single assignment statement. With the inputs 3 and 7, the condition is false, and so the second action is taken.

[Page 202]

Object

Property

Setting

frmMaximum

Text

Maximum

lblFirstNum

Text

First Number:

txtFirstNum

lblSecondNum

Text

Second Number:

txtSecondNum

btnFindLarger

Text

Find Larger Number

txtResult

True

```

Private Sub

btnFindLarger_Click(

...

)

Handles

btnFindLarger.Click

Dim

num1, num2, largerNum

As Double

num1 =

CDbl

(txtFirstNum.Text)

num2 =

CDbl

(txtSecondNum.Text)

If

num1 > num2

Then

largerNum = num1

Else

largerNum = num2

EndIf

txtResult.Text =

"The larger number is "

& largerNum

End Sub

```

[Run, type 3 and 7 into the text boxes, and press the button.]

##### (This item is displayed on pages 202 - 203 in the print version)

The following program requests the costs and revenue for a company and displays the message "Break even" if the costs and revenue are equal; otherwise , it displays the profit or loss. The action following Else is another If block.

Object

Property

Setting

frmStatus

Text

Profit/Loss

lblCosts

Text

Costs:

txtCosts

lblRev

Text

Revenue:

txtRev

btnShow

Text

Show Financial Status

txtResult

True

[Page 203]

```

Private Sub

btnShow_Click(

...

)

Handles

btnShow.Click

Dim

costs, revenue, profit, loss

As Double

costs =

CDbl

(txtCosts.Text)

revenue =

CDbl

(txtRev.Text)

If

costs = revenue

Then

txtResult.Text =

"Break even"

Else

If

costs < revenue

Then

profit = revenue - costs

txtResult.Text =

"Profit is "

& FormatCurrency(profit)

Else

loss = costs - revenue

txtResult.Text =

"Loss is "

& FormatCurrency(loss)

End If

End If

End Sub

```

[Run, type 9500 and 8000 into the text boxes, and press the button.]

##### (This item is displayed on pages 203 - 204 in the print version)

The If block in the following program has a logical operator in its condition.

Object

Property

Setting

frmQuiz

Text

A Quiz

lblQuestion

Text

How many gallons does a ten-gallon hat hold?

btnEvaluate

Text

txtSolution

True

```

Private Sub

btnEvaluate_Click(

...

)

Handles

btnEvaluate.Click

Dim

As Double

CDbl

If

And

Then

txtSolution.Text =

"Good, "

Else

```

[Page 204]
```
txtSolution.Text =

"No, "

End If

txtSolution.Text &=

"it holds about 3/4 of a gallon."

End Sub

```

[Run, type 10 into the text box, and press the button.]

The Else part of an If block can be omitted. This important type of If block appears in the next example.

##### (This item is displayed on pages 204 - 205 in the print version)

The following program offers assistance to the user before presenting a quotation.

Object

Property

Setting

frmQuotation

Text

Quotation

lblQuestion

Text

Do you know what the game of skittles is (Y/N)?

L

btnDisplay

Text

Display Quotation

txtQuote

True

```

Private Sub

btnDisplay_Click(

...

)

Handles

btnDisplay.Click

Dim

message

As String

message =

"Skittles is an old form of bowling in which a wooden "

& _

"disk is used to knock down nine pins arranged in a square."

If

"N"

Then

MsgBox(message, 0,

""

)

End If

txtQuote.Text =

"Life ain't all beer and skittles."

& _

" - Du Maurier (1894)"

End Sub

```

[Run, type "N" into the masked text box, and press the button.]

[Page 205]

[Press OK.]

Note: Rerun the program, type "Y" into the masked text box, press the button, and observe that the description of the game is skipped .

#### ElseIf Clauses

An extension of the If block allows for more than two possible alternatives with the inclusion of ElseIf clauses. A typical block of this type is

```
If condition1 Then

action1

ElseIf condition2 Then

action2

ElseIf condition3 Then

action3

Else

action4

End If

```

This block searches for the first true condition, carries out its action, and then skips to the statement following End If. If none of the conditions is true, then Else's action is carried out. Execution then continues with the statement following the block. In general, an If block can contain any number of ElseIf clauses. As before, the Else clause is optional.

[Page 206]
##### Example 5.
 The following program redoes Example 1 so that if the two numbers are equal, the program so reports : ``` Private Sub btnFindLarger_Click( ... ) Handles btnFindLarger.Click Dim num1, num2 As Double num1 = CDbl (txtFirstNum.Text) num2 = CDbl (txtSecondNum.Text) If (num1 > num2) Then txtResult.Text = "The larger number is " & num1 ElseIf (num2 > num1) Then txtResult.Text = "The larger number is " & num2 Else txtResult.Text = "The two numbers are equal." End If End Sub ``` [Run, type 7 into both text boxes, and press the button.]

If blocks allow us to define functions whose values are not determined by a simple formula. The function in Example 6 uses an If block.

##### (This item is displayed on pages 206 - 207 in the print version)

The Social Security or FICA tax has two componentsthe Social Security benefits tax, which in 2005 is 6.2 percent on the first \$90,000 of earnings for the year, and the Medicare tax, which is 1.45 percent of earnings. The following program calculates an employee's FICA tax for the current pay period.

Object

Property

Setting

frm FICA

Text

FICA Taxes

lblToDate

Text

Total earnings for this year prior to the current pay period:

txtToDate

lblCurrent

Text

Earnings for the current pay period:

txtCurrent

btnCalculate

Text

Calculate FICA Taxes

lblTax

Text

FICA taxes for the current pay period:

txtTax

True

[Page 207]

```

Private Sub

btnCalculate_Click(

...

)

Handles

btnCalculate.Click

Dim

ficaTaxes

As Double

ficaTaxes = CalcFICA(

CDbl

(txtToDate.Text),

CDbl

(txtCurrent.Text)) txtTax.Text = FormatCurrency(ficaTaxes)

End Sub

Function

CalcFICA(

ByVal

ytdEarnings

As Double

, _

ByVal

curEarnings

As Double

)

As Double

'Calculate Social Security benefits tax and Medicare tax

'for a single pay period in 2005

Dim

socialSecurityBenTax, medicareTax

As Double

If

(ytdEarnings + curEarnings) <= 90000 Then

socialSecurityBenTax = 0.062 * curEarnings

ElseIf

ytdEarnings < 90000

Then

socialSecurityBenTax = 0.062 * (90000 - ytdEarnings)

End If

medicareTax = 0.0145 * curEarnings

Return

socialSecurityBenTax + medicareTax

End Function

```

[Run, type 12345.67 and 543.21 into the top two text boxes, and press the button. The following is displayed in txtTax.]

```\$41.56
```

1. Constructs in which an If block is contained inside another If block are referred to as nested If blocks.

2. Care should be taken to make If blocks easy to understand. For instance, in Figure 5.2, the block on the left is difficult to follow and should be replaced by the clearer block on the right.

##### Figure 5.2. A confusing If block and an improvement.
 ``` If cond1 Then If cond2 Then action End If End If ``` ``` If cond1 And cond2 Then action End If ```

3. In Appendix C, the section "Stepping through Programs Containing Decision Structures: Chapter 5" uses the Visual Basic debugging tools to trace the flow through an If block.

4. Some programs call for selecting among many possibilities. Although such tasks can be accomplished with complicated If blocks, the Select Case block (discussed in the next section) is often a better alternative.

[Page 208]
##### Practice Problems 5.2
 1 Suppose the user is asked to input a number into txtNumber for which the square root is to be taken. Fill in the If block so that the lines of code that follow will display either the message "Number can't be negative." or the square root of the number. ``` Private Sub btnSqrt_Click(...) Handles btnSqrt.Click 'Check reasonableness of data Dim num As Double num = CDbl(txtNumber.Text) If End If End Sub ``` 2 Improve the block ``` If a < b Then If c < 5 Then txtBox.Text = "hello" End If End If ```
##### Exercises 5.2

In Exercises 1 through 12, determine the output displayed in the text box when the button is clicked.

1.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim num As Double = 4

If num <= 9 Then

txtOutput.Text = "Less than ten."

Else

If num = 4 Then

txtOutput.Text = "Equal to four."

End If

End If

End Sub

```

2.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim gpa As Double = 3.49

txtOutput.Clear()

If gpa >= 3.5 Then

txtOutput.Text = "Honors "

End If

txtOutput.Text &= "Student"

End Sub

```

[Page 209]
3.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim a As Double = 5

txtOutput.Clear()

If (3 * a - 4) < 9 Then

txtOutput.Text = "Remember, "

End If

txtOutput.Text &= "tomorrow is another day."

End Sub

```

4.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim change As Double = 356 'Amount of change in

cents

If change >= 100 Then

txtOutput.Text = "Your change contains " & _

Int(change / 100) & " dollars."

Else

txtOutput.Text = "Your change contains no dollars."

End If

End Sub

```

5.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim a as Double = 2

Dim b As Double = 3

Dim c As Double = 5

If a * b < c Then

b = 7

Else

b = c * a

End If

txtOutput.Text = CStr(b) End Sub

```

6.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim a, b As Double

a = CDbl(InputBox("Enter a number."))

b = CDbl(InputBox("Enter another number."))

If a > b Then

a += 1

Else

b += 1

End If

txtOutput.Text = a & " "& b End Sub

```

(Assume the responses are 7 and 11.)

7.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

'Cost of phone call from New York to London

Dim length As Double

InputLength(length)

DisplayCost(length)

End Sub

```

[Page 210]
```
Function Cost(ByVal length As Double) As Double

If length < 1 Then

Return .46

Else

Return .46 + (length - 1) * .36

End If

End Function

Sub DisplayCost(ByVal length As Double)

'Display the cost of a call

txtBox.Text = "Cost of call: "& FormatCurrency(Cost(length))

End Sub

Sub InputLength(ByRef length As Double)

'Request the length of a phone call

length = CDbl(InputBox("Duration of the call in minutes?"))

End Sub

```

(Assume the response is 31 .)

8.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim letter As String

letter = InputBox("Enter A, B, or C.")

If letter = "A" Then

DisplayAmessage()

ElseIf letter = "B" Then

DisplayBmessage()

ElseIf letter = "C" Then

DisplayCmessage()

Else

txtOutput.Text = "Not a valid letter."

End If

End Sub

Sub DisplayAmessage()

txtOutput.Text = "A, my

name

is Alice."

End Sub

Sub DisplayBmessage()

txtOutput.Text = "To be, or not to be."

End Sub

Sub DisplayCmessage()

txtOutput.Text = "Oh, say, can you see."

End Sub

```

(Assume the response is B .)

9.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim vowels As Integer 'Number of

vowels

ExamineLetter(vowels)

```

[Page 211]
```
ExamineLetter(vowels)

ExamineLetter(vowels)

txtOutput.Text = "The number of vowels is "& vowels End Sub Sub ExamineLetter(ByRef vowels As Integer)

Dim ltr As String

ltr = InputBox("Enter a letter.")

ltr = ltr.ToUpper

If (ltr = "A") Or (ltr = "E") Or (ltr = "I") Or _

(ltr = "O") Or (ltr = "U") Then

vowels += 1

End If

End Sub

```

(Assume the three responses are U , b , and a .)

10.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim a As Double = 5

If (a > 2) And ((a = 3) Or (a < 7)) Then

txtOutput.Text = "Hi"

End If

End Sub

```

11.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim num As Double = 5

If num < 0 Then

txtOutput.Text = "neg"

Else

If num = 0 Then

txtOutput.Text = "zero"

Else

txtOutput.Text = "positive"

End If

End If

End Sub

```

12.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim msg As String, age As Integer

msg = "You are eligible to vote"

If age >= 18 Then

txtOutput.Text = msg

Else

txtOutput.Text = msg & " in "& (18 - age) & "

years

."

End If

End Sub

```

(Assume the response is 16 .)

[Page 212]

In Exercises 13 through 20, identify the errors.

13.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim num As Double = 0.5

If (1 < num < 3) Then

txtOutput.Text = "Number is between 1 and 3."

End If

End Sub

```

14.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim num As Double = 6

If num > 5 And < 9 Then

txtOutput.Text = "Yes"

Else

txtOutput.Text = "No"

End If

End Sub

```

15.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

If (2 <> 3)

txtOutput.Text = "Numbers are not equal"

End If End Sub

```

16.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim major As String

major = "Computer Science"

If major = "Business" Or "Computer Science" Then

txtOutput.Text = "Yes"

End If

End Sub

```

17.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

Dim numName As String, num As Double

numName = "Seven"

num = CDbl(InputBox("Enter a number."))

If num < numName Then

txtOutput.Text = "Less than"

Else

txtOutput.Text = "Greater than"

End If

End Sub

```

18.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

'Change switch from "on" to "off", or from "off" to "on"

Dim switch As String

switch = InputBox("Enter On or Off.")

If switch = "Off" Then

switch = "On"

End If

```

[Page 213]
```
If switch = "On" Then

switch = "Off"

End If

txtOutput.Text = switch

End Sub

```

19.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

'Display "OK" if either j or k equals 4

Dim j As Double = 2

Dim k As Double = 3

If j Or k = 4 Then

txtOutput.Text = "OK"

End If

End Sub

```

20.

```
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click

query = "Are you sure everything in your program is correct?"

txtOutput.Text = "Don't patch bad code, rewrite it."

Else

query = "Does your program run correctly?"

txtOutput.Text = "Congratulations."

Else

txtOutput.Text = "Something you are sure about is wrong."

End If

End Sub

```

In Exercises 21 through 26, simplify the code.

21.

```
If (a = 2) Then

a = 3 + a

Else

a = 5

End If

```

22.

```
If Not (answer <> "y") Then

txtOutput.Text = "YES"

Else

txtOutput.Text = "YES"

End If

End If

```

[Page 214]
23.

```
If (j = 7) Then

b = 1

Else

If (j <> 7) Then

b = 2

End If

End If

```

24.

```
If (a < b) Then

If (b < c) Then

txtOutput.Text = b & " is between "& a & " and "& c

End If

End If

```

25.

```
message = "Is Alaska bigger than Texas and California combined?"

If (answer.Substring(0, 1) = "Y") Then

End If

If (answer.Substring(0, 1) = "y") Then

End If

txtOutput.Text = "Correct"

Else

txtOutput.Text = "Wrong"

End If

```

26.

```
message = "How tall (in feet) is the Statue of Liberty?"

feet = CDbl(InputBox(message))

If (feet <= 141) Then

End If

If (feet > 141) Then

If (feet < 161) Then

Else

End If

End If

sltOutput.Items.Add("The statue is 151 feet from base to torch.")

```

27.

Write a program to determine how much to tip the server in a restaurant. The tip should be 15 percent of the check, with a minimum of \$1.

28.

A bagel shop charges 75 cents per bagel for orders of less than a half-dozen bagels and charges 60 cents per bagel for orders of a half-dozen or more bagels. Write a program that requests the number of bagels ordered and displays the total cost. (Test the program for orders of four bagels and a dozen bagels.)

[Page 215]
29.

A computer store sells diskettes at 25 cents each for small orders or at 20 cents each for orders of 100 diskettes or more. Write a program that requests the number of diskettes ordered and displays the total cost. (Test the program for purchases of 5 and 200 diskettes.)

30.

A copy center charges 5 cents per copy for the first 100 copies and 3 cents per copy for each additional copy. Write a program that requests the number of copies as input and displays the total cost. (Test the program with the quantities 25 and 125.)

31.

Write a quiz program to ask "Who was the first Ronald McDonald?" The program should display "Correct." if the answer is "Willard Scott" and "Nice try" for any other answer.

32.

Suppose a program has a button with the caption "Quit." Suppose also that the Name property of this button is btnQuit. Write a btnQuit_Click event procedure that gives the user a second chance before ending the program. The procedure should use an input box to request that the user confirm that the program should be terminated , and then end the program only if the user responds in the affirmative .

33.

Write a program to handle a savings-account withdrawal. The program should request the current balance and the amount of the withdrawal as input and then display the new balance. If the withdrawal is greater than the original balance, the program should display "Withdrawal denied ." If the new balance is less than \$150, the message "Balance below \$150" should be displayed.

34.

Write a program that requests three scores as input and displays the average of the two highest scores. The input and output should be handled by Sub procedures, and the average should be determined by a user-defined function.

35.

A grocery store sells apples for 79 cents per pound . Write a cashier's program that requests the number of pounds and the amount of cash tendered as input and displays the change from the transaction. If the cash is not enough, the message "I need \$x.xx more." should be displayed, where \$x.xx is the difference between the cash and the total cost. (Test the program with six pounds and \$5, and four pounds and \$3.)

36.

Federal law requires hourly employees be paid "time-and-a-half" for work in excess of 40 hours in a week. For example, if a person's hourly wage is \$8 and he works 60 hours in a week, his gross pay should be

(40 x 8) + (1.5 x 8 x (60 - 40)) = \$560

Write a program that requests as input the number of hours a person works in a given week and his hourly wage, and then displays his gross pay.

37.

Write a program that requests a word (with lowercase letters ) as input and translates the word into pig latin. The rules for translating a word into pig latin are as follows :

1. If the word begins with a consonant, move the first letter to the end of the word and add ay . For instance, chip becomes hipcay .

2. If the word begins with a vowel, add way to the end of the word. For instance, else becomes elseway .

38.

The current calendar, called the Gregorian calendar, was introduced in 1582. Every year divisible by four was declared to be a leap year, with the exception of the years ending in 00 (that is, those divisible by 100) and not divisible by 400. For instance, the years 1600 and 2000 are leap years, but 1700, 1800, and 1900 are not. Write a program that requests a year as input and states whether it is a leap year. (Test the program on the years 1994, 1995, 1900, and 2000.)

[Page 216]
39.

Create a form with a text box and two buttons captioned Bogart and Raines. When Bogart is first pressed, the sentence "I came to Casablanca for the waters." is displayed in the text box. The next time Bogart is pressed, the sentence "I was misinformed." is displayed. When Raines is pressed, the sentence "But we're in the middle of the desert." is displayed. Run the program and then press Bogart, Raines, and Bogart to obtain a dialogue.

40.

Write a program that allows the user to use a button to toggle the color of the text in a text box between black and red.

41.

Write a program that allows the user ten tries to answer the question, "Which U.S. President was born on July 4?" After three incorrect guesses, the program should display the hint, "He once said, 'If you don't say anything, you won't be called upon to repeat it."' in a message box. After seven incorrect guesses, the program should give the hint, "His nickname was 'Silent Cal."' The number of guesses should be displayed in a text box. Note: Calvin Coolidge was born on July 4, 1872.

42.

Write a program that reads a test score from a text box each time a button is clicked and then displays the two highest scores whenever a second button is clicked. Use two class-level variables to track the two highest scores.

43.

The flowchart in Figure 5.3 (on the next page) calculates New Jersey state income tax. Write a program corresponding to the flowchart. (Test the program with taxable incomes of \$15,000, \$30,000, and \$60,000.)

##### (This item is displayed on page 217 in the print version)

44.

Write a program to play "Hide and Seek" with the name of our programming language. When the button is pressed, the name should disappear and the caption on the button should change to "Show Name of Language." The next time the button is pressed, the name should reappear and the caption should revert to "Hide Name of Language," and so on.

Object

Property

Setting

frmHideSeek

Text

Hide and Seek

lblLanguage

Text

VB 2005

Font.Size

26

btnDisplay

Text

Hide Name of Language

##### Solutions to Practice Problems 5.2
 1. ``` If (num < 0) Then MsgBox("Number can't be negative.", 0, "Input Error") txtNumber.Clear() txtNumber.Focus() Else txtSquareRoot.Text = CStr(Math.Sqrt(num)) End If ``` [Page 218] 2. The word "hello" will be displayed when (a < b)is true and (c < 5)is also true. That is, it will be displayed when both of these two conditions are true. The clearest way to write the block is ``` If (a < b) And (c < 5) Then txtBox.Text = "hello" End If ```