Лабораторные работы по основам программирования

2.1. Табулирование функций, представленных аналитически
и сходящимся рядом

Цель работы

· Закрепление теоретических знаний по основам организации разветвляющихся и циклических структур.

· Приобретение практических навыков программирования с использованием разветвляющихся и циклических структур в системе Visual Basic.

В VB существуют три вида операторов цикла:

· счетный цикл: For…To … Next

· циклы с предусловиями: Do While...Loop, Do Until...Loop, While…WEnd

· циклы с постусловиями:Do...Loop While, Do...Loop Until.

Счетный цикл – позволяет циклически выполнять набор операторов заданное число раз. Его синтаксис следующий:

For счетчик = начало To конец

[операторы ]

[операторы ]

Next [счетчик ]

Параметр счетчик – это числовая переменная (целого, вещественного типа или типа Date, Variant, Currency), которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное параметру – конец. Если не указан, то шаг считается равным 1, значение шага можно изменять. Оно может быть положительным или отрицательным числом.

Существуют четыре синтаксические конструкции цикла Do….Loop:

Операторы между ключевыми словами Do … Loop выполняются заданное количество раз в зависимости от условия. Например, в следующем фрагменте программы при C = 100 условие будет выполняться и произойдет вход в цикл. Внутри цикла происходит обращение к процедуре и уменьшение значения C на 1. Далее вновь проверяется условие (C > 0) и операторы цикла выполняются повторно (всего они выполнятся 100 раз), до C = 0. Когда же условие C >0 становится ложным и цикл прекращается.

Do While C > 0

Тот же самый фрагмент программы, выполненный с использованием цикла с предусловием по синтаксису 2:

В данном случае цикл выполняется, пока условие равно False, в отличие от предыдущего случая, то есть продолжается до выполнения условия C = 0.

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

В синтаксисах этих циклов можно использовать операторы безусловного выхода из цикла Exit For и Exit Do, позволяющих передать управление оператору, находящемуся за циклом. Например, в следующем фрагменте программы, если начальное значение C окажется >50, то цикл немедленно прекратиться.



Do Until C <= 0

MsgBox “Нач. значение больше допустимого”, ”Ошибка ввода”

Цикл While…Wend использовался в ранних версиях Visual Basic. Его синтаксис следующий:

While <условие>

<Операторы>

В отличии от цикла Do..Loop цикл While ..Wend не имеет второго варианта, в котором проверка условия выполняется в конце цикла. Кроме того, для него нет оператора выхода из цикла, наподобие Exit Do.

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each .

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10 Total = Total + iArray(i) Next i

В этом простом цикле For … Next используется переменная i , которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total .

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1 . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step , как показано в следующем простом примере.

For d = 0 To 10 Step 0.1 dTotal = dTotal + d Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1 , то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1 iArray(i) = i Next i

Здесь шаг приращения равен -1 , поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next , но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal . Если совпадение найдено, то цикл прерывается:

For i = 1 To 100 If dValues(i) = dVal Then IndexVal = i Exit For End If Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub , в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

"Процедура Sub выводит числа Фибоначчи, не превышающие 1000 Sub Fibonacci() Dim i As Integer "счётчик для обозначения позиции элемента в последовательности Dim iFib As Integer "хранит текущее значение последовательности Dim iFib_Next As Integer "хранит следующее значение последовательности Dim iStep As Integer "хранит размер следующего приращения "инициализируем переменные i и iFib_Next i = 1 iFib_Next = 0 "цикл Do While будет выполняться до тех пор, пока значение "текущего числа Фибоначчи не превысит 1000 Do While iFib_Next < 1000 If i = 1 Then "особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else "сохраняем размер следующего приращения перед тем, как перезаписать "текущее значение последовательности iStep = iFib iFib = iFib_Next End If "выводим текущее число Фибоначчи в столбце A активного рабочего листа "в строке с индексом i Cells(i, 1).Value = iFib "вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do ... Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While : блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True ). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

IRow = 1 Do Until IsEmpty(Cells(iRow, 1)) "Значение текущей ячейки сохраняется в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until , следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

Однако, как было показано в примерах цикла Do While , в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:

Do ... Loop Until IsEmpty(Cells(iRow, 1))

Урок из серии: «Программирование на Visual Basic.NEN для школьников»

Вы познакомились с элементом управления ComboBox (Комбинированный список).
На этом занятии мы продолжим изучение операторов языка Visual Basic.Net, остановимся на операторах цикла.
Циклические алгоритмические структуры бывают трех видов:

  1. циклы со счетчиком, в которых тело цикла выполняется определенное количество раз;
  2. циклы для обработки массивов или коллекций;
  3. циклы по условию, в которых тело цикла выполняется, пока условие истинно (или до тех пор, пока условие не станет истинным).

На этом уроке рассмотрим оператор цикла со счетчиком (For . . . Next). Напишем проект с использованием этого оператора.

Цикл со счетчиком For . . . Nex t используется тогда, когда заранее известно, какое число повторений необходимо выполнить.

Блок-схема

Общий вид оператора

For Счетчик = НачЗнач To КонЗнач Тело цикла Next [Счетчик]

Синтаксис оператора следующий: строка, начинающаяся с ключевого слова For, является заголовком цикла, а строка с ключевым словом Next — концом цикла, между ними располагаются операторы, являющиеся телом цикла.

Алгоритм выполнения оператора For . . . Next

  1. Значение переменной Счетчик устанавливается равным НачЗнач.
  2. Проверяется условие Счетчик <= КонЗнач
  3. Если условие выполняется, то выполняется тело цикла. Переменная Счетчик изменяется на величину шага: Счетчик = Счетчик + шаг.
  4. Когда переменная Счетчик достигает величины КонЗнач, происходит выход из цикла и выполняются следующие за ним операторы.

Преждевременный выход из цикла программист может организовать при помощи конструкции Exit For. При этом происходит автоматический выход из цикла и управление передается следующей за циклом команде.

Проект «Доход по вкладу»

Написать проект, который начисляет доход по вкладу, обеспечивает расчет простых и сложных процентов. Простые проценты начисляются в конце срока вклада, сложные — ежемесячно и прибавляются к первоначальной сумме вклада и в следующем месяце проценты начисляются на новую сумму. Рекомендуемый вид формы приведен на рисунке.

Технология выполнения

В этом уроке было показано, как использовать цикл For…Next для повторения кода заданное число раз.

Алгоритм цикла For….Next приведен на рис. 5.28.

Counter – любая численная переменная VBA, обычно переменная типа Integer или Long.

Start - любое численное выражение и определяет начальное значение для переменной Counter.

End – численное выражение, определяющее конечное значение для переменной Counter .

Statements – один, несколько или ни одного оператора. Эти операторы выполняют тело цикла. VBA выполняет каждый из этих операторов при каждом выполнении цикла.

Ключевое слово Next

Counter=counter+StepSise

Рис.9.28. Алгоритм цикла For….Next

Ключевое слово Next сообщает VBA о том, что достигнут конец цикла. Не обязательная переменная Counter поcле ключевого слова Next должна быть той же самой переменной Counter, которая была задана после ключевого слова For начале структуры цикла.

Синтаксис :

For counter = Start To End

При выполнении цикла For Next VBA поступает следующим образом:

Присваивает значение, представленное Star , переменной С ounter .

Выполняет все операторы, представленные с помощью Statements , пока не достигнет ключевого слова Next . Ключевое слово Next показывает VBA на то, что достигнут конец тела цикла.

Изменяет переменную С ounter на величину StepSize (если включается необязательное слово Step) Если Step не определено, то VBA увеличивает переменную counter на 1.

Возвращается к началу цикла и сравнивает текущее значение переменной С ounter со значением, представленным End. Если значение С ounter меньше значения End , VBA продолжает выполнение с первого оператора после ключевого слова Next .

9.2.4. Ввод-вывод одномерных и двухмерных массивов

Массив (array ) – это коллекция переменных, которые имеют общее имя и базовый тип. Массив является удобным способом хранения нескольких связанных элементов данных в едином контейнере для большего удобства и эффективности программирования. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Кроме уменьшения общего числа различных имен переменных, которые необходимо отслеживать, другим основным преимуществом использования массивов является то, что можно использовать циклы для легкой обработки различных элементов массивов. Объединяя массивы и структуры цикла (обычно For….Next) можно написать небольшое число операторов, которые обрабатывают большой объем данных. Выполнение тех же задач с использованием отдельных переменных может потребовать написания сотен операторов.

Размерность массива

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

Одномерные массивы

Пример одномерного массива приведен в таблице № 9.9.

Таблица № 9.9

В программировании обычно используется нумерация с нулевой базой.

Для доступа к данным, хранящимся в определенном элементе массива, следует указывать имя массива с последующим числом, называемым индексом элемента. Индекс заключают в круглые скобки. Например, если массив в таблице № 1.1 имеет имя DoubleArray, то следующий оператор присваивает число 45 переменной DoubleAny.

DoubleAny = DoubleArray (3)

В этом операторе число 3 является индексом массива. Поскольку нумерация элементов начинается с нуля, элемент, на который ссылается оператор, является, фактически, четвертым элементом массива DoubleArray.

При выполнении оператора DoubleArray, VBA выбирает значение 45 и сохраняет это значение в переменной DoubleArray.

Этот же оператор можно использовать при сохранении данных в массиве:

DoubleArray (5)=12.

При выполнении этого оператора VBA помещает значение 12 в указанных элемент массива, заменяя предыдущее содержимое этого элемента.

Одномерные массивы обычно используются для представления различных списков данных.

Многомерные массивы

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

В двумерном массиве адрес каждой ячейки состоит из двух чисел: номер строки (первый индекс) и номер столбца (второй индекс). В VBA можно создавать массивы до 60 измерений.

Если в массиве число элементов не меняется, то такой массив называется статическим.

Статические и динамические массивы

Если при выполнении VBA-программы можно изменять число элементов в массиве, то такие массивы называются динамическими. Для изменения размера динамического массива используется оператор ReDim.

VBA сохраняет зарезервированной область памяти для всех элементов в массиве, пока существует переменная типа массива. Подобные массивы называются статическими (static), потому что число элементов в массиве не меняется.

Оператор Option Base

Обычно в VBA используются массивы с нулевой базой. Оператор Option Base позволяет задавать 0 или 1 как начальное число по умолчанию для индексов массива. Если оператор Option Base не используется, VBA начинает нумерацию индексов с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлением любых переменных, констант или процедур. Нельзя помещать оператор Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле.

Синтаксис:

Option Base 0|1

Объявление массивов

Объявление массива с помощью оператора Dim имеет следующий синтаксис.

Синтаксис:

Dim VarName ()

Dim VarName ( upper, upper]….) [ As type ],

VarName – любое имя для массива, удовлетворяющее VBA-правилам для имен идентификаторам.

Subscripts – измерение массива.

As Type – тип данных.

Lower – нижняя граница значения индекса.

Upper – верхняя граница значения индекса.

Type – тип данных

Если опустить тип, все элементы массива будут иметь тип Variant. VBA инициализирует элементы числовых массивов нулями и элементы строковых массивов пустыми строками.

Dim str_array (1 To 100) As String

Dim variant_array ()

Dim str_Multiplication (0 To 15, 0 To 15) As String

Использование массивов

Для доступа к элементу массива необходимо указать имя массива, за которым следует значение индекса, заключенное в круглые скобки.

Обращение к элементу массива имеет следующий синтаксис.

Синтаксис.

arrayName (validIndex1, ….)

validIndex – имя массива.

validIndex1 – допустимое значение индекса для первого измерения массива.

validIndex2 – допустимое значение индекса для второго измерения массива.

Необходимо предоставлять значение индекса для каждого измерения массива при каждом обращении к какому-либо элементу массива.

