Алгоритмизация и программирование задач с использованием одномерных массивов
Цель:
освоить основные приемы программирования при использовании переменной с индексом.
Результат обучения:
o знать синтаксис объявления массива;
o знать правила записи переменной с индексом;
o знать алгоритмы ввода/вывода одномерного массива;
o уметь программировать задачи по обработке одномерных массивов.
Изучение приемов программирования задач с использованием одномерных массивов
Массив представляет собой набор однотипных элементов. Переменная массив имеет одно имя (например, а), а каждый элемент массива имеет свой порядковый номер, называемый индексом: a(1), a(2), a(3), …, a(n).
Массив, в котором положение элемента определяется одним индексом, называется одномерным. В математике аналогом такой структуры является вектор — .
Индексом может быть произвольное выражение порядкового типа, заключенное в скобки. Например, Sum(True]), Vect( i + 1 ).
Обработка массивов производится путем изменения индексов компонент. То есть имеется способ перехода от одного элемента массива к другому путем изменения индекса. Тот факт, что индекс может быть вычисляемым объектом, выделяет массив среди многих других структур данных.
Описать массив можно в начале программы. Названия массивов и их размеры определяет пользователь. Таким образом, резервируется память, где будут размещаться элементы массивов. Общий вид команды описания массивов следующий:
Dim <список массивов>
Например:
Dim SomeArr (100) As Single, a(5) As Integer, F(20) As String
В списке массивов указывают имена массивов и максимальные значения соответствующих индексов. Массивы перечисляют через запятую.
Во всех версиях языка Бейсик по умолчанию минимальное значение индекса равно нулю. В приведенном примере массив SomeArr может иметь 101 элемент, индексы которого изменяются от 0 до 100. Можно задать нужное минимальное значение индекса в начале программы с помощью команды
Option base <константа>
Константа определяет минимальное значение индекса. Например, команды
Option base 1985
Dim DD (2010)
описывают массив с двадцатью пятью элементами, а индекс приобретает значение некоторого числа из диапазона 1985 … 2010.
Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не надо указывать размерность, например:
Dim R() As Single
Затем в программе следует вычислить необходимый размер массива в некоторой переменной, например n, и изменить размер динамического массива с помощью оператора ReDim.
Рассмотрим практические примеры работы с массивами.
Пример 1.
Условие задачи:
Написать программу, которая вычисляет среднее арифметическое значений элементов одномерного массива.
Схема алгоритма:
При обработке массивов часто используется структура «цикл с параметром», так как индекс массива представляет собой счетчик и изменяется с шагом, равным 1.
Форма
Программа
Private Sub CommandButton1_Click()
Dim a() As Single
Dim n As Integer, S As Single, i As Integer
n = Val(TextBox1.Text) 'Ввод кол-ва элементов массива
ReDim a(n) As Single
For i = 1 To n 'Ввод элементов массива
a(i) = InputBox("Введите a(" + Str(i) + ")")
Next i
S = 0 'Вычисление суммы элементов массива
For i = 1 To n
S = S + a(i)
Next i
S = S / n
TextBox2.Text = Str(S) 'Вывод результата
End Sub
С помощью текстового поля TextBox1 определяется переменная n, значение которой используется для определения граничного индекса. Redim позволяет выделить память под динамический массив.
Массив а — это массив вещественных чисел. Индекс элементов массивы изменяется в интервале от 0 до n.
Переменная i используется в качестве параметра оператора цикла. Переменная n — количество элементов массива, исходная величина. S — результат вычислений. В этой переменной накапливается сумма элементов массива.
Рассмотрим отдельно фрагмент ввода массива.
For i = 1 To n 'Ввод элементов массива
a(i) = InputBox("Введите a(" + Str(i) + ")")
Next i
Ввод массива (и вывод тоже) необходимо производить поэлементно. Ввести массив — это значит ввести все его элементы. Индекс элемента массива должен пробежать все значения от 1 до n. Для этого организуем цикл, в котором индекс массива является параметром цикла. Оператор For здесь особенно уместен.
Ввод элементов массива осуществляется с помощью функции InputBox. Эта функция выводит на экран диалоговое окно. В качестве аргумента функции используется строковая константа-подсказка: "Введите a(" + Str(i) + ")"
Ввод элементов массива можно осуществлять с текущего листа электронной таблицы. Обратиться к ячейкам таблицы можно с помощью свойства таблицы Cells.
For i = 1 To n ‘ Ввод элементов массива
a(i) = Cells(1, i)
Next i
У свойства Cells два параметра. Первый — номер строки таблицы. I — номер столбца. При этом, элементы массива должны быть предварительно введены в ячейки таблицы.
Для расчета суммы используется прием накопления суммы.
S = 0
For i = 1 To n
S = S + a(i)
Next i
Этот прием заключается в том, что в формуле вычисления суммы в правой и левой частях выражения записано имя одной и той же переменной. Начальное значение должно быть равно 0. В цикле к текущему значению суммы S прибавляется значение очередного элемента массива, и результат записывается в переменную S, которая для следующего прохода цикла становится текущим значением.
По окончании работы оператора цикла в переменной S накопится сумма всех элементов массива. Для определения среднего значения полученную сумму следует разделить на количество элементов массива и вывести результат на экран.
Пример 2.
Условие задачи:
В массиве вещественных чисел подсчитать количество элементов равных 0.
Схема алгоритма:
Здесь имеются отличия от предыдущей задачи только в алгоритме поиска количества элементов равных 0. Ввод исходных данных и вывод результата остаются такими же.
S = 0
For i = 1 To n
If a(i) = 0 Then S = S + 1
Next i
В переменной S накапливается значение количества элементов. Эти элементы массива а удовлетворяют условию аi = 0. Суммируются единицы, которые в результате дадут нам значение общего количества элементов, отвечающих заданному условию.
Пример 3.
Условие задачи:
Найти максимальный элемент последовательности, состоящей из n элементов.
Приведем фрагмент схемы:
Программа:
max = a(1)
For i = 2 To n
If a(i) > max Then max = a(i)
Next i
Переменная max принимает значение первого элемента массива а. Над всеми остальными элементами массива выполняется однотипная операция: элемент массива сравнивается с переменной max. Если встречается элемент массива больший max, то max приобретает значение этого элемента. Если условие ai > max не выполняется, то присваивания не происходит. По окончании цикла в переменной max останется значение самого большого элемента.
Пример 4.
Условие задачи:
Разработать алгоритм и написать программу сортировки одномерного массива по возрастанию.
Для решения задачи воспользуемся алгоритмом, который получил название «метод пузырька». Этот алгоритм заключается в следующем.
Перебираются все элементы массива и производятся сравнения: первый элемент со вторым второй с третьим, и так далее до n–го. Если значение некоторого элемента больше значения следующего элемента, то эти элементы меняются местами.
В результате последовательность может быть не отсортирована. Однако после первого прохода можно с уверенностью сказать, что наибольшее значение находится на своем месте — на правой границе массива. Выполнив еще один проход по n – 1 элементам, получим два упорядоченных значения. Если осуществить n – 1 проход, получим упорядоченный массив.
Фрагмент схемы алгоритма:
Форма
Программа
Private Sub CommandButton1_Click()
Dim x() As Single
Dim n As Integer, Y As Single, i As Integer, j As Integer
n = Val(TextBox1.Text)
ReDim x(n) As Single
For i = 1 To n ' Ввод массива
x(i) = Cells(i)
Next i
For i = 2 To n ‘Проход
For j = n To i Step -1 ‘Цикл для сравнения
If x(j - 1) > x(j) Then
Y = x(j - 1): x(j - 1) = x(j): x(j) = Y ‘Перестановка
End If
Next j
Next i
R = "" ‘Формируем строку для вывода
For i = 1 To n
R = R + Str(x(i)) + vbCrLf
Next i
TextBox2.Text = R ‘Вывод результата
End Sub
Этот алгоритм можно реализуется с помощью двух циклов For — внутреннего и внешнего. Число повторений внешнего цикла на 1 меньше числа элементов массива (так как последовательность из одного значения проверять нет смысла). Число повторений внутреннего цикла последовательно сокращаться от n до 1.
Внешний цикл по i определяет количество проходов. Цикл по j создан для сравнения пар элементов массива. Сравниваются два элемента, расположенных рядом. Если XJ-1 > XJ, то осуществляется перестановка элементов местами. Для того чтобы не потерять значение одного из переставляемых элементов, вводится вспомогательная переменная Y, которая представляет собой буфер для хранения x[j-1].
Вывод результата осуществляется в текстовое поле TextBox2. В текстовое поле выводится строковая переменная R. Эта переменная предварительно формируется в цикле и представляет собой строку из значений элементов массива x(i) и символа перевода курсора на новую строку — vbCrLf. VbCrLf — константа языка Visual Basic. Для того чтобы в текстовое поле вывести текст, состоящий из нескольких строк, необходимо свойству MultiLine компонента TextBox2 присвоить значение True. Свойство MultiLine может принимать два значения: True и False. Если MultiLine = True, то возможен вывод в несколько строк. Если MultiLine = False, то вывод осуществляется в одну строчку.