Задачник VBA_ II
.pdf31
Пример 2. Разработать программу для создания матрицы размером
m × n.
Решение . Рассмотрим сначала способ создания матрицы с помощью генератора случайных чисел. Напомним, что при задании оператора ReDim A(n,m) в ОП создается область нумерованных ячеек, в которых хранятся значения по умолчанию: для числовых переменных – это нули, для символьных– пустой символ “”, для вариантных – значение Empty (Пусто).
Операция задания массива должна быть выполнена обязательно в вызывающей процедуре. В отличие от примера example_10, в данном варианте перенесем из главной программы операторы, ответственные за присвоение значений. Составим программу, которая будет заносить в заданные ячейки целые числа от -50 до +50. Размерности массива ограничим числом 10.
После задания числовых значений выведем результат, используя программу out_matrix, текст которой представлен в п. 5.2, в окно сообщений.
Для вызова созданной процедуры создаем «главную» процедуру с именем main_primer_02. Тексты обеих программ с соответствующими комментариями представлены ниже:
32
Еще раз посмотри, как происходит заполнение значениями элементов массива:
i = 1
j = 1 A(1,1) = -20; j = 2 A(1,2) = 45; … j = n A(1,n) = -10; j = n+1 Выход из цикла по j
i = 2
j = 1 A(2,1) = -22; j = 2 A(2,2) = -34; … j = n A(2,n) = 15; j = n+1 Выход из цикла по j
…
i = m
j = 1 A(m,1) = -42; j = 2 A(m,2) = -4; … j = n A(m,n) = -24; j = n+1 Выход из цикла по j
i = m+1 Выход из цикла по i.
Решение . Рассмотрим теперь способ чтения матрицы с листа Excel. Такая ситуация встречается достаточно часто, когда предварительно данные заносятся на внешний носитель памяти, в данном случае – лист Excel, либо заранее, либо в результате работы какой-либо программы.
Напомним, что, к сожалению, нельзя создать массив в процедуре, а затем передать его в любую вызывающую программу. Возможно только обратное.
Допустим, что данные на листе расположены так, как показано на рис. 3. В первой строке указано количество строк и столбцов матрицы целых чисел.
Рис. 3. Образец листа данных для ввода в программу
Программа primer_03 реализует присвоение данных из ячеек листа элементам массива. Формальные параметры программы включают адрес ячейки, где находится первый элемент массива – nr (номер строки), nc (номер
33
столбца). В таких задачах всегда важно определить зависимость номера ячейки от индекса элемента массива. Только в случае, когда элементы массива расположены с первой строки и первого столбца, эти параметры совпадают:
Пример 3. Разработать программы для умножения двух сцепленных матриц A(m × n) и B(n × l) и вывода матрицы любого размера на лист Excel в заданное программистом место.
Решение. Прежде, чем писать программу primer_04, необходимо понять алгоритм вычисления элементов матрицы-произведения С(m × l).
n
Этот алгоритм задается известной в алгебре формулой Cij = ∑Aik Bkj . k =1
Программа primer_05 построена аналогично primer_03: тот же принцип адресации к ячейкам листа, только в операторе присваивания операнды поменяны местами. Текст главной программы main_primer_04 и новых вызываемых функций представлен ниже. Главная программа:
34
Программа для произведения матриц:
Программа для вывода матриц на лист Excel:
Результаты работы программы vain_primer_04:
Пример 4. Сформировать ведомость для выдачи стипендии. Исходные данные: фамилии N студентов, отметки за m экзаменов – вводятся операто-
35
ром на лист Excel (рис. 4). Базовая стипендия 1000 руб. занесена в отдельную ячейку.
Составить программу, которая находит средний балл студентов, количество неуспевающих студентов и количество отличников, фамилии студентов, имеющих максимальный средний балл.
В программу необходимо ввести операторы для начисления каждому студенту стипендии при отсутствии двоек. При среднем балле менее 3,5 выделяется 50 % от базовой стипендии, не более 4,5 – базовая стипендия и выше 4,5 – на 50 % выше базовой. Найти общую сумму стипендий, выдаваемых группе.
Рис. 4. Образец ведомости для обработки данных на начисление стипендий
Решение. Решение этой задачи сводится к шаблонным задачам по двумерным массивам: поиск арифметического среднего, минимума или максимума и т.д. Чтобы привести данную задачу к стандартным алгоритмам, рассмотрим, какого типа данные у нас должны быть введены в программу.
1.Список фамилий – это одномерный символьный динамический массив размером n. Дадим ему имя fio.
2.Матрица n×m для оценок всех n студентов по m предметам – тип байт, так как оценки не превышают числа 5 и являются целыми величинами. Пусть имя массива ball.
3.Массив средних баллов (sr_b) – одномерный, размером n, массив одинарной (Single) точности.
4.Для ввода и вывода массивов и одномерных массивов – векторов – используем процедуры, построенные на аналогичных программах, примеры
36
которых даны в предыдущем примере. Процедуры, названия которых заканчиваются на «_s» – предусмотрены для ввода/вывода символьных данных, на «1» – для вывода данных на лист. Для быстрого просмотра используются процедуры вывода в окно сообщений.
Фрагмента начала главной программы vedomost, реализующий указанные действия, представлен ниже. Текст программы:
5.Количество отличников (n5) – это те студенты, у кого средний балл равен пяти. Значит, для их нахождения необходимо использовать перебор элементов массива sr_b и рассчитывать число элементов, у которых sr_b = 5.
6.Количество неуспевающих студентов (n2) – это те, у кого среди оценок есть хотя бы одна двойка. Значит необходимо для каждого студента (цикл по i до n) провести проверку его баллов студента (цикл по j до m): как только встречается оценка 2, реализуeм выход из цикла по j, при этом увеличивая число n2 на единицу.
Продолжение программы, реализующей алгоритм пунктов 5 и 6:
37
7.Для нахождения максимального балла включаем стандартный алгоритм поиска максимума в одномерном массиве sr_b.
8.Для нахождения студентов, имеющих наивысший средний балл, организуем цикл по количеству студентов в массиве средних баллов. Если балл студента равен высшему, то выводим его фамилию из массива fio в соответствующую строку. Текст программы:
9. Наконец, переходим к вычислению стипендии. Организуем цикл по числу студентов, в теле которого используем оператор Select Case по среднему баллу.
Текст завершающей части программы vedomost:
38
Результаты работы программы, выведенные в окна сообщения, представлены по ходу текста программ, выведенные на лист Excel – представлены на рис. 5.
Рис. 5. Образец ведомости после работы программы vedomost
39
6.2. Задания для самостоятельного чтения программ
Задание 1. В каком месте приведенного листа Excel и какие результаты появятся после выполнения указанной программы?
Задание 2. В каком месте приведенного листа Excel и какие результаты появятся после выполнения указанной программы?
Задание 3. Какие результаты и где на листе Excel будут выведены результаты представленной программы?
Текст программы:
40
Задание 4. Как будет выглядеть окно сообщений в результате работы представленной программы?
Текст программы:
Задание 5. На запрос диалогового окна введено число 17.Как будет выглядеть окно сообщений в результате работы представленной программы?
Текст программы: