Ввод и вывод значений переменных в visual basic
Ввод и вывод значений переменных
Ввод данных с помощью функции InputBox
Для ввода значения переменной можно воспользоваться функцией с именем InputBox. Она выводит на экран диалоговое окно, содержащее сообщение и поле ввода, возвращает значение типа String, содержащее текст, введенный в поле ввода.
Упрощенный синтаксис обращения к функции:
InputBox(Сообщение,[Заголовок])
У этой функции первый слева аргумент обязательный, а все остальные – необязательные. Назначение аргументов:
Сообщение – выражение типа String, отображаемое в диалоговом окне;
Заголовок – выражение типа String, отображаемое в строке заголовка диалогового окна.
Пример.
Private Sub Command1_Click()
Label2.Caption = InputBox(
”Пожалуйста, введите Ваше имя”)
End Sub
В этой процедуре вызывается функция InputBox. При выполнении эта функция выводит диалоговое окно с запросом-подсказкой на ввод данных пользователем (рис. 5.4).
Значение аргумента функции InputBox выведено в виде запроса-подсказки в окне функции InputBox. Значением функции InputBox будет строка символов, которую пользователь наберет в поле окна функции InputBox. Это возвращаемое значение функцией InputBox присваивается свойству Caption надписи Label2.
Еще один пример:
Private Sub Command1_Click()
Dim Приглашение As String
Dim ПолноеИмя As String
Dim i As Integer, s As Single
Приглашение = "Пожалуйста, введите Ваше имя!"
ПолноеИмя = InputBox(Приглашение)
Label2.Caption = ПолноеИмя
i = InputBox("Задайте значение i")
‘String -> Integer
Label3.Caption = "i=" & i ‘Integer -> String
s = InputBox("Задайте значение s")
‘String ->Single
Label4.Caption = "s=" & s ‘Single -> String
End Sub
В процедуре Command1_Click объявлены четыре переменных, в том числе переменная i целого типа и переменная s с плавающей точкой обычной точности. Этим переменным также задаются значения с помощью обращений к функции InputBox. Полученные переменными i и s значения затем отображаются в полях надписей Label3 и Label4 соответственно.
Вывод данных с помощью инструкции Print
При помощи инструкции Print можно печатать тексты на форме, а также на изображении. Текст должен при этом стоять в кавычках (").
Пример:
Print "Эй, студент! Привет!"
Пишет на форме:
Эй, студент! Привет!
В инструкции Print можно выполнять вычисления, например:
Print 2*3
выдаст на форме:
6
Всё, что стоит после слова Print в кавычках, при выполнении компьютером, будет символ за символом выведено на форме. А всё, что стоит справа от Print не в кавычках, будет вычислено компьютером и выведено на форме.
Так, к примеру, 2*3 для компьютера означает результат умножения 2 на 3.
Синтаксис инструкции Print:
[объект.] Print [СписокВывода]
Здесь объект – это имя формы, может быть опущено для текущей формы, СписокВывода – текст, который печатается на форме. Несколько элементов в списке вывода отделяются друг от друга точкой с запятой (;) или запятой (,). При использовании запятой между выводимыми элементами СпискаВывода будут сделаны интервалы. При использовании точки с запятой между выводимыми элементами СпискаВывода они будут напечатаны друг за другом без перерыва. Например, следующая команда напечатает сообщение в форме Form1:
Form1.Print “Это форма Form1”
Если же форма Form1 является текущей, то имя объекта в команде может быть опущено и команда будет записана короче:
Print “Это форма Form1”
Если список вывода не заканчивается точкой с запятой (;) или запятой (,), то каждое обращение к инструкции Print начинает вывод в следующей строке. Если список вывода заканчивается точкой с запятой (;), то следующее обращение к инструкции Print приведет к продолжению печати в той же строке без перерыва. Если же список вывода заканчивается запятой (,), то следующее обращение к инструкции Print приведет к продолжению печати в той же строке с некоторым отступом.
Если нужно распечатать значения нескольких данных в одной строке, то все их нужно перечислить после команды Print в СпискеВывода, например, в результате выполнения пары инструкций:
Print "2*2 всё ещё равно "; 2*2;”,”
Print " а 59 умножить на ноль равно "; 59 * 0;”.”
получим:
2*2 всё ещё равно 4,
а 59 умножить на ноль равно 0.
Для очистки формы от результата вsполненной на ней ранее печати может быть применен метод Cls.
Например, следующая инструкция очистит форму Form1:
Form1.Cls
Если форма Form1 является текущей, то имя формы можно не указывать.
Форматирование вывода
Для форматирования чисел, дат и времени может быть применена функция Format. Эта функция преобразует число, дату или время в строку символов. Мы можем указать, сколько десятичных разрядов отведено на запись числа, нужны или нет лидирующие нули, замыкающие нули, обозначения валюты, разделители тысяч.
Вот упрощенный синтаксис функции Format: Format(Выражение, Формат). Параметр Выражение определяет значение, которое требуется преобразовать. Параметр Формат – это текстовая строка, сформированная из символов: (0) – в этой позиции должен быть напечатан замыкающий или лидирующий ноль; (#) – в этой позиции не следует печатать замыкающий или лидирующий ноль; (.), (,),
(-), (+), ($), ((), ()), (пробел) – эти символы печатаются в той позиции, где они указаны.
Ниже приводятся примеры преобразования чисел функцией Format:
Обращение к функции Результат
Format (315.4,”00000.00”) 00315.40
Format (315.4,”#####.##”) 315.4
Format (6315.4,”##,##0.00”) 6,315.40
Format (315.4,”$##0.00”) $315.40
Format (“09.10.2001”,”dd. mm. yy”) 09.10.01
Format (“09.10.2001”,”dddd, dd mmmm, yyyy года”) вторник, 09 октября, 2001 года
Лекция 6
Вывод данных с помощью функции MsgBox
Для вывода значения некоторого выражения может быть применена функция MsgBox. Для этого следует обратиться к функции MsgBox, пользуясь, например, упрощенным синтаксисом:
MsgBox (Сообщение)[, , Заголовок]
Здесь Сообщение – это выражение, которое будет преобразовано в строку символов и выведено в окне MsgBox, а Заголовок – строка символов, отображаемая в заголовке этого окна.
Пример 1
i = 5
MsgBox ("i= " & i), , "Вывод переменной i"
Окно функции MsgBox будет выглядеть так, как показано на рис. 6.1.
Управление порядком выполнения инструкций
Инструкции управления порядком выполнения команд позволяют оценить реальную ситуацию и адекватно реагировать на нее, принимая решения о дальнейших действиях. VB предоставляет для этого ряд инструкций.
Условная инструкция If … End If
Наиболее часто для программирования разветвлений используется инструкция If… End If (блок-схема реализуемого алгоритма на рис. 6.2), которая может иметь простую однострочную или блочную структуру.
Однострочный синтаксис
If ЛВ Then Инструкция1 [Else Инструкция2]
Здесь If (если), Then (то) и Else (иначе) — зарезервированные слова, ЛВ – логическое выражение. Существенно, что здесь после слова Then, а также после слова Else может находиться только одна инструкция. Выполнение такой инструкции состоит в следующем. Если ЛВ, имеет значение True, выполняется Инструкция1, указанная за Then, а инструкция 2 не выполняется (пропускается). Если же значение ЛВ равно False, то выполняется Инструкция2, следующая за ключевым словом Else, если такая имеется, а Инструкция1 пропускается.
Пример 2
If A = 7 Then Beep
В этом примере выдается звуковой сигнал, если переменная А равна 7.
Пример 3
If X < 9 Then Print "False!" Else Print "True!"
В примере 3 выводится текст False!, если значение переменной X меньше 9. В противном случае выводится текст True!.
Блочный синтаксис
If ЛВ1 Then
[Инструкции1]
[ElseIf ЛВi Then
[Инструкцииi]]
[Else
[Инструкции2]]
End If
Если в зависимости от условия необходимо выполнить не одну инструкцию, а несколько инструкций, следует использовать блочный синтаксис. Это относится и к ветви Else. Кроме того, блочная структура с ElseIf позволяет анализировать несколько условий. Здесь каждая из Инструкции1, Инструкции2 и ИнструкцииI – это одна или несколько инструкций.
Выполнение этой инструкции If состоит в следующем. Сначала проверяется значение ЛВ1. Если оно истинно, то выполняется группа Инструкции1 и на этом выполнение инструкции If завершается. Если же значение ЛВ1 ложно, то проверяется значение следующего условия ЛВi. Если оно истинно, то выполняется группа ИнструкцииI и на этом выполнение инструкции If завершается. Если же значение ЛВi ложно, то проверяется следующее ЛВi. Если же все ЛВi оказываются ложными, то выполняется группа инструкций Инструкции2.
Пример 4
If A = 7 Then
Beep
End If
В этом примере звуковой сигнал прозвучит только в том случае, если значение переменной А равно 7.
Пример 5
If Name = "Иванов" Then
Print "Ваша карточка удерживается!"
Else
Print "Получите деньги, пожалуйста!"
End If
В этом примере, если значение переменной Name равно “Иванов”, то будет выведено Ваша карточка удерживается!. При любом другом значении переменной Name будет выведено Получите деньги, пожалуйста!
Пример 6
If Обращение = 1 Then
Print "Здравствуйте, господин"
ElseIf Обращение = 2 Then
Print " Здраствуйте, госпожа"
Elself Обращение = 3 Then
Print " Здравствуйте, дамы и господа"
Else
Print "Здравствуйте, люди"
End If
Для этого примера результат вывода показан в таблице:
Значение переменной Обращение |
Результат вывода |
1 |
Здравствуйте, господин |
2 |
Здравствуйте, госпожа |
3 |
Здравствуйте, дамы и господа |
Любое другое, кроме 1, 2, 3 |
Здравствуйте, люди |
Инструкция выбора Select Case (выбрать в случае)
Еще одной инструкцией VB, предназначенной для программирования разветвлений, является Select Case (инструкция выбора), которая позволяет выполнить одну из нескольких групп операторов в зависимости от значения некоторого выражения.
Инструкция Select Case имеет следующий синтаксис:
Select Case Проверочное_выражение
[Case Значение1
[Инструкции1]]
[Case Значение2
[Инструкции2]]
[Case Else
[ИнструкцииЗ]]
End Select
Пример 7
Select Case V
Case 1
Print "Равно 1"
Case 2, 3
Print "Равно 2 или 3"
Case 4 То 6
Print "Больше или равно 4 и меньше или равно 6"
Case Is >= 9
Print "Больше или равно 9"
Case Else
Print "Ни одно из предшествующих"
End Select
В качестве значения для блока Case можно указывать не только одно значение (1), но и несколько, разделенных запятой, (2, 3). Можно определять также области сравнения (4 То 6) или воспользоваться относительным сравнением (Is >= 9). Вместо непосредственного значения проверочного выражения можно использовать ключевое слово Is.
Блок Case Else выполняется, если ни одно из предыдущих условий не является истинным.
Если условию Select Case соответствует несколько блоков Case, то выполняется первый из них.
Инструкции цикла
Инструкция цикла представляет собой указание, из которого ясно, какой набор инструкций (этот набор инструкций называется телом цикла) нужно выполнять многократно и каково правило окончания выполнения цикла.
1. Параметрический цикл For… Next
Этот цикл управляется параметром, который при повторении выполнения тела цикла изменяет с заданным шагом свое значение от заданного начального значения до заданного конечного значения. Такой цикл используют в случае, когда заранее известно, сколько необходимо совершить повторений выполнения тела.
Синтаксис инструкции цикла:
For ИПЦ = НЗПЦ To КЗПЦ [Step ШИПЦ]
Тело цикла (одна или несколько инструкций)
Next [ИПЦ]
Слова For (для), To (до), Step (шаг), Next (затем) являются зарезервированными.
Применены обозначения:
ИПЦ – имя параметра цикла (переменная любого числового типа);
НЗПЦ – начальное значение параметра цикла (выражение любого числового типа), которое параметр цикла будет иметь при первом выполнении тела цикла;
КЗПЦ – конечное значение параметра цикла (выражение любого числового типа);
ШИПЦ – шаг изменения параметра цикла (выражение любого числового типа) – необязательная часть инструкции цикла.
Числовые значения НЗПЦ и КЗПЦ задают интервал, в котором будет изменяться параметр цикла. Необязательный параметр ШИПЦ задает шаг изменения параметра цикла на каждом проходе. По умолчанию, если он отсутствует, то принимается равным 1. Наконец, после инструкций, составляющих тело цикла, следует команда Next, обозначающая границу действия цикла. В случае вложенных циклов (в тело цикла входит инструкция цикла) можно указывать, к какому из них относится команда Next. Это достигается добавлением после слова Next имени параметра цикла.
Процесс выполнения инструкции For… Next для положительного шага иллюстрирует рисунок 6.3. Рассмотрим примеры.
Пример 8
Сумма=0
For i = 1 To 100 Step 2
Сумма = Сумма +i
Next
В этом примере вычисляется сумма всех целых нечетных чисел от 1 до 100.
Пример 9
For n = 100 To 60 Step –10
Print n
Next n
В примере 9 продемонстрированы две возможности: явно заданный шаг цикла и отсчет в обратном направлении. Последнее достигается заданием отрицательного шага и тем, что начальное значение параметра цикла больше, чем конечное.
Этот код выведет на текущей форме:
100
90
80
70
60
Пример 10
Dim x As Integer
For x = 1 To 50
Beep
Next
Эта программа заставляет компьютер подавать звуковой сигнал 50 раз.
Инструкцию For…Next можно завершить досрочно с помощью инструкции Exit For. Выполнение этой инструкции приводит к досрочному завершению выполнения инструкций тела цикла и выходу из цикла.
For …
.
.
.
Exit For
Лекция 7
2. Итерационный цикл Do While…Loop или Do…Loop While
Здесь While (пока) и Loop (цикл) зарезервированные слова. Циклы типа While предназначены для ситуаций, когда количество повторений тела цикла (итераций) заранее неизвестно. Вот синтаксис двух разновидностей цикла While:
Первый вариант:
Do While УсловиеПовторения
Группа инструкций
Loop
Здесь УсловиеПовторения – это выражение логического типа (подробнее), которое принимает либо значение True, либо значение False. Выполнение этой инструкции происходит так. Сначала вычисляется значение логического выражения УсловиеПовторения. Если оно имеет значение True, то выполняются инструкции, помещенные между строками Do While и Loop. Затем все повторяется с начала. Если же логическое выражение имеет значение False, то происходит выход из цикла. Следующей будет выполнена инструкция, помещенная ниже строки Loop. Все это поясняет блок-схема на рис. 7.1.
Второй вариант:
Do
Группа инструкций
Loop While УсловиеПовторения
Блок-схема реализуемого алгоритма приведена на рис. 7.2. Различие между этими двумя вариантами заключается в том, что УсловиеПовторения (условие повторения выполнения тела цикла) проверяется в первом случае до выполнения тела цикла (цикл – пока), а во втором случае – после выполнения тела цикла (цикл — до).
Перейдем к примерам. Рассмотрим действие следующего участка программы.
Пример 1
Счетчик = 0
Номер = 20
Do While Номер > 10
Номер = Номер – 1
Счетчик = Счетчик + 1
Loop
MsgBox ("Выполнено " & Счетчик & " итераций цикла.")
При выполнении этого участка программы в окне функции MsgBox будет выведено:
Выполнено 10 итераций цикла.
В этой программе условие проверяется до входа в цикл. Если переменной Номер задать значение, равное 10 вместо 20, инструкции внутри цикла выполняться не будут.
Пример 2
В следующей программе инструкции внутри цикла выполняются только один раз до того, как условие не будет выполнено.
Счетчик = 0
Номер = 9
Do
Номер = Номер – 1
Счетчик = Счетчик + 1
Loop While Номер > 10
MsgBox ("В цикле выполнено " & counter & " итераций.")
Инструкцию Do…Loop можно завершить досрочно с помощью инструкции Exit Do.
3. Итерационный цикл Do Until…Loop или Do…Loop Until
Until (до) – зарезервированное слово. По своей логике цикл Until подобен циклу While с той лишь разницей, что выполнение условия означает необходимость выхода из цикла. Как и в случае цикла While, проверка условия выхода в цикле Until может осуществляться перед очередным проходом или после него. Вот синтаксис этих двух вариантов.
Первый вариант:
Do Until УсловиеВыхода
Группа инструкций
Loop
Блок-схема реализуемого алгоритма приведена на рис. 7.3.
Второй вариант:
Do
Группа инструкций
Loop Until УсловиеВыхода
Блок-схема реализуемого алгоритма приведена на рис. 7.4.
Перейдем к примерам.
Пример 3
Рассмотрим действие участка программы:
Счетчик = 0
Номер = 20
Do Until Номер = 10
Номер = Номер – 1
Счетчик = Счетчик + 1
Loop
Переменная Счетчик получит значение 10.
Пример 4
Счетчик = 0
Номер = 1
Do
Номер = Номер + 1
Счетчик = Счетчик + 1
Loop Until Номер = 10
Переменная Счетчик получит значение 9.
Инструкцию Do…Loop можно завершить досрочно с помощью инструкции Exit Do.
Пример 5
Задана строка символов. Получить новую строку символов, отличающуюся от исходной тем, что из нее удалены все пробелы.
Так, например, строки “Это тест” и “ Это тест ” должны считаются идентичными.
Применим некоторые стандартные функции VB, предусмотренные для обработки строк:
Len(Строка) – возвращает количество символов в аргументе Строка;
InStr([Начало], Строка1,Строка2) – возвращает номер позиции, начиная с которой Строка2 входит в Строку1 или 0, если Строка2 не входит в Строку1, аргумент Начало – номер позиции, с которой начинается поиск;
Left(Строка, КоличествоСимволов) – возвращает строку, включающую первые КоличествоСимволов аргумента Строка;
Right(Строка, КоличествоСимволов) – возвращает строку, включающую последние КоличествоСимволов аргумента Строка.
Function УдалениеПробелов(Строка As String) As String
Dim Длина As Long, Позиция As Long, Старт As Long
Старт = 1
Do
Длина = Len(Строка)
Позиция = InStr(Старт, Строка, " ")
If Позиция > 0 Then Строка = Left(Строка, Позиция – 1) _
& Right(Строка, Длина – Позиция)
Старт = Позиция
Loop Until Позиция = 0
УдалениеПробелов = Строка
End Function
В этой функции в цикле определяется номер позиции от начала заданной строки, в которой стоит пробел. Затем из строки вырезается эта позиция с пробелом. Цикл прекращается, когда в строке не остается ни одного пробела (в этом случае функция InStr(Старт, Строка, " ") возвратит 0).
Операции и функции
В расположенной далее таблице дан полный перечень операций, которые могут быть применены к числовым данным.
Операция |
Функция |
|
Математические операции |
||
[операнд1] + [операнд2] |
Сложение |
|
[операнд1] — [операнд2] |
Вычитание |
|
— операнд |
Перемена знака |
|
[операнд1] * [операнд2] |
Умножение |
|
[операнд1] / [операнд2] |
Деление |
|
[операнд1] [операнд2] |
Целочисленное деление. Результат – целая часть отношения операндов |
|
[операнд1] MOD [операнд2] |
Деление по модулю. Операнды округляются до целого значения. Результат – остаток отношения операндов, например 5.4 MOD 2 = 1 |
|
[операнд1] ^ [операнд2] |
Возведение в степень |
|
Операции отношения |
||
[операнд1] < [операнд2] |
Меньше. |
Результат True, если отношение выполняется, или False, если отношение не выполняется |
[операнд1] > [операнд2] |
Больше |
|
[операнд1] <= [операнд2] |
Меньше или равно |
|
[операнд1] => [операнд2] |
Больше или равно |
|
[операнд1] = [операнд2] |
Равно |
|
[операнд1] <> [операнд2] |
Не равно |
Если в выражении использовано несколько операций, то в первую очередь выполняются операции, имеющие наивысший приоритет. Если приоритет операций одинаковый, то они выполняются слева направо.
Таблица приоритетов.
Приоритет |
Операция |
1 |
Вызов функции, скобки. |
2 |
^ |
3 |
— |
4 |
*, / |
5 |
|
6 |
MOD |
7 |
+, — |
Математические функции (углы выражаются в радианах).
Обращение к функции |
Возвращаемое значение |
Abs(x) |
Абсолютное значение х |
Atn(x) |
arctg x |
Cos(x) |
cos x |
Exp(x) |
ex |
Int(x) |
Целая часть |
Fix(x) |
Целая часть |
Log(x) |
ln x |
Rnd |
Случайное число |
Sgn(x) |
Знак числа |
Sin(x) |
sin x |
Sqr(x) |
Квадратный корень от х |
Tan(x) |
tg x |
Функции Int и Fix возвращают значение типа, совпадающего с типом аргумента, которое содержит целую часть числа.
Синтаксис:
Int(число)
Fix(число)
Обязательный аргумент число – это любое допустимое числовое выражение. Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, а Fix ближайшее отрицательное целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8.
Функция Rnd возвращает значение типа Single, содержащее случайное число, меньшее 1 и большее или равное нулю.
Перед первым вызовом функции Rnd надо использовать инструкцию Randomize без аргумента для инициализации генератора случайных чисел.
Лекция 8
Массив
Массив представляет собой совокупность однотипных элементов, для хранения значений которых отводится столько ячеек памяти, сколько их содержится в массиве. Каждая ячейка памяти отводится под отдельный элемент массива. Таким образом, массив является структурированной переменной в отличие от скалярной простой переменной. Все элементы массива имеют один и тот же тип.
При необходимости выполнить некоторое действие над всеми элементами массива можно сослаться на массив как целое по его имени. Возможны также ссылки на его отдельные элементы. Каждый отдельный элемент массива определяется именем массива и значениями индексов. Например, ссылка a(7) означает, что а – это имя одномерного массива с одним индексом, элемент массива имеет значение индекса равное 7. Одномерный массив принято называть вектором. Например, ссылка a1(2, 9) означает, что а1- это имя двумерного массива Двумерные массивы принято называть матрицами. Можно по аналогии с матрицами считать, что элемент a1(2, 9) принадлежит 2 строке и 9 столбцу.
Как и простые переменные, массивы описываются с помощью инструкций Dim, Static, Private или Public. Разница в объявлении между скалярными переменными (т. е. не массивами) и массивами состоит в том, что для массива надо указывать его размер (количество ячеек, отводимых под массив). Массив с заданным размером называется фиксированным. Массив, объявление размера которого отложено, называется динамическим.
1. Описание массива фиксированного размера
При объявлении фиксированного массива, кроме его имени и типа элементов, необходимо для каждого индекса указать его верхнюю и нижнюю границы:
НижняяГраница To ВерхняяГраница
Например, Dim x(1 To 10) As Single
При объявлении можно указать, только верхнюю границу, тогда по умолчанию нижняя граница равна 0. Нижняя граница по умолчанию будет установлена равной 1, если в главной секции имеется инструкция Option Base 1. Допустимым значением для Option Base являются только 0 и 1.
В следующей строке программы массив фиксированного размера описывается как массив типа Integer, имеющий 11 строк и 11 столбцов:
Dim a1(10, 10) As Integer
Первый аргумент внутри скобок представляет строки, а второй – столбцы.
Как и при описании скалярных переменных, если тип при описании массива не задается, подразумевается, что элементы массива имеют универсальный тип Variant.
Пример 1. Вычисление среднего арифметического.
Вычислить
, k <= 100.
1. Применяемые данные
Исходные данные:
k – переменная целого типа, число заданных величин;
a (100) – фиксированный массив с плавающей точкой обычной точности, значения заданных величин.
Результаты:
s – переменная с плавающей точкой обычной точности, значение среднего арифметического;
Промежуточные:
Сумма – переменная с плавающей точкой обычной точности, значение суммы первых k элементов массива x;
i – переменная целого типа, значение индекса элемента массива x..
2. Построение блок-схемы алгоритма
Полная блок-схема алгоритма приведена на рис. 8.1 и 8.2.
Остановимся подробнее на блок-схеме, изображенной на рис. 8.1. Все входящие в нее блоки пронумерованы. Она содержит один укрупненный блок (№ 2), который выполняет ввод массива (задает значения элементам массива). Это означает, что этот блок от точки входа до точка выхода имеет собственную блок-схему, которой мы займемся позже. А пока на этом блоке просто записано, что он делает.
Укрупненные блоки обычно изображаются в виде прямоугольника с двойными вертикальными сторонами.
Посмотрим на эту блок-схему с точки зрения базовых структур, которые в нее входят. Блоки 1 – 3 составляют последовательную структуру (следование), которую мы назовем Структура 1. Блоки 4 – 7 относятся к циклу. Эту структуру мы назовем, Структура 2. Блоки 8, 9 – это опять последовательная структура, которую мы назовем Структура 3. Структура 1, Структура 2 и Структура 3, рассматриваемые в совокупности также являются структурой следования. В блок-схеме любого структурированного алгоритма всегда можно ясно увидеть базовые структуры, из которых строится алгоритм.
На рис. 8.2 приведена блок-схема алгоритма ввода массива. Дело в том, что в VB нет такой инструкции, которая бы одна обеспечивала ввод всего массива. Можно ввести значение лишь одного элемента массива. Поэтому для ввода массива приходится применять цикл.
3. Разработка интерфейса проекта
В этом проекте и во многих следующих примерах мы будем применять простейший интерфейс, когда на форме находится единственная кнопка Command1, щелчок на которой начинает выполнение кода проекта. Свойству Caption этой кнопки следует задать значение Вычислить. Свойству AutoRedraw формы следует задать значение True, чтобы после перекрытия окна формы другим окном или при свертывании формы и ее развертывании происходило перерисовывание выведенной на ней информации.
Рис. 8.3. Интерфейс проекта |
4. Составление программы
Option Explicit
Option Base 1
Private Sub Command1_Click()
1: Dim k As Integer
Dim a(100) As Single
Dim s As Single
Dim i As Integer
5: Dim Сумма As Single
Cls
k = InputBox("Введите k")
Print "k = " & k
ВводВектора a, k
10: Сумма = 0
For i = 1 To k
Сумма = Сумма + a(i)
Next
s = Сумма / k
15: Print "Среднее арифметическое равно " & s
End Sub
Private Sub ВводВектора(x() As Single, n As Integer)
Dim i As Integer
For i = 1 To n
x(i) = InputBox("Элемент вектора (" & i & ")=?", "Ввод вектора")
Print x(i),
Next
End Sub
Инструкция Option Explicit в главной секции требует явного объявления переменных. Эта инструкция, если она есть, всегда должна быть первой в главной секции.
Инструкция Option Base 1 в главной секции устанавливает, что по умолчанию нажняя граница индекса массива равна не 0, а 1.
После запуска проекта на выполнение программный код начнет выполняться только после нажатия на кнопки Command1. В этом случае для кнопки Command1 происходит событие Click, что и приводит к выполнению событийной процедуры Command1_Click.
В строках 1 – 5 тела этой процедуры находятся инструкции объявлений данных. При этом под переменные и под массив отводится память. В строке 6 тела процедуры содержится обращение к методу Cls, который обеспечивает очистку формы от ранее выведенной на ней информации, что возможно, когда на кнопку Command1 Вы нажимаете не первый раз. Инструкция присвоения в строке 7 задает значение переменной k (то значение, которое будет введено в окне функции InputBox). Следующая инструкция, находящаяся в строке 8 для контроля печатает на форме значение переменной k. В строке 9 содержится обращение к пользовательской процедуре ВводВектора. Выполнение этого обращения упрощенно можно понимать так, что выполняются все инструкции тела процедуры ВводВектора, в которых предварительно имя агумента x заменено на указанное в обращении значение аргумента a, и имя аргумента n заменено на k.
Строки 1 – 10 процедуры Command1_Click реализуют часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 1. Вот так следующими сверху вниз инструкциями реализуется на VB базовая структура алгоритма, называемая следованием.
Строки 11 – 13 процедуры Command1_Click реализуют цикл. В данном случае это та часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 2. Обратите внимание на то, что в программе нет инструкции i = 1, а также инструкции i = i + 1, несмотря на то, что эти инструкции есть в блок-схеме. Нет также проверки условия i <= k. В программе выполнение этих действий обеспечивает инструкция For … Next.
Строки 14 и 15 процедуры Command1_Click реализуют часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 3.
Процедура Ввод_вектора выполняется при обращении к ней в процедуре Command1_Click. Обращение (это инструкция, включающая имя процедуры и значения аргументов) приводит к выполнению тела процедуры, в котором имена аргументов (примененные в объявлении процедуры) заменены именами значений аргументов (указанными в обращении к процедуре). Эта процедура обеспечивает ввод значений всех элементов одномерного массива, а также печать на форме для контроля всех введенных значений элементов массива.
Пример 2. Счастливые билеты
Трамвайный билет имеет шестиразрядный номер. Сколько всего таких билетов, у которых сумма первых трех цифр номера равна сумме последних трех цифр?
Option Explicit
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer
Dim КСБ As Long
Dim s(27) As Integer
‘ Сумма цифр трех правых разрядов (а также трех левых
‘ разрядов) может принимать значения 0, 1, 2, … , 27.
For i = 0 To 27
s(i) = 0
Next
‘ Обнуление счетчика s( i ). Дальше в кратном цикле
‘ вычисляются s( i ), равное числу выпадения суммы цифр трех
‘ разрядов, равной i.
For i = 0 To 9
For j = 0 To 9
For k = 0 To 9
s(i + j + k) = s(i + j + k) + 1
Next k, j, i
‘ Находим Количество счастливых билетов (КСБ).
‘ При этом учтем, что при каждом значении суммы трех левых
‘ разрядов, равной i, эта же сумма в трех правых
‘ разрядах выпадает s( i ) раз. Но и в трех левых разрядах она
‘ появляется тоже s( i ) раз. Следовательно, всего случаи
‘ равенства суммы трех левых и трех правых разрядов значению i
‘ имеют место s( i )^2 раз.
КСБ = 0
For i = 0 To 27
КСБ = КСБ + s(i) ^ 2
Next
Print “Найдено “; КСБ – 1; “ счастливых билетов”
‘ Вычли 1, так как номера 000000 нет. Нумерация начинается
‘ с номера 000001.
End Sub
При выполнении программы на форме будет выведено:
Найдено 55251 счастливых билетов
2. Описание динамического массива
Если массив описан как динамический, можно изменять его размер во время работы программы. Для описания динамического массива используются инструкции Static, Dim, Private или Public с пустыми скобками:
Dim a2 () As Single
При выполнении программы можно переобъявлять динамический массив с помощью инструкции ReDim.
Среди инструкций некоторой процедуры или функции можно записать:
ReDim a2 (5, 1 To 10)
Далее этот массив может быть переопределен:
ReDim a2 (15)
С помощью инструкции ReDim можно изменять размер массива (число элементов), верхние и нижние границы индексов, а также количество размерностей (индексов). Инструкцию ReDim можно применять для изменения динамического массива столько раз, сколько потребуется. Однако при каждом применении данные, содержащиеся в массиве, теряются.
Инструкция ReDim Preserve может увеличить размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить размер массива a4 на 10 элементов без уничтожения текущих значений элементов массива. Пусть был объявлен динамический массив
Dim a4 () As Integer
Затем в программе установлен размер этого массива
ReDim a4 (n)
Далее в программе может быть, например, записано
ReDim Preserve a4(n+10)
Использование зарезервированных слов ReDim Preserve вместе с динамическим массивом позволяет изменить только верхнюю границу и только последней размерности массива. Изменение числа размерностей невозможно.
3. Присвоение массивов
Начиная с VB 6.0, имеется возможность присвоить содержимое одного массива другому так же, как это делается для простых переменных. Но эти массивы должны иметь одинаковые значения размерностей и одинаковое количество элементов. Если же в левой части оператора присвоения стоит динамический массив, то совпадение размерностей и числа элементов не обязательно. Размерность и число элементов массива в левой части оператора присвоения при необходимости изменятся.
Лекция 9
Пример. Найти значение наибольшего элемента одномерного массива.
1. Выбор данных.
Исходные данные:
k – Переменная целого типа, число заданных величин;
a ( ) – динамический массив с плавающей точкой обычной точности, значения заданных величин.
Результаты:
НаибЭлем – переменная с плавающей точкой обычной точности, значение наибольшего среди рассмотренных элементов массива a;
Промежуточные:
i – переменная целого типа, значение индекса элемента массива x.
2. Построение блок-схемы алгоритма (см. рис. 9.1).
Ввод массива представлен укрупненным блоком (блок 2). Основой алгоритма является цикл (блоки 4 – 8). В этот цикл входит разветвление (блоки 6 и 7).
3. Разработка интерфейса проекта
Воспользуемся тем же интерфейсом проекта, который был применен для примера, рассмотренного в предыдущей лекции (подробнее).
4. Составление программы.
Option Explicit
Option Base 1
Private Sub Command1_Click()
1: Dim i As Integer, k As Integer
Dim a() As Single
Dim НаибЭлем As Single
Cls
5: k = InputBox("Введите k")
Print "k= " & k
ReDim a(k)
Print "Ввод вектора а"
Ввод_вектора a
10: НаибЭлем = a(1)
For i = 2 To k
If a(i) > НаибЭлем Then НаибЭлем = a(i)
Next
Print "Наибольший элемент равен "; НаибЭлем
End Sub
Private Sub Ввод_вектора(x() As Single)
1: Dim i As Integer
Dim i_min As Integer
Dim i_max As Integer
i_min = LBound(x)
5: i_max = UBound(x)
For i = i_min To i_max
x(i) = InputBox("Элемент вектора (" _
& i & ")=?", "Ввод вектора")
Print x(i),
Next
End Sub
В этой программе применяется динамический массив a. В строке 9 тела процедуры Command1_Click происходит обращение к процедуре Ввод_вектора, которая обеспечивает ввод всех элементов массива a. Упрощенно можно действие этого обращения понимать так, как будто на месте строки 9 выполняется все тело процедуры Ввод_вектора, во всех инструкциях которого имя x заменено на имя a. Процедура Ввод_вектора обеспечивает не только ввод значений всех элементов массива, но печать на форме их значений для контроля правильности задания значений при вводе. В этой процедуре применяется обращение к функция LBound(x), которая возвращает наименьшее значение индекса массива, имя которого является аргуменом этой функции. В процедуре Ввод_вектора также применяется обращение к функция UBound(x), которая возвращает наибольшее значение индекса массива, имя которого является аргуменом этой функции.
Инструкция, находящаяся в стоке 8 процедуры Ввод_вектора, обеспечивает печать элемента массива. Следующий элемент массива будет выведен в той же самой строке (подробнее).
Инструкция, находящаяся в стоке 10 процедуры Ввод_вектора, нужна, чтобы следующая (если такая есть) инструкция Print после выхода из процедуры Ввод_вектора выводила информацию на форме не в той же самой, а в следующей строке.
Логические операции
Эти операции могут применяться к данным и выражениям логического типа (Boolean).
В VB определены 6 логических операций: And (логическое «И»), Or (логическое «ИЛИ»), Not (логическое отрицание), Imp (логическая импликация), Xor (логическое исключительное «ИЛИ»), Equ (логическая эквивалентность). Рассмотрим первые три операции из этого списка. Операции Imp, Xor и Equ – реликты старых версий VB.
Операция Not имеет следующий синтаксис:
Not Операнд
Операнд, имеющий логический тип, – это отношение, переменная или функция логического типа или результат логической операции. Результат логического отрицания имеет значение противоположное значению ее операнда, что показывает приведенная ниже таблица:
Значение операнда |
Значение операции Not Операнд |
True |
False |
False |
True |
Операция And имеет два операнда:
Операнд 1 And Операнд 2
Результат операции логическое «И» определяет таблица:
Значение операнда 1 |
Значение операнда 2 |
Значение операции Операнд 1 And Операнд 2 |
True |
True |
True |
True |
False |
False |
False |
True |
False |
False |
False |
False |
Операция And имеет значение True только тогда, когда оба операнда имеют значение True.
Пример. Неравенство a ≤ x ≤ b следует записать a <= x And x <= b
Операция Or также имеет два операнда:
Операнд 1 Or Операнд 2
Результат операции логическое «ИЛИ» дан в таблице:
Значение операнда 1 |
Значение операнда 2 |
Значение операции Операнд 1 OR Операнд 2 |
True |
True |
True |
True |
False |
True |
False |
True |
False |
False |
False |
False |
Операция Or имеет значение True, если хотя бы один операнд имеет значение True.
Пример. Условие значение х не принадлежит отрезку [a, b] следует записать:
x < a Or x > b или Not (x >= a And x <= b).
Логические операции имеют более низкий приоритет, чем арифметические операции.
Таблица приоритетов.
Приоритет |
Операция |
1 – 7 |
Арифметические операции |
8 |
<, >, <=, >=, =, <> |
9 |
Not |
10 |
And |
11 |
Or |