Содержание
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Цель работы
Освоить алгоритмы обработки массивов в среде VBA.
Постановка задания (задача №1)
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Во всех вариантах массив водится из столбца рабочей книги, результат выводится в ячейки рабочей книги с соответствующим комментарием. Требуется решить задачу как с использованием массива с фиксированным числом элементов, так и динамического массива.
Варианты заданий
№ | Постановка задачи |
1 | В одномерном массиве из $10$ целых чисел найти минимальный и максимальный элементы массива и заменить первый элемент массива суммой минимального и максимального элементов. |
2 | Дан одномерный массив из $15$ действительных чисел. Найти среднее арифметическое элементов массива и определить порядковый номер первого элемента, меньшего среднего арифметического. |
3 | Дан одномерный массив из $15$ целых чисел. Найти максимальный и минимальный элементы массива и вычислить произведение их порядковых номеров. |
4 | Исходный массив содержит $15$ действительных чисел. Найти среднее арифметическое элементов массива, на которое разделить все элементы исходного массива |
5 | Исходный массив содержит $15$ целых отрицательных и положительных чисел. Найти максимальный и минимальный элементы массива и вычислить их произведение. |
6 | В одномерном массиве из $15$ целых чисел определить порядковые номера элементов, кратных трем. |
7 | В одномерном массиве $Х$, содержащем $10$ целых чисел, найти сумму и количество элементов, удовлетворяющих условию $15 \lt X_{i} \lt 28$. |
8 | В одномерном массиве из $15$ целых чисел найти минимальный и максимальный элементы, вычислить их сумму. |
9 | Дан массив из $15$ действительных чисел. Найти среднее арифметическое элементов массива и вычислить сумму всех элементов, больших среднего арифметического. |
10 | В одномерном массиве, содержащем $15$ целых чисел, найти максимальный, и все элементы разделить на максимальный. |
Образец выполнения (вариант №1)
Условие задания
В одномерном массиве из $10$ целых чисел найти минимальный и максимальный элементы массива и заменить первый элемент массива суммой минимального и максимального элементов. |
Решение задачи с использованием макросов на VBA
Закодируем $3$ процедуры, каждую из которых можно будет вызвать с помощью макроса:
- Процедура, решающая поставленную задачу, с использованием статического массива.
- Процедура, решающая поставленную задачу, с использованием динамического массива.
- Вспомогательная процедура, которая очищает ячейки электронной таблицы от прошлых выводов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ' работа со статическим одномерным массивом Sub Vector_Fix_Size() Dim a(2 To 11) As Integer ' статический одномерный массив, состоящий из 10 элементов целого типа Dim i As Byte ' переменная счетчик для циклов Dim min As Integer ' хранит минимальное значение среди всех элементов массива Dim max As Integer ' хранит максимальное значение среди всех элементов массива ' считываем 10 значений и записываем в элементы массива For i = 2 To 11 a(i) = Worksheets("ЛР5").Cells(i, 6) Next i ' запускаем поиск минимального элемента среди всех элементов массива min = a(2) ' предполагаем, что минимальным является самый 1ый элемент массива For i = 3 To 11 ' если текущий элемент меньше минимального, то запоминаем новое минимальное значение If (a(i) < min) Then min = a(i) Next i ' выводим в ячейку электронной таблицы значение минимального элемента Worksheets("ЛР5").Cells(13, 7) = min ' запускаем поиск максимального элемента среди всех элементов массива max = a(2) ' предполагаем, что максимальным является самый 1ый элемент массива For i = 3 To 11 ' если текущий элемент больше максимального, то запоминаем новое максимальное значение If (a(i) > max) Then max = a(i) Next i ' выводим в ячейку электронной таблицы значение максимального элемента Worksheets("ЛР5").Cells(14, 7) = max ' заменяем 1ый элемент массива суммой минимального и максимального a(2) = min + max ' выводит результат (измененные элементы статического массива) на лист Excel в колонку For i = 2 To 11 Worksheets("ЛР5").Cells(i, 7) = a(i) Next i End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ' работа с динамическим одномерным массивом Sub Vector_Dynamic_Size() Dim a() As Integer ' динамический одномерный массив, состоящий из 10 элементов целого типа Dim i As Byte ' переменная счетчик для циклов Dim min As Integer ' хранит минимальное значение среди всех элементов массива Dim max As Integer ' хранит максимальное значение среди всех элементов массива ' резервируем память в динамическом массиве для размещения 10 элементов ReDim a(2 To 11) ' считываем 10 значений и записываем в элементы массива For i = 2 To 11 a(i) = Worksheets("ЛР5").Cells(i, 6) Next i ' запускаем поиск минимального элемента среди всех элементов динамического массива min = a(2) ' предполагаем, что минимальным является самый 1ый элемент массива For i = 3 To 11 ' если текущий элемент меньше минимального, то запоминаем новое минимальное значение If (a(i) < min) Then min = a(i) Next i ' выводим в ячейку электронной таблицы значение минимального элемента Worksheets("ЛР5").Cells(13, 7) = min ' запускаем поиск максимального элемента среди всех элементов массива max = a(2) ' предполагаем, что максимальным является самый 1ый элемент массива For i = 3 To 11 ' если текущий элемент больше максимального, то запоминаем новое максимальное значение If (a(i) > max) Then max = a(i) Next i ' выводим в ячейку электронной таблицы значение максимального элемента Worksheets("ЛР5").Cells(14, 7) = max ' заменяем 1ый элемент массива суммой минимального и максимального a(2) = min + max ' выводит результат (измененные элементы динамического массива) на лист Excel в колонку For i = 2 To 11 Worksheets("ЛР5").Cells(i, 8) = a(i) Next i Erase a ' удаляем память из-под динамического массива, т к обработка закончена End Sub |
1 2 3 4 5 6 | ' очистка ячеек от прошлых вычислений (вспомогательная полезная процедура) Sub Clear_Data() Range("G2:G11").ClearContents ' очищаем ячейки электронной таблицы из-под элементов статического массива Range("H2:H11").ClearContents ' очищаем ячейки электронной таблицы из-под элементов динамического массива Range("G13:G14").ClearContents ' очищаем ячейки, содержащие значения минимального и максимального элементов End Sub |
В итоге мы создали следующие макросы:
Результаты работы программы
№ | Описание | Результат |
1 | Интерфейс программы | |
2 | Ввод элементов исходного массива (числа вводились случайным образом с клавиатуры) | |
3 | Обработка через статический массив | |
4 | Обработка через динамический массив |
ВНИМАНИЕ | Для получения всех необходимых процедур своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Постановка задания (задача №2)
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Во всех вариантах матрица (двумерный массив) вводится из области рабочей книги, результат выводится в ячейки рабочей книги с соответствующим комментарием.
Варианты заданий
№ | Условие задачи |
1 | Дана целочисленная прямоугольная матрица. Определить количество строк, не содержащих ни одного нулевого элемента. |
2 | Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента. |
3 | Дана целочисленная прямоугольная матрица. Определить количество столбцов, содержащих хотя бы один нулевой элемент. |
4 | Дана целочисленная квадратная матрица. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов. |
5 | Дана целочисленная квадратная матрица. Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов. |
6 | Дана целочисленная прямоугольная матрица. Определить сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент. |
7 | Дана целочисленная прямоугольная матрица Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент. |
8 | Дана целочисленная прямоугольная матрица. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент. |
9 | Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент. |
10 | Дана целочисленная прямоугольная матрица. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента. |
Образец выполнения (вариант №1)
Условие задания
Дана целочисленная прямоугольная матрица. Определить количество строк, не содержащих ни одного нулевого элемента. |
Решение задачи с использованием макросов на VBA
Так как в условии ничего не было сказано о способе решения и об ограничениях, то решим данную задачу с использованием статического двумерного массива размером $3 \ \times \ 5$.
В итоге нам потребуется закодировать $2$ процедуры:
- Процедуру, решающую поставленную задачу, с использованием статической прямоугольной матрицы.
- Вспомогательную процедуру, которая очищает ячейки электронной таблицы от прошлых выводов.
➡ Процедура №2 автоматизирует процесс уборки прошлых результатов, что позволяет более быстро проводить тестирование макросов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ' вычислительная процедура, которая определяет кол-во строк в матрице, не содержащих нулевых элементов Sub Calculate() Dim a(3 To 5, 7 To 11) As Integer ' статическая матрица 3 на 5 (3 строки, 5 колонок) Dim i, j As Byte ' счетчики циклов Dim k As Byte ' хранит кол-во строк не содержащих ни одного элемента Dim k0 As Integer ' хранит кол-во нулевых элементов в текущей строке матрицы ' заполняем элементы матрицы считываем из листа Excel For i = 3 To 5 For j = 7 To 11 a(i, j) = Worksheets("ЛР5").Cells(i, j) Next j Next i ' определяем кол-во строк, в которых нет нулевых элементов k = 0 ' так как обработка еще не началась, то кол-во искомых строк матрицы равно 0 For i = 3 To 5 k0 = 0 ' стоим в начале текущей строки матрицы, поэтому кол-во нулевых элементов этой строки равно 0 For j = 7 To 11 ' если текущий элемент матрицы равен 0, то увеличиваем счетчик на 1 If (a(i, j) = 0) Then k0 = k0 + 1 Next j ' если после сканирования текущей строки матрицы не было встречено нулевых элементов, то ' учитываем эту строку в результате If (k0 = 0) Then k = k + 1 Next i ' выводим количество строк матрицы, которые не содержат нулевых элементов, в ячейку электронной таблицы Worksheets("ЛР5").Cells(7, "L").Value = k End Sub |
1 2 3 4 5 | ' очистка прошлых результатов Sub ClearData() Worksheets("ЛР5").Range("H3:J5").ClearContents ' очищаем значения элементов матрицы Worksheets("ЛР5").Cells(7, "L").Value = "" ' очищаем ячейку, содержащую результат End Sub |
В итоге мы создали следующие макросы:
Результаты работы программы
№ | Описание | Результат |
1 | Интерфейс программы | |
2 | Ввод элементов исходной статической прямоугольной матрицы | |
3 | Обработка через статический двумерный массив | |
4 | Проверка полученных результатов |
ВНИМАНИЕ | Для получения всех процедур своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Добавить комментарий