Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Задачник VBA_ II

.pdf
Скачиваний:
302
Добавлен:
10.06.2015
Размер:
1.17 Mб
Скачать

31

Пример 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.Как будет выглядеть окно сообщений в результате работы представленной программы?

Текст программы: