Sie sind auf Seite 1von 100

Министерство образования и науки Российской Федерации

федеральное государственное бюджетное образовательное учреждение


высшего профессионального образования
«Санкт-Петербургский государственный технологический институт
(технический университет)»

Кафедра системного анализа

А.В. Гайков

ИНФОРМАТИКА
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ VISUAL BASIC

Учебное пособие
для студентов заочной формы обучения
по направлениям подготовки
15.03.04 - Автоматизация технологических процессов и производств
27.03.03 - Системный анализ и управление в химической технологии

Санкт-Петербург
2015
ОГЛАВЛЕНИЕ

Введение………………………………………………………………………………………… 3
1 АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ…………………………………………………... 5
1.1 Теоретическая часть……………………………………………………………………… 6
1.2 Пример выполнения задания……………………………………………………………. 6
2 ЛИНЕЙНЫЕ АЛГОРИТМЫ……………………………………………………………... 7
2.1 Теоретическая часть……………………………………………………………………… 7
2.2 Ввод и вывод данных при помощи текстового окна………………………………... 12
2.3 Ввод и вывод данных с помощью системных функций InputBox() и MsgBox()…. 17
2.4 Пример выполнения задания……………………………………………………………. 19
3 РАЗВЕТВЛЯЮЩИЕСЯ ПРОЦЕССЫ…………………………………………………… 22
3.1 Теоретическая часть……………………………………………………………………… 22
3.2 Пример выполнения задания……………………………………………………………. 31
4 ЦИКЛЫ С ПАРАМЕТРАМИ……………………………………………………………... 33
4.1 Теоретическая часть……………………………………………………………………… 33
4.2 Пример выполнения задания……………………………………………………………. 43
5 ЦИКЛЫ С ПРЕДУСЛОВИЕМ……………………………………………………………. 46
5.1 Теоретическая часть……………………………………………………………………… 46
5.2 Пример выполнения задания……………………………………………………………. 53
6 ЦИКЛЫ С ПОСТУСЛОВИЕМ…………………………………………………………… 56
6.1 Теоретическая часть……………………………………………………………………… 56
6.2 Пример выполнения задания……………………………………………………………. 59
7 ВЛОЖЕННЫЕ ЦИКЛЫ…………………………………………………………………… 61
7.1 Теоретическая часть……………………………………………………………………… 61
7.2 Пример выполнения задания……………………………………………………………. 64
8 ОДНОМЕРНЫЕ МАССИВЫ……………………………………………………………... 66
8.1 Теоретическая часть……………………………………………………………………… 66
8.2 Пример выполнения задания……………………………………………………………. 79
9 МНОГОМЕРНЫЕ МАССИВЫ…………………………………………………………… 82
9.1 Теоретическая часть……………………………………………………………………… 82
9.2 Пример выполнения задания……………………………………………………………. 94
10 ПРОЦЕДУРЫ И ФУНКЦИИ, СОЗДАВАЕМЫЕ ПОЛЬЗОВАТЕЛЕМ……………. 97
10.1 Теоретическая часть 97
10.1.1 Процедура Sub…End Sub, создаваемая пользователем 97
10.1.2 Процедура Function…End Function, создаваемая пользователем 97
10.1.3 Передача параметров в процедуры Sub…End Sub и Function…End Function… 98
10.1.4 Рекурсивные функции……...………………………………………………………… 99
ЛИТЕРАТУРА…………………………………………………………………………………. 100

2
ВВЕДЕНИЕ

Язык программирования Visual Basic 2010 входит в состав интегрированной среды


разработки Microsoft Visual Studio 2010, которая включает в себя, кроме Visual Basic 2010,
следующие языки программирования высокого уровня: Microsoft Visual C++ 2010,
Microsoft C# 2010, Microsoft F# 2010 и другой инструментарий.
Язык программирования Visual Basic 2010 позволяет создавать приложения с
графическим интерфейсом, работающие в среде операционной системы Microsoft Windows,
содержит средства для разработки приложений взаимодействующих с базами данных,
приложений для работы с глобальной сетью Интернет. В пакет прикладных программ
Microsoft Office встроен язык программирования VBA (Visual Basic for Applications - Visual
Basic для приложений), представляющий усеченную версию языка Microsoft Visual Basic
2010. Таким образом, навыки программирования на Microsoft Visual Basic 2010 могут быть
использованы при программировании на VBA в электронных таблицах Microsoft Excel,
текстовом процессоре Microsoft Word и в системе управления базами данных Microsoft
Access.
В учебном пособии приводятся необходимые сведения по разработке алгоритмов и
программ на языке программирования высокого уровня Visual Basic 2010, содержащие:
- ввод и вывод данных, в том числе и с помощью файлов;
- составление арифметических выражений;
- составление разветвляющих алгоритмов и программ, где на определенном этапе
производится выбор очередного выполняемого оператора в результате анализа некоторых
условий;
- составление циклических алгоритмов и программ, использующих различные типы циклов:
циклы с предусловием, циклы с постусловием, циклы с параметром и вложенные циклы;
- составление программ с использованием одномерных и многомерных массивов.
В пособии приводится большое количество примеров решения задач по
программированию на языке высокого уровня Visual Basic 2010, иллюстрированных блок-
схемами, а также, дается описание конструкций языка программирования высокого уровня
Visual Basic 2010 и методов сортировки массивов данных. В конце каждой темы приводится
пример выполнения задания, включающий в себя изображение формы разработанного
приложения, блок-схему алгоритма и программный код.
В приложениях к тексту пособия приведены задания для самостоятельного решения
ко всем темам, рассмотренным в данном пособии. Задания сгруппированы в равноценные
варианты. Каждый вариант представляет собой набор заданий по всем темам,
рассматриваемым в пособии.
Пользоваться учебным пособием рекомендуется следующим образом. Изложенные
темы следует изучать последовательно, в порядке их рассмотрения. Сначала необходимо
прочитать теоретическую часть по рассматриваемой теме. Затем, ознакомиться с примером
выполнения задания по этой же теме, и выполнить этот пример на компьютере. После этого
следует выполнить задание по теме, приведенное в приложении согласно своего варианта, и
обязательно проверить самостоятельное решение на компьютере. Исключением является
задание по теме "Арифметические выражения" - его можно не проверять на компьютере.
Номер варианта сообщает преподаватель на практическом занятии.
Каждое из заданий для самостоятельной работы содержит решение. Однако, это
решение специально приводится не полностью, а частично. Задача студента состоит в
дополнении программы и блок-схемы алгоритма до полного решения задания. Блок-схему
алгоритма можно взять за основу, а при желании студент может предложить свой вариант
блок-схемы и решения задачи (ведь программирование и составление алгоритмов
представляют собой творческий процесс). В этом случае, программа и блок-схема алгоритма
создаются студентом самостоятельно. Решения всех заданий, выданных преподавателем,

3
должны быть выполнены на компьютере, оформлены в виде отчетов и сданы преподавателю
как в печатном, так и электронном виде.
При выполнении заданий на компьютере необходимо придерживаться следующей
последовательности действий:
- создать графический пользовательский интерфейс (кроме задания по теме
"Арифметические выражения");
- набрать текст программы;
- запустить программу на выполнение;
- исправить ошибки, обнаруженные в процессе запуска и выполнения программы.
В ряде случаев, не следует пытаться решить всю задачу сразу. Как правило, задачи по
программированию решаются по частям, как последовательное решение более простых
подзадач.
После выполнения заданий для самостоятельной работы, обучающийся должен
научиться составлять алгоритмы решения задач разрабатывать программы на языке
высокого уровня Visual Basic 2010. Эти навыки могут быть использованы при освоении
учебных дисциплин, таких как "Основы процедурно-структурного программирования",
"Основы объектно-ориентированного программирования","Теория и технология
программирования", "Базы и банки данных", "Системный анализ химических технологий”,
"Теория принятия решений" и др.
Учебное пособие соответствует содержанию учебной дисциплины "Информатика" в
цикле математических и общих естественнонаучных дисциплин ФГОС ВПО по
направлениям подготовки бакалавров: "27.03.03 – Системный анализ и управление в
химической технологии", "15.03.04 – Автоматизация технологических процессов и
производств".
В данном учебном пособии принято стандартное следующее соглашение, которое
используется при написании программ в языке Visual Basic: если оператор или выражение не
помещается в одной строке, то при переходе на следующую строчку в конце ставится символ
подчеркивания: _.
Примеры:
1. Арифметическое выражение не помещается в одну строку:

F=(X^(3/5)+Math.COS(X)^2-Math.EXP(-7*X+4))/(Math.LOG(Math.ABS(X-7*X^2))-_
4*Math.SQRT(Math.ABS(X)))

2. Заголовок процедуры не помещается в одну строку:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click

При написании программы в среде программирования перечисленных выше выражения и


заголовка процедуры в одну строку символ _ заменяется на пробел.

4
1 АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ

1.1. Теоретическая часть

Арифметические выражения образуются из констант, переменных, функций и


выражений, заключенных в круглые скобки, которые соединены знаками арифметических
операций. Стандартные математические функции Visual Basic приведены в таблице 1.

Таблица 1 – Стандартные математические функции Visual Basic

Математическая запись Запись на Visual Basic


x Math.SQRT(X)
x Math.ABS(X)
ln x Math.LOG(X)
ex Math.EXP(X)
cos x Math.COS(X)
sin x Math.SIN(X)
tg x Math.TAN(X)
arctg x Math.ATN(X)
Примеры арифметических выражений
xy X^Y
z
xy X^(Y/Z)
cos 2 x Math.COS(X)^2

В Visual Basic существуют следующие виды арифметических операций:


^ – возведение в степень;
- и + – присвоение знака числу (унарные операции);
* – умножение;
/ – деление;
\ – целочисленное деление;
mod – взятие остатка от деления;
+ – сложение, - – вычитание.
При составлении арифметических выражений необходимо учитывать приоритет
выполнения арифметических операций. Наивысший приоритет имеют стандартные
математические функции, затем – возведение в степень. После возведения в степень идет
присвоение знака числу. Умножение и деление осуществляется после присвоения знака
числу. Более низкий приоритет, за умножением и делением, имеют целочисленное деление и
взятие остатка от числа. Самый низкий приоритет у вычитания и сложения.
Операции в арифметических выражениях выполняются последовательно: слева на
право в порядке их приоритета. В ряде случаев, приоритет может быть изменен при помощи
скобок. При написании арифметических выражений, как правило, числитель и знаменатель
берутся в круглые скобки. Если знаменатель или числитель составляет только одна функция,
то скобки можно не ставить. Также скобки не ставятся, когда в числителе присутствуют
только операции умножения или деления, что укладывается в естественный ход вычисления
выражения: последовательно слева на право. Например, при вычислении выражения
7x3a 2
F= , скобки в числителе не ставятся, но обязательны в знаменателе:
5x 5
F=7*x^3*a^2/(5*x^5). Если скобки в знаменателе не поставить, то компилятор Visual Basic
разделит числитель на 5, а затем, результат умножит на x^5. В случае, когда арифметическое

5
выражение не помещается в одной строке, то при переходе на следующую строчку следует
поставить знак _ и продолжить запись выражения на следующей строке.

1.2 Пример выполнения задания

Пусть требуется написать арифметическое выражение на языке программирования


Visual Basic:

5
x 3 + cos 2 x − e −7 x + 4
F=
ln x − 7 x 2 − 4 x

Арифметическое выражение будет иметь следующий вид:


F=(X^(3/5)+Math.COS(X)^2-Math.EXP(-7*X+4))/(Math.LOG(Math.ABS(X-7*X^2))-_
4*Math.SQRT(Math.ABS(X)))
Более оптимальной для вычислений будет следующая запись:
F=(X^(3/5)+Math.COS(X)^2-Math.EXP(-7*X+4))/(Math.LOG(Math.ABS(X-7*X*X))-_
4*Math.SQRT(Math.ABS(X)))
Дело в том, что при возведении X в квадрат, X*X будет работать быстрее, чем X^2.
При однократном вычислении эта тонкость останется незаметной для пользователя, но
может привести к некоторой задержке выполнения программного кода при многократном
повторении в теле цикла с большими значениями его параметра.

6
2. ЛИНЕЙНЫЕ АЛГОРИТМЫ

2.1 Теоретическая часть

Microsoft Visual Basic является объектно-ориентированным языком


программирования. Он позволяет достаточно быстро создавать программные продукты,
работающие в среде операционных систем семейства Windows. Программирование на Visual
Basic состоит из двух основных этапов: визуального проектирования и написания
программного кода. На первом этапе разрабатывается пользовательский интерфейс
приложения: на форму наносятся элементы управления и устанавливаются их свойства. На
втором этапе пишется сама программа.
При запуске Microsoft Visual Studio 2010 на экране появляется начальная страница
(см. рисунок1).

Рисунок 1 - Начальная страница среды разработки Visual Studio 2010

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


расположенный в левой части окна. В зависимости от того, с каким из проектов работал
предыдущий пользователь вид следующего окна может отличаться (см. рисунки 2-3).
В случае если на экране появляются шаблоны, не принадлежащие языку Visual Basic,
необходимо раскрыть список шаблонов языка Visual Basic. Для этого необходимо выбрать
пункт меню Другие языки... и нажать на значок , расположенный слева от пункта Visual
Basic. В ряде случаев, достаточно просто раскрыть список с помощью значка ,
расположенного слева от пункта Visual Basic (см. рисунок 3). В центральной части окна
необходимо выбрать пункт Приложение Windows Forms, ввести имя проекта в поле Имя,
находящееся в нижней части окна и нажать на кнопку OK, которая расположена в левом
нижнем углу окна интегрированной среды разработки. Таким образом, при запуске Visual
Basic на экране появляются: панель элементов управления, окно свойств и изображение
формы (см. рисунок 4).

7
Рисунок 2 - Последний используемый шаблон относится к языку Visual Basic

Рисунок - 3 - Последний используемый шаблон относится к языку Visual C++

8
Рисунок 4 - Среда Visual Basic

Если пользователь нажмет на кнопку , то в память компьютера будет загружена


программа, которая начнет свою работу. Пользователь не написал еще ни одной строчки
программного кода, а программа уже обладает полной функциональностью приложения,
написанного для операционной системы Windows. Окно приложения можно развернуть во
весь экран, свернуть в панель задач, закрыть. При закрытии окна произойдет выход из
приложения. При создании подобной программы на Си или Паскале необходимо
предусмотреть перерисовку окон, кнопок, написать процедуры позиционирования курсора
мышки, осуществить обработку нажатия пользователем кнопок мышки. Программный код
такой программы будет составлять десятки машинописных страниц. В Visual Basic
программист избавлен от написания подобных процедур – за него программный код
стандартных операций написали программисты фирмы Microsoft. Для написания своей
прикладной программы программисту необходимо просто поместить требуемый набор
элементов управления (объектов) на форму и написать процедуры обработки событий,
связанных с данными объектами.
Рассмотрим стандартные элементы, расположенные на панели элементов управления:

- Элемент управления PictureBox (графическое окно). Данный элемент


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

9
визуального проектирования. Используя графические методы и операторы Visual Basic,
можно рисовать различные графические фигуры и строить графики.
- Элемент управления Label (надпись, метка). При помощи данного элемента
управления можно отображать сообщения на форме, подписывать другие элементы
управления, выводить статический текст на форму. Текст, выводимый с помощью метки на
форму, не может быть изменен пользователем.
Для изменения текста, отображаемого на форме с помощью метки, как на этапе визуального
проектирования, так и программным путем, используется свойство Text. Чтобы позволить
метке автоматически подстраиваться под размер содержимого, нужно установить в True (Да)
свойство AutoSize. В этом случае метка будет подстраиваться под размер текста,
содержащегося в свойстве Text. Следует заметить, что свойство AutoSize может быть
изменено только на этапе визуального проектирования.
- Элемент управления TextBox (текстовое окно). Текстовые окна являются
основными элементами управления для ввода и вывода информации на форму. Как правило,
текстовые окна используются для реализации диалога с пользователем путем ввода с
клавиатуры исходной информации. Чаще всего данный элемент управления используется
вместе с меткой, которая выводит надпись перед текстовым окном. Информация,
отображаемая на форме при помощи текстового окна, содержится в свойстве Text.
- Элемент управления GroupBox (рамка). Данный элемент управления служит
контейнером и используется для группировки элементов управления. Чаще всего, рамки
объединяют в группы переключатели, выделяют элементы управления по смысловому
принципу. Объекты, объединенные с помощью рамки, представляют собой группу и их
можно перемещать, делать видимыми и невидимыми как единое целое. Для этого достаточно
изменять только свойства рамки. Наиболее часто в рамки помещают переключатели и
флажки. Переключатели, находящиеся внутри рамки, работают как самостоятельная группа
и не влияют на состояние переключателей в других рамках или просто помещенных на
форму. Элемент управления GroupBox для подписи группы использует свойство Text.
- Элемент управления Button (командная кнопка). Командные кнопки являются
одним из самых важных элементов управления и используются практически во всех
приложениях для инициирования, прерывания или завершения процессов в программе.
Также они предназначены для создания диалога с пользователем и управлением программой.
При щелчке мышью на командной кнопке инициируется событие Click и вызывается код,
введенный в процедуру этого события. Командная кнопка имеет заголовок, выводимый на
форму, для изменения которого может быть использовано свойство Text.
- Элемент управления CheckBox (флажок). Данный элемент управления
позволяет пользователю выбрать из ряда вариантов один или несколько. Флажок может
находиться как в установленном, так и в сброшенном состоянии. Одновременно может быть
сброшено или установлено несколько флажков. Для подписи флажков на форме
используется свойство Text. Проверить установлен или сброшен флажок можно
программным путем, используя свойство Checked.
- Элемент управления RadioButton (опция, переключатель, радиокнопка).
Данные элементы управления позволяют пользователю выбрать только одну опцию из
группы и используются когда необходимо выбрать только одну из нескольких имеющихся
возможностей. При установке одной из опций, все остальные опции, расположенные в
пределах группы, автоматически сбрасываются. Для формирования нескольких групп
переключателей на форме необходимо использовать контейнеры, например, рамки или
графические поля. Для подписи опций используется свойство Text. Проверить установлена
опция или нет, можно программным путем с помощью свойства Checked.
- Элемент управления ListBox (список). Списки позволяют пользователю выбрать
один элемент списка из имеющихся. Редактирование списка пользователем невозможно –
оно осуществляется только программным путем. Также, пользователь не может ввести в

10
список новое значение. Для доступа к элементам списка программным путем используются
свойства SelectedIndex и Text.
- Элемент управления ComboBox (комбинированный список, поле со
списком). Данный элемент управления представляет собой комбинацию, состоящую из двух
элементов управления - текстового окна и списка. Использование данного элемента
управления позволяет пользователю выбрать требуемое значение из списка, а также,
добавлять в него новые значения. Новое значение после ввода автоматически помещается в
список. Информация, отображаемая на форме, содержится в свойстве Text
комбинированного списка. Для доступа к элементам комбинированных списков
программным путем используются свойства SelectedIndex и Text.
- Элементы управления HScrollBar и VScrollBar (горизонтальная
и вертикальная линейки прокрутки). Данные элементы управления отличаются друг от друга
только ориентацией на форме и имеют аналогичные свойства и события. Линейки прокрутки
могут быть использованы для динамического изменения каких-либо исходных данных в
программе. Например, при написании программы моделирующей работу реактора
идеального вытеснения, линейка прокрутки может быть применена для изменения
концентрации исходного вещества. Чаще всего у этих элементов управления используются
следующие свойства: Minimum – устанавливает минимальное значение линейки прокрутки,
Maximum – устанавливает максимальное значение линейки прокрутки и Value – текущее
значение линейки прокрутки.
-Элемент управления Timer (Таймер). Данный объект позволяет выполнять
процедуру обработки события Tick через определенный промежуток времени, указанный в
свойстве Interval и не зависит от пользователя. Свойство Interval определяет количество
времени в миллисекундах, через которое осуществляется вызов процедуры обработки
события Tick. Таймер можно использовать для разработки программ, имеющих
динамические объекты и вывода системного времени. В момент выполнения программы,
таймер является невидимым объектом на форме.
Работу в интегрированной среде разработки Visual Basic рассмотрим на примере
создания простейшего приложения. Пусть требуется вычислить значение функции:

x − 7 ⋅ cos a
y= ,
ln( x − 3)

где угол a задан в градусах.

Любая обработка данных на компьютере, как правило, состоит из следующих


основных этапов: ввод данных, обработка данных и вывод результатов. Составим блок-схему
решения приведенной выше задачи (рисунок 5).

11
НАЧАЛО

Ввод: x, a

a=a*3.14/360

x − 7 ⋅ cos a
y =
ln( x − 3 )

Вывод: y

КОНЕЦ

Рисунок 5 – Блок-схема решения задачи

Блок-схема алгоритма – это графическое представление алгоритма, дополненное


элементами словесной записи. Каждый пункт алгоритма на схеме отображается некоторой
геометрической фигурой–блоком (блочным символом), причем, разным по типу
выполняемых действий блокам соответствуют различные геометрические фигуры.
Графические символы на схемах соединяются линиями потока информации.
Основное направление потока информации идет сверху вниз и слева направо. В данном
случае стрелки на линиях можно не ставить. В других случаях применение стрелок
обязательно. Основные блочные символы, чаще всего использующиеся при построении
блок-схем приведены в таблице 2.
При составлении блок-схемы был проведен анализ условия задачи и предусмотрен
перевод параметра а из градусов в радианы, так как стандартные тригонометрические
функции Visual Basic работают только с радианной мерой угла.
Рассмотрим основные способы ввода и вывода данных.

2. 2 Ввод и вывод данных при помощи текстового окна ( )

