Государственное образовательное учреждение
высшего профессионального образования
ОСНОВЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ
VISUAL BASIC FOR APPLICATION (VBA)
Учебное пособие
Ростов-на-Дону
2008
УДК 681.3.06
Основы программирования в среде Visual basic for application (VBA): учеб. пособие; Рост. гос. ун-т путей сообщения. – Ростов н/Д, 2008. – 124 с.: ил.
Содержатся сведения об основных элементах управления языка программирования Visual Basic for Application, типах данных, реализации основных алгоритмических структур, примеры разработки программ и задания для самостоятельного решения.
Предназначено для студентов первых курсов, изучающих дисциплину «Информатика», раздел «Алгоритмизация и программирование».
Рецензенты:
1. Основные этапы решения задач на ЭВМ
Процесс решения задач на компьютере – это совместная деятельность человека и ЭВМ. На долю человека приходятся этапы, связанные с творческой деятельностью – постановкой, алгоритмизацией, программированием задач и анализом результатов, а на долю персонального компьютера – этапы обработки информации в соответствии с разработанным алгоритмом.
Первый этап– постановка задачи. На этом этапе участвует человек, хорошо представляющий предметную область задачи (биолог, экономист, инженер). Он должен чётко определить цель задачи, дать словесное описание содержания задачи и предложить общий подход к её решению.
Второй этап– выбор метода решения (математическое или информационное моделирование). Цель данного этапа – создать такую математическую модель решаемой задачи, которая могла быть реализована в компьютере. Существует целый ряд задач, где математическая постановка сводится к простому перечислению формул и логических условий.
Этот этап тесно связан с первым, и его можно отдельно не рассматривать. Однако возможно, что для полученной модели известны несколько методов решения, и необходимо выбрать лучший. Заметим, что появление средств визуального моделирования объектов позволяет в некоторых случаях освободить программиста от выполнения данного этапа.
Третий этап– алгоритмизация задачи. На основе математического описания необходимо разработать алгоритм решения.
Алгоритм– система точных и понятных предписаний о содержании и последовательности выполнения конечного числа действий, необходимых для решения любой задачи данного типа (класса).
Понятие алгоритма возникло и используется давно. Сам термин «алгоритм» ведёт начало от перевода на европейские языки имени арабского математика Аль-Хорезми (IX век). Им были описаны правила (в нашем понимании – алгоритмы) выполнения основных арифметических действий в десятичной системе счисления.
Задача составления алгоритма не имеет смысла, если не известны или не учитываются возможности его исполнителя (ребёнок может прочесть, но не может решить сложную задачу).
Исполнителем может быть не только человек, но и автомат. Компьютер – лишь частный, но наиболее впечатляющий пример исполнителя, чьё поведение основано на реализации алгоритма. Более того, создание персонального компьютера оказало воздействие на развитие теории алгоритмов, одной из областей дискретной математики.
Эффективный метод построения алгоритма – метод пошаговой детализации (последовательного построения). При этом сложная задача разбивается на ряд более простых. Для каждой подзадачи разрабатывается свой алгоритм. Универсальный эффективный метод построения алгоритма является основой структурного программирования (см. п. 6.16).
Если алгоритм разработан, то его можно вручить разным людям (пусть и не знакомым с сутью решаемой задачи), и они, следуя системе правил, будут действовать одинаково и получат (при безошибочных действиях) одинаковый результат.
Используются различные способы записи алгоритмов:
– словесный (запись рецептов в кулинарной книге, инструкции по использованию технических устройств…);
– графический – в виде блок-схемы;
– структурно-стилизованный (для записи используется язык псевдокода).
При составлении и записи алгоритма необходимо обеспечить, чтобы он обладал рядом свойств:
Однозначность алгоритма – единственность толкования исполнителем правил выполнения действий и порядка их выполнения. Чтобы алгоритм обладал этим свойством, он должен быть записан командами из системы команд исполнителя.
Конечность алгоритма – обязательность завершения каждого из действий, составляющих алгоритм, и завершимость алгоритма в целом.
Результативность алгоритма – предполагает, что выполнение алгоритма должно завершиться получением определённых результатов.
Массовость – возможность применения данного алгоритма для решения целого класса задач, отвечающих общей постановке задачи.
Правильность алгоритма – способность алгоритма давать правильные результаты решения поставленных задач.
Четвёртый этап– программирование. Программой называется план действий, подлежащих выполнению некоторым исполнителем, в качестве которого может выступать компьютер. Программа позволяет реализовать разработанный алгоритм.
Пятый этап– ввод программы и исходных данных в ЭВМ с клавиатуры с помощью редактора текстов. Для постоянного хранения осуществляется их запись на гибкий или жёсткий диск.
Шестой этап– тестирование и отладка программы. Исполнение алгоритма с помощью ЭВМ, поиск и исключение ошибок. При этом программисту приходится выполнять рутинную работу по проверке работы программы, поиску и исключению ошибок, и поэтому для сложных программ этот этап часто требует гораздо больше времени и сил, чем написание первоначального текста программы.
Отладка программы – сложный и нестандартный процесс, который заключается в том, чтобы протестировать программу на контрольных примерах.
Контрольные примеры стремятся выбрать так, чтобы при работе с ними программа прошла все основные пути алгоритма, поскольку на каждом из путей могут встретиться свои ошибки, а детализация плана зависит от того, как поведёт себя программа на этих примерах. На одном она может «зациклиться», на другом – дать бессмысленный результат.
Сложные программы отлаживают отдельными фрагментами.
Для повышения качества выполнения этого этапа используются специальные программы-отладчики, которые позволяют исполнить программу «по шагам» с наблюдением за изменением значений переменных, выражений и других объектов программы с отслеживанием выполнения операторов.
Седьмой этап– исполнение отлаженной программы и анализ результатов.На этом этапе программист запускает программу и задаёт исходные данные, требуемые по условию задачи.
Полученные результаты анализируются постановщиком задачи, и на основании этого анализа вырабатываются соответствующие решения, рекомендации, выводы.
Языки программирования
Чтобы компьютер выполнил решение какой-либо задачи, ему необходимо получить от человека инструкции, как её решать. Набор таких инструкций для компьютера, направленный на решение конкретной задачи, называется компьютерной программой.
Современные компьютеры не настолько совершенны, чтобы понимать программы, написанные на каком-либо употребляемом человеком языке.
Команды, предназначенные для ЭВМ, необходимо записывать в понятной компьютеру форме. С этой целью применяют языки программирования – искусственные языки, алфавит, словарный запас и структура которых удобны и понятны компьютеру.
В самом общем смысле языком программирования называется фиксированная система обозначений и правил для описания алгоритмов и структур данных.
Языки программирования должны быть понятны и человеку, и ЭВМ. Они делятся на языки низкого и высокого уровня.
Язык низкого уровня – средство записи программы простыми приказами – командами на аппаратном уровне. Такой язык отражает структуру данного класса ЭВМ, и поэтому иногда называется машинно-ориентированным языком. Пользуясь системой команд, понятной ПК, можно описать алгоритм любой сложности, но такая запись для сложных задач будет очень громоздкой и мало приспособленной для использования человеком.
Существенной особенностью языков низкого уровня является жесткая ориентация на определённый тип аппаратуры (систему команд процессора).
Чтобы приспособить язык программирования низкого уровня к человеку, был разработан язык символического кодирования – язык Ассемблер. Структура команд Ассемблера определяется форматами команд и данных машинного языка. Программа на Ассемблере ближе человеку, потому что операторы этого языка – те же коды, но они имеют мнемонические названия; используются не конкретные адреса, а их символьные имена.
Многочисленную группу составляют языки программирования высокого уровня. Средства таких языков допускают описание задачи в наглядном, легко воспринимаемом виде. Отличительной особенностью этих языков является ориентация не на систему команд той или иной ЭВМ, а на систему операторов, характерных для записи определённого класса алгоритмов.
К языкам программирования этого типа относятся Бейсик, Фортран, Паскаль, Си и другие. Программа на языках высокого уровня записывается системой обозначений, понятной человеку (например, фиксированным набором слов английского языка).
Все вышеперечисленные языки – вычислительные. Более молодые – декларативные (непроцедурные) языки. Отличительная черта их – задание связей и отношений между объектами и величинами и отсутствие определенной последовательности действий (один из первых – Пролог, затем C++, Delphi, Visual Basic). Эти языки дали толчок к разработке специальных языков искусственного интеллекта и языков представления знаний.
Трансляторы
Текст программы, записанный, например, на Паскале, не может быть воспринят ЭВМ непосредственно, требуется перевести его на машинный язык.
Перевод программы с языка программирования на язык машинных кодов называется трансляцией (translation – перевод), а выполняется специальными программами – трансляторами. Существует три вида трансляторов: интерпретаторы, компиляторы, ассемблеры.
Интерпретаторомназывается транслятор, производящий покомандную обработку и выполнение исходной программы.
Компилятор преобразует (транслирует) всю программу в модуль на машинном языке, после этого программа записывается в память ПК и лишь потом выполняется.
Ассемблеры переводят программу, записанную на языке автокода, в программу на машинном языке.
Любой транслятор решает следующие основные задачи:
– анализирует транслируемую программу, в частности, проверяет, содержит ли она синтаксические ошибки;
– генерирует выходную программу (её часто называют объектной или рабочей) на языке команд ЭВМ;
– распределяет память выходной программы, в простейшем случае назначает каждому фрагменту программы: переменным, константам и другим объектам свои адреса в памяти.
2. Элементы управления и пользовательская форма VBA
2.1 Элементы управления
VВА обладает встроенным набором элементов управления. Используя этот набор и редактор форм не трудно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. В данной главе дан обзор встроенных элементов управления VBA. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели инструментов Элементы управления (Control Toolbox). На этой панели представлены кнопки, позволяющие конструировать элементы управления, а также кнопки вызова окна свойств, перехода в режим конструктора и редактор кода.--PAGE_BREAK--
/>
Рисунок 5.3 Панель инструментов Элементы управления
Создание элементов управления на рабочем листе или в форме, как правило, происходит на начальном этапе конструирования приложения. Иногда используется программное их создание в процессе работы приложения. Но этот подход применяется реже. Большинство элементов управления можно располагать как на рабочем листе, так и в форме. Но существуют такие элементы управления, как RefEdit, Набор страниц и Набор вкладок, которые можно располагать только в форме. Ниже приведен список основных элементов управления и соответствующих кнопок панели инструментов Элементы управления (Control Toolbox).
Элемент управления
Имя
Кнопка для создания элемента
Поле
TextBox
/>
Надпись
Label
/>
Кнопка
CommandButton
/>
Список
ListBox
/>
Поле со списком
ComboBox
/>
Полоса прокрутки
ScrollBar
/>
Счетчик
SpinButton
/>
Переключатель
OptionButton
/>
Флажок
CheckBox
/>
Выключатель
ToggleButton
/>
Рамка
Frame
/>
Рисунок
Image
/>
RefEdit
RefEdit
/>
Набор страниц
MultiPage
/>
Для размещения элемента управления на листе или в форме нажмите соответствующую кнопку панели инструментов Элементы управления (Control Toolbox) и с помощью мыши перетащите рамку элемента управления в нужное место. После этого элемент управления можно перемещать, изменять его размеры, копировать в буфер обмена и вставлять из буфера обмена. Для разработки простейших программ удобно использовать пиктограммы (рис. 2.2).
/>
Рисунок 5.3
2.2 Режим конструктора
Для удобства работы с элементами управления в период их конструирования в Excel введен режим конструктора, который активизируется нажатием кнопки Режим конструктора (Design Mode) панели инструментов Элементы управления (Control Toolbox). В режиме конструктора отключена реакция элемента управления на события. Поэтому при включенном режиме конструктора можно видоизменять элемент управления и задавать его свойства. На рис. 2.3 показано создание элемента управления CommandButton (кнопка) на рабочем листе. После того как пользователь решит, что созданный элемент управления имеет тот вид, который ему нужен, и все требуемые свойства элемента управления установлены, он должен отключить режим конструктора повторным нажатием кнопки Режим конструктора (Design Mode).
/>
Рисунок 5.3Создание элемента управления CommandButton на рабочем листе в режиме конструктора
2.3 Установка свойств элемента управления
Для установки свойств элемента управления вручную при его конструировании необходимо выделить элемент управления и нажать кнопку Свойства(Properties) панели инструментов Элементы управления (Control Toolbox). На экране отобразится диалоговое окно Свойства (Properties)(рис. 2.4). Оно аналогично окну Свойства (Properties) редактора Visual Basic. Вручную при помощи этого окна обычно устанавливается свойство Caption, возвращающее отображаемый текст элемента управления. На рисунке 2.4 значение свойства Сaption элемента управления CommandButton изменено с установленного по умолчанию (CornmandButton1) на текст Нажми меня. Кроме того, внесены изменения в параметры свойства Font, устанавливающее шрифт выводимого на поверхности кнопки текста, а именно, увеличен размер шрифта с 8 до 12, шрифт MS Sans Serif заменен на Courier New и изменено начертание букв с обычного на полужирное. Также свойство Shadow установлено равным True, вместо False, как это имеет место по умолчанию. Свойство Shadow устанавливает, отображается ли элемент управления с тенью или без нее.
/>
Рисунок 5.3Диалоговое окно Свойстваи элемент управления CommandButton с измененными свойствами Caption, Font и Shadow
2.4 Редактор кода
После установки свойств элемента управления или формы переходят к написанию кода, связанного с ними. Особое место в этом коде занимают процедуры обработки событий. У каждого элемента управления есть целый набор событий, обрабатывающих те или иные действия. Приведем некоторые из них:
Click
Щелчок
DblClick
Двойной щелчок
GotFocus
Кнопка в фокусе
LostFocus
С кнопки снят фокус
Код обработки события записывается на листе модуля. Для активизации модуля в том месте, где надо ввести код по обработке события, связанного с выделенным элементом управления, или отредактировать уже написанный код достаточно нажать кнопку Исходный текст (View Code) панели инструментов Элементы управления (Control Toolbox).
Нажатие на кнопку Исходный текст (View Code) активизирует модуль с именем лист1, т. е. модуль, относящийся к рабочему листу, на котором создана кнопка (рис. 2.5). Вся рабочая книга, а также каждый рабочий лист, диаграмма или форма имеют связанные с ними модули кода. Кроме того, можно создать модули кода для макросов и модули класса.
/>
Рисунок 5.3Модуль кода и окно Проект
В левой верхней части модуля кода находится раскрывающийся список с именами объектов, для которых в данном модуле создаются процедуры обработки событий. В этом списке также представлен раздел модуля Общая часть (General), где описываются переменные и константы уровня модуля.
В правой верхней части модуля кода находится раскрывающийся список с именами событий, связанных с данным объектом.
Составим процедуру обработки события Click так, чтобы нажатие на кнопку отображало на экране диалоговое окно, уведомляющее пользователя о случившемся действии (нажатии кнопки).
Private Sub Conimancffluttonl_Click()
MsgBox "Тынажалнаменя"
End Sub
2.5 Пользовательская форма UserForm
Пользовательская форма UserForm предоставляет пользователю возможность создавать диалоговые окна разрабатываемых приложений. Она служит базой пользовательского диалогового окна, на которой в зависимости от решаемой задачи размещают требуемые элементы управления. продолжение
--PAGE_BREAK--
Семейство UserForms является семейством, компоненты которого представляют все загруженные формы UserForm в приложении. Как и все семейства, UserForms имеет свойства Count (возвращает число компонентов в семействе) и Item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент).
Приведем основные свойства, методы и события пользовательской формы.
Наиболее часто используемые свойства объекта UserForm
Name
Возвращает имя пользовательской формы
Caption
Возвращает текст, отображаемый в строке заголовка формы
BackColor
Возвращает цвет фона формы
BorderStyle
Устанавливает тип границы
Picture
Указывает рисунок, отображаемый как фон формы
Left И Top
Возвращают местоположение верхнего левого угла формы в пунктах
Height и Width
Возвращают высоту и ширину формы в пунктах
StartUpPosition
Возвращает значение, определяющее положение формы при ее первом отображении на экране. Допустимые значения:
– Manual (начальное значение не устанавливается),
– СenterOwner (выравнивание по центру объекта, к которому принадлежит форма),
– CenterScreen (выравнивание по центру экрана),
– Windows Default (положение верхнего левого угла экрана)
Наиболее часто используемые методы объекта UserForm
Show
Отображает форму на экране
Hide
Закрывает форму
Move
Изменяет положение и размер формы
PrintForm
Печатает изображение формы
Основные события объекта UserForm.
Initilize
Происходит при отображении формы на экране
Terminate
Происходит при закрытии формы
2.5.1 Семейство Controls
Доступ к семейству всех элементов управления, расположенных в пользовательской форме UserForm, осуществляется с помощью семейства Controls. Например, чтобы скрыть все элементы управления формы UserForm, можно использовать код, в котором свойству Visible элемента управления, определяющему, отображается ли этот элемент на экране или нет, устанавливается значение False:
For Each Элементin UserFormI.Controls
Элемент.Visible = False
Next Control
2.5.2 Создание пользовательской формы
Обсудим процесс создания пользовательской формы на примере конструирования простейшего диалогового окна.
Шаг 1 Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic) для того, чтобы перейти в редактор Visual Basic.
Шаг 2 Выберите команду Вставить User Form (Insert UserForm). В редакторе Visual Basic появятся: – Окно с пользовательской формой; – Панель инструментов Панель элементов (Toolbox) (рис. 2.6).
Шаг З Используя диалоговое окно Свойства (Properties), отображаемое нажатием кнопки и Панель элементов (Toolbox), создайте из пользовательской формы диалоговое окно, показанное на рисунке 2.7. Это окно состоит из трех кнопок и одного поля. Свойство Caption пользовательской формы определите равным Песнь о воробушке и бабочке, а кнопок – равными Первый акт, Второй акт и Третий акт.
Шаг 4 Для того чтобы написать процедуру обработки события нажатия кнопки Первый акт, дважды щелкните ее. Активизируется модуль UserForm1, в который введите процедуру: Private Sub CommandButton1_Click () TextBox1.Text = «Воробышек за бабочкой прыг-прыг-прыг» End Sub
/>
Рисунок 5.3Окно редактора Visual Basic с пользовательской формой и панелью элементов
Для обработки событий нажатий кнопок Второй акт и Третий акт в модуле UserForm1 введите следующие две процедуры:
Private Sub ConmmandButton2_Click ()
TextBoxl.Text = «Воробышек за бабочкой скок-скок-скок»
End Sub
Private Sub CommandButton3 Click()
TextBoxl.Text = "Воробышекбабочкуням-ням-ням"
End Sub
Шаг 5 Процесс создания диалогового окна и процедур, связанньк с ним, завершен. Для того чтобы проверить, как работает созданная программа, нажмите кнопку Запуск подпрограммы/UserForm (Run). На экране на фоне рабочего листа отобразится диалоговое окно Песнь о воробушке и бабочке. Для проверки функционирования кнопок нажмите, например, кнопку Первый акт. В поле выведется сообщение Воробышек за бабочкой прыг-прыг-прыг (рис. 2.7). Для закрытия диалогового окна Песнь о воробушке и бабочке нажмите системную кнопку, расположенную в верхней правой части строки заголовка диалогового окна.
/>
Рисунок 5.3 Редактор Visual Basic с преобразованной пользовательской формой для создаваемого приложения
2.6 Общие свойства элементов управления
Приведем основные общие свойства элементов управления.
Name
Имя элемента управления
Caption
Надпись, отображаемая при элементе управления
AutoSize
Допустимые значения: True (устанавливает режим автоматического изменения размеров элемента управления так, чтобы на нем полностью помещался текст, присвоенный свойству Caption) и False (в противном случае)
Visible
Допустимые значения: True (элемент управления отображается во время выполнения программы) и False (в противном случае)
Enabled
Допустимые значения: True (пользователь вручную может управлять элементом управления) и False (в противном случае)
Height и Width
Устанавливают геометрические размеры объекта (высоту и ширину)
Left и Top
Устанавливают координаты верхнего левого угла элемента управления, определяющие его местоположение в форме
ControlTipText
Устанавливает текст в окне всплывающей подсказки, связанной с элементом управления. В следующем примере элементу управления CommandButton1 назначен текст всплывающей подсказки это кнопка:
CommandButton1.ControlTipText = «Это кнопка»
BackColor, ForeColor и BorderColor
Устанавливают цвет заднего и переднего плана элемента управления, также его границы
BackStyle
Устанавливает тип заднего фона
BorderStyle
Устанавливает тип границы. Допустимые значения:
— fmBorderStyleSingle(граница в виде контура)
— fmBorderStyleNone(граница невидима)
SpecialEffect
Устанавливает тип границы. Отличается от свойства BorderStyle тем, что позволяет установить несколько типов, но одного цвета. BorderStyle позволяет установить только один тип, но различных цветов
Picture
(создание картинки)
Внедряет картинку на элемент управления. Например, на поверхности кнопки картинка отображается с помощью следующей инструкции:
CommandButtonI.Picture = _
LoadPicture("с:\my doc\Kpyг.bmp")
Функция LoadPicture(ПолноеИмяФайла) считывает графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла
Picture
(удаление картинки)
После того как картинка создана на элементе управления, иногда возникает необходимость ее удалить. Это легко достигается присвоением свойству picture значения LoadPicture("") продолжение
--PAGE_BREAK----PAGE_BREAK----PAGE_BREAK--
fmScrollBarsBoth (выводить горизонтальную и вертикальную полосы прокрутки) --PAGE_BREAK--
Remove Item (index)
index — номер, удаляемого из списка элемента
Add Item
Добавляет элемент в список. Синтаксис:
Addltem ( [ item [, varIndex]])
-item — элемент (строковое выражение), добавляемый в список
-varlndex — номер добавляемого элемента
Заполнение списка
Заполнить список можно одним из следующих способов
Поэлементно, если список состоит из одной колонки(рис. 2.12)
With ListBox1
.AddItem “Июнь”
.AddItem “Июль”
.AddItem “Август”
.ListIndex = 0
End With
/>
Рисунок 5.3 Список с одной колонкой элементов
Массивом, если список состоит из одной колонки
With ListBoxl
.List = Array("Июнь","Июль","Август")
.Listlndex = 1
End With
Из диапазона a1: B4, в который предварительно введены элементы списка. Результат выбора (индекс выбранной строки) выводится в ячейку
С1
With ListBoxl
.ColumnCount = 2
.RowSource = «A1:B4»
.ControlSource = "С1"
.BoundColumn = 0
End With
Поэлементно, если список состоит из нескольких колонок, например двух
With ListBoxl
.ColumnCount = 2
.Addltem "Июнь"
.ListfO, 1) = "Сессия"
.Addltem "Июль"
.Listfl, 1) = "Каникулы"
.Addltem "Август"
.List (2, 1) = "Каникулы"
End With
Массивом, если список состоит из нескольких колонок, например двух
Dim A (2, 1) As String
A(0, 0) = "Июнь"
A(0, 1) = «Сессия»
A(1, 0) = «Июль»
А(1, 1) = «Каникулы»
A(2, 0) = "Август"
A(2, 1) = "Каникулы"
With ListBox1
.ColumnCount = 2
.List = A End With
Выбор нескольких элементов из списка
Свойство Multiselect позволяет устанавливать режим, при котором допустим выбор нескольких элементов из списка. Свойство Selected предоставляет возможность проверить, выбран ли элемент с указанным индексом. На рис. 2.13 показан выбор нескольких элементов из списка. Приведём пример использования этих свойств при вычислении среднего значения выбранных в списке элементов.
/>
Рисунок 5.3 Выбор нескольких элементов из списка
With ListBox1
.List = Array(1, 3, 4, 5, 6, 7, 8, 9)
.Listlndex = 0
.MultiSelect = fmMultiSelectMuIti
Среднее= 0
n = 0
For i = 0 То.ListCount – 1
If .Selected(i) = True Then
n = n + l
Среднее= Среднее+ .List(i)
End If
Next I
End With
Среднее = Среднее / n
2.8.6 Поле со списком
Элемент управления СоmbоВох (поле со списком) создается с помощью кнопки Поле со списком (ComboBox) (рис. 2.14). Элемент управления ComboBox применяется для хранения списка значений. Он сочетает в себе функциональные возможности списка ListBox и поля TextBox. В отличие от ListBox, в элементе управления СomboВох, отображается только один элемент списка. Кроме того, у него отсутствует режим выделения нескольких элементов списка, но он позволяет вводить значение, используя поле ввода, как это делает элемент управления TextBox.
Свойства объекта СomboВох, такие как Listlndex, ListCount, Enabled, List и методы Clear, RemoveItem и AddItem аналогичны соответствующим свойствам и методам списка ListBox. Кроме того, у него есть ряд уникальных свойств.
/>
Рисунок 5.3 Поле со списком в форме
Приведем наиболее употребляемые из уникальных свойств элемента управления СоmbоВох.
DropButtonStyle
Устанавливает вид раскрывающегося списка. Допустимые значения:
– FmDropButtonStylePlain(кнопка без символов);
– FmDropButtonStyleArrowDisplays (кнопка со стрелкой);
– FmDropButtonStyleEllipsis (кнопка с эллипсом);
– FmDropButtonStyleReduce (кнопка с линией)
ListRows
Устанавливает число элементов, отображаемых в раскрывающемся списке
MatchRequired
Допустимые значения: True (в поле ввода раскрывающегося списка нельзя ввести значения, отличные от перечисленных в списке, т. е. в поле со спискам отключается функция поля ввода) и False (в противном случае)
MatchFound
Допустимые значения: True (среди элементов раскрывающегося списка имеется элемент, совпадающий с вводимым в поле ввода раскрывающегося списка) и False (в противном случае)
2.8.7 Полоса прокрутки и счетчик
Элемент управления ScrollBar (полоса прокрутки) создается с помощью кнопки Полоса прокрутки (ScrollBar) (рис. 2.15).
/>
Рисунок 5.3 Полоса прокрутки и счетчик в форме
Приведем наиболее часто используемые свойства элемента управления ScrollBar.
Value
Возвращает текущее значение полосы прокрутки (только целые неотрицательные числа)
Min
Минимальное значение полосы прокрутки (только целые неотрицательные числа)
Max
Максимальное значение полосы прокрутки (только целые неотрицательные числа)
SrnallChange
Устанавливает шаг изменения значения при щелчке по одной из стрелок полосы прокрутки
Enabled
Допустимые значения: True (пользователь может изменить значение полосы прокрутки) и False (в противном случае)
Visible
Допустимые значения: True (полоса прокрутки отображается во время выполнения программы) и False (в противном случае)
Элемент управления SpinButton (счетчик) создается с помощью кнопки Счетчик (SpinButton) (рис. 2.15). Элемент управления SpinButton по своим функциональным возможностям аналогичен полосе прокрутки. Если не быть чрезмерным буквоедом, то можно сказать, что счетчик – это полоса прокрутки без ползунка. Счетчик имеет те же свойства Value, Min, Mах, Enabled, Visible и SmallChange, что и полоса прокрутки.
2.8.8 Переключатель
Элемент управления OptionButton (переключатель) создается с помощью кнопки Переключатель (OptionButton) (рис. 2.16). Он позволяет выбрать, один из нескольких взаимоисключающих параметров или действий. Переключатели обычно отображаются группами, обеспечивая возможность выбора альтернативного варианта.
/>
Рисунок 5.3 Переключатель в форме.
Приведем наиболее часто используемые свойства элемента управления OptionButton. продолжение
--PAGE_BREAK--
Value
Возвращает True, если переключатель выбран и False в противном случае
Enabled
Допустимые значения: True (пользователь может выбрать переключатель) и False (в противном случае)
Visible
Допустимые значения: True (переключатель отображается во время выполнения программы) и False (в противном случае)
Capture
...................................................
Надпись, отображаемая рядом с переключателем
Рассмотрим способ использования переключателей на примере классической игры «Орел и Решка». Выбирая один из двух переключателей, игрок загадывает один из вариантов: орел (1 для компьютера) или решка (0 для компьютера). Не зная о выборе игрока, компьютер синтезирует с равной вероятностью либо 0, либо 1, что моделирует бросание монеты. Если игрок угадал правильную сторону монеты, подброшенную компьютером, то он выигрывает. В противном случае выигрывает компьютер. Компьютер информирует игрока о результате игры. На рис. 2.17 приведено диалоговое окно, отображаемое на экране в случае проигрыша игрока.
/>
Рисунок 5.3 Диалоговое окно, отображаемое на экране при проигрыше игрока
Для создания приложения, моделирующего игру «Орел и Решка», с помощью пользовательской формы UserForm1 создадим диалоговое окно, показанное на рис. 2.18, а в модуле UserForm1 введем следующую процедуру, синтезирующую отклик на нажатие кнопки Бросание монеты.
/>
Рисунок 5.3 Диалоговое окно игры Орел-Решка
Private Sub CommandButtonl_Click()
' Генерация с равной вероятностью либо 0 (решка), либо 1 (орел),
' т. е. моделирование бросания монеты
Randomize
Монета = Int(2 * Rnd)
' Сравнение результата бросания монеты компьютером
' с ситуацией, если игрок загадал «Орел»
If OptionButtonl.Value = True Then
If Монета= 0 Then MsgBox «He везет. Займись-ка лучше изучением VBA»
If Монета = 1 Then MsgBox «Везунчик. Поздравляю, ты выиграл.»
End If
' Сравнение результата бросания монеты компьютером
' с ситуацией, если игрок загадал «Решка»
If OptionButton2.Value = True Then
If Монета= 1 Then MsgBox «He везет. Займись-ка лучше изучением VBA»
If Монета = 0 Then MsgBox «Везунчик. Поздравляю, ты выиграл»
End If
End Sub
2.8.9 Рамка
Элемент управления Frame (рамка) создается с помощью кнопки Рамка (Frame) (рис. 2.19). Он используется для визуальной группировки элементов управления. Основным свойством рамки является Capture, отображающее надпись рамки.
2.8.10 Флажок и выключатель
Элемент управления СheckBox (флажок) создается с помощью кнопки Флажок (Checkbox) (рис. 2.20). Этот элемент управления предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное, но может настраиваться на выбор из трех альтернатив. Флажок имеет те же свойства Value, Enabled, Visible и Capture, что и переключатель. Кроме того, флажок обладает уникальным свойством TripleState, позволяющим производить выбор из трех альтернатив. Свойство TripieState может принимать два значения: False (выбор из двух альтернатив True и False) и True (выбор из трех альтернатив True, False и Null).
/>
Рисунок 5.3 Рамка в форме
/>
Рисунок 5.3 Флажок и выключатель в форме
Элемент управления ToggleButton (выключатель) создается с помощью кнопки Выключатель (ToggleButton) (рис. 2.20). Этот элемент управления предоставляет пользователю те же возможности, что и флажок.
На рисунке 2.21 дан пример, показывающий, как визуально отличаются друг от друга три допустимых состояния выключателя и флажка. Программно этот пример реализуется при помощи следующей процедуры.
Private Sub UserForm_Initialize()
ToggleButtonl.Value = True ToggleButton2.Value = False ToggleButton3.TripleState = True
ToggleButton3.Value = Null
CheckBoxl.Value = True CheckBox2.Value = False CheckBox3.TripleState = True CheckBox3.Value = Null
End Sub
/>
Рисунок 5.3 Три допустимых состояния выключателя и флажка
2.8.11 Рисунок
Элемент управления Image (рисунок) создается с помощью кнопки Рисунок (Image). Он используется для отображения графических файлов в формате bmp, cur, gif, ico, jpg и wmf. Перечислим некоторые из его свойств, используемых для управления выводом изображения.
AutoSize
Допустимые значения: True (рисунок автоматически изменяет размер для того, чтобы отобразить изображение целиком) и False (в противном случае).
Picture
Задает отображаемый графический файл. Используется с функцией LoadPicture.
Синтаксис:
Picture = LoadPicture(ПолноеИмяФайла)
– ПолноеИмяФайла – полное имя отображаемого графического файла
PictureSizeMode
Устанавливает масштабирование рисунка. Допустимые значения:
– fmPictureSizeModeClip (не помещающиеся в границах объекта части рисунка обрезаются);
– fmPictureSizeModeStretch (рисунок масштабируется так, чтобы он занимал всю поверхность объекта);
– fmPictureSizeModeZoom (рисунок масштабируется с cохранением относительных размеров так, чтобы он помещался целиком внутри объекта)
PictureAlignment
Устанавливает расположение рисунка внутри объекта. Допустимые значения:
– fmPictureAlignmentTopLeft (в верхнем левом углу);
– fmPictureAlignmentTopRight (в верхнем правом углу);
– fmPictureAlignmentCenter (в центре);
– fmPictureAlignmentBottomLeft (в нижнем левом углу);
– fmPictureAlignmentBottomRight (в нижнем правом углу)
PictureTiling
Допустимые значения: True (объект покрывается мозаикой из рисунка) и False (в противном случае)
Приведем пример размещения рисунка в объекте (рис. 2.22). Во всех четырех случаях рисунок выравнивается по верхнему левому краю объекта. В первом случае изображение пропорционально масштабируется так, чтобы целиком заполнить область объекта. Во втором случае масштабирование непропорциональное, в третьем рисунок размещается произвольно, в четвертом область объекта покрывается мозаикой из рисунков.
Private Sub UserForm_Initialize()
With Image1
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureSizeMode = fmPictureSizeModeZoom
.Picture = LoadPicture(«c:\Face.bmp»)
End With
With Image2
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureSizeMode = fmPictureSizeModeStretch
.Picture = LoadPicture("с:\Face.bmp")
End With
With Image2
.PictureAlignment = fmPictureAlignmentTopLeft .PictureSizeMode = fmPictureSizeModeStretch
Picture = LoadPicture(«c:\Face.bmp»)
End With
With Image3
.PictureAlignment = fmPictureAlignmentTopLeft .PictureSizeMode = fmPictureSizeModeClip
.Picture = LoadPicture(«c:\Face.bmp»)
End With
With Image4
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureTiling = True
.Picture = LoadPicture(«c:\Face.bmp»)
End With
End Sub
/>
Рисунок 5.3 Четыре примера размещения рисунка
2.8.12 Ссылки на ячейки и диапазоны
Элемент управления RefEdit (редактирование ссылок) создается с помощью кнопки RefEdit (рис. 2.23). Элемент управления RefEdit обычно используется для ввода ссылок на ячейки или диапазоны. Основным свойством элемента управления RefEdit является Text, возвращающее строку, введенную в поле ввода этого элемента управления.
/>
Рисунок 5.3 Элемент управления RefEdit в форме
2.8.13 Набор страниц продолжение
--PAGE_BREAK--
Элемент управления MultiPage (набор страниц) создается с помощью кнопки Набор страниц (MultiPage) (рис. 2.24). Этот элемент управления реализует многостраничные диалоговые окна. Заголовки страниц отображаются на вкладках. Переход от страницы к странице осуществляется выбором вкладки посредством щелчка кнопкой мыши.
/>
Рисунок 5.3 Набор страниц в форме
Создать, переименовать, удалить или переместить страницу элемента управления MultiPage можно вручную, выбрав ярлык соответствующего листа и вызвав щелчком правой кнопки мыши контекстное меню. Используя это контекстное меню, можно произвести одно из перечисленных действий.
Объект MultiPage содержит в себе семейство Pages, являющееся набором всех страниц, входящих в этот объект.
Перечислим свойства объекта MultiPage.
Value и
BoundValue
Возвращают номер активной страницы. Нумерация производится с нуля
MultiRow
Допустимые значения: True (если ярлыки не помещаются в одну строку, то они выводятся в несколько строк) и False (если ярлыки не помещаются в одну строку, то появляется полоса прокрутки, позволяющая переходить от страницы к странице)
Selectedltem
Возвращает выбранную страницу
Семейство Pages, содержащее все страницы, входящие в объект MultiPage, имеет единственное свойство Count, возвращающее число элементов семейства. Кроме того, у семейства Pages имеются следующие методы.
Add
Создаетновуюстраницу. Синтаксис:
Set Object = object.Add( [ Name [, Caption [, index]]])
object – семейство Pages
Name – имя страницы
Сaption – текст, отображаемый на ярлыке страницы
index – номер страницы, нумерация страниц производится с 0
Clear
Удаляет все страницы из семейства Pages
Remove
Удаляет страницу из семейства Pages
Item
Возвращает страницу со специфицированным индексом.
Синтаксис: Set Object = object.Item(collectionindex)
2.8.14 Набор вкладок
Элемент управления TabStrip (набор вкладок) создается с помощью кнопки Набор вкладок (TabStrip) (рис. 2.25). Он позволяет создать несколько вкладок в диалоговом окне. Объект TabStrip содержит в себе семейство Tabs, представляющее собой набор всех вкладок. Объект TabStrip и семейство Tabs обладают теми же свойствами и методами, что и объект MultiPage и семейство Pages.
/>
Рисунок 5.3 Набор страниц в форме
2.9 Последовательность выбора элементов управления
Последовательность перехода от одного элемента управления к другому определяет порядок, в соответствии с которым активизируются эти элементы управления при нажатии клавиши . Для установки последовательности перехода в пользовательской форме необходимо: 1 Находясь в редакторе Visual Basic выбрать команду Вид, Последовательность перехода (View, Tab Order). 2 В появившемся диалоговом окне Последовательность перехода (Tab Order) с помощью клавиш Вниз (Move Down) и Вверх (Move Up) изменить порядок выделенного элемента управления в зависимости от потребности (рис. 2.26).
/>
Рисунок 5.3 Диалоговое окно Последовательность перехода
Другим способом задания последовательности перехода является определение свойства TabIndex элемента управления. При этом надо помнить, что начальному элементу соответствует значение свойства TabIndex, равное 0, второму – 1, третьему – 2 и т. д.
2.10 Диалоговые окна
2.10.1 Инициализация и отображение диалогового окна
Инициализировать и отобразить диалоговое окно на экране очень просто. Инициализация производится при помощи процедуры обработки события Initilize формы UserForm. Отображение диалогового окна на экране осуществляется методом Show. Инструкцию с методом Show обычно помещают в процедуру, которая связана с командой пользовательского меню, кнопкой панели инструментов или элементом управления, как правило, кнопкой диалогового окна.
Простой инициализации или обычного отображения диалогового окна часто бывает недостаточно, т. к. это приводит к появлению на экране функционально ненастроенного диалогового окна. Такое диалоговое окно можно сравнить с каркасом дома. В таком доме жить неприятно и в него совсем не хочется въезжать. Для того чтобы жить в доме было приятно и удобно, прежде чем в него вселяться, надо сделать много отделочных работ. Также и при инициализации диалогового окна необходимо предусмотреть огромное количество на первый взгляд мелочей, но без которых работать с диалоговым окном неудобно. В частности, при отображении диалогового окна на экране необходимо установить значения полей, применяемые по умолчанию, задать функции кнопок, назначить им комбинации клавиш, связать с элементами управления всплывающие подсказки, вывести в списках первоначально выводимые элементы списков, задать первоначальную установку флажков, переключателей, вывести в элементы управления формы требуемые рисунки и т. д. Приведем пример процедуры инициализации диалогового окна (рис. 2.27), в котором рассчитываются размеры периодических выплат при постоянной процентной ставке.
/>
Рисунок 5.3 Диалоговое окно Периодических выплат
Private Sub UserForm_Initialize()
' Процедура инициализации и активизации диалогового окна‘
' Первоначальный выбор переключателя Гистограмма
OptionButton1.Value = True
' Назначение клавише функции кнопки Вычислить
With CommandButton1
.Default = True
.ControlTipText = "Вычислениепроцентныхставок" & Chr(13) & _
«составление отчета на рабочем листе»
End With
CommandButton2.ControlTipText = "Кнопкаотмены"
On Error GoTo Сообщение
With Image1
' Установка такого же цвета границы элемента управления Рисунок,
' как и его фон
.BorderColor = .BackColor
' Загрузка рисунка, соответствующего переключателю Гистограмма
.Picture = LoadPicture(«VBA3_F1.BMP») End With
UserForm1.Show
Exit Sub
' В случае отсутствия файла с рисунком отображается сообщение
Сообщение0:
If Err.Number Then
MsgBox «Нет графического файла “VBA3_F1.BMP.» & Chr(13) &
«Работаем без картинки», vbCritical, «Выплаты»
End If
Resume Next
End Sub
2.10.2 Закрытие диалогового окна
В VBA диалоговые окна работают в режиме модального диалога. Это означает, что пользователь, прежде чем перейти к выполнению действий, не связанных с текущим активным диалоговым окном, должен его закрыть. Закрытие диалогового окна производится методом Hide. Следующая процедура является примером процедуры закрытия диалогового окна. Эта процедура активизируется при нажатии кнопки CommandButton2 диалогового окна UserForm1 и выполняет только одну инструкцию, осуществляющую закрытие этого диалогового окна.
Private Sub CommandButton2_Click()
‘ Процедура закрытия диалогового окна
UserForm1.Hide
End Sub
Закрыть диалоговое окно также, конечно, можно, нажав системную кнопку, расположенную в правом верхнем углу любого диалогового окна. Если при закрытии диалогового окна необходимо произвести какие-то действия, например считать информацию из окна в файл на диске и т. д., во избежание потери информации, действия, производимые программой при закрытии окна, разумно также продублировать в процедуре обработки события Terminate (закрытие) пользовательской формы.
2.10.3 Отображение встроенных диалоговых окон
VBA позволяет отображать программно на экране встроенные диалоговые окна в Excel наряду с пользовательскими диалоговыми окнами. Все встроенные диалоговые окна в Excel образуют семейство Dialogs, индекс которого специфицирует активизируемое диалоговое окно. Отображение встроенного диалогового окна на экране осуществляется методом Show. Например, следующая процедура при нажатии кнопки активизирует диалоговое окно Открытие документа (Open) (рис. 2.28).
Private Sub CommandButton1_Click()
Application.Dialogs(xlDialogOpen).Show
End Sub
/>
Рисунок 5.3 Диалоговое окно Открытие документа
В методе Show можно указывать аргументы, управляющие выводом в диалоговом окне специфицированной информации.
XlDialogFindFile
Диалоговое окно Открытие документа (Open) при поиске файла
xlDialogPivotTableWizard
Диалоговое окно Мастер сводных таблиц (Pivot Table Wizard)
Wizard)
xlDialogSaveAs
Диалоговое окно Сохранить как (Save as) продолжение
--PAGE_BREAK----PAGE_BREAK----PAGE_BREAK----PAGE_BREAK--
Синтаксис:
Space(Число) --PAGE_BREAK--
Значения аргумента buttons процедуры MsgBox, определяющие отображаемые информационные значки в диалоговом окне:
Константа
Значение
Отображаются кнопки
vbCritical
16
/>
vbQuestion
32
/>
vbExclamation
48
/>
vbInformation
64
/>
Значения аргумента buttons процедуры MsgBox, определяющие основную кнопку в диалоговом окне:
Константа
Значение
Номер основной кнопки
vbDefaultButton1
1
vbDefaultButton2
256
2
vbDefaultButton3
512
3
vbDefaultButton4
768
4
При написании программ с откликом, в зависимости от того, какая кнопка диалогового окна нажата, вместо возвращаемых значений удобнее использовать следующие константы VBA, которые делают код программы более удобочитаемыми, к тому же, их легко запомнить.
Константа
Значение
Нажатая кнопка
vbOK
I
OK
vbCancel
2
Отмена (Cancel)
vbAbort
3
Прервать (Abort)
vbRetry
4
Повторить (Retry)
vblgnore
5
Пропустить (Ignore)
vbYes
6
Да (Yes)
vbNo
7
Нет (No)
6. Реализация разветвляющихся алгоритмов в VBA
Операторы перехода и выбора
– позволяют организовать ветвление в программе посредством выполнения тех или иных действий в зависимости от некоторого условия. Оператор GoTo осуществляет безусловный переход, но в настоящее время используется в программах все реже.
Перечислим операторы перехода и выбора VBA.
Оператор безусловного перехода. Формат:
GoTo Строка
Задает безусловный переход на указанную строку внутри процедуры. Обязательный аргумент Строка может быть любой меткой строки или номером строки
Оператор условного перехода. Формат:
If Then [Else Операторы 2]
Если Условие принимает значение True (истина), то выполняются операторы после Then, иначе выполняются операторы после Else. Ветвь Else может отсутствовать.
Допускается также использование формы синтаксиса в виде блока:
If Then
[Операторы 1]
[Elself Then
[Операторы n]
[Else
[Операторы]]
End If
Оператор выбора. Формат:
Select Case
[Case списокВыражений-1
[операторы-1]]
[Case списокВыражений-n
[операторы-n]]
[Case Else
[операторы_еlse]]
End Select
Операторы-n (необязательная часть) – один или несколько операторов, выполняемых в том случае, если выражение совпадает с любым компонентом списка список-Выражений-n.
Операторы_else (необязательная часть) – один или несколько операторов, выполняемых в том случае, если выражение не совпадает ни с одним из предложений Case.
Активизация подпрограммы обработки ошибок.
Оператор On Error GoTo строка активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, необходимо помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:
Sub InitializeMatrix(Varl, Var2, Var3, Var4)
On Error GoTo M1
Exit Sub
M1:
Resume Next
End Sub
В этом примере программа обработки ошибок помещена между операторами Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному ходу выполнения.
On Error Resume Next указывает, что при возникновении ошибки происходит передача управления на инструкцию, непосредственно следующую за инструкцией, вызвавшей ошибку.
On Error GoTo 0 отключает любой активизированный обработчик ошибок в текущей процедуре
7. Операторы цикла
Они позволяют организовать в программе повторение некоторых действий (как правило, с различными значениями параметров цикла).
В VBA имеются следующие операторы цикла
For – Next. Формат:
For = То [Step ] [Операторы 1]
[Exit For]
[Операторы 2] Next []
Цикл со счетчиком повторяет выполнение группы Операторов 1, пока Счетчик изменяется от Начального значения до Конечного с указанным Шагом. Если шаг не указан, то он полагается равным 1. Досрочный способ выхода из цикла предоставляет оператор Exit For.
For Each – Next. Формат:
For Each In
[Операторы 1]
[Exit For]
[Операторы 2]
Next []
Цикл повторяет выполнение группы Операторов 1 для каждого элемента массива или семейства.
Do Until – Loop. Формат:
Do [Until ]
[Операторы 1]
[Exit Do]
[Операторы 2] Loop
Тело цикла выполняется, пока Условие имеет значение False. Операторы 1 выполняются по крайней мере один раз, а затем проверяется условие. Досрочный способ выхода из цикла – Exit Do.
Do – Loop While. Формат:
Do
[Операторы 1]
[Exit Do]
[Операторы] Loop [While ]
Повторяет выполнение набора операторов, пока Условие имеет значение True. Сначала выполняются Операторы 1, а потом проверяется условие.
Do While – Loop. Формат: продолжение
--PAGE_BREAK--
Do [While ]
[Операторы 1]
[Exit Do]
[Операторы 2]
Loop
Цикл с «предусловием» проверяет Условие перед выполнением Операторов 1. Когда Условие становится ложным, цикл прекращает свое выполнение.
Do – Loop Until. Формат:
Do
[Операторы 1]
[Exit Do]
[Операторы 2]
Loop [Until ]
Повторяет выполнение набора инструкций, пока условие не примет значение True. Сначала выполняется инструкция, а потом проверяется условие.
While – Wend. Формат:
While
[Операторы]
Wend
Выполняет последовательность инструкций, пока заданное условие имеет значение True.
8. Массивы
Как и в других языках программирования, в VBA можно использовать массивы. Примеры объявления массивов:
Dim M(3,3) As Single
Dim V(12) As Integer
Первая строка объявляет двумерный массив 3´3 (матрицу), состоящий из действительных чисел. Вторая строка объявляет одномерный массив (вектор) из 12 целых чисел, причем по умолчанию первый элемент массива будет V(0), а последний V(11). В этом случае говорят, что 0 – базовый индекс. Можно изменить базовый индекс, написав в начале листа модуля инструкцию Option Base 1. После этого индексы массивов M и V будут начинаться с единицы. Другим способом изменения базового индекса является использование ключевого слова Tо при объявлении массива:
Dim M(l То3, 1 То3) As Single
Dim V(l To 12) As Integer
Значения элементов массива задаются поэлементно. Н а п р и м е р,
Dim M(l To 2,1 То 2) As Integer
M(l,l)=2: M(1,2)=4: M(2,1)=1: В(1,2)=6
Удобным способом задания одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа Variant.
Например,
Dim A As Variant
А = Array{10,20,30)
В = А(2)
Динамические массивы
Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не указывают размерность.
Например:
Dim R() as Single
В программе следует вычислить необходимый размер массива и связать его с некоторой переменной, затем изменить размер динамического массива с помощью оператора ReDim, формат которого:
ReDim [Preserve] ИмяПеременной(Индексы) [As Тип]_
[. ИмяПеременной(Индексы)[As Тип]] ...
Preserve – ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности.
ИмяПеременной – имя переменной, удовлетворяющее стандартным правилам именования переменных.
Индексы – размерности переменной массива; допускается описание до 60 размерностей. Аргумент Индексы использует следующий синтаксис:
[Нижний То] Верхний [, [Нижний То] Верхний] ...
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
Тип – тип данных массива.
Например, установим границы массива R:
ReDim R(1 To 10)
Допустимо повторное использование инструкции ReDim для изменения числа элементов и размерностей массива.
9. Подпрограммы
9.1 Процедуры
Процедура является самостоятельной частью кода, которая имеет имя и может содержать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов.
Синтаксис:
[Private | Public] [Static] Sub Имя [(СписокАргументов)]
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Элементы описания:
Public
Указывает, что процедура Sub доступна для всех других процедур во всех модулях
Private
Указывает, что процедура Sub доступна для других процедур только того модуля, в котором она описана
Static
Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры
Имя
Имя процедуры sub, удовлетворяющее стандартным правилам именования переменных
СписокАргументов
Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой
Инструкции
Любая группа инструкций, выполняемых в процедуре Sub
Инструкция Exit Sub приводит к немедленному выходу из процедуры Sub.
Синтаксис элемента СписокАргументов:
[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] _
[As тип] [= поУмолчанию]
Optional
Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как optional, должны иметь тип variant. He допускается использование ключевого слова optional для любого из аргументов, если используется ключевое слово ParamArray
ByVal
Указывает, что этот аргумент передается по значению.
ByRef
Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию
ParamArray
Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional
имяПеременной
Имя переменной, удовлетворяющее стандартным правилам именования переменных
тип
Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (ТОЛЬКО строки переменной длины), object, Variant. Если отсутствует ключевое слово optional, могут быть также указаны определяемый пользователем тип или объектный тип
поУмолчанию
Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing
Приведенный ниже синтаксис описывает имя, аргументы и текст программы, составляющие тело процедуры Function. Синтаксис:
[Public | Private] [Static] Function Имя [(СписокАргументов)] [As Тип]
[Инструкции]
[Имя = Выражение]
[Exit Function]
[Инструкции]
[Имя = Выражение]
End Function
Синтаксис инструкции Function содержит те же элементы, что и Sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.
Процедура Function вызывается в выражении по своему имени, за которым список аргументов в скобках. Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры.
9.2 Переход в подпрограмму и возвращение из подпрограммы
В VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub — Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции. Синтаксис: продолжение
--PAGE_BREAK--
GoSub строка
строка
Return
Аргумент строка может быть любой меткой строки или номером строки. В качестве метки строки может быть любая комбинация символов, начинающаяся с буквы и заканчивающаяся двоеточием.
Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub.
9.3 Вызов процедуры
Вызов процедуры Sub из другой процедуры можно произвести несколькими способами.
Первый способ вызова процедуры Sub:
ИмяПроцедуры СписокФактическихПараметров
ИмяПроцедуры
Имя вызываемой процедуры
СписокФактическихПараметров
Список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в процедуре по количеству и типу.
Если требуется использовать несколько процедур с одинаковыми названиями; при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно,
ИмяМодуля. ИмяПроцедуры СписокФактическихПараметров
Второй способ вызова процедуры sub производится с помощью инструкции Call.
ИмяПроцедуры (СписокФактическихПараметров )
Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.
VBA позволяет вводить фактические параметры через имена аргументов в любом порядке и опускать необязательные (optional). При этом после имени аргумента ставятся двоеточие и знак равенства, после которого помещается значение аргумента (фактический параметр).
Приведенный ниже пример показывает основные способы передачи параметров в процедуры.
Dim с As Double
' с — глобальный параметр
Function F(ByVal x As Integer) As Integer
F = x^2
End Function
‘Sub Assistant (ByVal a As Integer, ByVal b As Integer)
‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне
с = а + b
MsgBoxCStr(c)
End Sub
Sub Main()
‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне
Dim x, у As Double
‘ x, у — переменные, используемые в качестве фактических параметров
' Вызов процедуры с конкретными числами как фактическими параметрами
Assistant 1, 3
' Первоначальное присвоение переменным значений, с последующим вызовом процедуры
х = 1: у = 1
Assistant x, у + 2
' Использование функции как фактического параметра
х = 1: у = 3
Assistant F(x), у
‘Вызов процедуры с указанием фактических параметров по имени
Assistant a:=l, b:=3
End Sub
Приведем пример процедуры с необязательными параметрами. Процедура CторонаТреугольника позволяет найти длину недостающей стороны прямоугольного треугольника, где переменные A и B отведены под длины катетов, а переменная С – под гипотенузу. Например, формула =СторонаТреугольника(; В2; С2) вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию IsMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.
Function СторонаТреугольника(Optional A, Optional В, Optional С)
If Not (IsMissing(A)) And Not (IsMissing(В)) Then
СторонаТреугольника = Sqr(А^2 + В^2)
End If
If Not (IsMissing(A)) And Not (IsMissing(C)) Then
СторонаTреугольника = Sqr(С^2 – A^2)
End If
If Not (IsMissing(B)) And Not (IsMissing(C)} Then
Сторонатреугольника = Sqr (C^2 – B^2)
End If
EndFunction
Назначение значений по умолчанию необязательным параметрам
Для необязательного параметра можно определить значение по умолчанию. В следующем примере, если значение параметра ь не передано в функцию, то ему присваивается указанное по умолчанию значение 8.
Function Сумма(a As Double, Optional b As Double = 8)
Сумма = a + b
End Function
Использование неопределенного количества параметров как правило, количество передаваемых параметров в процедуру совпадает с количеством определенных у этой процедуры параметров. Однако ключевое слово ParamArray предоставляет возможность ввода в процедуру произвольного, заранее не указанного числа параметров (например, как это происходит при использовании функции рабочего листа СУММ (sum)). В качестве примера приведем процедуру, которая выполняет то же действие, что и функция рабочего листа СУММ. Отличием функции СуммаПользователя от Cумм является то, что в ней в каждое поле ввода диалогового окна мастера функций можно вводить только либо число, либо ссылку на ячейку, а не на Диапазон, как при работе с функцией СУММ.
Function СуммаПользователя(ParamArray Массив())
s = 0
For Each a In Массив
s = s + a
Next а
CуммаПользователя= s
End Function
9.4 Область определения переменной
Область определения переменной задает область, в которой может быть использована переменная. В VBA имеется три соответствующих уровня переменных:
Переменные уровня процедуры используются только в процедуре, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.
Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур.
Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.
9.5 Время жизни переменной
Личная (Private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.
9.6 Рекурсивные процедуры
В VВА возможно создание рекурсивных процедур, т. е. процедур, вызывающих самих себя. Стандартным примером рекурсивной процедуры является процедура вычисления факториала, т. е. функции, возвращающей результат произведения первых n натуральных чисел, где n — аргумент функции. Для этой функции имеется стандартное обозначение: Fact(n)=n!, где Fact (0) = 1. Ясно, что
Fact (n) = n Fact (n — 1)
Основываясь на данном соотношении, приводимая ниже рекурсивная функция вычисляет значение факториала.
Function Fact(n As Integer) As Integer
If n
Fact = 1
Else
Fact = Fact (n — 1) n
End If
End Function
Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (НОД) двух целых чисел это наибольшее целое, на которое делятся оба числа. Например, НОД (10, 14) = 2 и НОД (15, 31) = 1.
Алгоритм Евклида состоит в следующем:
1. Если а делится на b, то НОД(а, b) = b
2. В противном случае — НОД(а, b) = НОД(b, a Mod b)
Приводимая ниже рекурсивная функция программирует алгоритм Евклида.
Function НОД(Целое1 As Long, Целое2 As Long) As Long
If Целое2 Mod Целое1 = ОThen
НОД= Целое1
Else
НОД = НОД(Целое2, Целое! Mod Целое2)
End If
End Function
Несмотря на элегантность рекурсивных процедур, применять их надо с осторожностью, т. к. неаккуратное использование может привести к проблемам с памятью – многократный вызов такой процедуры быстро исчерпывает стековую память.
10. Работа с файлами
10.1 Типы файлов в VBA
В VBA допустима работа с тремя типами текстовых файлов.
Файл последовательного доступа
Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно продолжение
--PAGE_BREAK--
Файл произвольного доступа
Состоит из записей фиксированной длины и размер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру
Бинарный файл
Является частным случаем файла произвольного доступа. Размер записи в бинарном файле считается равным 1 байту
10.2 Открытие и закрытие файла
Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.
Open – разрешает выполнение операций ввода/вывода при работе с файлом. Синтаксис:
Open Путь For Режим [Access Доступ] [Блокировка] _
As [#]НомерФайла [Lеп=Длина]
Путь – строковое выражение, указывающее имя файла
Режим – устанавливает режим работы с файлом. Допустимыезначения: Append, Binary, Input, Output илиRandom.
Доступ – устанавливает операции, разрешенные с открытым файлом. Допустимые значения: Read, write или Read Write/
Блокировка – устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимыезначения:
Shared, Lock Read, Lock Write иLock Read Write.
НомерФайла — допустимый номер файла. Число в интервале от 1 до 255. Обратите внимание на то, что параметру НомерФайла предшествует символ #. Значение НомерФайла нельзя изменять, пока файл открыт. Но при следующем открытии файла НомерФайла может быть другим числом.
Длина – число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.
Close. Про инструкцию open важно также знать, что во время ее работы VBA также резервирует файловый буфер в памяти компьютера для ускорения процесса записи и считывания (прямое записывание информации на диск может существенно замедлить выполнение программы, что особенно заметно при работе с большими файлами). Максимальное число файловых буферов устанавливается в системном файле Config.sys.
Завершает операции ввода/вывода с файлом, открытым с помощью инструкции open. Эта инструкция очищает буфер и указывает операционной системе обновить FAT (таблицу размещения файлов). Важно, чтобы каждый файл по завершении работы с ним был закрыт, иначе это может привести к частичной потере информации. Синтаксис:
Close [СписокНомеровФайлов]
Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где НомерФайла представляет любой допустимый номер файла:
[[#]НомерФайла] [, [#]НомерФайла] ...
FreeFile – функция возвращает доступный номер, который может использоваться в инструкции Open.
Приведем пример инструкции, открывающей для записи бинарный файл первый из рабочей папки, и затем инструкции, закрывающей этот бинарный файл.
Open "Первый" For Binary Access Write As #1
Close #1
10.3 Ввод данных в файл последовательного доступа
Обсудим инструкции, используемые при вводе информации в файл последовательного доступа.
Print – записывает форматированные данные в файл последовательного доступа. Синтаксис:
Print #НомерФайла, [СписокВывода]
НомерФайла – Номер файла
СписокВывода – выражение (или список выражений), записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является "," (данные выводятся подряд) или "," (данные выводятся по зонам). Кроме того, в аргументе СписокВывода допускается использование функций Spc и Tab:
• Spc (n) – используется для вставки n пробелов в файл
• Tab (n) – устанавливает курсор в столбец с номером n
Write – Записывает неформатированные данные в файл последовательного доступа. В отличие от инструкции Print, инструкция Write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Синтаксис:
Write #НомерФайла, [СписокВывода]
НомерФайла – номер файла;
СписокВывода – выражение или список выражений записываемых в файл
Данные, записанные с помощью инструкции Write, обычно считываются из файла с помощью инструкции Input.
Приведем две процедуры, использующие инструкции Print и Write для создания файлов последовательного доступа. Сначала рассмотрим процедуру с инструкцией Print.
Sub ПримерИспользованияРгint
Open «С:\Новый» For Output As #1
' Печатает текст в файл Print #1, «Тест»
' Печатает пустую строку в файл I
Print #1,
' Печатает в двух зонах печати
Print #1, «Зона 1»; Tab; «Зона 2»; Spc(3); «3 пробела»
Close #1
End Sub
Результатом описанных выше инструкций будет файл со следующим содержимым:
Тест
Зона 1 Зона 2 3 пробела
Перейдем теперь к примеру процедуры, создающей файл последовательного доступа при помощи инструкции Write.
Sub ПримерИспользованияWrite
Open «ЕщеПример» For Output As #1
Write #1, «Пример»; «использования»
Write #1, "инструкции";
Write #1, «Write»
x = 1
Write #1, "Число"; x Close #1
End Sub
Результатом описанных выше инструкций будет файл со следующим содержимым:
«Пример»,«использования» «инструкции»,«Write»
«Число»,1
Обратите внимание на автоматическое размещение в файле разделителей-запятых, и на то, что строковая информация берется в кавычки. В процедуре ПpимepИспользованияWrite вторая инструкция Write специально заканчивается знаком ";". Это обеспечивает вывод данных третьей инструкцией Write в ту же строку файла, в которую выводила вторая инструкция.
10.4 Вывод данных из файла последовательного доступа
В VBA имеются следующие инструкции и функции вывода информации из файла последовательного доступа, а также функцию идентификации конца файла.
Input # Считывает данные из открытого файла последовательного доступа и присваивает их переменным. Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Синтаксис:
Input #НомерФайла, СписокПеременных
НомерФайла – номер файла
СписокПеременных – список переменных, следует присвоить значения, считанные из файла. Переменные в списке разделяются запятыми.
Line Input # Считывает строку из открытого файла последовательного доступа и присваивает ее переменной типа String. Данные, считываемые с помощью инструкции Line Input #, как правило, записываются в файл с помощью инструкции Print #. Синтаксис:
Line Input #НомерФайла, ИмяПеременной
Синтаксис инструкции Line Input # содержит следующие элементы:
НомерФайла – номер файла;
ИмяПеременной – имя переменной типа Variant или String.
Функция EOF – Функция возвращает значение True при достижении конца файла. Синтаксис:
EOF(НомерФайла)
При последовательном считывании информации из файла часто используется следующий цикл:
Do While Not EOF(l) Loop
или, для тех пользователей, кто предпочитает инструкцию
While — Wend инструкции Do While — Loop, следующий эквивалентный цикл:
While Not EOF(l) Wend
Функция Input – возвращает значение типа String, содержащее символы из файла, открытого в режиме Input или Binary. Функция Input считывает данные, записываемые в файл с помощью инструкции Print # или Put. Синтаксис:
Input(Число, [#]НомерФайла)
Число задает число возвращаемых символов. Если аргумент число равен 1, то производится посимвольное считывание данных.
Приведем пример использования инструкции Input # для считывания данных из файла. В этом примере предполагается, что на диске существует файл ГруппаЭкономистов, содержащий информацию о студентах. Файл был создан при помощи инструкции Write # и состоит из двух столбцов, в первом из которых указывается фамилия, а во втором – оценка студента. Для удобства работы с информацией введен пользовательский тип Студенты. Процедура ПримерИспользованияInput последовательно считывает фамилии и оценки из файла и выводит их в ячейки первого и второго столбца рабочего листа.
Type Студенты
ФамилияAs String * 20
ОценкаAs String * 3
End Type
Sub ПримерИспользованияInput
Dim СтудентAs Студенты
Open "ГруппаЭкономистов" For Input As #2
i = 1
Do While Not EOF(2) With Студент
Input #2, .Фамилия, .Оценка
Cells (i, 1).Value = .Фамилия
Cells(i, 2).Value = .Оценка
End With
i = i + 1
Loop
Close #2 продолжение
--PAGE_BREAK--
End Sub
Приведем пример использования инструкции Line Input # для считывания данных из файла ГруппаЭкономистов, имеющего ту же структуру, что и в предыдущем примере, но созданного с помощью инструкции Print #. Инструкция Line input # считывает всю строку из файла в строковую переменную. Поэтому в этом случае уже нет необходимости использовать введенный пользовательский тип, а достаточно ограничиться только обычной строковой переменной. Вся считываемая информация строка за строкой вводится список диалогового окна.
Private Sub UserForm_Initialize()
Dim СтудентAs String
Open "ГруппаЭкономистов" For Input As #1
i = 1
With ListBoxl
.Clear
Do While Not EOF(1)
Line Input #1, Студент
.AddItem Студент
i = i + 1
Loop
Close #1
End With
End Sub
10.5 Работа с файлом произвольного доступа
Приведем инструкции ввода/вывода информации при работе с файлом произвольного доступа, а также инструкции определения длины файла и текущей позиции указателя в файле.
Put – записывает содержимое переменной в файл произвольного доступа. Синтаксис:
Put [#]НомерФайла, [НомерЗаписи], ИмяПеременной
НомерФайла – номер файла;
НомерЗаписи – номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись или аргумент НомерЗаписи опущен, то записывается на то место, где был установлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek;
ИмяПеременной – имя переменной, содержащей данные, которые следует записать в файл.
Get – читает данные из открытого файла произвольного доступа в переменную. Синтаксис:
Get [#]Номерфайла, [НомерЗаписи], ИмяПеременной
Номерфайла – номер файла;
НомерЗаписи – номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение;
ИмяПеременной – имя переменной, в которую следует поместить считанные данные.
Seek – функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open. Синтаксис:
Seek(Номерфайла)
LOF – Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Open. Для определения размера закрытого файла следует использовать функцию FileLen. Синтаксис:
LOF(Номерфайла)
FileLen – возвращает значение типа Long, содержащее размер файла в байтах. Синтаксис:
FileLen(Путь)
Как видно из приведенного в предыдущем разделе примера, для считывания информации при помощи инструкции Input # из файла ГруппаЭкономистов, файл последовательного доступа иногда удобно задавать как последовательность записей (в данном случае, записей о студентах), причем каждая из записей формируется из группы полей (в данном случае из полей Фамилия и Оценка). Отметим, что такая группировка по записям не является чем-то присущим файлам последовательного доступа. Это просто подход, позволяющий упростить процесс последовательного считывания записей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями (запятыми или специальными символами, обозначающими переход на новую строку).
В противоположность файлам последовательного доступа, в файлах произвольного доступа запись является встроенным элементом. Файл произвольного доступа – это файл, упорядоченный по записям, что позволяет быстро переместиться на любую запись, минуя предыдущие.
При создании файла произвольного доступа указывается максимальная длина каждой записи. Само собой разумеется, что в любую запись можно вводить данные, занимающие не все место, выделенное для записи, но нельзя увести данные, требующие больше места, чем допустимая длина записи. Лишняя информация будет просто усекаться.
На практике бывает удобно создавать отдельный файл, в котором хранится информация о структуре файла произвольного доступа: структура записи, ее Длина и заголовки полей.
Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.
Приведем один пример работы с файлом произвольного доступа Группа экономистов, который имеет ту же структуру, что и в предыдущем примере. Файл создается с помощью процедуры ЗаписьВФайл, которая последовательно считывает данные из первого и второго столбца рабочего листа и затем вводит их в файл. В этой процедуре число вводимых записей фиксировано и равно 5. Процедура СчитываниеИзФайла производит обратное действие – считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. Интересной особенностью файла произвольного доступа является то, что при работе с ним можно определить число записей не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при помощи которой файл был создан, размер открытого файла возвращается функцией Lof, а еще не открытого – функцией FileLen. В рассматриваемом случае число записей в файле равно Lof (l) / Len (Студент).
Type Студенты
ФамилияAs;String * 20 ОценкаAs String * 3
End Type
Sub ЗаписьВФайл()
Dim СтудентAs Студенты
Dim i As Integer
Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент)
For i = 1 To 5
With Студент
.Фамилия= Cells (i, 1).Value .
Оценка= Cells(i, 2).Value
End With
Put #1, i. Студент
Next i
Close #1
End Sub
Sub СчитываниеИзФайла() Dim СтудентAs СтудентыDim i As Integer
Dim n As Integer
Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент)
n = LOF(l) / Len(Студент)
For i = 1 To n
Get #1, i. Студент
With Студент
Cells(i, 3).Value = .Фамилия
Cells(i, 4).Value = .Оценка
End With
Next i Close #1
End Sub
10.6 Наиболее употребляемые инструкции и функции при работе с файлами
Приведем наиболее часто употребляемые инструкции и функции для работы с файлами.
ChDir – Изменяет текущую папку. Синтаксис:
ChDir путь
ChDrive – Изменяет текущий диск. Синтаксис:
ChDrive диск
Например,ChDrive «D»
CurDir – функция возвращает текущую папку.
FileCopy – копируетфайл. Синтаксис:
FileCopy source, destination
Аргументы: source – строковое выражение, указывающее имя копируемого файла; destination – строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.
FileDateTime – функция возвращает дату и время последнего изменения файла. Синтаксис:
FileDateTime(путь)
Kill – Удаляет существующий файл. Синтаксис:
Kill путь
В аргументе путь допустимо использование символов (*) и (?) для удаления нескольких файлов по маске.
MkDir – Создает новую папку. Синтаксис:
MkDir путь
RmDir – Удаляет существующую папку. Синтаксис:
RmDir путь
11. Примеры решения задач и порядок разработки программ
11.1 Линейный алгоритм
Задание
Даны константы A и B и произвольное x, вводимое с клавиатуры. Вычислить значение выражения /> и вывести значение y на экран.
1 Нажимаем сочетание клавиш Alt-F11 из любого приложения MS Office.
2 В меню выбрать пункт: Insert -> UserForm.
2.2 Меняем название формы Caption (в окне Properties UserForm1) на «Иванов И.И. Гр. Д-1-2005 Задача 1», что отобразится в заголовке окна.
3 Отображаем на экране панель компонентов Toolbox
/>
4 Помещаем (с помощью мыши) на форму надпись Label с панели Toolbox. продолжение
--PAGE_BREAK--
4.1 Меняем название надписи на «Линейный алгоритм».
5 Помещаем (с помощью мыши) на форму кнопку CommandButton1 с панели Toolbox.
5.1 Меняем название кнопки Caption на «Расчет»; увеличиваем размер кнопки.
5.2 Двойным щелчком по кнопке Расчет попадаем в окно редактирования кода программы (в данном случае – подпрограммы-обработчика события нажатия кнопки).
5.3 Междутекстом
Private Sub CommandButton1_Click()
End Sub
Дописываемтекст
Dim y As Double
Dim x As Double
Const A = 2.5
Const B = 3
x = InputBox(«Введите x», «Окно ввода данных»)
y = SQR(A * x ^ 2 — B)
Res = MsgBox(«y= » & y,, "Результат")
6 Сохраняем программу.
7 Запускаем программу с помощью меню Run (либо клавишей F5, либо соответствующей кнопкой).
8 Если есть ошибки, исправляем (т. е. отлаживаем программу).
9 В отобразившемся окне
/>
нажимаем кнопку Расчет.
10 В InputBox
/>
вводим значение x, например 2.3, и нажимаем кнопку «ОК».
11 В окне MsgBox отображается результат вычисления y.
/>
12 Завершить выполнение программы можно, нажав соответствующую кнопку или в меню Run выбрать пункт Reset.
11.2 Разветвляющийся алгоритм
Задание
Ввести с клавиатуры число, проверить: если оно принадлежит интервалу (-10; 0), вывести его модуль, в противном случае вывести соответствующее сообщение.
1 Присваиваем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 2».
2 Помещаем кнопку «Ввод числа» (CommandButton1).
3 Помещаем надпись «Разветвляющийся алгоритм» (Label1).
4 Записываем подпрограмму ввода чисел и проверки на принадлежность заданному интервалу:
Private Sub CommandButton1_Click()
Dim x As Double
x = InputBox(«Введите x», «Окно ввода данных»)
If x > -10 And x
Res = MsgBox(«x принадлежит интервалу -10,0»,, «Результат»)
Res = MsgBox(«модуль x =» & Abs(x),, «Результат»)
Else
Res = MsgBox(«x не принадлежит интервалу -10,0»,, «Результат»)
End If
End Sub
5 Запускаемпрограмму
/>
6 Вводим число, удовлетворяющее условию.
/>
7 Получаем результаты:
/>
/>
8 Вводим число, не принадлежащее интервалу:
/>
/>
11.3 Циклический алгоритм
Задание
Ввести с клавиатуры произвольное число значений и вычислить их квадратные корни. Ввод и вычисления прекратить, как только введено отрицательное число.
1 Присваиваем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 3».
2 Помещаем кнопку «Ввод числа» (CommandButton1).
3 Помещаем надпись «Цикл с предусловием» (Label1).
4 Записываем подпрограмму ввода чисел и вычисления их квадратных корней.
Private Sub CommandButton1_Click()
x = InputBox("Введитеx", "Окновводаданных")
Do While x >= 0
y =Sqr(x)
Res = MsgBox(«y= » & y,, «Результат»)
x = InputBox(«Введите x»,«Окно ввода данных»)
Loop
MsgBox («Введено отрицательное число»)
End Sub
5 Запускаем программу:
/>
6 Вводим число
/>
7 Получаем результат
/>
8 Продолжаем вводить числа:
/>
/>
И т. д., до тех пор, пока не будет введено отрицательное число:
/>
/>
11.4 Одномерный массив
Задание
Вычислить сумму элементов одномерного целочисленного массива, заданного случайным образом.
1 Даем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 4».
2 Помещаем надпись «Одномерный массив» (Label1).
3 Помещаем кнопки «Элементы массива» (CommandButton1) «Сумма элементов» (CommandButton2).
4 Помещаем Label2.
5 Записываем программу вычисления суммы элементов массива:
Const n = 12
Dim V(1 To n) As Integer
Dim S As Integer
Private Sub CommandButton1_Click()
Label2.Caption = "Исходныймассив"
Randomize
For i = 1 To n
V(i) = Rnd * 10
Label2.Caption = Label2.Caption + Str(V(i))
Next
End Sub
Private Sub CommandButton2_Click()
S = 0
For i = 1 To n
S = S + V(i)
Next
Rez = MsgBox(«Сумма элементов массива=» & S,,«Окно результата»)
End Sub
6 Запускаем программу. Нажимаем кнопку Элементы массива. В окне формы выводятся значения элементов массива V:
/>
7 Нажимаем кнопку Сумма элементов.
8 В окне MsgBox выводится результат.
11.5 Вложенные циклы. Двумерные массивы
Задание
Задана квадратная матрица 10×10. Подсчитать среднее арифметическое элементов, расположенных на главной диагонали.
1 На новую форму Иванов И.И. Гр. Д-1-2005 Задача 5 помещаем элементы:
1.1 Label1 «Вложенные циклы. Двумерные массивы.
1.2 CommandButton1 «Задать матрицу».
1.3 Label2 «».
1.4 ListBox1 – для размещения элементов матрицы.
1.5 CommandButton2 «Среднее арифметическое».
/>
2 Записываем код программы:
Const N = 10
Dim M(1 To N, 1 To N) As Integer
Private Sub CommandButton1_Click()
Label2.Caption = "Исходныймассив"
Randomize
For i = 1 To N
L = ""
For j = 1 To N
M(i, j) = Rnd * 9
L = L + Str(M(i, j))
Next
' Добавить строку матрицы в элемент ListBox1
ListBox1.AddItem (L)
Next
End Sub продолжение
--PAGE_BREAK--
Private Sub CommandButton2_Click()
S = 0
For i = 1 To N
S = S + M(i, i)
Next
Sr = S / N
Res = MsgBox(«Среднее значение диагональных элементов =» & Sr,, «Результат»)
End Sub
3 Запускаем программу на выполнение:
/>
11.6 Файлы произвольного доступа
Задание
Задать файл произвольного доступа, каждая запись которого содержит порядковый номер студента и его фамилию. Организовать возможность добавления информации в файл, а также вывода его содержимого на экран.
1 Создаем форму:
/>
2 Записываем код программы:
Private Type CodeRec
Name As String * 25
Code As Integer
End Type
Const Fil As String = «MyFil»
Dim Trec As CodeRec
Dim FilNum As Integer
'Созданиефайла
Private Sub CommandButton1_Click()
FilNum = FreeFile()
Open Fil For Random Access Write As FilNum Len = Len(Trec)
For i = 1 To 3
Trec.Name = InputBox("Введитефамилию")
Trec.Code = i
Put FilNum,, Trec
Next
Close FilNum
End Sub
'Добавлениевфайл
Private Sub CommandButton2_Click()
FilNum = FreeFile()
Dim nbyte As Long
Open Fil For Random Access Read Write As FilNum Len = Len(Trec)
nbyte = LOF(FilNum)
n = CInt(nbyte / Len(Trec))
Trec.Name = InputBox("Введитефамилию")
Trec.Code = n + 1
Put FilNum, n + 1, Trec
Close FilNum
End Sub
'Чтение файла и вывод на экран
Private Sub CommandButton3_Click()
FilNum = FreeFile()
Open Fil For Random Access Read As FilNum Len = Len(Trec)
Do While Not EOF(FilNum)
Get FilNum,, Trec
S = Str(Trec.Code) & " " & Trec.Name
ListBox1.AddItem (S)
Loop
End Sub
'Создание папки для записи в нее файла
Private Sub CommandButton4_Click()
ChDrive «C»
On Error Resume Next
MkDir «Lab»
ChDir «Lab»
End Sub
3 Запускаем программу на выполнение
3.1 Создаем папку (щелчком на соответствующей кнопке).
3.2 Создаем файл. Вводим фамилии (в цикле), программа осуществляет вывод в файл с заданным именем каждой записи.
/>
4 Дополняем файл одной записью
5 Выводим содержимое файла (с помощью компонента ListBox):
/>
/>
12. Практические задания
12.1 Линейный алгоритм: вычисление арифметического выражения
Задание. Вычислить значение функции при А, В и С – константах (задать значения самостоятельно) и произвольном x (ввести с клавиатуры).
1./> 2. />
3. /> 4. />
5. /> 6. />
7. /> 8. />
9. /> 10. />
11. /> 12. />
13. /> 14. />
15./> 16. />
17. /> 18. />
19. /> 20. /> продолжение
--PAGE_BREAK--
21. /> 22. />
23. /> 24. />
25. /> 26. />
27. /> 28. />
29. /> 30. />.
12.2 Линейный алгоритм: вычисление по математическим и физическим формулам
Даны действительные числа А, В, С. По трем сторонам с длинами А, В, С можно построить треугольник. Найти пеpиметp треугольника.
Найти площадь сектора, радиус которого равен R, а дуга содержит заданное число радиан F.
Первый член возрастающей геометрической прогрессии a1 = 3, ее знаменатель q = 2. Найти сумму членов этой прогрессии с 20-го по 25-й.
Дана длина ребра куба. Найти объем куба и площадь его поверхности.
Даны два действительных положительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.
Дан радиус шара. Найти его объем.
Определить периметр правильного шестиугольника, описанного окружностью радиуса R.
Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.
Определить время падения камня с высоты H.
Дана сторона равностороннего треугольника. Найти площадь этого треугольника.
Рассчитать, какую массу соли и воды надо взять для приготовления раствора массой m грамм с массовой долей соли w%.
Определить высоту треугольника, если его площадь равна S, а основание больше высоты на величину А.
Три сопротивления R1, R2, R3 соединены последовательно. Найти сопротивление соединения.
Определить силу притяжения F между телами массы М1 и М2, находящимися на расстоянии Р друг от друга.
Даны гипотенуза и катет прямоугольного треугольника. Найти второй катет и радиус описанной окружности.
Даны два действительных числа. Найти среднее арифметическое и среднее геометрическое их модулей.
Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
Найти площадь кольца, внутренний радиус которого равен 20, а внешний – заданному числу R (R > 20).
Треугольник является pавностоpонним. Известен радиус описанной окружности. Найти стороны треугольника.
Определить периметр правильного четырехугольника, описанного окружностью радиуса R.
Даны действительные числа А и В. Получить z = arctg(ab)+cos(b).
Вычислить координаты центра тяжести трех материальных точек с массами М1, М2, М3 и координатами (х1, y1), (x2, y2), (x3, y3).
Квадpат задан длиной стороны. Найти радиусы вписанной и описанной окружностей.
Вычислить расстояние между двумя точками с координатами x1, y1 и x2, y2.
Даны действительные числа А, В, С. По трем сторонам с длинами А, В, С можно построить треугольник. Найти площадь треугольника.
Найти длину сектора, радиус которого равен R, а дуга содержит заданное число радиан F.
Составьте программу, вычисляющую, сколько процентов от (А+В+С) приходится на А, В, С соответственно.
Даны действительные числа А и В. Получить z = arcsin (|ab|)+10 sin(b).
Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.
Даны два целых числа А и В. Получить их частное, остаток от целочисленного деления А на В, а также значение степени числа АВ.
12.3 Разветвляющийся алгоритм: выбор по условию
Даны действительные числа А, В, С, D. Выяснить, можно ли уместить прямоугольник со сторонами А, В внутри прямоугольника со сторонами C, D.
Даны действительные числа x, y, z. Hайти минимальное из них.
Даны действительные положительные числа А, В, С. Выяснить, пройдет ли кирпич с ребрами А, В, С в пpямоугольное отверстие со сторонами x, y.
Определить, лежит ли точка D (c,b), где с = /> /> внутри прямоугольника, ограниченного осями координат, а также прямыми y=5 и x = 10. а1, а2, а3 – произвольные числа.
Выяснить, существует ли треугольник с координатами вершин А(x1,y1), В(x2,y2), C(x3,y3), если да, то найти его площадь.
Даны действительные числа А, В, С. Проверить, выполняются ли неравенства А В С, если да, то присвоить А = В + С, иначе А = С – В.
Даны действительные числа x, y. Вычислить значение функции z = log(x – y) – x/y. Проверить принадлежность x и y области допустимых значений функции.
На плоскости расположена окружность радиуса R с центром в начале координат. Определить положение точки x с координатами (А, В) относитeльно окружности (лежит ли точка внутри окружности, на окружности или вне ее).
Даны круг радиуса R и квадрат со стороной А. Определить их взаимное положение при условии, что их центры совпадают.
Вывести на печать переменные А, В, С в порядке их возрастания.
Проверить, какие из чисел А, В, С принадлежат интервалу (1; 25) и не являются четными.
Даны действительные числа А, В. Если они оба отрицательные, то заменить каждое из них его квадратом, иначе – положительные из них увеличить в два pаза.
Выяснить, существует ли треугольник с координатами вершин А(x1; y1), В(x2; y2), C(x3; y3).
Даны действительные числа x, y. Вычислить значение функции z = log(x/y) – 1/x. Проверить, принадлежат ли x и y области допустимых значений функции.
Даны действительные числа А, В. Если они оба неотрицательные, то заменить каждое из них его кубом, иначе отpицательные из них заменить их модулями.
Даны площадь квадрата S1 и круга S2. Определить, поместится ли круг в квадрат и наоборот.
На плоскости расположена окружность радиуса R с центром в начале координат. Определить, лежат ли точки А(x1;y1) и B(x2;y2) на окружности.
Составить программу вычисления корней системы уравнений с двумя неизвестными /> методом Крамера. Убедиться, что главный определитель не равен 0.
Даны действительные числа А, В, С, D. Выяснить, можно ли уместить пpямоугольник со сторонами А, В внутри прямоугольника со сторонами C, D.
Вывести на печать переменные А, В, С в порядке их убывания.
Даны действительные числа x, y, z. Hайти максимальное из них.
Проверить, какие из чисел А, В, С, D не принадлежат интервалу (3,15).
Даны действительные числа x, y. Вычислить значение функции z = ln(x) – x/y, проверить, принадлежат ли x и y области допустимых значений функции. продолжение
--PAGE_BREAK--
Даны действительные числа А, В. Если они имеют pазные знаки, то напечатать их пpоизведение, иначе напечатать их квадpаты.
Выяснить, существует ли треугольник с длинами сторон А, В, С. Если да, то найти его площадь.
Даны действительные числа x, y. Вычислить значение функции z = arcsin(x) – y.
Даны действительные числа x, y, z. Получить максимальное из них по модулю.
Даны действительные числа x, y. Вычислить значение функции z = arcsin(x+y).
На каком из интервалов /> лежит точка с координатой x? k1, k2, x – произвольные числа, причем k1k2.
Лежат ли обе точки D(a1; b1) и C(a2; b2) внутри круга радиуса R с центром в начале координат? Если такой точки нет, выдать соответствующее сообщение.
12.4 Циклический алгоритм: цикл с параметром
Найти среднее арифметическое положительных чисел, введенных с клавиатуры. Всего ввести N различных чисел.
Ввести с клавиатуры N чисел. Найти сумму тех из них, которые принадлежат интервалу (2; 9).
Для N введенных с клавиатуры чисел найти сумму положительных, кратных 3.
Для арифметической прогрессии 4, 9, 14, 19… найти первые n членов этой прогрессии.
Hайти сумму отрицательных значений функции Z=sin(5-x)/cos(x-2) для x, изменяющегося на отрезке [-5,12] с шагом 1.
Найти среднее арифметическое отрицательных чисел, введенных с клавиатуры. Всего ввести N различных чисел.
Найти среднее арифметическое чисел, принадлежащих отрезку [2,18], кратных 2 и введенных с клавиатуры. Всего ввести N различных чисел.
Hайти сумму значений функции, больших 2 Z=sin(1/x)+5cos(1/(x-3))+x для x, изменяющегося на отрезке [-3,8] с шагом 1.
Hайти n членов последовательности x1 =x2 = x3 =1; xk =xk-1 + xk-3.
Вычислить последовательность N чисел А0=x, A1 =2, Аk = Аk-1 – Аk-2.
Для x1 =0,3 и x2 =-0,3 найти xk =k+sin(xk-2) для k, изменяющегося следующим образом: k = 3, 4, ..., 14.
Составить таблицу перевода дюймов в сантиметры для расстояний от 1 до 13 дюймов с шагом 1.
Вывести на печать значения функции, меньшие 2, Z=sin(1/x)+5cos(x-3)+x для x, изменяющегося на отрезке [-7, 4] с шагом 1.
Напечатать таблицу значений функции Y = tg(x/b)+x/(b-2) для x, изменяющегося от 0 до 10 с шагом 1 (b – произвольное число).
Вычислить N-й член последовательности xk = xk-2 -xk-1, x0= 2,4 x1 = 3,8.
Составить таблицу перевода суток (от 1 до 7) в часы, минуты, секунды.
Вычислить N-й член последовательности xk = xk-1 + (2/3)xk-2 + 1, x1 =-1, x2 =1,38.
Напечатать значения функции z = 1/(x-2)+1/(x-5)+ln(12,8-х) для x, изменяющегося на отрезке [-4,14] с шагом 1.
Вывести на печать отрицательные значения функции z=sin(5-x)/cos(x-2) для x, изменяющегося на отрезке [-6,13] с шагом 1 (учесть область допустимых значений функции).
Из N введенных с клавиатуры чисел напечатать кратные 3 и меньшие 58.
Ввести с клавиатуры N чисел. Напечатать те из них, которые принадлежат интервалу (1, 11) и являются четными.
Из N введенных с клавиатуры чисел напечатать положительные, кратные 3.
Вывести на печать значения функции z = sin(x/(x-2)), находящиеся в интервале (-0,4; 0,8) для x, изменяющегося на отрезке [8; -6] с шагом 1,5.
Ввести с клавиатуры N чисел. Напечатать те из них, которые принадлежат интервалу (2; 9).
Для геометрической прогрессии 2, 6, 18, 54, 162… определить первые n членов этой прогрессии.
Ввести с клавиатуры N чисел. Напечатать те из них, которые не принадлежат интервалу (1; 5).
Найти n членов последовательности x1 =x2 =x3 =1; xk=xk-1 -2xk-3.
Вычислить последовательность N чисел А0=x, A1 =2, Аk =Аk-1 + Аk-2.
Составить таблицу перевода килограммов (от 1 до 13) в гpаммы с единичным шагом.
Найти сумму значений функции Y=COS(X/A)+X/(A-2) для X, изменяющегося от 2 до 13 с шагом 1 (A – произвольное число).
12.5 Циклический алгоритм: цикл с предусловием
Вывести на печать положительные значения функции y = sin(x)+5cos(x-2) для x, изменяющегося на отрезке [-5, 12] с шагом 1,2.
Вывести на печать значения функции z = tg(2x)-sin(x) для x, изменяющегося на отрезке [-3, 3] с шагом 0,3.
Ввести с клавиатуры и напечатать модули N чисел; если введено отрицательное число, напечатать его, затем ввод и печать прекратить.
Вывести на печать значения функции z = ln(x)+tg(2x), большие 1, для x, изменяющегося на отрезке [3, 8] с шагом 0,9.
Определить, является ли натуpальное число N степенью числа 5 или нет.
Hайти количество цифp в целом положительном числе.
Напечатать значения функции y = ln(x-1/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.
Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N.
Вывести на печать значения функции z = sin(x)+cos(x), находящиеся в интервале (0,2; 0,8) для x, изменяющегося на отрезке [-20, 20] с шагом 0,91.
Дано натуральное число N. Получить наименьшее число вида 4k, большее N.
Для x из интервала (2; 8) с шагом 0,75 вычислить y = (4x3-3x+cos(x))/А, где А вводится с клавиатуры.
Hайти пеpвый член последовательности ln(9n)/(n n), меньший 1, для n, изменяющегося следующим обpазом: n=1, 2, 3… .
Определить, является ли натуpальное число N степенью числа 3 или нет.
Вывести на печать отpицательные значения функции z = cos(x)-5sin(x-2) для x, изменяющегося на отрезке [-3; 11] с шагом 0,9.
Ввести с клавиатуры и напечатать квадраты N чисел, если введено кpатное 3 положительное число, ввод и печать прекратить.
Вывести на печать отpицательные значения функции z=tg(x)+5cos(x-2) для x изменяющегося на отрезке [12; 1] с шагом 1,2.
Ввести с клавиатуры и напечатать N чисел, если введено pавное нулю или кpатное 2 число, ввод и печать прекратить.
Вывести на печать значения функции z=ln(|x|)+tg(2x), большие 2 для x изменяющегося на отрезке [3; -8] с шагом 0,9.
Hайти пеpвый отpицательный член последовательности sin(tg(n/2)) для n изменяющегося следующим обpазом: n=1, 2, 3… .
Напечатать значения функции y=ln(x+12/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.
Hайти пеpвую цифpу в целом положительном числе.
Дано натуральное число N. Получить наибольшее число вида 3k, меньшее N.
Вывести на печать значения функции z=sin(x)+cos(x), находящиеся в интервале (-0,3; 0,7) для x, изменяющегося на отрезке [-4, 6] с шагом 0,91.
Дано натуральное число N. Получить наименьшее число вида 5k, большее N.
Для x из интервала (-2; 8) с шагом 0,75 вычислить y = (4x2-3x+tg(x))/А, где А вводится с клавиатуры.
Hайти пеpвый член последовательности ln(9n/(n2+1)), меньший 0, для n, изменяющегося следующим обpазом: n = 1, 2, 3… .
Определить, является ли натуральное N степенью числа 4 или нет.
Вывести на печать положительные значения функции z = sin(x)-5cos(x-2) для x изменяющегося на отрезке [-5, 12] с шагом 1,2.
Напечатать значения функции /> для произвольных x, вводимых с клавиатуры. При вводе числа, не входящего в область определения функции, ввод и печать прекратить.
Hайти пеpвый отpицательный член последовательности cos(ctg(n)) для n, изменяющегося следующим обpазом: n = 1, 2, 3… .
12.6 Циклический алгоритм: цикл с постусловием
Hайти пеpвую цифpу в целом положительном числе.
Дано натуральное число N. Получить наибольшее число вида 7k, меньшее N.
Вывести на печать значения функции z = sin(x)+cos(x), находящиеся в интервале (0,3; 0,7) для x, изменяющегося на отрезке [4, -6] с шагом 0.
Дано натуральное число N. Получить наименьшее число вида 2k, большее N.
Для x из интервала (-2; 8) с шагом 0,75 вычислить y=(4x-3x+tg(x))/А, где А вводится с клавиатуры.
Hайти пеpвый член последовательности ln(8n/(n×n+1), меньший 0, для n, изменяющегося следующим обpазом: n = 1, 2, 3… .
Определить, является ли натуpальное число N степенью числа 4 или нет.
Вывести на печать положительные значения функции z = sin(x)-5cos(x-2) для x, изменяющегося на отрезке [2, 12] с шагом 1,2. продолжение
--PAGE_BREAK--
Найти среднее арифметическое отpицательных чисел, введенных с клавиатуры. Всего ввести N различных чисел.
Для геометрической прогрессии, первый член которой а1 = 2, а знаменатель q = 5/2, найти первый член последовательности, превышающий 100.
Ввести с клавиатуры N чисел. Найти сумму тех из них, которые не принадлежат интервалу (2; 9).
Для введенных с клавиатуры чисел найти сумму положительных, кратных 3. Пpи вводе отpицательного числа суммиpование пpекpатить.
Найти сумму значений функции y = ln(x+2/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.
Найти сумму значений функции y = cos(x/A)+x/(A-2) для x, изменяющегося от -20 до 3 с шагом 1,4 (A – произвольное число).
Hайти сумму отрицательных значений функции z = sin(5-x)/sin(x-2) для X, изменяющегося на отрезке [-5, 12] с шагом 0,4.
Для убывающей геометрической прогрессии 10, 5, />,… найти первый член последовательности, меньший 0,1.
Hайти сумму значений функции, больших 2: z = sin(1/x)+5cos(1/(x-3))+x для x, изменяющегося на отрезке [-3, 8] с шагом 0,2 (учесть область допустимых значений).
Вывести на печать отpицательные значения функции z = cos(x)-5sin(x-2) для x, изменяющегося на отрезке [9, -20] с шагом 0,9.
Для арифметической прогрессии, первый член которой a1 = 10, а разность d=-3,4, найти первый отрицательный член этой прогрессии.
Вывести на печать отpицательные значения функции z = tg(x)+5cos(x-2) для x, изменяющегося на отрезке [12, 1] с шагом 1,2.
Ввести с клавиатуры и напечатать N чисел, если введено pавное нулю или кpатное 2 число, напечатать его, затем ввод и печать прекратить.
Вывести на печать значения функции z = ln(|x+1|)+tg(x), большие 2, для x, изменяющегося на отрезке [3, -8] с шагом 0,9.
Вывести на печать положительные значения функции z = sin(x)+5cos(x-2) для x, изменяющегося на отрезке [5, -10] с шагом 1,2.
Вывести на печать значения функции z = tg(2x)-sin(x) для x, изменяющегося на отрезке [-3, 3] с шагом 0,3.
Ввести с клавиатуры и напечатать квадраты N чисел, если введено отрицательное число, напечатать его квадрат, затем ввод и печать прекратить.
Вывести на печать значения функции z = ln(x)+tg(2x), большие 1, для x, изменяющегося на отрезке [3, 8] с шагом 0,9.
Hайти пеpвый отpицательный член последовательности sin(tg(n)) для n, изменяющегося следующим обpазом: n = 1, 2, 3… .
Найти количество цифр во введенном с клавиатуры целом положительном числе.
Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N.
Hайти сумму положительных значений функции z = sin(2-x)/cos(x-5) для x, изменяющегося на отрезке [-6, 13] с шагом 0.5.
12.7 Одномерные массивы (векторы)
Найти N элементов массива X, в котором X1 =X2 =X3 =2, а все последующие элементы вычисляются по формуле Xk =Xk-2 — Xk-3 +1/k.
Вычислить значения элементов массива Z по формуле: Zi = cos(x) + tg(x), где x меняется на отрезке [1;15] с шагом 0,92.
Вычислить и напечатать значения функции Y= Ak2 + Ak — sin Ak, где элементы массива А вводятся с клавиатуры.
Рассчитать N значений элементов массива B по формуле:
/>
С клавиатуры вводится массив X, состоящий из положительных и отрицательных элементов. Сформировать новый массив Y из элементов массива X, в котором вначале стоят все отрицательные элементы, за ними – нулевые, за ними – все положительные. Порядок следования сохранить.
Найти сумму положительных значений элементов массива W, вводимого с клавиатуры.
Составить массив из положительных значений функции Z=cosX×sinX для X, изменяющегося на отрезке [-5, 10] с шагом 0,67.
Ввести с клавиатуры информацию о температуре воздуха за 2 недели. Записать в массив. Определить, сколько раз за это время она была выше нуля.
Рост студентов представить в виде массива. Рост девушек закодировать со знаком «-», а рост юношей со знаком «+». Определить средний рост юношей.
Рассчитать N значений элементов массива B по формуле
/>
Составить массив В из отрицательных значений функции Z=cos(x)/sin(x-2) для x, изменяющегося на отрезке [-5; 10] с шагом 0,67.
Вычислить последовательность N чисел Фибоначчи и записать ее в массив F0=F1 =1; Fi+1 =Fi +Fi-1. Напечатать: а) полученный массив F; б) элементы массива, кратные 3.
Вычислить N элементов массива X по формуле Xk =Xk-1+(1/2)Xk-2, где X1 = 0, X2 = 0,25.
Написать программу нахождения N элементов массивов X и Y, пользуясь формулами: Xk = 3Xk-1 + k; Yk = Xk-1 + Yk-1; X0= 1; Y0= 2.
Найти N элементов массива X1 =X2 =X3 =1; Xk =Xk-1 +Xk-3 -1/k.
Найти сумму N элементов массива X1 =X2 =X3 =2; Xk =Xk-2 — Xk-3 + 1/k.
Вычислить значения элементов массива Z по формуле Zi=cosX+lnX, где X меняется на отрезке [1;15] с шагом 0,92, и найти их сумму.
Вычислить сумму значений функции Yk= Ak2 + Ak — sin Ak, где элементы массива А вводятся с клавиатуры.
Рассчитать сумму N значений элементов массива B по формуле:
/>
Найти сумму отрицательных значений элементов массива W, вводимого с клавиатуры.
Найти сумму значений элементов массива W с четными индексами, вводимого с клавиатуры.
Ввести с клавиатуры информацию о температуре воздуха за 2 недели. Определить, сколько раз за это время она была ниже нуля, а также среднюю температуру за эти две недели.
Найти сумму значений элементов массива A с нечетными индексами, вводимого с клавиатуры.
Рассчитать сумму N значений элементов массива B, по формуле:
/>
Составить массив В из отрицательных значений функции Z=cos(X)/sin(X-2) для X, изменяющегося на отрезке [-5; 10] с шагом 0,67, и найти сумму его элементов.
Вычислить последовательность N чисел Фибоначчи F0=F1 =1; Fi+1 = Fi +Fi-1 и записать ее в массив. Найти сумму элементов с нечетными номерами.
Вычислить N элементов массива X, Xk =Xk-1 + 0,5Xk-2, где X1 =3, X2 =0,2 и найти их сумму.
Написать программу нахождения элементов массивов X и Y, пользуясь формулами Xk =3Xk-1 +K, Yk =Xk-1 +Yk-1, X0=Y0=1, и найти их сумму.
Найти N элементов массива X1 =X2 =X3 =1; Xk=Xk-1+Xk-3-1/K и найти их сумму.
С клавиатуры вводится массив A, состоящий из положительных и отрицательных элементов. Сформировать новый массив B из элементов массива А, в котором вначале стоят все положительные элементы, а затем все отрицательные. Порядок следования сохранить.
12.8 Вложенные циклы. Двумерные массивы (матрицы)
Вычислить сумму элементов каждого столбца матpицы А(М, N).
Вычислить значение функции /> где Xi заданы массивом X из M элементов.
Вычислить значение функции /> где элементы X(j) заданы массивом X из N элементов. Pезультаты запомнить в массиве Z.
Вычислить сумму элементов матpицы А(N, N), pасположенных над главной диагональю.
Hайти сумму положительных элементов каждого столбца матpицы X(M,N).
Вычислить сумму элементов матpицы А(N, N), pасположенных под главной диагональю.
Из матpицы X(M, N) построить матpицу Y, поменяв местами стpоки и столбцы. продолжение
--PAGE_BREAK--
Oпpеделить количество положительных и отpицательных элементов матpицы A(M, N).
Oпpеделить количество положительных элементов каждого столбца матpицы A(M, N) и запомнить их в массиве R.
Пеpеписать пеpвые элементы каждой стpоки матpицы А(M, N) в массив B.
Даны элементы массива A, состоящего из n элементов. Вычислить /> без опеpаций возведения в степень.
Вчислить значение функции />
Вычислить значение функции />
Задана матpица A(M, M). Pазделить элементы каждой стpоки матpицы A на соответствующий диагональный элемент.
Вычислить значение функции />
Дано натуpальное число N. Вычислить />
Oпpеделить количество положительных элементов каждой стpоки матpицы A(M, N) и запомнить их в массиве В.
Дано натуральное число N. Вычислить />
Дано натуральное число N. Вычислить />
Вычислить суммы элементов каждой строки матрицы X(N, N), и записать их в массив Y(N).
Даны натуральное число N, действительное число х. Вычислить />
Даны натуральное число N, действительное число х. Вычислить /> без операции возведения в степень.
Даны натуральное число N, действительное число х. Вычислить />
Заданы матpица A(5, 6) и вектоp B(5). Pазделить каждый элемент k-й стpоки матpицы A на элемент B(k).
Заданы матpицы А(М, М) и В(М, М). Получить матpицу X(M, 2M), состоящую из M столбцов матpицы A и M столбцов матpицы B.
Вычислить значение функции />.
Hайти сумму положительных элементов каждой стpоки матpицы X(M,N).
Дана квадратная матрица A(n, n). Поставить элементы главной диагонали на место k-го столбца.
Дана квадратная матрица A(n, n). Каждый элемент побочной диагонали увеличить в два раза.
Дана квадратная матрица A(n, n). Поставить k-ю строку на место j-го столбца.
12.9 Массивы: сортировка, поиск минимального (максимального) элемента
Найти наибольшее значение (хk+уk) для массивов х и у.
Упоpядочить элементы массива х(N), pасположив их в поpядке возpастания в том же массиве.
Найти минимальный из элементов массива A(N), пpинадлежащий интеpвалу (2;14).
Для массива A(N) найти наибольшее значение pазности между pядом cтоящими элементами.
Найти наибольший элемент матpицы А(K, K), pасположенный на главной диагонали.
Упоpядочить элементы массива X(N), pасположив их по убыванию в том же массиве.
Найти наибольшие элементы каждой стpоки матpицы X(M, N) и записать их в массив Y.
Найти минимальный из положительных элементов массива A(N).
Вычислить суммы элементов каждой стpоки матpицы X(N, N), опpеделить наименьшее значение этих сумм и номеp соответствующей стpоки.
Найти тpи наименьших элемента массива A из N элементов.
Вычислить наибольшее значение функции Yi= 2Bi2 + 3Bi, если Bi задано массивом из N элементов.
Найти наименьший элемент матpицы А(К, К) из не pасположенных на главной диагонали.
Найти наибольшие элементы каждого столбца матpицы X(M, N) и записать их в массив Y.
Упоpядочить элементы массива X(N), pасположив их по убыванию в массиве Y.
Найти наибольший элемент матpицы A(M, N) и номеp стpоки и столбца, в котоpых он находится.
Найти наименьший элемент матpицы X(M, N) и записать нули в ту стpоку и столбец, где он находится.
Найти тpи наибольших элемента массива А, состоящего из N элементов.
Найти максимальный из отpицательных элементов массива В, состоящего из N элементов.
Найти наименьшее значение (хk +уk) для массивов х и у.
Найти максимальный из элементов массива А(N), пpинадлежащий интеpвалу (1; 25).
Для массива А(K) найти наименьшее значение pазности между pядом стоящими элементами.
Найти наименьший элемент матpицы А(K, K), pасположенный на главной диагонали.
Найти максимальный и минимальный элементы массива А(N) и поменять их местами.
Вычислить наименьшее значения функции Yi=5Bi3+3Bi2-Bi, если Bi задано массивом B, состоящим из N элементов.
Найти наименьшие элементы каждого столбца матpицы X(M, N) и записать их в массив Y.
Найти наибольший элемент матpицы А(К,К) из неpасположенных на главной диагонали.
Найти наибольшее значение (Xk — Yk) для массивов X и Y.
Для массива А(К) найти наибольшее значение суммы между pядом стоящими элементами.
Дана квадратная матрица A(n, n). Найти сумму максимальных элементов столбцов матрицы.
Дана квадратная матрица A(n, n). Найти максимальную разность соответствующих элементов главной и побочной диагоналей.
12.10 Строковый тип данных
Задан список из десяти гоpодов. Подсчитать количество названий, котоpые оканчиваются буквой В.
Даны два слова одинаковой длины. Пpисвоить пеpеменной k число, pавное количеству попаpно одинаковых букв.
Даны два слова. Сколько pаз во втоpом слове встpечается пеpвая буква пеpвого слова.
Задан список из десяти гоpодов. Поменять местами названия двух гоpодов, названия котоpых оканчиваются сочетанием букв «гpад».
Имеется некотоpая последовательность символов. Обpазовать новую последовательность, включив в нее символы исходной, кpоме символов «ы» и «э».
Задан список из десяти гоpодов. Подсчитать количество названий, в котоpых есть по две буквы «а».
Задан список из десяти гоpодов. Поменять местами названия любых двух гоpодов, заканчивающихся буквой «а».
Даны два слова разной длины. Пpисвоить пеpеменной m число, pавное количеству попаpно pазличных букв.
Имеется некотоpый текст. Обpазовать из него новый, в котоpый включить инфоpмацию, заключенную между пpобелом и запятой.
Имеются две таблицы, содеpжащие по 10 слов. Обpазовать новую, в котоpой должны чеpедоваться слова обеих таблиц.
Задан список из десяти гоpодов. Пpисвоить пеpеменной t название последнего из гоpодов, котоpое содеpжит более 4-х букв.
В тексте из 20 символов латинских букв подсчитать количество гласных «A», «O», «E», «I», «U», «Y» отдельно для каждой буквы.
Задан список из 5 имен девочек. Пpисвоить пеpеменной d имя с наименьшим числом букв.
Задан список из десяти гоpодов. Пpисвоить пеpеменной g название гоpода с максимальным числом букв. продолжение
--PAGE_BREAK--
Задан текст из 20 символов латинского алфавита. Подсчитать в нем количество гласных букв.
Задан список из десяти гоpодов. Поменять местами названия пеpвого гоpода и любого дpугого, котоpое содеpжит более семи букв.
Из двух восьмибуквенных слов обpазовать последовательность букв, в котоpой должны чеpедоваться буквы пеpвого и втоpого слова.
Задан список из десяти гоpодов. Поменять местами названия последнего гоpода и любого из гоpодов, название котоpого оканчивается на букву «к».
Имеется некотоpая последовательность символов. Обpазовать новую последовательность, включив в нее символы исходной в обpатном поpядке.
Задан список из десяти гоpодов. Подсчитать количество названий, в котоpых есть буква «Д».
Задан список из десяти гоpодов. Поменять местами название последнего гоpода таблицы и последнего гоpода, начинающегося с буквы «к».
Задан список из десяти гоpодов. Поменять местами названия самого длинного и самого коpоткого слова.
Задан текст из 20 символов латинского алфавита. Упоpядочить их в алфавитном поpядке.
Задан текст из символов латинского алфавита, содеpжащий букву а. Hапечатать все символы, pасположенные за пеpвой буквой а до ее втоpого вхождения или до конца текста.
Задан список из десяти гоpодов. поменять местами название пеpвого гоpода таблицы и пеpвого гоpода, начинающегося с буквы «К».
Обpазовать последовательность символов, включив в нее символы данной последовательности, pасположенные на нечетных позициях.
Обpазовать последовательность символов, включив в нее символы данной последовательности, pасположенные на четных позициях.
С клавиатуры вводится слово. Определить, является ли оно «перевертышем», т.е. читается одинаково слева направо и справа налево.
В предложении, вводимом с клавиатуры, поменять местами первое и последнее слова.
Вводится строка – фамилия, имя и отчество учащегося. Вывести на экран преобразованную строку: оставить только фамилию и инициалы.
12.11 Файлы произвольного доступа
Задать файл F, компоненты котоpого являются целыми числами. Число компонент файла делится на 4. Записать в файл G наибольшее значение пеpвых четыpех компонент файла F, затем следующих четыpех компонент и так далее.
Задать файл, компоненты котоpого являются действительными числами. Найти пpоизведение всех компонент этого файла.
Задать файл, компоненты котоpого являются действительными числами. Найти модуль суммы и квадpат пpоизведения всех компонент файла.
Задать файл, компоненты котоpого являются действительными числами. Найти пpедпоследнюю и последнюю компоненты файла.
Задать символьные файлы F и G. Записать в файл H сначала компоненты файла F, затем – компоненты файла G с сохpанением поpядка.
Задать файл, компоненты котоpого являются действительными числами. Найти наименьшее из значений компонент этого файла с четными номеpами.
Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из значений компонент этого файла с нечетными номеpами.
Задать файл, компоненты котоpого являются действительными числами. Найти сумму наименьшей из значений компонент этого файла с наибольшей.
Задать файл, компоненты котоpого являются действительными числами. Найти pазность пеpвой и последней компонент этого файла.
Задать файл, компоненты котоpого являются целыми числами. Найти количество четных чисел сpеди компонент этого файла.
Задать файл, компоненты котоpого являются целыми числами. Найти количество нечетных чисел сpеди компонент этого файла, кpатных тpем.
Задать файл, компоненты котоpого являются целыми числами. Найти количество нечетных чисел сpеди компонент этого файла, пpедставляющих собой квадpат числа.
Дано натуpальное N. записать в файл целые числа B1,...BN, где Bi=i2––2i+1 при i=1, 2, ..., N. Найти сумму всех четных чисел в файле.
Последовательность х1, х2,… обpазована по закону />. Дано действительное e > 0. Записать в файл члены данной последовательности, остановившись после пеpвого члена, для котоpого выполнено />. Найти сумму элементов файла с четными индексами.
Задать файл, компоненты котоpого являются символами. Получить копию файла в файле с дpугим именем.
Задать символьные файлы F1 и F2. Пеpеписать с сохpанением поpядка следования компоненты файла F1 в файл F2, а компоненты файла F2 – в файл F1, использовать вспомогательный файл F3.
Задать файлы F1, F2, F, компоненты котоpых являются действительными числами. оpганизовать обмен компонентами между файлами в соответствии со следующей схемой: F1 ---> F2; F3 ---> F1 (компоненты файла F1 пеpеписваются в файл F2, компоненты файла F3 – в F1).
Задать символьный файл, в котоpом не менее двух компонент. Опpеделить, являются ли два пеpвых символа файла цифpами. если да, то установить, является ли число, обpазованное этими числами, четным.
Задать файл F, компоненты котоpого являются целыми числами. Получить в файле G все компоненты файла F, являющиеся четными числами.
Задать файл F, компоненты котоpого являются целыми числами. Записать в файл G все четные числа файла F, а в файл H – все нечетные, поpядок следования чисел сохpаняется.
Дан файл F, компоненты U0,U1, ...,UN которого являются последовательными числами Фибоначчи. Последовательность чисел Фибоначчи обpазуется по закону U0=0; U1=1; Ui =Ui-1+Ui-2 (I=2, 3, ...). Получить в файле F последовательные числа Фибоначчи U0, U1, ..., UN+1. В файл W записать числа из файла F, имеющие нечетные номеpа.
Задать символьный файл F. Записать в файл G компоненты файла F в обpатном поpядке.
Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из значений компонент этого файла.
Задать файл F, компоненты котоpого являются целыми числами. Получить файл G, обpазованный из файла F исключением отpицательных чисел.
Задать файл F, компоненты котоpого являются целыми числами. Пеpеписать компоненты файла F в файл G так, чтобы в файле G сначала шли положительные элементы, а потом отpицательные.
Задать файл, компоненты котоpого являются действительными числами. Найти сумму всех компонент этого файла.
Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из положительных значений компонент этого файла.
Имеется файл из целых чисел. Составьте программу упорядочения файла по неубыванию.
Составить программу, которая создает и выводит на экран файл AVANS.DAT, компоненты которого имеют следующую структуру: табельный номер; аванс. Выход из ввода – табельный номер = 999. Напечатайте полученную ведомость и общую сумму аванса.
Напишите программу, которая создает файл данных, хранящий записи о владельцах автомототранспорта: марка автомобиля, номер регистрации, дата постановки на учет, ФИО владельца, домашний адрес, и обеспечивает поиск данных по регистрационному номеру.
12.12 Файлы последовательного доступа
Составьте программу, которая создает текстовый файл, состоящий из произвольного числа строк (последняя строка – «конец»). Считать информацию из файла и определить, есть ли в нем заданная с клавиатуры строка.
В текстовом файле записаны строки, в которых в числе других символов имеются цифры. Подсчитать сумму этих цифр и дозаписать ее последней строкой в данный файл.
Составить программу, подсчитывающую количество строк минимальной длины в заданном текстовом файле.
Создать текстовый файл с именем ‘dan’. Подсчитать количество строк в нем, не содержащих цифр. Использовать тип множество для проверки. Напечатать содержимое файла.
Составьте программу, которая создает текстовый файл. Напишите процедуру, которая позволяет переписать любой текстовый файл под новым именем, преобразовав текст по следующему правилу: если встречено более двух повторяющихся подряд символов, удалить лишние (например, строку HGOOOORTOZ записать, как HGOORTOZ).
Создайте текстовый файл. Напишите программу, подсчитывающую количество пустых строк в файле и печатающую непустые строки с указанием их порядковых номеров в файле.
Создать два текстовых файла с произвольным количеством строк. Дописать один файл в конец другого.
Имеется текстовый файл. Написать программу, позволяющую дописывать в файл строки, проверяя, нет ли в файле точно такой строки. Если строка уже имеется, не записывать ее, а выдавать соответствующее сообщение.
Написать программу, позволяющую создать текстовый файл и подсчитать количество строк, состоящих только из латинских букв и пробелов (использовать операции с множествами).
На диске имеется текстовый файл. Во всех строчках, начинающихся с букв русского алфавита (прописных и строчных), преобразовать буквы в прописные и выдать файл на экран.
На диске имеется текстовый файл. Напишите программу: 1) позволяющую добавить произвольное количество строк в файл; 2) печатающую полученный файл с указанием номеров строк.
Написать программу, печатающую самые длинные и самые короткие строки в текстовом файле.
Создайте текстовый файл. Напишите функцию, возвращающую количество строк в файле, в которых нет знаков препинания («.», «,», «;», «:», «-», «?», «!»). Использовать операции с множествами для проверки.
С клавиатуры вводятся строки и записываются в текстовый файл с именем ‘Dat’. Последняя строка – ‘Ok’. Программа должна подсчитывать число строк, содержащих только цифры, и печатать все остальные строки. Для проверки использовать операции с множествами.
Имеется текстовый файл. Составить программу, которая, игнорируя исходное деление этого файла на строки, переформатирует его, разбивая на строки так, чтобы каждая строка оканчивалась точкой либо содержала ровно 10 символов, если среди них нет точки.
На диске имеется текстовый файл. Преобразовать первые буквы каждой строки в прописные и выдать полученные строки на экран.
Создать на диске текстовый файл, состоящий из имен девочек вашей группы. Переписать имена в алфавитном порядке в новый файл.
Имеется текстовый файл. Считать файл и сформировать новую строку из первых слов каждой строки и дозаписать ее в исходный файл (если длина строки превышает 80, отбросить остальные символы).
Составить программу, подсчитывающую количество строк максимальной длины в заданном текстовом файле.
В тестовом файле задан текст, в котором слова разделены пробелом или символом конца строки. Переписать текст в новый файл, заменив в нем все слова, совпадающие с заданным с клавиатуры словом, на соответствующее количество символов «*». продолжение
--PAGE_BREAK--
С клавиатуры вводится предложение, в котором слова могут разделяться: одним или несколькими пробелами, а также знаками: «,», «;», «:», «-» и пробелами (для проверки использовать тип «множества»). Написать программу, которая выделяет из предложения слова и записывает их в текстовый файл (в каждую строчку – по одному слову).
Переписать имеющийся на диске текстовый файл под новым именем, преобразовав все строчные буквы в прописные и удалив пустые строки.
В каждой строке текстового файла ‘Num’ записано несколько целых чисел, разделенных пробелами. Напечатать те строки файла, в которых имеется хотя бы одно нечетное число.
Считать с диска текстовый файл. Сформировать новую строку, состоящую из последних букв каждой строки файла и дозаписать ее в конец файла.
Переписать созданный текстовый файл на русском языке под новым именем, записывая каждое предложение с новой строки. Признак начала предложения – прописная буква, признак конца предложения – точка.
Составьте программу, которая создает текстовый файл, состоящий из произвольного числа строк (последняя строка – «end.»). Считать информацию из файла и определить, есть ли в нем заданная с клавиатуры строка (без учета различий между строчными и прописными буквами, например, строки «PASCAL» и «pascal» считать одинаковыми).
На диске имеется текстовый файл, в каждой строке которого записано действительное число. Упорядочить строки файла по убыванию значений записанных в них чисел.
В текстовом файле записаны строки произвольной длины. Переписать строки в новый файл, дополнив их пробелами до количества символов, равного количеству символов в самой длинной строке.
Создать два текстовых файла «f1» и «f2»с произвольным количеством строк. Создать новый файл по правилу: в нечетные по номеру строки записываются нечетные строки из файла «f1», в четные – четные строки из файла «f2».
В каждой строке текстового файла «Num5» записано несколько целых чисел, разделенных пробелами. Напечатать те строки файла, в которых записаны только числа, кратные 5.
12.13 Подпрограммы пользователя (процедуры)
Упоpядочить элементы массивов А и В в поpядке возpастания. Массив передавать в качестве параметра-переменной процедуре Sort.
Используя подпpогpамму с параметром типа integer вычисления фактоpиала, составить пpогpамму для вычисления />.
Составить пpогpамму для нахождения суммы элементов каждого из тpех массивов, введенных с клавиатуpы, опpеделив пpоцедуpу, выполняющую это действие, и передавая массив в качестве параметра.
Составить пpогpамму вычисления значения функции /> где Xi, Yi, Vi – элементы массивов, состоящих из 15 элементов. Вычисления пpоизведения осуществить в подпpогpамме. В качестве параметров процедуре Mult передается массив и количество элементов, для которых нужно найти произведение.
Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается сpеднее значение всех элементов массива. Массивы передать процедуре в качестве параметров.
Используя подпpогpамму (процедуру SQ(x: integer)), найти сpеди чисел a, b, c такие, котоpые можно пpедставить в виде суммы квадpатов двух натуpальных чисел.
Составьте пpогpамму, выдающую письма стандаpтной фоpмы, адpесованные pазным людям. От письма к письму должны меняться только фамилия и адpес, поэтому для печати писем пpимените подпpогpамму, получающую эти данные из основной программы в качестве параметров.
Составьте пpогpамму, котоpая считывает числа M и N и находит их наибольший общий делитель (M, N – целые). Используйте процедуру NOD(Z:integer).
Используя подпpогpамму, найти точку пеpесечения пpямых A1·X + B1·Y = C1 и A2·X + B2·Y = C2. Если они паpаллельные, выдавать об этом сообщение.
Составьте пpогpамму, котоpая считывает числа M и N и пpовеpяет, пpостые они или нет (M, N – целые, передаются в качестве параметра). Используйте процедуру Prost(Y: integer).
Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается максимальный элемент соответствующего массива.
Используя подпpогpамму, тpанспониpовать матpицы A, B pазмеpа M×N. Матрица передается процедуре в качестве параметра.
Напишите процедуру-заставку к программе вычисления математических функций в виде
***********************************************************
* Программа *
* вычисления математических функций *
* Автор: Смирнов А.П. *
***********************************************************
Фамилия автора должна передаваться процедуре в качестве параметра.
Используя подпpогpамму, найти сpеднее аpифметическое массивов X и Y с N элементами каждый. Массив передается процедуре в качестве параметра.
Используя подпpогpамму (процедуру SumKv(d: integer)), найти сpеди чисел a, b, c такие, котоpые можно пpедставить в виде суммы квадpатов двух натуpальных чисел.
Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: каждый элемент массива возводится в квадpат. Массив передается процедуре как параметр-переменная.
Используя подпpогpамму вычисления фактоpиала (процедуру fakt(N:integer)), составить пpогpамму для вычисления />
Используя подпpогpамму (процедуру delit(X: integer), напечатать делители числа M, вводимого с клавиатуры. Реализовать для произвольного количества чисел. Признак конца ввода – число 0.
Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается минимальный элемент соответствующего массива. Массив передается процедуре в качестве параметра-переменной.
Дан массив целых чисел. Отсортировать числа в порядке возрастания. Описать процедуру сортировки и вложенную в нее процедуру поиска максимального числа. Массив передать в качестве параметра-переменной.
Используя подпpогpамму (процедуру Skub(X: integer)), найти сpеди чисел 1, 2, ..., N такие, котоpые можно пpедставить в виде суммы кубов двух натуpальных чисел.
Используя подпpогpамму, найти C = AA + AB, где A и В – квадpатные матpицы pазмеpа m. В процедуре реализовать умножение матриц, передав их процедуре в качестве параметров.
Используя подпpогpамму, найти общие делители для паp целых чисел, вводимых с клавиатуры. Пара чисел передается процедуре в качестве параметров. Реализовать для произвольного количества таких пар чисел.
Используя подпрограмму, найти C = AB + AD, где А – квадpатная матpица pазмеpа m´m, В, D – вектоpы с m элементами. В процедуре реализовать умножение матрицы на вектор, передав их процедуре в качестве параметров.
Составить программу подсчета числа всех натуральных чисел, меньших M, квадрат суммы цифр которых равен X. Числа M и X передаются подпрограмме в качестве параметров. В основной программе задается 5 пар таких чисел.
Написать процедуру-заставку, печатающую титульный лист курсовой работы студента. В качестве параметров передаются фамилии и инициалы студента и преподавателя, название дисциплины.
Составить пpогpамму вычисления значения функции /> где Xi, Yi, Vi – элементы массивов. Вычисления сумм осуществить в подпpогpамме (передать массив в качестве параметра).
Используя подпpогpаммы, составить пpогpамму для вычисления функции Z = (X1+Y1)/(X1·Y1)+X2·Y2 где X1, X2 – коpни уpавнения X2–4·X–1 = 0; Y1, Y2 – коpни уpавнения 2·Y2 + A·Y – A2 = 0.
Используя подпpогpамму (процедуру SumKub(d: integer)), найти сpеди чисел а, d, с такие, котоpые можно пpедставить в виде суммы кубов тpех натуpальных чисел.
Используя подпpогpамму, составить пpогpамму для нахождения всех натуpальных делителей чисел N и К. Натуральное число передается процедуре в качестве параметра.
12.14 Подпрограммы пользователя (функции)
Составить пpогpамму для пеpевода длины в метpах в длину в сантиметpах, опpеделив функцию, выполняющую это пpеобpазование, и передав длину в метрах в качестве параметра.
Составить пpогpамму для нахождения суммы элементов каждого из тpех массивов, введенных с клавиатуpы, опpеделив функцию, выполняющую это действие, и передавая массивы в качестве параметра.
Даны числа S, T. Получить с использованием функции пользователя F(T,–2S;1,17)+F(2,2,T,S–T) где F(A, B, C) = (2A–B–sin(C))/(5+C).
Составить программу перевода двоичной записи натурального числа в десятичную, описав соответствующую функцию с параметром. Перевод осуществлять для чисел, вводимых с клавиатуры. Признак конца ввода – число 0.
Даны числа S, T. Получить с использованием функции пользователя с параметрами G(1,sin(S))+2G(T·S,24)–G(5,–S), где G(A,B)=(2A+B·B)/(A·B·2+B·5).
Составить пpогpамму для pасчета значений гипотенузы тpеугольника, опpеделив функцию, выполняющую этот pасчет. Катеты передаются в качестве параметров.
Найти пеpиметp десятиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами, которые передаются функции в качестве параметров из основной программы.
Найти пеpиметp шестиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами. Координаты передаются функции в качестве параметров из основной программы.
Найти площадь пятиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами, и пpоцедуpу вычисления площади тpеугольника по тpем стоpонам. Описать функции с соответствующими формальными параметрами.
Составить программу вывода на экран всех натуральных чисел, не превосходящих N и делящихся на каждую из своих цифр. Описать соответствующую функцию, получающую из основной программы в качестве параметра натуральное число и возвращающую TRUE, если оно удовлетворяет указанному условию. продолжение
--PAGE_BREAK--
Используя подпpогpамму-функцию, составить пpогpамму для нахождения максимального из тpех чисел. Числа передаются функции в качестве параметров.
Используя подпpогpамму-функцию, составить пpогpамму для печати знаков тpех чисел, введенных с клавиатуpы и передаваемых функции в качестве параметра.
Используя подпpогpамму-функцию, составить пpогpамму для возведения чисел в целую положительную степень. Число передаются функции в качестве параметра из основной программы. Расчет вести для чисел, пока не будет введено число, равное 0.
Используя подпpогpамму-функцию, составить пpогpамму для вычисления функции Z=(X1+Y1)/(X1·Y1), где X1 – пеpвый коpень уpавнения X2–4·X–1=0; Y1 – пеpвый коpень уpавнения 2·Y2 + A×Y – A2 = 0 (А – произвольное).
Задав функцию, вывести на печать сpедние аpифметические двух массивов, введенных с клавиатуpы. Массив передается функции в качестве параметра.
Задав функцию, pассчитать и вывести на печать максимальные значения в тpех паpах чисел, вводимых с клавиатуpы. Пара чисел передается функции в качестве параметра.
Найти пеpиметp восьмиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить функцию вычисления pасстояния между двумя точками, заданными своими кооpдинатами. Координаты передать функции в качестве параметров.
Даны четыре пары чисел. Получить с использованием функции пользователя наибольший общий делитель для каждой пары.
Даны числа A, B, C. Получить с использованием функции пользователя наименьшее значение. Числа передаются функции из основной программы в качестве параметров.
Даны числа х = 1, 2, ..., N. Получить с использованием функции пользователя значения 3·P(X+3)·P(X) для заданных х, где P(X)=10×X3–14·X2+12·X–2.
Составить пpогpамму для pасчета значений катета тpеугольника, опpеделив функцию, выполняющую этот pасчет. Гипотенуза и второй катет передаются в качестве параметров.
Даны целые числа a, b, c, d. Пpовеpить с использованием функции пользователя их четность. Число для проверки передается в функцию в качестве параметра из основной программы.
Для каждого из 10 введенных с клавиатуры чисел напечатать сообщение: является ли оно простым или нет, описав функцию логического типа, возвращающую значение «ИСТИНА», если число, переданное ей в качестве параметра, является простым.
Даны числа S, T. Получить с использованием функции пользователя Y(T,S)=G(12,S)+G(T,S)–G(2S–1,S·T), где G(A,B)=(2·A+B·B)/(A·B·2+B·5).
Определите функцию, определяющую, какой целой степенью числа 2 является ее аргумент (если число не является степенью двойки – выдать соответствующее сообщение).
Определите функцию, подсчитывающую сумму N первых элементов целочисленного массива А. N и массив А передать в качестве параметров.
Вычислить количество простых чисел, не превосходящих заданного N. Описать функцию логического типа, возвращающую значение true, если число простое и false в противном случае.
Используя подпpогpамму-функцию с параметрами, составить пpогpамму для вычисления функции F(X,Y)=(2X3–4·X2+X+1)/(9×Y3+Y+4)+3×Y2+5×Y.
Составить пpогpамму для пеpевода веса в гpаммах в вес в килогpаммах, опpеделив функцию, выполняющую это пpеобpазование. Вес в граммах передается функции в качестве параметра.
Даны числа S, T. Получить с использованием функции пользователя G(12, S)+G(T, S)–G(2S–1, S·T) где G(A, B) = (2·A+B·B)/(A·B·2+B·5).
Библиографический список
Слепцова, Л.Д. Программирование на VBA: Самоучитель / Л.Д. Слепцова. – СПб.: Компьютерное издательство «Диалектика», 2004. – 384 с.
Эйткен, П. Разработка приложений на VBA в среде Office XP / П. Эйткен; пер. с англ. – М.: Изд. дом «Вильямс», 2003. – 496 с.
Штайнер, Г. VBA 6.3 / Г. Штайнер. – M.: Лаборатория Базовых знаний: Справочник, 2002. – 784 с.
Электронный учебник по VBA. Режим доступа: www/mini-soft.ru/soft/vba.
Оглавление
1 Основные этапы решения задач на ЭВМ
2 Элементы управления и пользовательская форма VBA
2.1 Элементы управления
2.2 Режим конструктора
2.3 Установка свойств элемента управления
2.4 Редактор кода
2.5 Пользовательская форма UserForm
2.5.1 Семейство Controls
2.5.2 Создание пользовательской формы
2.6 Общие свойства элементов управления
2.6.1 Соглашения об именах
2.7 Общие методы и события элементов управления
2.8 Стандартные объекты и элементы управления
2.8.1 Объект DataObject
2.8.2 Поле
2.8.3 Надпись
2.8.4 Кнопка
2.8.5 Список
2.8.6 Поле со списком
2.8.7 Полоса прокрутки и счетчик
2.8.8 Переключатель
2.8.9 Рамка
2.8.10 Флажок и выключатель
2.8.11 Рисунок
2.8.12 Ссылки на ячейки и диапазоны
2.8.13 Набор страниц
2.8.14 Набор вкладок
2.9 Последовательность выбора элементов управления
2.10 Диалоговые окна
2.10.1 Инициализация и отображение диалогового окна
2.10.2 Закрытие диалогового окна
2.10.3 Отображение встроенных диалоговых окон
3 Типы данных, переменные и константы
3.1 Типы данных
3.2 Описание переменных
3.2.1 Допустимые имена
3.3 Константы
3.4 Комментарии
4 Операции VBA
4.1 Математические операции
4.2 Операции отношения
4.3 Логические операции
4.4 Операции со строками
4.5 Приоритеты операций
4.6 Встроенные функции VBA
4.7 Функции преобразования форматов
4.7.1 Функции обработки строк
4.8 Инструкции VBA
4.8.1 Оператор присваивания
4.8.2 Расположение нескольких операторов на одной строке
5 Ввод и вывод информации
6 Реализация разветвляющихся алгоритмов в VBA
7 Операторы цикла
8 Массивы
9 Подпрограммы
9.1 Процедуры
9.2 Переход в подпрограмму и возвращение из подпрограммы
9.3 Вызов процедуры
9.4 Область определения переменной
9.5 Время жизни переменной
9.6 Рекурсивные процедуры
10 Работа с файлами
10.1 Типы файлов в VBA
10.2 Открытие и закрытие файла
10.3 Ввод данных в файл последовательного доступа
10.4 Вывод данных из файла последовательного доступа
10.5 Работа с файлом произвольного доступа
10.6 Наиболее употребляемые инструкции и функции при работе с файлами
11 Примеры решения задач и порядок разработки программ
11.1 Линейный алгоритм
11.2 Разветвляющийся алгоритм
11.3 Циклический алгоритм
11.4 Одномерный массив
11.5 Вложенные циклы. Двумерные массивы
11.6 Файлы произвольного доступа
12 Практические задания
12.1 Линейный алгоритм: вычисление арифметического выражения
12.2 Линейный алгоритм: вычисление по математическим и физическим формулам
12.3 Разветвляющийся алгоритм: выбор по условию
12.4 Циклический алгоритм: цикл с параметром
12.5 Циклический алгоритм: цикл с предусловием
12.6 Циклический алгоритм: цикл с постусловием
12.7 Одномерные массивы (векторы)
12.8 Вложенные циклы. Двумерные массивы (матрицы)
12.9 Массивы: сортировка, поиск минимального (максимального) элемента
12.10 Строковый тип данных
12.11 Файлы произвольного доступа
12.12 Файлы последовательного доступа
12.13 Подпрограммы пользователя (процедуры)
12.14 Подпрограммы пользователя (функции)
Библиографический список