Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Понятно о Visual Basic.NET. Самоучитель.Ч2.2005...docx
Скачиваний:
46
Добавлен:
25.11.2019
Размер:
4.02 Mб
Скачать
      1. Вложенные циклы – «Таблица умножения»

Вложенные циклы или «цикл внутри цикла» – весьма распространенная конструкция при программировании.

Поставим себе задачу – вычислить и напечатать таблицу умножения (см. Рис. 10 .28).

Рис. 10.28

Сразу же рисовать прямоугольники и писать на форме нам будет сложно, поэтому пока будем печатать таблицу в окне Output при помощи оператора Debug.Write.

Начнем с малого – пусть нужно напечатать

1*1=1

Вот фрагмент программы:

Фрагмент 1

a = 1

b = 1

proizv = a * b

Debug.Write (a & "*" & b & "=" & proizv)

Здесь в операторе Debug.WriteLine 5 элементов:

  1. сомножитель a

  2. символ знака умножения "*"

  3. сомножитель b

  4. символ "="

  5. произведение proizv

Я намеренно ввел во фрагмент максимально возможное число переменных, так как предвижу, что фрагмент станет сердцем более сложной программы для вычисления всей таблицы, где сомножители меняются.

Печатаем строку. Попробуем заставить компьютер напечатать первый ряд таблицы:

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 1*10=10

Замечаем, что здесь нам нужно решить 10 элементарных задач на вычисление произведения, первую из которых решает фрагмент 1. Все они очень похожи и различаются лишь значением второго сомножителя. Таким образом, для решения каждой из 10 задач подошел бы наш фрагмент 1, если бы в нем в операторе b=1 вместо единицы стояло нужное число. В данном случае идеально подходит оператор For:

Фрагмент 2

a = 1

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Обратите внимание, что для пробела между столбцами будущей таблицы в оператор Debug.Write добавился 6-й элемент – " ".

Прокрутите программу в пошаговом режиме.

Обратите внимание, что если бы я не использовал во фрагменте 1 переменную b, то фрагмент 2 просто не получился бы.

Мы предвидим, что скоро таких рядов нужно будет печатать десяток, поэтому для того, чтобы каждый следующий ряд печатался с новой строки, добавим во фрагмент 2 оператор Debug.WriteLine(""), все назначение которого – перевести строку, когда ряд напечатан (он сам ничего не печатает, ведь между кавычками – пусто).

Фрагмент 3

a = 1

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Debug.WriteLine("")

Печатаем всю таблицу. Следующая ступень усложнения – последняя – напечатать не один ряд таблицы, а десять. Для этого фрагмент 3 должен быть выполнен 10 раз, каждый раз – с новым значением a. Чтобы этого достичь, «обнимем» фрагмент 3 оператором For точно так же, как мы обнимали фрагмент 1.

Программа

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim a, b, proizv As Integer

For a = 1 To 10

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Debug.WriteLine("")

Next

End Sub

Прокрутите программу в пошаговом режиме, для удобства заменив 10 на 4. Прочувствуйте, что пустой Debug.WriteLine("") мы поместили именно в нужное место, строчкой выше или ниже он все бы испортил.

Вот результат. Пока в таком неприглядном виде:

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 1*10=10

2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 2*10=20

3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 3*10=30

4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 4*10=40

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 5*10=50

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 6*10=60

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 7*10=70

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 8*10=80

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 9*10=90

10*1=10 10*2=20 10*3=30 10*4=40 10*5=50 10*6=60 10*7=70 10*8=80 10*9=90 10*10=100

Как видите, печатает фрагмент 4 плохо. Аккуратных столбцов не получается. А нам и не очень хотелось. Задачу создания красивой таблицы умножения я вынес в Задание 57..

В целом программа иллюстрирует идею вложенных циклов, когда один, внутренний, цикл вложен внутрь другого, внешнего. У нас тело внешнего цикла выполняется 10 раз, а тело внутреннего – 100 раз, так как на каждое выполнение внешнего цикла он выполняется 10 раз.

Нельзя. Бессмысленно и нельзя переменные внешнего и внутреннего цикла называть одним именем. Так, следующий фрагмент

Dim i, a As Integer

For i = 1 To 10

For i = 1 To 10

a = 0

Next

Next

не пройдет. Переменная i во внутреннем цикле будет подчеркнута. Вообще, не рекомендуется внутри цикла как-то менять ее переменную.

А. Распечатать все возможные сочетания из двух цифр – первая цифра может быть любой от 3 до 8, вторая - любой от 0 до 7. Например, 36, 44, 80.

Б. Распечатать все возможные сочетания из четырех цифр, каждая из которых может принимать значения 1,2,3. Например, 2123, 3312, 1111. Получилось? А теперь подсчитайте количество таких сочетаний.

В. Подсчитать из них количество неубывающих сочетаний, то есть таких, где каждая следующая цифра не меньше предыдущей – 1123, 1223, 2222 и т.п., но не 3322. Распечатать все такие сочетания.