Ввод-вывод одномерных массивов

При вводе одномерного массива необходимо последовательно вводить 1-й, 2-й и т.д. элементы массива, аналогично поступают при выводе. Для ввода или вывода массива необходимо организовать цикл. Наиболее удобно использовать для ввода и вывода одномерного массива алгоритм с использованием безусловного цикла.

Алгоритм ввода вывода одномерного массива приведен на рис.5.29.

Расшифровка процедуры приведена ниже.

Sub Massiv () – название процедуры.

Dim Mas (5) As Integer - объявили одномерный массив с 5-ю элементами, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения.

For i = 1 To 5 – процедура в первом цикле For….Next, принимает целые числа от 1 до 5 и заносит их в массив.

Mas (i) = InputBox (i) – ввод целого числа для i-го элемента.

Next – переход ко второму циклу (элементы массива заносятся в строку и выводятся на экран в диалоговом окне с помощью оператора MsgBox).

For i = 1 To 5 – элементы в строке с 1 по 5.

s = s & Mas(i) & “ ;” - формирование строки из элементов массива. Массив выводится в одну строку. Элементы массива разделяются символом “ ;”.

MsgBox s – вывод ранее введенного массива.

Рис.5.27. Алгоритм ввода-вывода одномерного

Рис. 9.29. Алгоритм и процедура ввода-вывода одномерного массива

Ввод-вывод двухмерного массива

Алгоритм и процедура ввода и вывода двухмерного массива представлен на рис.5.30.

Описание данной процедуры:

Sub Massiv () – название процедуры

Объявление переменных, которые используются в данной процедуре:

Dim Mas (5, 5) As Integer - объявили двухмерный массив с 5 столбцами и пятью строками, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения

Next i – окончание операции присвоения переменных

Ввод элементов массива в память компьютера:

For i = 1 To 5 – ввод осуществляется с первого элемента первой строки, потом со второго и т.д.

For j = 1 To 5 до конца первой строки, потом с первого элемента второй строки и т.д.

Mas(i,j) = InputBox(i,j) – оператор ввода элементов массива в память ЭВМ

Рис. 9.30. Алгоритм и процедура ввода-вывода двухмерного массива

Алгоритмы упорядочения массива

В качестве примера приведем алгоритм и процедуру сортировки одномерного массива методом «пузырька»

Вывод элементов введенного массива из памяти ЭВМ:

For i = 1 To 5 – вывод осуществляется аналогично вводу

s = s & Mas (i,j) & “ ; ”

s = s & Chr (13) – перевод строки (вывод не одной строкой, а несколькими, как в введенном массиве)

Next i – окончание действия оператора For….Next

MsgBox s – вывод ранее введенного массива на диалоговое окно

End Sub – окончание процедуры.

Синтаксис оператора:

For Счетчик = Начало Т o Конец [Step Шаг ]

Блок_Операторов

Next Счетчик

Здесь обозначено:

For для (обязательное ключевое словоVB);

To до (обязательное ключевое словоVB);

Блок_Операторов – один или несколько операторов, называемыхтелом цикла;

Счетчик – целая переменная, которая считает количество выполняемых циклов;

Начало, Конец – начальное и конечное значения счетчика;

Step шаг (ключевое словоVB);

Шаг – шаг изменения счетчика; может быть и отрицательным; параметр необязательный, так как если шаг равен 1, можноStepШаг опустить;

Next– следующий (обязательное ключевое словоVB, конец записи оператора цикла).

Значение счетчика (Начало, Конец) могут быть численными константами или переменными целого или вещественного типа, могут быть отрицательными или положительными числами. Чтобы тело цикла выполнилось хотя бы один раз, должно бытьНачало ≤ Конец, еслиШаг > 0, иНачало ≥ Конец, еслиШаг < 0. Как только окажется, чтоСчетчик >Конец (если Начало < Конец), выполнение цикла заканчивается. ЕслиНачало = Конец, цикл выполнится один раз;

Пример 9.1 .Вычисление функции Y = 2 – 1.5 Sinx при изменении Х с шагом 0.2 в диапазоне .

Фрагмент программы по вычислению Yи вывода аргумента Х и функцииY:

For X = 0 To 2.4 Step 0.2

Y = 2 – 1.5*Sin(X)

Чтобы понять, как работает этот цикл, приведем программу подобного цикла, созданного с помощью оператора GoTo , меток, оператора If Then .

M1: X = X + 0.2

If X <= 2.4 Then

Y = 2 – 1.5*Sin(X)

Разберем работу этой программы. Первый расчет Yнестандартный, как бы выпадает из цикла. Цикл начинается после первой передачи управленияGoToM1 на метку М1. В строке с меткой М1 аргумент Х увеличивается на шаг 0.2 и сразу идет проверка, не превышает ли новое значение Х конечного значения 2.4. Если не превышает, то расчетYповторяется с этим новым Х. Потом снова выполняется операторGoToM1 – передача управление в строку с меткой М1. Эти повторы (циклы) расчетаYзакончатся, как только Х превысит 2.4.

Теперь программу с Ifсравним с цикломFor…Next.

For X = 0 To 2.4 Step 0.2

заменяет собой две строки

M1: X = X + 0.2

If X <= 2.4 Then

Именно две последние строки кода выполняются в цикле For, но мы этого не видим. Мы закодировали их строкой сFor… Строка кодаGoTo M1 закодирована словомNext X (буквально: следующий Х). Получается компактная конструкция.

При использовании цикла For…Nextнадо научиться использовать счетчик цикла при решении различных задач. Чтобы сообразить, как можно использовать счетчик для решения задачи, надопровести анализ постановки задачи, найти закономерности изменения некоторых параметров задачи.

Пример 9.2 . Определение суммы элементов ряда: .

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 16 ‘ счетчик i – это знаменатель дроби

S = S + 1/i ‘ накопление суммы

Print “ S = “; S ‘ вывод суммы S на форму

При каждом значении счетчика iвыражение 1/iпоследовательно формирует элементы ряда, начиная с 1.

Пример 9.3 . Вычисление суммы ряда элементов
.

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 18 ‘ счетчик i – числитель

S = S + i/(i + 1) ‘ знаменатель больше числителя на 1

Print “ S = “; S ‘ вывод суммы S на форму

Пример 9.4 . Вычисление суммы: 5 + 8 + 11 + … + 32 + 35

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 5 To 35 Step 3 ‘ получаем арифметическую _

прогрессию со знаменателем 3

Print “ S = “; S

Пример 9.5. Вычисление суммы для заданного х:

Анализ задачи показывает, что степень при Х изменяется от 1 до 10. При этом числитель в коэффициенте при Х больше степени на 1, а знаменатель – на 2. Значение степени будем формировать с помощью счетчика i. Тогда можно составить такую программу (фрагмент):

S = 1 ‘ S – сумма ряда

For i = 1 To 10 ‘ как счетчик i, изменяется степень при Х

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

Print “ S = “; S

Циклы For Next используются при вводе, выводе и обработке массивов .

Пример 9.6. Ввод и вывод значений элементов массива В(N ).

Фрагмент программы:

‘ Опускаем присваивание переменной N значения, _

введенного на форме в текстовое поле txtN:

B(i) = InputBox("Введите элемент B(" & i & ")", _

"Ввод массива B(" & N & “)”)

Print " "; B(i);

Функция InputBox () выводит на экран диалоговое окно с кнопкой закрытия, заданным сообщением, полем ввода, кнопкамиОК ,Отмена, заданным заголовком (или без него). Если будет введено число 12 – размер массиваN, то в нашем примере при первом появлении это окно будет иметь вид:

Как видим, сообщение Введите элемент В(1) предлагает ввести значение 1-го элемента в текстовое окно. Появится это окно 12 раз, так как массив содержит 12 элементов. Это следует из заголовка формы. Индекс элемента В(i) в приглашении будет меняться от 1 до 12.

