Introduction to Programming Using Visual Basic 2005, An (6th Edition)
6.3. For... Next LoopsWhen we know exactly how many times a loop should be executed, a special type of loop, called a For... Next loop, can be used. For... Next loops are easy to read and write, and have features that make them ideal for certain common tasks. The following code uses a For... Next loop to display a table: Private Sub btnDisplayTable_Click(...) Handles btnDisplayTable.Click 'Display a table of the first 5 numbers and their squares 'Assume the font for lstTable is Courier New Dim i As Integer For i = 1 To 5 lstTable.Items.Add(i & " " & i ^ 2) Next End Sub
[Run, and click on btnDisplayTable. The following is displayed in the list box.] 1 1 2 4 3 9 4 16 5 25
The equivalent program written with a Do loop is as follows. Private Sub btnDisplayTable_Click(...) Handles btnDisplayTable.Click 'Display a table of the first 5 numbers and their squares Dim i As Integer i = 1 Do While i <= 5 lstTable.Items.Add(i & " " & i ^ 2) i += 1 'Add 1 to i Loop End Sub
In general, a portion of a program of the form constitutes a For... Next loop. The pair of statements For and Next cause the statements between them to be repeated a specified number of times. The For statement designates a numeric variable, called the control variable, that is initialized and then automatically changes after each execution of the loop. Also, the For statement gives the range of values this variable will assume. The Next statement increments the control variable. If m When program execution reaches a For... Next loop, such as the one shown previously, the For statement assigns to the control variable i the initial value m and checks to see whether i is greater than the terminating value n. If so, then execution jumps to the line following the Next statement. If i<=n, the statements inside the loop are executed. Then, the Next statement increases the value of i by 1 and checks this new value to see if it exceeds n. If not, the entire process is repeated until the value of i exceeds n. When this happens, the program moves to the line following the loop. Figure 6.7 contains the pseudocode and flowchart of a For ... Next loop. Figure 6.7. Pseudocode and flowchart of a For Next loop. |
Suppose the population of a city is 300,000 in the year 2006 and is growing at the rate of 3 percent per year. The following program displays a table showing the population each year until 2010.
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'Display population from 2006 to 2010 Dim pop As Double = 300000, yr As Integer Dim fmtStr As String = "{0,4}{1,12:N0}" For yr = 2006 To 2010 lstTable.Items.Add(String.Format(fmtStr, yr, pop)) pop += 0.03 * pop Next End Sub
[Run, and click the button.] |
The initial and terminating values can be literals, variables, or expressions. For instance, the For statement in the preceding program can be replaced by
Dim firstYr As Integer = 2006 Dim lastYr As Integer = 2010 For yr = firstYr To lastYr
In Example 1, the control variable was increased by 1 after each pass through the loop. A variation of the For statement allows any number to be used as the increment. The statement
For i = m To n Step s
instructs the Next statement to add s to the control variable instead of 1. The numbers m, n, and s do not have to be whole numbers. The number s is called the step value of the loop. Note: If the control variable will assume values that are not whole numbers, then the variable must be of type Double.
Example 2. (This item is displayed on pages 280 - 281 in the print version)
The following program displays the values of the index of a For... Next loop for terminating and step values input by the user:
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'Display values of index ranging from 0 to n Step s Dim n, s, As Double Dim index As Double n = CDbl(txtEnd.Text) s = CDbl(txtStep.Text) lstValues.Items.Clear() For index = 0 To n Step s lstValues.Items.Add(index) Next End Sub [Run, type 3.2 and .5 into the text boxes, and click the button.] |
In the examples considered so far, the control variable was successively increased until it reached the terminating value. However, if a negative step value is used and the initial value is greater than the terminating value, then the control value is decreased until reaching the terminating value. In other words, the loop counts backward or downward.
Example 3. (This item is displayed on pages 281 - 282 in the print version)
The following program accepts a word as input and displays it backwards:
Private Sub btnReverse_Click(...) Handles btnReverse.Click txtBackwards.Text = Reverse(txtWord.Text) End Sub Function Reverse(ByVal info As String) As String Dim m, j As Integer, temp As String ="" m = info.Length For j = m - 1 To 0 Step -1 temp &= info.Substring(j, 1) Next Return temp End Function [Run, type "SUEZ" into the text box, and click the button.] |
Note: The initial and terminating values of a For ...Next loop can be expressions. For instance, the third and fourth lines of the function in Example 3 can be consolidated to
For j = info.Length - 1 To 0 Step -1
Declaration of Control Variables
The control variable of a For ... Next loop can be declared directly in the For statement. A statement of the form
For i As DataType = m to n
(possibly with a Step clause) both declares the control variable i and specifies its initial and terminating values. In this case, however, the scope of the control variable i is limited to the body of the For ... Next loop. For instance, in Example 1, the two statements
Dim yr As Integer For yr = 2006 to 2010
can be replaced by the single statement
For yr As Integer = 2006 to 2010
In Example 2, the two statements
Dim index as Double For index = 0 to n Step s
can be replaced by the single statement
For index As Double = 0 to n Step s
This feature is new to Visual Basic 2005 and is the preferred way to declare control variables of For... Next loops.
Nested For... Next Loops
The body of a For... Next loop can contain any sequence of Visual Basic statements. In particular, it can contain another For... Next loop. However, the second loop must be completely contained inside the first loop and must have a different control variable. Such a configuration is called nested For...Next loops. Figure 6.8 shows several examples of valid nested loops.
Figure 6.8. Nested For Next loops.
Example 4. (This item is displayed on pages 283 - 284 in the print version)
The following program displays a multiplication table for the integers from 1 to 3. Here j denotes the left factors of the products, and k denotes the right factors. Each factor takes on a value from 1 to 3. The values are assigned to j in the outer loop and to k in the inner loop. Initially, j is assigned the value 1, and then the inner loop is traversed three times to produce the first row of products. At the end of these three passes, the value of j will still be 1, and the value of k will have been incremented to 4. The first execution of the outer loop is then complete. Following this, the statement Next increments the value of j to 2. The statement beginning "For k" is then executed. It resets the value of k to 1. The second row of products is displayed during the next three executions of the inner loop and so on.
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim row, entry As String lstTable.Items.Clear() For j As Integer = 1 To3 row = "" [Run, and press the button.] |
Comments
For and Next statements must be paired. If one is missing, the automatic syntax checker will complain with a wavy underline and a message such as "A 'For' must be paired with a 'Next'."
Consider a loop beginning with For i = m To n Step s. The loop will be executed exactly once if m equals n no matter what value s has. The loop will not be executed at all if m is greater than n and s is positive, or if m is less than n and s is negative.
The value of the control variable should not be altered within the body of the loop; doing so might cause the loop to repeat indefinitely or have an unpredictable number of repetitions.
Noninteger step values can lead to roundoff errors with the result that the loop is not executed the intended number of times. For instance, a loop beginning with For i As Double = 1 To 2 Step .1 will be executed only 10 times instead of the intended 11 times. It should be replaced with For i As Double = 1 To 2.01 Step .1.
Visual Basic provides a way to skip an iteration in a For ... Next loop. When the statement Continue For is encountered in the body of the loop, execution immediately jumps to the Next statement. An analogous statement Continue Do is available for Do loops. This feature is new in Visual Basic 2005.
Visual Basic provides a way to back out of a For ... Next loop. When the statement Exit For is encountered in the body of the loop, execution jumps immediately to the statement following the Next statement. An analogous statement Exit Do is available for Do loops.
Practice Problems 6.3
1. | Why won't the following lines of code work as intended? For i As Integer = 15 To 1 lstBox.Items.AddItem(i) Next
|
2. | When is a For... Next loop more appropriate than a Do loop? |
Exercises 6.3
In Exercises 1 through 12, determine the output displayed in the list box when the button is clicked.
1. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For i As Integer = 1 To 4 lstBox.Items.Add("Pass #"& i) Next End Sub
|
2. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For i As Integer = 3 To 6 lstBox.Items.Add(2 * i) Next End Sub
|
3. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For j As Integer = 2 To 8 Step 2 lstBox.Items.Add(j) Next lstBox.Items.Add("Who do we appreciate?") End Sub |
4. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For countdown As Integer = 10 To 1 Step -1 lstBox.Items.Add(countdown) Next lstBox.Items.Add("blastoff") End Sub
|
5. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim num As Integer num = 5 For i As Integer = num To (2 * num - 3) lstBox.Items.Add(i) Next End Sub
|
6. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For i As Double = 3 To 5 Step .25 lstBox.Items.Add(i) Next lstBox.Items.Add(i) End Sub |
7. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'First entry in text file is number of records in file Dim recCount As Integer Dim name, mileTime As String Dim sr As IO.StreamReader = IO.File.OpenText("MILER.TXT") recCount = CInt(sr.Readline) For miler As Integer = 1 To recCount name = sr.Readline mileTime = sr.Readline lstBox.Items.Add(name & " "& mileTime) Next sr.Close() End Sub (Assume that the seven lines of the file MILER.TXT contain the following entries: 3, Steve Cram, 3:46.31, Steve Scott, 3:51.6, Mary Slaney, 4:20.5.) |
8. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'First entry in text file is number of records in file Dim recCount, total, score As Integer Dim sr As IO.StreamReader = IO.File.OpenText("SCORES.TXT") recCount = CInt(sr.Readline) For i As Integer = 1 To recCount score = CInt(sr.Readline) total += score 'Add the value of score to the value of total Next sr.Close() lstBox.Items.Add("Average = "& total / recCount) End Sub (Assume the file SCORES.TXT contains the entries 4, 89, 85, 88, 98.) |
9. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim row, entry As String For i As Integer = 0 To 2 row = "" For j As Integer = 0 To 3 entry = CStr(i + (3 * j) + 1) row &= entry & " " Next lstBox.Items.Add(row) Next End Sub
|
10. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim row As String For i As Integer = 1 To 5 row = "" For j As Integer = 1 To i row &= "*" Next lstBox.Items.Add(row) Next End Sub |
11. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim word As String Dim num1, num2 As Integer word = InputBox("Please enter a word.") num1 = CInt(Int((20 - word.Length) / 2)) num2 = 20 - num1 - word.Length lstBox.Items.Add(Asterisks(num1) & word & Asterisks(num2)) End Sub Function Asterisks(ByVal num As Integer) As String Dim chain As String = "" For i As Integer = 1 To num chain &= "*" Next Return chain End Function (Assume that the response is Hooray.) |
12. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'Display an array of letters Dim info As String, letter As String info = "DATA" For i As Integer = 1 To info.Length letter = info.Substring(i - 1, 1) lstBox.Items.Add(RepeatFive(letter)) Next End Sub Function RepeatFive(ByVal letter As String) As String Dim chain As String = "" For i As Integer = 1 To 5 chain &= letter Next Return chain End Function
In Exercises 13 through 16, identify the errors. |
13. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For j As Double = 1 To 25.5 Step -1 lstBox.Items.Add(j) Next End Sub
|
14. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For i As Integer = 1 To 3 lstBox.Items.Add(i & " "& 2 ^ i) End Sub |
15. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click 'Display all numbers from 0 through 20 except for 13 For i As Double = 20 To 0 If i = 13 Then i = 12 End If lstBox.Items.Add(i) Next End Sub |
16. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click For j As Integer = 1 To 4 Step 0.5 lstBox.Items.Add(j) Next End Sub In Exercises 17 and 18, rewrite the program using a For ... Next loop. |
17. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click Dim num As Integer = 1 Do While num <= 9 lstBox.Items.Add(num) num += 2 'Add 2 to value of num Loop End Sub
|
18. |
Private Sub btnDisplay_Click(...) Handles btnDisplay.Click lstBox.Items.Add("hello") lstBox.Items.Add("hello") lstBox.Items.Add("hello") lstBox.Items.Add("hello") End Sub
|
In Exercises 19 through 38, write a program to complete the stated task.
19. | Display a row of 10 stars (asterisks). | |||||||||||||||
20. | Request a number from 1 to 20 and display a row of that many stars (asterisks). | |||||||||||||||
21. | Display a 10-by-10 array of stars. | |||||||||||||||
22. | Request a number and call a Sub procedure to display a square having that number of stars on each side. | |||||||||||||||
23. | Find the sum 1 + 1/2 + 1/3 + 1/4 + ... + 1/100 | |||||||||||||||
24. | Find the sum of the odd numbers from 1 through 99. | |||||||||||||||
25. | You are offered two salary options for ten days of work. Option 1: $100 per day. Option 2: $1 the first day, $2 the second day, $4 the third day, and so on, with the amount doubling each day. Write a program to determine which option pays better. | |||||||||||||||
26. | When $1000 is deposited at 5 percent simple interest, the amount grows by $50 each year. When money is invested at 5 percent compound interest, then the amount at the end of each year is 1.05 times the amount at the beginning of that year. Write a program to display the amounts for 10 years for a $1000 deposit at 5 percent simple and compound interest. The first few lines displayed in the list box should appear as in Figure 6.9.
| |||||||||||||||
27. | According to researchers at Stanford Medical School (as cited in Medical Self Care), the ideal weight for a woman is found by multiplying her height in inches by 3.5 and subtracting 108. The ideal weight for a man is found by multiplying his height in inches by 4 and subtracting 128. Request a lower and upper bound for heights and then produce a table giving the ideal weights for women and men in that height range. For example, when a lower bound of 62 and an upper bound of 65 are specified, Figure 6.10 shows the output displayed in the list box.
| |||||||||||||||
28. | Table 6.3 (on the next page) gives data (in millions) on personal computer sales and revenues. Read the data from the file PC.TXT, and generate an extended table with two additional columns, Pct Foreign (percent of personal computers sold outside the United States) and Avg Rev (average revenue per computer sold in the United States). | |||||||||||||||
29. | Request a sentence, and display the number of sibilants (that is, letters S or Z) in the sentence. The counting should be carried out by a function. | |||||||||||||||
30. | Request a number, n, from 1 to 30 and one of the letters S or P. Then, depending upon whether S or P was selected, calculate the sum(s) or product(s) of the numbers from 1 to n. The calculations should be carried out in Function procedures. |
Year | U.S. Sales | Worldwide Sales | U.S. Revenues |
---|---|---|---|
1998 | 34.6 | 98.4 | 74,920 |
1999 | 40.1 | 116.2 | 80,200 |
2000 | 46.0 | 128.5 | 88,110 |
2001 | 43.5 | 132.0 | 77,000 |
31. | Suppose $800 is deposited into a savings account earning 4 percent interest compounded annually, and $100 is added to the account at the end of each year. Calculate the amount of money in the account at the end of 10 years. (Determine a formula for computing the balance at the end of one year based on the balance at the beginning of the year. Then write a program that starts with a balance of $800 and makes 10 passes through a loop containing the formula to produce the final answer.) |
32. | A TV set is purchased with a loan of $563 to be paid off with five monthly payments of $116. The interest rate is 1 percent per month. Display a table giving the balance on the loan at the end of each month. |
33. | Radioactive Decay. Cobalt 60, a radioactive form of cobalt used in cancer therapy, decays or dissipates over a period of time. Each year, 12 percent of the amount present at the beginning of the year will have decayed. If a container of cobalt 60 initially contains 10 grams, determine the amount remaining after five years. |
34. | Supply and Demand. This year's level of production and price (per bushel) for most agricultural products greatly affects the level of production and price next year. Suppose the current crop of soybeans in a certain country is 80 million bushels and experience has shown that for each year, [price this year] = 20 - .1 * [quantity this year] [quantity next year] = 5 * [price this year] - 10, where quantity is measured in units of millions of bushels. Generate a table to show the quantity and price for each of the next 12 years. |
35. | Request a number greater than 3, and display a hollow rectangle similar to the one in Figure 6.11(a) with each outer row and column having that many stars. Use a fixed-width font such as Courier New so that the spaces and asterisks will have the same width. Figure 6.11. Outputs for Exercises 35 and 36.
|
36. | Request an odd number, and display a triangle similar to the one in Figure 6.11(b)with the input number of stars in the top row. |
37. | A man pays $1 to get into a gambling casino. He loses half of his money there and then has to pay $1 to leave. He goes to a second casino, pays another $1 to get in, loses half of his money again, and pays another $1 to leave. Then, he goes to a third casino, pays another $1 to get in, loses half of his money again, and pays another $1 to get out. After this, he's broke. Write a program to determine the amount of money he began with by testing $5, then $6, and so on. |
38. | Create the histogram in Figure 6.12. A file should hold the years and values. The first line in the file could be used to hold the title for the histogram. Figure 6.12. Histogram for Exercise 38.
|
39. | Write a program to estimate how much a young worker will make before retiring at age 65. Request the worker's name, age, and starting salary as input. Assume the worker receives a 5 percent raise each year. For example, if the user enters Helen, 25, and 20000, then the text box should display the following: Helen will earn about $2,415,995 |
40. | Write a program that accepts a word as input and determines if its letters are in alphabetical order. (Test the program with the words "almost," "imply," and "biopsy.") |
Solutions to Practice Problems 6.3
1. | The loop will never be entered because 15 is greater than 1. The intended first line might have been For i = 15 To 1 Step -1
or For i = 1 To 15 |
2. | If the exact number of times the loop will be executed is known before entering the loop, then a For... Next loop should be used. Otherwise, a Do loop is more appropriate. |
Категории