МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ 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. Бросание кубика Добавьте в приложение подсчет количества бросаний и вывод на экран номер очередного броска.