ПОНЯТНО О Visual Basic NET (том 2)

Вложенные циклы – «Таблица умножения»


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

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

Рис. 10.3

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

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

1*1=1

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

Фрагмент 1

        a = 1

        b = 1

        proizv = a * b

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



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

* сомножитель  a  

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

*        сомножитель  b 

*        символ  "="

*        произведение  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-й элемент – " ".

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


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 плохо. Аккуратных столбцов не получается. А нам и не очень хотелось. Задачу создания красивой таблицы умножения я вынес в Задание 72.
В целом программа иллюстрирует идею вложенных циклов, когда один, внутренний, цикл вложен внутрь другого, внешнего. У нас тело внешнего цикла выполняется 10 раз, а тело внутреннего  – 100 раз, так как на каждое выполнение внешнего цикла он выполняется 10 раз.
Нельзя. Бессмысленно и нельзя переменные внешнего и внутреннего цикла называть одним именем. Так, следующий фрагмент
        Dim i, a As Integer
        For i = 1 To 10
            For i = 1 To 10
                a = 0
            Next
        Next
не пройдет. Переменная i во внутреннем цикле будет подчеркнута. Вообще, не рекомендуется внутри цикла как-то менять ее переменную.
Задание 54.        
А. Распечатать все возможные сочетания из двух цифр – первая цифра может быть любой от 3 до 8, вторая - любой от 0 до 7. Например, 36, 44, 80.
Б. Распечатать все возможные сочетания из четырех цифр, каждая из которых может принимать значения 1,2,3. Например, 2123, 3312, 1111. Получилось? А теперь подсчитайте количество таких сочетаний.
В. Подсчитать из них количество неубывающих сочетаний, то есть таких, где каждая следующая цифра не меньше предыдущей – 1123, 1223, 2222 и т.п., но не 3322. Распечатать все такие сочетания.

Содержание раздела