close

Вход

Забыли?

вход по аккаунту

ЕЖЕНЕДЕЛЬНЫЙ РЫНОЧНЫЙ ПРОГНОЗ;pdf

код для вставкиСкачать
ДЕРЖАВНА СЛУЖБА УКРАЇНИ З НАДЗВИЧАЙНИХ СИТУАЦІЙ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ЦИВІЛЬНОГО ЗАХИСТУ УКРАЇНИ
КАФЕДРА АВТОМАТИЧНИХ СИСТЕМ БЕЗПЕКИ ТА ІНФОМАЦІЙНИХ ТЕХНОЛОГІЙ
Маляров М.В.
МЕТОДИЧНІ ВКАЗІВКИ
ДО ВИКОНАННЯ ЛАБОРАТОРНИХ РОБІТ
За темою:
«Основи програмування на VBA»
(для очної форми навчання)
ХАРКІВ-2013
1
Оглавление
Роздел
5.
Введение
в
объектно-ориентированное
программирование............................................................................................... 3
Лабораторная работа № 1. Обзор и настройка редактора.
Работа с объектами. ........................................................................................ 4
Лабораторная работа № 2. Типы данных в VBA. Функции
преобразования типов данных. ................................................................. 10
Лабораторная работа № 3. Линейный алгоритмический
процесс. Математические функции VBA............................................. 18
Лабораторная
работа
№
4.
Разветвление
программ.
Использование условных операторов. ................................................... 23
Лабораторная работа № 5 Циклические алгоритмы. ..................... 29
Лабораторная работа № 6 Вложенные циклы, вычисление
рекуррентных соотношений. ..................................................................... 38
Лабораторная работа № 7 Массивы. Работа с вектором и
матрицей. ............................................................................................................ 44
Лабораторная работа № 8 Строки. Работа с данными
символьного типа............................................................................................. 58
2
Роздел 5.
Введение в объектно-ориентированное
программирование
Концепция компьютерного программирования, известная как ObjectOriented Programming (OOP) была разработана в середине восьмидесятых
годов. В переводе с английского Object-Oriented Programming означает
объектно-ориентированное программирование (сокращенно ООП). Основная
идея объектно-ориентированного программирования заключается в объектах,
как составных элементах программных приложений.
Каждый объект имеет свои собственные специфические качества и
поведение. Объектами можно манипулировать, задавать и изменять их свойства
и вызывать их методы. Если считать объект существительным, то свойства
объекта - это прилагательные, а методы - глаголы. Хорошим инструментом для
изучения основ объектно-ориентированного программирования является Visual
Basic for Applications (VBA, Visual Basic для приложений) — значительно
облегченная версия языка программирования Visual Basic (VB), встроенная в
оболочку Microsoft Office (Excel, Word, Access, Outlook, PowerPoint и т.д.) и
имеющая свои собственные встроенные объекты.
Объекты VBA имеют свои свойства и методы. Объектноориентированное приложение организует данные и выполняемые операторы
программного кода в связанные объекты, что облегчает разработку,
организацию и работу со сложными структурами данных и действиями,
выполняемыми над этими данными. Каждый объект в программном
приложении содержит данные и операторы, связанные вместе и образующие
единый элемент. Большинство приложений содержат много различных типов
объектов. В зависимости от того, в какое приложение встроен язык VBA,
варьируются и объекты, с которыми он работает. Объекты программирования
организуются в виде иерархии, которая называется объектной моделью
приложения.
В Excel, например, объектами VBA являются рабочие книги (Workbook),
листы (Worksheet), диапазоны данных (Range), диаграммы (Chart), диалоговые
окна (Window) и само приложение Excel (Application).
Объекты VBA в Word – документы (Document), диапазоны текста
(Range), таблицы (Table), графические объекты, диалоговые окна и само
приложение Word.
3
Лабораторная работа № 1. Обзор и настройка
редактора. Работа с объектами.
Visual Basic For Application (VBA – Visual Basic для
приложений) реализован в четырех важнейших компонентах
пакета Microsoft Office. Visual Basic For Application
представляет собой полностью унифицированный язык
программирования и почти полностью унифицированную среду
разработки.
VВА является общим для всех приложений MS Office. В VBA
применяется объектно-ориентированный подход к разработке приложений.
Каждое приложение – Word, Excel, Access, PowerPoint и др.- дополняет
средства VBA новыми функциональными возможностями с помощью объектов,
свойств и методов, присущих этому приложению. Как объектноориентированный язык программирования VBA использует следующие
основные понятия: объект, свойство, метод, событие, класс и семейство
объектов.
Объект – это объединение данных с кодом, предназначенным для их
обработки. Объекты применяются в программировании, потому что они
представляют предметы, о внутренней организации которых и о том, как они
сделаны, программисту не обязательно даже знать, но он может ими
пользоваться и управлять.
К основным встроенным объектам VBA относятся
 Label
 OptionBox
 TextBox
 Frame
 ComboBox
 CommandBotton
 ListBox
 Image
 UserForm
 CheckBox
Свойства – это параметры объекта, которые ему присущи. Они
характеризуют объект. Все свойства объекта имеют свои имена. Различные
объекты характеризуются различными свойствами, например, объект «линия»
характеризуется длиной и цветом, а объект «окружность» радиусом и цветом.
Синтаксис задания свойства объекту имеет вид
ОБЪЕКТ.СВОЙСТВО = ЗНАЧЕНИЕСВОЙСТВА
Основные свойств объектов приведены ниже





(Name)
Caption
Font
Left
Top





Visible
Text
Enabled
Width
Height
4
 Picture
 Tag
Метод – это программа, которая воздействует на объекты и их
параметры. С помощью методов можно, например, закрыть объект, удалить его,
или показать на экране. Синтаксис записи такой:
ОБЪЕКТ.МЕТОД
Событие – это действие, распознаваемое объектом, для которого можно
запрограммировать отклик (например, щелчок мышью по строке меню или
нажатие клавиши). При наступлении события происходит активизация метода,
т.е. начинают выполняться связанные с объектом программы и функции. К
событиям относятся:
 Click
 MouseDown
 DblClick
 MouseMove
 KeyDown
 MouseUp
 KeyPress
 Change
 KeyUp
 Enter
Класс – это шаблон, на основе которого во время выполнения программы
создается объект. Класс определяет свойства и методы объекта. Если взять
пример из жизни, то в качестве класса объектов можно принять школьный
класс, где объекты – это учащиеся, каждый со своими, присущими только ему
свойствами. Также каждому объекту в классе присущи одно или несколько
одинаковых свойств, например – возраст, по которому и определяется
принадлежность объекта к классу. Объект, который создается на основе класса,
называют экземпляром класса.
Код VВА хранится в проектах. Проекты содержат модули, а модули
включают процедуры и функции. Процедуры и функции содержат описания и
инструкции на языке VBA.
Для программирования на VBA нет необходимости в обязательном
порядке устанавливать какую-либо версию транслятора Visual Basic. Вполне
достаточно, если на компьютере будет установлен Microsoft Office. Для
создания программы, которая называется макросом, необходимо загрузить
Microsoft Word или Microsoft Excel. Далее выполнить команду СервисМакрос-Редактор Visual Basic. В окне проекта автоматически будет
созданы операторы для объявления процедуры (программы)
Sub ИМЯ()
Это стандартный заголовок макроса. Завершающей строкой процедуры
является строка
End Sub
5
Задание 1
Ознакомиться с основными компонентами среды редактора Visual Basic,
выработать умения и навыки работы с компонентами интегрированной среды
разработки проектов.
Порядок выполнения
1. Откройте приложение Microsoft Word, выполнив команду Пуск —
Программы — Microsoft Office — Microsoft Word.
2. Выполните команду Сервис — Макрос — Безопасность и
установите следующие параметры безопасности:
 Во вкладке Безопасность выберите переключатель Средняя.
 Во вкладке Надежные изделия установите флажок Доверять
доступ к Visual Basic Project.
3. Закройте окно приложения Microsoft Word, повторите п.1 и проверьте,
сохранились ли параметры безопасности, которые были установлены в п.2.
4. Откройте окно интегрированной среды разработки приложений
редактора Visual Basic командой Сервис — Макрос — Редактор Visual
Basic или нажатием комбинации клавиш ALT+F11.
5. Удалите, а потом восстановите окно проекта Project и окна свойств
Properties. Сделайте схематические рисунки кнопок панели инструментов (
и
), с помощью которых восстанавливаются эти окна.
6. Добавьте в проект окно формы, щелкнув кнопку Insert UserForm
,
которая расположена на стандартной панели инструментов и запишите
значения свойств формы Name и Caption.
7. Сделайте схематический рисунок главного окна среды редактора Visual
Basic.
8. Добавьте к проекту еще одну форму, щелкнув кнопку Insert
UserForm, узнайте значения ее свойств Name и Caption. После этого удалите
последнюю форму. Для этого щелкните правой клавишей мыши на ее значке в
окне проекта Project и из контекстного меню выберите команду Remove, а
затем нажмите кнопку Нет, отвечая на запрос, об экспорте формы.
9. Найдите на панели элементов управления ToolBox кнопки следующих
элементов: Label, TextBox, Image, и CommandButton и сделайте их
схематические рисунки.
10. Двойным щелчком мыши на форме вызовите окно кода, найдите
выпадающие списки Procedure и Object. Сделайте схематический рисунок
окна кода.
11. С помощью панели инструментов окна проекта перейдите из окна кода в
окно формы и обратно. Нарисуйте кнопки (
и
), которые обеспечили эти
переходы.
6
12. Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5), а потом
завершите ее работу. Опишите, как изменялся внешний вид формы.
13. Сохраните документ Word вместе с программой в своей папке (имя
файла Лаб1_1.doc) и закройте окно Word.
14. Двойным щелчком мыши на значке документа Лаб1_1.doc откройте его.
При открытии ответьте на запрос отключать ли макросы, нажав кнопку Не
отключать макросы, а затем перейдите в окно интегрированной среды
разработки приложений редактора Visual Basic и убедитесь, что в нем имеется
форма UserForm.
15. Завершите работу в приложении Microsoft Word.
Задание 2
Создать в среде редактора Visual
Basic форму с двумя надписями, двумя
кнопками и рисунком по приведенному
эскизу.
Порядок выполнения
1. Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. В окне свойств Properties измените значение свойства (Name) на
First_frm, a значение свойства Caption на Моя первая форма. Обратите
внимание на изменение внешнего вида формы.
4. Добавьте на форму новую надпись. Для этого найдите на панели
элементов управления ToolBox кнопку Label
, щелкните по ней мышкой, а
затем выполните щелчок на окне формы (также можно перетащить кнопку с
панели ToolBox на окно формы).
5. Для вставленной надписи в окне свойств Properties измените значение
свойства Caption на Добрый день!!!. Обратите внимание на изменение
внешнего вида формы.
6. Вставьте на форму еще одну надпись, повторив пункты 4 и 5.
7. Для добавления кнопки необходимо найти на панели элементов
управления ToolBox кнопку CommandButton
и вставить ее на форму.
7
8. Для вставленной кнопку в окне свойств Properties измените значение
свойства (Name) на cmdЦвет, a значение свойства Caption на Изменить цвет.
9. Аналогично вставить еще одну кнопку, изменив значение свойств (Name)
на cmdВидимость, a значение свойства Caption на Изменить Видимость
10.Для добавления рисунка необходимо найти на панели элементов
управления ToolBox кнопку Image
и вставить ее на форму.
11.Для вставленного рисунка в окне свойств Properties измените значение
свойства (Name) на imgСмайл, затем перейдите к свойству Picture нажмите
кнопку
и в появившемся окне укажите путь к файлу рисунка.
12.Для корректного отображения рисунка для свойства PictureSizeMode
выберите то значение, при котором рисунок отображается наиболее
правильным образом.
Задание 3
Доработать форму, созданную ранее, чтобы при помощи кнопок изменялся
цвет надписей и видимость рисунка. Также необходимо предусмотреть возврат
формы в исходный вид.
Анализ проекта
Необходимо создать код процедуры, которая обрабатывает событие Click
для кнопки Изменить цвет при этом цвет надписи Label1 должен измениться
на синий (свойство ForeColor = vbBlue), а цвет надписи Label2 – на красный
(свойство ForeColor = vbRed). Событие Click для кнопки Изменить видимость
должно изменить свойство Visible рисунка imgСмайл чтобы рисунок стал
невидимым (свойство Visible = False). Щелчок мыши в любой части формы
(событие Click) должен привести форму в исходный вид (надписи черные
(свойство ForeColor = vbBlack), рисунок видимый (свойство Visible = True)).
Порядок выполнения
1. Дважды щелкните на кнопке Изменить цвет. В результате открывается
окно кода VBA в котором автоматически создается пустая процедура с
заголовком Private Sub cmdЦвет_Click() и концом End Sub.
2. Внутри процедуры введите следующий текст:
Private Sub cmdЦвет_Click()
Label1.ForeColor = vbBlue
Label2.ForeColor = vbRed
End Sub
3. Аналогично щелкнув по кнопке Изменить видимость создадим
следующую процедуру:
8
Private Sub cmdВидимость_Click()
imgСмайл.Visible = False
End Sub
4. Для возврата формы в исходный вид дважды щелкните на любом
свободном месте формы и введите следующий текст процедуры
Label1.ForeColor = vbBlack
Label2.ForeColor = vbBlack
imgСмайл.Visible = True
5. Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5).
6. Проанализируйте работоспособность программы.
7. Сохраните документ в файле Лаб1_3.doc в своей папке на жестком диске.
Задание для самостоятельной работы
Создать в среде редактора Visual
Basic форму по приведенному эскизу.
При
наведении
мышки
на
соответствующую кнопку цвет надписи
должен изменяться. При наведении на
форму цвет надписи должен принять
исходный вид
Результат работы:
1. Файл Лаб1_1.doc с формой UserForm.
2. Файл Лаб1_3.doc с формой First_frm.
Вопросы для самоконтроля
1.
2.
3.
4.
5.
6.
Что такое ООП (объектно-ориентированное программирование)?
Как расшифровывается аббревиатура VBA?
Что такое в терминах ООП объект, свойство, метод, событие?
За что отвечает свойство (Name), Caption, Font, Visible, Picture?
Какие события Вы знаете?
С помощью какой команды открывается среда редактора VBA?
9
Лабораторная работа № 2. Типы данных в VBA. Функции
преобразования типов данных.
Любая программа на языке VBA может состоять из одного или
нескольких модулей. Модуль VBA — это текст программы,
вставленный в рабочую книгу MS Excel или документ Ms Word.
Модуль включает в свой состав функции и процедуры.
Описание процедуры начинается с заголовка Sub, за которым
находится имя процедуры и список ее формальных параметров,
заключенных в круглые скобки. Процедура заканчивается оператором End
Sub.
Sub имя_процедуры ([аргументы])
Инструкции процедуры
End Sub
Обычно любой текст программы на языке VBA начинается с опций,
которые управляют описанием переменных, способом задания индексов
массивов и т.п. Затем следуют объявления глобальных переменных или
констант для данного модуля, т.е таких переменных, которые можно
использовать во всех процедурах модуля. Далее непосредственно располагается
текст функций и процедур, составляющих саму программу.
Начало модуля
Опции VBA (Option Base 1, Option Explicit)
Описание глобальных констант
Описание глобальных переменных
Sub имя_процедуры ([аргументы])
Описание констант
Описание переменных
Ввод исходных значений
Инструкции процедуры
Вывод полученных результатов
End Sub
Конец модуля
Описание констант осуществляется ключевым словом Const, и при
описании константы требуется присвоить ей значение. Попытка изменить в
ходе выполнения программы значение константы вызывает ошибку.
Const <имяКонстанты> [As <типДанных>] = <значение>
Описание переменных в VBA возможно с использованием переменных
различных типов. Выбор типа основывается на требованиях создаваемого
приложения. Основными типами данных VBA являются целочисленный тип
10
(Integer и Long), вещественный тип (Single и Double), логический
(Boolean), дата-время (Date), денежный (Currency), строковый (String),
а также существует тип Variant, используемый по умолчанию. Он задается
VBA, если переменная не описана. При этом производится проверка значения,
вводимого в память и его идентификация, поэтому резко возрастает и время
выполнения программы, и объем памяти.
Для описания переменных чаще всего используется инструкция Dim,
которая имеет синтаксис:
Dim имяПеременной [([ индексы])] [As тип]
Параметр имяПеременной - имя описываемой переменной. Необязательные
скобки и параметр индексы используются для описания массивов.
Дополнительный параметр As тип позволяет назначить переменной требуемый
тип данных. Если тип не назначен, то переменной присваивается тип Variant.
Помимо организации ввода-вывода информации с помощью формы в
VBA существуют две возможности создания диалоговых окон, позволяющих
вести интерактивный диалог с пользователями. Это окно вывода сообщений
MsgBox, которое выводит простейшие сообщения для пользователя, а окно
ввода InputBox, обеспечивающее ввод информации.
Функция InputBox выводит на экран диалоговое окно, содержащее
сообщение и поле ввода, устанавливает режим ожидания ввода текста
пользователем или нажатия кнопки, а затем возвращает значение типа String,
содержащее текст, введенный в поле.
InputBox(сообщение [,заголовок] [,default])
При этом сообщение – строковое выражение, отображаемое как
сообщение в диалоговом окне; заголовок – строковое выражение,
отображаемое в строке заголовка диалогового окна. Если этот аргумент
опущен, в строку помещается имя приложения; Default – строковое
выражение, отображаемое в поле ввода как используемое по умолчанию, если
пользователь не введет другую строку. Если этот аргумент опущен, поле ввода
отображается пустым;
Чтобы передать информацию, введенную в поле ввода функции
InputBox, программе, присваивают значение строковой переменной,
например:
strSity = InputBox(“В каком городе Вы родились?”,
"Опрос", "В Харькове")
Процедура MsgBox выводит на экран диалоговое окно, содержащее
сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а
затем возвращает значение типа Integer, указывающее, какая кнопка была
нажата.
MsgBox(сообщение [, кнопки] [, заголовок])
11
Аргументами процедуры являются сообщение – строковое выражение,
отображаемое как сообщение в диалоговом окне; кнопки - числовое
выражение, представляющее сумму значений, которые указывают число и тип
отображаемых кнопок, тип используемого значка, основную кнопку и
модальность окна сообщения. Заголовок – строковое выражение,
отображаемое в строке заголовка диалогового окна. Если этот аргумент
опущен, в строку помещается имя приложения.
В программах на VBA очень часто приходится преобразовывать значения
из одного типа данных в другой. Несколько типичных ситуаций, когда этим
приходится заниматься:
преобразование из строкового значение в числовое при приеме значения
от пользователя через функцию InputBox();
преобразование из числового значения в строковое при выводе значения
через процедуру MsgBox;
преобразование значения даты/времени в строковое, когда нам нужно
отобразить дату или время единообразно вне зависимости от региональных
настроек на компьютерах пользователей;
Чаще всего для конвертации типов данных используются функции, имя
которых выглядит как C (от слова Convert) + имя типа данных. Вот перечень
этих функций: CBool(), CByte(), CCur(), CDate(), CDbl(),
CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate().
Кроме того, еще несколько полезных для конвертации функций:
Str() — позволяет перевести числовое значение в строковое. Делает
почти то же самое, что и CStr(), но при этом вставляет пробел впереди для
положительных чисел.
Val() — "вытаскивает" из смеси цифр и букв только числовое значение.
При этом эта функция читает данные слева направо и останавливается на
первом нечисловом значении (допускается единственное нечисловое значение
— точка, которая будет отделять целую часть от дробной).
nVar1 = Val(InputBox("Введите значение"))
В текст программы также можно добавлять комментарии. Комментарии – это
текст, поясняющий назначение и порядок производимых в программе действий.
Этот элемент программирования необязательный, но он позволяет облегчить
понимание внутренней логики программы. Комментарий обозначается
символом апострофа (‘) или ключевым словом Rem. Все, что записано левее
этих знаков, относится к комментарию, и будет игнорироваться программой.
12
Задание 1
Создать программу калькулятора для выполнения простейших действий
над двумя числами (сложение, вычитание, умножение, деление, возведение в
степень).
Порядок выполнения
1. Откройте приложение Microsoft Word, выполнив команду Пуск —
Программы — Microsoft Office — Microsoft Word.
2. Находясь в среде Ms Word нажмите ALT+ F11, чтобы перейти в среду
VBA.
3. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
4. В окне свойств Properties измените значение свойства (Name) на frmCalc,
a значение свойства Caption на Простейший калькулятор.
5. Добавьте на форму надпись. Для этого найдите на панели элементов
управления ToolBox кнопку Label
, щелкните по ней мышкой, а затем
выполните щелчок на окне формы (также можно перетащить кнопку с панели
ToolBox на окно формы).
6. Для вставленной надписи в окне свойств Properties измените значение
свойства Caption на Первое число.
7. Для добавления текстового поля ввода необходимо найти на панели
элементов управления ToolBox кнопку TextBox
и вставить ее на форму.
8. Для вставленного текстового поля в окне свойств Properties измените
значение свойства (Name) на txt1.
9. Действуя аналогично, создайте форму согласно эскизу, установив в окне
свойств Properties значение свойств (Name) и Caption которые приведены
ниже.
Свойство (Name)
1
1 — frmCalc
5
7 — CmdStepen
2 — txt1
2
6
8 — CmdMinus
3 — txt2
3
4
7
4 — txtRez
8
5 — CmdUmn
9
9 — CmdPlus
6 — CmdDel
10.Перейдите в окно кода, дважды щелкнув кнопку * (умножить), и введите
следующий текст процедуры
13
Private Sub cmdUmn_Click()
txtRez = txt1 * txt2
End Sub
11.Перейдите в окно кода, дважды щелкнув кнопку / (разделить), и введите
следующий текст процедуры
Private Sub CmdDel_Click()
txtrez = txt1 / txt2
End Sub
12.Аналогично введите тексты процедур для остальных кнопок:
возведение в степень
Private Sub CmdStepen_Click()
txtrez = txt1 ^ txt2
End Sub
вычитание
Private Sub CmdMinus_Click()
txtrez = txt1 - txt2
End Sub
сложение
Private Sub CmdPlus_Click()
txtrez = txt1 + txt2
End Sub
13.Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5).
14.В поле Первое число введите число 6, а в поле Второе число введите 3 и
последовательно нажимая кнопки, проверить результаты вычислений.
Обратите внимание, результат сложения чисел равняется 63.
Это происходит потому, что VBA воспринимает числа,
вводимые в поле TextBox, как текст. Соответственно,
результат сложения текста (конкатенация) равняется 63. Для
получения правильного результата необходимо преобразовать
вводимее в поле TextBox значения в числовые с помощью команды Val().
При этом текст процедуры примет вид
Private Sub CmdPlus_Click()
txtrez = Val(txt1) + Val(txt2)
End Sub
15.Снова проанализируйте работоспособность программы и сохраните
документ в файле Лаб2_1.doc в своей папке на жестком диске.
14
Задание 2
Создать диалоговый интерфейс с пользователем, при котором программа
запросит имя пользователя и выведет диалоговое окно с приветствием.
Порядок выполнения
1. Откройте приложение Microsoft Word и перейдите в среду VBA нажав
клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или выполните
двойной щелчок мышкой на пункте ThisDocument). Появляется окно
кода VBA.
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer2()
Dim Name As String 'Опишем строковую переменную
' Создаем диалоговое окно ввода имени
Name = InputBox("Введите ваше имя", "Запрос имени")
' Создаем окно вывода приветствия
MsgBox ("Добрый день, " + Name + "! " + "Как Ваши
дела?")
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5) и проанализируйте работоспособность программы.
5. Сохраните документ в файле Лаб2_2.doc в своей папке на жестком диске.
Задание 3
Для ликвидации чрезвычайной ситуации пожарный автомобиль
установлен для перекачки на источник воды. Известно дата и время
включения и выключения наcоса и количество литров перекаченной воды.
Определить производительность насоса пожарного автомобиля.
Анализ проекта
Для реализации проекта введем следующие обозначения. Тип Date: T1,
T2 — дата и время включения и выключения насоса автомобиля; тип Integer:
T — количество часов работы насоса; тип Single: V — количество литров
перекаченной воды, Q — производительность насоса пожарного автомобиля.
Решение задачи производится в следующем порядке. Предварительно
задаются T1 и T2. В качестве T1 принимаем текущую дату и время, а в
качестве T2 — увеличенное на один час время T1. При необходимости
15
времена T1 и T2 изменяются, далее вычисляется время работы насоса T=T2T1 и его производительность Q=V/T.
Порядок выполнения
1. Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже.
Свойство (Name)
1
1 — frmWater
2
2 — txtT1
3
3 — txtT2
4
4 — txtV
5 — cmdВычислить
5
6 — txtQ
6
4. Перейдите в окно кода, дважды щелкнув на пустом месте формы и из
выпадающего списка Procedure, который расположен в правом верхнем углу
окна кода выберите событие Activate и введите следующий текст процедуры
Private Sub UserForm_Activate()
'Текущие дата и время
txtT1=Format(Now, "dd/mm/yy h:mm")
'Через час
txtT2=Format(DateAdd("h",1, Now), "dd/mm/yy h:mm")
End Sub
5. Также самой первой строкой кода введите
Option Explicit
Данный оператор требует, чтобы все переменные, используемые при работе
программы, были описаны (можно использовать только то, что есть на форме
или указано в Dim или Const).
6. Перейдите на форму, дважды щелкните кнопку Вычислить, и введите
следующий текст процедуры
Private Sub cmdВычислить_Click()
'Описание переменных
Dim T1 As Date 'Время включения насоса
Dim T2 As Date 'Время выключения насоса
16
Dim V As Single 'Перекачено воды
Dim Q As Single 'Водоотдача насоса
Dim T As Long
'Время работы насоса
'Вводим исходные данные
T1 = CDate(txtT1)
T2 = CDate(txtT2)
V = CSng(txtV)
T = DateDiff("h", T1, T2) 'Время работы насоса
Q = V / T 'Вычисляем Водоотдачу насоса
'Выводим Водоотдачу насоса
txtQ = Format(Q, "0.0") & " л/час"
End Sub
7. Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5).
8. Проанализируйте работоспособность программы при различных
значениях времени включения и выключения насоса.
9. Сохраните документ в файле Лаб2_3.doc в своей папке на жестком диске.
Задание для самостоятельной работы
1. Так как время работы насоса (задание 3) вычислено в часах, то
производительность насоса вычислена не очень точно. Доработать
программу таким образом, чтобы производительность насоса измерялась
в л/мин (л/сек).
2. Составить программу определяющую сколько лет, месяцев и дней
прошло от вашего дня рождения до текущей даты?
Результат работы:
3. Файл Лаб2_1.doc с формой Простейший калькулятор
4. Файл Лаб2_2 с выполненным заданием.
5. Файл Лаб2_3 с формой Производительность насоса
Вопросы для самоконтроля
1. Каким оператором начинается и заканчивается процедура?
2. Приведите типовую структуру программ на VBA.
3. Какие типы данных используются в VBA?
4. Как описываются константы и переменные в теле программы.
5. Приведите синтаксис функции InputBox и процедуры MsgBox.
6. Какие функции преобразовывают строковую переменную в числовую и
обратно?
17
Лабораторная работа № 3. Линейный алгоритмический
процесс. Математические функции VBA.
Встроенные математические функции VBA используются для
более сложных вычислений, которые не могут быть получены с
использованием простых операций. Математические функции
VBA используются для обработки отдельных чисел и не могут
применяться к массивам (группам) чисел. Если в этом есть
необходимость, то нужно обрабатывать каждый элемент в
отдельности.
Основными математическими функциями VBA являются:
Функция
Выполняемое действие
Atn(x)
Возвращение арктангенса угла в радианах
Sin(x)
Возвращение синуса угла в радианах
Cos(x)
Возвращение косинуса угла в радианах
Tan(x)
Возвращение тангенса угла в радианах
Exp(x)
Возвращение значения ex, где
переменной или введенное число
Log(x)
Возвращение натурального логарифма числа
Sqr(x)
Возвращение квадратного корень числа
x
-
значение
Randomize Инициирование генератора случайных чисел
Rnd(x)
Возвращение случайного числа
Abs(x)
Возвращение абсолютного значения числа (по
модулю)
Sgn(x)
Возвращение знака числа (+ или -)
Fix(x)
Возвращение
округленного
отсечением дробной части
Int(x)
Возвращение округленного значения числа до
ближайшего целого
значения
числа
При вызове встроенной функции следует указать в круглых скобках ее
аргумент. Исключение составляет функция Randomize, которая включает
генератор случайных чисел и не имеет аргумента.
18
Задание 1
e x  sin 3  z   4,5 x
Найти значения переменной у, заданные формулой y 
z x  b3,5
при различных значений х, z, b. Исходные данные вводить с клавиатуры.
Анализ проекта
Программа состоит из трех шагов: ввод значений х, z, b; вычисление у для
этого значения; вывод полученного результата.
Определяем переменные, участвующие в программе: их имена и типы.
Пусть х, z, b и результат у будут вещественного типа Single (целый тип Integer для
у брать нельзя, т.к. операция извлечения корня и функция sin (х) могут дать в
качестве результата вещественные числа). В начале программы следует поставить
описания этих переменных.
Ввод чисел организуем при помощи функции InputBox, вывод –
оператором MsgBox. Значение функции InputBox и аргумент оператора
MsgBox имеют строковый тип (String), поэтому необходимо преобразовать
введенные значения в число (String в Single), a результат в строку (из
Single в String).
В программе участвуют встроенные функции - извлечение корня и вычисление
синуса и экспоненты. В VBA это Sqr(x), Sin (х) и Exp(x).
Порядок выполнения
1. Откройте приложение Microsoft Word и перейдите в среду VBA нажав
клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или выполните
двойной щелчок мышкой на пункте ThisDocument). Появляется окно
кода VBA.
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer1()
' Описание переменных
Dim x As Single, z As Single, b As Single
Dim y As Single
' Ввод исходных значений
x = Val(InputBox("Введите число х="))
z = Val(InputBox("Введите число z="))
b = Val(InputBox("Введите число b="))
' Вычисление y
y = (Exp(x) + Sin(z)^3 - 4.5*Sqr(x)) / (z^x + b^3.5)
19
' Вывод y на экран
MsgBox ("Значение y= " & Str(y))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5) и проанализируйте работоспособность программы
с различными исходными значениями.
5. Сохраните документ в файле Лаб3_1.doc в своей папке на жестком диске.
Задание 2
Найти значения переменной у, заданные формулой y  3 x  cosx   x3 при
различных значений х. Исходные данные вводить и выводить на рабочий лист
Excel.
Анализ проекта
Программа состоит из трех шагов: ввод значения значений х; вычисление
у для этого значения; вывод полученного результата.
Пусть х и результат у будут вещественного типа Single. В начале программы
следует поставить описания этих переменных.
Для организации ввода вывода можно использовать рабочий лист Excel.
Ячейки листа имеют имена Cells (i, j ), где i - номер строки, j - номер
столбца. Например, ввод значения переменной х из ячейки А1 выглядит в
программе так: х = Cells(1,1), а вывод результата - значения х в ячейку,
например, С2 (третий столбец) реализуется так: Cells(2,3) = х
В программе участвуют встроенные функции - вычисление косинуса и
определение модуля числа. В VBA это Abs(x) и Cos (х).
Отметим, что извлечение корня любой степени из числа
эквивалентно операции возведения этого числа в дробную степень.
В общем виде
n
x
1
xn .
Порядок выполнения
1. Откройте приложение Microsoft Excel и на рабочем листе Лист 1,
создайте заготовку по следующему эскизу
20
2. Перейдите в среду VBA нажав клавиши ALT+F11
3. В окне свойств Project щелкните кнопку View code
(или выполните
двойной щелчок мышкой на пункте ThisDocument). Появляется окно
кода VBA.
4. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer2()
' Описание переменных
Dim x As Single
Dim y As Single
' Ввод исходных значений с ячейки B1
x = Cells(1, 2)
' Вычисление y
y = Abs(x) ^ 1 / 3 + Cos(x) + x ^ 3
' Вывод y в ячейку B2
Cells(2, 2) = y
End Sub
5. Вернитесь на рабочий лист и введите исходное значение x=3 в ячейку B1.
6. Перейдите в среду VBA и запустите программу на выполнение, щелкнув
на кнопке Run
(или нажмите клавишу F5) и проанализируйте
работоспособность программы с различными исходными значениями.
7. Сохраните документ в файле Лаб3_2.xls в своей папке на жестком диске.
Задание 3
Обменять значения двух переменных вводимых с клавиатуры.
Анализ проекта
Пусть имена переменных х и у. Задача состоит в том, чтобы переменная х
получила значение переменной у и наоборот: у получил значение переменной х.
Необходимо помнить, что в любых операциях обмена значений переменных
требуется посредник - дополнительная переменная для хранения промежуточного
результата (старого значения одной из исходных переменных). Пусть такой
переменной-посредником будет rab.
Порядок выполнения
1. Откройте приложение Microsoft Word и перейдите в среду VBA нажав
клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или выполните
двойной щелчок мышкой на пункте ThisDocument). Появляется окно
кода VBA.
21
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer3()
' Описание переменных
Dim x As Single, rab As Single
Dim y As Single
' Ввод исходных значений
x = Val(InputBox("Введите значение x="))
y = Val(InputBox("Введите значение y="))
' Обмен переменных
rab = x
x = y
y = rab
' Вывод на экран
MsgBox ("Значение x= " & Str(x) & " Значение y= " &
Str(y))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5) и проанализируйте работоспособность программы
с различными исходными значениями.
5. Сохраните документ в файле Лаб3_3.doc в своей папке на жестком диске.
Задание для самостоятельной работы
1. Найти значение переменной у при различных значениях А, В, С,
вводимых с листа Excel, и значениях х, z, вводимых с клавиатуры:
y
xB
A
C
x 1
cosz 
Ax  1
2. Заданы три действительных положительных числа. Найти среднее
арифметическое и среднее геометрическое этих чисел.
3. Задано длина ребра куба. Найти объем куба и площадь его поверхности.
Результат работы:
1. Файлы Лаб3_1.doc, Лаб3_2.xls, Лаб3_3.doc с выполненным заданием.
Вопросы для самоконтроля
1. Какие математические функции VBA вы знаете?
2. Как организуется ввод и вывод значений на рабочий лист Excel?
22
Лабораторная работа № 4. Разветвление программ.
Использование условных операторов.
Условный оператор является одним из самых популярных
средств, изменяющих естественный порядок выполнения
операторов программы. Эта алгоритмическая структура
представляет разветвление алгоритма в зависимости от
значения (истинности или ложности) некоторого условия. В
общем виде синтаксическая конструкция выглядит следующим
образом:
Если условие то оператор1 иначе оператор2,
и читается как «если условие истинно, то выполнить оператор1, иначе (если
условие ложно), выполнить оператор2». В VBA различают строчный и
блочный условные операторы. Строчный условный оператор используется в
том случае, когда при разветвлении программы необходимо на каждой ветке
выполнить по одному оператору. Синтаксис строчного оператора выглядит
следующим образом
If условие Then [оператор1] [Else оператор2].
Блочный условный оператор необходим тогда, когда операторов
несколько и синтаксис оператора будет следующий
If условие Then
[Блок операторов]
[Else
[Блок операторов]]
End If
Обязательный параметр условие — представляет собой логическое
выражение, которое возвращает значение TRUE (истина) или FALSE (ложь).
Логическое выражение может быть простым или сложным. Сложные условия
образуются с помощью логических операций and, or, not. Если условие равно
TRUE, то выполняется оператор1, если условие равно FALSE, то
выполняется оператор2. Далее выполняется инструкция, следующая по
порядку за строкой с инструкцией If... Then...Else.
Часть оператора If, а именно ключевое слово Else и следующие за ним
инструкции можно опустить, тогда при условии равном FALSE выполняется
оператор, следующий за строкой с инструкцией If. Т.е. синтаксис оператора
выглядит так:
If условие Then [оператор]
На блок-схемах эти два случая изображаются следующим образом:
23
Еще одним условным оператором в VBA является оператор Select Case.
Это оператор выбора из многих возможных вариантов. Оператор Select Case
выполняет одну из нескольких групп операторов в зависимости от значения
выражения. В языках высокого уровня такой оператор называется
переключателем. Синтаксис инструкции Select Case и блок-схема алгоритма
приведены ниже.
Select Саsе выражение
[Case список условий-1
[операторы-1]]
[Саsе список условий-2
[операторы-2]]
…
[Саsе список условий-n
[операторы-n]]
[Case Else
[операторы_ else]]
End Select
селектор
список-1
оператор-1
список-2
оператор-2
список-n
оператор-n
иначе
Обязательный параметр выражение может быть любым выражением
любого типа данных VBA, включая числовой, строковый, или логический.
Список условий — обязательный при наличии инструкции CASE. Содержит
результаты вычисления выражения, записанные в одном из видов:
 Саsе КОНСТАНТА1, КОНСТАНТА2, KOHCTAHTA3, ...
 Саsе Is ЗНАК_ОТНОШЕНИЯ КОНСТАНТА
 Case КОНСТАНТА1 to КОНСТАНТА2
Выполняется оператор Select Case следующим образом — сначала вычисляется
значение выражения, стоящего после ключевых слов Select Case, затем
производится проверка на совпадение значения выражения и одного из Case
условий, в случае совпадения выполняются операторы, помещенные за этим
24
Case условием. В случае, если совпадения не обнаружено ни в одном из Case
условий, то выполняются операторы, находящиеся после ключевых слов Саsе
Else. Если список выражений в Саsе условии записан в первой форме, то
необходимо, чтобы результат вычислений выражения равнялся одной
константе из списка, если Case условие записано во второй форме, то
необходимо, чтобы выполнялось условие отношения между значением
выражения и константой. Если же в третьей форме, то необходимо выполнение
соотношения КОНСТАНТА1<=выражение<=КОНСТАНТА2.
Задание 1
Определить радиус кругового пожара, если известна линейная скорость
распространения огня и время горения. Необходимо учесть, что если время
горения превышает 10 мин, то скорость распространения огня увеличивается на
50%. Если объект относится к пожароопасной зоне, то радиус пожара
увеличивается на 20%.
Анализ проекта
Для реализации проекта введем следующие обозначения. Тип Single: V —
скорость распространения пожара, T — время горения; R — радиус пожара.
Тип Boolean: Fire — наличие большой пожарной опасности объекта.
Вначале определяем скорость горения. Если T>10 то Vг=1,5 V, иначе Vг=V.
Радиус пожара определяется как R=TVг. Если объект относится к
пожароопасной зоне (Fire=True), то Rп=1,2R, иначе Rп=R.
Порядок выполнения
1. Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже. Обратите
внимание на то, что элемент управления флажок создается с помощью
копки панели управления, которая имеет вид
. На форме он имеет
имя chkFire, а свойство Caption — Пожарная опасность.
25
Свойство (Name)
1 — frmFire
1
2
2 — txtV
3
3 — txtT
4 — cmdВычислить
4
6
5 — txtR
5
6 — chkFire
4. Перейдите в окно кода, дважды щелкнув кнопку Вычислить, и введите
следующий текст процедуры
Private Sub cmdВычислить_Click()
Dim V As Single, T As Single, R As Single
'Ввод исходных данных
V = CSng(txtV)
T = CSng(txtT)
'определяем скорость распространения
If T > 10 Then
V = 1.5 * V
End If
'определяем радиус пожара
R = V * T
'определяем радиус пожара при пожарной опасности
If chkFire Then
R = 1.2 * R
End If
'Вывод значения на форму
txtR = Format(R, "0.00") & " метра (ов)."
End Sub
5. Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5).
6. Проверьте правильность работы приложения при различных исходных
данных.
7. Сохраните документ в файле Лаб4_1.doc в своей папке на жестком диске.
Задание 2
Вычислить математическую функцию y(a,x), при заданных значениях a и x.
Исходные значения ввести с клавиатуры.
ln a 2  1 , если x  a;
yx ,a   
sin ax  , если x  a.


26
Порядок выполнения
1. Перейдите в среду VBA нажав клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или
выполните двойной щелчок мышкой на пункте ThisDocument). Появляется
окно кода VBA.
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer2()
Dim a, x, y As Single
' Вводим исходные данные с клавиатуры
a = Val(InputBox("Введите а"))
x = Val(InputBox("Введите x"))
' вычисляем значение
If x > a Then y = Log(a ^ 2 + 1) Else y = Sin(a * x)
'Вывод у
MsgBox ("Значение у=" & Str(y))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
5. Сохраните документ в файле Лаб4_2.doc в своей папке на жестком диске.
Задание 3
Написать программу для определения соответствия между номером дня
недели и его названием согласно формуле Зеллера (0-Сб, 1-Вс, 2-Пн, 3-Вт, 4Ср, 5-Чт, 6-Пт).
Порядок выполнения
1. Перейдите в среду VBA нажав клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или
выполните двойной щелчок мышкой на пункте ThisDocument). Появляется
окно кода VBA.
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Primer3()
Dim Day As Integer
'Вводим с клавиатуры номер дня
Day = Val(InputBox("Введите номер дня недели"))
' Определяем название дня недели
Select Case Day
Case 0
27
MsgBox ("Это
Case 1
MsgBox ("Это
Case 2
MsgBox ("Это
Case 3
MsgBox ("Это
Case 4
MsgBox ("Это
Case 5
MsgBox ("Это
Case 6
MsgBox ("Это
End Select
End Sub
суббота")
'День с номером 0
воскресенье") 'День с номером 1
понедельник") 'День с номером 2
вторник")
'День с номером 3
среда")
'День с номером 4
четверг")
'День с номером 6
пятница")
'День с номером 7
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
5. Проверить правильность работы программы путем ввода различных
номеров дня недели.
6. Доработать программу, предусмотрев защиту от неправильно ввода дня
недели. Для этого перед строчкой кода
End Select
добавить строки
Case Else
MsgBox ("Такой день недели не существует")
7. Проверить правильность работы программы путем ввода различных
номеров дня недели, в том числе и неправильных.
8. Сохраните документ в файле Лаб4_3.doc в своей папке на жестком диске.
Результат работы:
1. Файл Лаб4_1.doc с формой Круговой пожар
2. Файлы Лаб4_2.doc, Лаб4_3.doc с выполненными заданиями
Вопросы для самоконтроля
Что такое разветвляющиеся алгоритмы?
Каким элементом на блок-схеме обозначается условный оператор?
Какой синтаксис имеет условный оператор If... Then...Else и Select Case?
В чем отличие строчного и блочного операторов If... Then...Else. в каких
случаях нужно использовать блочный оператор?
5. В каком виде можно записать список условий в операторе Case?
1.
2.
3.
4.
28
Лабораторная работа № 5 Циклические алгоритмы.
Решение многих практических задач сводится к
выполнению вычислений по одним и тем же зависимостям, но
при разных значениях входящих в них величин. Такой
вычислительный процесс называется циклическим, а
многократно повторяющиеся участки этого процесса
называются циклами.
Различают регулярные циклы с известным числом повторений, условием
окончания которого является достижение параметром цикла своего конечного
значения и итерационные циклы, в которых условие повторения или
окончания цикла задается по некоторому результату. В итерационных циклах
различают циклы с предусловием и постусловием. Синтаксис цикла с
предусловием выглядит следующим образом
While условие
[операторы]
Wend
Обязательный элемент условие является числовым или строковым
выражением, которое принимает значение TRUE или FALSE.
Необязательный элемент операторы включает один или несколько
операторов, выполняемых, пока условие имеет значение TRUE.
Выполняется оператор While... Wend следующим образом. Если
условие имеет значение TRUE, выполняются все операторы до инструкции
Wend. Затем управление возвращается инструкции While и вновь проверяется
условие. Если условие по-прежнему имеет значение True, процесс
повторяется. Если оно не имеет значение TRUE, выполнение возобновляется с
инструкции, следующей за инструкцией Wend.
Оператор цикла с постусловием имеет синтаксис:
Do
[операторы]
Loop Until [условие]
Синтаксис инструкции Do Loop содержит следующие элементы:
Необязательный элемент условие является числовым или строковым
выражением, которое принимает значение TRUE или FALSE.
Необязательный элемент операторы включает один или несколько
операторов, выполняемых, пока условие не приобретет значение FALSE.
Выполняется оператор Do...Loop следующим образом. Если условие
имеет значение FALSE, выполняются все операторы после инструкции Do.
Затем управление передается инструкции Until и вновь проверяется условие.
29
Если условие по-прежнему имеет значение FALSE , процесс повторяется.
Если оно имеет значение TRUE, управление передается следующему за
инструкцией Loop Until оператору.
На блок-схемах циклы с предусловием и постусловием изображаются
следующим образом:
Часто при составлении программ заранее известно количество
повторений группы операторов, в таких случаях можно использовать
инструкцию For...Next. Оператор For...Next используется для выполнения
наборов операторов указанное число раз. Циклы For используют в качестве
счетчика переменную, значение которой увеличивается или уменьшается при
каждом выполнении цикла на указанное значение. Синтаксис инструкции
For...Next
For счетчик = начало То конец [Step шаг]
[операторы]
Next [счетчик]
Обязательный элемент счетчик должен быть числовой переменной и не
может иметь тип Boolean или быть элементом массива. Обязательный элемент
начало содержит начальное значение переменной счетчик, а обязательный
элемент конец — конечное значение переменной.
Необязательный элемент шаг определяет значение, на которое
изменяется счетчик при каждом выполнении тела цикла. Если это значение не
задано, по умолчанию шаг равен единице. Шаг может быть как
положительным, так и отрицательным.
Необязательный элемент операторы включает один или несколько
операторов между For…Next, которые выполняются указанное число раз.
Инструкция For...Next работает следующим образом: начальное значение
элемента счетчик сравнивается с конечным значением. Если шаг
положителен и начальное значение меньше конечного или если шаг
30
отрицателен и начальное значение больше конечного, то управление передается
внутрь тела цикла. После выполнения всех операторов в теле цикла значение
шаг добавляется к текущему значению переменной счетчик. После этого
операторы тела цикла либо выполняются еще раз (на основе того же условия,
которое привело к начальному выполнению цикла), либо цикл завершается и
выполнение продолжается с оператора, следующей за Next.
При использовании циклических конструкций может возникнуть
необходимость досрочного выхода из цикла. В языке VBA оператором
досрочного выхода является Exit, причем в циклах For он имеет вид Exit
For, а в циклах, начинающихся с Do, он имеет вид Exit Do.
Задание 1
На территории предприятия имеется гидрант с водоотдачей Z л/с. К нему
последовательно подключаются N стволов, каждый из которых имеет расход
воды Ri л/с. Определить, на сколько первых стволов хватит водоотдачи
гидранта.
Анализ проекта
Для реализации проекта введем следующие обозначения. Тип Integer:
N — количество подключаемых стволов, i — номер рассматриваемого
ствола; k — количество стволов, которые уже подключили. Тип Single: Z —
общая водоотдача гидранта, Ri — расход воды на i-м стволе; S — общий
расход воды по все стволам.
Вначале S=0. Расход воды производится по номерам стволов следующим
образом. Проверяют, хватит ли расхода воды на первый ствол (i=1), т. е.
выполняется ли неравенство S+R1 <= Z. Если хватит, то ствол подключается
к гидранту (k=1). Затем те же действия повторяют со вторым стволом (i=2) и
т. д. Общий расход воды на k первых подключенных стволах определяется по
формуле S=R1 +R2 +… +Rk
Суммирование прекращается, если все стволы подключены (k=N) или
превышена водоотдача (k<i). Последнее неравенство показывает, что
количество стволов, которые подключены, меньше, чем количество
рассмотренных. Величина k может изменяется в пределах от 0 до N. Случай
k=0 соответствует тому, что воды не хватило даже на первый ствол.
Порядок выполнения
10.Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
31
11.На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
12.Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже. Для компонента
txtResult также установите свойство MultiLine=True, что обеспечит
многострочный вывод текста.
Свойство (Name)
1
1 — frmВода
2
2 — txtZ
3
3 — txtN
4
4 — cmdВычислить
5 — txtResult
5
13.Перейдите в окно кода, дважды щелкнув кнопку Вычислить, и введите
следующий текст процедуры
Private Sub CmdВычислить_Click()
Dim i As Integer 'Номер рассматриваемого ствола
Dim k As Integer 'количество подключенных стволов
Dim Ri As Single 'Расход воды на i-м стволе
Dim S As Single 'Общий расход воды
'Начальное состояние
S = 0
i = 0
k = 0
'Распределение воды по стволам
Do
i = i + 1
Ri = Val(InputBox("Введите расход воды", i & "-й
ствол"))
If S + Ri <= Val(txtZ) Then
S = S + Ri
k = k + 1
Else
Exit Do
End If
Loop Until (k = CInt(txtN))
'Вывод результата
If k = CInt(txtN) Then
txtresult = "Воды хватит на все стволы"
Else
32
txtresult = "Воды хватит только на " & Str(k) & "
первых ствола(ов)"
End If
End Sub
14.Запустите программу на выполнение, щелкнув на свободном месте
формы, а затем на кнопке Run
(или нажмите клавишу F5).
15.В поле Водоотдача гидранта (л/с) введите число 100, а в поле Кол.
подключаемых стволов введите 3 и щелкните кнопку Вычислить. В
появившемся диалоговом окне поочередно введите числа 20, 40, 30. В поле
Результат распределения воды появится текст Воды хватит на все стволы.
Не изменяя значений в полях Водоотдача гидранта (л/с) и Кол.
подключаемых стволов,щелкните кнопку Вычислить. В появившемся
диалоговом окне поочередно введите числа 50, 40, 30. В поле Результат
распределения воды появится текст Воды хватит только на 2 первых
ствола(ов). Проанализируйте работу программы при Ваших исходных
значениях
16. Сохраните документ в файле Лаб5_1.doc в своей папке на жестком
диске.
Задание 2
Найти среднее арифметическое из N чисел, вводимых с клавиатуры.
Анализ проекта
Среднее арифметическое - это значение суммы чисел, деленной на их
количество. Поэтому для решения задачи потребуются переменные для
накопления суммы S (тип Single) и количества чисел k (тип Integer). Основу
алгоритма составит циклическая процедура: ввести число, добавить его к
сумме S. Эти операторы нужно повторить k раз. На выходе из цикла будет
подсчитана сумма чисел, останется только разделить S на k и запомнить
результат в переменную R, ее тип - Single – результат деления не всегда будет
целым числом:
Порядок выполнения
1. Перейдите в среду VBA нажав клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или
выполните двойной щелчок мышкой на пункте ThisDocument). Появляется
окно кода VBA.
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Среднее()
Dim S, R, a As Single, k As Integer
33
k = InputBox("Введите количество чисел для
суммированя")
S = 0 'Очистка переменной для суммирования
For i = 1 To k
a = InputBox("Введите " & Str(i) & "-е число")
S = S + a 'Накапливаем сумму
Next
R = S / k
MsgBox ("Среднее арифметическое из " & Str(k) &
" чисел- "& Str(R))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
5. Проверить правильность работы программы путем ввода различных
чисел и определения их среднего арифметического.
Обратите внимание, что переменная S предварительно
обнуляются («чистятся»), причем до начала цикла. Чистку
необходимо делать, т.к. при переводе программы на машинный
язык под переменные отводится память, в которой может чтонибудь уже находиться, какая-либо старая информация. Если
убрать оператор S = 0, то в последующем присваивании S = S + а при
вычислении правой части к значению а будет добавлено неизвестное
значение S и результат будет неверный. Типичная ошибка, когда операции
обнуления помещают в тело цикла, после заголовка
6. Сохраните документ в файле Лаб5_2.doc в своей папке на жестком диске.
Задание 3
Посчитать произведение чисел, вводимых с клавиатуры до тех пор, пока
не встретится 0.
Анализ проекта
Для решения задачи потребуются переменные для накопления
произведения P (тип Single). Здесь заранее неизвестно, сколько чисел будет
введено, поэтому лучше воспользоваться циклом While…Wend
Порядок выполнения
1. Перейдите в среду VBA нажав клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или
выполните двойной щелчок мышкой на пункте ThisDocument). Появляется
окно кода VBA.
34
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Произведение()
Dim a, P As Integer
a =Val(InputBox("Введите ненулевое число"))
P = 1 'Очистка переменной для произведения
While a <> 0
P = P * a 'Накапливаем произведение
a = Val(InputBox("Ведите следующее число"))
Wend
MsgBox ("Произведение чисел равно: "& Str(P))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
5. Проверить правильность работы программы путем ввода различных
чисел и определения их произведения.
Обратите внимание, что «чистка» переменной Р заключается в
присвоении ей значения 1, т.к. Р участвует в произведении Р=Р*а
и обнуление Р привело бы к нулевому результату всей
программы. Исполнение цикла продолжается до тех пор, пока не
введен 0 в переменную а.
6. В первой строке мы потребовали, чтобы вначале было введено ненулевое
число. А что, если все-таки пользователь программы ввел 0? Тогда цикл не
проработает ни разу, а результат будет Р=1. «Защититься» от первого нуля
можно добавив в строку
a =Val(InputBox("Введите ненулевое число"))
«оберегающий» оператор Do…Loop с проверкой на ноль следующего вида:
Do
a =Val(InputBox("Введите ненулевое число"))
Loop Until a <> 0
7. Проверить правильность работы программы путем ввода первого
нулевого числа. Первый оператор цикла не позволит продолжить программу,
если вводятся нули: условие выхода из цикла а <>0
8. Сохраните документ в файле Лаб5_3.doc в своей папке на жестком диске.
Задание 4
Найти максимальное число из 10-ти произвольных чисел, вводимых с
клавиатуры.
Анализ проекта
При нахождении максимума в последовательности чисел, нужно
определить переменную для хранения максимального числа Max (тип Single).
35
Затем каждое введенное число сравнивается со значением Max и, если это
число превышает Max, то оно теперь считается максимальным и присваивается
переменной Max, стирая предыдущее значение. Таким образом, основной оператор алгоритма решения - это цикл, в котором тело составляют два действия:
ввод нового значения и проверка, не является ли это значение максимальным.
По окончании цикла в Max будет находиться наибольшее из них.
Для сравнения первого числа нужно определить начальное
значение переменной Max. Верное решение - взять любое из
анализируемой последовательности, например, первое. Неверное
решение - взять «с потолка», например, 0. Ноль сгодится, если
вводятся только положительные числа (тогда любое из них
«закроет» первоначальный максимум). Но, если могут быть введены только
отрицательные числа, то этот 0 и окажется максимальным, хотя и не был
введен. Ответ будет неверным.
Итак, возьмем в качестве начального значения первое из вводимых чисел
и откроем цикл с проверкой оставшихся 9-ти чисел на максимум. Поскольку
число шагов известно, проще воспользоваться циклом For…Next:
Порядоквыполнения
выполнения
Порядок
1. Перейдите в среду VBA и вызовите окно кода VBA.
2. В окне кода введите следующий текст процедуры
Sub МаксЧисло()
Dim a, max As Single 'тип переменных – Single
max = Val(InputBox("Введите 1-е число"))
For i = 2 To 10
a = InputBox("Введите " & Str(i) & "–е число")
If a > max Then max = a
Next
MsgBox ("Максимальное число - " & Str(Max))
End Sub
3. Запустите программу на выполнение и проверьте правильность работы
программы путем ввода различных чисел и определения их максимального.
4. Аналогично решаются задачи на поиск минимума, нужно только заменить знак неравенства и переобозначить переменную (для ясности): вместо Max
взять, например, Min.
5. Сохраните документ в файле Лаб5_4.doc в своей папке на жестком
диске
Задание для самостоятельной работы
1. Найти максимальный из отрицательных элементов среди произвольных
20 чисел, вводимых с клавиатуры.
36
2. Найти первый отрицательный член последовательности cos(n) для n,
изменяющегося так: n=0,1; 0,2; 0,3…
1. Вычислить положительные значения функции y=cos(3x)+4sin(x-3) для
х, изменяющемся на отрезке [-15,10] с шагом 1. Результат вывести на рабочий
лист Ms Excel с использованием функции Cells
2. Найти количество чисел, кратных трем, из последовательности, вводимой с клавиатуры до тех пор, пока не встретится ноль.
Результат работы:
3. Файл Лаб5_1.doc с формой Водообеспечение
4. Файлы Лаб5_2.doc, Лаб5_3.doc, Лаб5_4.doc с выполненными заданиями.
Вопросы для самоконтроля
3. Что такое циклические алгоритмы?
4. Каким элементом на блок-схеме обозначается оператор цикла?
5. Что такое регулярные и итерационные циклы. В чем их отличие?
6. Приведите синтаксис оператора цикла Do…Loop и While…Wend.
7. В чем отличие цикла с постусловием от цикла с предусловием? В каких
случаях, какой цикл нужно использовать?
8. Приведите синтаксис оператора цикла For…Next. При решении каких
задач используется данный оператор?
9. Какие правила следует соблюдать при построении вложенных циклов?
37
Лабораторная работа № 6 Вложенные циклы, вычисление
рекуррентных соотношений.
Задачи такого типа можно представить как определение
некоторой величины Y, которая является результатом
последовательности вычислений Yi=F(Yi-1), т.е. каждое
последующее значение Y вычисляется на основе его
предыдущего значений. Процесс заканчивается при достижении
какого-либо условия или конкретного значения.
Для решения подобных задач нужно понять закономерность образования
каждого последующего значения, т.е. задать функцию (или выражение) F. Очевидно, что процесс вычисления является циклом и для начала проще всего определить его тело: какие действия повторяются, какие величины и на сколько
изменяются на каждом шаге. После этого будет яснее условие продолжения
(окончания) цикла.
Задание 1
Вычислить значение Y, определяемое формулой:
Y  1024  512  ... 4  2
Анализ проекта
Чтобы понять работу алгоритма представим числа в этом выражении как
степени двойки:
Y  210  29  ... 22  21
Вычисление Y можно организовать тогда, используя цикл из десяти шагов. На каждом шаге i выполняется операция: к 2i прибавляется значение, вычисленное на предыдущем шаге, и из результата извлекается квадратный ко-
рень. Таким образом, результат i-ro шага: Yi  2i  Yi 1 . Осталось только
задать начальное значение Y=0.
Для решения задачи потребуются переменная для накопления Y (тип
Single).
Порядок выполнения
1. Перейдите в среду VBA нажав клавиши ALT+F11
2. В окне свойств Project щелкните кнопку View code
(или
выполните двойной щелчок мышкой на пункте ThisDocument). Появляется
окно кода VBA.
38
3. Перейдите в окно кода и введите следующий текст процедуры
Sub Корень()
Dim Y As Single
Y = 0
For i = 1 To 10
Y = Sqr(2 ^ i + Y)
Next
MsgBox ("Значение Y=" + Str(Y))
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
5. Сохраните документ в файле Лаб6_1.doc в своей папке на жестком диске.
Задание 2
Значение Y определяется выражением:

x2
Y    1
2i  1!
i 0
i
Вычислить:
a) значение Y для 15 первых составляющих ряда (i=0…15);
b) значение Y с точностью не ниже заданного значения e.
Анализ проекта
Вычисление реализуется циклическим алгоритмом, состоящим из 15
шагов (вариант а) или до тех пор, пока не будет достигнута необходимая
точность вычислений (вариант б).
Для любого i было бы нерационально считать входящие в выражения для
общего члена степень и факториал с самого начала, имея их значения при
предыдущем i. Удобнее найти так называемое рекуррентное соотношение,
которое устанавливает зависимость между двумя соседними членами ряда и
в дальнейшем вычислять рекуррентное соотношение. С формулы видно, что
на каждом шаге к сумме Y прибавляется очередной, Yi элемент ряда:
Y  Y  Yi ,. Для вывода рекурсивного соотношения выявим зависимость
каждого последующего Yi , от предыдущего Yi 1 значения. Величина х от
шага к шагу не изменяется, в такой постановке задачи ее просто нужно один
раз ввести, например с клавиатуры.
x2
i
Итак, любой i-й член ряда равен Yi   1
. Соответственно (i-1)-й
2i  1!
член ряда Yi 1   1i 1
x2
. Разделим Yi , на Yi 1 , учитывая, что по
2i!
39
определению факториала i  1!  i! i  1. После сокращений получим:
1
Yi
1
Yi 1 . Первым членом прогрессии
, отсюда следует, что Yi 

i 1
Yi 1 i  1
x2
x2

является Y0   1
.
20  1! 2
Для решения задачи потребуются следующие переменные: сумма членов
ряда Y (тип Single); i-й член ряда Yi (тип Single); величина х (тип Single) и
точность вычислений е (тип Single).
0
Порядок выполнения
1. Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже. Обратите
внимание на то, что элемент управления одиночного выбора создается с
помощью копки панели управления, которая имеет вид
.
Свойство (Name)
1
1 — frmРекурсия
2
2 — txtХ
3
3 — txtЕ
4
4 — optMetodA
5
5 — optMetodB
6
7
6 — cmdВычислить
7 — txtResult
4. Перейдите в окно кода, дважды щелкнув кнопку Вычислить, и введите
следующий текст процедуры
Private Sub cmdВычислить_Click()
Dim Y As Single, yi As Single
Dim x As Single, e As Single
x = Val(txtX)
e = Val(TxtE)
yi = (x ^ 2) / 2
'начальный Y0 элемент ряда
Y = yi
'начальное значение суммы
If optMetodA Then
'метод А
For i = 1 To 15
40
yi = (-1 / (i + 1)) * yi
Y = Y + yi
Next
End If
If optMetodB Then
i = 1
While Abs(yi) > e
yi = (-1 / (i + 1)) * yi
Y = Y + yi
i = i + 1
Wend
End If
txtResult = Str(Y)
End Sub
'считаем i-и элемент
'считаем сумму
'метод Б
'Проверяем точность
'считаем i-и элемент
'считаем сумму
'вывод суммы
5. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
6. Введите значение Х=20, значение Е=0.05. Произведите расчет двумя
методами. Сравните полученные значения. Измените значение Е=0.00005, а
затем на Е=0.5. Сравните полученные значения. Произведите расчет с Вашими
исходными данными.
Распространенной ошибкой является замена двух операторов тела
цикла
yi = (-1 / (i + 1)) * yi
Y = Y + yi
на один: Y = Y + (-1 / (i + 1)) * yi, что приведет к
тому, что на каждом шаге цикла к сумме Y будет прибавляться одно и то же
значение yi, равное Y0, ведь yi тогда никак не изменяется. В программах,
использующих зависимость i-ro элемента в итерации от (i-1)-го, необходимо
запоминать это предыдущее, вычисленное на (i-l)-м шаге значение, чтобы
потом использовать именно его.
7. В разработанной программе, если пользователь не определит метод,
значение суммы будет равно первому члену прогрессии. Доработаем
программу, предусмотрев обязательный выбор метода расчета. Для этого
заменим строчку кода
txtResult = Str(Y)
на строчку
If optMetodA Or optMetodB Then txtResult = Str(Y)
Else txtResult = "Не выбран метод"
8. Проверить правильность работы программы, не определяя значение
метода для расчета.
9. Сохраните документ в файле Лаб6_2.doc в своей папке на жестком диске.
41
Задание 3
Для каждого числа В из 20-ти чисел, вводимых с клавиатуры определить
наименьшее неотрицательное целое k такое, что В < 2k.
Анализ проекта
Алгоритм составляет цикл из 20-ти шагов, на каждом из которых:
вводится очередное число; проверяется, какую (наименьшую) степень
двойки оно не превышает; выводится показатель этой степени. Как получить
нужную степень двойки? Пусть число B введено. Начинаем процесс
проверки с 20, т.е. B < 20? Если да, процесс окончен, ответ k = 0. Если нет,
проверяем 21, т.е. B < 2 ? Если да, процесс окончен, ответ k = 1. Если нет,
проверяем 22 , B < 22? И так до тех пор, пока не найдем нужное число k.
Таким образом, на каждом шаге внешнего цикла (ввод очередного числа)
работает внутренний цикл, перечисляющий степени к двойки. Условие
выхода из этого внутреннего цикла - число B больше или равно 2k.
Для решения задачи потребуются переменная B и переменная k (тип
Integer).
Порядок выполнения
1. Перейдите в среду VBA и вызовите окно кода VBA.
2. В окне кода введите следующий текст процедуры
Sub MinK()
Dim b As Integer, k As Integer
For i = 1 To 20 'Внешний цикл. Вводим В и печатаем к
b = Val(InputBox("Введите челое число"))
k = 0
'для каждого В начинаем поиск с нуля
While b >= 2 ^ k 'Внутрений цикл;
k = k + 1
'Увеличиваем показатель степени
Wend
MsgBox ("Для b =" & Str(b) & " k=" & Str(k))
Next
End Sub
3. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5) и проверьте ее работоспсобность.
4. Сохраните документ в файле Лаб6_3.doc в своей папке на жестком диске.
42
Задание для самостоятельной работы
1. Вычислить выражение: y  100  95  ... 15  10  5

2. Найти сумму бесконечного ряда с точностью до e>0:
1
 nn  1n  2
n 1
3. Найти сумму k первых членов ряда:
k
n n
4 x
 n  2!
n 1
4. Для каждого числа а из 20-ти чисел, вводимых с клавиатуры определить
наибольшее целое k такое, что а >3k
Результат работы:
1. Файл Лаб6_2.doc с формой Рекуррентные соотношения
2. Файлы Лаб6_1.doc, Лаб6_3.doc с выполненными заданиями.
Вопросы для самоконтроля
1. Что такое рекурсия?
2. С помощью каких операторов проводиться расчет рекурсивных
соотношений?
3. Что такое вложенный цикл и как он реализуется?
4. Какие правила следует соблюдать при построении вложенных циклов?
43
Лабораторная работа № 7 Массивы. Работа с вектором
и матрицей.
Массив - это коллекция переменных, которые имеют
общие имя и базовый тип. Все элементы данных, сохраняемых в
массиве, должны иметь один и тот же тип. Информация,
сохраненная в массиве, может быть доступна в любом порядке.
Массив позволяет сохранять и манипулировать многими
элементами данных посредством единственной переменной.
Обработку массивов значительно упрощает использование циклов.
Самый простой вариант массива это одномерный массив, использующий
обыкновенный список данных. Например:
Вася, Петя, Коля, Миша, Ваня, Слава, Игорь, Юра
Это строковый массив, состоящий из 8 элементов. Дадим ему название
Name_Array. Нумерация элементов в массиве начинается с 0. Такая система
нумерации довольно распространена в программировании и называется
нумерацией с нулевой базой.
Для доступа к данным, хранящимся в определенном элементе массива,
следует указывать имя массива с последующим числом, называемым индексом
элемента. Индекс всегда заключается в круглые скобки. Например:
Name_Array(3) - этому элементу массива соответствует "Миша" (не забывайте,
что по умолчанию нумерация элементов массива начинается с 0).
Поскольку нумерация с нулевой базой не очень удобна (т.к. мы привыкли
считать с 1, а не с 0), то в VBA имеется директива компилятора, позволяющая
исправить это "неудобство": Option Base.
Директива компилятора имеет два варианта написания:
Option Base 0 - индексы массивов начинаются с 0 (установка по
умолчанию)
Option Base 1 - индексы массивов начинаются с 1
Данная директива компилятора помещается в область объявлений модуля
перед объявлениями любых переменных, констант или процедур. Нельзя
помещать Option Base внутри процедуры. Оператор Option Base может быть
только один и он влияет на все массивы, объявляемые в модуле.
Одномерные массивы хорошо подходят для представления простых
списков данных. Однако часто бывает необходимо представить таблицы
данных в программах с организацией данных в формате строк и столбцов,
подобно ячейкам в рабочих листах Excel. Для этого необходимо использовать
многомерные массивы. Так адрес каждой ячейки листа состоит из двух чисел,
одно из которых (номер строки) является первым индексом, а второе (номер
столбца) - вторым индексом массива. Такой массив называется двумерным
44
массивом. Добавив еще номер листа, получим трехмерный массив. VBA
позволяет создавать массивы, имеющие до 60 измерений.
Массивы, не меняющие число своих элементов, называются статическими
массивами. Примером такого массива может служить вышеприведенный
массив Name_Array, содержащий 8 элементов.
Однако бывают ситуации, когда изначально неизвестно количество
элементов в массиве, или же, в процессе работы это количество может
изменяться. Такие массивы называются динамическими массивами.
Динамический массив может увеличиваться или сжиматься, чтобы
вмещать точно необходимое число элементов без напрасного расходования
памяти.
Объявление массива, как и объявление переменной, осуществляется с
использованием оператора Dim:
Dim VarName([Subscripts]) [As Type]
VarName - любое имя массива, использующее допустимый идентификатор
имени;
Subscripts - измерение массива. Если размерность массива больше
единицы, то Subscripts разделяются запятыми.
Оператор Subscripts имеет следующий синтаксис:
[lower To] upper [,[lower To] upper].
Необязательный аргумент lower - определяет нижний диапазон
допустимых индексов для массива, а обязательный аргумент upper
определяет верхний предел для индексов массива.
Примеры правильного объявления массивов:
- одномерный статический строковый массив, включающий 10 элементов:
Dim Array_Str(1 To 10) As String ;
- динамический массив:
Dim Array_Var();
- двумерный статический массив целых чисел, включающий 6*8=48
элементов:
Dim Array_Mult(0 To 5,0 To 7) As Integer.
При объявлении массивов следует помнить, что включение оператора
Subscripts в объявлении массива создает статический массив с
фиксированным числом элементов, пропуск оператора Subscripts в
объявлении массива создает динамический массив. Установка директивы
компилятора Option Base влияет на общее число элементов в массиве.
При использовании динамических массивов может сложиться
обстоятельства, при которых точно неизвестно, сколько элементов потребуется
45
в массиве. В VBA имеется возможность при помощи оператора ReDim
переопределять размерность массива.
ReDim [Preserve] varname(subscripts) [As Type] [,
varname(subscripts) [As Type]]
varname - имя существующего массива;
subscripts - размерность существующего массива;
Type - любой тип VBA. Необходимо использовать отдельный оператор As
Type для каждого массива, который определяется;
Preserve - необязательный аргумент. Его использование приводит к
тому, что данные уже имеющиеся в массиве, сохраняются после изменения его
размерности.
Примеры правильного использования оператора ReDim:
Dim Array_Month() As String - одномерный строковый
динамический массив
ReDim Array_Month(29) - устанавливет размерность динамического
массива равную 29 элементам
ReDim Array_Month(1 To 30) - изменяет размер массива до 30
элементов
ReDim Preserve Array_Month(1 To 31) - изменяет размер
массива до 31 элемента, сохраняя содержимое
Задание 1
Организовать ввод и вывод одномерного массива состоящего из 10 чисел
и двумерного массива размером 3*5.
Анализ проекта
Ввод массива фиксированной длины можно осуществить как с
клавиатуры (используя функцию InputBox), так и с листа Ms Excel. Вывод
массива также можно осуществить как на экран, с помощью оператора
MsgBox, так и на лист Ms Excel. Для ввода проще всего использовать цикл
For с числом шагов, равным длине (количеству элементов) массива.
Порядок выполнения
1. Запустим MS Excel и перейдем в среду VBA нажав клавиши ALT+F11.
2. Откройте окно кода VBA, щелкнув кнопку View code
в окне
свойств Project (или выполните двойной щелчок мышкой на пункте
ThisDocument).
3. Перейдем в окно кода и введем текст процедуры, которая обеспечивает
ввод массива с клавиатуры.
46
Для одномерного массива:
Option Base 1 'индексы массивов начинаются с 1
Sub Vvod_1()
Dim Mas(10) As Integer 'одномерный массив 10 элем.
Dim i As Integer
For i = 1 To 10
Mas(i) = Val(InputBox("Введите " & i & "-й элемент
массива"))
Next
End Sub
Для двумерного массива:
Sub Vvod_2()
Dim Mas(3,5) As Integer 'двумерный массив 3 на 5.
Dim i As Integer
For i = 1 To 3
'цикл по строкам.
For j = 1 To 5
'цикл по столбцам.
Mas(i,j) = Val(InputBox("Введите элемент массива.
" & i & "-я строка "& j & "-й столбец."))
Next
Next
End Sub
4. Рассмотрим ввод массива с рабочего листа Ms Excel. Одномерный
массив расположен в диапазоне А1:А10, двумерный – А1:Е3. Ниже приведены
соответствующие фрагменты кода:
Для одномерного массива:
For i = 1 To 10
Mas(i) = Cells(i, 1)
'номер строки меняется в
цикле, столбец первый (А)
Next
Для двумерного массива:
For i = 1 To 3
'цикл по строкам.
For j = 1 To 5
'цикл по столбцам.
Mas(i,j) = Cells(i, j) 'номер строки и столбца
меняется в цикле
Next
Next
5. Аналогично рассмотрим вывод массива на экран и на рабочий лист Ms
Excel, например в диапазон С1:С10. Для этого необходимо заменить функции
ввода на функции вывода. Фрагменты процедур приведены ниже:
Для одномерного массива:
For i = 1 To 10
MsgBox (Str(Mas(i)))
Next
47
For i = 1 To 10
Cells(i, 3) = Mas(i)
'вывод массива в третий
столбец (С1:С10)
Next
Для двумерного массива:
For i = 1 To 3
'цикл по строкам.
For j = 1 To 5
'цикл по столбцам.
MsgBox (Str(Mas(i, j)))
Next
Next
For i = 1 To 3
For j = 1 To 5
Cells(i + 7, j) = Mas(i, j) 'вывод массива на 7
строчек ниже.
Next
Next
6. Запустите на выполнение любую процедуру щелкнув на кнопке Run
(или нажмите клавишу F5) и проверьте ее работоспособность.
7. Законспектируйте элементы кода VBA предназначенные для организации
ввода вывода массивов.
При организации ввода значений массивов с рабочего листа MS
Excel следует помнить, что перед запуском процедуры,
необходимо ввести числовые значения в соответствующие ячейки
рабочего листа. В противном случае массив будет заполнен
нулевыми значениями.
Задание 2
Найти максимальное значение, а также поменять местами первый
положительный и первый отрицательный элементы массива А состоящего из
10 целых чисел.
Анализ проекта
Алгоритм состоит из пяти частей: 1) ввод массива, 2) поиск
максимального значения, 3) поиск в первого положительного элемента, 4)
поиск первого отрицательного элемента, 5) обмен их значений. Для
демонстрации результата необходима еще одна часть - 6) вывод полученного
массива. Для наглядности будем вводить массив с листа Excel (например, из
диапазона А1:А10) и выводить результат на тот же лист (например, в
диапазон С1 :С10).
Для поиска максимального значения каждый элемент A(i) массива
сравнивается с уже полученным на предыдущих шагах максимумом. В
48
качестве начального значения можно взять любой из A(i), но удобнее А(1) циклическую проверку можно тогда начать со второго элемента, сократив
число шагов.
Поиск первого положительного элемента проведем, перебирая в цикле
значения А. Как только встретится A(k)>0, нужно запомнить его индекс
(номер k) и сразу выйти из этого цикла. Обратите внимание, что если
продолжить цикл, то мы в результате получим номер не первого, а
последнего положительного элемента массива.
Аналогично проводим поиск первого отрицательного элемента массива.
Пусть это будет A(j). Индекс j запоминаем.
Теперь осталось обменять значения А(к) и A(j), используя переменнуюпосредника. После завершения операций массив выводится на печать
Порядок выполнения
1. Запустить Ms Excel, перейтив в окно кода VBA и ввести следующий
текст процедуры:
Option Base 1 'индексы массивов начинаются с 1
Sub Obmen()
Dim i, j, k, rab, max As Integer
Dim A(10) As Integer
'вводим массив с листа Excel
For i = 1 To 10
A(i) = Cells(i, 1)
Next
'Находим максимальный элемент массива
max = A(1)
For i = 2 To 10
If A(i) > max Then max = A(i)
Next
'Находим первый положительный элемент
For i = 1 To 10
If A(i) > 0 Then
k = i
Exit For
End If
Next
'Находим первый отрицательный элемент
For i = 1 To 10
If A(i) < 0 Then
j = i
Exit For
End If
Next
49
'меняем значения местами
rab = A(k)
A(k) = A(j)
A(j) = rab
'вывод максимального значения в ячейку В(1)
Cells(1, 2) = "max=" & max
'Выводим массив на лист Excel в столбец С
For i = 1 To 10
Cells(i, 3) = A(i)
Next
End Sub
2. На рабочем листе в диапазон ячеек А1:А10 ввести исходные данные для
элементов массива.
3. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы.
4. Сохраните документ в файле Лаб7_1.xls в своей папке на жестком диске.
Задание 3
Создать форму для сортировки
произвольной длины по возрастанию.
одномерных
массивов
чисел
Анализ проекта
Сортировка – распределение элементов множества по группам в
соответствии с определенными правилами. Например, сортировка «по
возрастанию» - это сортировка элементов массива, в результате которой получается массив, каждый элемент которого, начиная со второго, не меньше
стоящего от него слева. Существует достаточно большое число методов
сортировки. Приведем два простейших из них.
Линейная сортировка. Пусть необходимо упорядочить массив по
возрастанию (убыванию) элементов. Алгоритм:
Просматриваем элементы, начиная с 1-го. Ищем
(максимальный). Меняем его местами с 1-м элементом.
минимальный
Просматриваем элементы, начиная со 2-го. Ищем минимальный
(максимальный). Меняем его местами со 2-м элементом.
И т. д. до предпоследнего элемента.
Сортировка методом «пузырька». Данный метод получил такое название
по аналогии с пузырьками воздуха в стакане воды. Более «легкие»
(максимальные или минимальные) элементы постепенно «всплывают». В
отличие от линейной сортировки, сравниваются только пары соседних
элементов, а не каждый элемент со всеми (поэтому такая сортировка
выполняется за меньшее число шагов и, следовательно, быстрее). Алгоритм:
50
Последовательно просматриваем пары соседних элементов массива А (т.е.
сравниваем первый элемент со вторым, второй с третьим и так далее).
Если для соседних элементов выполняется условие А(i-1)>А(i), то
значения меняются местами.
Выполнив один проход по массиву, получим новую последовательность
значений. Эта последовательность до конца не отсортирована, но
наибольший элемент находится на правой границе массива.
Выполняем новые проходы,
просматриваемых элементов на 1.
каждый
раз
сокращая
количество
Порядок выполнения
1. Находясь в среде Ms Word или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже. Обратите
внимание на то, что элемент управления для выбора метода сортировки
имеет название Frame и создается с помощью копки панели управления,
которая имеет вид
.
Свойство (Name)
1 — frmSort
1
2
4
5
6
2 — txtN
3
3 — cmdНачать
4 — optSort1, Value=True
5 — optSort2
6 — txtTo
7 — txtAfter
7
4. Перейдите в окно кода, дважды щелкнув кнопку Начать, и введите
следующий текст процедуры
Option Base 1 'индексы массивов начинаются с 1
Private Sub cmdНачать_Click()
Dim Mas() As Integer 'динамический массив
Dim i, j, n, vr As Integer
51
'ввод значений с клавиатуры
n = CInt(TxtN)
ReDim Mas(n) 'задаем длину массива
For i = 1 To n
Mas(i) = Val(InputBox("Введите " & i & "-й элемент
массива"))
Next
'вывод исходного массива
TxtTo = "" 'очистка поля вывода
For i = 1 To n
TxtTo = TxtTo & Mas(i) & " "
Next
If OptSort1 Then 'Линейная сортировка
For i = 1 To n - 1 'Двигаемся по массиву, сокращая
неотсортированную часть
For j = i + l To n 'Сравниваем по очереди i-й
элемент неотсортированной части массива со всеми, от
i+1-го до конца
If Mas(j) < Mas(i) Then 'если в неотсортированной
части массива нашли элемент, больший i-го, то меняем
их местами:
vr = Mas(i)
Mas(i) = Mas(j)
Mas(j) = vr
End If
Next
Next
Else 'Метод «пузырька»
For i = 2 To n
For j = n To i Step -1
If Mas(j - 1) > Mas(j) Then
'вытеснить элемент
справа, тогда пузырек всплывает влево
vr = Mas(j - 1)
Mas(j - 1) = Mas(j)
Mas(j) = vr
End If
Next
Next
End If
'вывод массива после сортировки
TxtAfter = "" 'очистка поля вывода
For i = 1 To n
TxtAfter = TxtAfter & Mas(i) & " "
Next
End Sub
52
5. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы
путем ввода различных массивов и выбора различных методов
сортировки.
6. Сохраните документ в файле Лаб7_2.doc в своей папке на жестком диске.
Задание 4
Дан массив A(n,m). Занести все отрицательные элементы массива в массив В и напечатать его. Ввод и вывод данных осуществлять при помощи
рабочего листа Excel.
Анализ проекта
Алгоритм задачи состоит из трех частей: ввести матрицу А; проверить
каждый ее элемент: если он отрицательный, поместить его в массив В; вывести
полученный массив В на печать. Первая и третья части - ввод и вывод данных
решаются стандартным способом ввода и вывода массивов. Вторую часть
рассмотрим подробнее. Анализ элементов A(i,j) матрицы А можно провести, как
обычно для матриц, с помощью вложенных циклов For, перечисляющих все
строки (i) и столбцы (j) матрицы. Если A(i,j) -отрицательный, нужно присвоить
очередному элементу массива В это значение. Поскольку заранее количество
отрицательных элементов в А неизвестно, то заранее неизвестна и точная длина
массива В. Очевидно только, что она не превысит n*m - количества элементов
исходной матрицы А. Ясно также, что счетчик элементов массива В никак не
зависит от очередных i и j. Отсюда следует главный вывод для решения задач
такого типа: для массива-приемника необходимо завести свой, независимый
счетчик элементов. Отведем для этого отдельную переменную. Пусть это будет
k. При записи отрицательного A(i,j) в В(k) счетчик k будет увеличиваться на
единицу, и по окончании всей работы значение k покажет истинную длину
массива В. Для примера в программе взята исходная матрица А размером n=4,
m=6.
Порядок выполнения
1. Запустить Ms Excel, перейти в окно кода VBA и ввести следующий текст
процедуры:
Option Base 1 'индексы массивов начинаются с 1
Sub Перенос()
Dim A(4, 6) As Integer
Dim B(24)
As Integer, k As Integer
For i = 1 To 4
For j = 1 To 6
A(i, j) = Cells(i, j) 'ввод элементов массива с
диапазона A1:F4
53
Next
Next
k = 0
'обнуление счетчика массива В
For i = 1 To 4
For j = 1 To 6
If A(i, j) < 0 Then
k = k + 1
B(k) = A(i, j)
End If
Next
Next
For i = 1 To k
Cells(9, i) = B(i) 'Вывод массива В в строку 9
Next
End Sub
2. На рабочем листе в диапазон ячеек А1:F4 ввести исходные данные для
элементов массива A(4,6).
3. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы.
4. Сохраните документ в файле Лаб7_3.xls в своей папке на жестком диске.
Задание 5
Дан массив A(8,8) элементов. Подсчитать число четных чисел в матрице
и подсчитать сумму элементов, стоящих на четных позициях строк и
столбцов матрицы
Анализ проекта
Алгоритм первой части задачи включает ввод матрицы, перебор ее
значений с проверкой на четность, подсчет суммы четных значений и вывод
результата.
Для программирования задачи возьмем переменную (например, k) в качестве счетчика четных чисел. Проверку на четность реализуем с помощью функции Mod.
Во второй части уже не важна четность элементов, важна четность позиций: элемент А(2,4), например, подходит, а элемент А(3,4) – нет. Чтобы попасть
на четную позицию, излишне использовать функцию Mod для счетчиков строк i
и столбцов j. Достаточно изменять шаг каждого цикла с приращением 2.
Порядок выполнения
1. Перейти в окно кода VBA и ввести следующий текст процедуры:
Option Base 1 'индексы массивов начинаются с 1
Sub matrixNumber()
54
Dim i, j, k, s, A(8, 8) As Integer
For i = 1 To 8 ' вводим матрицу с клавиатуры:
For j = 1 To 8
A(i, j) = Val(InputBox("Введите элемент массива. " &
i & "-я строка " & j & "-й столбец."))
Next
Next
k = 0
'обнуляем счетчик четных чисел
For i = 1 To 8 'начинаем перебор элементов матрицы:
For j = 1 To 8
If A(i, j) Mod 2 = 0 Then
'проверяем на четность
k = k + 1
'считаем четные значения
End If
Next
Next
MsgBox ("Кол-во четных чисел: " & k) 'печатаем
результат
s = 0
'обнуляем сумму чисел
For i = 2 To 7 Step 2
'начинаем перебор четных
For j = 2 To 7 Step 2
'элементов матрицы:
s = s + A(i, j)
'накапливаем сумму
Next
Next
MsgBox ("Сумма элементов на четных позициях: " & s)
End Sub
2. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы.
3. Сохраните документ в файле Лаб7_7.xls в своей папке на жестком диске.
Задание 6
Дан массив A(5,5) элементов. Подсчитать среднее значение элементов
матрицы, расположенных строго ниже главной диагонали матрицы
Анализ проекта
В задачах, связанных с диагоналями матриц, следует обращать внимание
на зависимость значений индекса j (счетчика столбцов) от i (счетчика строк).
Если обнаружена закономерность, то можно избавиться от множества лишних
операторов и сделать программу более внятной и компактной. Например, все
элементы главной диагонали имеют номера столбцов, совпадающие с номерами
строк, т.е. «типичный» представитель этой диагонали - элемент A(i,i). Причем,
для каждой строки этого куска матрицы, номера столбцов нужных элементов
изменяются от первого до пересекающегося с диагональю. На диагонали номер
55
столбца совпадает с номером строки, т.е. j = i. Поскольку диагональ по
условию не включена, то j изменяется не до i, а до i - 1.
Порядок выполнения
1. Перейти в окно кода VBA и ввести следующий текст процедуры:
Option Base 1 'индексы массивов начинаются с 1
Sub Matrix()
Dim A(5, 5) As Integer, S As Integer
Dim k As Integer, Avg As Single
For i = 1 To 5 ' вводим матрицу с клавиатуры:
For j = 1 To 5
A(i, j) = Val(InputBox("Введите элемент массива. " &
i & "-я строка " & j & "-й столбец."))
Next
Next
s = 0
k = 0
For i = 2 To 5 'номера строк берутся от 2 до конца
матрицы
For j = 1 To i - 1
'номера столбцов берутся
от 1 до диагонали
S = S + A(i, j)
k = k + 1
Next
Next
Avg = S / k
MsgBox ("Среднее значение элементов= " & Avg)
End Sub
2. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы.
3. Сохраните документ в файле Лаб7_5.xls в своей папке на жестком диске.
Задание для самостоятельной работы
1. Найти минимальный из элементов массива А(10), принадлежащий интервалу (2; 14).
2. Составить массив В из неположительных элементов массива А(15).
3. Посчитать количество нулевых элементов в матрице А(5х 5).
4. Перенести элементы, кратные трем, из массива А(5х 5) в массив В.
5. Обнулить элементы матрицы М(5х 5), лежащие ниже ее побочной диагонали, включая диагональные.
56
Результат работы:
1. Файл Лаб7_2.doc с формой Сортировака массивов
2. Файлы Лаб7_1.xls, Лаб7_3.xls, Лаб7_4.xls, Лаб7_5.xls с выполненными
заданиями.
Вопросы для самоконтроля
Что такое массив и для чего он создается?
Как организовать доступ к данным в массиве?
Что такое нумерация с нулевой базой и как ее можно изменить?
Что такое одномерный, двухмерный и трехмерный массивы. Чему равно
предельное количество измерений?
5. Чем отличаются статический и динамический массивы?
6. Приведите синтаксис описания статического и динамического массива в
программе.
7. Как переопределить размерность массива. Приведите синтаксическую
конструкцию.
1.
2.
3.
4.
57
Лабораторная работа № 8 Строки. Работа с данными
символьного типа.
Любые текстовые данные, сохраняемые в VBA,
называются строками. Для их хранения предназначен тип
данных String.
Строка может содержать текстовые символы любых типов:
буквы, цифры, знаки пунктуации, разделительные символы и
др. Строки всегда заключаются в двойные кавычки (” ”).
Существует две категории строк: строки переменной длины и строки
фиксированной длины. По умолчанию в VBA все строки принимаются
переменной длины.
Следует отметить, что тип данных String является очень важным типом,
т.к., как правило, информация, вводимая пользователем - это строковые
данные. Кроме того, поскольку на экране монитора отображается только текст,
то все другие типы данных должны быть преобразованы в строковые данные
перед выводом на экран.
Единственная операция, применяемая при работе со строками конкатенация.
Конкатенацию строк обычно используют для формирования строк из
различных источников в процедуре, чтобы создавать сообщение для вывода на
экран. В VBA для конкатенации строк применяется оператор &. Синтаксис:
Операнд_1 & Операнд_2 [& Операнд_3..]
Операнд_N - любое допустимое строковое или численное выражение
(которое автоматически преобразуется в строковое). Тип данных результата
конкатенации строк - String.
Несмотря на то, что операция единственная, встроенных функций для
работы достаточно много.
Функция Len – возвращает значение типа Long, содержащее число
символов в строке String.
Len(Строка)
Функция Lcase - возвращает значение типа String, представляющее
строку, преобразованную к нижнему регистру.
LCase(строка)
Обязательный аргумент строка представляет любое допустимое
строковое выражение. К нижнему регистру преобразуются только прописные
буквы; строчные буквы и прочие символы остаются неизмененными.
Функция Ucase - возвращает значение типа Variant (String),
содержащее строку, преобразованную к верхнему регистру.
UCase(строка)
Обязательный аргумент строка представляет любое допустимое
строковое выражение. К верхнему регистру преобразуются только строчные
буквы; прописные буквы и прочие символы остаются неизменными.
58
Для создания строк, содержащих повторяющиеся символы, применяют
функции Space и String. Функция
Space(число),
формирует строку, а обязательный аргумент число указывает нужное
число пробелов в строке. Ее удобно использовать для форматирования и
очистки данных в строках фиксированной длины.
Функция
String(number, character),
содержит аргументы number - Длина возвращаемой строки и character код символа или строковое выражение, первый символ которого используется
при создании возвращаемой строки.
Функция
Mid(string, start[, length]),
возвращает значение типа String, содержащее указанное число символов
строки.
Здесь string - строковое выражение, из которого извлекаются символы,
start - позиция символа в строке string, с которого начинается нужная
подстрока. Если start больше числа символов в строке string, функция
Mid возвращает пустую строку ("").
length - значение типа Variant (Long). Число возвращаемых
символов. Если этот аргумент опущен или превышает число символов,
расположенных справа от позиции start, то возвращаются все символы от
позиции start до конца строки.
Функция
InStr([start, ]string1, string2[, compare])
возвращает значение типа Long, указывающее позицию первого
вхождения одной строки внутри другой строки.
start - числовое выражение, задающее позицию, с которой начинается
каждый поиск. Если этот аргумент опущен, поиск начинается с первого
символа строки. string1 - Строковое выражение, в котором выполняется
поиск. string2 - Искомое строковое выражение. compare - Указывает
способ сравнения строк. Аргумент compare может быть опущен или иметь
значение 0 или 1. Чтобы выполнить двоичное сравнение, следует указать 0 (это
значение используется по умолчанию). Чтобы выполнить посимвольное
сравнение без учета регистра, следует указать 1.
Функция
Asc(строка)
возвращает значение типа Integer, представляющее код символа для
первого символа строки. Аргумент строка является любым допустимым
строковым выражением. Если строка не содержит символов, возникает
ошибка выполнения. Возвращаемые значения лежат в диапазоне 0 - 255.
Функция
Chr(кодСимвола)
59
возвращает значение типа String, содержащее символ, соответствующий
указанному коду символа. Обязательный аргумент кодСимвола является
значением типа Long, определяющим символ.
Коды 0-31 соответствуют стандартным управляющим символам ASCII.
Например, Chr(10) возвращает символ перевода строки. Обычным
диапазоном значений аргумента кодСимвола является интервал 0-255.
Задание 1
Подсчитать количество
произвольной строке.
символов,
не
являющихся
цифрами,
в
Анализ проекта
Решение поставленной задачи сводится к проверке каждого символа
строки с помощью функции Asc(строка), которая возвращает ASCII-код
начальной буквы строки. Если код лежит в интервале [49,57], то это цифра.
Порядок выполнения
1. Запустим MS Excel и перейдем в среду VBA нажав клавиши ALT+F11.
2. Откройте окно кода VBA, щелкнув кнопку View code
в окне
свойств Project (или выполните двойной щелчок мышкой на пункте
ThisDocument).
3. Перейдем в окно кода и введем следующий текст процедуры.
Sub количество_цифр()
Dim s As String
Dim i As Byte, n As Byte
s = InputBox ("Введите произвольную строку")
n = 0
For i = 1 To Len(s)
If Asc(Mid(s,i,1))>=49 And Asc(Mid(s,i,1))<=57 Then
n = n + 1
End If
Next
MsgBox (“Количество цифр в строке - ” & n)
End Sub
4. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5). Проанализировать работоспособность программы.
5. Сохраните документ в файле Лаб8_1.xls в своей папке на жестком диске.
60
Задание 2
Создать программу зашифровывающую, а затем расшифровывающую
предложение, записанное на русском языке. Использовать шифр простой
замены, в котором каждая буква русского алфавита заменяется другой
буквой этого же алфавита. При этом замена осуществляется по правилу:
первая буква заменяется последней, вторая - предпоследней и тд. Так, А
заменяется на Я, Б- на Ю, В -на Э и т. д.
Анализ проекта
Решение поставленной задачи сводится к замене букв исходного текста
(алфавит по порядку) буквами алфавита записанного в обратном порядке.
Буквы русского алфавита, записанные в алфавитном порядке за исключением
буквы Ё, буквы русского алфавита, выписанные в обратном порядке.
Шифруемое сообщение вводится пользователем.
Для решения поставленной задачи определяем количество символов
преобразуемой строки. Образуем новую строку по длине равную исходной
строке. Далее организуем цикл, в котором просматриваем все символы
преобразуемой строки, определяем позицию k этого символа в исходном
алфавите. Если в исходном алфавите символ не найден, то в данную позицию
новой строки заносим этот символ без изменений, в противном случае в
данную позицию новой строки заносим символ из нового алфавита, позиция
которого совпадает с позицией k исходного алфавита.
Порядок выполнения
1. Находясь в среде Ms Excel или другого приложения из Microsoft Office,
нажмите ALT+ F11, чтобы перейти в среду VBA.
2. На панели инструментов щелкните кнопку Insert UserForm
.
Появляется окно с формой UserForm1.
3. Создайте форму согласно эскизу, установив в окне свойств Properties
значение свойств (Name) и Caption которые приведены ниже.
4
2
3
Свойство (Name)
1 — frmShifr
2 — txtTo
3 — txtAfter
4 — cmdGo
61
4. Перейдите в окно кода, дважды щелкнув кнопку Начать, и введите
следующий текст процедуры
Private Sub CmdGo_Click()
Const АБВ As String =
"абвгдежзийклмнопрстуфхцчшщъыьэюя"
Const НовАБВ As String =
"яюэьыъщшчцхфутсрпонмлкйизжедгвба"
Dim STR As String
Dim STRS As String
Dim n, c As Long
STR = TxtTo
STR = LCase(STR)
'преобразуем все символы в
строчные
n = Len(STR)
'находим длину строки
STRS = Space(n)
'организуем строку пробелов
длины n
For i = 1 To n
tmp = Mid(STR, i, 1)
'пo одному символу
"отрываем" от строки STR
k = InStr(1, АБВ, tmp)
'находим позицию
вхождения символа
If k = 0 Then
Mid(STRS, i, 1) = tmp
Else
Mid(STRS, i, 1) = Mid(НовАБВ, k, 1) 'заменяем символ
End If
Next
TxtAfter = STRS
End Sub
5. Запустите программу на выполнение, щелкнув на кнопке Run
(или
нажмите клавишу F5).
6. Проанализировать работоспособность программы путем ввода любого
предложения на русском языке. После шифрования скопировать
полученный результат и вставить его в поле «Исходное предложение».
Запустить процесс шифрования и убедиться в правильности
расшифровки.
7. Сохраните документ в файле Лаб8_2.xls в своей папке на жестком диске.
Задание 3
Гласные буквы русского алфавита не изменяются. Первый десяток
согласных заменяется на второй десяток согласных (второй - на первый) по
следующей таблице:
Б
В Г
Д Ж 3
К Л М Н
62
Щ
Ш
Ч
Ц
X
Ф
Т
С
Р
П
Анализ проекта
Исходными данными задачи является строка произвольной длины. Кроме
этого, можно определить две строки-алфавита, состоящие из согласных букв
"бвгджзклмнщшчцхфтсрп" и "щшчцхфтсрпбвгджзклмн". Если в тексте
встречается буква из первой строки, то она заменяется на букву с таким же
номером из второй строки-алфавита. В целом программный код будет такой
же как и в предыдущей задаче.
Порядок выполнения
1. Ниже приведен програмный код для решения задачи. Расберитесь в
нем самостоятельно.
Sub Гласные()
Dim tmp As String, Alfl As String, Alf2 As String
Dim a As String, b As String
a = InputBox ("Введите исходную строку символов")
Alfl = "бвгджзклмнщшчцхфтсрп"
Alf2 = "щшчцхфтсрпбвгджзклмн"
n = Len(a)
b = Space(n)
For i = 1 To n
tmp = Mid(a,
i,
1)
k = InStr(1, Alfl, tmp)
If k = 0 Then
Mid(b,
i,
1)
= tmp
Else
Mid(b,
i,
1)
= Mid(Alf2,
k,
1)
End If
Next
MsgBox (“После шифрования:” & Chr(13) & b)
End Sub
Задание для самостоятельной работы
1. Для любого введенного предложения заменить слоги «ма» на слоги «ле».
2. Посчитать количество слов «студент» в предложении, вводимом с
клавиатуры. Разделителем слов считать пробелы и запятые.
3. Поменять местами первое и последнее слово в предложении, разделителем слов считать пробел.
4. Образовать по заданному слову слово-перевертыш, в котором все буквы
идут в обратном порядке.
63
Результат работы:
1. Файл Лаб8_2.xls с формой Шифрование
2. Файлы Лаб8_1.xls, Лаб8_2.xls с выполненными заданиями.
Вопросы для самоконтроля
1. Для чего предназначен тип String
2. Что такое конкатенация?
3. Какие встроенные функции для работы со строками существуют в VBA?
64
1/--страниц
Пожаловаться на содержимое документа