Перейти к версии для печати - Международный банковский

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Практическая работа по теме 4. Управляющие структуры
и процедурное программирование
Структура ветвления If..Then..Else. Структура ветвления Select
Case. Структура цикла For..Next. Структура цикла For Each..Next.
Структура цикла Do..Loop.
Практическая работа по теме 4. Управляющие структуры и процедурное
программирование .........................................................................................................................1
Задание 1. Структура ветвления If..Then..Else ........................................................................1
Задание 2. Структура ветвления Select Case .........................................................................10
Задание 3. Структура цикла For..Next ...................................................................................12
Задание 4. Структура цикла For..Each ...................................................................................15
Задание 5. Структура цикла Do..Loop ...................................................................................17
Задание 1. Структура ветвления If..Then..Else
Задача
Рассмотреть
структуры,
позволяющие
изменять
последовательности выполнения строк программы.
Решение
Изучить
все
If..Then..Else.
варианты
синтаксиса
конструкции
порядок
ветвления
Обсуждение
При программировании на любом языке вы столкнетесь с тремя
типами структур (групп управляющих операторов), которые позволяют
управлять порядком выполнения строк кода программы. Этими
структурами являются структуры ветвления, структуры организации
цикла и структуры передачи управления. Начнем изучение
управляющих структур со структур ветвления.
При выполнении ветвления сначала осуществляется что-то вроде
проверки. На основании результатов проверки один из наборов кодов
выполняется, а остальные пропускаются.
Существуют две разновидности структур ветвления:
If..Then..Else – обычно используется для выбора одного из двух
(иногда более) наборов строк, подлежащих выполнению, на основании
удовлетворения некоего условия. If..Then..Else является инструментом
выбора в случае сложных сравнений, например, выражений с
применением операций AND, OR и NOT.
Select Case – обычно используется для выбора одного из набора
строк, который будет выполнен, из множества возможных наборов,
при этом выбор осуществляется, как правило, при довольно простом
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
сравнении (равенство значению или строке). Конструкцию Select Case
еще называют «переключателем».
Операции сравнения, выполняемые при вычислении условий в
конструкциях выбора, приведены в табл. 4.1.
Табл.4.1.
Операции сравнения VB .NET
Равенство
=
Меньше чем
<
Меньше
или <=
равно
Неравенство
<>
Больше чем
>
Больше
или >=
равно
Знак равенства (=) может использоваться для присвоения переменной
некоторого значения, например: X = 10 или S=”текст”.
Однако в VB.NET знак равенства может использоваться иным
образом, например:
If X = 10 Then Console.WriteLine(X.ToString) – то есть, если значение Х
равно значению Y, то выполнить заданное действие. Способ
применения знака равенства определяется контекстом. При обычном
использовании он присваивает значение переменной, если же он
входит в состав оператора If..Then, то будет выполнена операция
сравнения.
Оператор (=) можно также применять для сравнения значений двух
операндов, например переменных или выражений. Результат
сравнения является булевым значением:
True или False: If X = Y+10 Then..или If X+10 = Y+10 Then..
Рассмотрим все возможные синтаксические формы оператора
If..Then..Else.
If <условие> Then действие
Первый и самый простой синтаксис применяется в том случае, если
требуется выполнить один оператор при условии True. С помощью
этого метода нельзя выполнить операторы, если условное выражение
оценивается как False. В случае если условие не выполняется (равно
False), действие, указанное после ключевого слова Then не
выполняется и ход программы продолжается со следующей строки.
Рассмотрим практическое применение конструкции If Then при
программировании интерфейса пользователя.
Например, если пользователь Windows-приложения устанавливает
флажок, чтобы сообщить о том, что ему нужен факс, необходимо
попросить пользователя ввести номер факса. Если флажок не
устанавливается, никаких действий предпринимать не следует (рис.
4.1). Для реализации рассмотренного случая можно использовать
однострочный синтаксис условного оператора.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Private Sub Form10_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
GroupBox2.Visible = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked = True Then GroupBox2.Visible = True
End Sub
Значение логического выражения True принято считать значением по
умолчанию, то есть, можно переписать условие включения видимости
группы элементов следующим образом:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked Then GroupBox2.Visible = True
End Sub
Булево значение True считается значением по умолчанию, поэтому
True
можно
не
указывать:
If
RadioButton1.Checked
Then
GroupBox2.Visible = True
Второй, более сложный синтаксис условного оператора
If <условие> Then <действия> End If
используется, если необходимо выполнить несколько программных
команд в случае равенства условия True и не выполнять никаких
команд при условии, равном False. Например, в нашем примере, если
пользователь нужен факс, то необходимо не только попросить ввести
номер факса, но и предложить возможность отправить факс. Внесем
изменения в нашу программу и отобразим эти действия в windows
интерфейсе.
Private Sub Form10_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
GroupBox2.Visible = False
Button2.Visible = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked Then
GroupBox2.Visible = True
Button2.Visible = True
End If
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4.1. Использование структуры ветвления для организации хода программы
Рассмотрим еще одну форму условного оператора, включающую
ключевое слово Else:
If <условие> Then <действие> Else <действие>
Условное выражение может выполняться, то есть принимать значение
True, и тогда необходимо выполнить определенные действия, но
может не выполняться, принимать значение False, и в этом случае
необходимо выполнить другие действия.
Например, если пользователю нужен факс, то ему предоставляется
ввести его номер. Но если он отказывается, ему выдается сообщение
о том, что факс посылаться не будет (рис. 4.2). В этом случае
необходимо использовать If..Then..Else, чтобы отделить код, который
будет выполняться в случае False от кода для случая True:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked Then
GroupBox2.Visible = True
Else
MsgBox("Имейте в виду, что факс не будет отослан")
End If
End Sub
Так как и в случае равенства условия True, и в случае равенства
условия False необходимо выполнить только по одному оператору,
предложенный код можно было записать в одну длинную строку, без
использования End If, но строка получается слишком длинной (можно
использовать любой вариант записи, как вам удобнее читать
программу).
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked Then GroupBox2.Visible = True Else
MsgBox("Имейте в виду, что факс не будет отослан")
End Sub
Рис. 4.2. Использование сложного синтаксиса If..Then..Else
Остается рассмотреть наиболее сложный вариант условного
оператора:
If..Then..ElseIf
Есть и четвертый уровень, который сложен и используется редко, хотя
в ряде ситуаций без него не обойтись. Он позволяет выбирать, какой
из нескольких сегментов кода будет выполняться, в соответствии со
сложным критерием. Для этого необходимо отделять каждый случай
ключевым словом ElseIf (одно слово) и закрыть условие с помощью
End If. В конце конструкции можно также добавить фразу Else, которая
будет выполняться, если ни один из случаев не будет выбран.
Приведем пример (рис. 4.3):
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4.3. Пример использования сложного ветвления
Private Sub Form10_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
GroupBox2.Visible = False
Button2.Visible = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
If RadioButton1.Checked Then
GroupBox2.Visible = True
Button2.Visible = True
MsgBox("Введите номер факса, пожалуйста")
ElseIf RadioButton2.Checked Then
GroupBox2.Visible = True
Button2.Visible = True
MsgBox("Введите электронный адрес, пожалуйста")
ElseIf RadioButton3.Checked Then
GroupBox2.Visible = True
Button2.Visible = True
MsgBox("Введите адрес устройства, пожалуйста")
Else
MsgBox("Ваше сообщение не будет передано")
End If
End Sub
AND, OR, NOT
Выражения, используемые в качестве условий для ветвления, могут
быть сложными, то есть, представлять собой несколько условий,
объединенных логическими операторами AND, OR, NOT. Другими
словами, для построения условных выражений в операторах
ветвления могут использоваться логические операции.
На самом деле логических операций гораздо больше, но остальные
требуются лишь в особых случаях, поэтому мы рассмотрим только
перечисленные.
Логические операции используются так же, как операции сравнения, и
все выражения будут вычисляться как булево значение:
 If X=1 AND Y=1 Then
 If X=1 Or Y=1 Then
 If NOT X=1 Then
Если в операторе содержится более одной логической операции,
VB.NET принимает решение, какую из них выполнить первой, в
соответствии с простым правилом: вычисления производятся в
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
следующем порядке, известном как порядок приоритета операций:
NOT, AND, OR.
Рассмотрим пример:
If X=1 OR NOT Y=1 AND NOT Z=1 Then
Что же проверяется в этом выражении? Во-первых, проверяется, что
Y не равно 1 и Z не равно 1. Затем проверяется, истинен ли результат
операции AND либо X равно 1, и вычисляется общий результат.
Согласитесь, что это не совсем то, что можно было бы предположить,
читая логическое выражение слева направо.
Это выражение можно сделать более понятным, добавив круглые
скобки:
If X=1 OR (NOT Y=1 AND NOT Z=1) Then
Есть еще одна операция, с помощью которой можно упростить
написание сложных логических построений. Это операция
неравенства «<>». С помощью этой операции наш пример можно
представить так:
If X=1 OR (Y<>1 AND Z<>1) Then
Этот синтаксис гораздо легче понять, может быть его и стоит
использовать.
Самостоятельно
1. Создайте Windows форму, расположите в ней элементы
управления: список, командную кнопку и метку (рис. 4.4).
Рис. 4.4. Построение логики приложения с использованием операторов ветвления
2. Внесите ваши условия для выбора цвета фона и цвета текста,
изменив
предложенный
далее
код.
С
классом
System.Drawing.Color мы познакомимся подробнее в теме
«Графика»,
сейчас
используйте
метод
класса
Color.FromName(color), возвращающий цвет по его названию.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Можно импортировать пространство имен System.Drawing в начале
модуля формы и тогда имя класса System.Drawing.Color можно
будет писать короче – просто Color.
Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
ListBox1.Items.Add("red")
ListBox1.Items.Add("blue")
ListBox1.Items.Add("grey")
ListBox1.Items.Add("green")
ListBox1.Items.Add("black")
ListBox1.Items.Add("yellow")
ListBox1.SelectedIndex = 0
End Sub
Напишем обработчик события для применения, выбранного цвета:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim color1, color2 As String
color1 = ListBox1.SelectedItem.ToString
Label1.ForeColor = System.Drawing.Color.FromName(color1)
If color1 = "red" Then
color2 = "Gray"
Label1.BackColor = System.Drawing.Color.FromName(color2)
ElseIf color1 = "blue" Then
color2 = "yellow"
Label1.BackColor = System.Drawing.Color.FromName(color2)
Else
Label1.BackColor = System.Drawing.Color.FromName("pink")
End If
End Sub
3. В одном из заданий мы с вами уже использовали свойство
формы Opacity (прозрачность), которая принимает значения от 0
до 1. Вернемся к этому свойству, чтобы рассмотреть конкретный
пример. Разместите в вашей форме элемент таймер. Ниже
представлен код, позволяющий по щелчку мыши в форме
изменять прозрачность формы, включая или выключая таймер.
Разберитесь с предложенным кодом и протестируйте его.
Dim s As Double = 0.1
Private Sub Form10_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Click
Timer1.Enabled = Not Timer1.Enabled
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Timer1.Tick
If Me.Opacity <= 0 Or Me.Opacity >= 1 Then
s = -s
End If
Me.Opacity += s
End Sub
Элемент управления Timer представляет собой невидимый во время
выполнения программы элемент. Таймер имеет два регулируемых
свойства: Interval и Enabled. Свойство Interval позволяет
устанавливать в миллисекундах периодичность события Tick, а
свойство Enabled – возможность автоматической генерации
периодического события Tick.
4. Разместите в вашей форме элемент управления Список с
флажками (CheckedListBox). В окне свойств этого элемента
Properties c помощью свойства Items (коллекция) укажите все
возможные значения для выбора (рис. 4.5). Установите свойство
CheckOnClick равным True.
5. Ниже приведен код обработчика события, в котором обозначена
логика работы приложения. По аналогии напишите код
программы до конца.
Private Sub CheckedListBox1_SelectedIndexChanged(ByVal sender As
Object, ByVal e As System.EventArgs) Handles
CheckedListBox1.SelectedIndexChanged
Dim str As String
Dim fs As FontStyle
For Each str In CheckedListBox1.CheckedItems
If str = "Bold" Then
fs = FontStyle.Bold
ElseIf str = "Italic" Then
fs = fs Or FontStyle.Italic
Здесь вы должны продолжить код самостоятельно.
Протестируйте полученный код, флажки должны позволять
включать/выключать независимые условия, то есть любые наборы.
End If
Next
Dim fnt As Font = New Font("Arial", 12, fs)
Label1.Font = fnt
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4.5. Список с флажками (CheckedListBox) и управляющие структуры в коде
Задание 2. Структура ветвления Select Case
Задача
Рассмотреть
структуры,
позволяющие
изменять
последовательности выполнения строк программы.
порядок
Решение
Изучить все варианты синтаксиса конструкции ветвления Select Case.
Обсуждение
Одна из проблем структуры If..Then заключается в том, что структура
становится громоздкой уже при трех-четырех возможных вариантах
ветвления. При большом количестве ElseIf программа становится
беспорядочной, трудно читаемой.
Структура Select Case является альтернативной структурой,
управляющей ветвлением, и гораздо более подходящей при наличии
множественных, но простых условий. Синтаксис Select Case состоит
из следующих частей:
 Указывается проверяемая (тестируемая) переменная.
 Указывается возможное значение этой переменной и
описывается, что нужно делать, если переменная имеет это
значение.
 Это повторяется для стольких вероятных значений, сколько
требуется обработать.
 Добавляется (необязательно) Case Else на случай, если
переменная
совпадает
со
значением,
которое
не
предполагалось.
 Завершается управляющая конструкция оператором End
Select.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рассмотрим простой практический пример, выполняющий диалог с
пользователем. Диалог выполнен с помощью стандартных
диалоговых функций MsgBox и InputBox, возвращающих код нажатой
пользователем кнопки в диалоговом окне.
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Dim i, j As Integer
Dim str As String
i = MsgBox("Вы хотите сохранить файл?", MsgBoxStyle.YesNoCancel Or
MsgBoxStyle.Question, "Диалог с пользователем")
Select Case i
Case 6’ числовое значение
константы Yes
str = InputBox("Введите имя
файла")
Case 7’ числовое значение
константы No
j = MsgBox("Вы хотите распечатать файл?", MsgBoxStyle.Information Or
MsgBoxStyle.OKCancel, "Диалог с пользователем")
Case 2’ числовое значение константы Cancel
Exit Sub
End Select
Select Case j
Case 1’ числовое значение константы OK
MsgBox("Будет принтер, распечатаем")
Case 2’ числовое значение константы Cancel
Exit Sub
End Select
End Sub
При описании условий, которым должна соответствовать тестируемая
переменная, их можно перечислять через запятую и с ключевым
словом Is, например:
Module Module1
Sub Main()
Dim i As Double = -5
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Select Case i
Case Is < 1, Is > 10
Console.WriteLine("Число находится вне диапазона от 0 до 10")
Case Is >= 0
Console.WriteLine("Число положительное")
End Select
Console.ReadLine()
End Sub
End Module
Самостоятельно
1. Измените оператор If..Then на Select Case в коде приложения,
позволяющего выбирать цвет из списка и устанавливать его в
качестве цвета фона и цвета текста в элементе метка Label для
задания 1.
2. Запрограммируйте диалог с пользователем, в котором он может
отвечать на ваши вопросы по-русски (да, Да, ДА, Нет, НЕТ, нет)
или по-английски (no, NO, No, YES, n, N, Y, y, Yes, yes, yES, yeS).
В случае согласия (в любой доступной форме) выполняются
одни действия, в случае отказа (также в одной из допустимых
форм) выполняются другие действия.
При проверке равенства строковой переменной некоторым значениям,
не забывайте заключить эти значения в текстовые кавычки.
Перечислять все возможные значения можно через запятую, но не
забывайте про методы класса String, использование этих методов
может значительно упростить перечисление проверяемых значений.
Задание 3. Структура цикла For..Next
Задача
Рассмотреть структуры, позволяющие описать операторы действий,
которые выполняют задачу, требующую повторений.
Решение
Изучить синтаксис структуры циклов For..Next.
Обсуждение
В VB.NET есть несколько типов структур цикла: Do..While, Do..Until,
For..Next, For..Each. Каждая из этих структур имеет свои особенности
в применении, поэтому рекомендуется выбирать структуру в
зависимости от того, известно ли заранее, сколько циклов предстоит
сделать и при выполнении каких условий цикл должен быть закончен.
Рассмотрим классический цикл For..Next.
Структура For..Next используется для организации циклического
повторения одного или нескольких операторов программы заданное и
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
заранее известное число раз. Цикл For..Next принято называть
счетным циклом, это его определяющая характеристика.
Для поддержания работы цикла For..Next создается специальная
переменная-счетчик, указывается ее начальное значение, конечное
значение и шаг, с которым значения счетчика изменяются.
Синтаксис цикла For..Next следующий:
For
счетчик=НачальноеЗначение
To
КонечноеЗначение
Step
ИзменениеЗначения
Операторы кода, выполняемого в цикле
Next счетчик
Значение Step (шага счетчика) является необязательным, если оно не
указано, по умолчанию, Step=1. Значение шага может быть и
отрицательным,
в
этом
случае
необходимо,
чтобы
НачальноеЗначение было больше, чем КонечноеЗначение.
В операторе Next можно не указывать имя переменной-счетчика.
Обычно в качестве переменной для счетчика используют тип Integer
или Byte, в зависимости от длительности цикла.
Рассмотрим элементарный пример. Пусть требуется просуммировать
все четные числа некоторого числового массива. Создадим Windows
форму с элементами: список, метка и командная кнопка (рис. 4.6).
Напишем следующие процедуры в коде формы:
Private Sub Form10_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim A() As String = {4, 67, 2, 43, 56, 7, 6, 9, 12, 90, 67, 4, 26, 12, 9}
ListBox1.Items.AddRange(A)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim i, j, sum As Integer
For i = 0 To ListBox1.Items.Count - 1
j = CType(ListBox1.Items(i), Integer)
If j Mod 2 = 0 Then sum += j
Next
Label1.Text = sum.ToString
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4.6. Использование оператора цикла For..Next для суммирования чисел
Самостоятельно
1. Просуммируйте каждое второе число последовательности из 10
случайных чисел, полученных вызовом метода Next у объекта
класса System.Random. Оформите отображение массива
случайных чисел и результата суммирования в Windows форме.
2. Воспользуйтесь описанием метода Next для класса Random,
представленным ниже.
Класс
System.Random
генерирует
псевдослучайные
числа.
Необходимо создать объект этого класса и вызвать метод Next (для
генерации следующего целого числа) или метод NextDouble (для
генерации вещественного числа).
Dim Rand As New Random
Получение случайного дробного числа от 0,0 до 1,0
Dim X as Double=Rand.NextDouble()
Получение случайного целого числа от 1 до 6
Dim Р as Integer=Rand.Next(1,7)
Получение еще одного случайного целого числа от 1 до 6
P=Rand.Next(1,7)
Максимальная граница, передаваемая в метод Next, всегда должна
быть на единицу больше, чем максимальное число из нужного вам
диапазона.
3. Измените описание цикла, используя отрицательное значение
параметра Step.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Задание 4. Структура цикла For..Each
Задача
Рассмотреть структуры, позволяющие описать операторы действий,
которые выполняют задачу, требующую повторений.
Решение
Изучить синтаксис структуры циклов For..Each.
Обсуждение
Цикл For Each..Next применяется для работы с коллекциями,
массивами, строками, символами. Мы с вами уже использовали этот
оператор при обработке строк, а также элементов коллекций и
массивов. Синтаксис структуры следующий:
For Each элемент In набор_подобных_элементов
Действия над элементами
Next
Рассмотрим перебор всех символов строки с помощью цикла For
Each..Next:
Module Module1
Sub Main()
Dim str As String = "Этo прoбнaя
стрoкa"
Dim chr As Char
Console.WriteLine(str)
For Each chr In str
Console.WriteLine(chr.ToUpper(chr))
Next
Console.ReadLine()
End Sub
End Module
Рассмотрим еще один пример использования цикла For Each..Next
для перебора элементов управления, расположенных на Windows
форме.
Алгоритм должен быть рекурсивным, так как элемент управления
может оказаться контейнером, то есть может сам содержать другие
элементы управления.
Напишем процедуру, выполняющую очистку элементов управления
TextBox:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Private Sub ClearControls(ByVal ctrl As Control)
'Очистить ли данный элемент управления?
'Пусть в этой версии метода очищаются только текстовые поля, тогда
If TypeOf ctrl Is TextBox Then
ctrl.Text = ""
End If
Dim ctrlChild As Control
For Each ctrlChild In ctrl.Controls
ClearControls(ctrlChild)
Next
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
ClearControls(Me)
End Sub
На рис. 4.7 приведен результат выполнения метода ClearControls для
текущей формы.
Рис. 4.7. Перебор всех элементов управления, относящихся к одному типу
Самостоятельно
Разработайте Windows приложение, позволяющее выполнять
проверку корректности указанного номера кредитной карты по
алгоритму Luhn.
Алгоритм Luhn – это формула, которая объединяет цифры кредитной
карты (удваивая каждую из них) и проверяет, делится ли итоговая
сумма на 10. Если да, значит, номер кредитной карты корректен, и ее
можно использовать для оплаты.
Вот вспомогательная функция, реализующая алгоритм Luhn:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Private Function ValidateLuhn(ByVal value As String) As Boolean
Dim CheckSum As Integer = 0
Dim DoubleFlag As Boolean = (value.Length Mod 2 = 0)
Dim Digit As Char
Dim DigitValue As Integer
For Each Digit In value
DigitValue = Integer.Parse(Digit)
If DoubleFlag Then
DigitValue *= 2
If DigitValue > 9 Then
DigitValue -= 9
End If
End If
CheckSum += DigitValue
DoubleFlag = Not DoubleFlag
Next
Return (CheckSum Mod 10 = 0)
End Function
Эта функция предполагает, что любые дефисы и специальные
символы из строки удалены. Проверьте, является ли каждый символ
цифрой, перебрав все символы строки и вызвав для каждого из них
метод Char.IsDigit.
Корректность номера кредитной карты не гарантирует, что ей
соответствует реальный счет. Для этого надо проанализировать
номер на сервере кредитных карт. Алгоритм Luhn обеспечивает
только быструю проверку корректности номера кредитной карты.
Задание 5. Структура цикла Do..Loop
Задача
Рассмотреть структуры, позволяющие описать операторы действий,
которые выполняют задачу, требующую повторений.
Решение
Изучить синтаксис структуры цикла Do..Loop с постусловием и
предусловием.
Обсуждение
Оператор цикла Do..Loop используется для организации циклического
повторения одного или нескольких операторов программы, пока
истинно некоторое условие. Этот оператор имеет две разновидности,
называемые циклом Do..Loop с предусловием и циклом Do..Loop с
постусловием.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Синтаксис оператора Do..Loop с предусловием имеет вид:
Do While <условие>
Do Until <условие>
операторы
операторы
Loop
Loop
Синтаксис оператора Do..Loop с постусловием имеет вид:
Do
Do
операторы
операторы
Loop While <условие>
Loop Until <условие>
При использовании ключевого слова While цикл выполняется пока
истинно <условие>, при использовании ключевого слова Until – до
тех пор, пока <условие> не станет истинным.
Пример использования оператора цикла Do While..Loop с
предусловием:
Module Module1
Sub Main()
Dim i As Integer
i=1
Do While i <= 5
Console.WriteLine("i= " & i.ToString)
i += 2
Loop
Console.ReadLine()
End Sub
End Module
Пример использования оператора цикла Do Until..Loop с
предусловием:
Module Module1
Sub Main()
Dim i As Integer
i=1
Do Until i > 5
Console.WriteLine("i= " & i.ToString)
i += 2
Loop
Console.ReadLine()
End Sub
End Module
Пример использования
постусловием:
оператора
цикла
Do
While..Loop
с
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Module Module1
Sub Main()
Dim i As Integer
i=1
Do
Console.WriteLine("i= " & i.ToString)
i += 2
Loop While i <= 5
Console.ReadLine()
End Sub
End Module
Пример использования оператора цикла Do Until..Loop с
постусловием:
Module Module1
Sub Main()
Dim i As Integer
i=1
Do
Console.WriteLine("i= " & i.ToString)
i += 2
Loop Until i > 5
Console.ReadLine()
End Sub
End Module
Выбор между различными вариантами цикла Do..Loop определяется
тем, должны ли действия, находящиеся внутри цикла, обязательно
выполняться хотя бы раз независимо от значения переменной
управления циклом, или же эти действия не должны выполняться ни в
коем случае, если значение переменной управления циклом не
удовлетворяет условию. В первом случае следует использовать
структуру Do..Loop Until, а во втором случае – структуру Do While
..Loop. Цикл Do While может быть вообще ни разу не выполнен, если
не будет удовлетворено условие.
В качестве примера использования цикла Do..Loop рассмотрим
функцию, возвращающую массив индексов всех совпадений слова
или последовательности символов в строке для поиска.
Используем в функции цикл Do.. Until Loop с постусловием.
Private Function GetMatches(ByVal stringToSearch As String, ByVal
searchFor As String) As Integer()
Dim Position As Integer = 0
Dim Matches As New ArrayList
'если совпадение не найдено, переменная Position
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
'получает значение -1, после чего цикл завершается
Do
Position = stringToSearch.IndexOf(searchFor, Position)
If Position <> -1 Then
'Найдено совпадение. Увеличить счетчик совпадений
Matches.Add(Position)
Position += searchFor.Length
End If
Loop Until Position = -1
Return CType(Matches.ToArray(GetType(Integer)), Integer())
End Function
Используем в тестирующем методе цикл Do.. Until Loop с
предусловием.
Sub Main()
Dim stringToSearch As String = "Собака - друг человека. Хорошая
собака - друг."
Dim searchFor As String = "друг"
Dim count() As Integer
count = GetMatches(stringToSearch, searchFor)
Dim i As Integer
Do Until i = count.Length
Console.WriteLine(count(i))
i += 1
Loop
Console.ReadLine()
End Sub
Самостоятельно
1. Создайте Windows форму, обработка данных в которой
выполняется
с
регулируемой
задержкой,
например,
пользователь вводит в текстовые окна числа, нажимает кнопку,
выполняющую сложение этих чисел, но результат появляется
спустя 10 секунд (рис. 4.8).
Для написания программного кода, выполняющего временную
задержку в ходе программы, воспользуемся структурами DateTime и
TimeSpan. Напомним, что структура DateTime представляет собой
ссылку на время, а структура TimeSpan – интервал времени.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim i As Integer = CType(TextBox1.Text, Integer)
Dim j As Integer = CType(TextBox2.Text, Integer)
Dim initTime As DateTime = DateTime.Now
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Dim wait As TimeSpan = TimeSpan.FromSeconds(10)
Dim LoopTime As TimeSpan
'Ждать 10 секунд
Do
LoopTime = DateTime.Now.Subtract(initTime)
Loop Until TimeSpan.Compare(LoopTime, wait) = 1
TextBox3.Text = (i + j).ToString
End Sub
Рис. 4.8. Использование цикла Do..Loop для организации задержки вычислений
При работе с датами нельзя использовать операторы сравнения (< и
>). Однако вы можете получить число, представляющее интервал
TimeSpan,
используя
свойства,
TotalHouse,
TotalMinutes,
TotalMilliseconds или Ticks. В следующем фрагменте цикл задержки
программы переписан с применением свойства TimeSpan.Ticks, что
делает его понятнее.
2. Попробуйте
задержки:
изменить
написание
программного
кода
для
Do
LoopTime = DateTime.Now.Subtract(initTime)
Loop Until LoopTime.Ticks > wait.Ticks
3. Измените цикл Do..Loop Until на цикл Do ..Loop While. Напишите
конструкции цикла с постусловием и предусловием.
4. Дополните интерфейс программы для выполнения других
вычисляемых действий с задержкой и без нее.
Самостоятельно
Форма построения цикла Do..Loop прекрасно подходит для тех задач,
в которых неизвестно заранее, сколько итераций потребуется.
Например, можно написать приложение, которое моделирует
бросание кубика с очками на гранях (случайным образом выпадают
числа от единицы до шести), продолжающееся до тех пор, пока не
выпадет шесть. Сколько раз придется бросать такой кубик, чтобы
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
получить
шесть?
Итак,
попробуйте
написать
приложение,
реализующее бросание кубика.
Обратите внимание, что в этой программе может возникнуть
бесконечный цикл (хотя это и маловероятно), если компьютер будет
все время генерировать случайные числа, но так и не получит числа
шесть. Предусмотрите досрочное прерывание цикла бросания кубика
в этом случае.
Наиболее интересные результаты, которые были получены,
приведены на рис. 4.9.
Рис. 4.9. Бросание кубика
Добавьте в приложение подсчет количества бросаний и вывод на
экран номер очередного броска.
Download