ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Структурное программирование

Структурное программирование

 

Самое общеизвестное определение структурного программирования – подход к программированию, в котором для передачи управления в программе используется три конструкции: следование, выбора и цикл.

Классическая теорема Боэма и Джакопини о структурном программировании утверждает, что всякую правильную программу (т. е. программу с одним входом и одним выходом, без зацикливаний и недостижимых веток) можно записать с использованием следующих логических структур:

последовательности двух или более операторов;

дихотомического выбора;

повторения;

Дейкстра предложил отказаться от оператора безусловного перехода и ограничиться тремя конструкциями – последовательностью, выбором и циклом;

Дональд Кнут продемонстрировал случаи, в которых оператор безусловного перехода оказывался полезным (например, выход из нескольких вложенных циклов) и подверг критике утверждение Дейкстры.

В 1965 году академик Глушков обратил внимание на то, что структурированные программы можно рассматривать как формулы в некоторой алгебре. Зная правила преобразования выражений в такой алгебре, можно осуществлять глубокие формальные (и, следовательно, автоматизированные) преобразования программ.

Структурное программирование – не самоцель, его основное назначение – получение хорошей программы. Однако даже в самой хорошей программе операторы перехода требуются, например при выходе из множества вложенных циклов.

 

7. Модульное программирование

 

Модульное программирование – это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Единственная альтернатива модульности – монолитная программа, что, конечно, неудобно. Таким образом, наиболее интересный вопрос при изучении модульности – определение критерия разбиения на модули. В основе модульного программирования лежат три основные концепции.

Принцип утаивания информации. Всякий компонент утаивает единственное проектное решение, т. е. модуль служит для утаивания информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.

Аксиома модульности. Модуль – независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:

– блочность организации, т. е. возможность вызвать программную единицу из блоков любой степени вложенности;

– синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами;

– семантическая независимость, т. е. независимость от места, где программная единица вызвана;

– общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении;

– полнота определения, т. е. самостоятельность программной единицы.

Сборочное программирование. Модули – это программные кирпичи, из которых строится программа.

Сцепление модулей – мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы сцепления.

– независимые модули – это идеальный случай. Модули ничего не знают друг о друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и соответствующим образом перенаправив выходные данные одного модуля на вход другого.

– сцепление по данным (параметрическое) - это сцепление, когда данные передаются модулю, как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Этот вид сцепления реализуется в языках программирования при обращении к функциям (процедурам).

Рутинность модуля – это независимость модуля от предыдущих обращений к нему (от предыстории). Модуль является рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений). Модуль должен быть рутинным в большинстве случаев, но есть и случаи, когда модуль должен сохранять историю. В выборе степени рутинности модуля пользуются тремя рекомендациями:

– в большинстве случаев делаем модуль рутинным;

– зависящие от предыстории модули следует использовать только в тех случаях, когда это необходимо для сцепления по данным;

– в спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость, чтобы пользователи имели возможность прогнозировать поведение такого модуля.

 

Объектно-ориентированное программирование

 

Методология объектно-ориентированного программирования – подход, использующий объектную декомпозицию, при которой статическая структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами.

В основе объектно-ориентированного языка программирования лежат понятия: объект, класс, инкапсуляция, наследование и полиморфизм.

В частном случае в Visual Basic объектом называется элемент пользовательского интерфейса, который создается на форме Visual Basic, а также элементы управления и отображения.

Каждый объект есть представитель некоторого класса однотипных объектов, т.е. объект является экземпляром класса. Класс определяет общие для всех его объектов методы и свойства. Методы – это программные процедуры, определяющие взаимодействие объектов класса с внешней средой. Свойства представляют собой характеристики (атрибуты), присущие объектам (например, размер шрифта, название и др.).

 

9. Инкапсуляция– это скрытие информации. При объектно-ори­ентированном программировании возможен доступ к объекту только через его методы и свойства. Внутренняя структура объекта скрыта от пользователя, т.е. объекты – это самостоятельные сущности, отделенные от внешнего мира. Инкапсуляция позволяет изменять реализацию объектов любого класса без опасений, что это вызовет нежелательные побочные эффекты в программной системе. Это мощное средство обеспечивает многократное использование одного и того же программного кода.

 

10. Наследование– это возможность выделить свойства, методы и события одного объекта и приписать их другому объекту, иногда с их модификацией. С точки зрения программиста, новый класс должен содержать только коды и данные для новых или изменяющихся методов.

 

 

11. Полиморфизм – это способность объектов выбирать операцию на основе данных, принимаемых в сообщении. Каждый объект может реагировать по-своему на одно и то же сообщение. Например, команда Printбудет по-разному воспринята черно-белым или цветным принтером.

 

Задание типа данных переменной

 

Хотя объявлять тип переменным не обязательно ( VBA автоматически им присваивает тип Variant), объявление типа переменных имеет несколько преимуществ:

– объявленные переменные ускоряют выполнение кода программ. Так как при объявлении указывается VBA тип переменной, выполнение программы ускоряется на то время, которое VBA потратил бы на анализ переменной типа Variant, чтобы определить ее конкретный тип.

– объявленные переменные повышают эффективность кода. Переменные типа Variant могут занимать гораздо больше памяти, чем переменные определенных типов. Объявленная переменная занимает только память, необходимую для этого определенного типа, поэтому это может значительно сократить объем памяти, требуемый для программы;

– программный код с типизированными переменными легче читать и понимать.

Объявить тип переменной можно явно и неявно.

Для явного объявления переменной и ее типа используется оператор Dim, который в общем случае имеет следующий формат:

 

Dim name_l As type_l, name_2 As type_2, ...

 

Примеры правильного синтаксиса для объявлений типа переменных:

Dim Price As Currency

Dim DataPlata As Date

Dim Message As String

Dim Counter As Integer

Dim Profit As Single, Gross As Currency, Message As String

При неявном объявлении тип переменной задается добавлением символа определения типа в конец имени переменной (см. табл. 2), например:

MyVar% = 25

CelsiusTemp! = 15,35

Title$ = "Excel"

Хотя неявное объявление переменных удобно, с ним связаны некоторые проблемы. Когда переменные объявляются неявно, существует риск нечаянно создать новую переменную, когда на самом деле, необходимо использовать уже существующую переменную, или использовать существующую переменную, когда надо создать новую. Обе эти ситуации приводят к ошибкам в коде, которые очень трудно отслеживать.

Чтобы было легче в любое время обнаружить ошибки, связанные с неявным объявлением переменных, VBA предоставляют команду Option Explicit. При использовании команды Option Explicit VBA требует объявления всех переменных перед (с помощью оператора Dim) перед их использованием.

Независимо от того, объявляются ли переменные типа String с помощью тора Dim или добавлением символа определения типа $, создаваемые строковые переменные по умолчанию являются строками переменной длины. Строковые переменные переменной длины изменяют длину, в зависимости от длины строки, сохраняемой переменной. Иногда может понадобиться использовать строку фиксированной длины. Строки фиксированной длины всегда имеют одну и ту же длину. Они полезны, если необходимо обеспечить, чтобы текст, сохраняемый в строковой переменной, всегда содержал одно и то же число символов.

Общий синтаксис для создания строки фиксированной длины:

Dim name As String * N

N – число, определяющее длину строки.

После объявления переменной, независимо от того, объявляется ли эта переменная явно или неявно, и как задается тип, эта переменная сохраняет тот же самый тип столько времени, сколько она существует. Нельзя переобъявить переменную или переопределить ее тип.

 

Математические функции

 

Для наиболее часто встречающихся функций в алгоритмический язык включаются программы для их вычисления.В таблице 3 приведены математические функции, имеющиеся в VBA. В этой таблице N означает любое численное выражение; все аргументы функций являются обязательными, если только не указано иначе.

Функции (аргументы) Возвращает/ действие
Abs(N) Возвращает абсолютное значение N
Atn(N) Возвращает арктангенс N как угол в радианах
Сos(N) Косинус угла N, где N это угол, измеряемый в радианах
Sin(N) Возвращает синус угла; N – это угол, измеряемый в радианах
Sqr(N) Возвращает корень квадратный из N. VBA отображает ошибку, исполнения, если N – отрицательное
Tan(N) Возвращает тангенс угла; N – угол в радианах
Exp(N) Возвращает константу е, возведенную в степень N. (е – это основание натурального логарифма)
Fix(N) Возвращает целую часть N. Fix не округляет число, а отбрасывает любую дробную часть. Если N является отрицательным, Fix возвращает ближайшее отрицательное целое, большее, чем или равное N
Int(N) Возвращает целую часть N. Int не округляет число, а отбрасывает любую дробную часть. Если N является отрицательным, Int возвращает ближайшее отрицательное целое меньшее, чем или равное N
Log(N) Возвращает натуральный логарифм N
Rnd(N) Возвращает случайное число; аргумент является необязательным. Функцию Rnd используется только после инициализации VBA-генератора случайных чисел оператором Randomize
Sgn(N) Возвращает знак числа: -1, если N отрицательное; 1, если N – положительное; 0, если N равно 0

 

Линейные алгоритмы

 

Линейные алгоритмы используют для решения относительно простых задач, не требующих разветвляющихся или циклических вычислений. Такими задачами являются расчеты математических формул, ввод и вывод информации, некоторые действия сфайлами. Линейные алгоритмы объединяет то, что вычисления в них проходят последовательно, шаг за шагом, oт начала к концу (сверху вниз по блок-схеме).

Простейшая программа решения математического примера имеет три основных действия: задание типа переменных, ввод данных, расчет выражения, вывод результата.

 

19. Оператор разветвляющейся структуры If … Then

Базовая структура разветвление (называемая также ЕСЛИ-ТО-ИНАЧЕ) обеспечивает в зависимости от результата проверки условия (истина или ложь) выбор одного из альтернативных путей работы алгоритма. Каждый из путей ведет к общему выходу (продолжению алгоритма). Работа алгоритма продолжается независимо от того, какой путь будет выбран. Возможные пути выполнения алгоритма помечаются на схемах алгоритмов соответствующими метками: "да"/"нет" (или "1"/"0"). Алгоритм, в состав которого входит базовая структура разветвление, называется разветвляющимся алгоритмом, а реализуемый им вычислительный процесс – разветвляющимся вычислительным процессом.

If … Then … Else – управляющий оператор, осуществляющий условное ветвление операций, основанное на оценке логического выражения. Выражение может быть истинным или ложным. Оператор имеет две формы записи –линейную и блочную.

 

20. Линейный синтаксис оператора If … Then

 

При линейном синтаксисе весь оператор записывается в одну строчку (перенос на новую строку не допускается).

If логическое _ выражение Then операторы 1 [Else операторы 2]

– логическое _ выражение – выражение, возвращающее не нулевое значение (истина) или ноль (ложь) (если логическое выражение состоит из нескольких составных частей, то они соединяются друг с другом посредством логических функций);

– операторы 1 – операторы, выполняющиеся при значении логического выражения "истина" (если операторов несколько штук, то один от другого отделяется двоеточием);

– операторы 2 – операторы, выполняющиеся при значении логического выражения "ложь" (если операторов несколько штук, то один от другого отделяется двоеточием).

 

Выражение, стоящее в квадратных скобках является не обязательным параметром. Таким образом, можно выделить два вида записи линейной формы – краткую и полную.

Краткая форма записи (Если … То …. ) не содержит часть Else операторы 2.

If логическое_выражение Then оператор1

– логическое _ выражение – любое логическое выражение, допустимое в Бейсике;

– оператор1 – любой оператор (или группа операторов в одну строку через разделитель – двоеточие) Бейсика, который исполняется при выполнении условия, заданного логическим_выражением. Действие оператора If поясняется блок-схемой, приведенной на рис. 1.

условие выполняется?
оператор 1
да
нет
выход

Рис. 1. Краткая форма оператора If … Then

 

Полная форма записи (Если … То …. Иначе) содержит часть Else операторы 2.

If логическое_выражение Then операторы 1 Else операторы 2

– операторы 2 выполняется только тогда, когда логическое_выражение ложно. Действие оператора If поясняется блок-схемой, приведенной на рис. 2.

условие выполняется?
оператор 1
да
нет
выход
оператор 2

Рис. 2. Полная линейная форма оператора If…Then

 

Понятие цикла

 

При разработке программ часто приходится изменять порядок следования операторов. Только в очень простых программах операторы выполняются один за другим – управление передается последовательно, от оператора к оператору. На практике необходимые средства для изменения порядка следования операторов, другими словами, передачи управления – обеспечивают операторы цикла и условные операторы.

Часто при решении задач приходится многократно вычислять значения по одним и тем же математическим зависимостям для различных значений входящих в них величин. Такие многократно повторяющиеся участки вычислительного процесса называются циклами. Использование циклов позволяет существенно сократить объем схемы алгоритма и длину соответствующей программы. Различают циклы с заданным и неизвестным числом повторений. К последним относятся итерационные циклы, характеризующиеся последовательным приближением к искомому значению с заданной точностью.

Для организации цикла необходимо выполнить следующие действия:

1) задать перед циклом начальное значение переменной, изменяющейся в цикле;

2) произвести необходимые действия;

3) изменить переменную на величину шага;

3) проверить условие окончания (или повторения) цикла;

4) переходить к п.2, если цикл не закончен.

Последние четыре действия повторяются многократно. Переменная, изменяющаяся в цикле, называется параметром цикла. Действия, повторяемые многократно, называются телом цикла.

Переменная, изменяющаяся в цикле, называется параметром цикла. В одном цикле может быть несколько параметров. Переменную, значения которой вычисляются машиной и хранятся в одной и той же ячейке памяти, называют простой переменной, а переменную, являющуюся элементом массива, – переменной с индексом. Следует иметь в виду, что параметром цикла является при использовании простой переменной сама переменная, а при использовании переменной с индексом – ее индекс.

Возможны три способа организации циклических структур алгоритмов:

1) цикл “повторять ... до” (цикл с постусловием);

2) цикл “пока” (цикл по условию или цикл с предусловием);

3) счетный цикл (цикл с управляющей переменной).

Схема реализации таких циклов представлена на рис. 1.

Рис. 1. Схемы организации циклов:

а – цикл с постусловием (проверка условия после тела цикла),

б – цикл с предусловием (проверка условия перед телом цикла),

в – счетный цикл (цикл с известным числом повторений)

 

В VBA циклы можно задать двумя способами:

– с использованием оператора цикла FOR ... NEXT;

– с использованием оператора цикла DO ... LOOP;

 

25. Оператор цикла For ... Next

 

Цикл For...Next используется, когда необходимо повторить действие или ряд действий заданное количество раз, известное до начала выполнения цикла.

Цикл For...Next имеет следующий синтаксис:

For счетчик = Начало To Конец [Step Шаг]

[Операторы цикла]

Next счетчик

 

Счетчик – любая переменная, по которой организован цикл.

В квадратных скобках указан не обязательный параметр.

По умолчанию VBA увеличивает счетчик на 1 каждый раз при выполнении операторов в цикле (шаг по умолчанию равен 1). Если нужно другое значение шага надо включать в оператор For необязательное ключевое слово Step.

При выполнении цикла For...Next VBA поступает следующим образом:

– присваивает значение Начало счетчику;

– выполняет все операторы, представленные с помощью Операторы цикла,пока не достигнет ключевого слова Next, которое указывает VBA на то, что достигнут конец тела цикла;

– изменяет счетчик на величину Шаг (если включается необязательное ключевое слово Step); если Step не определено, то VBA увеличивает переменную на 1;

– возвращается к началу цикла и сравнивает текущее значение счетчика со значением Конец. Если значение счетчикаменьше или равно Конец, VBA выполняет цикл снова. Если значение счетчика больше значения Конец,VBA продолжает выполнение кода с первого оператора после ключевого слова Next.

Если Шаг >0, то такой цикл называется циклом с возрастающим счетчиком, если Шаг <0 – цикл с убывающим счетчиком. В последнем случае Начало должно быть больше Конец.

Цикл For...Next выполняется только в том случае, если начальное значение счетчика цикла плюс шаг изменения значения счетчика меньше или равно конечному значению счетчика. Если конечное значение счетчика меньше начального значения, то шаг должен быть отрицательным. Цикл выполняется до тех пор, пока текущее значение счетчика не выйдет за рамки конечного значения. При завершении текущего цикла к значению счетчика прибавляется значение шага. Если начальное значение и конечное значение счетчика имеют одно и то же значение, цикл выполняется один раз, вне зависимости от значения шага. Если шаг равен нулю, цикл продолжается неопределенное количество раз.

 

26. Оператор неопределенного цикла Do ... Loop

 

Все неопределенные циклы строятся с помощью одного оператора цикла – Do. Оператор Do имеет много опций и является настолько гибким, что в действительности он предоставляет четыре различных конструкции цикла в двух базовых категориях.

Две базовые категории конструкций цикла Do – это циклы, которые тестируют условие до выполнения тела цикла, и циклы, которые тестируют условие после выполнения тела цикла.

 

– цикл Do ... Loop с проверкой условия в начале:

 

В приведенном цикле проверка осуществляется через ключевое слово While. Цикл работает пока условие истинно. Как только условие становится ложным, цикл прекращает свою работу.

Do While условие

[блок_операторов]

Loop

В приведенном цикле проверка осуществляется через ключевое слово Until. Цикл работает пока условие ложно. Как только условие становится истинным, цикл прекращает свою работу.

Do Until условие

[блок_операторов]

Loop

 

– цикл Do ... Loop с проверкой условия в конце:

Do

[блок_операторов]

Loop While условие

 

Do

[блок_операторов]

Loop Until условие

Таким образом, общий вид цикла Do…Loop можно представить в виде:

  Цикл “ПОКА” Цикл “ДО”
цикл с пост- условием parametr = начало shag = шаг DO [блок операторов – тело цикла] parametr = parametr + shag LOOP WHILE условие   parametr = начало shag = шаг DO [блок операторов – тело цикла] parametr = parametr + shag LOOP UNTIL условие  
цикл с пред- условием parametr = начало shag = шаг DO WHILE условие [блок операторов – тело цикла] parametr = parametr + shag LOOP   parametr = начало shag = шаг DO UNTIL условие [блок операторов – тело цикла] parametr = parametr + shag LOOP  

 

Здесь parametr – переменная, по которой организован цикл (параметр цикла); shag – шаг изменения значения переменной цикла.

 

Табулирование функции

 

Задача табулирования некоторой функции y = f(x) сводится к вычислению значений этой функции при параметре цикла х, изменяющемся в заданных пределах с постоянным шагом. На печать при этом выводится множество пар значений аргумента х и функции у с помощью оператора печати, расположенного внутри тела цикла.

В рассмотренных выше примерах тело цикла реализовывалось одним или несколькими простыми операторами (присвоения, печати). Однако в общем случае внутри цикла могут использоваться любые операторы, в том числе и другие операторы цикла, условные операторы, операторы безусловного перехода.

 

Вычисление суммы

 

Вычисление конечной суммы сводится к нахождению суммы заданного количества слагаемых:

,

где i – номер слагаемого; f(i) – слагаемое с номером i.

Вычисление организуется в виде циклического алгоритма, когда при каждом прохождении цикла номер слагаемого i увеличивается на 1, а сумма изменяется на величину i-го слагаемого:

 

.

 

Цикл повторяется до тех пор, пока не будут просуммированы все n слагаемых. Для того, чтобы начальное содержимое ячейки суммы не исказило результат, сумма предварительно должна быть обнулена ( ). Вывод результата, поскольку он является единственным, осуществляется после окончания работы цикла.

Алгоритм нахождения суммы представлен на рис. 2.

 

 

Рис. 2. Вычисление суммы

 

Рис. 3. Вычисление произведения

 

Вычисление произведения

Вычисление конечного произведения представляет собой процесс нахождения произведения заданного количества сомножителей по формуле

.

Как и суммирование, вычисление произведения организуется с помощью циклического процесса по рекуррентному соотношению

.

В отличие от суммирования начальное значение произведения должно быть равно единице.

Алгоритм нахождения произведения представлен на рис. 3.

Пример. Вычислить факториал числа N.

Формула для вычисления факториала имеет вид:

.

Как видно из формулы, вычисление факториала числа N сводится к нахождению произведения n сомножителей.

 

Описание массивов

В программировании часто возникает необходимость обработки большого количества однородных данных – массивов (последовательностей чисел, временных рядов, матриц и т.п.). Массив – это множество однотипных элементов, объединенных общим именем и занимающих в компьютере определенную область памяти, доступ к которым осуществляется по индексу. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива). Массив является удобным способом хранения нескольких связанных элементов данных в едином контейнере для большего удобства и эффективности программирования. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Массиву присваивается имя, посредством которого можно ссылаться как на массив данных в целом, так и на любую из его компонент. Индекс (порядковый номер элемента) записывается в скобках после имени массива.

В зависимости от числа индексов массивы могут быть одномерными, двумерными и т.д. Так, например, в записи а = (а1, а2 …, аn) переменные а1, а2 …, аn являются компонентами вектора а и образуют одномерный массив.

Матрица

 

 

представляет собой двумерный массив, элементы которого обозначены переменной в с двумя индексами. Первый индекс соответствует номеру строки, второй – номеру столбца, на пересечении которых расположен соответствующий элемент матрицы.

Таким образом, количество индексов у переменной определяет размерность массива, а общее число элементов в массиве – размер.

Для задания индексированных переменных в VBA применяется оператор Dim (от англ. Dimension – размерность), который задает имя массиву и его размер:

Dim имя массива (измерения массива) As type,

имя массива – имя массива, к которому предъявляются такие же требования, как и к именам переменных (см. лабораторную работу «Основы работы в VBA. Линейное программирование»)

измерения массива – данная опция может быть задана следующим образом:

нижний индекс ТО верхний индекс, нижний индекс ТО верхний индекс, …

или

верхний диапазон, верхний диапазон, ....

 

type – один из типов переменных (Integer, Single, Double, и т.д.)

 

Следующие примеры являются допустимыми объявлениями массива:

 

Dim str_array(1 To 100) As String

Dim str_Multiplication(0 To 15, 0 To 15) As String

Если условия задачи таковы, что размер массива заранее не определен, то поступают так: в начале программы объявляется пустой массив, а когда становится известен его размер, определяют его в помощью оператора ReDim. Как это делается, рассмотрено ниже.

Динамические массивы

Иногда бывает трудно заранее определить, сколько элементов нужно будет поместить в список. Для этого используют динамические массивы.

Динамические массивы используются в том случае, когда количество элементов массива заранее не известно и будет определяться в процессе выполнения программы. Как следствие, после того, как работа с динамическими массивом в программе будет выполнена, можно освободить память, которую он занимает.

Динамический массив объявляется так же, как и любой другой тип массива – оператором Dim. Единственное отличие состоит в том, что не указывается (в скобках) размер массива. Например:

Dim A() As Byte

Этой строкой создается массив, но откладывается решение о том, сколько он будет иметь элементов. Перед тем, как использовать этот массив, необходимо указать его размер, который во время работы программы можно изменять сколько угодно раз. Это делается с помощью оператора ReDim.

ReDim A(5)

Следует отметить, что при указании значений для размерностей динамического массива оператором ReDim его тип не может быть изменен.

При помощи оператора ReDim можно установить любые значения границ и количество размерностей, а также менять любой из установленных параметров как в сторону уменьшения, так и увеличения.

Dim A() As Byte

ReDim A(5) 'Диапазон от 0 до 5

ReDim A(1 To 4) 'Диапазон от 1 до 4

ReDim A(3, 3, 1 To 3) 'Диапазон от 0 до 3,

'от 0 до 3, от 1 до 3

В качестве как верхней, так и нижней границы могут быть использованы не только числа, но и переменные целого типа:

Dim n As Integer

Dim A() As Integer

n = 10

ReDim A(n)

 

При каждом выполнении оператора ReDim все значения элементов массива, которые до этого в нем хранились, будут потеряны, так как данный оператор обнуляет все элементы в соответствии с их типом, например числовые массивы принимают значение 0, а символьные "" (пусто). Для того чтобы имеющиеся в массиве значения не пропали при его переопределении, следует использовать служебное слово Preserve:

Sub primer()

Dim n As Integer

Dim i As Integer

Dim a() As Integer

n = 10

ReDim a(n)

For i = 1 To n

a(i) = i ^ 2

Next i

ReDim Preserve a(15)

For i = 11 To 15

a(i) = i ^ 3

Next i

End Sub

В данной программе требуется заполнить массив из десяти элементов квадратами первых десяти натуральных чисел. Затем следует переопреде-ление размера массива до 15 и заполнение новых элементов (с 11 по 15) кубами следующих натуральных чисел.

 

Заполнение массивов данными

 

Для ввода элементов массива можно использовать следующие способы:

1) функцию InputBox – функция InputBox отображает диалоговое окно, содержащее текст, который запрашивает пользователя ввести некоторое значение и текстовое окно для ввода этого значения.

– для одномерного массива:

Dim A() As Integer

n = InputBox("Введите размер массива", "Определение размера массива")

ReDim A(n)

For i = 1 To n

'команда в редакторе VB набирается в одну строку

A(i) = InputBox("Введите элемент массива А(" & i & ")", "Заполнение массива")

Next i

При своей работе приведенный кусок программы выводит следующие окна:

....

 

– для двумерного массива:

Dim A() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim A(n, m)

For i = 1 To n

For j = 1 To m

A(I, j) = InputBox("Введите элемент массива А(" & i & "," & j & ")")

Next j

Next i

 

2) функцию Сells – данные считываются из рабочего листа Excel. В этом случае пользователь перед запуском программы вводит данные элементов массива в ячейки рабочего листа Excel.

 

– для одномерного массива:

Dim a(10) As Integer

For i = 1 To 10

'массив записан в 5-ой строке рабочего листа Excel

a(i) = Cells(5, i)

Next i

– для двумерного массива:

 

 

Dim a(10, 5) As Integer

For i = 1 To 10

For j = 1 To 5

a(i, j) = Cells(i, j)

Next j

Next i

Этот способ более предпочтителен, поскольку он не требует ввода данных с клавиатуры каждый раз при новом появлении диалогового окна.

3) использование генератора случайных чисел Rnd(), если значение массива не задано. При таком способе заполнения массива надо учесть, что перед использованием функции Rnd() надо инициализировать генератор случайных чисел, а также то, что он выдает числа в интервале от 0 до 1.

– для одномерного массива:

Randomize Timer

Dim a() As Single

n = InputBox("Введите размер массива")

ReDim a(n)

For i = 1 To n

a(i) = 50 - Int(Rnd() * 100) / 10

Next i

 

– для двумерного массива:

Randomize Timer

Dim a() As Single

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim a(n, m)

For i = 1 To n

For j = 1 To m

a(I, j) = 50 - Int(Rnd() * 100) / 10

Next j

Next i

 

4) с помощью формулы, если массив заполняется по какой-либо закономерности, причем значение элемента массива зависит от его местоположения:

 

– для одномерного массива:

Dim a() As Single

n = InputBox("Введите количество строк)

ReDim a(n)

For i = 1 To n

a(i) = 5 * i / (i + 4)

Next i

– для двумерного массива:

Dim a() As Single

n = InputBox("Введите количество строк", "Определение размера массива. Запрос 1 из 2")

m = InputBox("Введите количество столбцов", "Определение размера массива. Запрос 2 из 2")

ReDim a(n, m)

For i = 1 To n

For j = 1 To m

a(i, j) = 5 * i / (j + 4)

Next j

Next i

 

Вывод массивов на печать

 

Вывести массив на печать можно следующими способами:

1) в рабочий лист Excel – для этого используется известная уже функция Cells:

для одномерного массива: для двумерного массива:
For i = 1 To n ‘вывод в 10 строку рабочего ‘листа Cells(10, i) = a(i) Next i For i = 1 To n For j = 1 To m ‘вывод начинается с ‘5 строки 4 столбца Cells(i+5, j+4) = a(i, j) Next j Next i

 

2) в диалоговое окно. Для этого весь массив переписывается в какую-либо одну текстовую переменную (например Text), которая и выводится в диалоговое окно. При выводе двумерного массива перед выводом необходимо сформировать строки и столбцы. Для этого используется функция Chr(13) – перевод каретки, которая при заполнении строки переводит курсор на начало следующей строки и Chr(9) – вставляет символ табуляции между элементами массива в строке. Здесь также массив предварительно записывается в текстовую переменную, которая выводится в диалоговое окно.

Для одномерного массива:   Для двумерного массива:
Text = "" For i = 1 To n Text = Text & a(i) & Chr(9) Next i MsgBox "Массив:"&Chr(13)& Text   Text = "" For i = 1 To n For j = 1 To m Text = Text & a(i, j) & Chr(9) Next j Text = Text & Chr(13) Next i MsgBox "Массив:" & Chr(13) & Text
     

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти