МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ МАШИНОСТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ (МАМИ)» / УНИВЕРСИТЕТ МАШИНОСТРОЕНИЯ / А.Н. Любин М.Д. Силин ПРОЦЕДУРЫ И ФУНКЦИИ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ VISUAL BASIC FOR APPLICATION Учебное пособие по дисциплине «Информатика» и «Информационные технологии» для студентов всех направлений и специальностей Одобрено методической комиссией по направлению 230000 - «Информатика и вычислительная техника» Москва-2013 2 УДК 681.3.06 Разработано в соответствии с Государственным образовательным стандартом ВПО 2000 г. для специальности подготовки 230201.65 на основе рабочей программы дисциплины «Информатика» Рецензенты: доцент, к.т.н., начальник управления образовательных программ Института информационных технологий И.А. Виноградова; к.т.н., профессор кафедры: «Информационные системы и дистанционные технологии» Университета машиностроения А.И. Макаров. Учебное пособие подготовлено на кафедре «Информационные системы и дистанционные технологии» Учебное пособие ориентировано на изучение основ языка программирования VISUAL BASIC FOR APPLICATION (VBA), а именно процедур и функций, как наиболее важных и наиболее трудно усваиваемых функциональных блоков языка. Предполагается, что студент знаком с основными операторами структурного программирования на языке VBA В противном случае следует использовать приведённую в пособии литературу. При изучении языка данное пособие позволит более эффективно освоить указанные его разделы и получить практические навыки при программировании. © Любин А.Н., Силин М.Д., 2013. © МГМУ (МАМИ), 2013. 3 СОДЕРЖАНИЕ ВВЕДЕНИЕ………………………………………………....4 1.ТЕОРЕТИЧЕСКАЯ ЧАСТЬ…………………………………..5 1.2. ПРОЦЕДУРЫ…………………..………………………….….....5 1.2.1. ПРОЦЕДУРА ТИПА FUNCTION……...………………...5 1.2.2. ПРОЦЕДУРА ТИПА SUB………………...………………...14 1.3. СПОСОБЫ ПЕРЕДАЧИ АРГУМЕНТОВ В ПРОЦЕДУРЫ…………………………………………..19 1.4. ОБЛАСТЬ ДЕЙСТВИЯ ПРОЦЕДУР…………...…......23 1.5. ПРЕРЫВАНИЕ ПРОЦЕДУР…………………………....26 2. ПРАКТИЧЕСКАЯ ЧАСТЬ…………………………...…...…27 2.1. ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗАДАНИЙ……………………....27 2.2. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ……………………………………..……....34 ЛИТЕРАТУРА…………………………………………...…...….38 4 ВВЕДЕНИЕ При программировании часто в алгоритме определённые однотипные фрагменты повторяются несколько раз. Например, неоднократное перемножение матрицы на вектор и тому подобное. Такие фрагменты алгоритма целесообразно запрограммировать один раз в виде подпрограммы и по мере необходимости обращаться к ней, вызывать, столько раз, сколько требуется. Идея подпрограмм позволила снизить трудоёмкость написания программ в целом. Позволила, выделяя самостоятельные подзадачи, организовывать разделение работ над программой между программистами с возможностью оперативной её корректировки. Появилась возможность создания и использования библиотек подпрограмм, целых банков подпрограмм. Обычно различают основную программу (программную единицу) т.е. вызывающую программу и вызываемую программу, т.е. саму подпрограмму. При вызове подпрограммы, как правило, в неё передаются исходные данные в виде входных аргументов, параметров, а возвращаются в вызывающую программу результаты работы подпрограммы, в виде выходных параметров или аргументов. Таким образом, в основном, предстоит изучить, как объявить, организовать подпрограмму, как вызвать подпрограмму, как передать в неё из вызывающей программы входные параметры и как передать полученныё результата, выходные параметры, в вызывающую программу. 5 1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 1.2. ПРОЦЕДУРЫ Для VBA характерно понятие процедуры, что фактически тоже самое, что и подпрограмма. При этом, как и во многих других текстовых языках, различают два основных типа процедур: процедуру типа Sub (подпрограмма), процедуру типа Function (функция). Стоит отметить, что процедуру типа Sub часто называют просто процедурой, а процедуру типа Function – функцией. Процедуры — это самые важные функциональные блоки языка VBA. Как правило, программа на языке VBA состоит из нескольких процедур и функций. Эти программные единицы хранятся в модулях. В свою очередь, модули как составные части входят в проекты. При вызове процедуры или функции, которая расположена в другом модуле, ее имя при вызове указывается следующим образом: имяМодуля.имяПроцедуры. При вызове процедуры или функции расположенной в другом проекте, следует использовать синтаксис: имяПроекта.имяМодуля.имяПроцедуры. 1.2.1. ПРОЦЕДУРА ТИПА FUNCTION Процедурой типа Function формально называется фрагмент текста на языке VBA (программный код), заключенный между ключевыми словами Function и End Function, определяющими соответственно начало и конец процедуры. Для объявления процедуры типа Function используется следующий синтаксис. Function Имя (список формальных аргументов) As тип ( операторы) Имя = возвращаемое значение End Function 6 Ключевое слово Function определяет процедуру типа Function. Далее задаётся Имя_процедуры - функции. Имя должно быть уникальным, и задано согласно правилам задания имён переменных в языке VBA. В круглых скобках указывается список формальных аргументов, т. е. перечисляются через запятую параметры, которые передаются в процедуру типа Function из вызывающей её процедуры, и те – которые, в качестве результатов, нужно будет передать, вернуть в последнюю из вызванной процедуры после её выполнения. В качестве формальных аргументов могут использоваться имена переменных, констант, массивов и их элементов. Причём различают входные формальные аргументы, которые передаются в процедуру и выходные, которые передаются из неё в вызывающую процедуру. Отметим, что список формальных аргументов не является обязательным параметром, он может отсутствовать. Ключевое слово As (как) и следующее за ним значение тип определяют тип переменной, которую передают (возвращают) в вызывающую процедуру - возвращаемое значение. Задание типа возвращаемого значения является не обязательным. В этом случае считается, что возвращаемое значение имеет тип Variant [1]. Параметр возвращаемое значение это значение переменной, имя которой требуется передать из вызываемой процедуры в вызывающую процедуру, и это имя должно быть тем же что и имя процедуры – функции, т. е. Имя = возвращаемое значение. Здесь важно подчеркнуть, что возвращаемое значение через имя функции может фигурировать в любом месте кода вызывающей процедуры, в том числе и в арифметических выражениях. 7 Вызов процедуры типа Function Чтобы использовать написанную процедуру ее нужно вызвать. Вызов (обращение) процедуры типа Function осуществляется по её имени. Синтаксис обращения следующий. Имя (список фактических аргументов) Список фактических аргументов это перечисленные через запятую имена переменных, констант, массивов и их элементов которые фигурируют в основной, вызывающей процедуре и передаются в процедуру Function, при её вызове, в качестве исходных, входных параметров. А также и те, которые передаются, возвращаются из вызванной процедуры Function обратно в вызывающую процедуру в качестве выходных параметров. В списке фактических аргументов могут быть записаны и выражения, в частности арифметические, которые вычисляются и полученное значение передается в подпрограмму как фактический аргумент. Формальные и фактические аргументы могут не совпадать по именам, но они должны совпадать по количеству, порядку следования, типу и длине (размеру отводимой памяти). Пример 1. Написать программу вычисления S=( + , при A =2, k=4, B=3, m=2. Использовать процедуру типа Function. Листинг программы к примеру 1 и результат её работы представлены на рис. 1. Пояснения к программе. Основная, вызывающая процедура имеет имя ФУНКЦИЯ. Процедуру типа Function имеет имя S и у неё два формальных аргумента X и N, которые являются входными аргументами. В основной процедуре имеется два обращения к процедуре S, причём при первом обращении в качестве фактических параметров указаны 8 имена переменных A и K, а при втором- B и m. При первом обращении на место формальных аргументов X и N передаются фактические аргументы A и K, которые и участвуют в вычислении. Результат вычисления X^N присваивается имени процедуры, а именно переменной S, которая возвращается в вызывающую процедуру – ФУНКЦИЯ. Аналогичные действия происходят и при втором обращении к процедуре S. Результаты вычислений суммируются в вызывающей процедуре ФУНКЦИЯ и присваиваются переменной Y, которая выводиться в окно функции МsgBox. Рисунок 1.- Листинг программы к примеру 1 и результат её работы. Исходные данные можно указывать непосредственно в обращении к процедуре Function. Тогда в качестве фактических аргументов в обращении к процедуре будут фигурировать не переменные, а константы. В этом случае вариант составления программы, к примеру 1, будет выглядеть как на рис. 2. 9 Рисунок 2 .- Вариант программы к примеру 1. Фактически аргументы представлены в виде констант. Основное достоинство в использовании процедуры типа Function заключается в том, что она может вызываться в любом месте программного кода, где может быть явно указано возвращаемое значение, как в приведённом выше примере. Вызвать процедуру типа Function можно и с помощью специального оператора Call (вызвать). Синтаксис такой формы вызова следующий. Call Имя (список фактические аргументы) Имеется эквивалентная оператору Call форма вызова процедуры типа Function, отличающаяся только синтаксисом, а именно: Имя процедуры список формальных аргументов Однако при таких формах вызова отмеченное выше достоинство процедуры типа Function теряется, см. код к примеру 1 представленный на рис. 3. Рисунок 3 .- Вариант программы к примеру 1. Формы обращения к процедуре S. 10 Видно, что предпочтительнее код, представленный на рис. 2, так как в нём вызов процедуры S и подстановка результата её работы происходит непосредственно в выражение для вычисления Y. При обращении к процедуре типа Function с помощью указанных форм приведенный выше пример 1 может быть реализован в программном коде следующим образом см. рис. 4 Рисунок 4 .- Вариант программы к примеру 1. Фактически аргументы представлены в виде имён переменных. При использовании оператора Call указывается имя процедуры, в данном примере это переменная S, см. приведённый выше листинг программы. Затем в скобках через запятую указывается список фактических аргументов, а именно А, K и Y1, среди которых А и K входные фактические аргументы, а переменная Y1- выходной фактический аргумент, результат. При вызове процедуры 11 типа Function указанные входные фактические аргументы, а именно А и K передаются в процедуру S на места входных формальных аргументов, а именно Х и N. Далее в процедуре производятся вычисления для переданных в неё входных фактических аргументов А и K. Полученный в процедуре результат записан в переменную с именем REZ, которая является выходным формальным аргументом. Значение переменной REZ помещается в переменную Y1, которая является выходным фактическим аргументом и которая передается в вызывающую процедуру с именем ФУНКЦИЯ. Аналогичные действия производятся и при повторном обращении к процедуре типа Function с именем S. В основной, вызывающей процедуре ФУНКЦИЯ происходит суммирование полученных результатов - Y1 и Y2, запись их суммы в переменную Y и вывод её в окно функции МsgBox. Имеется эквивалентный оператору Call вызов, обращение к процедуре типа Function, отличающийся только синтаксисом, а именно: Имя процедуры список формальных аргументов В рассмотренном примере данная форма вызова процедуры S будет выглядеть так: S A, K ,Y1 - при первом обращении к процедуре и S 3, 4 ,Y1- при втором обращении, см. листинг к примеру 2. По мнению авторов, данная форма вызова процедуры менее предпочтительна, чем первая, так как в ней отсутствует оператор вызова и между именем функции и её аргументами нет разделителя (скобок), что затрудняет читаемость программного кода. Аргументом процедуры, как уже было отмечено, может быть и массив. Рассмотрим примеры с использованием массивов. 12 Пример 2. Заданы два массива А(5) и В(3). Написать программу для определения суммы и количества нулевых элементов, имеющихся в заданных массивов. Листинг программы к примеру 2 представлен на рис.5. Рисунок 5.- Листинг программы к примеру 2. Пояснения к программе. Вызывающая, основная процедура имеет имя MACCИВ см. рис.5. Все используемые в процедуре имена массивов должны быть записаны через запятые после оператора Dim, который отводит память под заданные массивы, в соответствии с их максимальной размерностью указанной в круглых скобках массивов. KOL - имя 13 процедуры типа Function, X и N – её формальные входные аргументы. При передачи на их места фактических аргументов в виде массивов с именами А и В после имени массива можно ставить круглые скобки – А(), а можно и не ставить их – В, см. приведённый листинг к рассматриваемому примеру 2 на рис.5. Задание типа формальных и фактических аргументов Тип формальных аргументов можно не задавать, как в приведённых выше примерах, и тогда считается, что они имеют тип данных Variant [1]. Объявление каждого формального аргумента имеет следующий синтаксис: Имя аргумента As тип данных тип данных – тип данных, определенный пользователем. При задании формальному аргументу определённого типа данных, например Integer, соответствующему фактическому аргументу должен быть определён тот же тип данных, в данном случае Integer, с помощью оператора Dim, как в примере 3, см. рис. 6. Пример 3. Рисунок 6.- Задание типа формальных и фактических аргументов. 14 В примере 3 формальному аргументу N задан тип данных Integer, а соответствующему фактическому аргументу К, с помощью оператора Dim, определён тот же тип данных- Integer. 1.2.2. ПРОЦЕДУРА ТИПА SUB Процедура типа Sub (подпрограмма) — универсальная процедура для выполнения каких-либо действий при программировании. Зачем же тогда нужны функции? Функцию в основном используют тогда, когда её значение требуется вставлять практически в любое место программного кода, часто в громоздкие арифметические выражения. В этом случае использование функции гораздо проще, чем процедуры. Процедурой типа Sub формально называется фрагмент текста на языке VBA (программный код), заключенный между ключевыми словами Sub и End Sub, которые определяют начало и конец процедуры. Для объявления процедуры типа Sub используется следующий синтаксис. Sub Имя (список формальных аргументов) ( операторы) End Sub Ключевое слово Sub определяет процедуру типа Sub (подпрограмма),указывает на начало процедуры. Далее задаётся Имя_процедуры. Имя должно быть уникальным, и задано согласно правилам задания имён переменных в языке VBA. В круглых скобках указывается список формальных аргументов. Это то- же самое понятие, что и для функций, и правила их задания и использования те же, включая и задание их типа. В случае если список формальных аргументов отсутствует, то скобки остаются. 15 Вызов процедуры типа Sub Вызов процедуры типа Sub осуществляется с помощью оператора Call (вызвать). Синтаксис такого вызова следующий. Call Имя (список фактические аргументы) После имени вызываемой процедуры в круглых скобках указывается список фактических аргументов. Это то - же самое понятие, что и для функции. Правила их задания и использования теже, включая и задание их типа. В случае если список формальных аргументов отсутствует, то скобки остаются. Пример 4. Заданы два массива А(5) и В(3). Написать программу определения для каждого из заданных массивов суммы и количества положительных элементов. Вычислить общее среднее арифметическое значение положительных элементов для указанных массивов. Листинг программы к примеру 4 представлен на рис. 7. Пояснения к программе. Процедура с именем СУМКОЛ определяет для массива сумму и количество элементов больших нуля. В результате двукратного обращения к подпрограмме определяются сумма SA и количество KA элементов больших нуля для массива А и соответственно SB и KB для массива В. В основной, вызывающей процедуре (программе) с именем Сред_знач вычисляется SR – среднее арифметическое значение всех элементов больших нуля, находящихся в массивах А и В. Ввод данных в массивы А и В организован с помощью функции InputBox. 16 Рисунок 7.- Листинг программы к примеру 4. Ввод массивов можно организовать с таблицы EXCEL, а также и вывод в неё результатов, см. следующий код, для примера 4 представленный на рис. 8. 17 Рисунок 8.- Листинг программы к примеру 4, с вводом - выводом в таблицу EXCEL. Ввод данных для кода, представленного на рис. 8 может быть выполнен в таблице EXCEL следующим образом см. рис. 9. 18 Рисунок 9.- Ввод данных в таблице EXCEL. После запуска кода и завершения его работы в таблице EXCEL будет распечатан результат в виде представленном на рис. 10. Рисунок 10.- Результат работы программы в таблице EXCEL. Рассмотренный вариант ввода-вывода в таблице EXCEL удобен при отладке программ. Есть еще одна форма ввода массивов удобная, в частности, для отладки процедур. При работе с массивами бывает полезно применять следующую функцию. имя массива Array (список параметров) Эта функция создает массив типа Variant. Аргумент в скобках представляет разделенный запятыми список значений, присваиваемых элементам массива. В представленном на рис. 11 примере с помощью функции Array вводиться массив А(5) с численными значениями его элементов -2, 4, 3, 8, 10. Процедура с именем М1 подсчитывает сумму S задаваемого количества N элементов. При первом обращении к процедуре М1 подсчитывается сумма четырёх элементов массива А 19 при втором – двух, результаты выводятся с помощью функции MsgBox соответственно в переменные SYM4 и SYM2 см . рис. 11. Рисунок 11.- Процедура с использование функции Array. 1.3. СПОСОБЫ ПЕРЕДАЧИ АРГУМЕНТОВ В ПРОЦЕДУРЫ Существуют два способа передачи аргументов в процедуры: по ссылке (по умолчанию) и по значению. При передаче аргументов по ссылке передается только адрес памяти. Это означает, что если процедура изменяет значение в любом из аргументов, то исходные данные также изменяются. Этот способ работает по умолчанию, и он реализован во всех приведённых выше примерах. Рассмотрим пример передачи аргументов по ссылке, см. рис. 12. Здесь в вызывающей процедуре переменной N присваивается значение 10. Затем вызывается процедура с именем ССЫЛКА, причём переменная N передаётся в неё в качестве входного фактического аргумента. В процедуре с именем ССЫЛКА переданный фактический аргумент N занимает место формального аргумента Х и увеличивается на значение 20, т.е. становиться рав- 20 ным 30-ти и с этим значение переменная N возвращается уже в качестве выходного фактического аргумента в вызывающую процедуру и выводится в окно функции MsgBox с численным значением равным 30. Рисунок 12.- Процедура с передачей в неё аргументов по ссылке. При передаче аргумента по значению VBA делает копию передаваемого аргумента и передает эту копию процедуре. Если процедура изменяет значение в аргументе, передаваемом по значению, то изменяется только его копия, а исходное значение аргумента не изменяется. Для организации передачи аргумента по значению используется ключевое слово ByVal, которое ставиться перед именем формального аргумента при объявлении процедуры. Рассмотрим предыдущий пример см. рис. 12 с использованием в нём способа передачи аргумента по значению, см. рис. 13. В результате выполнения кода представленного на рис. 13 значение переменной N, в вызывающей процедуре MAIL, не изменяется, остаётся равным исходному значению 10. 21 Рисунок 13.- Процедура с передачей в неё аргументов по значению. Если в качестве аргумента используется переменная, тип данных которой определил программист, то такой аргумент можно передавать только по ссылке. Следует заметить, что чаще используется способ передачи аргументов по ссылке, который, как уже было сказано, в VBA используется по умолчанию, хотя, если есть желание, можно задать и явно используя ключевое слово ByRef, аналогично использованию – ByVal. Переменное число аргументов в процедуре Процедура может иметь и переменное число аргументов. Для создания таких процедур используется ключевое слово ParamArray, которое определяет массив, содержащий необходимое количество значений аргументов. Ключевое слово ParamArray в списке процедуры указывается только один раз и обязательно в конце списка. При этом тип массива не указывается, так как тип всегда должен быть – Variant, а этот тип устанавливается по умол- 22 чанию. На рис. 14 представлен пример использования процедуры с переменным числом аргументов. Рисунок 14.- Процедура с использование переменного числа аргументов. Обязательные и необязательные аргументы процедур Аргументы процедур могут быть обязательными и необязательными аргументы. Допускается, что все аргументы являются необязательными. Необязательные аргументы можно передавать при вызове процедур, а можно и опускать. Для необязательных аргументов, его значение принимается по умолчанию. Оно передается в процедуру, даже если при вызове процедуры данный аргумент был опущен. Для указания того, что данный аргумент является необязательным, используется ключевое слово Otional. Otional Аргумент As Type = defaultvalue Здесь defaultvalue – значение данного аргумента, которое будет использоваться по умолчанию. Все необязательные элементы указываются после обязательных в конце списка аргументов. Следует обратить внимание на то, что ключевые слова ParamArray и 23 Otional являются взаимоисключающими, в списке параметров может присутствовать только одно и них. Использование необязательного аргумента понятно из следующего примера, см. рис. 15. Рисунок 15.- Процедура с использование необязательного аргумента. 1.4. ОБЛАСТЬ ДЕЙСТВИЯ ПРОЦЕДУР Процедуры в VBA, как и переменные имеют определённую область действия. Их область действия может распространяться только на процедуру или процедуры модуля или проекта. Область действия любой процедуры определяется при её объявлении с помощью ключевых слов – Private или Public. Можно выделить три области действия процедур. 1. Область действия процедуры – модуль. Процедуру можно вызвать, обратиться к ней из любой процедуры того модуля в котором она объявлена с помощью ключевого слова Private. Private Sub Имя [(аргументы)] (операторы) End Sub 24 2. Область действия процедуры – все модули всех проектов. Процедуру можно вызвать, обратиться к ней из любого модуля любого проекта. Эта область действия процедуры принята по умолчанию, поэтому использовать ключевое слово Public не обязательно. [ Pablic ] Sub Имя [(аргументы)] (операторы) End Sub 3. Область действия процедуры – все процедуры только одного данного проекта. Для этого надо указать в модуле ключевые слова Option Private Module тогда процедуры, объявленные с использованием ключевого слова Pablic, будут доступны всем процедурам данного проекта и не доступны для других проектов. Переменная, объявленная в процедуре, будет доступна в пределах этой процедуры. Такие переменные называются локальными. После завершения процедуры такие переменные теряют свои значения. Однако может возникнуть ситуация, когда переменная должна сохранить своё значение после завершения процедуры, или между двумя её вызовами. В таком случае при её объявлении вместо ключевого слова Dim надо указать ключевое слово Static. В этом случае переменные называются статическими, и они сохраняют свои значения после завершения процедуры. Рассмотрим пример представленный на рис. 15-16. Переменная с именем СУММА объявлена как статическая. Это означает, что в ней каждый раз после завершения процедуры, будет сохраняться присвоенное ей значение, и с ним она будет фигурировать при следующем запуске процедуры. 25 Рисунок 16.- Процедура Main1 и результат работы после первого её запуска. Рисунок 17.- Процедура Main1 и результат работы после второго её запуска. Из рис.17 видно, что при втором запуске процедуры, при переменной ПРИХОД=55, переменная СУММА имела начальное значение 25, полученное при первом её запуске. Если указать ключевое слово Static непосредственно перед процедурой Static Sub…, то все переменные этой процедуры будут статическими, т. е. будут сохраняться после завершения выполнения процедуры. 26 1.5. ПРЕРЫВАНИЕ ПРОЦЕДУР Для того чтобы прервать выполнение процедуры или функции используется одна из двух форм VBA - оператора Exit: Exit Sub Exit Function. Действия операторов Exit Sub и Exit Function приводят к тому, что VBA немедленно прекращает выполнение кода процедуры или функции. После выполнения этих операторов VBA прекращает выполнение текущей процедуры и возвращается к выполнению той процедуры или функции, которая вызвала процедуру, содержащую оператор Exit Sub или Exit Function Для полного завершения выполнения процедуры используется ключевое слово End в отдельной строке. При выполнении этого оператора VBA прекращает выполнение всех операторов процедуры или функции. Любые имеющиеся переменные перестают существовать и их значения теряются. Так как, в этом случае, программа полностью прерывается, пользователю рекомендуется перед оператором End выводить сообщение о том, что будет происходить и почему. В противном случае пользователи вашей процедуры могут не понять, почему процедура, которую они используют, внезапно прекратила работу. 27 2. ПРАКТИЧЕСКАЯ ЧАСТЬ В практической части представлены примеры выполнения заданий аналогичные тем, которые обучающиеся должны выполнить самостоятельно, а так же задания для самостоятельного выполнения. Перед выполнением заданий необходимо освоить изложенную выше теоретическую часть, только тогда обучающиеся смогут разобраться в представленных примерах, ответить на вопросы преподавателя и самостоятельно выполнить задания. 2.1. ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗАДАНИЙ Задание 1. Написать и отладить процедуру вычисления ниже представленных функций f и g используя процедуру типа Function. f= и g= . Теоретическая часть по процедуре типа Function изложена в разделе 1.2.1 данного пособия. На рис.18 представлена процедура с именем Основ_прог к данному заданию, в которой используется процедура типа Function с именем Fun. На рис.19 представлен результат работы процедур. Процедуру Fun имеет следующие формальные аргументы A, D, Z, B которые служат для вычисления выражения Fun=A*EXP(D) +Z*SIN(B). При обращении к процедуре Fun в неё передаются фактические аргументы. Например, для вычисления числителя функции f обращение к процедуре будет выглядеть так: 28 Fun (4.5, X^2, 0, 0). В скобках указаны фактические аргументы. На первом месте константа 4.5, которая соответствует формальному аргументу А, который является сомножителем экспоненты. Далее в скобках идет фактический аргумент в виде выражения Х^2, вычисленное значение которого встанет на место формального аргумента D. На третьем и четвёртом месте в скобках - фактический аргумент в виде константы 0. Это сомножитель, стоящий перед функцией синуса, и аргумент синуса. Аналогичным образом и другие фактические аргументы в обращениях к процедуре Fun замещают формальные. Заметим, что имена фактических и формальных аргументов могут совпадать. Рисунок 18.- Процедура к заданию 1 и ввод данных для неё. 29 Рисунок 19 - Результат работы процедуры к заданию 1. Задание 2. Написать и отладить процедуру. Заданы два массива А(4,4) и В(3,3). Для каждого из них определить в заданной строке (заданной через её индекс, номер) сумму и количество элементов больших нуля. Использовать процедуру типа Sub. На рис. 20 представлена главная процедура с именем Main для задания 2. Процедуры типа Sub, которые используются в процедуре Main, изображены на рис. 21. Ввод данных осуществлён через открытый файл с именем Dan.txt. Содержимое этого файла, расположение в нём исходных данных показано на рис. 22. Вывод результатов организован в файл с именем Rez.txt, расположение в нём исходных данных и результатов показано на рис. 23. В процедуре Main используются три подпрограммы или процедуры типа Sub см. рис. 21. Процедуры с именами ВводМас и ВвыводМас используются соответственно для ввода и вывода массивов. Формальные аргументы этих процедур: Х- имя массива и N-его размерность. Процедура с именем АВ определяет сумму и количество элементов больших нуля в заданной строке массива. Формальные аргументы процедуры АВ : Х – массив, N – его размерность и Nstr - заданный индекс, номер строки, это входные аргументы; S и K – соответственно сумма и количество элементов больших нуля в заданной строке Nstr массива Х, это выходные аргументы. 30 Рисунок 20 – Процедура Main к заданию 2. 31 В основной процедуре Main имеются два обращения к подпрограмме, процедуре типа Sub с именем АВ. При первом обращении к процедуре АВ в неё передаются фактические аргументы в виде массива А, его размерность в виде константы 4 и индекс строки массива А в виде переменной К, это входные аргументы и выходные аргументы в виде имен переменных SА и KА это соответственно сумма и количество элементов больших нуля в строке К массива А. Указанные фактические аргументы занимают соответствующие места формальных. При втором обращении к процедуре АВ в неё аналогичным образом передаются фактические аргументы: массив В, его размерность 3, индекс М строки, SB и КВ соответственно сумма и количество элементов больших нуля в строке М массива В. Рисунок 21 – Процедуры типа Sub для процедуры Main задания 2. 32 Рисунок 22 – Содержимое файла Dan.txt - исходные данные к процедуре Main задания 2. Рисунок 23 – Содержимое файла Rez.txt - результат работы процедуры Main задания 2. В рассмотренной процедуре Main задания 2 (см. рис. 20) использовались статические массивы А и В, т. е. со статическим распределением памяти. В таких массивах размерность указывается при их объявлении и не может изменяться в процессе выполнения. 33 Рисунок 23 – Процедура Main с использованием динамических массивов. 34 На рис. 24 представлен вид процедуры Main задания 2 при использовании динамических массивов, т. е. с динамическим распределением памяти. В таких массивах их размерность можно перезадавать, как в процессе выполнения процедуры, так и при перезапусках процедуры. В данном случае следует обратить внимание на то, что количество вводимых элементов массивов А и В в файле Dan.txt должно соответствовать количеству указанному при вводе переменны NA и NB и соответственно в операторе ReDim. 2.2. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ Задание. Написать и отладить программу в соответствии с заданием своего варианта. Использовать динамические массивы. Ввод данных и вывод результатов организовывать по указанию преподавателя либо используя файлы, либо таблицы Excel. 1. Заданы две матрицы А(4, 4) и В(4, 4). Написать програм- му суммирования двух векторов Х и Y, где Х – вектор, в котором размещены элементы столбца матрицы А с минимальным средним арифметическим значением, Y – то же для матрицы В. 2. Заданы две матрицы А(4, 4) и В(4, 4). Написать программу вычисления вектора Z = Х + У, где Х – строка матрицы А, включающая минимальный элемент ее главной диагонали, Y – то же для матрицы В. 3. Заданы две матрицы А(4, 4) и B(3, 3) и два вектора C(4) и D(3). Написать программу вычисления произведений матриц на соответствующие им вектора. Определить минимальное среднее арифметическое значение для полученных векторов. 4. Заданы две матрицы В(4,4) и D(3,3). Написать программу транспонирования каждой из заданных матриц с последующим пе- 35 ремножением транспортированной матрицы на соответствующую ей исходную. 5. Заданы две матрицы А(3, 3) и В(3, 3). Написать программу проверки – является ли произведение этих матриц перестановочным, т.е. проверить равенство АВ = ВА. 6. Заданы две матрицы С(4, 4) и D(3, 3). Написать программу определения количества симметричных матриц. Матрица называется симметричной, если транспонированная матрица равна исходной. Для каждой симметричной матрицы вычислить сумму элементов, лежащих вне главной диагонали. 7. Заданы два массива С(6) и D(10). Для каждого из них осуществить перестановку первого по порядку элемента со вторым отрицательным элементом массива. 8. Заданы три квадратных уравнения АХ2 + BХ + С = 0; DX2 + FX + E = 0 и ZX2 + YX + S = 0. Написать программу нахождения максимального значения корня среди действительных корней этих уравнений. 9. Заданы два вектора А(0.052; 0.9; 0.15; 0.84; 0.67) и В(0.948; 0.1; 0.33; 0.16; 0.85). Написать программу, позволяющую расположить элементы одного вектора по возрастанию, а другого – по убыванию. Вычислить сумму полученных векторов. 10. Заданы две матрицы A(4, 4) и B(3, 3). Для каждого из них переставить столбцы с максимальным и минимальным элементом. 11. Заданы координаты четырёх точек A, B, C, D на плоскости. Определить наибольший из периметров треугольников ABC, ABD, ACD. 12. Три треугольника заданы координатами своих вершин. Написать программу вычисления площадей треугольников и определения минимальной площади. 36 13. Заданы два двумерных массива А(4, 4) и В(3, 3). Для каждого из них переставить последнюю строку со строкой с максимальным средним арифметическим значением. 14. Заданы две матрицы А(4, 4) и В(4, 4). Написать программу вычисления вектора Z = Х – Y, где Х – столбец матрицы А, включающий минимальный элемент матрицы; Y – то же для матрицы В. 15. Заданы три вектора X, Y, Z. Написать программу вычисn ления S CiDi , где Ci и Di – компоненты векторов С и D, котоi 1 рые соответственно равны С = Х + Y; D = Х - Z 16. Заданы матрицы С(4, 4) и D(3, 3). Определить индексы максимального элемента каждой из матриц среди элементов, расположенных выше главной диагонали. 17. Заданы вектора А(5), В(10), D(15). Дли каждого из них определить максимальный и минимальный элементы и их индексы. 18. Заданы координаты вершин трех треугольников. Определить сколько треугольников лежит внутри окружности радиуса R с центром в начале координат. 19. Заданы координаты десяти точек на плоскости и координаты точки-полюса. Найти точку, максимально удалённую от полюса, среди первых четырёх заданных точек и такую же точку – среди последних шести. Определить также расстояние между найденными точками. 20. Заданы массивы Y(4, 4) и Z(8, 8). Для каждого из них вычислить среднее арифметическое значение положительных элементов, расположенных выше главной диагонали. 21. Заданы координаты вершин трех треугольников. Определить треугольник с максимальным периметром. 37 22. Заданы три матрицы размерами 2×2, 3×3, 4×4. Для каждой из матриц определить среднее арифметическое значение положительных элементов главной диагонали. 23. Заданы три одномерных массива разной размерности. Для каждого из массивов определить повторяющиеся элементы. 24. Заданы координаты четырех точек на плоскости. Определить номера точек, расстояние между которыми минимальное. 25. Заданы две окружности (х - а)2 + (у - b)2 = r2 и (х - с)2 + (у - d)2 = R2 и координаты четырех точек. Определить количество точек, лежащих внутри каждой окружности. 26. Заданы три одномерных массива А(5), В(10), С(15). Написать программу решения уравнения рх2 + dх + r = 0, где р – минимальный элемент матрицы А, d – минимальный элемент матрицы В, r – минимальный элемент матрицы С. 27. Заданы одномерные массивы Х(5) и Y(7). Для каждого из них определить количество и сумму элементов, которые без остатка делятся на заданное число В. 28. Составить программу заполнения массивов А(5) и В(10) факториалами значений индексов их элементов. Вычисление факториала выполнить в подпрограмме. 29. Заданы одномерные массивы Х(15) и Y(10). Для каждого из них определить второй положительный элемент и его индекс. 30. Заданы одномерные массивы А(5) и В(7). В каждого из них поделить каждый чётный элемент на индекс последнего нулевого элемента в массиве. 38 ЛИТЕРАТУРА 1. Архипов В.Н., Калядин В.И., Любин А.Н., Макаров А.И. Программирование на фортране: методические указания к лабораторным работам. - М.;МГТУ «МАМИ», 2007, -144с. 2. Антомони В.И., Архипов В.Н., Любин А.Н., Тихомиров В.Н. Программирование на VBA в Microsoft Office: сборник лабораторных работ. - М.;МГТУ «МАМИ», 2011, -152с. 3. Антомони В.И., Архипов В.Н., Любин А.Н., Тихомиров В.Н. Основы программирование на VBA в Microsoft Office: учебное пособие. - М.;МГТУ «МАМИ», 2011, -142с. 4. Антомони В.И., Архипов В.Н., Любин А.Н., Тихомиров В.Н. Основы программирование на C#: сборник лабораторных работ - М.;МГТУ «МАМИ», 2011, -195с. 5. Лобанов А.С., Туманова М.Б. Решение задач на языке Visual Basic for Application: учебное пособие. - М.;МГТУ «МАМИ», 2009, -90с. 6. Гарнаев А. Самоучитель VBA технология создания пользовательских приложений. - М. BHV, 2006 – 153с. 7. Слепцова Л.Д. Программирование на VBA в Microsoft Office 2010. - М. «Диалектика», 2010, -431с. 8. Уокенбах Дж. Профессиональное программирование на VBA в Excel 2003.- М. «Диалектика», 2005, -800с. 39 Учебное издание. Любин Александр Николаевич Силин Михаил Данилович ПРОЦЕДУРЫ И ФУНКЦИИ В ЯЗЫКЕ ПРОГРАММИРОВАНИ VISUAL BASIC FJR APPLICATION Учебное пособие Под редакцией авторов. Оригинал-макет подготовлен редакционно-издательским отделом Университета машиностроения По тематическому плану внутривузовских изданий учебной литературы на 2013 г. Подписано в печать______.___.2013г. Формат 60х90 1/16. Бумага 80г/м2 .Гарнитура «Таймс». Ризография. Уч. печ. л. 4 Тираж 60 экз. Заказ № Университет машиностроения 107023, г. Москва, Б. Семеновская ул., 38