Если требуется вывести на форму только значения элементов массива В(N), то тело цикла будет состоять из одного оператора:

Просмотр элементов массива для совершения над ними каких-то действий также происходит с помощью оператора цикла For…Next.

Приведем примеры обработки одномерных массивов.

Пример 9.7 . Определение максимального элемента в массиве В(M ).

Исключая ввод начальных данных и вывод результатов, кратко опишем алгоритм:

    Объявим переменную Вmaх, в которую занесем значение первого элемента массива, и переменнуюImax, которой присвоим 1 – индекс первого элемента массива.

    В цикле с помощью оператора For…Nextпросматриваем все элементы массива, начиная со 2-го. Используя операторIf…Then, сравниваем их значения со значением, которое хранится в переменнойBmax.

    Если окажется, что значение элемента массива больше величины Bmax, тоBmaxприсваиваем значение этого элемента, а значениюImax– индекс этого элемента массива.

После окончания цикла в переменной Bmaxокажется значение максимального элемента, а вImax– его индекс (номер).

Программа этой части алгоритма.

Bmax = B(1): Imax = 1

If B(i) > Bmax Then Bmax = B(i): Imax = i

Пример 9.8. Определение суммы, произведения и количества положительных элементов массива D (M ).

Переменные: S,P,K– соответственно сумма, произведение и количество положительных элементов.

Алгоритм такого определения:

    Присваиваем ноль переменной Sи К, переменнойPприсваиваем 1. Как правило, всегда переменные, где накапливается сумма, здесь этоSиk, перед циклом обнуляются, а переменным, в которых вычисляется произведение, присваивается 1.

    С помощью цикла For…Nextперебираем все элементы массива и проверяем положительные ли они (D(i) > 0).

    Если окажется, что элемент – положительный, то прибавляем его значение к значению суммы Sи сохраняем новую сумму в этой же переменной. ПеременнуюPумножаем на положительное значение элемента и сохраняем также в переменнойP. А к переменнойKприбавляем 1 и сохраняем новое значение в этой же переменной

Программа этой части алгоритма имеет вид:

S = 0: P = 1: K = 0

If D(i) > 0 Then

S = S + D(i) ‘ так происходит накопление суммы _

положительных значений элементов массива D(i)

P = P*D(i) ‘ определение произведения положительных

‘ элементов массива

K = K + 1 ‘ этот оператор называют СЧЕТЧИКОМ, здесь он

‘ определяет количество положительных элементов массива

Пример 9.9. Определение суммы, произведения, количества и среднего значения нечетных элементов массива D (M ).

Приведем фрагмент программы такого определения.

S = 0: P = 1: K = 0

If D(i) Mod 2 <> 0 Then

Ssr = S/k ‘ вычисление среднего значения нечетных элементов

Сравните этот фрагмент программы с программой Примера 9.8. Эта программа почти полностью повторяет предыдущую. Изменено только условие в операторе If. УсловиеD(i) Mod 2 <> 0 означает, что мы ищем элементы массиваD(i), которые не делятся нацело на 2, т. е. нечетные элементы. Если будем проверять условиеD(i) Mod 2 = 0, то мы будем отбирать четные элементы массива.

Как известно, деление по Mod даетв результате остаток от деления в целых числах. Например, после выполнения оператораd= 34Mod4 переменнаяdбудет равна 2. Поэтому для отбора элементов массива, которые кратны 4, надо проверять условиеD(i) Mod 4 = 0. Аналогичным будет условие, если будем искать элементы, кратные другим числам. Вместо 4 будут записаны эти другие числа.

Пример 9.10. Запись элементов массива R (N ), кратных 5, в другой массив и вывод нового массива на форму.

Другой массив обозначим, например, R5(N). Размер этого нового массива следует принять таким же, как исходный, т. к. в предельном случае все элементы могут быть кратными 5.

Алгоритм задачи:

    Обнуляем счетчик k. С помощью оператора циклаFor…Nextпросматриваем все элементы массиваR(N).

    Каждый элемент проверяем на кратность 5, используя оператор If…Thenи деление элемента массива поMod.

    Если элемент кратен 5, то с помощью счетчика типа k=k+ 1 формируем индексы массиваR5(N), начиная с 1, и записываем его в этот другой массив –R5(N).

    Если kотлично от нуля, выводим массивR5() на форму.

    Если же kравно нулю выводим: «Нет элементов, кратных 5».

Фрагмент программы:

If R(i) Mod 5 Then k = k + 1: R5(k) = R(i)

If k <> 0 Then

Print “Нет элементов, кратных 5”

Циклы могут быть вложенными в другие циклы.

Продемонстрируем работу вложенных циклов . Ниже в программе организован вывод значений счетчиков цикловi,jиk. Из результатов выводаi,j,kстановится понятно, как выполняются вложенные циклы.

Private Sub frmCycle_DblClick()

ScaleMode = 4 ‘единицы измерения – символы

For i = 1 To 3 ‘внешний цикл

Print "i = "; i;

For j = 1 To 4 ‘1-й вложенный цикл

CurrentX = TextWidth("i = 1 ") + 5

Print "j = "; j;

CurrentX = TextWidth("i = 1 j = 1 ") + 7

For k = 1 To 5 ‘2-й вложенный цикл

На изображенной форме (рис. 1) приведены результаты вывода счетчиков всех трех циклов: внешнего цикла – счетчик i, первого вложенного цикла – счетчикjи второго, самого внутреннего цикла – счетчикk. Как видим,самый «медленный» счетчик у внешнего цикла (поi), асамый «быстрый» – счетчик самого внутреннего цикла (по k ).

Программа выполняется после двойного щелчка левой кнопкой мыши по форме frmCicli.

CurrentX, CurrentY – свойства формы, задающие координатыX,Yточки начала вывода информации методомPrint(см. на рис.1 расположение осейXиYна форме).

TextWidth() – функция, возвращающая ширину текста, заданного в функции как аргумент в двойных кавычках.

Вложенные циклы используются при обработке двумерных массивов (матриц). Но в некоторых задачах, исключая ввод и вывод элементов двумерного массива, можно ограничиться и одним циклом. Рассмотрим некоторые примеры программирования матриц.

Пример 9.11. Ввод и вывод матрицы (двумерного массива) целых чисел intA (N ).

Вводить матрицу можно по строкам и по столбцам . Проще – по строкам, если будет программироваться вывод элементов массива на форму сразу после их ввода.

Ввод и вывод матрицы по строкам – фрагмент 1 .

Dim M As Integer, N As Integer, i As Integer, j As Integer

Dim intA() As Integer ‘ объявляем динамический массив

M = Val(txtN.Text) ‘ M – количество строк

N = Val(txtN.Text) ‘ N – количество столбцов

ReDim intA(M, N) As Integer ‘ переопределяем массив

For i = 1 To M ‘ i будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по j

Print " "; intA(i, j); ‘ вывод по строкам

Print ‘ переход в начало новой строки

Чтобы вводить матрицу по столбцам, следует внешним сделать цикл по j(задает номера столбцов), а внутренним – цикл поi(задает номера строк).

Ввод и вывод матрицы по столбцам фрагмент 2 .

PrY = 2500: CurrentY = PrY ‘ PrY задает координату Y начала

‘ вывода первого элемента каждого столбца на форме

For j = 1 To N ‘ j будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по i

intA (i, j) = InputBox("Введите элемент intA(" & i & “,” & j & ")", _

"Ввод матрицы intA(" & M & “,” & N & ")")

Print Tab(6 * j); intA(i, j) ‘ вывод по столбцам

CurrentY = PrY ‘ для вывода первого элемента

‘ следующего столбца

В этом втором фрагменте программы не повторяются 5 первых строк из первого фрагмента. Функция Tab(6 * j) устанавливает начало вывода в строке (в символах), начиная от левого края формы. КоординатаPrYздесь равна 2500 твипов, но можно подобрать и другое значение.

Пример 9.12 . Упорядочивание значений элементов массива V (N ) по возрастанию.

Существуют несколько алгоритмов по упорядочиванию массивов. Приведем один из них: с помощью вложенных циклов For Next выбираем элементы, начиная с первого и до предпоследнего, и сравниваем каждый из них с последующими элементами; если окажется, что последующий элемент меньше выбранного, меняем их местами.

Фрагмент программы, реализующей этот алгоритм:

For i = 1 To N – 1

For j = i + 1 To N

If V(j) < V(i) Then P = V(i): V(i) = V(j): V(j) = P

Поясним этот фрагмент программы.

С помощью внешнего цикла со счетчиком iвыбираем элементV(i) для сравнения с последующими элементами. Внутренний цикл со счетчикомjвыбирает для сравнения последующие элементыV(j). Начальное значениеjравноi+ 1. Это первый элемент из последующих.

Для обмена значений элементов V(i) иV(j) вводим некоторую переменнуюP, в которую временно «прячем» значение одного из элементов массива (в программе – этоV(i)). Затем элементу V(i) присваиваем значение элементаV(j), а элементуV(j) присваиваем значениеV(i), которое хранится в переменнойP. Если «спрячем» вPзначениеV(j), то код по обмену значениями будет таким:P = V(j): V(j) = V(i): V(i) = P. Результат не изменится.

Чтобы упорядочить массив по убыванию , достаточно условие для проверки написать в видеV(j) > V(i), т. е. изменить знак неравенства на другой.

Если массив будет не числовой, а строковый, и в элементы массива будут введены фамилии, то по программе примера 9.12, можно упорядочить список фамилий по алфавиту. Дело в том, что для букв алфавита, используемых в компьютере, справедливы неравенства: А < Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Пример 9.13 . Вычисление суммы положительных элементов для нечетных столбцов матрицы F (M , N ) и вывод сумм на форму.

Алгоритм программы:

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

    Обнуляем сумму S, в которой будет накапливаться сумма положительных элементов.

    Во внутреннем цикле проверяем знак элемента массива.

    Если элемент массива положителен (> 0), вычисляем сумму S.

    После окончания внутреннего цикла выводим сумму Sна форму.

Фрагмент программы :

For j = 1 To N Step 2

If F(i, j) > 0 Then S = S + F(i, j)

Print “Сумма столбца “; j; “:”; S ‘ j – номер столбца!

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

Пример 9.14. Имеется 1801 руб. Сколько можно купить шоколадок по 31 руб. и булок по 18 руб., чтобы полностью потратить все деньги.

Программа:

Сумма = 1801

ВсеШоколадки = Сумма \ 31: ВсеБулки = Сумма \ 18

For i = 1 To ВсеШоколадки

For j = 1 To ВсеБулки

Цена = i * 31 + j * 18 ‘общая цена покупки

If Цена = 1801 Then

Print "Шоколадок: "; i; Tab(19); "Булок: "; j

Поясним программу, в которой используем переменные, названные по-русски.

Сначала определяем, какое максимальное количество только шоколадок или только булок можно купить на всю сумму. Полученные значения ВсеШоколадки и ВсеБулки используем для ограничения количеств переборов по количеству шоколадок и булок. Для каждых значений количества шоколадок (i) и количество булок (j) определяем общую Цену для их покупки. Если рассчитанная Цена равна 1801, то подобранный вариант есть одно из решений задачи.

Функция Tab() указывает, с какой позиции от края формы будет вывод информации, следующий за этой функцией. ЕслиTab(19), то с 19-ой позиции.

Программа выводит 3 возможных вариантов покупки:

Шоколадок 7, булок 88

Шоколадок 25, булок 57

Шоколадок 43, булок 26

Если требуется дать однозначный ответ, надо сформулировать дополнительное условие. Например, «булок было куплено меньше, чем шоколадок». Тогда единственным решением будет 3-й вариант.

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