Справочник от Автор24
Поделись лекцией за скидку на Автор24

Информационное моделирование. Этапы компьютерного математического моделирования

  • ⌛ 2016 год
  • 👀 966 просмотров
  • 📌 911 загрузок
  • 🏢️ Санкт-Петербургский государственный университет промышленных технологий и дизайна
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Информационное моделирование. Этапы компьютерного математического моделирования» pdf
Министерство образования и науки Российской Федерации федеральное государственное бюджетное образовательное учреждение высшего образования «Санкт-Петербургский государственный университет промышленных технологий и дизайна» ИНФОРМАТИКА КОНСПЕКТ ЛЕКЦИЙ Часть 2 для заочной формы обучения по всем направлениям подготовки Составители: М. А. Ермина Д. А. Ермин Ф. Л. Хватова Санкт-Петербург 2016 1. Информационное моделирование Понятие модели Можно дать несколько определений модели. Модель – упрощенное представление о реальном объекте, процессе или явлении. Любая модель не является абсолютной копией своего оригинала, она лишь отражает некоторые его качества и свойства, наиболее существенные для выбранной цели исследования. При создании модели всегда присутствуют определенные допущения и гипотезы. Модель воспроизводит в специально оговоренном виде строение и свойства исследуемого объекта. Исследуемый объект, по отношению к которому изготавливается модель, называется оригиналом, образцом, прототипом. Модель – это объект, используемый вместо другого объекта с какой-то целью. Модель – это, как правило, искусственно созданный объект в виде схемы, математических формул, физической конструкции, наборов данных и алгоритмов их обработки и т. п. Модель – это некий новый объект, который отражает существенные особенности изучаемого объекта, явления или процесса. Сущность метода моделирования Моделирование – это метод познания, состоящий в создании и исследовании моделей. Каждый объект имеет большое количество различных свойств. В процессе построения модели выделяются главные, наиболее существенные, свойства. Так, модель самолета должна иметь геометрическое подобие оригиналу, модель атома — правильно отражать физические взаимодействия, архитектурный макет города – ландшафт и т. д. Цели моделирования 1. понять сущность изучаемого объекта, 2. научиться управлять объектом и определять наилучшие способы управления, 3. прогнозировать прямые или косвенные последствия воздействия на объект, 4. решать прикладные задачи. Разные науки исследуют объекты и процессы под разным углом зрения и строят различные типы моделей. Один и тот же объект может иметь множество моделей, а разные объекты могут описываться одной моделью. Системный подход в моделировании позволяет создавать полноценные модели. Особенности системного подхода заключаются в следующем: 2 - изучаемый объект рассматривается как система, описание и исследование элементов которой непосредственно целью не является, а выполняется с учетом их места в системе (наличие подзадач); - в целом объект не отделяется от условий его существования и функционирования; - объект рассматривается как составная часть чего-то целого (сам является подзадачей); - один и тот же исследуемый элемент рассматривается как обладающий разными характеристиками, функциями и даже принципами построения. При системном подходе на первое место выступают не только объяснения причин функционирования объекта, но и целесообразность включения его в состав других элементов. Допускается возможность наличия у объекта множества индивидуальных характеристик и степеней свободы. Альтернативы решения задач сравниваются в первую очередь по критерию «стоимость-эффективность». Создание универсальных моделей – это следствие использования системного подхода. Моделирование (эксперимент) может быть незаменимо. Мы не можем, например, устроить ядерную катастрофу, чтобы выяснить масштабы возможного заражения, а с помощью компьютера возможен расчет (и достаточно точный) интересующих исследователей параметров этого процесса. Моделирование – исследование явлений, процессов или систем объектов путем построения и изучения их моделей – это основной способ научного познания. В информатике данный способ называется вычислительный экспериментом и основывается он на трех основных понятиях: модель, алгоритм, программа. Использование компьютера при моделировании возможно по трем направлениям: 1. вычислительное – прямые расчеты по программе. 2. инструментальное – построение базы знаний, для преобразования ее в алгоритм и программу. 3. диалоговое – поддержание интерфейса между исследователем и компьютером. Классификация моделей Границы между моделями различных типов или классов, а также отнесение модели к какому-то типу или классу чаще всего условны. Рассмотрим наиболее распространенные признаки, по которым классифицируются модели. Основные признаки классификации моделей: 1. область использования; 2. учет в модели временного фактора (динамики); 3. отрасль знаний; 3 4. способ представления моделей. Классификация моделей по области использования По области использования выделяют: 1. опытные модели; 2. научно-технические модели; 3. имитационные модели; 4. учебные модели; 5. игровые модели. Опытные модели – это уменьшенные или увеличенные копии проектируемого объекта. Их называют также натурными и используют для исследования объекта и прогнозирования его будущих характеристик. Научно-технические модели создают для исследования процессов и явлений. Имитационные модели не просто отражают реальность с той или иной степенью точности, а имитируют ее. Эксперимент либо многократно повторяется, чтобы изучить и оценить последствия каких-либо действий на реальную обстановку, либо проводится одновременно со многими другими похожими объектами, но поставленными в разные условия. Подобный метод выбора правильного решения называется методом проб и ошибок. Учебные модели – тренажеры, наглядные пособия, обучающие программы. Игровые модели – деловые, экономические, спортивные игры. Классификация моделей с учетом фактора времени: статическая и динамическая модели Статическая модель – это одномоментный срез информации по объекту. Динамическая модель позволяет увидеть изменения объекта во времени. Один и тот же объект, возможно, изучать, применяя и статическую и динамическую модели. Классификация моделей по области знаний По области знаний выделяются модели биологические, экономические, исторические, социологические и т. д. Классификация моделей по способу представления Модели по способу представления подразделяются на материальные модели и информационные модели. Модели Материальные Информационные Вербальные Знаковые Компьютерные Некомпьютерные Материальные модели иначе можно назвать предметными, физическими. Они воспроизводят геометрические и физические свойства оригинала и всегда имеют реальное воплощение. 4 Материальные модели – это, к примеру, чучела птиц в кабинете биологии, карты при изучении истории и географии, схемы солнечной системы и звездного неба на уроках астрономии, макет многоступенчатой ракеты и еще многое другое. Нематериальное моделирование использует теоретический метод познания. По-другому его называют, абстрактным, идеальным. Информационные модели нельзя потрогать или увидеть воочию, они не имеют материального воплощения, потому, что они строятся только на информации. В основе этого метода моделирования лежит информационный подход к изучению окружающей действительности. Информационная модель – совокупность информации, характеризующая свойства и состояние объекта, процесса, явления, а также взаимосвязь с внешним миром. Информационные модели представляют объекты в виде словесных описаний, текстов, рисунков, таблиц, схем, чертежей, формул и т. д. Информационную модель можно выразить на языке описания (знаковая модель) или языке представления (наглядная модель). Вербальные и знаковые информационные модели К информационным моделям можно отнести вербальные (от лат. «verbalize» – устный) модели, полученные в результате умозаключений. Они могут остаться мысленными или быть выражены словесно. Примером такой модели может стать поведение человека при переходе улицы. Человек анализирует ситуацию на дороге (что показывает светофор, как далеко находятся машины, с какой скоростью они движутся и т. п.) и вырабатывает свою модель поведения. Если ситуация смоделирована правильно, то переход будет безопасным, если нет, то может произойти авария. Вербальная модель – информационная модель в мысленной или разговорной форме. Знаковая модель – информационная модель, выраженная специальными знаками, т. е. средствами любого формального языка. Знаковые модели – это рисунки, тексты, графики и схемы и т. п. Знаковое моделирование использует алфавиты формальных языков: условные знаки, специальные символы, буквы, цифры и предусматривает совокупность правил оперирования с этими знаками. Например, специальные языковые системы, физические или химические формулы, математические выражения и формулы, нотная запись и т. д. Программа, записанная по правилам языка программирования, тоже является знаковой моделью. Вербальные и знаковые модели, как правило, взаимосвязаны. Мысленный образ, родившийся в мозгу человека, может быть облечен в знаковую форму. И наоборот, знаковая модель помогает сформировать в сознании верный мысленный образ. По форме представления можно выделить следующие виды информационных моделей: 5 геометрические модели – графические формы и объемные конструкции;  словесные модели – устные и письменные описания с использованием иллюстраций;  структурные модели – схемы, графики, таблицы и т. п.;  логические модели – модели, в которых представлены различные варианты выбора действий на основе умозаключений и анализа условий;  специальные модели – ноты, химические формулы и т. п.;  математические модели – математические формулы, отображающие связь различных параметров объекта или процесса; Составление математической модели во многих задачах моделирования хоть и промежуточная, но очень существенная стадия. Одним из наиболее распространенных формальных языков является алгебраический язык формул в математике, который позволяет описывать функциональные зависимости между величинами. По способу реализации информационные знаковые модели подразделяются на компьютерные и некомпьютерные модели. Компьютерные и некомпьютерные модели Если модель выражена в абстрактной форме, то нужны некоторые знаковые системы, позволяющие ее описать – специальные языки, чертежи, схемы, графики, таблицы, алгоритмы, математические формулы и т. п. Например, существуют два варианта инструментария: либо традиционный набор инженера или конструктора (карандаш, линейка), либо компьютер. Компьютерная модель – модель, реализованная средствами программной среды. Это созданный за счет ресурсов компьютера виртуальный образ, качественно и количественно отражающий внутренние свойства и связи моделируемого объекта, иногда передающий и его внешние характеристики. Компьютерная модель представляет собой материальную модель, воспроизводящую внешний вид, строение или действие моделируемого объекта посредством электромагнитных сигналов. Разработке компьютерной модели предшествуют мысленные, вербальные, структурные, математические и алгоритмические модели. Одна и та же модель может одновременно относиться к разным классам деления. Примером служат программы, имитирующие движение тел (автомобиля, маятника, лифта и т. д.). Такие программы могут быть использованы на уроках физики (область знания) с целями обучения (цель использования). В то же время они являются динамическими, так как учитывают положение тела в разные моменты времени, и алгоритмическими по способу реализации. Этапы моделирования Создание моделей осуществляется в несколько этапов, рассматриваемых ниже.  6 Первым этапом является содержательная постановка задачи. Вначале нужно четко сформулировать задачу. При этом определяются объекты, которые относятся к решаемой задаче, а также ситуация, которую нужно реализовать в результате ее решения. Второй этап – это этап системного анализа задачи, в результате которого объект оказывается представленным в виде системы. Для того чтобы задачу можно было описать количественно и использовать при ее решении вычислительную технику, нужно произвести качественный и количественный анализ объектов и ситуаций, имеющих к ней отношение. При этом сложные объекты, разбиваются на части (элементы), определяются связи этих элементов, их свойства, количественные и качественные значения свойств, количественные и логические соотношения между ними, выражаемые в виде уравнений, неравенств и т. п. Следующим третьим этапом является этап математической постановки задачи, в процессе которой осуществляется построение математической модели объекта и определение методов (алгоритмов) получения решения задачи. Этот этап является этапом системного синтеза задачи. На этом этапе может оказаться, что ранее проведенный системный анализ привел к такому набору элементов, свойств и соотношений, для которого нет приемлемого метода решения задачи, в результате приходится возвращаться к этапу системного анализа. Как правило, решаемые в практике задачи стандартизованы, системный анализ производится в расчете на известную математическую модель и алгоритм ее решения, проблема состоит лишь в выборе подходящего метода. Четвертым этапом является разработка программы решения задачи на ЭВМ. Для сложных объектов, состоящих из большого числа элементов, обладающих большим числом свойств, может потребоваться составление базы данных и средств работы с ней, методов извлечения данных, нужных для расчетов. Для стандартных задач осуществляется не разработка, а выбор подходящего пакета прикладных программ. На заключительном пятом этапе производится эксплуатация модели и получение результатов. Таким образом, решение задачи включает следующие этапы: 1. содержательная постановка задачи; 2. системный анализ; 3. системный синтез (математическая постановка задачи); 4. разработка или выбор программного обеспечения; 5. решение задачи. Математические модели Математическая модель – приближенное описание объекта моделирования, выраженное с помощью математической символики. Математические модели появились вместе с математикой много веков назад. Огромный толчок развитию математического моделирования придало 7 появление ЭВМ. Применение вычислительных машин позволило проанализировать и применить на практике многие математические модели, которые раньше не поддавались аналитическому исследованию. Реализованная на компьютере математическая модель называется компьютерной математической моделью, а проведение целенаправленных расчетов с помощью компьютерной модели называется вычислительным экспериментом. Этапы компьютерного математического моделирования Первый этап – определение целей моделирования. Эти цели могут быть различными: 1. модель нужна для того, чтобы понять, как устроен конкретный объект, какова его структура, основные свойства, законы развития и взаимодействия с окружающим миром (понимание); 2. модель нужна для того, чтобы научиться управлять объектом (или процессом) и определить наилучшие способы управления при заданных целях и критериях (управление); 3. модель нужна для того, чтобы прогнозировать прямые и косвенные последствия реализации заданных способов и форм воздействия на объект (прогнозирование). Второй этап – определение входных и выходных параметров модели; разделение входных параметров по степени важности влияния их изменений на выходные параметры. Такой процесс называется ранжированием, или разделением по рангам. Третий этап – построение математической модели. На этом этапе происходит переход от абстрактной формулировки модели к формулировке, имеющей конкретное математическое представление. Математическая модель – это уравнения, системы уравнений, системы неравенств, дифференциальные уравнения или системы таких уравнений и т. д. Четвертый этап – выбор метода исследования математической модели. Чаще всего здесь используются численные методы, которые хорошо поддаются программированию. Как правило, для решения одной и той же задачи подходит несколько методов, различающихся точностью, устойчивостью и т. д. От верного выбора метода часто зависит успех всего процесса моделирования. Пятый этап – разработка алгоритма, составление и отладка программы для ЭВМ. Шестой этап – тестирование программы. Работа программы проверяется на тестовой задаче с заранее известным ответом. Седьмой этап – собственно вычислительный эксперимент, в процессе которого выясняется, соответствует ли модель реальному объекту (процессу). Модель достаточно адекватна реальному процессу, если некоторые характеристики процесса, полученные на ЭВМ, совпадают с экспериментально полученными характеристиками с заданной степенью точности. В случае 8 несоответствия модели реальному процессу возвращаемся к одному из предыдущих этапов. Классификация математических моделей В основу классификации математических моделей можно положить различные принципы. Можно классифицировать модели по отраслям наук (математические модели в физике, биологии, социологии и т. д.). Можно классифицировать по применяемому математическому аппарату (модели, основанные на применении обыкновенных дифференциальных уравнений, дифференциальных уравнений в частных производных, стохастических методов, дискретных алгебраических преобразований и т. д.). Исходя из общих задач моделирования в разных науках безотносительно к математическому аппарату, можно представить следующую классификацию:  дескриптивные (описательные) модели;  оптимизационные модели;  многокритериальные модели;  игровые модели. Дескриптивные (описательные) модели. В этом случае цели моделирования носят лишь описательный характер. Например, моделирование движения кометы, вторгшейся в Солнечную систему, производится с целью предсказания траектории ее полета, расстояния, на котором она пройдет от Земли, и т. д. Оптимизационные модели используются для описания процессов, на которые можно воздействовать, пытаясь добиться достижения заданной цели. В этом случае в модель входит один или несколько параметров, доступных влиянию. Например, меняя тепловой режим в зернохранилище, можно подобрать такой режим, чтобы достичь максимальной сохранности зерна, т. е. оптимизировать процесс хранения. Многокритериальные модели. Нередко приходится оптимизировать процесс по нескольким параметрам одновременно, причем цели могут быть весьма противоречивыми. Например, зная цены на продукты и потребность человека в пище, нужно организовать питание больших групп людей (в детском летнем лагере и др.) физиологически правильно и, одновременно с этим, как можно дешевле. Игровые модели могут иметь отношение не только к компьютерным играм. Существует специальный раздел современной математики – теория игр, изучающий методы принятия решений в условиях неполной информации. По характеру решаемых проблем модели могут быть разделены на функциональные и структурные модели. В первом случае все величины, характеризующие явление или объект, выражаются количественно. При этом одни из них рассматриваются как независимые переменные, а другие – как функции от этих величин. Математическая модель в этом случае обычно представляет собой систему 9 уравнений разного типа (дифференциальных, алгебраических и т. д.), устанавливающих количественные зависимости между рассматриваемыми величинами. Во втором случае модель характеризует структуру сложного объекта, состоящего из отдельных частей, между которыми существуют определенные связи. Как правило, эти связи не поддаются количественному измерению. Для построения таких моделей удобно использовать теорию графов. Граф – это математический объект, представляющий собой некоторое множество точек (вершин) на плоскости или в пространстве, некоторые из которых соединены линиями (ребрами). По характеру исходных данных и результатов предсказания модели могут быть разделены на детерминистические и вероятностно-статистические модели. Модели первого типа дают определенные, однозначные предсказания. Модели второго типа основаны на статистической информации, а предсказания, полученные с их помощью, имеют вероятностный характер. Пример математической модели Рассмотрим следующую задачу механики. Сигнальная ракета пущена с Земли с начальной скоростью v0 = 30 м/с под углом α=45° к ее поверхности; требуется найти траекторию ее движения и расстояние S между начальной и конечной точкой этой траектории. Пренебрегая размерами ракеты, будем считать ее материальной точкой. Введем систему координат xOy, совместив ее начало O с исходной точкой, из которой пущена ракета, ось x направим горизонтально, а ось y – вертикально. Тогда, как известно из школьного курса физики, движение ракеты описывается формулами: где t – время, g = 10 м/с2 – ускорение свободного падения. Эти формулы и дают математическую модель поставленной задачи. Выражая t через x из первого уравнения и подставляя во второе, получим уравнение траектории движения ракеты: Эта кривая (парабола) пересекает ось x в двух точках: x1 = 0 (начало траектории) и (место падения ракеты). Подставляя в полученные формулы заданные значения v0 и α, получим ответ: y = x – 90x2, S = 90 м. Отметим, что при построении этой модели использован ряд предположений: например, считается, что Земля плоская, а воздух и вращение Земли не влияют на движение ракеты. 10 2. Системы программирования Системы программирования – это совокупность различного рода программ, которые используются для автоматизации процесса программирования сценариев работы электронных вычислительных машин (ЭВМ). Основная задача систем программирования — это автоматическая трансляция (перевод) текста программы с входного языка высокого уровня на язык, понятный ЭВМ. Язык программирования – это строго определенный набор правил, характеризующий систему алгоритмов, лежащих в основе составляемой программы. Реализация языка программирования (транслятор) – это системная программа, которая переводит (транслирует) записи на языке высокого уровня в последовательность машинных команд, понятных ЭВМ. Существуют два основных транслятора языка программирования высокого уровня – интерпретаторы и компиляторы. Интерпретаторы последовательно анализируют по одному оператору программы, превращая при этом каждую синтаксическую конструкцию, записанную на языке высокого уровня, в машинные коды и выполняя их построчно. Компиляторы переводят программный код, написанный на языке высокого уровня, в машинные коды в ходе непрерывного процесса, создавая, таким образом, конечную программу, которую затем ЭВМ выполняет целиком без участия компилятора. Все существующие системы программирования делятся на машинноориентированные и машинно-независимые системы. Машинно-ориентированные системы программирования Машинно-ориентированные системы – это системы, в которых язык программирования, наборы операторов и изобразительные средства существенно зависят от особенностей архитектуры компьютера. Машинноориентированные системы используют машинно-зависимые языки программирования. Недостаток машинно-ориентированных систем заключается в сложности процесса написания программы. Машинно-ориентированные языки по степени автоматизации программирования делятся на: 1) машинные языки – это командные языки, которые имеет каждый отдельный компьютер; Каждый компьютер имеет свой машинный язык, то есть свою совокупность машинных команд, которая отличается количеством адресов в команде, назначением информации, задаваемой в адресах, набором операций, которые может выполнить машина и др. 11 При программировании на машинном языке программист должен держать под своим контролем каждую команду и каждую ячейку памяти, использовать все возможности имеющихся машинных операций. При этом можно составить такую компактную, маленькую программу, код которой может быть исполнен в любом самом примитивном микроконтроллере или чипе, что представляет особую ценность программирования в кодах машины. Однако процесс написания программы на машинном языке очень трудоемкий и утомительный. Программа получается громоздкой, труднообозримой, ее трудно отлаживать, изменять и развивать. 2) языки символического кодирования – это языки, которые, как и машинные языки, являются командными; Язык символического кодирования представляет собой систему операторов, соответствующих понятию машинной команды, в которых используются мнемонические обозначения кодов операций и символические названия операндов и элементов программы. Для обозначения констант в числовой, адресной или текстовой форме предусматриваются соответствующие операторы, являющиеся указателем константы соответствующего типа. Знаковыми элементами языка являются буквы русского и латинского алфавита, цифры, разделительные и пунктуационные знаки. Все эти знаки должны быть элементами алфавита, принятого в машине. 3) автокоды – это языки, которые включают в себя все возможности языков символического кодирования через использование макрокоманд. Макрокоманда – это часто использующаяся командная последовательность соответствующая определенной процедуре преобразования информации. Ассемблеры – это развитые автокоды; 4) макрос – это язык, который выступает средством замены определенной последовательности символов, описывающих сценарии действий ЭВМ при решении той или иной задачи на более сжатую форму. Машинно-независимые системы программирования Машинно-независимые системы – это системы, в которых используются высокоуровневые языки программирования. Классификация языков программирования высокого уровня Высокоуровневые языки программирования применяются в машиннонезависимых системах программирования. Данные системы программирования по сравнению с машинно-ориентированными системами являются более простыми в использовании. Языки программирования высокого уровня делятся на следующие виды: 1) процедурно-ориентированные языки, предназначенные для записи процедур или алгоритмов обработки информации для каждого определенного круга задач: а) язык Fortran (Фортран), название которого переводится как Formula Translation – «преобразование формул». Фортран является одним из старейших языков программирования высокого уровня. Первые сообщения, 12 посвященные данному языку, были опубликованы в 1956 г. специалистами фирмы «IBM». Первоначальный вариант Фортрана в последующие годы не раз модифицировался. Вначале Фортран создавался как язык программирования в сфере научных и инженерно-технических вычислений. Однако, его преимущество заключалось в том, что на этом языке также легко описываются задачи с разветвленной логикой, некоторые экономические задачи и особенно задачи редактирования (составление таблиц, сводок, ведомостей и т. д.). Фортран положен в основу других языков программирования высокого уровня. Столь длительное его существование объясняется простотой структуры данного языка; б) язык Basic (Бейсик), название которого расшифровывается как «Beginner's All-purpose Symbolic Instruction Code» – «многоцелевой символический обучающий код для начинающих», был создан в 1964 г. как язык для обучения программированию; в) язык С (Си), разработанный в 1970-е гг. сотрудником лаборатории Bell Labs Д. Ритчи как язык системного программирования специально для написания операционной системы UNIX (первоначально реализованной на ассемблере). Эффективность, экономичность и переносимость данного языка обеспечивают хорошее качество разработки практически любого вида программного продукта. Использование Си как инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на Си, сравнимы по скорости с программами, написанными на языке ассемблера, но создаются они гораздо быстрее. В 1980-е гг. на основе языка Си был разработан язык C++, который практически включает язык Си и дополнен средствами объектноориентированного программирования; г) язык Pascal (Паскаль), названный в честь французского ученого Б. Паскаля, был разработан в 1968-1971 гг. Н. Виртом. Первоначально Паскаль создавался для обучения программированию, однако со временем стал широко использоваться для разработки программных средств в области профессионального программирования; 2) проблемно-ориентированные языки, предназначенные дня решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники и возникновением целых классов новых задач, требующих решения. Языки данной группы позволяют программисту четко и коротко сформулировать задачу, а программы, написанные на основе этих языков, составлены соответственно в терминах решаемой задачи. К основным проблемно-ориентированным языкам можно отнести: а) язык Lisp (Лисп) – List Information Symbol Processing, изобретенный в 1962 г. Дж. Маккарти как средство для работы со строками символов. Благодаря языку Лисп возникла совершенно новая для программистов 13 область деятельности – «искусственный интеллект». Лисп используется в экспертных системах, системах аналитических вычислений и т. п.; б) язык Prolog (Пролог) – Programming in Logic, предназначенный для логического программирования в системах искусственного интеллекта. В основе Пролога лежат средства логического вывода, решающие запросы с использованием заданной базы фактов и правил, к которым обращаются как к утверждениям. 3) объектно-ориентированные языки, которые на сегодняшний день являются наиболее бурно развивающимися. Первый объектноориентированный язык программирования Simula (Симула) был создан в 1960 –х годах К. Нигаардом и Оле-Йоханом Далом. Концепция объектноориентированного программирования основывается на том, что в основе управления процессом реализации программы лежит передача сообщений объектам. Переменные и функции группируются в объекты и классы. Благодаря этому достигается более высокий уровень структуризации и абстракции программы. Одни объекты (классы) могут порождаться от других объектов (классов). Исходя из этого, можно определить следующие характерные свойства объектно-ориентированных языков программирования: - свойство абстракции, т. е. наличия формального представления о качествах или свойствах предмета путем мысленного удаления некоторых частностей или материальных объектов; - свойство инкапсуляции, т. е. наличия механизма, связывающего вместе код и данные, которыми он манипулирует, и защищающего их от внешних помех и некорректного использования; - свойство наследования, т. е. наличия процесса, с помощью которого один объект приобретает свойства другого, т.е. свойство иерархической классификации; - свойство полиморфизма, т. е. наличия возможности использовать один и тот же интерфейс для общего класса действий; Большинство из этих языков представляет собой развитые версии процедурных и проблемных языков, но программирование с помощью языков данной группы является более наглядным и простым. По сравнению с процедурно-ориентированными и проблемно-ориентированными языками программирования объектно-ориентированные языки характеризуются намного более дружелюбным пользовательским интерфейсом. К объектноориентированным языкам относятся: а) Visual Basic (на основе Basic); б) Delphi (на основе Pascal); в) Visual Fortran (на основе Fortran); г) C++(на основе С); д) Prolog++(на основе Prolog). Поколения языков программирования Языки программирования также можно разделять на поколения: 14 – языки первого поколения – языки машинно-ориентированные с ручным управлением памяти на компьютерах первого поколения. – языки второго поколения – языки с мнемоническим представлением команд, так называемые автокоды. – языки третьего поколения – языки общего назначения, используемые для создания прикладных программ любого типа. Например, Basic, Cobol, С и Pascal. – языки четвертого поколения – языки усовершенствованные, разработанные для создания специальных прикладных программ, для управления базами данных. – языки программирования пятого поколения – языки декларативные, объектно-ориентированные и визуальные. Например, Prolog, Lisp (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi. Классификация языков программирования по принципу программирования С точки зрения принципов программирования языки программирования можно разбить на 2 группы: директивные (процедурные) и декларативные (функциональные и логические). 1. Процедурные языки программирования При этом принципе программирования программа состоит из последовательности императивных команд, явно задающих, какие преобразования выполнять над данными. Данные хранятся в виде переменных. Процедурный подход – это исторически первым появившийся подход, при котором программист должен решить, какие процедуры должна выполнять программа, а затем выбрать наиболее подходящие алгоритмы для их реализации. Под процедурой понимается особенным образом оформленный фрагмент программы, имеющий собственное имя. Упоминание имени процедуры в тексте программы приводит к ее активизации и называется ее вызовом. Для обмена информацией с основной программой могут использоваться один или несколько параметров вызова. Процедуры могут вызываться из разных частей программы многократно. При этом в процедуру могут передаваться переменные и параметры-значения, сама процедура может возвращать результат работы в головную программу. Важным свойством процедур является использование ими локальных, доступных только данной процедуре, переменных, что позволяет исключить побочные эффекты при работе процедуры. Процедурное программирование может быть использовано в большинстве современных языков программирования. Примером процедурного языка является язык программирования Modula, Pascal, C, Fortran, Algol, PL/1, Cobol, Basic. Среди процедурных языков выделяют, в свою очередь, структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т. д. Известны 15 следующие структурные языки: Pascal, C, Ada, PL/1. В операционных языках для этого используются несколько операций. Среди операционных языков известны языки Fortran, Basic, Focal. Языки параллельных вычислений появились в 1980-е годы. Программа на языке параллельных вычислений – совокупность описаний процессов, которые могут выполняться одновременно или псевдопараллельно (Modula-2, Ada, Occam) Язык Modula-2– структурный, модульный язык программирования, разработанный Н. Виртом в 1978 году, с синтаксисом, основанным на языке Паскаль для многопоточного программирования, имеет стандартную библиотеку, поддерживающую параллельные программы. Язык программирования Occam (Оккам) – процедурный язык параллельного программирования высокого уровня, разработанный в начале 1980-х годов группой учѐных из Оксфорда под руководством Дэвида Мэя (David May). Оккам является языком высокого уровня, синтаксически похожим на Паскаль или Си. Языки низкого уровня (машинный код и Ассемблер) являются по принципам работы также процедурными языками программирования (императивными языками программирования). Большинство современных процедурных языков программирования развивается в направлении объектно-ориентированного программирования. Непроцедурное (декларативное) программирование появилось в начале 70-х годов 20 века, К непроцедурному программированию относятся функциональные и логические языки, такие как Lisp, SML, Haskell, Prolog. 2. Логические языки программирования Языки программирования данного типа основываются на формальной логике и булевой алгебре. Программа не содержит в себе явных алгоритмов. Задаѐтся описание условий задачи и логических соотношений, по которым система программирования строит дерево вывода и находит решения задачи. При этом подходе программист использует для программирования термины логики, с помощью которых он описывает объекты и задает отношения между ними. Примером является язык Prolog (программирование в терминах логики). Идея использовать логику в качестве языка программирования разрабатывалась в начале семидесятых годов Робертом Ковальским из Эдинбурга (теоретические аспекты), Маартен ван Эмденом (экспериментальная демонстрационная система), и Аленом Колмероэ (реализация). 3. Функциональные языки программирования Функциональное программирование основывается на использование списков и функций. При этом подходе программа представляет собой последовательность встроенных и определяемых пользователем функций. Переменные вообще могут отсутствовать. Язык Lisp представляет собой функциональный язык программирования, ориентированный на обработку 16 связанных списков. Функциональное программирование – это способ составления программ, в котором единственным действием является вызов функции, единственным способом разбиения программы на части является введение имени для функции и задание для этого имени выражения, вычисляющего значение функции, а единственным правилом композиции оператор суперпозиции функций. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни блок схем, ни передачи управления. Чтобы программировать при помощи функций, нужно иметь возможность определить достаточно большое множество основных функций и затем использовать композицию, чтобы определять функции в терминах исходных. Так можно построить библиотеку функций, некоторые из которых могут представляться достаточно мощными, чтобы называться программами. Одним из основных элементов функциональных языков является рекурсия (конструкция, при которой функция вызывает саму себя). Скриптовые декларативные языки программирования Языки сценариев появились в 1990-е годы. Используются в основном для организации взаимодействия с пользователем (реакции на его действия). Нашли широкое применение в программировании для Web (сети). Программа на языках сценариев – совокупность описаний возможных сценариев обработки данных. Среди языков сценариев известны: VBScript, PostScript, JScript, JavaScript, Python, Ruby, PHP. Языки разметки В последнее время получили широкое распространение теговые языки описания различных структур данных, преимущественно связанных с передачей информации через Internet. Говоря о программировании в Internet, часто имеют в виду создание публикаций с использованием языка разметки гипертекстовых документов HTML. Применение специальных средств (HTML-редакторов) позволяет не только создавать отдельные динамически изменяющиеся интерактивные HTML-документы, используя при этом данные мультимедиа, но и редактировать целые сайты. Одним из языков разметки является XML – теговый язык описания древовидных структур с атрибутами, используемый при построении различных типов документов. Особое место занимает язык программирования Java. Реализация этого языка не привязана к конкретной архитектуре вычислительного устройства (компьютера, мобильного телефона и т. д.) и конкретной операционной системе. Программа на языке Java транслируется в промежуточной код, который может быть выполнен на любом компьютере, на котором запущена виртуальная Java-машина. На языке Java можно разрабатывать не только стандартные программы, но и особые виды приложений (апплеты и сервлеты), которые естественным образом встраиваются в Интернет-приложения (HTML-страницы и в Web-серверы). Java является процедурным, объектноориентированным языком программирования. 17 Помимо описанных выше широко известных языков программирования, многие из которых десятки лет применяются для решения практических задач, существует целый ряд перспективных с точки зрения изучения профессионалами языков, которые в будущем могут занять важное место в структуре профессиональных навыков специалиста широкого профиля. Ниже представлено пять наиболее ярких примера такого рода языков программирования. 1. Erlang Erlang – функциональный язык программирования, разработанный компанией Ericsson, для разработки распределенных систем реального времени. Его главная особенность – параллельность. Его стоит изучать, потому что крупные банки с миллионами пользователей используют Erlang для банковских систем. 2. R Широко используется для разработки статистического программного обеспечения, но не очень популярен среди разработчиков. Этот язык рекомендуется знать тем, кто нуждается в серьезном анализе данных. Он работает на всех платформах и интегрируется со многими языками программирования, такими как Java, Ruby, C++, Python. Хотя он и не так популярен в настоящее время, ситуация может измениться в лучшую сторону. В январе 2015 Microsoft приобрела компанию Revolution Analytics для вклада в дальнейшее развитие языка R. 3. Swift Язык программирования Swift захватил разработчиков, как новый, более быстрый и легкий путь разрабатывать под Mac и iOS, по сравнению сObjective-C. Тем не менее, он актуален только в экосистеме Apple. Хороший для Apple – плохой для разработчика, который не хочет работать исключительно для Apple, особенно учитывая популярность Android. Его необходимо изучать, если вы хотите внести свой вклад в мир игр на iOS. 4. Go (Golang) В Интернете гораздо больше информации о том, почему Go больше плохой язык, чем хороший. Этот язык разработан компанией Google. Так, по данным Google, Go обеспечивает фундаментальную поддержку параллельного выполнения программ и коммуникации, и предлагает подход к построению системного программного обеспечения на многоядерных компьютерах. Этот язык может быть включен в список перспективных языков, однако есть определенные сомнения в отношении его будущего. 5. C# Знание C# поможет достаточно легко получить работу. На сегодняшний момент это самый популярный язык для разработки приложений для Windows, и очень популярный для мобильных устройств. Кроме того, движок для разработки игр Unity также использует C# в качестве одного из основных языков. Он очень похож на другие объектно-ориентированные языки 18 программирования и достаточно легко учится при наличии базовых знаний C++ или Java. 3. Технологии разработки программного обеспечения Основными технологиями разработки программного обеспечения являются: 1. структурное программирование; 2. модульное программирование. Структурное программирование Основной чертой структурного программирования является возможность разбиения программы на составляющие элементы. Идеи структурного программирования появились в начале 70-х годов в компании IBM, их разрабатывали известные ученые Э. Дейкстра, Х. Милс, Э. Кнут, С. Хоор. При создании программных средств распространены две методики (стратегии) разработки программ, относящиеся к структурному программированию: программирование «сверху вниз» и программирование «снизу вверх». Программирование «сверху вниз», или нисходящее программирование – это методика разработки программ, при которой разработка начинается с определения целей и методов решения поставленной задачи, после чего идет последовательная детализация (является противоположной методике программирования «снизу вверх»). При этой методике разработки программ задача анализируется с целью определения возможности разбиения ее на ряд подзадач. Затем каждая из полученных подзадач также анализируется для возможного разбиения на подзадачи. Процесс заканчивается, когда подзадачу невозможно или нецелесообразно далее разбивать на подзадачи. В данном случае программа конструируется иерархически – сверху вниз: от главной программы к подпрограммам самого нижнего уровня, причем на каждом уровне используются только простые последовательности инструкций, циклы и условные разветвления. Программирование «снизу вверх», или восходящее программирование – это методика разработки программ, начинающаяся с разработки подпрограмм (процедур, функций), в то время когда проработка общей схемы решения задачи не закончилась (является противоположной методике программирования «сверху вниз»). Такая методика является менее предпочтительной по сравнению с нисходящим программированием, так как часто приводит к нежелательным результатам, переделкам и увеличению времени разработки программных средств. Достоинства структурного программирования: 1. повышается надежность программ (благодаря хорошему 19 структурированию при проектировании, программа легко поддается тестированию и не создает проблем при отладке); 2. повышается эффективность программ (структурирование программы позволяет легко находить и корректировать ошибки, а отдельные подпрограммы можно переделывать (модифицировать) независимо от других); 3. уменьшается время и стоимость программной разработки; 4. улучшается читабельность программ. Технология структурного программирования при разработке серьезных программных комплексов, основана на следующих принципах: - программирование должно осуществляться «сверху вниз»; - весь проект должен быть разбит на модули (подпрограммы) с одним входом и одним выходом; - подпрограмма должна допускать только три основные структуры – последовательное выполнение, ветвление и повторение. - недопустим оператор передачи управления в любую точку программы; - документация должна создаваться одновременно с программированием в виде комментариев к программе. Структурное программирование эффективно используется для решения различных математических задач, имеющих алгоритмический характер. Модульное программирование Модульное программирование – это организация программы как совокупности небольших независимых блоков (модулей). Структура и поведение модулей подчиняется определенным заранее правилам. Модулем (в модульном программировании) называется множество взаимосвязанных подпрограмм (процедур) вместе с данными, которые эти подпрограммы обрабатывают. Модуль характеризуют:  один вход и один выход – на входе программный модуль получает определенный набор исходных данных, выполняет содержательную обработку и возвращает один набор результатных данных, т. е. реализуется стандартный принцип IPO (вход–процесс–выход);  функциональная завершенность – модуль выполняет перечень регламентированных операций для реализации каждой отдельной функции в полном составе, достаточных для завершения начатой обработки;  логическая независимость – результат работы программного модуля зависит только от исходных данных, но не зависит от работы других модулей;  слабые информационные связи с другими программными модулями – обмен информацией между модулями должен быть по возможности минимизирован. 20 Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки. Принципы модульного программирования программных продуктов во многом сходны с принципами нисходящего проектирования. Сначала определяются состав и подчиненность функций, а затем – набор программных модулей, реализующих эти функции. Однотипные функции реализуются одними и теми же модулями. Функция верхнего уровня обеспечивается главным модулем; он управляет выполнением нижестоящих функций, которым соответствуют подчиненные модули. При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующие требования: – каждый модуль вызывается на выполнение вышестоящим модулем и, закончив работу, возвращает работу вызвавшему его модулю; – принятие основных решений в алгоритм выносится на максимально «высокий» по иерархии уровень; – для использования одной и той же функции в разных местах алгоритма создается один модуль, который вызывается на выполнение по мере необходимости. Модульное программирование предназначено для разработки больших программ. В этом случае алгоритм решения задачи является деревом модулей: одни модули вызывают другие модули, начиная с самого верхнего первого модуля, называемого корневым модулем, или головной программой. Алгоритмы большой сложности обычно представляются с помощью схем двух видов: обобщенной схемы алгоритма, которая раскрывает общий принцип функционирования алгоритма и основные логические связи между отдельными модулями на уровне обработки информации (ввод и редактирование данных, вычисления, печать результатов и т. п.) и детальной схемы алгоритма, которая представляет содержание каждого элемента обобщенной схемы с использованием управляющих структур в блок-схемах алгоритма, псевдокода либо алгоритмических языков высокого уровня. Разработкой больших программ занимается коллектив программистов. Каждому программисту поручается разработка некоторой самостоятельной части программы – конструирование всех необходимых процедур и данных для этих процедур. Сокрытие данных (запрет доступа к данным из-за пределов модуля) предотвращает их случайное изменение и соответственно нарушение работы программы. Для взаимодействия отдельных частей (модулей) программы коллективу программистов необходимо продумать только интерфейс (взаимодействие) сконструированных модулей в основной программе. 21 4. Автоматизация решения практических задач с использованием языка программирования высокого уровня в приложениях WINDOWS Этапы решения задач на компьютере Решение задачи на компьютере – это автоматический процесс преобразования информации в соответствии с целью, поставленной в задаче. Процесс решения задачи на ЭВМ – совместная деятельность человека и компьютера. Этот процесс является достаточно сложным и трудоемким, поэтому представляется в виде нескольких последовательных этапов. При этом на долю человека приходится творческая деятельность, а на долю компьютера – автоматическая обработка информации в соответствии с заданным алгоритмом. Решение задач на ЭВМ состоит из следующих этапов: 1. постановка задачи; 2. построение математической модели; 3. разработка алгоритма; 4. запись алгоритма на языке программирования; 5. создание программного кода в интегрированной среде программирования; 6. отладка и тестирование программы; 7. получение и анализ результатов. Постановка задачи Постановку задачи выполняет человек, хорошо представляющий предметную область задачи. Он должен:  определить цель решения задачи;  дать точную формулировку задачи;  предложить идею решения задачи;  определить необходимый объем информации;  описать исходные данные и указать способы их хранения;  определить точность вычислений и форму выдачи результатов. Построение математической модели Чтобы решить задачу, связанную с исследованием реального объекта, необходимо описать этот объект в математических терминах, связанных определенными соотношениями (формулами), то есть построить его математическую модель. Такая модель всегда идеализирует реальный объект, но она позволяет математически строго решить задачу исследования объекта. Математическое описание поставленной задачи выполняет человек, при этом он должен выполнить:  анализ похожих решѐнных задач;  анализ условий существования решения;  анализ технических и программных возможностей. 22 Разработка алгоритма Алгоритм решения задачи разрабатывается на основе построенной математической модели и представляет конечную последовательность предписаний (правил), которая определяет процесс преобразования исходных данных в результаты решения задачи. Алгоритм разрабатывается одним из существующих способов, чаще всего в виде блок-схемы. Разработку алгоритма выполняет человек, имеющий знания в области программирования. Уровень его квалификации определяет эффективность разработанного алгоритма. Запись алгоритма на языке программирования Этот этап выполняет человек, умеющий программировать, так как он должен выбрать язык программирования, наиболее удобный для решения данной задачи. Программа – это один из способов представления алгоритма с использованием выбранного языка программирования для реализации его в компьютере. Создание программного кода в интегрированной среде программирования Программный код создается при помощи редактора кода интегрированной среды программирования. Внешний вид и функциональные возможности интегрированной среды программирования зависят от выбранного языка программирования высокого уровня. Отладка и тестирование программы Отладка программы – это проверка программы на наличие ошибок компиляции, ошибок выполнения и логических ошибок. Ошибки компиляции возникают, например, при наличии грамматических ошибок. Ошибки выполнения появляются после успешного завершения компиляции программного кода на стадии выполнения, например из-за некорректного ввода данных. Логические ошибки возникают в результате неверно разработанного алгоритма. В ходе отладки происходит совершенствование программного кода. Во время отладки программы логические ошибки исправляют путем контрольного тестирования. Тесты (контрольные примеры) составляются так, чтобы проверить все возможные варианты работы алгоритма. Проверка осуществляется путем сравнения заранее известных результатов тестов с результатами, полученными компьютером. Получение и анализ результатов После устранения всех видов ошибок, выявленных отладкой и тестированием, получают результаты решения поставленной задачи. Получение результатов может быть многократным в зависимости от смены исходных данных, поскольку решение должно быть универсальным для задач подобного класса. 23 5. Алгоритмизация вычислительных процессов 5.1. Основные понятия об алгоритмизации задач Алгоритм и его свойства Алгоритм – любая конечная последовательность основных математических и логических действий, однозначно определяющих процесс преобразования исходных данных в конечные результаты решения задачи. Само слово «алгоритм» происходит от имени хорезмского учѐного Абу Абдуллах Мухаммеда ибн Муса аль-Хорезми (от латинской формы арабского имени – Algorithmi). Считается, что он первым решил квадратное уравнение. Алгоритм – одно из основных понятий математики и информатики. Исходными данными и результатами алгоритма могут служить самые разнообразные объекты. Это открывает возможность широкого применения понятия алгоритма. Например, можно говорить об алгоритмах перевода с одного языка на другой, об алгоритмах управления (диспетчеризация поездов, самолетов, городского транспорта, функционирования предприятий и т. д.). Основные свойства алгоритмов 1. Дискретность – прерывность, раздельность. Алгоритм должен представлять процесс решения задачи как последовательное выполнение простых шагов (этапов). 2. Определенность – каждое правило алгоритма должно быть четким и однозначным. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче. 3. Понятность для исполнителя – исполнитель алгоритма должен знать, как его выполнять. 4. Результативность (конечность). Это свойство состоит в том, что алгоритм должен приводить к решению задачи за конечное число шагов. 5. Массовость – означает, что алгоритм решения задачи разрабатывается в общем виде, т. е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными. Формы представления алгоритмов На практике наиболее распространены следующие формы представления алгоритмов:  словесная – запись на естественном языке;  в псевдокодах – полуформализованное описание алгоритма на условном алгоритмическом языке, включающее в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и т. д.;  табличная;  графическая – с помощью графических символов; 24  программная – запись на искусственном языке (языке программирования). Словесный способ не имеет широкого применения по следующим причинам:  описания не строго формализуемы;  страдает многословностью записей;  допускает неоднозначность толкования отдельных предписаний. Псевдокод представляет собой систему обозначений и правил, предназначенную для единообразной записи алгоритмов. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций. Графическое представление алгоритма является наиболее компактным и наглядным по сравнению с остальными формами представления алгоритмов. При графическом представлении алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Такое графическое представление называется схемой алгоритма или блок-схемой. В блок-схеме каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий, управлению повторением действий, окончанию обработки и т. п.) соответствует геометрическая фигура, представленная в виде блочного символа. Блочные символы соединяются линиями потоков, определяющими очередность выполнения действий. Ниже приведены наиболее часто используемые блочные символы (табл. 1), которые соответствуют действующему ГОСТу. Стандарт на условные графические обозначения в схемах алгоритмов – ГОСТ 19.003-80 Настоящий стандарт распространяется на условные графические обозначения (символы) в схемах алгоритмов и программ, отображающие основные операции процесса обработки данных и программирования для систем программного обеспечения вычислительных машин, комплексов и систем независимо от их назначения и области применения. Стандарт устанавливает перечень, наименование, форму, размеры символов и отображаемые символами функции. 25 Перечень, наименование, обозначение символов и отображаемые ими функции Таблица 1 Наименование Обозначение размеры в мм и Функция 29. Пуск - останов Начало, конец, прерывание процесса обработки данных или выполнения программы 12. Ввод-вывод Преобразование данных в форму, пригодную для обработки (ввод) или отображения результатов обработки (вывод) 1. Процесс Выполнение операций или группы операций, в результате которых изменяется значение, форма представления или расположение данных Выбор направления выполнения алгоритма или программы в зависимости от некоторых переменных условий Выполнение операций, меняющих команды или группу команд, изменяющих программу 2. Решение 3. Модификация 4. Предопределенный процесс Использование ранее созданных и отдельно описанных алгоритмов или программ 26. Линия потока Указание последовательности между символами Указание связи между прерванными линиями потока, связывающими символами 28. Соединитель Соотношение геометрических элементов символов Размер a должен выбираться из ряда 10, 15, 20 мм. Допускается увеличивать размер a на число, кратное 5. Размер b равен 1,5a. 26 Примечание. При ручном выполнении схем алгоритмов и программ для обязательных символов 1-3, 12, 29 и рекомендуемых символов 3 и 4 допускается устанавливать b равным 2a. Блок «процесс» применяется для обозначения действия или последовательности действий, изменяющих значение, форму представления или размещения данных. Иногда для улучшения наглядности схемы несколько отдельных блоков объединяют в один блок. Блок « решение» используется для обозначения переходов управления по условию. В каждом таком блоке должны быть указаны вопрос, условие или сравнение, которые он определяет. Блок «модификация» – видоизменение, преобразование используется для организации циклических структур. Внутри блока записывается параметр цикла, для которого указывается его начальное значение, граничное условие и шаг изменения параметра цикла для каждого последующего повторения. Блок «предопределенный процесс» служит для указания обращений к вспомогательным алгоритмам, существующим автономно в виде некоторых самостоятельных модулей, и для обращения к библиотечным подпрограммам. Разновидности структур алгоритмов По своей структуре алгоритмы разделяют:  линейные;  разветвляющиеся;  циклические;  предопределенный процесс. Перечисленные алгоритмы могут быть составной частью алгоритмического процесса решения задачи. Алгоритмы линейной структуры, как правило, являются составной частью любого алгоритмического процесса. Алгоритм линейной структуры В алгоритмах линейной структуры все блоки имеют последовательное соединение логической связью передачи информационных потоков (рис. 1). В них могут использоваться все блоки, за исключением блоков проверки условия и модификации. В основном алгоритм линейной структуры – это объединение нескольких, следующих друг за другом блоков « процесс» и блоков « ввода/ вывода», в котором каждое последующее действие – операция выполняется строго за предыдущим. 27 Рис. 1. Алгоритм линейной структуры Алгоритм разветвляющейся структуры Алгоритмы, в которых в зависимости от выполнения некоторого логического условия происходит разветвление вычислений по одному из нескольких возможных направлений, называют разветвляющимися. Такие алгоритмы предусматривают выбор одного из альтернативных путей продолжения вычислений. Каждое возможное направление вычислений называется ветвью. Логическое условие называют простым, если разветвляющийся процесс имеет две ветви, и сложным, – если процесс разветвляется на три и более ветви. Любое сложное логическое условие может быть представлено в виде простых условий. В алгоритм простой разветвляющейся структуры заложены два варианта выполнения алгоритма. В этом случае можно выделить два вида структуры: 1. в зависимости от результата проверки записанного условия выполняются только действия ветви «да» (действия 1 и 2) или ветви «нет» (действия 3 и 4). Такая структура разветвления носит название полный выбор – полная альтернатива (рис. 2.1); 2. в зависимости от результата проверки условия либо выполняются действия ветви «да» (действия 1 и 2), либо пропускаются (рис. 2.2), образуя неполный выбор – неполную альтернативу. Рис. 2.1. Полная альтернатива 28 Рис. 2.2. Неполная альтернатива Ниже представлена структура множественного выбора. В этом случае от значения параметра выбора, влияющего на выполнение условий, будет выполнено одно из перечисленных действий (рис. 3). Рис. 3. Множественный выбор Алгоритмы циклических структур Алгоритмы циклических структур обеспечивают выполнение отдельных фрагментов алгоритма заданное или конечное, но неопределенное число раз, до получения результата при выполнении некоторого условия. Циклические алгоритмы позволяют существенно сократить объем программы за счет многократного выполнения группы повторяющихся вычислений, так называемого тела цикла. Специально изменяемый по заданному закону параметр, входящий в тело цикла, называется переменной цикла. Переменная цикла используется для подготовки очередного повторения цикла и отслеживания условий его окончания. В качестве переменной цикла 29 используют любые переменные, индексы массивов, аргументы вычисляемых функций и тому подобные величины. Во время выполнения тела цикла параметры переменной цикла изменяются в интервале от начального значения до конечного значения с заданным шагом (при организации циклических вычислений необходимо предусмотреть задание начального значения переменной цикла, закон ее изменения перед каждым новым повторением и ее конечное значение, при достижении которого произойдет завершение цикла). Цикл называется простым, если в теле цикла нет разветвлений и циклических структур. В противном случае он называется сложным. Циклические алгоритмы бывают двух видов: детерминированные и итерационные. Циклы, в которых число повторений заранее известно из исходных данных или определено в ходе решения задачи, называют детерминированными. Для организации детерминированных циклов наиболее целесообразно использовать блок модификации, внутри которого указывается переменная цикла, ее начальное и конечное значения, а также шаг ее изменения. Цикл с заданным числом повторений представлен на рис. 4, где P –параметр цикла (имя); P1 – начальное значение параметра цикла (имя или константа); P2 – конечное значение параметра цикла (имя или константа); P3 – шаг изменения параметра цикла (имя или константа); Рис. 4. Цикл с заданным числом повторений Тело цикла выполняется столько раз, сколько разных значений примет параметр в заданных пределах. Организовать подобный цикл возможно и при использовании блока проверки условия вместо блока модификации. Циклы, в которых число повторений неизвестно из исходных данных и не определено по ходу решения задачи, называют итерационными. В 30 итерационных циклах для организации выхода из тела цикла предусматривается проверка некоторого заранее заданного условия, для чего используют блок проверки условия. В итерационных циклах невозможно использовать блоки модификации, так как при организации таких циклов заранее неизвестно количество изменений переменной цикла и ее конечное значение. В зависимости от местонахождения блока проверки условия итерационные циклы могут быть организованы как циклы с предусловием (блок проверки условия размещен перед телом цикла) или с постусловием (блок проверки условия размещен после тела цикла). Если в цикле с предусловием входящие в тело цикла действия могут не выполняться ни разу (если начальное значение параметра цикла удовлетворяет условию выхода из цикла), то в цикле с постусловием они выполняются как минимум один раз (даже если начальное значение параметра цикла удовлетворяет условию выхода из него). На рис. 5 представлена блок-схема цикла с предусловием. Если условие выполняется, то выполняются действие 1, … , действие N (тело цикла) ветви алгоритма «да», иначе тело цикла не выполнится ни разу. Рис. 5. Цикл с предусловием На рис. 6 представлена блок-схема цикла с постусловием. Тело цикла в данном случае выполнится хотя бы один раз. Если условие не выполняется, то выполняются, то вновь повторяются действие 1, … , действие N (тело цикла) ветви «нет», иначе тело цикла больше не выполнится ни разу. 31 Рис. 6. Цикл с постусловием На рис. 7 представлен блок – предопределенный процесс обращения к ранее написанной подпрограмме. Рис. 7. Блок – предопределенный процесс 32 5.2. Примеры блок-схем алгоритмов Конечным продуктом разработки алгоритма и реализации его на ПК является программа, записанная на языке программирования высокого уровня. Пример 1. Алгоритм линейной структуры Определить объем шара в литрах. Радиус шара равен 5 см. 4 v    r3 3 Обозначения в блок-схеме: v – объем шара (л); r – радиус шара (cм); pi – константа (3,14). Рис. 8. Пример 1. Блок-схема алгоритма Рис. 9. Пример 1. Программный код на языке VBA 33 Пример 2. Алгоритм разветвляющейся структуры Определить принадлежность двух точек к одной окружности с центром в начале координат, если заданы координаты этих точек x1, y1, x2, y2. Обозначения в блок-схеме: x1, y1 – координаты первой точки; x2, y2 – координаты второй точки; r1 – расстояние от начала координат до первой точки; r2 – расстояние от начала координат до второй точки. Рис. 10. Пример 2. Блок-схема алгоритма Рис. 11. Пример 2. Программный код на языке VBA Пример 3. Алгоритм циклической структуры Вычислить приближенное значение суммы сходящегося ряда (0 < x < 1) x2 x3 x4 1 x    , 2 3 4 пренебрегая членами ряда, по абсолютной величине меньшими 0,00001. 34 Обозначения в блок-схеме: x – параметр; s – сумма ряда; sl – текущий член ряда; n – переменная-«счѐтчик». Рис. 12. Пример 3. Блок-схема алгоритма Рис. 13. Пример 3. Программный код на языке VBA 35 6. Язык программирования высокого уровня Visual Basic for Applications (VBA) 6.1. Основные понятия Visual Basic for Applications (VBA) – визуальная объектноориентированная система программирования, предназначенная для создания программ внутри офисных приложений Microsoft Office. Языковой основой VBA является классический язык BASIC, а VBA образует ядро приложения Visual Basic. С помощью VBA можно легко и быстро создавать пользовательские приложения, используя единую для всех офисных программ среду и язык. Язык VBA прост в освоении и позволяет быстро получать ощутимые результаты — конструировать профессиональные приложения, решающие практически все задачи, встречающиеся в среде Windows. Будучи языком, встроенным в какое-либо офисное приложение, VBA улучшает возможности данного приложения. Рекомендуется начинать разрабатывать приложения для одной офисной программы, например Microsoft Excel, поскольку табличный процессор является наиболее популярной офисной программой и обладает достаточно простой объектной моделью. Однако можно создавать приложения и для других офисных программ. Запись алгоритма на языке программирования – следующий этап после разработки алгоритма решения поставленной задачи. Язык программирования – искусственный язык, он опирается на словарь служебных слов и команд, а также систему правил записи конструкций языка. С помощью языка программирования создается текст программы (программный код). Программа – полное и четкое описание алгоритма на языке программирования. Чтобы программа работала, ее нужно перевести в машинный код. Этим занимаются специальные программы – компиляторы и интерпретаторы. Интерпретаторы просматривают и сразу выполняют инструкции языка, содержащиеся в тексте программы, подробно информируя разработчика программы о возникающих проблемах. В систему программирования Visual Basic for Applications помимо других компонентов в качестве транслятора включен интерпретатор. Алфавит VBA Алфавит языка включает следующие символы:  53 буквы – прописные и строчные буквы латинского алфавита и знак подчеркивания(_);  10 цифр(0 - 9);  23 специальных символа (+ - * / . , : ; = < > ‘ ― ( ) [ ] & $ @ ^ \ пробел);  составные символы (<> <= >= ); Неделимые последовательности знаков алфавита образуют слова, отделяемые друг от друга разделителями и несущие определенную смысловую 36 нагрузку в программе. Разделителями могут служить пробел, двоеточие, точка и другие специальные символы, и их комбинации. Используемые в программном коде слова подразделяются на:  ключевые;  стандартные идентификаторы;  идентификаторы пользователя. Ключевые (зарезервированные) слова имеют фиксированное написание и однозначно определенный смысл, который не может быть изменен. Например, Until, Goto, If, Loop, For, Do и т. д. Идентификаторы пользователя применяются для обозначения имен констант, переменных, процедур и функций, типов данных, меток. Имена задаются программистом и должны отвечать следующим правилам:  длина имени не должна превышать 255 символов;  имя не может содержать знаков точки, пробела, % , & , ! , #, @, $;  имя может состоять из любой комбинации букв, цифр и других символов, начинающейся с буквы;  нельзя использовать имена, совпадающие с именами встроенных функций и процедур и ключевыми словами;  имена должны быть уникальны внутри области, в которой они определены;  регистр букв (верхний или нижний) не имеет значения, но для большей наглядности текста программы и облегчения ее понимания следует умело сочетать верхний и нижний регистры, например, вместо имени код лучше написать Код, или вместо имени сумма_вклада – написать Сумма_вклада. Переменные, константы и стандартные функции Переменная обозначается идентификатором, определяющим некоторую область в памяти, в которой хранится ее значение. Это значение может изменяться в процессе выполнения программы. Каждая переменная принадлежит к определенному типу данных, и поэтому должна быть объявлена в разделе описаний до выполнения каких- либо действий с нею. Под описанием переменной подразумевается указание типа данных. В VBA переменные можно указывать явным и неявным образом. Для того чтоб в VBA включить обязательное объявление всех переменных необходимо в начале программы добавить строку: Option Explicit. После этой инструкции, на каждой не объявленной переменной будет происходить остановка программы, и отображаться ошибка до тех пор, пока всем переменным не будет присвоен тип в разделе Dim. 37 Примечание. Для того чтоб в VBE (Visual Basic Editor) инструкция Option Explicit вставлялась автоматически в каждый новый модуль, необходимо в настройках редактора VBE активировать данную опцию: Tools-Options..., на вкладке Editor поставить галочку "Require Variable Declaration". Рис. 14. Опция "Require Variable Declaration" Описание переменных явным образом Для описания типа переменных на уровне процедуры используется инструкция Dim, которая имеет следующий вид – после ключевого слова Dim следуют объявления переменных разделенных запятыми. Dim <имя переменной1>[As Тип], <имя переменной2> [As Тип],… где Dim – ключевое слово; имя переменной (идентификатор) – имя, удовлетворяющее стандартным правилам VBA; Тип – один из допустимых типов данных VBA (табл. 2). Если тип переменной не задан, то она по умолчанию получает тип Variant и результат зависит от значения переменной. Например, следующая инструкция описывает X и Y, как переменные целого типа(Integer), а Z – как переменную вещественного типа (Single). Dim X AS Integer, Y AS Integer, Z As Single В случае такого описания переменные X и Y будут хранить в памяти только числовые значения целого типа, Z будет хранить в памяти только числовые значения вещественного типа. 38 Типы данных в VBA Тип данных определяет множество допустимых значений, которое может принимать указанная переменная (табл. 2). Таблица 2 Тип данных Диапазон хранимых значений Byte(байт) 0..255 Boolean(логический) True, False Integer(целый) от -32768 до 32767 Long(длинный целый) от -2147483648 до 2147483647 Single(вещественный для отрицательных значений одинарной точности) от -3,402823*1038 до -1,401298*10-45 для положительных значений от 1,401298*10-45 до 3,402823*1038 Double (вещественный для отрицательных значений двойной точности) от -1,79769313486232*10308 до -4,94065645841247*10-324 для положительных значений от 4,94065645841247*10-324 до 1,79769313486232*10308 Currency(с от -922337203685477,5808 фиксированной десятичной до 922337203685477,5807 точкой) Date(дата и время) даты от 1.01.100 до 31.12.9999, время от 00:00:00 до 23:59:59 String(символьный) длина строки до 2 млрд. символов Variant для хранения различных типов данных Object для хранения ссылок на объекты Тип данных, Позволяет хранить в переменной определяемый пользователем с такого типа множество различных значений помощью ключевого слова разного типа. Используется для описания Type структур данных. Константы – элементы данных, значения которых, в процессе выполнения программы не меняются. Константы можно использовать как аргументы для процедур, в математических операциях, операциях сравнения и т. п. Константы в программе могут быть заданы явно своим значением (литеральные константы) или обозначены именем. Существуют правила, которые необходимо соблюдать при написании литеральных констант. Константы типа String  строковые константы должны быть заключены в двойные кавычки ("); 39    пустая строковая константа (так называемая "нулевая строка") обозначается двумя двойными кавычками, между которыми нет даже пробела (""); строковая константа обязательно должна вся находиться на одной строке. Числовые константы числовые константы могут содержать любой из числовых типов VBA;  числовые константы должны состоять только из числовых символов от 0 до 9;  числовая константа может начинаться со знака минус (-) и может содержать десятичную точку;  для числовых констант можно использовать экспоненциальное представление.  Константы типа Date константы типа Date необходимо помещать между знаками фунта (#), при этом формат задания даты может быть различным: #3-5-99# #february 13, 2015 10:15am# #jun-20-2015# # 9 april 2015#  VBA переформатирует дату к следующему виду: #4/9/2015#;  если пропустить знак фунта (#) при записи литеральной константы даты, VBA не сможет правильно интерпретировать константу даты как дату;  нельзя заключать литеральные константы даты в двойные кавычки, т. к. в этом случае VBA распознает такую константу как строковую. Константы типа Boolean Существуют только два вида констант типа Boolean: True, False. При этом их нельзя брать в кавычки или сокращать. Именованные константы Если константа обозначена именем, то она должна быть описана в разделе описаний. Для описания типа именованных констант на уровне процедуры используется инструкция Const, которая имеет следующий вид – после ключевого слова Const следуют описания именованных констант (с указанием их значений) разделенные запятыми. Const <имя константы > [AS Тип] = <Выражение>,… 40 где имя константы – имя, удовлетворяющее стандартным правилам VBA; Тип – один из допустимых типов данных VBA (табл. 2); Выражение – это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы. Например, следующая инструкция описывает именованные константы с именами R и K. Const R = "Результат ", K As Single = 0.2 Возможно описание без указания типа: Const a = 4.55 (в этом случае описана константа типа Variant). Встроенные функции Функция оперирует определенными данными и всегда возвращает некоторое результирующее значение. Функция – это встроенная формула, выполняющая действия над выражениями и генерирующая какое-то значение, которое вставляется в программу в том месте, где появляется имя этой функции. Некоторые из функций не требуют аргументов. Возвращаемое значение функции, как правило, используется в дальнейших вычислениях программы. В VBA имеется большой набор встроенных функций и процедур, упрощающих программирование, которые можно разделить на следующие категории:  математические;  функции проверки типов;  функции обработки строк;  функции преобразования форматов;  функции даты и времени. Математические функции Функция – Abs(x) – Sqr(x) – Exp(x) – Log(x) – Rnd – Cos(x) – Sin(x) – Atn(x) – Tan(x) – Sgn(x) – Fix(x) и Int(x) – возвращаемое значение модуль (абсолютная величина) числа x квадратный корень из числа х возведение основания натурального логарифма в степень x логарифм натуральный аргумента х случайное число из интервала [0,1] косинус аргумента x синус аргумента x арктангенс от аргумента х тангенс от аргумента х знак числа х функции отбрасывают дробную часть числа х и возвращают целое значение 41 Примечание. Разница между функциями Fix(x) и Int(x) состоит в том, что для отрицательных значений аргумента Int(x) возвращает ближайшее отрицательное целое число, меньшее или равное числу х, а Fix(x) – ближайшее отрицательное целое число, большее или равное числу х. Функции проверки типов Функция – проверка IsArray(переменная) – является ли переменная массивом IsDate(переменная) – является ли переменная датой IsError(переменная) – является ли переменная кодом ошибки IsNull(переменная) – является ли переменная пустым значением IsNumeric(переменная) – является ли переменная числовым значением IsObject(переменная) – является ли переменная объектом IsEmpty (переменная) – была ли переменная описана инструкцией Dim Функции преобразования форматов Val(строка) – возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа. Str(число) – возвращает значение типа Variant (String), являющееся строковым представлением числа (в качестве допустимого десятичного разделителя функция str воспринимает только точку). Format(Выражение[,Формат [,Первый день недели[,Первая Неделя Года]]]) – возвращает значение типа Variant(String ), содержащее выражение, оформленное согласно инструкциям, заданным в описании формата, где Выражение – обязательный аргумент (любое допустимое выражение – комбинация ключевых слов, операторов, переменных и констант, результатом которой является строка, число или объект); Формат – необязательный параметр (любое допустимое именованное или определенное пользователем выражение формата). Если к имени функции добавляется знак $ (Format$), то функция возвращает значение типа String. При создании числового формата пользователя можно использовать следующие символы: 0 – резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у форматируемого числа есть какая-нибудь цифра в этой позиции разряда, где в строке формата находится 0, функция отображает эту цифру, если нет, то в этой позиции отображается нуль; # – действие данного символа аналогично действию 0 с той лишь разницей, что незначащие нули не отображаются; . – резервирует позицию десятичного разделителя, определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки; % – резервирует процентное отображение числа; , – разделяет сотни от тысяч. Если в формате стоит "FIXED", то число форматируется до двух знаков 42 после точки. Например, функция Format(W, "###00.0") возвращает переменной W числовое значение в формате, указанном в кавычках. Функции обработки строк Рассмотрим наиболее часто употребляемые функции. Chr(код) – преобразует ASCII-код в строку. Например, Chr(10) осуществляет переход на новую строку, Chr(13) – возврат каретки. Lcase(строка) – преобразует строку к нижнему регистру. Ucase(строка) – преобразует строку к верхнему регистру. Len(строка) – возвращает число символов строки. Space(n) – возвращает строку, состоящую из n пробелов. String(n,char) – возвращает строку, состоящую из n символов (char). LTrim(строка) – возвращает копию строки без пробелов в ее начале. RTrim(строка) – возвращает копию строки без пробелов в ее конце. Trim(строка) – возвращает копию строки без пробелов в ее начале и конце. Left(string, length) – возвращает подстроку, состоящую из заданного числа первых символов исходной строки. Right(string, length) – возвращает подстроку, состоящую из заданного числа последних символов исходной строки. Mid(string, pos[, length]) – возвращает подстроку строки, содержащую указанное число символов, где string – строковое выражение, из которого извлекается подстрока; pos – позиция символа в строке String, с которого начинается нужная подстрока; length – число возвращаемых символов подстроки. Функции времени и даты Возвращают значение типа Variant. Day(дата) – возвращает значение, содержащее целое число, которое представляет день в значении даты. Month(дата) – возвращает значение, содержащее целое число, которое представляет месяц в значении даты. Year(дата) – возвращает значение, содержащее целое число, которое представляет год в значении даты. Аргумент дата — само значение даты или выражение, ее определяющее. Date возвращает значение, содержащее системную дату. Time возвращает значение, содержащее текущее время по системным часам компьютера. Now возвращает значение, содержащее текущую дату и время по системному календарю и часам компьютера. 43 Выражения При выполнении программы осуществляется обработка данных, в ходе которой с помощью выражений вычисляются и используются различные значения. Выражение представляет конструкцию, определяющую состав данных, операции и их порядок выполнения над данными. Выражения могут включать:  операнды;  знаки операций;  круглые скобки. В простейшем случае выражение может состоять из одной константы (вырожденное выражение). Операнды представляют собой данные, над которыми выполняются действия. В качестве операндов могут быть использованы константы, переменные, элементы массивов и функции. Операции определяют действия, которые выполняются над операндами. Круглые скобки используются, если необходимо нарушить приоритет выполнения операций. В зависимости от типов операций и операндов выражения могут быть арифметическими, логическими, строковыми и выражениями типа даты. Арифметические операции выполняются над числовыми данными и их результатом являются числа. Арифметические операции – сложение (+), вычитание (-), умножение (*), деление (/), возведение в степень (^), целочисленное деление (\), остаток от деления по модулю (mod). Операции сравнения или отношений. Результатом операций является значение типа Boolean, которое принимает одно из двух логических значений: True (истина) или False (ложь). Операции отношения – равно (=), не равно (<>), меньше или равно (<=), больше или равно (>=), меньше (<), больше (>), сcылка на объект (Is), подобие (Like). Логические операции используются в логических выражениях и результатом таких выражений являются логические значения (True или False). Логические операции – логическое и (And), логическое или (Or), логическое отрицание (Not), логическое исключающее или (Xor). Операции над строками используются в выражениях над строками, и результатом вычисления такого выражения является строка символов. Операции над строками – соединение двух строк (+) и конкатенация (&), однако предпочтительнее использовать знак &. 44 Приоритеты операций VBA выполняет операции выражения в соответствии с их приоритетами (указаны в сторону понижения приоритета): 1. вызов функции и выражения в скобках; 2. ^ (возведение в степень); 3. - (смена знака числа); 4. * (умножение), / (деление), \ (целочисленное деление), Mod (деление по модулю); 5. + и – (сложение и вычитание); 6. <, >, >=, <=, <>, = (операции отношения); 7. Not (логическое отрицание); 8. And (логическое и); 9. Or (логическое или); 10. Xor (логическое исключающее или). Структура программы на языке VBA Исходный текст программы состоит из последовательности строк, каждая из которых может начинаться с любой позиции. Структура программы включает:  заголовок программы;  раздел описаний (последовательность инструкций описаний – объявлений);  исполняемую часть (последовательность исполняемых инструкций);  Конец записи программы. Заголовок программы находится в начале программы и имеет вид: Sub < имя программы>() Раздел описаний содержит описание элементов программы. Исполняемая часть является основной частью («телом» программы), в которой над объявленными объектами производятся определенные действия, позволяющие получить требуемый результат. Структура программы (с именем Prim1) на VBA с использованием констант, простых переменных выглядит следующим образом: Sub Prim1() ’заголовок программы {Инструкции описания: Const <имя= выражение> ’ описание констант Dim<имя переменной > As Тип,…} ’ описание переменных {Исполняемая часть – <исполняемые инструкции>, <исполняемые функции>} End Sub ’конец записи программы 45 Примечание. При создании программ необходимо выполнять требования, перечисленные ниже. 1. Описания данных должны предшествовать описанию действий и содержать упоминание всех объектов, используемых в инструкциях. 2. В одной строке программы может быть записана одна или несколько инструкций, разделенных знаком двоеточия (:). Например, Z=X+Y : W=X^2+Y^2 3. Возможно использование переноса строк: одна инструкция может быть записана в нескольких строках, при этом допускается не более семи продолжений одной и той же строки (признаком продолжения является расположение знаков «Пробел» и «Знак подчеркивания» в конце разбиваемой строки). 4. Нельзя разбивать переносом строковую константу. 5. Для пояснения текста программ можно использовать комментарии. Комментарии – это фрагменты пояснительного текста в программе (любой набор допустимых в данном языке символов, которые не являются программным кодом и поэтому не компилируются). Комментарии могут быть расположены в любом месте программы. Признаком комментария является расположенный перед ним знак апострофа «‘» или для строки комментария – ключевое слово Rem. Комментарии позволяют выполнить две функции: делают программу легко читаемой, поясняя смысл ее инструкций, и отключают фрагменты программы при ее отладке. Например, ‘Заголовок процедуры общего вида с именем Prim1 SUB Prim1() ‘Объявление переменной C целого типа Dim C As Integer 46 6.2. Программирование алгоритмов линейной структуры 6.2.1. Инструкции для реализации алгоритмов линейной структуры Инструкции присваивания Инструкция вычисляет значение выражения и присваивает это значение переменной или константе. Формат записи инструкции представлен ниже. [Let] <Имя переменной> (или <Имя константы>) = <Выражение> где <Имя переменной>, <Имя константы>- конструкции, построенные по правилам VBA. Выражение – выражение того же типа, что и составляющие его операнды. В частных случаях выражение может состоять только из константы, переменной или функции. Например: X=Sqr(S) B=125.5 V=A^3 S=X^2+5 Ввод и вывод информации Для ввода и вывода информации в VBA используются две разновидности диалоговых окон (ДО): 1. окна ввода (InputBox); 2. окна сообщений (MsgBox). Ввод информации осуществляется с помощью диалогового окна ввода значений, которое реализуется встроенной функцией InputBox. В окне ввода отображается поле для ввода значения переменной, в которое пользователь должен ввести определенное значение и нажать кнопку «ОК». Таким образом функция InputBox осуществляет следующие действия:  выводит на экран диалоговое окно, содержащее заголовок, зону сообщения, поле ввода, значение по умолчанию;  устанавливает режим ожидания ввода текста пользователем и нажатия кнопки;  возвращает значение типа String, содержащее текст, введенный в поле. Формат записи функции Inputbox: Inputbox(сообщение[, заголовок окна][,поле ввода][,значение по умолчанию][,…]) где сообщение – строковое выражение, отображаемое как текст сообщения в диалоговом окне. Сообщение может состоять из нескольких строк. Для их разделения допускается использование символа возврата каретки(Chr(13)), 47 символа перевода строки(Chr(10)) или комбинации этих символов (Chr(13)) & (Chr(10)); заголовок окна – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения; поле ввода – вводимое строковое выражение (строка знаков). Помимо указанных аргументов в формате функции InputBox могут использоваться параметры [,…], регулирующие положение диалогового окна на экране, и имя файла справки о данном окне. Ниже приведен пример записи инструкции присваивания и задания переменной с значения, возвращаемого функцией InputBox, открывающей диалоговое окно для ввода (рис. 15). Сообщение Заголовок окна Поле ввода Рис. 15. Диалоговое окно ввода На рисунке в окне текст «конвертация градусов Цельсия» расположен в строке заголовка окна, в зоне сообщения расположен текст «Введите температуру в градусах по шкале Цельсия(C):», а в поле ввода – число 180. Вывод информации осуществляется в диалоговые окна сообщений, реализуемые инструкцией MsgBox или функцией MsgBox(). Формат записи инструкции MsgBox: MsgBox строковое выражение_1 [, числовое выражение или имена констант][, строковое выражение_2][,…] Формат записи функции MsgBox(): MsgBox (строковое выражение_1 [, числовое выражение или имена констант][, строковое выражение_2][,…]) где строковое выражение_1 – сообщение, отображаемое в диалоговом окне; числовое выражение – представляет тип используемого значка (табл. 3) или/и число и тип отображаемых кнопок (табл. 4); строковое выражение_2 – строковое выражение, отображаемое в строке заголовка диалогового окна. Помимо указанных аргументов в формате MsgBox могут использоваться параметры, регулирующие положение диалогового кна на экране, и имя файла справки о данном окне [,…]. 48 Таблица 3 определяющих Значения аргументов процедуры MsgBox, информационные значки в диалоговом окне сообщения Константа Значение Значок сообщения VbCritical 16 VbQuestion 32 VbExclamation 48 VbInformation 64 По умолчанию инструкция MsgBox осуществляет вывод информации в диалоговое окно, имеющее одну кнопку «OK» (константа vbOKOnly) и устанавливает режим ожидания нажатия кнопки. Таблица 4 Значения аргументов функции MsgBox, определяющих наличие кнопок в диалоговом окне сообщения Константа Значение Кнопки сообщения кнопка «OK» vbOKOnly кнопки «OK» и «Отмена» 1 vbOKCancel vbAbortRetryIgnore 2 vbYesNoCancel 3 кнопки «Прервать», «Повтор», «Пропустить» кнопки «Да», «Нет», «Отмена» vbYesNo 4 кнопки «Да», «Нет» кнопки «Повтор» и «Отмена» 5 vbRetryCancel Приведенная ниже инструкция вывода демонстрирует расположение параметров MsgBox в диалоговом окне вывода (рис. 16). Знак операции & используется для слияния строк, а комбинация функций (Chr(10) & Chr(13)) – для перевода строки и возврата каретки, чтобы результаты вычислений были напечатаны в четыре строки. В диалоговом окне помимо кнопки «OK» расположен значок сообщения (VbInformation). 49 Рис. 16. Диалоговое окно вывода инструкции MsgBox Если для вывода информации используется функция MsgBox, то в этом случае предполагается использовать в окне диалога несколько различных кнопок. Значение (тип – Integer), возвращаемое функцией MsgBox, зависит от того какая кнопка в окне сообщения была нажата (табл. 5). Ниже приведено обращение к функции MsgBox, которая реализует окно сообщения с вопросом о продолжении вычислений. В диалоговом окне (рис. 17) присутствует заголовок – «Ответьте на вопрос» и размещены две кнопки («Да», «Нет»). Значение, возвращаемое функцией MsgBox, будет присвоено переменной otv (тип – Integer). Рис. 17. Диалоговое окно вывода функции MsgBox Если будет нажата кнопка «Да», то переменной otv будет присвоено значение 6 (константа vbYes), если кнопка «Нет», то переменной otv будет присвоено значение 7 (константа vbNo) согласно табл. 5. Таблица 5 Перечень констант и значений, возвращаемых функцией MsgBox Константа Значение Нажатая кнопка vbOK 1 «OK» vbCancel 2 «Отмена» vbAbort 3 «Прервать» vbRetry 4 «Повтор» vbIgnore 5 «Пропустить» vbYes 6 «Да» vbNo 7 «Нет» 50 6.2.2. Примеры программ с алгоритмом линейной структуры 1. Даны величины X и Y. Вычислить Z=f(T,P). T x y y ; P  Sin(x) ; Z = P * T , при у ≠ 0 Блок-схема алгоритма примера приведена ниже (рис. 18). Рис. 18. Блок-схема алгоритма линейной структуры Текст программы для примера приведен ниже (рис. 19). Рис. 19. Текст программы для примера 1 51 2. Рассчитать чистую потребность (материал / комплектующее) по формуле, приведенной ниже. Ч  В  Остн  ОстК где Ч – чистая потребность; В – валовая потребность; Остн – остаток в начале планово-учетного периода; ОстК – остаток в конце планово-учетного периода. Блок-схема алгоритма примера приведена ниже (рис. 20). Рис. 20. Блок-схема алгоритма линейной структуры Текст программы для примера приведен ниже (рис. 21). Рис. 21. Текст программы для примера 2 52 6.3. Программирование алгоритмов разветвляющейся структуры 6.3.1. Инструкции для реализации алгоритмов разветвляющейся структуры Порядок выполнения инструкций в программе с разветвляющимся алгоритмом зависит от условий, которые проверяются по ходу выполнения программы. Вследствие этого программа реализуется по одному из нескольких заранее предусмотренных алгоритмом (возможных) направлений. Каждое отдельное направление называется ветвью вычислений. Разветвляющиеся структуры можно реализовать в программах с помощью инструкций условного перехода (If ... Then ... Else … End If) или выбора по значению (Select Case ... End Select). Порядок выполнения инструкций программы также можно изменить с помощью инструкции GOTO, называемой безусловным переходом. Инструкция безусловного перехода используется в тех случаях, когда необходимо выполнить не следующую по порядку инструкцию в программе, а помеченную меткой инструкцию. Формат записи безусловного перехода: Goto < метка> Примечание. Чаще всего оператор Goto используется в инструкции If, если необходим безусловный переход к помеченной инструкции. Инструкция If как способ реализации алгоритмов разветвляющейся структуры В VBA имеются две формы записи инструкции условного перехода: полная и краткая. If(если), Then(то), Else(иначе) – ключевые(служебные) слова. Условие представляет собой выражение логического типа. Формат записи краткой формы инструкции условного перехода в одну строку: If <условие> Then <инструкции> Формат записи краткой формы инструкции условного перехода в несколько строк: If <условие> Then ...<инструкция1> ...<инструкция2> … End If Когда условие истинно (т. е. результатом условия является True), то выполняется инструкция, или группа инструкций, следующая за ключевым словом «Then». Полная форма инструкции условного перехода, который имеет две альтернативные ветви вычислений. 53 Формат записи полной формы инструкции условного перехода в одну строку: If <условие> Then <инструкция1> Else <инструкция2> Формат записи полной формы инструкции условного перехода в несколько строк: If <условие> Then ...<инструкция1> … Else ...<инструкция2> … End If Оператор If работает следующим образом: если условие истинно (имеет значение True), то выполняется инструкция1 (первая ветвь), в противном случае выполняется инструкция2 (вторая ветвь). Обе ветви могут содержать не одну, а несколько инструкций. Для организации разветвлений по трем ветвям вычислений и более можно использовать несколько конструкций If, вложенных друг в друга. При этом каждое Else соответствует непосредственно предшествующему ему Then. Формат записи инструкции условного перехода с вложенными структурами: If <условие> Then <инструкции> ElseIf <условие> Then <инструкции> ElseIf <условие> Then ….. ….. Else <инструкции> End If Примечание. Следует избегать большой вложенности условных конструкций. Инструкция выбора Select Case … End Select Инструкция выбора позволяет выбрать ветвь вычислений из произвольного числа имеющихся вариантов, то есть организовать разветвления на произвольное число направлений. Select Case применяется в тех случаях, когда одна величина участвует в нескольких логических сравнениях и определяет, какой блок инструкций будет выполняться. Формат записи инструкции выбора Select Case: Select Case <выражение – селектор> Case <список выражений 1> ‘вариант 1 <инструкция(и) 1> 54 ………………. Case <список выражений n> ‘вариант n <инструкция(и) n> [Case Else [<инструкция(и) Else>]] End Select Инструкция выбора состоит из выражения, называемого селектором, списков выражений-вариантов, начинающихся словом Case, и необязательной ветви Else, имеющей то же значение, что и в условной инструкции If. Каждый вариант представляет список выражений и инструкцию или группу инструкций, следующих за списком. Список выражений может включать:  константы;  интервал значений;  функцию Is. Инструкции Else (необязательная часть) выполняются в том случае, если значение выражения (селектора) не совпадает ни с одним из предложений значений выражений, указанных после Case. Инструкция выполняется следующим образом: 1. вычисляется значение выражения-селектора; 2. просматриваются последовательно выражения-варианты, константы и значения из диапазонов соответствующего списка на предмет совпадения значений со значением выражения-селектора; 3. если для очередного варианта получено совпадение, то выполняется инструкция или группа инструкций данного варианта, затем выполнение инструкции выбора заканчивается и осуществляется переход к следующей за End Select инструкции; 4. если не нашлось ни одного совпадения, то выполняется инструкция после слова Else (при его наличии), иначе осуществляется переход к инструкции, следующей за End Select. 55 6.3.2. Примеры программ с алгоритмом разветвляющейся структуры 1. Даны два числа А и В. Если А-В>0 вычислить А  В , если нет вычислить ( А  В) 2 . Полученные результаты вывести. Блок-схема алгоритма примера приведена ниже (рис. 22). Рис. 22. Блок-схема алгоритма примера 1 Текст программы для примера приведен ниже (рис. 23). Рис. 23. Текст программы для примера 1 В программе использована полная форма инструкции условного перехода с записью в несколько строк. 2. Определить является ли вводимое целое число четным. Блок-схема алгоритма примера приведена ниже (рис. 24). 56 Рис. 24. Блок-схема алгоритма примера 2 Текст программы для примера приведен ниже (рис. 25). Рис. 25. Текст программы для примера 2 В программе использована полная форма инструкции условного перехода с записью в одну строку. 3. Даны значения двух параметров c и t. Вычислить значение параметра F. Зависимость параметра F от параметров c и t приведена ниже. Блок-схема алгоритма примера приведена ниже (рис. 26). Рис. 26. Блок-схема алгоритма примера 3 57 Текст программы для примера приведен ниже (рис. 27). Рис. 27. Текст программы для примера 3 В программе использована полная форма инструкции условного перехода с записью в несколько строк с вложенной структурой. 4. Вычислить площадь одной из трех фигур: квадрат, трапеция, круг. Блок-схема алгоритма примера приведена ниже (рис. 28). Рис. 28. Блок-схема алгоритма примера 4 58 Текст программы для примера приведен ниже (рис. 29). Рис. 29. Текст программы для примера 4 В программе использована инструкция выбора Select Case, в которой выражение-селектор представлено переменной k. В зависимости от значения этой переменной (для расчетов допустимы значения 1, 2, 3) площадь фигуры вычисляется по соответствующим формулам. Для возможности многократного выполнения программы использована функция MsgBox, которая реализует окно сообщения с вопросом о продолжении вычислений. В диалоговом окне присутствует вопрос – «Вы хотите продолжить работу?» и размещены две кнопки («Да», «Нет»). Значение, возвращаемое функцией MsgBox, будет присвоено переменной fl (тип – Integer). Для проверки значения переменной fl использована краткая форма инструкции условного перехода в одну строку, в которой после ключевого слова Then использована инструкция безусловного перехода GOTO. Если нажата кнопка «Да», то необходимо выполнить не следующую по порядку инструкцию в программе, а инструкцию, помеченную меткой 1 (ввод кода фигуры). 59 6.4. Программирование алгоритмов циклической структуры 6.4.1. Инструкции для реализации алгоритмов циклической структуры Для организации циклов в VBA, т. е. многократного выполнения одной или нескольких инструкций, можно использовать две основные группы инструкций: For…Next (циклы с фиксированным числом повторений) и Do...Loop (циклы с условием и неизвестным числом повторений). Существуют разновидности циклов с фиксированным числом повторений For...Next (For…Next и For Each…Next) и разновидности циклов с условием и неизвестным числом повторений While…Wend, Do...Loop (Do While...Loop, Do Until ...Loop, Do...Loop While, Do...Loop Until, Do...Exit Do…Loop), которые различаются типом проверяемого условия. Инструкция цикла For…Next В случаях, когда заранее известно число повторений некоторого процесса, пользуются инструкцией цикла с параметром. Для этого типа цикла необходимо задать границы (начальное и конечное значения счетчика) в пределах которых будет изменяться переменная цикла. Формат записи инструкции цикла For…Next: For <параметр цикла> = To [Step ] <инструкции> [Exit For] <инструкции> Next <параметр цикла> где For…Next – заголовок цикла; <параметр цикла> – числовая переменная, определяемая в заголовке цикла; <инструкции> – тело цикла; S1 и S2 – выражения, определяющие начальное и конечное значения параметра цикла; S3 – выражение, определяющее шаг приращения значения выражения S1 до значения S2. Значение переменной увеличивается или уменьшается с каждым повторением цикла. Если в конструкции цикла отсутствует Step, то приращение равно 1 (по умолчанию). При явном указании шага и для S3>0 должно выполняться условие – S1<=S2, в случае, если S3<0 должно выполняться условие – S1>=S2. Тело цикла может состоять из одного или нескольких инструкций. Работа инструкции For осуществляется таким образом, что тело цикла выполняется последовательно с каждым значением параметра цикла от начального до конечного значения. Когда значение параметра цикла превзойдет 60 конечное значение , цикл завершится, и будет выполняться инструкция, следующая за конструкцией For. Инструкция цикла For Each…Next Для обработки группы однородных объектов или массивов применяется следующая конструкция цикла. Формат записи инструкции цикла For Each…Next: For Each элемент In группа (имя группы однородных объектов) <инструкции> [Exit For] <инструкции> Next элемент Повторяет выполнение инструкций для каждого элемента семейства. Для досрочного выхода (до достижения параметром цикла конечного значения) из инструкции цикла при выполнении некоторого дополнительного условия, в тело цикла надо добавить Exit For. Инструкции цикла Do...Loop В итерационных циклах с условием и неизвестным числом повторений необходимо задавать начальное значение параметра цикла до входа в цикл и изменять его значение в теле цикла. В VBA применяются следующие способы организации итерационных циклов: «циклы с предусловием», «циклы с постусловием». Циклы с предусловием Необходимо отметить, что в этих циклах условие проверяется до того, как выполняется инструкция или группа инструкций. Тело цикла выполняется до тех пор, пока соблюдается (не соблюдается) какое-либо заданное условие. Минимальное число повторений этого цикла – 0. Инструкция цикла Do While <условие>…Loop Формат записи инструкции цикла: Do While <условие> <инструкции> [Exit Do] <инструкции> Loop Цикл выполняется до тех пор, пока <условие> истинно. <условие> – логическое выражение, принимающее значение True (истина) или False (ложь). Выполнение цикла с предусловием состоит из следующих шагов. 1. Проверяется <условие>. Если <условие> имеет значение True, то выполняются инструкции, составляющие тело цикла (до Loop) столько раз, пока<условие> не примет значение False. 2. Как только <условие> получит значение False, осуществится выход из цикла, т. е. переход к инструкции, следующей за Loop. 61 Необязательная инструкция Exit Do предназначена для прекращения цикла. Инструкция цикла Do Until <условие>…Loop Формат записи инструкции цикла: Do Until <условие> <инструкции> [Exit Do] <инструкции> Loop Ключевое слово Until указывает на то, что цикл выполняется до тех пор, пока условие не станет истинным. <условие> – логическое выражение, принимающее значение True (истина) или False (ложь). Выполнение цикла с предусловием состоит из следующих шагов. 1. Проверяется <условие>. Если <условие> имеет значение False, то выполняются инструкции, составляющие тело цикла (до Loop) столько раз, пока<условие> не примет значение True. 2. Как только <условие> получит значение True, осуществится выход из цикла, т. е. переход к инструкции, следующей за Loop. Необязательная инструкция Exit Do предназначена для прекращения цикла. Циклы с постусловием Цикл выполняется хотя бы один раз, так как проверка <условия> выполняется в конце цикла. Тело цикла выполняется до тех пор, пока соблюдается (не соблюдается) какое-либо заданное условие. Инструкция цикла Do…Loop While <условие> Формат записи инструкции цикла: Do <инструкции> [Exit Do] <инструкции> Loop While <условие> Цикл выполняется до тех пор, пока <условие> истинно. <условие> – логическое выражение, принимающее значение True (истина) или False (ложь). Выполнение цикла с постусловием состоит из следующих шагов. 1. Выполняются инструкции, составляющие тело цикла (до Loop). 2. Проверяется <условие>. Если <условие> имеет значение True, то вновь выполняются инструкции, составляющие тело цикла (до Loop) столько раз, пока<условие> не примет значение False. 3. Как только <условие> получит значение False, осуществится выход из цикла, т. е. переход к инструкции, следующей за Loop. Необязательная инструкция Exit Do предназначена для прекращения 62 цикла. Инструкция цикла Do…Loop Until <условие> Формат записи инструкции цикла: Do <инструкции> [Exit Do] <инструкции> Loop Until <Условие > Ключевое слово Until указывает на то, что цикл выполняется до тех пор, пока условие не станет истинным. <условие> – логическое выражение, принимающее значение True (истина) или False (ложь). Выполнение цикла с предусловием состоит из следующих шагов. 1. Выполняются инструкции, составляющие тело цикла (до Loop). 2. Проверяется <условие>. Если <условие> имеет значение False, то вновь выполняются инструкции, составляющие тело цикла (до Loop) столько раз, пока<условие> не примет значение True. 3. Как только <условие> получит значение True, осуществится выход из цикла, т. е. переход к инструкции, следующей за Loop. Необязательная инструкция Exit Do предназначена для прекращения цикла. Инструкция цикла While…Wend. Формат записи инструкции цикла: While <условие> <инструкции> Wend Цикл выполняется до тех пор, пока <условие> истинно. <условие> – логическое выражение, принимающее значение True (истина) или False (ложь). Выполнение цикла с предусловием состоит из следующих шагов. 1. Проверяется <условие>. Если <условие> имеет значение True, то выполняются инструкции, составляющие тело цикла (до Wend) столько раз, пока<условие> не примет значение False. 2. Как только <условие> получит значение False, осуществится выход из цикла, т. е. переход к инструкции, следующей за Wend. 63 6.4.2. Примеры структуры программ с алгоритмом циклической 1. Произвести табуляцию функции Y=F(x) для х=0;0.1;0.2;…;1.3;1.4 F(x)  sin(x 2  2x ) Блок-схема алгоритма примера приведена ниже (рис. 30). Рис. 30. Блок-схема алгоритма примера 1 Текст программы для примера приведен ниже (рис. 31). Рис. 31. Текст программы для примера 1 64 В программе использован цикл с предусловием Do While <условие>…Loop. 1 1 3 5 2. Вычислить приближенное значение числа pi с помощью 1     ряда, который стремится к pi/4, пренебрегая членами ряда по абсолютной величине меньшими t=0,0001 (точность вычислений). Блок-схема алгоритма примера приведена ниже (рис. 32). Рис. 32. Блок-схема алгоритма примера 2 Текст программы для примера приведен ниже (рис. 33). 65 Рис. 33. Текст программы для примера 2 В программе использован цикл с постусловием Do…Loop While <условие>. 3. Дана пирамида из n уровней шаров, основание которой представляет собой квадрат со стороной, состоящей из n шаров. Определить сколько шаров потребуется для строительства этой пирамиды. Блок-схема алгоритма примера приведена ниже (рис. 34). Рис. 34. Блок-схема алгоритма примера 3 Текст программы для примера приведен ниже (рис. 35). 66 Рис. 35. Текст программы для примера 3 В программе использован цикл с фиксированным числом повторений For...Next. Значение переменной цикла увеличивается на 1 с каждым повторением цикла (в конструкции цикла отсутствует Step и приращение значения переменной равно 1 по умолчанию). 4. Оформить таблицу зависимости плотности от высоты для h=0-1000 м Плотность воздуха убывает с высотой по закону: р  р 0 * е  h* z p 0  1,29 кг м3 z  1,25 *10  4 1 м Блок-схема алгоритма примера приведена ниже (рис. 36). Рис. 36. Блок-схема алгоритма примера 4 Текст программы для примера приведен ниже (рис. 37). 67 Рис. 37. Текст программы для примера 4 В программе использован цикл с фиксированным числом повторений For...Next. Значение переменной цикла увеличивается на 100 с каждым повторением цикла (в конструкции цикла присутствует ключевое слово Step и приращение значения переменной, равное 100). 6.5. Массивы 6.5.1. Массивы. Основные понятия Часто возникает необходимость решения задачи с большим, но конечным числом однотипных упорядоченных данных. В этом случае удобно описывать такой упорядоченный набор нумерованных компонент одним идентификатором (именем). Для обработки таких данных в языке VBA предусмотрен отдельный тип данных, называемый массивом. Массив – это структурированный тип данных, представляющий собой набор однотипных переменных с одним именем, каждая из которых называется элементом массива и имеет свой номер (индекс/индексы). Массивы могут быть: одномерные (для нумерации элементов используется один индекс), двумерные (для нумерации элементов используются два индекса: номер строки, номер столбца) и N-мерные. Число измерений массива может достигать 60. Для указания компоненты массива можно использовать имя массива и порядковый номер нужной компоненты в этом массиве. Массивы могут быть статические и динамические. Статические массивы Статическим называется массив с заранее известным количеством элементов. Для объявления (описания) статического массива необходимо указать тип элементов массива и их количество. Тип элементов массива называется базовым. 68 Формат объявления (описания) одномерного статического массива представлен ниже. Dim <идентификатор> ([<нижняя граница индекса TO>] <верхняя граница индекса >) As <тип> где <идентификатор> – имя массива; <нижняя граница индекса> – необязательный параметр, предназначенный для определения индекса первого элемента массива; <верхняя граница индекса> – индекс последнего элемента массива; <тип> – тип элементов массива. При использовании в VBA массивов индексирование по умолчанию начинается с нуля, т.е. индекс 0 обозначает первый элемент массива, индекс 1 – второй и т. д. Для задания по умолчанию нижней границы массива, равной 1, используется инструкция Option Base 1, которая ставится в начале модуля. Формат объявления (описания) двумерного статического массива представлен ниже. Dim <идентификатор> ([<нижняя граница индекса1 TO>] <верхняя граница индекса1>,[<нижняя граница индекса 2 TO>] <верхняя граница индекса 2>) As <тип> где <идентификатор> – имя массива; <нижняя граница индекса1> – необязательный параметр, предназначенный для определения индекса1 первого элемента массива; <нижняя граница индекса1> – необязательный параметр, предназначенный для определения индекса1 первого элемента массива; <верхняя граница индекса1> – индекс1 последнего элемента массива; <верхняя граница индекса2> – индекс2 последнего элемента массива; <тип> – тип элементов массива. Примеры описания статических массивов Описание одномерного массива, состоящего из 11 вещественных чисел (одномерный массив с начальным значением индекса, равным 0): Описание одномерного символьного массива, состоящего из 3 элементов (интервал значений индекса указан явно): Описание двумерного массива, состоящего из 15 элементов целых значений: Описание двумерного массива, состоящего из 16*18 вещественных чисел (двумерный массив с начальными значениями индексов равными 0): 69 Динамические массивы Динамическим называется массив, размерность которого определяется в ходе выполнения программы. Формат объявления (описания) динамического массива представлен ниже. Dim <идентификатор> () As <тип> где <идентификатор> – имя массива; <тип> – тип элементов массива. Размерность массива устанавливается и изменяется с помощью инструкции ReDim. Формат инструкции ReDim для одномерного динамического массива представлен ниже. ReDim <идентификатор> ([<нижняя граница индекса TO>] <верхняя граница индекса >) As <тип> где <идентификатор> – имя массива; <нижняя граница индекса> – необязательный параметр, предназначенный для определения индекса первого элемента массива; <верхняя граница индекса> – индекс последнего элемента массива; <тип> – тип элементов массива. Формат инструкции ReDim для двумерного динамического массива представлен ниже. ReDim <идентификатор> ([<нижняя граница индекса1 TO>] <верхняя граница индекса1>,[<нижняя граница индекса 2 TO>] <верхняя граница индекса 2>) As <тип> где <идентификатор> – имя массива; <нижняя граница индекса1> – необязательный параметр, предназначенный для определения индекса1 первого элемента массива; <нижняя граница индекса1> – необязательный параметр, предназначенный для определения индекса1 первого элемента массива; <верхняя граница индекса1> – индекс1 последнего элемента массива; <верхняя граница индекса2> – индекс2 последнего элемента массива; <тип> – тип элементов массива. Примеры описания динамических массивов Например, объявим одномерный динамический массив целых чисел, размерность которого n определяется в ходе выполнения программы: Вычислив необходимый размер одномерного массива, можно изменить размер массива с помощью ReDim: 70 Например, объявим двумерный динамический массив целых чисел, размерность которого n определяется в ходе выполнения программы: Вычислив необходимые размеры двумерного массива, можно изменить размеры массива с помощью ReDim: Для установки и изменения размерности массива без потери его содержимого применяется следующее описание массива. Формат инструкции ReDim Preserve для одномерного динамического массива представлен ниже. ReDim Preserve <идентификатор> ([<нижняя граница TO>] <верхняя граница>) As <тип> Формат инструкции ReDim Preserve для двумерного динамического массива представлен ниже. ReDim Preserve <идентификатор> ([<нижняя граница индекса1 TO>] <верхняя граница индекса1>,[<нижняя граница индекса 2 TO>] <верхняя граница индекса 2>) As <тип> Для определения параметров динамического массива используются следующие функции. Функция Array(<список аргументов>) – создаѐт массив типа Variant. Список аргументов представляет разделенный запятыми список значений, присваиваемых элементам массива. Например, определим массив дней недели: Функция IsArray(<имя переменной>) используется для проверки значений переменных типа Variant, содержащих массивы. Она возвращает значение True, если переменная содержит массив, и значение False, если переменная не содержит массив (не является массивом). Действия над элементами массивами После объявления массивов в разделе описания можно обработать каждый элемент массива в исполняемой части программы, указав имя массива и индекс элемента в круглых скобках. Например, пятый элемент одномерного массива с именем A записывается как A(5). Индексированные элементы массива являются переменными базового типа и могут быть использованы так же, как простые переменные. В частности, им можно присваивать любые значения, соответствующие их типу. На практике обработку массивов целесообразнее выполнять с помощью специальных инструкций цикла таким образом, чтобы параметр цикла использовался для индексирования массива. При изменении параметра цикла от нижнего значения до верхнего, обрабатываются один за другим все элементы 71 массива. Типовые алгоритмы обработки массивов Рассмотрим основные действия над одномерными статическими массивами и их элементами на примере двух массивов. Объявление массивов A, D и переменной для индексирования массивов. Для задания по умолчанию нижней границы массива, равной 1, используется инструкцией Option Base 1: Ввод массива: Вывод массива: Копирование массива: Обнуление массива: Перестановка элементов массива Перестановка значений массива осуществляется с помощью дополнительной переменной того же типа, что и базовый тип массива. Пусть требуется поменять местами значения элементов k и n массива A, тогда соответствующий фрагмент программы с использованием вспомогательной переменной X выглядит следующим образом: Поиск и обработка значений элементов массива 1. Пусть требуется определить положительность элементов массива A и вычислить сумму положительных и сумму неположительных элементов массива A. Фрагмент программы будет иметь следующий вид: 72 2. Для получения полного перечня комбинаций цифр и номеров воспользуемся инструкцией цикла For Each…Next, которая предназначена для обработки группы однородных объектов или массивов. Массивы цифр и номеров представляют собой динамические массивы типа Variant, для определения их параметров используется функция Array. Данная функция создаѐт массивы, представляя разделенный запятыми список значений, присваиваемых элементам массива. Программа, записанная на VBA, будет иметь следующий вид: Будет получен следующий результат: Двумерные массивы Ввод данных в двумерный массив осуществляется так же, как и одномерный. Отличие состоит только в том, что ссылка на элемент массива осуществляется указанием номера строки и номера столбца, на пересечении которых находится элемент. Фрагмент программы, содержащий заполнение матрицы данными будет иметь следующий вид: При обработке двумерного массива из-за наличия двух индексов используется структура, называемая вложенным циклом, представляющая собой цикл в цикле: цикл по столбцам в цикле по строкам или наоборот. Фрагмент программы, предназначенный для нахождения количества чисел в строках матрицы кратных пяти, будет иметь следующий вид: 73 6.5.2. Примеры программ с структуры для обработки массивов алгоритмом циклической 1. Дан массив А(1 TO 10). Найти индексы наибольшего и наименьшего элементов и их значения. Блок-схема алгоритма примера приведена ниже (рис. 38). Рис. 38. Блок-схема алгоритма примера 1 Текст программы для примера приведен ниже (рис. 39). 74 Рис. 39. Текст программы для примера 1 2. Дан массив целых чисел В(10). Найти сумму значений элементов массива из диапазона [-5,35]. Блок-схема алгоритма примера приведена ниже (рис. 40). 75 Рис. 40. Блок-схема алгоритма примера 2 Текст программы для примера приведен ниже (рис. 41). Рис. 41. Текст программы для примера 2 3. Дан массив D(10). Найти количество отрицательных элементов массива. Блок-схема алгоритма примера приведена ниже (рис. 42). 76 Рис. 42. Блок-схема алгоритма примера 3 Текст программы для примера приведен ниже (рис. 43). Рис. 43. Текст программы для примера 3 77 4. Сформировать целочисленную матрицу, используя датчик случайных чисел. В полученной матрице найти столбцы, в которых число четных элементов превышает число нечетных элементов. Блок-схема алгоритма примера приведена ниже (рис. 44). Рис. 44. Блок-схема алгоритма примера 4 Текст программы для примера приведен ниже (рис. 45). 78 Рис. 45. Текст программы для примера 4 79 6.6. Работа с пользовательскими функциями и процедурами общего вида В VBA процедура является частью кода, выполняющего определенный алгоритм, представленный набором инструкций. Процедура может быть двух видов:  процедура общего вида (Sub);  процедура-функция (Function). Процедуры Sub и Function являются самостоятельными процедурами, позволяющими выполнять последовательность инструкций (действий) над заданными аргументами. Запись процедуры общего вида имеет синтаксис, представленный ниже: [Private/Public] [Static] Sub Имя[(Список аргументов)] <Инструкции> <[Exit Sub]> <Инструкции> End Sub Запись процедуры-функции имеет синтаксис, представленный ниже: [Private/Public] [Static] Function Имя[(Список аргументов)] [As Тип] <Инструкции> <[Exit Function]> <Инструкции> End Function Примечание. По правилам VBA допускается отсутствие некоторых параметров в их заголовках, поэтому в представленном выше синтаксисе они заключены в квадратные скобки. Первая строка – заголовок процедуры или процедуры-функции, признаком которой является ключевое слово Sub или соответственно Function. Вслед за именем в скобках располагается список формальных аргументов (они могут отсутствовать). Ниже перечислены обозначения параметров заголовка процедур и их назначение. Private – процедура общего вида Sub (процедура-функция Function) доступна для всех других процедур только того модуля, в котором она написана. Public – процедура общего вида Sub (процедура-функция Function) доступна для всех процедур во всех модулях. [Static] – локальные переменные процедуры общего вида Sub (процедуры-функции Function) сохраняются между вызовами этой процедуры. Имя – имя процедуры общего вида Sub (процедуры-функции Function), удовлетворяющее правилам построения имен в VBA. 80 Список аргументов – список имен переменных, представляющий аргументы, которые передаются в процедуру общего вида Sub (процедуруфункцию Function) при ее вызове и возвращаются в вызывающую процедуру. Имена переменных разделяются запятой. Инструкции – последовательность инструкций соответственно алгоритму. Наличие (возможно также отсутствие) инструкций Exit Sub и Exit Function приводит к немедленному выходу из процедур. Согласно синтаксису записи процедур общего вида и процедур-функций запись заголовка и окончания процедур различны для этих типов процедур. Также процедура-функция может иметь тип, так как вычисленное значение в самой процедуре Function присваивается одноименной переменной с типом, указанным в ее заголовке. Обращение к процедурам и возврат вычисленных в них значений тоже имеют различия. Вызов процедур общего вида (Sub) Вызов процедуры общего вида Sub осуществляется из главной (вызывающей) процедуры по ее имени со списком фактических аргументов. Инструкция обращения к процедуре имеет следующий формат: Call <Имя процедуры>(Список фактических аргументов) Возврат из процедуры происходит к инструкции, следующей за обращением. Примеры использования процедур общего вида 1. Даны программные коды двух процедур OBRACHENIE и prim1. Обе процедуры хранятся в одном модуле (рис. 46). Рис. 46. Программные коды двух процедур OBRACHENIE и prim1 В приведенном выше программном коде процедуры OBRACHENIE строка Call prim1(n, m, res) представляет собой обращение к процедуре prim1, где prim1 – имя процедуры, а n, m, res – аргументы, называемые фактическими. 81 Аргументы n, m – аргументы, передающие значения из вызывающей процедуры в вызываемую процедуру (над этими значениями в процедуре производятся вычисления), res – аргумент, передающий результат вычислений из вызываемой процедуры prim1 в вызывающую процедуру OBRACHENIE. Фактические аргументы, представляющие собой исходные данные для вычислений, должны быть определены до вызова процедуры. Блок-схема алгоритма для вызывающей процедуры OBRACHENIE примера приведена ниже (рис. 47). Рис. 47. Блок-схема алгоритма для вызывающей процедуры OBRACHENIE примера 1 Блок-схема алгоритма для вызываемой процедуры prim1 примера приведена ниже (рис. 48). Рис. 48. Блок-схема алгоритма для вызываемой процедуры prim1 примера 1 82 Ввод и вывод данных в блок-схеме процедуры prim1 соответствует передаче данных через аргументы процедуры, n, m, prog1 представляют собой формальные аргументы процедуры. Для n=10, m=2 процедура prim1 находит произведение квадратов нечетных чисел из интервала от 1 до 10. 2. Ниже приведен пример обращения из процедуры DEMO() к процедуре общего вида Obr(f, i, o, FIO) с фактическими аргументами f, i, o, FIO. Обе процедуры хранятся в одном модуле (рис. 49). В процедуру Obr передаются фамилия, имя, отчество пользователя, процедура возвращает ФИО пользователя. Рис. 49. Программные коды двух процедур DEMO и Obr Блок-схема алгоритма для вызывающей процедуры DEMO примера приведена ниже (рис. 50). Рис. 50. Блок-схема алгоритма для вызывающей процедуры DEMO примера 2 Блок-схема алгоритма для вызываемой процедуры Obr примера приведена ниже (рис. 51). 83 Рис. 51. Блок-схема алгоритма для вызываемой процедуры Obr примера 2 В данном примере имена фактических и формальных аргументов полностью совпадают. Ввод и вывод данных в блок-схеме процедуры Obr соответствует передаче данных через аргументы процедуры. Вызов процедур-функций (Function) В отличие от обращения к процедуре общего вида (Sub) обращение к процедуре-функции (Function) производится по ее имени со списком фактических аргументов. Имя функции со списком фактических аргументов может находиться в правой части выражения инструкции присваивания в вызывающей программе (например, Z= F(x,y), где F – имя процедуры-функции, а x и y – аргументы) или может быть аргументом функции Format, параметром инструкции MsgBox. Примеры использования процедур-функций 1. Даны программные коды вызывающей процедуры общего вида fun и вызываемой процедуры-функции f. Обе процедуры хранятся в одном модуле (рис. 52). Процедура fun вводит параметры c и t, в инструкции MsgBox обращается к функции f с аргументами c и t – f(c,t) и выводит вычисленное и отформатированное с помощью Format значение функции. Рис. 52. Программные коды процедуры общего вида fun и процедурыфункции f 84 Блок-схема алгоритма для вызывающей процедуры fun примера приведена ниже (рис. 53). Рис. 53. Блок-схема алгоритма для вызывающей процедуры fun примера 1 Блок-схема алгоритма для вызываемой процедуры-функции f примера1 приведена ранее на рис. 26. Ключевое слово Public в заголовке процедуры-функции f показывает, что она доступна всем другим процедурам во всех модулях, созданных пользователем. Эта функция также доступна для вычислений в таблицах рабочего листа Excel, она относится к категории функций «Определенные пользователем», как и все процедуры-функции, созданные пользователем в данной рабочей книге. Обращение к процедуре-функции из листа рабочей книги Excel При использовании в вычислениях процедур-функций, созданных пользователем, проще обратиться к «Мастеру функций», нажав кнопку панели инструментов на вкладке «Формат» в области «Библиотека функций» или нажав кнопку слева от строки формул и выбрать категорию «Определенные пользователем». Окно «Мастера функций» будет содержать обзор функций данной категории, для помеченной функции в окно будет выводиться вид обращения и необходимые аргументы для ее работы, а также пояснения и справку. После выбора определенной функции появляется окно «Аргументы функции», в котором выполняется задание определенных для данной функции аргументов. Аргументы функции могут быть представлены константами, ссылками на ячейки, диапазонами областей и другими функциями. После задания определенных для данной функции аргументов выполняется вычисление и возврат вычисленного значения в выделенную ячейку таблицы. Приведенный выше программный код процедуры-функции f (рис. 52) с аргументами c и t (f(c,t)) предназначен для поиска значений функции: 85 t 2  5  4t ; t  1  6 c  7  F  ln(t ); t  1 2 t  2  t  c  t ;t  1  2 3 Сформируем таблицу с исходными данными для расчетов на листе рабочей книги (рис. 54). Рис. 54. Таблица с исходными данными Обратимся к «Мастеру функций», выберем категорию «Определенные пользователем» (рис. 55). Рис. 55. «Мастер функций» категория «Определенные пользователем» Выберем функцию f с аргументами c и t (f(c,t)) (рис. 56). Рис. 56. «Мастер функций», окно «Аргументы функции» Определим исходные данные для верхней ячейки столбца f (рис. 57). 86 Рис. 57. Вычисленное значение функции Скопируем вычисления в другие ячейки столбца f (рис. 58). Рис. 58. Таблица значений функции f(c,t) 2. Рассмотрим пример применения процедуры-функции для решения квадратного уравнения. Сформируем таблицу с исходными данными для расчетов на листе рабочей книги (рис. 59). Рис. 59. Таблица с исходными данными Ниже представлен программный код процедуры-функции Reshur, которая формирует текстовое сообщение о решении квадратного уравнения с 87 параметрами a,b,c (исходные данные – формальные аргументы). Сформированный ответ хранится в переменной Reshur. Ключевое слово Public в заголовке процедуры-функции Reshur показывает, что она доступна не только всем другим процедурам во всех модулях, созданных пользователем, но и для вычислений в таблицах рабочего листа Excel, и относится к категории функций «Определенные пользователем», как и все процедуры-функции, созданные пользователем в данной рабочей книге. Рис. 60. Программный код процедуры-функции Reshur Блок-схема алгоритма для вызываемой процедуры-функции Reshur примера приведена на рис. 61. Рис. 61. Блок-схема алгоритма для вызываемой процедуры Reshur примера 2 88 В ячейку E4 таблицы, сформированной на рабочем листе Excel (рис. 59) введем обращение к процедуре-функции Reshur . Фактическими аргументами для процедуры-функции Reshur в данном случае являются адреса ячеек: B4, C4, D4. Скопируем вычисления в другие ячейки столбца E. Получим таблицу следующего вида (рис. 62). Рис. 62. Таблица значений функции Reshur Рекурсивные процедуры При программировании на VBA некоторые задачи могут быть решены на основе рекурсии. Рекурсивная процедура – это процедура вызывающая сама себя. Как правило, это не самый эффективный способ написания программного кода на Visual Basic Applications. Почти во всех случаях рекурсию можно заменить циклом. Для рекурсивных функций используется стековая память, которая имеет ограниченный объем пространства для локальных переменных. Если задача решена на основе рекурсии, то каждый раз, когда процедура вызывает саму себя, она использует больше этого пространства для дополнительных копий ее локальных переменных. Если этот процесс будет продолжаться неопределенно долго, то он, в конечном счете, вызовет ошибку переполнения. Цикл не имеет дополнительных издержек аргументов передачи, инициализации дополнительного хранилища и возврат значений. Поэтому производительность программного кода станет гораздо выше при решении задачи без рекурсивного вызова. Классическим примером рекурсивной процедуры является процедура вычисления факториала. Факториал числа N – произведение первых N натуральных чисел. При N=0 значение факториала равно 1. Ниже приведены программные коды вызывающей процедуры общего вида PrN и вызываемой рекурсивной процедуры-функции Fact. Обе процедуры 89 хранятся в одном модуле (рис. 63). Процедура PrN вводит параметр N (натуральное число), обращается для вычисления факториала к рекурсивной функции Fact, выводит вычисленное значение факториала и число N инструкцией MsgBox. Рис. 63. Программные коды процедуры общего вида PrN и рекурсивной процедуры-функции Fact Блок-схема алгоритма для вызываемой рекурсивной процедуры-функции Fact приведена ниже (рис. 64). Рис. 64. Блок-схема алгоритма для вызываемой рекурсивной процедурыфункции Fact Блок-схема алгоритма для вызывающей процедуры PrN приведена ниже (рис. 65). 90 Рис. 65. Блок-схема алгоритма для вызывающей процедуры PrN Для данной задачи рекурсию также можно заменить циклом. Использование процедур общего вида для обработки массивов глобального описания Сортировка массива методом «Пузырька» Метод «пузырьковой сортировки» наиболее простой, но не очень быстрый метод. Его используют для обработки небольших массивов. Для этого метода необходимо сравнить два соседних элемента массива и если они расположены не в «нужном» порядке, то поменять их местами. Поскольку сортировка массива подразумевает обмен элементов массива местами, то будем его осуществлять при помощи процедуры (подпрограммы) swapi (рис. 66). В процедуру в качестве параметров передаются два индекса элементов массива. Рис. 66. Программный код процедуры swapi Сортируемый массив описан как глобальный, т.е. все подпрограммы имеют к нему доступ. Два объявления на уровне модуля дают представление и о размере массива, и о его имени и типе хранимых данных (рис. 67). Рис. 67. Описание глобальных констант и переменных При условии сортировки элементов массива по возрастанию их значений, для двух соседних элементов массива, удовлетворяющих условию: a(i) >a(i + 1), происходит вызов процедуры swapi для обмена элементов массива местами. Если соседние элементы не удовлетворяют указанному условию, то просто 91 ничего не происходит, и элементы массива остаются на своих местах. Соседние элементы массива рассматриваются и сравниваются парами при помощи цикла. При прямом прогоне цикл начинает просматривать элементы от начала массива. Данный метод подразумевает sizeArr-1 количество прогонов для достижения желаемого результата (за один прогон, массив будет отсортирован только в очень редких случаях). При прямом прогоне слева направо перемещаются числа с большими значениями. Если на первом месте было максимальное число данного массива, то при прямом прогоне оно беспрепятственно на каждом очередном шаге займет второе, третье… и наконец, самое правое место в массиве. Если же это было не самое большое число (но и не самое маленькое), то оно тоже устремится направо, пока не встретит на своем пути число, значение которого больше. Дальше двигаться направо уже продолжит это новое более крупное число. Выполнив sizeArr-1 прогонов, получим массив, в котором все элементы будут расположены по возрастанию. Хотя вполне вероятно, что последние прогоны проходили уже без обмена элементов массива местами, так как элементы были расположены по порядку, и условие на обмен не выполнялось (избыток прогонов). Допустим, что в массиве хранятся (генерируются случайным образом) только целые числа. Тогда программный код вызывающей процедуры SortArr будет включать: формирование значений элементов массива при помощи генератора случайных чисел, сохранение этих данных в строковой переменной, сортировку массива методом «Пузырька» (с вызовом процедуры swapi), сохранение значений элементов полученного массива в строковой переменной, вывод значений элементов исходного массива и значений элементов полученного массива в диалоговое окно. Программный код вызывающей процедуры SortArr представлен ниже (рис. 68). Рис. 68. Программный код вызывающей процедуры 92 6.7. Система программирования Visual Basic for Applications Система программирования – это пакет программных средств, включающий не только транслятора, но и редактор для ввода кода, средства автоматизации создания и отладки программ, библиотеки с готовыми блоками кода, удобный справочник и другие специальные средства. Из любого приложения Microsoft Office в операционной среде Windows можно запустить систему программирования Visual Basic for Applications – коротко (VBA). Данная система программирования является визуальной системой программирования, так как объекты в этой системе создаются при помощи мыши. В ОС Windows большое количество стандартных элементов: окон, меню, кнопок и т. д. Для них в системе программирования заготовлены стандартные блоки машинного кода. Visual Basic for Applications представляет собой единую среду редактирования, схожую со средой автономной версии Visual Basic. Среда редактирования Visual Basic включает редактор кода, иерархическое средство просмотра объектов, многооконный отладчик, окно отображения свойств и средство просмотра проектов для управления кодом и объектами проекта. Visual Basic for Applications, как и все современные системы программирования имеет хороший инструментарий для корректного написания программы, ее форматирования, редактирования и отладки, встроенный в удобный и интуитивно понятный интерфейс, способствующий всесторонней поддержке программирования. Вся разработка и отладка программ ведется с помощью Редактора Visual Basic (Visual Basic Editor, VBE). Обычно в окне редактора используются основные три отдельных окна:  Project (Окно проекта);  Properties (Окно свойств); Code (Окно кода). В окне проекта отображается иерархическое дерево проектов приложения и модулей этих проектов с их элементами.  Microsoft Outlook Objects (папка с объектом приложения ThisOutlookSession);   Forms (папка содержит пользовательские модули форм);  Modules (папка содержит стандартные модули пользователя);  Class Modules (папка содержит пользовательские модули классов); References (папка содержит ссылки на объекты из внешних библиотек и список модулей этих библиотек). Для того чтобы начать этап написания программы на языке программирования VBA, необходимо создать пользовательский модуль,  93 поскольку все процедуры и функции могут быть созданы только в теле модуля. 6.8. Создание программных модулей на VBA Настройка MS Office 2007 и выше для работы с редактором VBA Вывод вкладки «Разработчик» 1. В меню «Файл» выбрать пункт «Параметры» (рис. 69). Рис. 69. Пункт «Параметры» меню «Файл» 2. В подменю «Настройка ленты» следует выбрать (отметить) пункт «Разработчик» (рис. 70). После применения данной настройки на ленте появится вкладка «Разработчик». 94 Рис. 70. Пункт «Разработчик» подменю «Настройка ленты» Запуск редактора Visual Basic for Applications Для начала работы в редакторе Visual Basic for Applications необходимо нажать на пиктограмму, показанную на рисунке ниже (рис. 71). Рис. 71. Кнопка запуска редактораVisual Basic for Applications Редактор Visual Basic for Applications Меню данного редактора представлено на рисунке ниже. Команды для работы с VBA сгруппированы в нескольких раскрывающихся пунктах меню (рис. 72). Рис. 72. РедакторVisual Basic for Applications Сохранение проекта в MS Office Excel 2007 и выше Важно!!! При сохранении файла следует обратить внимание на тип файла для сохранения программных модулей в рабочей книге (для правильного последующего исполнения созданных программ следует указать Тип файла: Книга Excel с поддержкой макросов) (рис.73). 95 Рис. 73. Сохранение файла Запуск редактора Visual Basic for Applications в MS Office Excel 2003 После запуска приложения (Excel, Word) необходимо войти в меню «Сервис», выбрать команду «Макрос» и из предложенного меню выбрать команду «Редактор Visual Basic» (рис. 74). Рис. 74. Запуск редактора в MS Office Excel 2003 Редактор Visual Basic (VBE) Вставка модуля Для вставки модуля необходимо выбрать меню «Вставка»/Insert, а затем выбрать команду «Модуль»/Module. Будет создан пустой модуль (рис. 75). Наличие нового модуля отразится в окне проекта (VBA Project). Если оно не активно, то выберите команду «Вид»/View, «Проект»/Project Explorer либо нажмите кнопку панели инструментов VBE. Рис. 75. Вставка модуля в редакторе VBA Самыми первыми словами в модуле должны быть слова Option Explicit. Эта инструкция проверяет, описана ли переменная или константа, которая участвует в программе в разделе описания процедуры, или нет. Если 96 пользователь забыл это сделать, то с помощью данной инструкции компилятор языка выдаст сообщение об ошибке. Применение инструкции Option Explicit позволит исключить достаточно много ошибок при программировании, особенно у начинающих программистов. Далее записывается программный код. Начало работы с модулем При работе с модулем, содержащим программный код, важно знать назначение основных кнопок на панели инструментов. После создания текста программы ее необходимо откомпилировать для проверки синтаксиса и семантики написанного текста. Для этого необходимо выбрать меню «Отладка»/Debug , а затем выбрать команду «Компилировать проект»/Compile Project. На панели инструментов для этого служит специальный значок . Иногда при запуске редактора VBA этот значок отсутствует. Его необходимо поместить на панель инструментов. Для этого в меню «Вид»/View нужно выбрать команду «Панели инструментов»/Toolbars и «Настройка». В открывшемся диалоговом окне выбрать вкладку «Команды», найти категорию «Отладка»/Debug, выделить значок «Компилировать проект»/Compile Project и, не отпуская нажатую клавишу мыши, поместить этот значок на панель инструментов. При успешной компиляции можно выполнить команды меню «Запуск»/Run:  команду «Запуск программы»/Run Macro,  команду «Прервать программу»/Break,  команду «Сброс программы»/Reset. Найти их можно на панели инструментов, как показано на рис. 76. Запу Прер ск вать программ программу ы Рис. 76. Начало работы с модулем Сброс программы Отладка программ При написании и создании программы неизбежно появляются ошибки: 1. компиляции; 2. выполнения; 3. логические. Ошибки компиляции возникают при некорректном вводе числа скобок, неправильном имени, неполном вводе инструкции и т. д. Некоторые ошибки появляются при завершении набора строки и нажатия клавиши Enter. Строка, в которой обнаружена ошибка, выделяется красным цветом, и на экране появляется диалоговое окно с сообщением о возможной причине ошибки 97 (рис.77.1). Рис. 77.1. Сообщение об ошибке при компиляции программы Как упоминалось ранее, инструкция Option Explicit , с которой должен начинаться модуль, позволяет достаточно легко отслеживать ошибки, связанные с использованием переменных, не объявленных явно, и своевременно их устранять. Ошибки выполнения. Появляются после успешного завершения компиляции программы уже на стадии выполнения. Причиной этого может быть некорректный ввод данных, например, вместо числа вводится строка знаков. Ошибка может возникнуть также из-за некорректных данных при выполнении операции деления, например деление на ноль (рис. 77.2). Рис. 77.2. Сообщение об ошибке при выполнении программы Логические ошибки. Распознаются наиболее сложно, так как они не приводят к прерыванию программы, но при этом при выполнении программы выдаются неверные результаты. Причиной тому чаще всего является некорректный алгоритм. Отключение макросов Макросы могут быть отключены из-за установленного высокого уровня безопасности. Чтобы установить другой уровень безопасности в MS Office 2007 и выше надо выбрать команду «Безопасность макросов» вкладки «Разработчик» в области «Код» (рис. 78.1). Рис. 78.1. Установка уровня безопасности в MS Office 2007 и выше 98 Чтобы установить другой уровень безопасности в MS Office Excel 2003 пользователь должен выбрать меню «Сервис» команду «Безопасность» (рис. 78.2). Рис. 78.2. Установка уровня безопасности в MS Office 2003 Диалоговое окно «Безопасность» позволит установить средний или низкий уровень безопасности (рис. 79). Рис. 79. Диалоговое окно «Безопасность» При открытии файла возникает запрос на отключение макросов (если установить средний уровень безопасности) (рис. 80). Рис. 80. Запрос на отключение макросов При выборе «Не отключать макросы» содержащиеся в открытом файле коды программ могут запускаться на выполнение. 99 Пример решения задачи в рабочей книге Microsoft Excel Вид листа рабочей книги после решения задачи (оформление) На листе рабочей книги представлены: техническое задание, таблица обозначений, блок-схема алгоритма решения поставленной задачи, текст программного кода с результатами тестового расчета в виде рисунков (рис. 81). Рис. 81. Вид листа рабочей книги 100 Вид программного модуля в редакторе VBA Ниже представлен вид программного кода, записанного в Module1 и окна проекта (рис. 82). Рис. 82. Программный код В MS Office Excel 2007 и выше создать блок-схему алгоритма можно средствами Microsoft Excel (кнопка для выполнения команды вставки фигуры (категория «Блок-схема») на вкладке «Вставка» в области «Иллюстрации») Примечание. Для создания блок-схемы алгоритма в MS Office Excel 2003 используется панель рисования (рис. 83), которая содержит автофигуры для отрисовки блок-схем. Рис. 83. Панель рисования в MS Office Excel 2003 101 6.9. Создание пользовательских приложений в среде VBA Visual Basic for Applications– визуальная объектно-ориентированная система программирования, которая может быть использована для создания программ-объектов, встраиваемых в различные иные программные системы и интерфейсы. Она поддерживает технологию связывания и внедрения объектов (OLE), объекты исполняются внутри офисных приложений Microsoft Office и программных продуктов других производителей, поддерживающих технологию OLE. С помощью VBA можно легко и быстро создавать пользовательские приложения, используя единую для всех офисных программ среду и язык. VBA применяет технологию визуального программирования, т. е. конструирование рабочей поверхности приложения и элементов его управления непосредственно на экране. При этом создание многих приложений с использованием VBA проще и быстрее, чем при помощи других языков программирования. Разрабатывая приложения для офисной программы Microsoft Excel (наиболее популярной офисной программы),используя мощные средства разработки, можно конструировать эффективные и применимые в различных отраслях промышленности пользовательские приложения. Так как VBA относится к языкам объектно-ориентированного программирования (ООП), то объектный подход играет в нем большую роль. При создании приложения в VBA в основном происходит работа с объектами. Можно использовать объекты, предоставляемые VBA: элементы управления, формы и объекты доступа к данным. Можно также управлять объектами других приложений из приложения VBA. Можно даже создавать свои собственные объекты и определять для них дополнительные свойства и методы. Объект – это комбинация кода и данных, которую можно рассматривать как одно целое. Объект может быть частью приложения, например, как элемент управления или форма. Целое приложение также может быть объектом. В офисной программе Microsoft Excel рабочий лист (Worksheet), диапазон (Range), диаграмма (Chart), форма (UserForm), являются визуальными объектами. Таких встроенных объектов насчитывается более 100. Семейство (объект Collection) представляет собой объект, содержащий несколько других объектов, как правило, одного и того же типа. Например, объект Workbooks (рабочие книги) содержит все открытые объекты Workbook (рабочая книга). Каждый элемент семейства нумеруется и может быть идентифицирован либо по номеру, либо по имени. Например, Worksheets(1) обозначает первый рабочий лист активной книги, a Worksheets("Лист1") – рабочий лист с именем лист1. Важнейшим понятием ООП является класс. Класс обычно описывается, как проект, на основе которого впоследствии будет создан конкретный объект. 102 Таким образом, класс определяет имя объекта, его свойства и действия, выполняемые над объектом. В свою очередь каждый объект, в соответствии с описанным выше, является экземпляром класса. Объекты VBA поддерживают свойства, методы и события. В VBA данные объекта (установки или атрибуты) называются свойствами, тогда как процедуры, которые оперируют с объектом, называются его методами. Событие – это действие, распознаваемое объектом, например, щелчок кнопкой мыши или нажатие клавиши клавиатуры, и пользователь может написать код, реагирующий на это событие. Объект сам по себе не представляет большого значения. Важнее то, какие действия можно совершать над объектом, и какими свойствами он обладает. Метод– действие, выполняемое над объектом. Синтаксис применения метода: Объект.Метод Например, Application.Quit – при помощи метода Quit (закрыть) закрывается приложение (объект Application). Метод можно применять ко всем объектам семейства. Например, Worksheets("Лист1").Chartobjects.Delete – при помощи метода Delete (удалить)удаляются все диаграммы с рабочего листа с именемЛист1 (к семейству Chartobjects (диаграммы) рабочего листа с именемЛист1применен метод Delete (удалить)). Свойство представляет собой атрибут объекта, определяющий его характеристики, например, такие как размер, цвет, положение на экране и состояние объекта: доступность или видимость. Чтобы изменить характеристики объекта, надо просто изменить значения его свойств. Синтаксис установки значения свойства: Объект.Свойство = ЗначениеСвойства Например, Application.Caption = "Пример" – изменяется заголовок окна приложения MicrosoftExcel посредством задания свойства Caption объекту Application. Свойство можно изменять сразу у всех объектов семейства. Например, Worksheets.Visible = False – все рабочие листы активной книги (семейство объектов Worksheets) скрываются при помощи установки свойству Visible (видимость) значения False (ложь). Событие представляет собой действие, распознаваемое объектом (например, щелчок мышью или нажатие клавиши), для которого можно запрограммировать отклик. События возникают в результате действий пользователя или программы, или же они могут быть вызваны системой. Если пользователь производит какое-то воздействие на систему, например, нажимает кнопку, тогда в качестве отклика выполняется код созданной пользователем процедуры. Если такой отклик не создан, т. е. не написана соответствующая процедура, то система никак не реагирует на данное событие. Действия, происходящие в системе, являются событиями, а отклики 103 на них – процедурами. Вид процедур, генерирующих отклик на события, называется процедурами обработки событий. В VBA некоторые объекты могут содержать другие объекты. Например, форма обычно содержит один или более элементов управления. Использование объектов в качестве контейнеров (containers) для других объектов позволяет ссылаться на контейнер в коде для уточнения, какой объект используется. Важным этапом при разработке приложения на VBA является создание интерфейса пользователя(видимой части приложения, с которой взаимодействует пользователь). Формы и элементы управления являются строительными блоками при создании интерфейса пользователя. Формы – это объекты, которые обладают свойствами, определяющими их внешний вид, методами, определяющими их поведение, и событиями, которые определяют их взаимодействие с пользователем. Установкой свойств формы и разработкой кода VBA для отклика формы на события создается объект, удовлетворяющий требованиям определенного приложения. Элементы управления – это объекты, содержащиеся внутри объектовформ. Каждый тип элемента управления имеет свой собственный набор свойств, методов и событий, что делает его пригодным для определенной цели. Некоторые элементы управления, используемые в приложениях, лучше всего подходят для ввода или отображения текста. Другие элементы управления обеспечивают доступ к другим приложениям и данным процессов таким образом, как будто бы удаленное приложение является частью самого приложения. Свойства формы можно установить во время разработки в окне Properties (Свойства) или во время выполнения приложения при помощи программного кода. Свойство Caption (Название) определяет текст заголовка окна формы. Свойства Height (Высота) и Width (Ширина) определяют начальные размеры формы; свойства Left (Левый) и Top (Верхний) определяют местоположение формы по отношению к левому верхнему углу экрана монитора. Свойство Name (Имя) устанавливает имя, по которому можно обращаться к форме из программного кода. По умолчанию, когда форма впервые добавляется к проекту, ее имя может быть одним из последовательности имен Form1, Form2 и т. д. Однако бывает удобно, если свойство Name будет иметь более конкретное значение, например, имя «Главная» – для первой формы приложения. Формы, как все объекты, могут реагировать на события. При каждом изменении размера формы в результате действий пользователя или программным способом инициируется событие Resize (Изменить размер) формы. Это позволяет изменять размеры элементов управления на форме или перемещать их, когда изменены размеры самой формы. Событие Activate (Активизировать) происходит всегда, когда форма становится активной, а событие Deactivate (Деактивировать) – когда активной становится другая форма 104 приложения. Эти события удобны для организации поведения формы при ее инициировании и завершении работы с ней. Чтобы сделать форму видимой, следует вызвать метод Show (Показать): Form1.Show (вызов метода Show имеет тот же эффект, что и установка значения свойства Visible (Видимый) формы в значение True). Внедрение элементов управления в рабочий лист или пользовательскую форму(в текстовый документ и т. д.) возможно при помощи кнопки панели инструментов в области «Элементы управления»вкладки «Разработчик», которая открывает перечень элементов управления (рис. 84). Рис. 84. Кнопки элементов управления на вкладке «Разработчик» Назначение элемента можно узнать при наведении на него указателя мыши. Список объектов группы «Элементы управления» с указанием имен по умолчанию представлен ниже (рис. 85). Рис. 85. Элементы управления 105 Создание кнопки на рабочем листе приложения Microsoft Excel Выбрать кнопку «Конструктор» панели инструментов в области «Элементы управления» вкладки «Разработчик». Выбрать на панели инструментов кнопку (CommandButton) и разместить ее на рабочем листе при помощи мыши. Элементы управления, внедренные в рабочий лист или форму, становятся объектами и приобретают свойства. Для работы с объектами в рабочем поле VBA необходимо иметь окно свойств (Properties) и окно проекта (Project Explorer). Для размещения надписи на кнопке воспользоваться кнопкой свойства панели инструментов в области «Элементы управления» вкладки «Разработчик». В открывшемся окне выбрать свойство Caption и дать кнопке подпись «Расчет P(x)» (рис.863). Рис. 86. Окно свойств (Properties) 106 Данная кнопка может быть использована для вывода на экран уже существующей формы (UserForm1), облегчающей работу с процедурой пользователя. При двойном нажатии на созданной кнопке в режиме конструктора появляется заготовка (заголовок и окончание) процедуры обработки события (нажатие кнопки), которая вызывает открытие формы. После записи тела процедуры обработки события заготовка примет следующий вид: где UserForm1 – только что созданная форма; Show – показать форму. Работа с формами Для создания диалоговых окон приложений в VBA используются формы. Форма представляет собой окно пользовательского интерфейса. В VBA это UserForm со стандартной сеткой для удобного размещения визуальных элементов на ней. Шаг сетки (рис. 87) может быть изменен командами Tools, Options, вкладка General (Сервис, Параметры, вкладка Общие). Рис. 87. Шаг сетки – установка значений Для вставки пустой формы выполнить Insert, UserForm (Вставка, Форма) в режиме редактора VBA. Будет создана UserForm1 (рис. 88). 107 Рис. 88. Пустая форма UserForm1 Визуальные компоненты, размещаемые на форме, называются элементами управления и находятся на панели элементов Toolbox (рис. 89). Рис. 89. Панель элементов Toolbox Элементы управления размещаются в окне формы путем перетаскивания их с помощью мыши с панели элементов Toolbox, при этом сетка в форме способствует удобному размещению в ней элементов управления. Внедрение объектов с панели элементов Toolbox в форму производится по следующим шагам:  щелчком мыши выделяется значок нужного элемента;  указателем мыши обозначается место его расположения в форме;  левой кнопкой мыши устанавливается нужный размер элемента;  отпускается кнопка мыши и элемент расположится в указанном месте формы; Для распознавания элементов достаточно установить на него указатель мыши. Назначение элементов управления показано ранее. Пример 1. Вычисление значений функции Р(х) Создадим пользовательский интерфейс для вычисления значений функции Р(х).  a  x, a  x  0 P( x)    Sin ( x), a  x  0 108 Вывод графика функции в окне приведен ниже (для значений х из отрезка [0, 2], при а=1 и а = 2) (рис. 90). График функции P(x) x Рис. 90. График функции В воздаваемом приложении предполагается вводить информацию в поля ввода на форме и получать результаты в поле вывода одним щелчком мыши на кнопке «Вычислить». Для создания приложения выполним следующие действия:  войдем в редактор Visual Basic (VBE);  выполним вставку пустой формы (UserForm1);  применим свойство Caption к форме (изменим стандартный заголовок на «Р(х)»);  с помощью панели элементов ToolBox поместим на форму две кнопки (кнопки с надписями – «Вычислить» и «Выход»);  по очереди, сделав каждую кнопку активной, изменим им надписи в окне свойств (Properties) через свойство Caption: для кнопки CommandButton1 – «Вычислить», а для кнопки CommandButton2 – «Выход»;  внедрим в форму три поля: TextBox1, TextBox2, TextBox3 (поле TextBox используется, как правило, для ввода текста или вывода результата вычислений, введенный в поле текст может быть преобразован в число);  рядом с каждым из полей поместим элемент Label (Label1, Label2, Label3 – надписи);  изменим им свойство Caption соответственно на текстовые значения «х=», «а=», «Р(х)=». Макет созданной формы представлен ниже (рис. 91). 109 Рис. 91. Макет формы  создадим процедуру для вычисления функции Р(х); Для создания заготовки процедуры обработки события – нажатия кнопки «Вычислить» щелкнем по кнопке дважды. После записи тела процедуры в редакторе кода она будет иметь следующий вид (рис. 92): Рис. 92. Процедура для вычисления функции Р(х) В процедуре используется вспомогательная переменная Z.  создадим процедуру для закрытия формы и очистки полей; Для создания заготовки процедуры обработки события – нажатия кнопки «Выход» щелкнем по кнопке дважды. После записи тела процедуры в редакторе кода она будет иметь следующий вид (рис. 93): Рис. 93. Процедура для закрытия формы и очистки полей Для запуска созданного приложения необходимо нажать кнопку «Расчет Р(х)» на рабочем листе Microsoft Excel (появится форма) (рис. 94). 110 Рис. 94. Форма для расчета Р(х) В появившейся форме занести исходные данные (значения параметров х и а), нажать кнопку «Вычислить», и в поле «Результат» появится вычисленное значение (рис. 95). Рис. 95. Результат работы приложения Нажатие на кнопку «Выход» осуществит выход из приложения – закроет форму. 111
«Информационное моделирование. Этапы компьютерного математического моделирования» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 462 лекции
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot