
- •Министерство образования и науки российской федерации
- •Алгоритмизация и программирование на vba: структурное программирование
- •305040, Г. Курск, ул. 50 лет Октября, 94. Содержание
- •1Цель работы
- •2Общие сведения
- •2.1Структурное программирование
- •2.2Реализация подпрограмм на vba.
- •2.2.1Описание подпрограмм GoSub - Return
- •Синтаксис вызова и описания подпрограммы:
- •2.2.2Описание процедур и функций.
- •Области видимости имен
- •Время жизни переменной
- •Параметры
- •Описание процедур Синтаксис описания процедуры:
- •Синтаксис элемента СписокАргументов:
- •Описание функций Синтаксис описания функции:
- •2.2.3Вызов процедур и функций Вызов процедур Синтаксис вызова процедуры:
- •Вызов функций
- •Примеры Основные способы передачи параметров в процедуры.
- •Передача массива как параметра.
- •Использование необязательных параметров
- •Использование неопределенного количества параметров
- •2.2.4Рекурсивные процедуры и функции
- •2.2.5Использование функций пользователя в Excel
- •Алгоритм
- •Исходный текст
- •2.3.2Пример 2. Диагонали
- •Постановка задачи
- •Информационная структура задачи
- •Разработка алгоритма программы
- •Разработка исходного текста программы
- •Информационная структура задачи
- •Разработка алгоритма программы сортировки матрицы
- •Разработка исходного текста программы
- •Разработка алгоритма
- •Разработка исходного текста процедуры сортировки номеров строк в порядке возрастания минимальных значений.
- •Информационная структура задачи
- •Разработка алгоритма программы решения слау
- •Разработка исходного текста программы
- •Информационная структура
- •Разработка алгоритма
- •Разработка исходного текста процедуры
- •Процедура прямого хода.
- •Информационная структура
- •Разработка алгоритма
- •Разработка исходного текста процедуры
- •Процедура поиска главного элемента.
- •Информационная структура
- •Разработка алгоритма
- •Разработка исходного текста процедуры
- •Процедура обратного хода.
- •Информационная структура
- •Разработка алгоритма
- •Разработка исходного текста процедуры
- •6Варианты задач
- •7Список литературы
Разработка алгоритма
Рисунок 22. Алгоритм поиска и перемещения главного элемента.
Разработка исходного текста процедуры
Sub GlobalMainElement(A() As Double, B() As Double, XO() As Long, n As Long, R As Long)
Dim i As Long, j As Long, k As Long, Max As Double, MaxX As Double, MaxY As Double
Max = Abs(A(R, R)) 'Начальное значение для поиска
MaxX = R 'Номер строки начального значения
MaxY = R 'Номер столбца начального значения
For i = R To n 'Область поиска – вправо и вниз от
For j = R To n 'текущего диагонального элемента
If Abs(A(i,j))>Max Then 'Найдено значение больше текущего
MaxX = i 'Запоминаем его позицию
MaxY = j
Max=Abs(A(i,j)) 'Запоминаем его значение
End If
Next j 'Следующий столбец
Next i 'Следующая строка
For i = 1 To n 'Меняем местами строку с главным
Swap A(MaxX,i),A(R,i)'элементом и строку с текущим
Next i 'диагональным элементом
For i = 1 To n 'Меняем местами столбец с главным
Swap A(i,MaxY),A(i,R)'элементом и столбец с текущим
Next i 'диагональным элементом
Swap B(R), B(MaxX) 'Меняем элементы вектора свободных
Swap XO(R), XO(MaxY) 'членов и порядок элементов решения
End Sub
Процедура Swap описана в предыдущих примерах.
Процедура обратного хода.
Если система имеет единственное решение (при этом код ошибки будет равен нулю), выполняется обратный ход. На этом этапе на основе преобразованной в верхнетреугольную главной матрицы и соответствующего вектора свободных членов вычисляются значения вектора решений системы уравнений. Так как главная матрица – верхнетреугольная, элементы последней строки за исключением элемента на главной диагонали – нулевые, последнее уравнение содержит всего одно неизвестное значение при ненулевом коэффициенте, которое можно вычислить. После этого, в предыдущем уравнении остаётся одно неизвестное при коэффициенте на главной диагонали, которое вычисляется с учётом решения последнего уравнения. Аналогично, строка за строкой снизу вверх вычисляются все неизвестные значения вектора решений. С помощью массива позиций порядок элементов вектора решений преобразуется в исходный.
Информационная структура
Входные данные
n – количество уравнений – целое число >0;
A – двумерный массив с матрицей – nxn типа Double;
B – одномерный массив с вектором – n чисел типа Double;
XOrder – одномерный массив с исходными порядковыми номерами вектора решений – n целых чисел;
Локальные данные
i – номер текущего диагонального элемента массива, под которым будет обнуляться столбец – целое;
j – номер текущей строки массива, в которой обнуляется i-й элемент – целое;
s – сумма произведений известных значений вектора решения на ненулевые коэффициенты текущей строки – число типа Double;
Выходные данные
X – одномерный массив с вектором решений – n чисел типа Double;
Разработка алгоритма
Рисунок 23. Схема алгоритма процедуры обратного хода
Разработка исходного текста процедуры
Sub BackStage(A() As Double, B() As Double, X() As Double, XO() As Long, n As Long)
Dim i As Long, j As Long, s As Double
For i = n To 1 Step -1 'Для всех строк начиная с последней
s = 0 'В каждой строке будет разная сумма
For j = i + 1 To n 'В области правее главной диагонали
s=s+A1(i,j)*X(XO(j)) 'Находим сумму s
Next j 'Следующий элемент
X(XO(i))=(B1(i)-s)/A1(i,i) 'Вычисляем неизвестное значение
Next i 'Следующая строка
End Sub
Процедура вывода результата
Процедура OutputDRow отличается от описанной ранее OutputRow тем, что в OutputDRow определён тип элементов массива – Double.
Информационная структура
Входные данные отличаются от входных данных процедуры OutputRow тем, что для входного массива A определён тип элементов Double.
Выходные и локальные данные совпадают с данными OutputRow.
Разработка алгоритма
Алгоритм процедуры OutputDRow совпадает с алгоритмом OutputRow (Рисунок 10).
Разработка исходного текста процедуры
Sub OutputDRow(A() As Double, n As Long, r As Long, c As Long)
Dim i As Long
For i = 1 To n 'Для всех элементов массива A
Cells(r,i+c-1)=A(i) 'Выводим в нужную ячейку текущего листа
Next i 'Следующий элемент
End Sub
3Задание
Используя принципы структурного программирования, разработать алгоритм и программу на VBA по варианту.
Ввести программу в редактор VBA и добиться её выполнения.
Подготовить отчёт.
4Содержание отчёта
Титульный лист.
Формулировка задачи.
Для каждой из процедур:
Информационная структура
Схема алгоритма.
Текст программы с комментариями.
Ответы на контрольные вопросы.
5Контрольные вопросы
В каких случаях структурное программирование нецелесообразно?
Как привести неструктурированный алгоритм к структурированному виду? Всегда ли это возможно?
Что такое и как используется восходящее и нисходящее программирование?
В каких случаях целесообразно использование локальных, глобальных, общих переменных? Зачем нужны статические переменные?
В каких случаях лучше использовать процедуры, а в каких функции?
В каких случаях целесообразно передавать параметры по ссылке, по значению?
В каких условиях целесообразно использовать рекурсию, а в каких нет?
Как гарантировать выход из рекурсии?
Как использовать процедуры и функции пользователя в хост-приложениях и функции хост-приложений в пользовательских процедурах и функциях?