Элемент управления может быть использован как для ввода, так и для
вывода данных. Все данные, которые отображаются на форме, содержатся в свойстве Text
текстового окна (вообще, все данные, отображаемые на форме, как правило, содержатся в
свойстве Text.
Доступ к свойствам объектов Visual Basic программным путем осуществляется по
следующей схеме: Имя_Объекта.Свойство. Например, для того чтобы присвоить
переменной вещественного типа одинарной точности числовое значение, содержащееся в
текстовом окне, необходимо написать в программе следующий оператор присваивания:
x=CSng(TextBox1.Text). В данном случае, TextBox1 –имя текстового окна (объект TextBox).
Как было отмечено выше, содержимое текстового окна содержится в свойстве Text в
символьном виде (тип String).

12
Таблица 2 - Основные блочные символы
№ Блочный символ Назначение блочного символа
п.п.
Обозначает начало и конец основного и
1. начало , конец вспомогательного алгоритма.

Ввод или вывод Обозначает ввод исходных данных или


2. вывод результатов.

Процесс, Предопределенный Процесс, обозначает вычисления по


3. процесс формулам и другие преобразования
данных.
, Предопределенный процесс обозначает
вызов подпрограммы.
Условный Условный блок предназначен для
4. блок обозначения условий и используется в
да нет
условие разветвляющихся алгоритмах.

Цикл с Используется при обозначении


5. параметром заголовка цикла с параметром, имеет
два входа и два выхода.

Преобразование символов из строкового типа в число вещественного типа одинарной


точности осуществляет функция CSng(). Для преобразования числового типа в строковый
используется функция CStr(). Основные функции преобразования типов приведены в
таблице 3.
Таблица 3 – Функции преобразования типов
Функция Описание
CBool() Преобразует переменную строкового типа (String) в тип Boolean
CByte() Преобразует переменную строкового типа (String) в тип Byte
CCur() Преобразует переменную строкового типа (String) в тип Currency
CDate() Преобразует переменную строкового типа (String) в тип Date
CDbl() Преобразует переменную строкового типа (String) в тип Double
CInt() Преобразует переменную строкового типа (String) в тип Integer
CLng() Преобразует переменную строкового типа (String) в тип Long
CSng() Преобразует переменную строкового типа (String) в тип Single
CStr() Преобразует числовую переменную в строковый тип String
Val() Преобразует переменную строкового типа (String) в числовой тип

Для решения задачи нам понадобятся: три надписи, три текстовых окна и две кнопки.
Для того чтобы поместить первую метку на форму необходимо проделать следующие
действия:
1. Щелкните на элементе управления Label .
2. На форме, в том месте, куда вы хотите поместить надпись, при помощи
манипулятора мышь нарисуйте прямоугольник.
3. Появившаяся по умолчанию надпись Label1 на форме, пользователю ни о чем не
говорит. По-этому щелкните левой кнопкой мышки напротив свойства Text окна
свойств, удалите надпись Label1 и напишите X.

13
4. Установите свойство AutoSize в положение True. Данное свойство позволит
произвести выравнивание метки по ширине помещенного в нее текста.
Аналогично поместите на форму надписи для A и Y.
Ввод и вывод данных будет осуществляться через текстовые окна. Поместите на форму
три текстовых окна, произведя следующие действия:
1. Щелкните левой кнопкой мышки на элементе управления TextBox .
2. На форме, в том месте, куда вы хотите поместить текстовое окно, с помощью мыши
нарисуйте прямоугольник.
3. Измените свойство Text на пустую строку.
Для переменных А и Y создайте еще два текстовых окна.
Чтобы поместить кнопку на форму, щелкните мышью на элементе управления Button
. Измените свойство Text с Button1 на РЕШЕНИЕ. Поместив вторую кнопку на
форму, измените ее свойство Text на ВЫХОД.
Таким образом, мы закончили этап визуального проектирования, разработав
пользовательский интерфейс приложения. Ваша форма должна выглядеть примерно так, как
показана на рисунке 3.

Рисунок 3 – Окно формы приложения


Переходим ко второму этапу – написанию программного кода. Дважды щелкните
мышью на кнопке Button2 (ВЫХОД). На экране появится окно редактора программного кода
(см. рис. 4).

Рисунок 4 – Окно редактора программного кода


14
В этом окне появилась «заготовка» для процедуры обработки события Click, которое
происходит при нажатии пользователем на кнопке ВЫХОД. Между появившимися
строчками редактора напишите оператор End. Данный оператор завершает выполнение
программы, закрывает и выгружает из памяти компьютера все формы приложения, удаляет
переменные из памяти компьютера.
Перейдите снова в окно формы и дважды щелкните мышью на кнопке РЕШЕНИЕ. В
появившемся окне, между строчками Private Sub Button1_Click(sender As System.Object, e
As System.EventArgs) Handles Button1.Click и End Sub, напишите следующий
программный код:

Dim x As Single, y As Single, a As Single


x = CSng(TextBox1.Text)
a = CSng(TextBox2.Text)
a = 3.1415926 * a / 360
y = Math.Sqrt(Math.Abs(Math.Sqrt(Math.Abs(x – 7 *Math.Cos(a))) / Math.Log(x – 3)))
TextBox3.Text = CStr(y)

В результате программный код вашего приложения должен иметь следующий вид:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim x As Single, y As Single, a As Single
x = CSng(TextBox1.Text)
a = CSng(TextBox2.Text)
a = 3.1415926 * a / 360
y = Math.Sqrt(Math.Abs(Math.Sqrt(Math.Abs(x - 7 * Math.Cos(a))) / Math.Log(x - 3)))
TextBox3.Text = CStr(y)
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

Рассмотрим подробнее программный код. В первой строке описываются переменные.


Переменные используются во время выполнения программы для временного хранения
данных в оперативной памяти компьютера. Каждая переменная в Visual Basic должна иметь
имя и принадлежать к одному из типов переменных. С помощью имен осуществляется
привязка переменных к их положению в памяти компьютера, а тип переменной определяет,
какого рода информация в ней хранится. При назначении имени переменной необходимо
придерживаться следующего правила.
Имя переменной выбирается произвольно, но:
- имя переменной должно начинаться только с буквы (не с цифры или специального
символа);
- в оставшейся части имени можно использовать произвольную комбинацию букв, цифр, и
символов подчеркивания _. В именах переменных нельзя использовать пробелы, точки и
другие знаки препинания;

15
- имя переменной должно быть уникальным в пределах зоны ее видимости. Зона видимости
зависит от способа объявления переменной;
- длина имени переменной не должна превышать 255 символов;
- нельзя назначать имя переменной, если оно совпадает с одним из ключевых слов Visual
Basic.
Основные типы переменных представлены в таблице 4.

Таблица 4 – Основные типы переменных Visual Basic.


№ Тип Описание типа Количество Принимаемые
п.п. переменной занимаемой значения
памяти
1. Integer Целое число одинарной 2 байта -32768…32767
точности.
2. Long Целое число двойной 4 байта -2 147 483 648…
точности. 2 147 483 647
3. Single Десятичное число с
плавающей точкой одинарной 4 байта ±(10-45…3·1038)
точности
4. Double Десятичное число с
плавающей точкой двойной 8 байт ±(5·10-
328
точности …1.8·10308)
5. Currency Десятичное число с 8 байт ±9·1014
фиксированной точкой
6. String Строка символов 1 байт/ 1 До 65 400 символов
символ
7. Byte Целое число 1 байт 0…255
8. Boolean Логическое значение 2 байта True или False
9. Date Дата и время 8 байт 1/1/100…12/31/9999
10. Object Экземпляр класса объекта OLE 4 байта
11. Variant Любой из выше 16 байт +
перечисленных типов 1байт/1символ

Перед использованием в программе, переменная должна быть объявлена. При


объявлении переменной, ей присваивается имя и определяется тип, к которому она должна
принадлежать. Если программистом тип переменной не указан, то в Visual Basic она, по
умолчанию, будет иметь тип Variant. В Visual Basic для описания переменных используется
оператор Dim. Формат оператора имеет следующий вид:

DIM <имя переменной> AS <тип переменной>.

Например, чтобы объявить переменную a как вещественное число, необходимо написать


следующую строку программного кода:

DIM a AS Single

Если требуется объявить несколько переменных в одной строке, то может быть


использована следующая конструкция:

DIM <имя_переменной1> AS <тип_переменной1>,<имя_переменной2> AS <тип_переменной2>

В данной конструкции ключевое слово DIM записывается один раз, затем через
запятую записываются переменные и их типы. Между именами переменных и их типами

16
записываются ключевые слова As. При объявлении нескольких переменных с помощью
конструкции:

DIM <имя_ переменной1>, <имя_переменной2>, <имя_переменной3> AS <тип_переменной>

все переменные будут иметь один и тот же тип, который задается после ключевого слова AS.
Следующие строчки программного кода вводят значения переменных x и a:
x = CSng(TextBox1.Text)
a = CSng (TextBox2.Text)
Переменным x и a присваивается содержимое тестовых окон TextBox1 и TextBox2
соответственно. Содержимое текстовых окон в среде программирования Visual Basic
содержится в свойстве Text в виде строки символов (тип String). Поэтому, для
преобразования строки символов в вещественное число, используется функция CSng().
Строка a = 3.1415926 * a / 360 осуществляет перевод из градусной меры угла в
радианную.
Арифметическое выражение вычисляется в строке:

y = Math.Sqrt(Math.Abs(Math.Sqrt(Math.Abs(x – 7 * Math.Cos(a))) / Math.Log(x – 3)))

Вывод параметра y записан в строке TextBox3.Text = CStr(y). Здесь свойству Text


текстового окна TextBox3 присваивается значение результата вычислений у. Перевод
числового значения переменной у в символьный тип осуществляется функцией CStr().

2.3 Ввод и вывод данных с помощью системных функций InputBox() и MsgBox()

Для ведения диалога с пользователем, ввода и вывода данных, могут быть


использованы системные функции Visual Basic InputBox() и MsgBox(). Ввод данных в Visual
Basic может осуществляться с помощью системной функции InputBox(). Эта функция
возвращает строку символов и имеет следующий синтаксис:

Variable=InputBox(“Сообщение“,”Заголовок”,”Значение по умолчанию”)

В результате выполнения этого программного кода, на экране должно появиться окно,


содержащее заголовок, текст сообщения, кнопки и поле ввода (см. рис. 5):

Рис. 5 – Окно системной функции Visual Basic InputBox()

Функция InputBox(), при нажатии пользователем на кнопку Ok возвращает строку


символов (тип переменной String). Если же пользователь нажмет на кнопку Cancel, то
функция возвратит пустую строку, в независимости от содержимого поля ввода.
Для вывода данных можно воспользоваться системной функцией MsgBox(). Данная
функция выводит сообщения на экран монитора и возвращает целочисленное значение кода
нажатой пользователем кнопки. Функция имеет следующий формат:
<Переменная>=MsgBox(“<Сообщение>”,<значок>+<набор кнопок >,”<Заголовок>”)
Например, при выполнении следующей строки программного кода:

17
z=MsgBox(“Сообщение”, vbCritical + vbAbortRetryIgnore, “Заголовок”)
на экран будет выведено окно сообщения, изображенное на рисунке 6.

Рис 6 – Окно сообщения системной функции MsgBox()


во время выполнения программы

В таблице 5 представлены основные константы Visual Basic, используемые в качестве


параметров функции MsgBox().
Таблица 5 – Основные параметры системной функции InputBox()
Изображения значков
Значок Константа
vbCritical

vbExclamation

vbInformation

VbQuestion

Наборы кнопок
Константа Набор кнопок и возвращаемые значения
vbOkOnly
1
vbOkCancel
1 2
vbAbortRetryIgnore
3 4 5
vbRetryCancel
4 2
vbYesNo
6 7
vbYesNoCancel
6 7 2

Напишем программу для приведенного выше примера, используя для ввода и вывода
функции InputBox() и MsgBox(). Блок-схема алгоритма останется точно такой же, как и в
предыдущем разделе. Форма приложения будет выглядеть, как показано на рисунке 7.

18
Рисунок 7 – Форма приложения

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim x As Single, y As Single, a As Single
x = CSng(InputBox("Введите x=", "Ввод данных", "3"))
a = CSng(InputBox("Введите a=", "Ввод данных", "35"))
a = 3.1415926 * a / 360
y = Math.Sqrt(Math.Abs(Math.Sqrt(Math.Abs(x - 7 * Math.Cos(a))) / Math.Log(x - 3)))
MsgBox("y=" + CStr(y))
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class
 
2.4 Пример выполнения задания

Задание. Составить блок-схему алгоритма и написать программу вычисления


арифметического выражения на языке программирования Visual Basic. Параметры a и
b ввести, используя текстовые окна, а параметры x и y ввести при помощи системной
функции InputBox().
x
x5 − x2 y + 2 + y3
y
F = cos 2 ( x − a) +
x y
1 − + tg ( x + a )
a b
Блок-схема и интерфейс программы (рис. 8, 9) будут иметь вид:

19
НАЧАЛО

Ввод: a,b,x,y

x
Z = x5 − x2 y + 2
+ y3
y

x y
K = 1− + tg ( x + a)
a b

Z
F = cos 2 ( x − a) +
K

Вывод: y

КОНЕЦ

Рисунок 8 – Блок-схема

Рисунок 9 – Интерфейс программы

20
Программный код:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim x As Single, y As Single
Dim a As Integer, b As Integer
Dim Z As Single, K As Single, F As Single
a = CInt(TextBox1.Text)
b = CInt(TextBox2.Text)
x = CSng(InputBox("x="))
y = CSng(InputBox("y="))
Z=x^5-x*x*y+x/y^2+y^3
K = 1 - x / a + y / b * Math.Tan(x + a)
F = Math.Cos(x - a) ^ 2 + Z / K
MsgBox("F=" + CStr(F))
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

21
3 РАЗВЕТВЛЯЮЩИЕСЯ ПРОЦЕССЫ

3.1 Теоретическая часть

Оператор условного перехода может иметь как линейный, так и блочный синтаксис.
Линейный синтаксис оператора IF…THEN имеет следующий формат:

IF <условие> THEN <оператор1>


<оператор2>
<оператор3>

Если <условие>, расположенное после ключевого слова IF соблюдается, то выполняется


<оператор1>, затем последовательно выполняются операторы: <оператор2> и
<оператор3>. В случае несоблюдения условия <оператор1> пропускается, а выполняются
операторы: <оператор2> и <оператор3>.
Блок–схема данного формата имеет вид (рис. 10):

нет условие да

Оператор1

Оператор2

Оператор3

Рисунок 10 – Блок-схема

Используя данный формат оператора условного перехода необходимо помнить о


часто встречающихся ошибках. Например, при вычислении значения выражения параметра
y в зависимости от условий:

⎧a − b, если a > b
y=⎨ , наиболее распространенной является следующая ошибка:
⎩a + b, если a ≤ b

IF a>b THEN y=a-b


y=a+b

Проанализируем работу данного фрагмента при следующих заданных значениях


параметров a = 5, b = 7 . При данных значениях параметров a и b , условие расположенное
после ключевого слова IF не соблюдается, а следовательно, результатом выполнения
программного кода будет значение y = 5 + 7 = 12 . Начинающий программист, проверив на
тестовом примере программу, убеждается в правильности ее работы. Но, в программе
имеется логическая ошибка! При значениях параметров a = 5, b = 3 , условие

22
расположенное после ключевого слова IF соблюдается, и начинают выполняться два
оператора присваивания: сначала y = 5 − 3 = 2 , а затем - оператор y = 5 + 3 = 8 . Таким
образом, окончательным значением арифметического выражения будет 8, что приведет, при
истинности условия, к неверному результату, хотя при несоблюдении условия программа
работает корректно. Для того, чтобы избежать подобные недоразумения, в первых версиях
языка программирования Basic использовался оператор безусловного перехода GOTO. Этот
оператор передает управление на строчку программного кода приложения, перед которой
ставится метка. Формат оператора безусловного перехода имеет следующий вид:

<операторы>

GOTO <метка>
<операторы>
<метка>:
<операторы>

Фрагмент программы, рассмотренного выше примера, будет корректно работать, если


в нее внести следующие изменения:

IF a>b THEN y=a-b : GOTO m1


y=a+b
m1:

Однако следует заметить, что в настоящее время использование оператора GOTO в


программном коде является плохим стилем программирования, а в учебном процессе
может привести к снижению оценки при решении задачи, так как Visual Basic в своем
арсенале содержит достаточное количество управляющих конструкций, позволяющих
избежать использование оператора GOTO.
Линейный синтаксис оператора условного перехода имеет второй вид формата,
который наиболее подходит к решению рассмотренной выше задачи:

IF <условие> THEN <оператор1> ELSE <оператор2>


<оператор3>

Если <условие>, расположенное после ключевого слова IF соблюдается (является


истинным), то выполняется <оператор1>, <оператор2> пропускается, затем выполняется
<оператор3>. При несоблюдении условия <оператор1> пропускается, а выполняются
операторы <оператор2> и <оператор3>. Блок-схема данного типа синтаксиса условного
оператора имеет вид (рис. 11):

23
да условие нет

Оператор1 Оператор2

Оператор3

Рисунок 11 – Блок-схема
Рассмотренный выше фрагмент программного кода, при использовании данного
формата оператора записывается следующим образом:
IF a>b THEN y=a-b ELSE y=a+b
Рассмотрим следующий пример. Пусть требуется вычислить значение выражения в
зависимости от условий.
⎧⎪ x − 7 , если x < 7
y=⎨
⎪⎩ x , если x ≥ 7
Составим блок-схему алгоритма решения данной задачи (см. рис. 12)

НАЧАЛО

Ввод: x

x>7

y= x−7 y= x

Вывод: y

КОНЕЦ
Рисунок 12 – Блок-схема
Напишем программный код данного приложения. Форма приложения будет иметь
следующий вид (см рис.13).

24
Рисунок 13 – Форма приложения

Таблица 6 – Описание интерфейса


Объект Свойство Значение
Name TextBox1
Text
Текстовое окно Height 285
(TextBox) Width 1215
Left 600
Top 720
Name TextBox2
Text
Height 285
Текстовое окно Width 1215
(TextBox) Left 600
Top 1320
Name Label1
Text X
Метка (Label) Left 360
Top 720
AutoSize True
Name Label2
Text Y
Метка (Label) Left 360
Top 1320
AutoSize True
Name Button1
Text РЕШЕНИЕ
Командная кнопка (Button) Left 480
Top 2040
Width 1335
Height 375
Name Button2
Text ВЫХОД
Командная кнопка (Button) Left 2160
Top 2040
Width 1335
Height 375
25
Программный код

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim x As Single, y As Single
x = CSng(TextBox1.Text)
If x >= 7 Then y = Math.Sqrt(x) Else y = Math.Sqrt(Math.Abs(x - 7))
TextBox2.Text = CStr(y)
End Sub

End Class

Рассмотренная выше задача может быть решена еще одним способом:

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim x As Single, y As Single
x = CSng(TextBox1.Text)
If x >= 7 Then y = Math.Sqrt(x)
If x < 7 Then y = Math.Sqrt(Math.Abs(x - 7))
TextBox2.Text = CStr(y)
End Sub

End Class
 
В данном случае использованы два оператора условного перехода, следующие друг за
другом. Такое использование линейного синтаксиса оператора возможно при решении
следующей задачи. Пусть требуется вычислить значение параметра y в зависимости от
условий:

⎧a + b, если a<b
⎪a + b

y=⎨ , если a=b
⎪ 2
⎪⎩a − b, если a>b

Изображение формы приведено на рисунке 14.

26
Рисунок 14 – Рисунок формы

Блок-схема для решения данной задачи изображена ниже (рис. 15):


НАЧАЛО

Ввод: a, b

да нет
a<b

да нет
y=a+b a=b

a+b y=a-b
y=
2

Вывод: y

КОНЕЦ

Рисунок 15 – Блок-схема

При составлении блок-схемы этой задачи, можно заметить, что три условия
являются взаимоисключающими друг друга, поэтому в блок-схеме используется два
условных блока: если a не меньше чем b и если a не равно b, то, следовательно, a больше чем
b. Таким образом, если мы имеем дело с взаимоисключающими условиями, то условных
блоков будет на единицу меньше чем условий.
Программный код задачи приведен ниже:

27
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Integer, b As Integer, y As Single
a = CInt(InputBox("a="))
b = CInt(InputBox("b="))
If a < b Then y = a + b
If a = b Then y = (a + b) / 2
If a > b Then y = a - b
MsgBox("y=" + CStr(y))
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

Рассмотрим одну из распространенных ошибок наиболее часто встречающуюся при


решении таких задач. Следующий программный код будет неверен!

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Integer, b As Integer, y As Single
a = CInt(InputBox("a="))
b = CInt(InputBox("b="))
If a < b Then y = a + b
If a = b Then y = (a + b) / 2 Else y = a - b
MsgBox("y=" + CStr(y))
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

Здесь ошибка заключается в том, что при соблюдении условия a<b, выполнится
оператор присваивания y=a+b и управление будет передано на следующий оператор IF. При
выполнении второго оператора условного перехода условие a=b не соблюдается (так как a<b)
и выполняется ветвь ELSE. В результате значение параметра y станет равным y=a-b, а
значение y=a+b будет утрачено. Для решения такого типа задач рекомендуется использовать
блочный синтаксис оператора условного перехода.

Блочный синтаксис оператора условного перехода может иметь следующие виды


форматов:

28
1)
IF <условие> THEN
<блок операторов>
END IF

Если <условие>, расположенное после ключевого слова IF соблюдается, то


выполняется <блок операторов>, расположенный между ключевыми словами THEN и END
IF, затем управление передается на следующий оператор, расположенный за ключевым
словом END IF. В случае, когда условие не соблюдается, <блок операторов> пропускается и
управление передается на следующий оператор, который расположен после ключевого слова
END IF. Признаком блочного синтаксиса является переход на следующую строчку после
ключевого слова THEN и наличие ключевого слова END IF. Под обозначением <блок
операторов> подразумевается любое количество различных операторов Visual Basic.
Программный код, использующий блочный синтаксис оператора условного перехода
для рассмотренного выше примера, может быть написан следующим образом:
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Integer, b As Integer, y As Single
a = CInt(InputBox("a="))
b = CInt(InputBox("b="))
If a < b Then
y=a+b
End If
If a = b Then
y = (a + b) / 2
End If
If a > b Then
y=a-b
End If
MsgBox("y=" + CStr(y))
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

Для начинающих программистов, во избежание логических ошибок рекомендуется


использовать данный формат оператора, так как он является более наглядным.

2) Второй вариант формата блочного синтаксиса оператора условного перехода представлен


ниже:

IF <условие> THEN
<блок операторов №1>
ELSE
<блок операторов №2>
END IF

29
Данный формат оператора работает следующим образом. Если <условие>,
расположенное после ключевого слова IF соблюдается, то выполняется <блок операторов
№1>, расположенный межу ключевыми словами THEN и ELSE. Затем, управление
передается на оператор, следующий после ключевого слова END IF. При несоблюдении
условия, <блок операторов №1> пропускается, выполняется <блок операторов №2>,
находящийся между ключевыми словами ELSE и END IF и управление передается на
следующий оператор, расположенный после ключевого слова END IF.
Приведем пример написания программы с данным типом формата. Программный код
⎧⎪ x − 7 , если x < 7
вычисления функции y = ⎨ будет иметь следующий вид:
⎪⎩ x , если x ≥ 7

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim x As Single, y As Single
x = CSng(TextBox1.Text)
If x >= 7 Then
y = Math.Sqrt(x)
Else
y = Math.Sqrt(Math.Abs(x - 7))
End If
TextBox2.Text = CStr(y)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

3) Третий вариант формата блочного синтаксиса оператора условного перехода может быть
представлен следующим образом:

IF <условие №1> THEN


<блок операторов №1>
[ ELSEIF <условие №2> THEN
<блок операторов №2> ]
[ ELSEIF <условие №3> THEN
<блок операторов №3> ]
[ ELSEIF <условие №4> THEN
<блок операторов №4> ]
[ ELSE
<блок операторов №5> ]
END IF

Если <условие №1>, расположенное после ключевого слова IF соблюдается, то


выполняется <блок операторов №1>, находящийся между ключевым словом THEN и
строкой программного кода ELSEIF <условие №2> THEN, затем, управление передается на

30
следующий оператор, который располагается за ключевым словом END IF. При
несоблюдении <условия №1>, осуществляется проверка <условия №2>. При соблюдении
данного условия выполняется блок <операторов №2> и управление передается на оператор,
расположенный после ключевого слова END IF, которое обозначает конец блочного
оператора условного перехода. Таким образом, последовательно осуществляется проверка
условий и, в зависимости от их истинности выполняется тот или иной блок операторов. В
случае, когда ни одно из условий не соблюдается, выполняется блок <операторов №5>,
расположенный между ключевыми словами ELSE и END IF и управление передается на
следующий оператор, который располагается после ключевого слова END IF. Рассмотрим
пример программного кода вычисления функции

⎧a + b, если a<b
⎪a + b

y=⎨ , если a = b для данного формата оператора:
⎪ 2
⎪⎩a − b, если a>b

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Integer, b As Integer, y As Single
a = CInt(InputBox("a="))
b = CInt(InputBox("b="))
If a < b Then
y=a+b
ElseIf a = b Then
y = (a + b) / 2
Else
y=a-b
End If
MsgBox("y=" + CStr(y))
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

3.2 Пример выполнения задания

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


выражения, в зависимости от условий. Решение задачи показано на рис. 16 и 17.

⎧ x 2 + 3x 3 , если x<3
⎪ 3
⎪ 2x + x
y=⎨ 3 , если x=3
⎪ 2 x − e x

⎪ln x − 1 , если x>3


31
НАЧАЛО

Ввод: x

да нет
x<3

да нет
y = x 2 + 3x 3 x>3

y = ln x − 1 2x3 + x
y=
2x3 − e x

Вывод:y

КОНЕЦ

Рисунок 16 – Блок-схема

Рисунок 17 – Интерфейс программы

32
Программный код:

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim x As Single, y As Single
x = CInt(TextBox1.Text)
If x < 3 Then
y=x^2+3*x^3
ElseIf x = 3 Then
y = (2 * x ^ 3 + x) / (2 * x ^ 3 - Math.Exp(x))
Else
y = Math.Log(Math.Abs(x - 1))
End If
TextBox2.Text = CStr(y)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

4 ЦИКЛЫ С ПАРАМЕТРАМИ

4.1 Теоретическая часть

Большинство вычислительных алгоритмов может быть представлено в виде


циклически повторяющихся групп операторов. Операторы цикла служат для организации
циклов. Цикл представляет собой последовательность операторов, которая включает в себя
повторяющиеся конструкции операторов и должна выполняться более одного раза. Группу
повторяемых операторов называют телом цикла. При известном количестве итераций в
языке программирования Visual Basic может быть использован оператор цикла с параметром
For … Next. Данный оператор имеет следующий формат:
For <параметр>=<выражение1> To <выражение2> [Step <шаг>]
<операторы>
Next [<параметр>]
<параметр> - это параметр цикла, который представляет собой переменную
порядкового типа (иногда ее называют счетчиком). Данная переменная должна быть
определена в том же блоке, где находится оператор цикла.
<выражение1> и <выражение2> - соответственно начальное и конечное значения
параметра цикла, имеющие тип, совместимый с типом параметра цикла. Оператор цикла
обеспечивает выполнение тела цикла, которое состоит из операторов, расположенных
между заголовком и ключевым словом Next. При работе цикла осуществляется полный
перебор с соответствующим шагом <шаг> всех значений параметра цикла от начального
<выражение1> до конечного <выражение2>. Если шаг параметра цикла не указан, то по
умолчанию, он подразумевается равным единице.

33
Выполнение оператора цикла с параметром может быть прервано с помощью
оператора, предназначенного для преждевременного выхода из цикла EXIT FOR, который
передает управление на следующий оператор, расположенный после цикла.
Рассмотрим задачу табулирования функции. Пусть требуется написать программу,
вычисляющую значения функции на промежутке [a,b] c шагом h, вывести результаты и
построить график.
⎧3 x − 1 − 3.25, x < −1.25
⎪⎪
y = ⎨− x, − 1.25 ≤ x < 1.25

⎪⎩3.25 − 3 x + 1, x ≥ 1.25
При табулировании функции, ее значения вычисляются в теле цикла на каждом шаге,
а следовательно, вычисленных значений функции будет какое-то множество. Вывод
нескольких значений функции может быть осуществлен следующими способами:
- в текстовое окно TextBox, при условии, что установлено свойство MultiLine=True для
данного текстового окна;
- в список (элемент управления ListBox);
- в элемент управления DataGridView;
- в текстовый файл;
В процессе решения задачи мы рассмотрим все выше перечисленные способы вывода
значений функции на интервале.
Составим блок-схему для решения нашей задачи (см. рис. 18).

Рисунок 18 – Блок-схема

34
Составим программу для решения данной задачи, которая будет осуществлять вывод
аргумента функции x и ее значения y в текстовые окна. При создании формы будем
использовать пять меток, пять текстовых окон и две командные кнопки. Помещая элементы
управления на форму, объекты TextBox4 и TextBox5 сделайте большими и установите для
них свойство MultiLine в положение True или, нажав в правом верхнем углу текстового окна
на стрелку вправо, установите флажок слева от надписи Multiline (см. рис. 19). Форма
приложения должна выглядеть примерно так, как показано на рисунке 20.

Рисунок 19 - Задание текстовому окну свойства Multiline.

Рисунок 20 – Рисунок формы приложения использующего для вывода параметров


текстовые окна.

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

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
TextBox4.Text = ""
TextBox5.Text = ""
For x = a To b Step h
If x < -1.25 Then
y = 3 * Math.Sqrt(Math.Abs(x - 1)) - 3.25
ElseIf x >= 1.25 Then
y = 3.25 - Math.Sqrt(x + 1)
Else
y = -x
End If
TextBox4.Text = TextBox4.Text + CStr(x) + vbCrLf
TextBox5.Text = TextBox5.Text + CStr(y) + vbCrLf
Next x
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

Следующие строчки приведенной выше программы осуществляют вывод аргументов и


значений функции в текстовые окна.
TextBox4.Text = TextBox4.Text + CStr(x) + vbCrLf
TextBox5.Text = TextBox5.Text + CStr(y) + vbCrLf

Перед циклом производится очистка текстовых окон:

TextBox4.Text = ""
TextBox5.Text = ""

В теле цикла осуществляется присваивание текстовым окнам их содержимого, после


чего в них «дописываются» параметры: для текстового окна TextBox4 – x, для текстового
окна TextBox5 – y. Константа vbCrLf осуществляет переход на следующую строчку
текстового окна. Перевод строки осуществляется только при условии, что свойство
MultiLine текстового окна установлено в положение True.
Теперь напишем программу, использующую для вывода аргументов и значений
функций списки. Форма будет аналогична предыдущей, но вместо текстовых окон TextBox4
и TextBox5 будет содержать списки ListBox1 и ListBox2 (см. рис. 21).

36
Рисунок 21 – Изображение формы со списками

Для добавления элементов списка используется метод ListBox1.Items.Add(CStr(x)). 


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

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
ListBox1.Items.Clear()
ListBox2.Items.Clear()
For x = a To b Step h
If x < -1.25 Then
y = 3 * Math.Sqrt(Math.Abs(x - 1)) - 3.25
ElseIf x >= 1.25 Then
y = 3.25 - Math.Sqrt(x + 1)
Else
y = -x
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
Next x
End Sub

37
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
Handles Button2.Click
End
End Sub

End Class

Рассмотрим работу со списками ListBox. Для добавления элементов в список


программным путем используется метод Add коллекции Items элемента управления ListBox.
Добавляемый элемент должен иметь тип String:
ListBox1.Items.Add(“Элемент списка”)
или
X=2.45
ListBox1.Items.Add(CStr(X))
Свойства SelectedItem и SelectedIndex задают текст и индекс выделенного элемента
списка ListBox. Индексация элементов списка начинается с 0. Для очистки списка
используется метод Clear коллекции Items элемента управления ListBox:

ListBox1.Items.Clear().

Элементы списка ListBox можно удалять по их тексту и индексам. Для удаления элемента
списка по тексту используется метод Remove, а для удаления по индексы – метод RemoveAt:

ListBox1.ItemsRemove(“Текст”)
Listbox1.Items.RemoveAt(0)
или
. ListBox1.ItemsRemove(ListBox1.SelectedItem)
ListBox1.Items.RemoveAt(Listbox1.SelectedIndex)

Рассмотрим вариант вывода аргументов и значений функции в элемент управления


DataGridView. Вид формы разрабатываемого приложения с подключенным элементом
управления DataGridView приведен на рисунке 22.

Рисунок 22 – Вид формы разрабатываемого приложения


с элементом управления DataGridView

38
Программный код приложения будет иметь следующий вид.

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single, n As Integer
Dim table As New DataTable()
table.Columns.Add("X")
table.Columns.Add("Y")
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
n = Int((b - a) / h) + 1
For x = a To b Step h
If x < -1.25 Then
y = 3 * Math.Sqrt(Math.Abs(x - 1)) - 3.25
ElseIf x >= 1.25 Then
y = 3.25 - Math.Sqrt(x + 1)
Else
y = -x
End If
table.Rows.Add(CStr(x), CStr(y))
Next x
DataGridView1.DataSource = table
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
End
End Sub

End Class

Строка
Dim table As New DataTable()
описывает объектную переменную table и создает новый объект таблицы данных
DataTable(). Метод Add коллекции Columns добавляет заголовки столбцов в таблицу:
table.Columns.Add("X")
table.Columns.Add("Y")
Затем в цикле вычисляются переменные x и y. На каждом шаге формируется строка таблицы
с помощью следующего оператора:
table.Rows.Add(CStr(x), CStr(y))
После завершения работы цикла, источнику данных DataSource элемента DataGridView1
присваивается значение таблицы table
Результат работы представленной выше программы приведен на рисунке 23.

39
Рисунок 23 – Вид формы разрабатываемого приложения
с элементом управления DataGridView в момент выполнения
Напишем программу решения рассмотренной выше задачи, используя файловый
вывод значений аргумента функции x и самой функции y. Файловый вывод значений можно
осуществить используя элемент управления SaveFileDialog, с помощью которого
пользователь может выбрать дисковое устройство, папку и имя файла для сохранения
данных. Для этого необходимо поместить на форму элемент управления SaveFileDialog.
Данный элемент управления является невидимым в процессе выполнения программы и
обладает следующими основными методами и свойствами:
- метод ShowDialog() – вызывает диалоговое окно Сохранить как…(см. рис. 24)
- свойство FileName – указывает на полный путь и имя записываемого файла.

Рисунок 24 – Изображение диалогового окна Windows Сохранить как…


При файловом вводе-выводе необходимо проделать следующие операции: открыть
файл, произвести операции чтения-записи и закрыть файл.
Для работы с файлами требуется объявить объектную переменную. Далее создать
новый объект для открытия потока вывода System.IO.StreamWriter. Поток вывода

40
позволяет считывать и записывать строки символов. Запись в файл осуществляется методом
WriteLine(). Закрытие потока вывода осуществляется методом Close().
Форма программы решения рассмотренной выше задачи представлена на рисунке 25.

Рисунок 25 – Вид формы разрабатываемой программы

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


текстовый файл с помощью стандартного окна диалога Windows, представлен ниже:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single, s As String, filename1 As String
Dim file1 As Object
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
SaveFileDialog1.ShowDialog()
filename1 = SaveFileDialog1.FileName
file1 = New System.IO.StreamWriter(filename1)
file1.WriteLine("x у")
For x = a To b Step h
If x < -1.25 Then
y = 3 * Math.Sqrt(Math.Abs(x - 1)) - 3.25
ElseIf x >= 1.25 Then
y = 3.25 - Math.Sqrt(x + 1)
Else

41
y = -x
End If
s = CStr(x) + " " + CStr(y)
file1.WriteLine(s)
Next x
file1.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

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


просмотреть с помощью программы Блокнот (см рис. 26).

Рисунок 26 – Результаты вычислений записаны в файл text.txt

В приведенном выше программном коде объявляется переменная строкового типа s.


Данная переменная используется для формирования строки, которая будет записываться в
текстовый файл с помощью методода WriteLine().. Дело в том, что приведенном выше
программном коде метод WriteLine() осуществляет вывод по строчкам, а не элементам.
Рассмотрим еще один вариант программы, использующей другой способ файлового
вывода:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single, s As String, filename1 As String
Dim file1 As Object
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
filename1 = Application.StartupPath + "\testout.txt"
file1 = New System.IO.StreamWriter(filename1)
file1.WriteLine("x у")

42
For x = a To b Step h
If x < -1.25 Then
y = 3 * Math.Sqrt(Math.Abs(x - 1)) - 3.25
ElseIf x >= 1.25 Then
y = 3.25 - Math.Sqrt(x + 1)
Else
y = -x
End If
s = CStr(x) + " " + CStr(y)
file1.WriteLine(s)
Next x
file1.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

В приведенном выше программном коде использована следующая строка:

filename1 = Application.StartupPath + "\testout.txt"

Текстовый файл имеет имя testout.txt. Данный файл будет создан в том каталоге, где
находятся основные файлы запускаемого приложения. Свойство Application.StartupPath
является свойством приложения, показывающее местоположение основных его файлов. Знак
+ является операцией объединения строк. Таким образом, запись Application.StartupPath +
"\testout.txt" определяет полный путь к файлу testout.txt. В результате файл testout.txt будет
иметь следующий полный путь D:\test\WindowsApplication1\WindowsAplication1\bin\
Debug\testout.txt, если при создании или сохранении приложения был указан путь D:\test.

4.2 Пример выполнения задания

Задание. Напишите программу, вычисляющую значения функции на промежутке


[a,b] c шагом h. Значения a,b и h выберите самостоятельно так, чтобы выявить основные
особенности поведения функции.

⎧x 2 , x < −1

y = ⎨− x 3 , −1 ≤ x < 1
⎪3 x, x ≥1

Ниже приведены интерфейс решения задачи и блок-схема (рис. 27, 28), а также
программный код.

43
Рисунок 27 – Интерфейс программы

44
НАЧАЛО

Ввод: a,b,h

x=a,b,(h)

да нет
x<-1

да нет
y = x2 x≥1

y = 3x y=-x3

Вывод x,y

КОНЕЦ

Рисунок 28 – Блок-схема
 
Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
ListBox1.Items.Clear()
ListBox2.Items.Clear()
For x = a To b Step h
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x

45
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
Next x

End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_
Button2.Click
End
End Sub

End Class

5 ЦИКЛЫ С ПРЕДУСЛОВИЕМ

5.1 Теоретическая часть

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


повторений тела цикла заранее неизвестно и тело цикла может ни разу не выполниться В
языке программирования Visual Basic, цикл с предварительным условием может быть
организован четырьмя способами: с помощью операторов условного и безусловного
перехода, с помощью операторов цикла DO WHILE …LOOP, DO UNTIL…LOOP,
WHILE…WEND. Оператор WHILE…WEND полностью соответствует оператору DO
WHILE …LOOP, за исключением ключевых слов.
Рассмотрим основные форматы перечисленных выше операторов цикла с
предварительным условием. Первый оператор имеет следующий формат:

DO WHILE <условие>
<тело цикла>
LOOP

Условие, расположенное после ключевого слова WHILE представляет собой


логическое выражение. Его значение вычисляется при каждом выполнении цикла. Пока
условие соблюдается, (логическое выражение является истинным – True), выполняются
операторы, составляющие тело цикла. Как только логическое выражение станет ложным,
произойдет выход из цикла и управление будет передано на оператор, расположенный после
ключевого слова LOOP.
В качестве примера рассмотрим программу, вычисляющую значения функции на
промежутке [a,b] c шагом h. Пусть функция имеет следующий вид:

⎧x 2 , x < −1

y = ⎨− x 3 , −1 ≤ x < 1 .
⎪3 x, x ≥1

Составим блок-схему алгоритма и программу решения данной задачи. Переменной -


параметру цикла должно быть присвоено значение до начала работы цикла. Также, данная
переменная должна изменять свое значение (в большую или меньшую сторону, в
зависимости от условия), чтобы не произошло «зацикливание» программы. Форма
приложения изображена на рисунке 29.

46
Рисунок 29. Изображение формы со списками

В представленной на рис. 30 блок-схеме, жирным подчеркнутым курсивом отмечены


блоки, отвечающие за организацию цикла с предусловием. Программный код решения
задачи будет иметь следующий вид:
Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do While x <= b
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub
End Class

47
Рассмотренная выше задача может быть решена вторым способом. Блок – схема и
рисунок формы остаются без изменения. Используемый здесь оператор цикла с
предусловием будет иметь следующий формат:

DO UNTIL <условие>
<тело цикла>
LOOP

НАЧАЛО

Ввод: a,b,h

x=a

нет
x≤b

да
да
нет
x<-1

да нет
y = x2 x≥1

y = 3x y=-x3

Вывод: x,y

x=x+h

КОНЕЦ

Рисунок 30 – Блок-схема

48
Данный оператор работает следующим образом. Пока <условие>, расположенное
после ключевого слова UNTIL не соблюдается – выполняются операторы, составляющие
тело цикла. Как только логическое выражение, записанное в условии станет истинным, то
есть будет соблюдаться – произойдет выход из цикла и управление будет передано на
следующий оператор, находящийся после ключевого слова LOOP. Программный код
приложения, использующего оператор DO UNTIL…LOOP имеет вид:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do Until x <= b
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

Оператор WHILE…END WHILE имеет следующий формат:


WHILE <условие>
<тело цикла>
END WHILE

Приведенный оператор работает следующим образом. При соблюдении условия,


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

49
Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
While x <= b
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
End While

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

Теперь рассмотрим пример вычисления факториала целого положительного числа N.


Факториал числа N представляет собой произведение целых положительных чисел с шагом
единица от единицы до N и обозначается следующим образом:
N N
N != ∏ i =1 ⋅ 2 ⋅ ... ⋅ N , где символ ∏ i означает произведение целых чисел от 1 до N.
i =1 i =1
Форма приложения, реализующего вычисление факториала положительного числа N?
изображена на рисунке 31, соответствующая блок-схема на рис. 32.

Рисунок 31 – Форма приложения, реализующего вычисление факториала


50
Подробнее рассмотрим схему алгоритма вычисления факториала. Факториал, как
было отмечено выше, представляет собой произведение целых положительных чисел. В
данном алгоритме переменная I является параметром цикла и задается до начала выполнения
цикла. В теле цикла данная переменная на каждом шаге увеличивается на единицу.
Тело цикла выполняется до тех пор, пока параметр I не станет больше чем N, когда
произойдет выход из цикла. Всегда при вычислении произведения или суммы перед началом
работы цикла им присваиваются значения, соответственно произведению F=1, а сумме S=0.
Затем в программе (алгоритме) используются рекуррентные формулы, содержащие в левой и
правой части оператора присваивания одну и ту же переменную: в случае произведения
F=F*…, а в случае суммы S=S+…. Здесь вместо многоточия записывается переменная или
выражение для вычисления.

НАЧАЛО

Ввод: N

I=1

F=1

да нет
I≤N

F=F*I

Вывод: F
I=I+1

КОНЕЦ

Рисунок 32 – Блок-схема

Пример программного кода решения нашей задачи представлен ниже:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim F As Single, I As Integer, N As Integer
N = CInt(TextBox1.Text)
F=1
I=1
While I <= N

51
F=F*I
I=I+1
End While
TextBox2.Text = CStr(F)
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

Приведем пример, как можно вычислить факториал с помощью оператора


WHILE…END WHILE, используя меньшее число переменных. Блок-схема такого
алгоритма приведена ниже (рис. 33).

НАЧАЛО

Ввод: N

F=1

да нет
N>0

F=F*N

Вывод: F
N=N-1

КОНЕЦ

Рисунок 33 – Блок-схема

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

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim F As Single, N As Integer
N = CInt(TextBox1.Text)
F=1

While N
F=F*N

52
N=N-1
End While
TextBox2.Text = CStr(F)
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub
End Class

В этой программе, в качестве параметра цикла используется целочисленная


переменная N. На первый взгляд, может показаться, что в строке While N содержится
ошибка. На самом деле ошибки нет. Дело в том, что при вычислении выражений,
выступающих в качестве условий, Visual Basic значение целочисленной переменной равное
нулю интерпретирует как False (ложь, условие не соблюдается). Любое положительное целое
число будет интерпретировано как True (истина, условие соблюдается). В нашей программе
осуществляется ввод переменной N, которая является целым положительным числом. Пока
N не равно нулю выполняется тело цикла – вычисляется произведение. На каждом шаге
цикла значение N уменьшается на единицу и в конечном итоге достигнет 0. При N=0
произойдет выход из цикла. Проанализировав программные коды приложений вычисления
факториала, можно заметить, что в первом случае произведение вычисляется в
последовательности 1·2·…·(N-1)·N, а во втором – наоборот N·(N-1)·…·2·1, но как известно, от
перестановки сомножителей произведение не меняется, а память и время работы во втором
программном коде экономится.
Рассмотренные выше циклы, являются циклами с предварительным условием. Так как
условие в этих циклах располагается перед телом цикла, то цикл может выполниться
несколько раз, а может - не выполнится ни разу, в зависимости от соблюдения или
несоблюдения условия. В следующем разделе мы рассмотрим цикл с постусловием, тело
которого всегда выполняется хотя бы один раз.

5.2 Пример выполнения задания

Вычислить значения функции на промежутке [a,b] c шагом h

⎧x 2 , x < −1

y = ⎨− x 3 , −1 ≤ x < 1
⎪3 x, x ≥1

Изображение формы дано на рис. 34:

53
Рисунок 34 – Интерфейс программы

Программа:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do While x <= b
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

54
Блок-схема алгоритма дана на рис. 35.

НАЧАЛО

Ввод: a,b,h

x=a

нет
x≤b

да
да
нет
x<-1

да нет
y = x2 x≥1

y = 3x y=-x3

Вывод: x,y

x=x+h

КОНЕЦ

Рисунок 35 – Блок-схема

55
6. ЦИКЛЫ С ПОСТУСЛОВИЕМ

6.1 Теоретическая часть

Циклы с постусловием применяются тогда, когда число повторений цикла заранее


неизвестно и определяется в процессе реализации циклического алгоритма. Цикл с
постусловием может быть организован тремя способами: с помощью операторов условного и
безусловного перехода, с помощью операторов DO…LOOP WHILE и DO…LOOP UNTIL.
Рассмотрим основные форматы перечисленных выше операторов цикла с
постусловием. Первый вариант формата оператора имеет следующий вид:

DO
<тело цикла>
LOOP WHILE <условие>

Условие, расположенное после ключевого слова WHILE представляет собой


логическое выражение. Его значение вычисляется при каждом выполнении цикла. Пока
условие соблюдается, (логическое выражение является истинным – True), выполняются
операторы, составляющие тело цикла. Как только логическое выражение станет ложным,
произойдет выход из цикла и управление будет передано на оператор, расположенный после
ключевых слов LOOP WHILE. Тело цикла составляют любые операторы Visual Basic и в
любом количестве.
Второй вариант формата оператора цикла с постусловием имеет следующий вид:

DO
<тело цикла>
LOOP UNTIL <условие>

В данном случае тело цикла будет выполняться до тех пор, пока условие расположенное
после ключевого слова UNTIL не соблюдается. При соблюдении условия произойдет выход
из цикла и управление будет передано на следующий оператор, находящийся за ключевыми
словами LOOP UNTIL. Следует заметить, что операторы, составляющие тело цикла в
циклах с постусловием, в отличие от циклов с предусловием, всегда выполняются хотя бы
один раз, так как проверка условия выхода из цикла осуществляется не до, а после тела
цикла.
В качестве примера рассмотрим программу, вычисляющую значения функции на
промежутке [a,b] c шагом h. Пусть функция имеет следующий вид:

⎧x 2 , x < −1

y = ⎨− x 3 , −1 ≤ x < 1 .
⎪3 x, x ≥1

Форма приложения изображена на рисунке 36.

56
Рисунок 36 - Изображение формы со списками

Составим блок-схему алгоритма (см. рис. 37) и программу решения данной задачи.

НАЧАЛО

Ввод: a,b,h

x=a

да
нет
x<-1

да нет
y = x2 x≥1

y = 3x y=-x3

Вывод: x,y

x=x+h

да нет
x≤b

КОНЕЦ
Рисунок 37 – Блок-схема

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

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop While x <= b
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class
 
Второй вариант программного кода, использующий оператор DO…LOOP UNTIL, приведен
ниже. В данном случае форма и блок схема остаются без изменения, а условие,
расположенное после ключевого слова WHILE предыдущей программы – меняется на
противоположное, когда используется ключевое слово UNTIL:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do
If x < -1 Then

58
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop Until x > b
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

6.2 Пример выполнения задания

Вычислить значения функции на промежутке [a,b] c шагом h


⎧x 2 , x < −1
⎪ 3
y = ⎨− x , −1 ≤ x < 1
⎪3 x, x ≥1

Блок-схема алгоритма решения задачи показана на рис. 38.

59
НАЧАЛО

Ввод: a,b,h

x=a

да
нет
x<-1

да нет
y = x2 x≥1

y = 3x y=-x3

Вывод: x,y

x=x+h

да нет
x≤b

КОНЕЦ

Рисунок 38 – Блок-схема

Интерфейс программы показан на рис. 39.

Рисунок 39 – Интерфейс программы

60
Программный код:
Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim a As Single, b As Single, h As Single
Dim x As Single, y As Single
a = CSng(TextBox1.Text)
b = CSng(TextBox2.Text)
h = CSng(TextBox3.Text)
x=a
Do
If x < -1 Then
y=x*x
ElseIf x >= 1 Then
y=3*x
Else
y = -x ^ 3
End If
ListBox1.Items.Add(CStr(x))
ListBox2.Items.Add(CStr(y))
x=x+h
Loop While x <= b

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

7 ВЛОЖЕННЫЕ ЦИКЛЫ

7.1 Теоретическая часть

Операторы цикла могут быть вложенными друг в друга. Вложенные циклы можно
программировать различными комбинациями операторов цикла. Чаще всего, когда известно
количество итераций цикла, используют оператор цикла с параметром. При
программировании вложенных циклов с оператором FOR…NEXT необходимо следить за
тем, чтобы циклы не пересекались. Для этого необходимо соблюдать следующее правило:
цикл открытый первым – закрывается последним, а цикл открытый последним – закрывается
первым. Вложенные циклы должны быть открыты по разным параметрам.
Рассмотрим в качестве примера решение следующей задачи, используя вложенные
циклы. Пусть требуется составить блок-схему алгоритма и написать программу вычисления
значения выражения:

5
(k + x)k
S =∑ sin(kx).
k = 2 ( k + 1)!

61
Форма приложения изображена на рисунке 40.

Рисунок 40 – Изображение формы приложения

При решении данной задачи будем использовать операторы цикла FOR…NEXT. Внутренний
цикл будет предназначен для вычисления значения факториала на каждом шаге внешнего
цикла, так как факториал зависит от параметра внешнего цикла K. Блок-схема алгоритма
решения задачи представлена на рис. 41.

62
НАЧАЛО

Ввод: x

S=0

K=2, 5

Вывод: S
P=1

КОНЕЦ
I=1, K+1

P=P*I

S=S+sin(K*X)*K*(K+X)/P

Рисунок 41 – Блок-схема
Программный код приложения имеет вид:
Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim x As Single, s As Single
Dim p As Single, i As Integer, k As Integer
x = CSng(TextBox1.Text)
s=0
For k = 2 To 5
p=1
For i = 1 To k + 1
p=p*i
Next i
s = s + Math.Sin(k * x) * k * (k + x) / p
Next k
TextBox2.Text = CStr(s)

63
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

7.2 Пример выполнения задания

Составить блок-схему алгоритма и написать программу вычисления суммы для


указанного значения x . Значение x ввести с помощью текстового окна.
x =1
3
7x + k
S =∑
k =1 ( k + 3)!

Блок-схема и изображение формы даны на рис. 42, 43.

НАЧАЛО

Ввод:x

S=0

K=1,3

P=1

I=1,K+3

Вывод: S

P=P*I
КОНЕЦ

S=S+(7*X+K)/P

Рисунок 42 – Блок-схема

64
Рисунок 43 – Интерфейс программы

Программный код приложения:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim k As Integer, i As Integer, p As Single
Dim x As Single, s As Single
x = CSng(TextBox1.Text)
s=0
For k = 1 To 3
p=1
For i = 1 To k + 3
p=p*i
Next i
s = s + (7 * x + k) / p
Next k
TextBox2.Text = CStr(s)

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
End
End Sub

End Class

65
8 ОДНОМЕРНЫЕ МАССИВЫ

8.1 Теоретическая часть

Массивом называется упорядоченный набор данных, имеющих один и тот же тип и


располагающихся в памяти непосредственно друг за другом. Массивы могут быть
одномерными и многомерными, числовыми и символьными, статическими и
динамическими. Одномерный массив, как правило, называют вектором. Двумерный массив
является частным случаем многомерного массива и представляет собой таблицу, которую
часто называют матрицей. Для доступа к элементам массива используют переменные с
индексами.
Рассмотрим одномерный массив, состоящий из семи элементов A = {3,6,5,7,9,1,5}. Для
удобства представим его в виде полки с ящиками, причем, пронумеруем каждый ящик.
Номер ящика и будет являться индексом массива, а содержимое ящика – элементом массива
(см. рис 44.)

3 6 5 7 9 1 5
А 0 1 2 3 4 5 6

Рисунок 44 – Представление элементов одномерного массива в виде полки с ящиками

Описание массивов осуществляется с помощью оператора Dim. Описание представленного


выше массива имеет следующий вид
Dim A(0 to 7) As Integer
При таком описании, объявляется статический одномерный массив целочисленных
значений, состоящий из семи элементов. При таком описании массива индексы его
элементов начинаются с нуля. Доступ к элементам массива осуществляется при помощи
переменных с индексами. Например, элемент массива A(3) будет равен 7 (необходимо нам
полке А открыть ящик с номером 3 и извлечь его содержимое). Статический массив может
быть описан и другим способом:
Dim A(6) As Integer
В данном случае индексы элементов массива нумеруются, начиная с нуля, а количество
элементов в массиве будет равно семи (см. рис. 45).

3 6 5 7 9 1 5
А 0 1 2 3 4 5 6

Рисунок 45 – Представление элементов одномерного массива в виде полки с ящиками

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

66
файлов, с помощью функции InputBox(). Из-за того, что они вводятся в цикле – нельзя
использовать для их ввода текстовые окна (элемент TextBox). Вывод массива может
осуществляться в таблицы DataGridView, списки, комбинированные списки, файлы и
текстовые окна, в случае установленного свойства Multiline в положение True.
При обработке одномерных массивов чаще всего встречаются следующие задачи:
поиск суммы и произведения элементов массива, поиск наибольшего и наименьшего
элементов массива и их индексов, сортировка элементов массива по возрастанию, поиск и
замена элементов массива, подсчет количества элементов массива, удовлетворяющих
заданным условиям.
Пусть требуется вычислить сумму элементов вещественного статического массива,
9
состоящего из 10 элементов: S ∑ ai . Составим блок – схему решения данной задачи (см.
i =0
рис. 46).

НАЧАЛО

Ввод:N

I=0, N-1

Ввод: A(I)

S=0

I=0, N-1

S=S+A(i)

Вывод: S

КОНЕЦ

Рисунок 46 – Блок-схема

Ввод элементов массива в программном коде осуществляется через функцию InputBox().


Форма содержит кнопки ВВОД, РЕШЕНИЕ и ВЫХОД (см. рис. 47).

67
Рисунок 47 – Изображение формы приложения, вычисляющего
сумму элементов массива

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

Public Class Form1

Dim a(10) As Single

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim i As Integer
For i = 0 To 9
a(i) = CSng(InputBox("A(" + CStr(i) + ")="))
Next i
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
Dim s As Single, i As Integer
s=0
For i = 0 To 9
s = s + a(i)
Next i
TextBox1.Text = CStr(s)
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles_


Button3.Click
End
End Sub

End Class

В данном программном коде массив объявляется как контейнерная переменная, то


есть его элементы будут видимы во всех процедурах, принадлежащих форме. Строка
программного кода a(i) = CSng(InputBox("A(" + CStr(i) + ")=")) выводит на экран окно для
ввода значения элемента массива, показывая пользователю, какой по счету элемент массива
требуется ввести.
Рассмотрим задачу поиска наибольшего элемента массива. При поиске наибольшего и
наименьшего значений элементов массива, первый принимается за наибольший или

68
наименьший соответственно. Затем, в цикле начиная со второго элемента, осуществляется
проверка i-го элемента массива. В случае поиска наибольшего элемента массива, когда
текущее значение элемента массива больше элемента массива принятого за наибольший,
текущий становится наибольшим. Соответственно, при поиске наименьшего элемента
массива, при условии, что текущий элемент массива меньше чем наименьший, текущий
элемент становится наименьшим. Блок-схема алгоритма поиска наибольшего элемента
массива представлена на рис.48. При поиске наименьшего элемента массива достаточно
поменять знак в условном блоке алгоритма поиска на
противоположный.

НАЧАЛО

I=0,9

Ввод: A(I)

MAX=A(I)

I=1,9

да нет
A(I)>MAX

MAX=A(I)

Вывод:
MAX

КОНЕЦ

Рисунок 48 – Блок-схема

Форма приложения изображена на рисунке 49.


69
Рисунок 49 – Изображение формы приложения

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

Public Class Form1

Dim a(0 To 9) As Single

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
Dim i As Integer
For i = 0 To 9
a(i) = CSng(InputBox("A(" + CStr(i) + ")="))
Next i
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
Dim max As Single, i As Integer
max = a(0)
For i = 1 To 9
If a(i) > max Then max = a(i)
Next i
TextBox1.Text = CStr(max)
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles_


Button3.Click
End
End Sub

End Class

Как было отмечено выше, массивы могут быть статическими и динамическими.


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

70
указывать количество элементов в массиве. Затем объявляют массив, но в скобках не
указывают его размерность и количество элементов. В процедуре, где вводится массив, для
переопределения массива используют оператор ReDim. Необходимо иметь в виду, что при
использовании данного оператора, данные в массиве обнуляются. После переопределения
массива можно осуществлять ввод его элементов.
Приведем фрагмент программы, объявления динамического массива с помощью
операторов Dim и ReDim.

Dim a() As Single, n As Integer

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_


Button1.Click
………………………………….
n=CSng(InputBox(“Введите количество элементов массива N=”))
ReDim a(0 to N-1) As Single
………………………………….
End Sub

В настоящее время существует большое количество методов сортировки элементов


массива. Здесь мы рассмотрим два способа сортировки элементов массива по возрастанию:
сортировку методом «пузырька» и сортировку с выбором наименьшего элемента. В первом
случае данные будем выводить в списки, во втором в DataGridView. Форма приложения,
демонстрирующего сортировку элементов одномерного массива методом «пузырька»,
представлена на рисунке 50. Блок-схема сортировки элементов массива методом «пузырька»
представлена на рис. 51.

Рисунок 50 – Вид формы программы в процессе разработки

71
НАЧАЛО

Ввод: N

I=1,N

Ввод: A(I)

I=0,N-2

K=I,0,(-1)

нет да
A(K)>
A(K+1)

X=A(K)
A(K)=A(K+1)
A(K+1)=A(K)

I=1,N

КОНЕЦ
Вывод: A(i)

Рисунок 51 – Блок-схема

72
Ввод элементов массива осуществляется из текстового файла massivin.txt, расположенного в
том же каталоге, где и основные файлы программы. Вывод исходного и отсортированного
массивов осуществляется в списки. Программный код приложения имеет вид:

Public Class Form1

Dim a() As Single, n As Integer


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_
Button1.Click
Dim simv, stroka2, filename1, stroka As String
Dim i, k, dlina As Integer
Dim file1 As Object
ListBox1.Items.Clear()
filename1 = Application.StartupPath + "\massivin.txt"
file1 = New System.IO.StreamReader(filename1)
stroka = file1.ReadLine()
Label4.Text = stroka
n = CStr(stroka)
ReDim a(0 To n - 1)
stroka = file1.ReadLine()
dlina = Len(stroka)
k=0
stroka2 = ""
For i = 1 To dlina
simv = Mid(stroka, i, 1)
If simv <> "," Then
stroka2 = stroka2 + simv
Else
a(k) = CSng(stroka2)
ListBox1.Items.Add(CStr(a(k)))
stroka2 = ""
k=k+1
End If
Next i
a(k) = CSng(stroka2)
ListBox1.Items.Add(CStr(a(k)))
file1.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles_


Button2.Click
Dim x As Single, i As Integer, k As Integer
For i = 0 To n - 2
For k = i To 0 Step -1
If a(k) > a(k + 1) Then
x = a(k)
a(k) = a(k + 1)
a(k + 1) = x
End If
Next k
Next i
For i = 0 To n - 1

73
ListBox2.Items.Add(CStr(a(i)))
Next i
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles_


Button3.Click
End
End Sub
End Class

В приведенном выше программном коде ввод исходного массива производится из текстового


файла massivin.txt, расположенного в каталоге, откуда запускается приложение. Для
указания пути к этому файлу используется строковая переменная filename1:
Dim filename1 as String
........................................
filename1 = Application.StartupPath + "\massivin.txt".
Свойство StartupPath объекта Application указывает путь, где расположено запускаемое
приложение. При сохранении или создании проекта путь и имя приложения указываются
программистом см. рис. 52. В нашем случае файл с исходными данными будет находиться по
адресу: D:\vb_test\WindowsApplication1\WindowsApplication1\bin\Debug\massivin.txt.

Рисунок 52 - Сохранение приложения.

Для работы с файлом объявляется и создается объектная переменная file1:


Dim file1 As Object
file1 = New System.IO.StreamReader(filename1)
Метод ReadLine() объекта System.IO.StreamReader, к типу которого относится объектная
переменная file1, считывает из файла целую строку. Файл massivin.txt создается в Блокноте
и имеет следующую структуру (см. рис. 52):

Рисунок 53 – Структура текстового файла massivin.txt

74
Таким образом, количество элементов одномерного массива выводится в метку Lable4,
установленную на форме и записывается в переменную n:

stroka = file1.ReadLine()
Label4.Text = stroka
n = CStr(stroka)

В следующих строках
stroka = file1.ReadLine()
dlina = Len(stroka)
k=0
stroka2 = ""
For i = 1 To dlina
simv = Mid(stroka, i, 1)
If simv <> "," Then
stroka2 = stroka2 + simv
Else
a(k) = CSng(stroka2)
ListBox1.Items.Add(CStr(a(k)))
stroka2 = ""
k=k+1
End If
Next i
a(k) = CSng(stroka2)
ListBox1.Items.Add(CStr(a(k)))

считывается следующая строка и формируется массив а, состоящий из 9 элементов.


Переменной dlina присваивается длина строки Len(stroka), затем открывается цикл, в
котором последовательно извлекаются все символы строки, с помощью функции Mid(stroka
i,1). Данная функция выделяет символы, начиная с позиции i, последний параметр указывает
количество выделяемых символов из подстроки. Каждый символ записывается в
переменную simv.В качестве разделителя между значениями в текстовом файле
используется ",". Пока соблюдается условие simv<>",", происходит накопление символов в
переменной stroka2. При условии simv<>"," переменная stroka2 преобразуется в элемент
одномерного массива, переменная, отвечающая за индекс массива, увеличивается на
единицу: k=k+1, затем, переменная stroka2 очищается. Элемент массива выводится в
список.
Ввод данных из файла значительно упрощается, если исходные данные введены в
одном столбце (см. рис. 54).

Рисунок 54 – Структура текстового файла massivin.txt

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

Dim a() As Single, n As Integer


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles_
Button1.Click
Dim filename1, stroka As String
Dim i As Integer
Dim file1 As Object
ListBox1.Items.Clear()
filename1 = Application.StartupPath + "\massivin.txt"
file1 = New System.IO.StreamReader(filename1)
stroka = file1.ReadLine()
Label4.Text = stroka
n = CStr(stroka)
ReDim a(0 To n - 1)
For i=0 to n-1
stroka = file1.ReadLine()
a(i) = CSng(stroka)
ListBox1.Items.Add(CStr(a(i)))
Next i
file1.Close()
End Sub

Алгоритм сортировки элементов одномерного массива по возрастанию методом


выбора наименьшего элемента состоит в следующем. В массиве ищется наименьший
элемент и его индекс. Наименьший элемент меняется местами с первым. Затем, ищется
следующий наименьший элемент массива и меняется местами со вторым элементом. Данный
процесс происходит до тех пор, пока не будут просмотрены и заменены все элементы
массива.
Блок-схема алгоритма представлена на рис. 55.

76
НАЧАЛО

Ввод: N
I=1,N

I=0,N-1

Вывод:
X(I)
Ввод: X(I)

Z=0,N-2
КОНЕЦ

K=Z

I=Z,N

L=X(K)

X(K)>X(I)
X(K)=X(Z)
K=I

X(Z)=L

Рисунок 55 – Блок-схема

Поместите на форму три кнопки ВВОД, СОРТИРОВКА и ВЫХОД, метку элемент


управления DataGridView. В него будут выводиться отсортированный и исходный массивы.
Форма приложения должна выглядеть примерно так, как показано на рисунке 56. Ввод
элементов массива осуществляется через функцию InputBox().

77
Рисунок 56 – Вид формы программы с элементом DataGridView перед началом работы

Ниже приведен программный код приложения:

Public Class Form1


Dim x0(), x1() As Single, n As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
Handles Button1.Click
Dim i As Integer
n = CInt(InputBox("N="))
Dim dt As New DataTable
DataGridView1.DataSource = dt
dt.Columns.Add(New DataColumn("Индекс", GetType(String)))
dt.Columns.Add(New DataColumn("Исходный", GetType(String)))
dt.Columns.Add(New DataColumn("Отсортированный", GetType(String)))
ReDim x0(0 To n - 1), x1(0 To n - 1)
For i = 0 To n - 1
x0(i) = CSng(InputBox("a(" + CStr(i) + ")="))
x1(i) = x0(i)
dt.Rows.Add(New String() {CStr(i), CStr(x0(i))})
Next i
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
Dim z As Integer, i As Integer, k As Integer, L As Single
Dim dt As New DataTable
DataGridView1.DataSource = dt
For z = 0 To n - 2
k=z
For i = z To n - 1
If x1(k) > x1(i) Then k = i
Next i
L = x1(k)

78
x1(k) = x1(z)
x1(z) = L
Next z
dt.Columns.Add(New DataColumn("Индекс", GetType(String)))
dt.Columns.Add(New DataColumn("Исходный", GetType(String)))
dt.Columns.Add(New DataColumn("Отсортированный", GetType(String)))
For i = 0 To n - 1
dt.Rows.Add(New String() {CStr(i), CStr(x0(i)), CStr(x1(i))})
Next i

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button3.Click
End
End Sub
End Class

Изображение формы в процессе выполнения программы представлено на рисунке 57.

Рисунок 57 – Изображение формы после сортировки

8.2 Пример выполнения задания

По заданной последовательности x1 , x 2 ,..., x n построить последовательность


y1 , y 2 ,..., y m , исключив из заданной последовательности нулевые элементы. Определить
количество оставшихся элементов. n = 10

79
Блок-схема решения задачи представлена на рис. 58.
НАЧАЛО

Ввод: N

I=0,N-1

Ввод:
X(I)

K=0

I=0,N-1

да нет
X(I)=0

Y(K)=X(I)

K=K+1

I=0,K-1

Z=N-K
Вывод:Y(I)

Вывод: Z

КОНЕЦ

.
Рисунок 58 – Блок-схема

80
Рисунок формы приложения дан на рис. 59.

Рисунок 59 – Форма приложения


Программный код:

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim n As Integer, i As Integer, z As Integer
Dim x() As Single, k As Integer, y() As Single
n = CInt(InputBox("N="))
ReDim x(0 To n - 1), y(0 To n - 1)
For i = 0 To n - 1
x(i) = CSng(InputBox("x(" + CStr(i) + ")="))
ListBox1.Items.Add(CStr(x(i)))
Next i
k=0
For i = 0 To n - 1
If x(i) <> 0 Then
y(k) = x(i)
k=k+1
End If
Next i
For i = 0 To k - 1
ListBox2.Items.Add(CStr(y(i)))
Next i
z=n-k
TextBox1.Text = CStr(z)
End Sub

81
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
Handles Button2.Click
End
End Sub
End Class

Рисунок 60 – Форма приложения

9 МНОГОМЕРНЫЕ МАССИВЫ

9.1 Теоретическая часть

Частным случаем многомерных массивов является матрица или двумерный массив.


При работе с двумерными массивами используются два индекса: первый указывает на номер
строки, а второй определяет номер столбца таблицы. Рассмотрим двумерный массив,
состоящий из ста элементов: десяти строк и десяти столбцов (см. таблицу 7).

Таблица 7 – Двумерный массив, содержащий десять строк и десять столбцов


I\J 1 2 3 4 5 6 7 8 9 10
1 2 3 5 8 1 23 17 54 36 36.45
2 4 54 5 9 8 15 45 5.2 5.7 25.4
3 -8 5 76 43 76 12 45 32 4.5 2.1
4 -45 7 98.12 64 43 45 4 1 3 2
5 -2 7 -32 1 26 79 21 19 89 478
6 -7 0 -4 1 34 48 21 54 65 54
7 9 3 0 21 16 78 13 68 45 65
8 4 5 21.4 13 24 98 14 14 25 21
9 2 0 21.1 14 46 -72 -4 -9 134 12
10 8 7 12 14 -78 -98 -4 12 12 32

82
Ввод двумерного массива целесообразно осуществлять из файла, так как при отладке
программы экономится время на ввод значений элементов массива. В качестве примера
напишем программу, осуществляющую ввод значений элементов массива и отображающую
ее в элементе DataGridView.. Создайте файл в текстовом редакторе Блокнот, который
содержит приведенную таблицу. Приложение будет содержать систему меню. В пункте
меню File будут находиться подпункты Open - для открытия файла, Save As для сохранения
файлов и Exit для выхода из программы.
Для создания необходимо проделать следующие операции.
1. В панели инструментов, выбрать элемент управления MenuStrip и поместить его на
форму, после чего элемент отобразится в нижней части экрана под изображением формы
(см. рис. 61-62).

Рисунок 61 – Выбор элемента управления MenuStrip

Рисунок 62 – Элемент отобразился в нижней части экрана под изображением формы

83
2. Навести курсор мышки да элемент управления MenuStrip, нажать правую кнопку мышки,
поле чего на экране появится контекстное меню (см. рис. 63).

Рисунок 63 - Контекстное меню


В появившемся меню выбрать пункт Insert Standard Items (вставить стандартные
элементы). При выборе данного пункта контекстного меню, в верхней части формы должны
появиться стандартные элементы меню (см. рис. 64).

Рисунок 64 – Стандартные элементы меню


3. Так как в нашей задаче понадобятся подпункты меню, входящие в пункт File, такие как
Open (Создать), Save As (Сохранить как) и Exit (Выход), то остальные пункты следует
удалить.
4. Для редактирования пунктов и подпунктов меню, наводим курсор мыши на элемент
управления MenuStrip, вызываем контекстное меню с помощью нажатия правой кнопкой
мышки и в появившемся контекстном меню выбираем пункт Edit Items (Правка элементов)
(см. рис. 65).

Рисунок 65 - Контекстное меню и пункт


84
5. При выборе пункта Edit Items (Правка элементов), на экране появится окно редактора
коллекции элементов, изображенное на рисунке 66.

Рисунок 66 – Окно редактора коллекции элементов


Данное окно условно разделено на две части: левая часть содержит пункты меню, а правая
их свойства. При выборе стандартного меню, левая часть окна содержит следующие пункты
меню:
МенюStrip1
ФайлToolStripMenuItem
ПравкаToolStripMenuItem
СервисToolStripMenuItem
СправкаToolStripMenuItem
Для нашего приложения необходимо оставить только пункт ФайлToolStripMenuItem, а
остальные удалить, нажав на кнопку (см. рис 67-68.)

Рисунок 67 – Для удаления "лишних" пунктов меню нужно нажать на кнопку удаления

85
Рисунок 68 – Остался только пункт главного меню ФайлToolStripMenuItem

6. В правой части окна в разделе Design (Проектирование) можно изменить имя объекта
(свойство Name) на менее короткое, например, mnuFile (см. рис. 69)

Рисунок 69 – Имя объекта изменено на более короткое

7. В той же части окна, где было изменено свойство Name, для доступа к подпунктам меню,
необходимо нажать на кнопку, расположенную справа от свойства DropDownItems (см рис.
70), после чего на экране появится окно, изображенное на рисунке 71.

86
Рисунок 70 - Для перехода к редактированию пунктов
подменю нужно нажать на выделенную кнопку

Рисунок 71 - Подпункты меню Файл


8. В появившемся окне из левой части удаляем те пункты подменю, которые мы не будем
использовать, а оставшиеся переименуем так, как показано на рисунке 72, после
редактирования нажимаем на кнопку Ok.

87
Рисунок 72 - Окончательный вид подменю
Если в данный момент запустить наше приложение, то можно будет увидеть пункт главного
меню File, а раскрыв его подпункты Open (Открыть), Save As (Сохранить как), Exit
(Выход) см. рис. 73.

Рисунок 73 - Вид отредактированного меню


Пункты меню, так же как и кнопки обладают событием Click(). Поэтому с ними
можно работать также как и с кнопками.
Наша программа будет производить следующие действия: вводить двумерный массив
из текстового файла, выводить его в DataGridView и в файл. Для работы с файлами на
форму необходимо поместить элементы управления OpenFileDialog и SaveFileDialog.
Форма приложения приведена на рисунке 74.

88
Рисунок 74 – Изображение формы приложения с выпадающим меню

Программный код приложения приведен ниже:

Public Class Form1

Dim a(,) As Single, n As Integer

Private Sub mnuOpen_Click(sender As System.Object, e As System.EventArgs) Handles_


mnuOpen.Click
Dim filename1 As String
Dim file1 As Object
Dim stroka As String, i As Integer, a(,) As Single, dlin As Integer, k As Integer
Dim stroka2 As String, simv As String, stroka3 As String
Dim dt As New DataTable
OpenFileDialog1.ShowDialog()
filename1 = OpenFileDialog1.FileName
file1 = New System.IO.StreamReader(filename1)
stroka = file1.ReadLine()
n = CInt(stroka)
ReDim a(0 To n - 1, 0 To n - 1)
For i = 0 To n - 1
stroka3 = ""
stroka = file1.ReadLine()
dlin = Len(stroka)
k=0
stroka2 = ""
For j = 1 To dlin
simv = Mid(stroka, j, 1)
If simv <> " " Then

89
stroka2 = stroka2 + simv
Else
a(i, k) = CSng(stroka2)
stroka2 = ""
stroka3 = stroka3 + CStr(a(i, k)) + " "
k=k+1
End If
Next j
a(i, k) = CSng(stroka2)
Next i
DataGridView1.DataSource = dt
For j = 1 To n
dt.Columns.Add(New DataColumn(CStr(j), GetType(String)))
Next j
For i = 0 To n - 1
dt.Rows.Add(New String() {a(i, 0), a(i, 1), a(i, 2), a(i, 3), a(i, 4)})
Next i
file1.Close()
End Sub

Private Sub mnuSaveAs_Click(sender As System.Object, e As System.EventArgs) Handles_


mnuSaveAs.Click
Dim i As Integer, j As Integer, filename1 As String, stroka As String
Dim a(0 To n - 1, 0 To n - 1) As Single
Dim file1 As Object
Dim dt As New DataTable
SaveFileDialog1.ShowDialog()
filename1 = SaveFileDialog1.FileName
file1 = New System.IO.StreamWriter(filename1)
file1.WriteLine(CStr(n))
dt = DataGridView1.DataSource
For i = 0 To n - 1
stroka = ""
For j = 0 To n - 1
a(i, j) = dt.Rows.Item(i).Item(j)
stroka = stroka + CStr(a(i, j)) + " "
Next j
file1.WriteLine(stroka)
Next i
file1.Close()
End Sub

Private Sub mnuExit_Click(sender As System.Object, e As System.EventArgs) Handles_


mnuExit.Click
End
End Sub

End Class

Рассмотрим еще один пример работы с двумерными массивами. Создадим программу,


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

90
TextBox2, куда будут выводиться соответственно одномерный и двумерный массивы. Ввод
двумерного массива будет осуществляться из файла, а вывод одномерного массива только в
текстовое окно. Форма приложения в момент выполнения представлена на рисунке 75. Блок-
схема программы приведена на рис. 76.

Рисунок 75 – Изображение формы в период выполнения программы

91
НАЧАЛО

Ввод: N, M

I=1,N

J=1,M

Ввод: A(I,J)

I=1,N

I=1,N
MIN(I)=A(I,1)

Вывод:
J=2,M MIN(I)

J=1,M
да нет
A(I,J)<MIN(I)

Вывод:
MIN(I)=A(I,J) A(I,J)

КОНЕЦ

Рисунок 76 – Блок-схема

92
Программный код приложения имеет вид:

Public Class Form1

Dim a(,) As Single, n As Integer, m As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As_ System.EventArgs)_


Handles Button1.Click
Dim filename1 As String
Dim file1 As Object
Dim stroka As String, i As Integer, dlin As Integer, k As Integer
Dim stroka2 As String, simv As String, stroka3 As String
Dim dt As New DataTable
OpenFileDialog1.ShowDialog()
filename1 = OpenFileDialog1.FileName
file1 = New System.IO.StreamReader(filename1)
stroka = file1.ReadLine()
n = CInt(stroka)
ReDim a(0 To n - 1, 0 To n - 1)
For i = 0 To n - 1
stroka3 = ""
stroka = file1.ReadLine()
dlin = Len(stroka)
k=0
stroka2 = ""
For j = 1 To dlin
simv = Mid(stroka, j, 1)
If simv <> " " Then
stroka2 = stroka2 + simv
Else
a(i, k) = CSng(stroka2)
stroka2 = ""
stroka3 = stroka3 + CStr(a(i, k)) + " "
k=k+1
End If
Next j
a(i, k) = CSng(stroka2)
Next i
file1.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
Dim min() As Single, j As Integer, i As Integer
ReDim min(0 To n - 1)
TextBox1.Text = ""
TextBox2.Text = ""
For i = 0 To n - 1
min(i) = a(i, 1)
For j = 1 To n - 1

If a(i, j) < min(i) Then min(i) = a(i, j)

93
Next j
Next i
For i = 0 To n - 1
TextBox2.Text = TextBox2.Text + CStr(min(i)) + vbCrLf
For j = 0 To n - 1
TextBox1.Text = TextBox1.Text + CStr(a(i, j)) + " "
Next j
TextBox1.Text = TextBox1.Text + vbCrLf
Next i
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button3.Click
End
End Sub

End Class

Программный код приложения осуществляет вывод двумерного массива в текстовое окно.


Для перехода на следующую строчку многострочного редактора используется константа
vbCrLf. Фрагмент программного кода

For j = 1 To m
TextBox1.Text = TextBox1.Text + CStr(a(i, j)) + " "
Next j

предназначен для формирования и вывода строки матрицы. После закрытия внутреннего


цикла осуществляется перевод строки.

9.2 Пример выполнения задания

Найти количество элементов двумерного массива, равных 0 и количество элементов


массива больше чем 7. Ввод массива осуществить через функцию InputBox().
Интерфейс программы показан на рис. 77. Далее приведены блок-схема и программный код.
Блок-схема дана на рис. 78.

Рисунок 77 – Интерфейс программы

94
НАЧАЛО

Ввод:N,M

I=1,N

J=1,M

Ввод:A(I,J)

K=0

Z=0

I=1,N

J=1,M

да
A(I,J)=0

нет K=K+1

да Вывод:
A(I,J)>7
K,Z
нет Z=Z+1
КОНЕЦ

Рисунок 78 – Блок-схема

95
Программный код приложения:

Public Class Form1

Dim a(,) As Single, n As Integer, m As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
Dim i As Integer, j As Integer
n = CInt(InputBox("N="))
m = CInt(InputBox("M="))
ReDim a(0 To n - 1, 0 To m - 1)
For i = 0 To n - 1
For j = 0 To m - 1
a(i, j) = CSng(InputBox("A(" + CStr(i) + "," + CStr(j) + ")="))
Next j
Next i
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button2.Click
Dim i As Integer, j As Integer, k As Integer
Dim z As Integer
k=0
z=0
For i = 0 To n - 1
For j = 0 To m - 1
If a(i, j) = 0 Then k = k + 1
If a(i, j) > 7 Then z = z + 1
Next j
Next i
TextBox1.Text = CStr(k)
TextBox2.Text = CStr(z)
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button3.Click
End
End Sub

End Class

96
10 ПРОЦЕДУРЫ И ФУНКЦИИ, СОЗДАВАЕМЫЕ ПОЛЬЗОВАТЕЛЕМ

10.1 Теоретическая часть

Язык программирования высокого уровня Visual Basic поддерживает следующие


виды процедур:
- процедуры общего вида, создаваемые пользователем Sub…End Sub.
- процедуры – функции, создаваемые пользователем Function…End Function
- процедуры обработки событий.
Процедуры обработки событий связаны с событиями, происходящими с объектами.
Например, нам хорошо известно событие Click(). Все приведенные выше примеры данного
пособия содержат процедуры обработки событий.

10.1.1 Процедура Sub…End Sub, создаваемая пользователем

Процедура, создаваемая пользователем, имеет следующий формат:

Sub <Имя>(<перем1> as <тип1>, <перем2> as <тип2>,…,<перемN> as <типN>)


<тело процедуры>
End Sub

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

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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
………………………………………….
Call <Имя>(<перем1>,<перем2>,…,<перемN>)
………………………………………….
End Sub

10.1.2 Процедура-функция Function…End Function, создаваемая пользователем

Процедура-функция, в отличие от процедуры общего вида Sub…End Sub имеет


возвращающее значение, которое, как правило, присваивается переменной, имеющей имя
данной функции:
Описание процедуры функции имеет следующий формат:

Function <Имя>(<перем1> as <тип1>, <перем2> as <тип2>,…,<перемN> _


as <типN>) as <тип>
<тело функции>
End Function

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


функции.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_


Handles Button1.Click
……

97
Z=<Имя>(<перем1>,<перем2>,…,<перемN>)
……
End Sub

10.1.3 Передача параметров в процедуры Sub…End Sub и Function…End Function

При написании пользовательских процедур и функций, различают формальные и


фактические параметры. При описании процедуры или функции в ее заголовке
записываются формальные параметры. Фактические параметры записываются в момент
вызова процедуры или функции.
Передача параметров в процедуры Sub…End Sub и Function…End Function может
осуществляться как по ссылке, так и по значению. Передача параметров по значению имеет
вид:

Sub Name1(ByVal x() as Single, ByVal N as Integer)


….
End Sub

Передача параметров по ссылке:

Sub Name1(ByRef x() as Single, ByRef N as Integer)


….
End Sub

Если в качестве передаваемого параметра выступает одномерный массив, то после его


имени, при записи формальных параметров, ставятся пустые круглые скобки. Если массив
является многомерным, то в круглых скобках должна быть указана запятая. При передаче
массива в момент вызова процедуры или функции в фактических параметра записывается
его имя, а скобки после имени не ставятся. Массивы и возвращаемые значения
рекомендуется передавать по ссылке.
Различия между передачей параметров по ссылке и по значению заключаются в
следующем. При передаче переменной по ссылке из основной программы в процедуру или
функцию, изменение значения переменной внутри процедуры или функции, приводит к
изменению ее значения в основной программе. При передаче переменной по значению, в
памяти компьютера для ее выделяется новая ячейка памяти и изменения значений
переменной внутри процедуры или функции, не изменяет ее значений в основной программе.
При завершении процедуры или функции переменная уничтожается, освобождая
выделенную до этого память.
В качестве примера приведем процедуру вычисления коэффициентов уравнения
регрессии y i = a ⋅ xi + b, i = 1..n методом наименьших квадратов.

Sub MNK1(x() as single, y() as single, N as integer, a as single, b as single)


Dim i as integer, s1 as single, s2 as single, s3 as single, s4 as single
s1=0:s2=0:s3=0:s4=0
For i=0 to N-1
s1=s1+x(i)
s2=s2+x(i)*x(i)
s3=s3+x(i)*y(i)
s4=s4+y(i)
Next i
a=(N*s3-s1*s4)/(N*s2-s1*s1)

98
b=(s2*s4-s1*s3)/(N*s2-s1*s1)
End Sub
Для поиска коэффициента уравнения регрессии y i = a ⋅ xi воспользуемся процедурой
функцией:

Function A (x() as single, N as integer) as single


Dim i as integer, s1 as single, s2 as single
s1=0:s2=0
For i=0 to N-1
s1=s1+x(i)*y(i)
s2=s2+x(i)*x(i)
Next i
A=s1/s2
End Function

10.1.4 Рекурсивные функции

Рекурсивной называется функция, которая вызывает сама себя. Рассмотрим пример


рекурсии на примере вычисления факториала. Факториалом числа n! называется
произведение натуральных чисел от 1 до n .
n
n!= ∏ i = 1 ⋅ 2 ⋅ ... ⋅ (n − 1) ⋅ n
i =1
Рекурсивная функция будет иметь вид:

Function F(N as Long) as Long


If N=0 Then F=1 Else F=N*F(N-1)
End Function

99
ЛИТЕРАТУРА

1. Информатика. Базовый курс: Учебник для вузов / С.В. Симонович.- СПб.: Питер, 2011. -
640 с.
2. Информатика: учебник под редакцией В.В. Трофимова. Электронные текстовые данные. –
М: Юрайт, 2012. – 911 с. (ЭБ)
3. Шапорев, С.Д. Информатика. Теоретический курс и практические занятия / С.Д. Шапорев.
- СПб.: БХВ, 2008. - 469 с.
4. Программные продукты Microsoft в химии и химической технологии. Подпрограммы и
функции в среде Visual Basic: учебное пособие /В.Н.Чепикова, Г.Н. Вениаминова, В.А.,
Холоднов, А.Г. Певнева. - СПб.: СПбГТИ(ТУ), 2010. - 46 с.
5. Чепикова, В.Н. Программные продукты Microsoft в химии и химической технологии.
Программирование разветвляющихся вычислительных процессов в среде Visual Basic, Excel
MathCad: учебное пособие/ В.Н.Чепикова, Г.Н. Вениаминова, В.А.Холоднов.- СПб.:
СПбГТИ(ТУ), 2011.-31 с.

100

Das könnte Ihnen auch gefallen