Тема 4. Управляющие структуры и процедурное программирование

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Тема 4. Управляющие структуры и процедурное
программирование
Цель
Научиться управлять ходом выполнения программы с помощью
структур ветвления, структур организации цикла и операторов
перехода Exit.
Задачи
1. Рассмотреть принципы алгоритмизации в программировании.
2. Рассмотреть структуры, позволяющие изменять порядок
последовательности выполнения строк программы.
3. Рассмотреть структуры, позволяющие выполнить один и тот
же блок кода несколько раз.
Оглавление
Алгоритмизация и программирование
Структуры ветвления
Оператор If..Then
Использование логических операторов в условных конструкциях
Оператор Select Case
Структуры циклов
Оператор For..Next
Оператор Do..Loop
Оператор For Each..Next
Операторы перехода Exit
Выводы
Вопросы для самопроверки
Литература
Алгоритмизация и программирование
Программа разрабатывается для решения определенной задачи.
Алгоритм – это точно определенное описание способа решения
задачи в виде конечной (по времени) последовательности действий. В
соответствии с существующими стандартами «алгоритм – это точное
предписание, определяющее вычислительный процесс, ведущий от
варьируемых начальных данных к искомому результату». Любой
алгоритм обладает следующими свойствами: детерминированностью,
массовостью, результативностью и дискретностью.
Детерминированность (определенность, однозначность) означает, что
набор указаний алгоритма должен быть однозначно и точно понят
любым исполнителем. Это свойство определяет однозначность
результата работы алгоритма при одних и тех же исходных данных.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Массовость алгоритма предполагает возможность варьирования
исходных данных в определенных пределах. Это свойство определяет
пригодность использования алгоритма для решения множества задач
данного класса.
Результативность алгоритма означает, что для любых допустимых
исходных данных он должен через конечное число шагов (или
итераций) завершить работу.
Дискретность
алгоритма
–
это
возможность
разбиения
алгоритмического процесса на отдельные элементарные действия,
возможность реализации которых человеком или ЭВМ не вызывает
сомнения, а результат их выполнения вполне определен и понятен.
Процесс алгоритмизации решения задачи обычно реализуется по
следующей схеме:
 выделение автономных этапов процесса решения задачи;
 формализованное описание содержание работ, выполняемых
на каждом выделенном этапе;
 проверка правильности реализации выбранного алгоритма на
различных примерах решения задачи.
Существует несколько способов описания алгоритмов: словесный,
формульно-словесный, графический, средствами языка операторных
схем, с помощью таблиц и некоторые другие.
Словесный способ описания алгоритма отражает содержание
выполняемых действий средствами естественного языка. К
достоинствам этого способа следует отнести его доступность, а к
недостаткам – достаточное громоздкое описание при низкой
наглядности.
Формульно-словесный способ описания алгоритма основан на записи
содержания
выполняемых
действий
с
использованием
изобразительных возможностей языка математики, дополненного
необходимыми пояснениями средствами естественного языка.
Данный способ, обладая всеми достоинствами словесного способа,
более лаконичен, а значит, и более нагляден, имеет большую степень
формализованности.
Графический способ описания алгоритма представляет собой
изображение логико-математической структуры алгоритма, при
котором все этапы процесса обработки данных отображаются с
помощью установленного набора геометрических примитивов
(блоков),
имеющих
строго
определенную
конфигурацию
в
соответствии с приписанным им характером выполняемых действий,
вычислением, вводом-выводом данных, проверкой логических
условий. Изображение базовых структур алгоритмов в соответствии с
имеющимися ГОСТами и ОСТами, показано на рис. 4.1.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4.1. Базовые структуры графического изображения алгоритмов
Операторный способ записи алгоритма – это изображение
последовательности операций обработки данных с помощью
заданного набора буквенных символов, обозначающих ту или иную
типовую операцию. Последовательность выполнения операций
определяется естественным расположением операторов в схеме, в
случае нарушения естественного порядка используются стрелки.
Процесс записи алгоритма значительно упрощается, но такой способ
имеет меньшую степень наглядности, нежели графический.
Для реализации алгоритма в языках программирования имеются
соответствующие операторы. Рассмотрим операторы, которые
позволяют реализовать итерацию, ветвление, повторение.
Структуры ветвления
Стандартная последовательность выполнения операторов в
программах и подпрограммах – в порядке следования – может быть
изменена специальными управляющими операторами. Такими
операторам являются условные операторы, операторы цикла и
операторы перехода.
К условным операторам в языке Visual Basic относятся операторы
If..Then..Else и Select Сase.
Оператор If..Then
Простейшая форма оператора If..Then имеет вид:
If <условие> Then <оператор>
Такую запись оператора называют линейной или сокращенной
формой данного оператора. Некое условие (оно может быть сложным,
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
составным) проверяется на истину/ложь (True/False). В случае если
условие соответствует True, выполняется единственное действие,
описанное после ключевого слова Then. Иначе, при невыполнении
условия (условие False), это действие не выполняется, а выполняются
все строки программы, расположенные ниже. Эти же строки
программы выполняются и в первом случае, но после выполнения
действия, указанного после Then. Рассмотрим описанный случай
ветвления на практическом примере.
Dim x As Integer = 25
If CheckBox1.Checked Then x = CType(InputBox("Введите другое
значение переменной"), Integer)
Dim y As Integer = Math.Sqrt(x)
Второй, более сложный синтаксис условного оператора
If <условие> Then <действия> End If
используется, если необходимо выполнить несколько программных
команд в случае равенства условия True и не выполнять никаких
команд при условии, равном False.
Dim x As Integer = 25
If CheckBox1.Checked Then
x = CType(InputBox("Введите другое значение переменной"), Integer)
ComboBox1.Items.Add(x)
End If
Dim y As Integer = Math.Sqrt(x)
Рассмотрим еще одну форму условного оператора, включающую
ключевое слово Else:
If <условие> Then <действие> Else <действие>
Условное выражение может выполняться, то есть принимать значение
True, и тогда необходимо выполнить определенные действия, но
может не выполняться, принимать значение False, и в этом случае
необходимо выполнить другие действия.
Dim x As Integer
If CheckBox1.Checked Then x = CType(InputBox("Введите другое
значение переменной"), Integer) Else x = 25
Dim y As Integer = Math.Sqrt(x)
Если при выполнении условия или его не выполнении требуется
описать более одного оператора, то конструкция вновь становится
блочной, включающей ключевые слова End If:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Dim x As Integer
If CheckBox1.Checked Then
x = CType(InputBox("Введите другое значение переменной"), Integer)
ComboBox1.Items.Add(x)
Else
x = 25
MsgBox("Имейте в виду. что параметр равен " & x.ToString)
End If
Dim y As Integer = Math.Sqrt(x)
Остается рассмотреть наиболее сложный вариант условного
оператора:
If..Then..ElseIf
Этот вариант сложен и используется редко, хотя в ряде ситуаций без
него не обойтись. Он позволяет выбирать, какой из нескольких
сегментов кода будет выполняться, в соответствии со сложным
критерием. Для этого необходимо отделять каждый случай ключевым
словом ElseIf (одно слово) и закрыть условие с помощью End If. В
конце конструкции можно также добавить фразу Else, которая будет
выполняться, если ни один из случаев не будет выбран.
Dim x, y As Integer
If CheckBox1.Checked Then
x = CType(InputBox("Введите значение 1-ой переменной"), Integer)
ComboBox1.Items.Add(x)
ElseIf CheckBox2.Checked Then
y = CType(InputBox("Введите значение 2-ой переменной"), Integer)
ComboBox1.Items.Add(y)
Else
x = 25
MsgBox("Имейте в виду, что 1 -ый параметр равен " & x.ToString)
End If
y += Math.Sqrt(x)
Использование логических операторов в условных конструкциях
Условие в конструкции If..Then может представлять собой комбинацию
из нескольких условий, объединенных логическими операторами:
AND, OR, NOT. Могут использоваться и любые другие логические
операции, но обычно используются перечисленные выше.
В случае AND оба условия должны быть True, чтобы общее условие
выполнилось: If CheckBox1.Checked And CheckBox2.Checked Then.
Операция OR требует, чтобы только одно из двух условий имело
значение True для выполнения общего условия:
If CheckBox1.Checked Or CheckBox2.Checked Then.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Третья логическая операция, NOT, подразумевает противоположность
условию: If NOT CheckBox1.Checked Then.
Если в операторе содержится более одной логической операции,
VB.NET принимает решение, какую из них выполнить первой, в
соответствии с простым правилом: вычисления производятся в
следующем порядке, известном как порядок приоритета операций:
NOT, AND, OR.
Оператор Select Case
В тех случаях, когда нужно произвести разветвление программы в
зависимости от разных вариантов значений одного и того же
выражения, вместо оператора If..Then..Else можно использовать
аналогичный оператор Select Case, при этом количество условий,
задаваемое Case, не ограничено. Схема этого оператора имеет вид:
Select Case <выражение>
Case <список значений>
<операторы>
Case <список значений>
<операторы>
Case Else
<операторы>
End Select
В списке значения перечисляются через запятую, или <выражение1>
To <выражение2>, или Is <операция сравнения><выражение>.
Dim i As Double
Select Case i
Case Is < 1, Is > 10
Console.WriteLine("Число находится вне диапазона от 0 до 10")
Case (i\2)*2, Is >2
Console.WriteLine("Составное четное число")
Case (i\3)*3, Is >3
Console.WriteLine("Составное число, делится на 3")
Case (i\5)*5, Is >5
Console.WriteLine("Составное число, делится на 5")
Case Else
Console.WriteLine("Простое число")
End Select
Структуры циклов
В .NET есть несколько типов структур цикла: Do While, Do Until, For
Next, For Each. Основным критерием выбора структуры является тот
факт, что цикл может выполняться определенное (заранее известное)
число раз или до выполнения какого-либо условия (сколько раз не
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
известно). Для счетных циклов используют оператор For Next, другие
типы циклов используются в случае. Если число циклов неизвестно и
после каждого прохода приходится решать, будет ли продолжаться
выполнение цикла. Структуры циклов реализуют стандартные
рекурсивные алгоритмы.
Структуры Do While и Do Until обеспечивают сходные функции с
небольшой разницей в работе, а For Each применяется только в
сочетании с коллекциями.
Свойство языков программирования, состоящее в том, что
конструкции языка допускают включение в себя в явном виде
конструкции того же типа, называется рекурсивностью. Все
конструкции циклов являются рекурсивными структурами, то есть
могут содержать в себе подобные себе конструкции (вложенные
циклы). Наиболее часто такие случаи рекурсии применяются для
обработки многомерных массивов.
Оператор For..Next
Оператор For..Next используется для организации циклического
повторения одного или нескольких операторов программы заданное
число раз. Схеме этого оператора имеет вид:
For <переменная>=<начальное значение> To <конечное значение>
Step <шаг>
<операторы>
Next
Задание шага Step не является обязательным. Если шаг не задан, он
считается равным единице. Цикл работает следующим образом:
 Если шаг положителен и конечное значение меньше
начального значения, то операторы, находящиеся в теле
цикла (то есть между первой строкой For и последней Next),
не будут выполнены ни разу.
 Если шаг отрицателен и конечное значение больше
начального значения, то операторы, находящиеся в теле
цикла, также не будут выполнены ни разу.
 Если шаг равен нулю, то независимо от начального и
конечного значений операторы, находящиеся в теле цикла,
будут выполняться неограниченное число раз.
 Во всех остальных случаях цикл будет выполнен при
значении переменной цикла, равной начальному значению.
Затем переменная цикла станет равной начальному значению
плюс шаг, и полученное значение будет сравниваться с
конечным значением и так далее – цикл будет выполняться до
тех пор, пока значение переменной не превзойдет (если шаг
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
положителен) или не станет меньше (если шаг отрицателен)
конечного значения.
Чтобы остановить зациклившуюся программу (то есть выйти из
бесконечного цикла во время выполнения), используйте клавиши Esc
или Ctrl+Break.
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
For i = 1 To 20 Step 2
P = Rand.Next(1, 7)
Console.WriteLine("Бросание
кубика " & i.ToString & " выпало "
& p.ToString)
Next
Console.ReadLine()
End Sub
Оператор Do..Loop
Оператор цикла Do..Loop аналогичен оператору For..Next, он также
организует повторение одних и тех же действий некоторое количество
раз. Но имеются и отличия: заранее не известно сколько именно раз
действия должны повториться.
Оператор Do..Loop имеет несколько синтаксических форм записи.
Цикл с предусловием
Цикл с постусловием
Do While|Until Выражение
Do
Операторы
Операторы
[Exit Do]
[Exit Do]
Loop
Loop While|Until Выражение
 Do – ключевое слово;
 While|Until – ключевое слово, указывающее тип цикла;
 Выражение – выражение условия, принимающее значение
True или False;
 Loop – ключевое слово, указывающее на окончание цикла.
Пример 1. Использование оператора While с предусловием
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
Do While p <> 6
p = Rand.Next(1, 7)
i += 1
Console.WriteLine("Бросание кубика " & i.ToString & " выпало " &
p.ToString)
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Loop
End Sub
Пример 2. Использование оператора Until с предусловием
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
Do Until p = 6
p = Rand.Next(1, 7)
i += 1
Console.WriteLine("Бросание кубика " & i.ToString & " выпало " &
p.ToString)
Loop
End Sub
Результат выполнения Примера 1 совпадает с результатом
выполнения Примера 2.
Пример 3. Использование оператора While с постусловием
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
Do
p = Rand.Next(1, 7)
i += 1
Console.WriteLine("Бросание кубика " & i.ToString & " выпало " &
p.ToString)
Loop While p <> 6
End Sub
Пример 4. Использование оператора Until с постусловием
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
Do
p = Rand.Next(1, 7)
i += 1
Console.WriteLine("Бросание кубика " & i.ToString & " выпало " &
p.ToString)
Loop Until p = 6
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
При использовании While тело цикла выполняется пока истинно
<условие>, а при использовании ключевого слова Until тело цикла
выполняется до тех пор, пока <условие> не станет истинным.
Циклы с предусловием похожи на циклы с постусловием, но проверка
условия выполняется в начале вхождения в цикл, то есть до
исполнения операторов цикла, а в цикле с постусловием проверка
выполняется в конце каждого выполнения цикла.
Нетрудно заметить, что схемы с ключевым словом Until всегда можно
заменить на такие же схемы, но с использованием ключевого слова
While, и наоборот, если заменить имеющиеся условия на обратное
условие (сравним для этого примеры 1 и 2 или 3 и 4). Формально
можно заменить <условие> на Not <условие>. Тем не менее, во
многих случаях использование того или другого варианта позволяет
сделать код более читаемым. While лучше использовать в тех
случаях, когда нужно выполнять пока что-то происходит, а Until – до
тех пор, пока что-то не произошло.
Циклы с постусловиями внешне ничем не отличаются от циклов с
предусловиями, но это не всегда так. В циклах с постусловиями тело
цикла всегда выполняется хотя бы один раз, тогда как в циклах с
предусловиями тело цикла при некоторых условиях может быть не
выполнено ни разу.
Оператор For Each..Next
Оператор For Each используется при обработке отдельных элементов,
относящихся к коллекциям, строкам, массивам, упорядоченным
множествам объектов. При использовании оператора For Each не
требуется задавать количество элементов в наборе. VB.NET начнет
указанные в цикле действия с первого элемента набора, а затем будет
повторять цикл, пока не дойдет до последнего элемента. Рассмотрим
использование оператора на практике.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Sub Main()
Dim str As String = "Это пример строки"
Dim c As Char
For Each c In str
Console.WriteLine(c)
Next
End Sub
Sub Main()
Dim str() As String = {"Это", "пример",
"строки"}
Dim c As String
For Each c In str
Console.WriteLine(c)
Next
End Sub
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
Операторы перехода Exit
Операторы типа Exit позволяют осуществлять немедленный выход из
тела операторов цикла, операторов Select Case, процедур и функций.
Оператор выхода из цикла Do..Loop имеет вид Exit Do.
Оператор выхода из цикла For..Next имеет вид Exit For.
Выход из тела оператора Select Case выполняет оператор Exit Select.
После
выполнения
перечисленных
операторов
управление
передается оператору, который непосредственно следует за
оператором цикла или Select Case.
Оператор выхода из тела процедуры имеет вид Exit Sub.
Оператор выхода из тела функции имеет вид Exit Function.
После выполнения операторов выхода из процедуры или функции
управление передается в ту подпрограмму. Откуда была вызвана
данная процедура или функция, на программный оператор, который
непосредственно следует за оператором вызова указанной процедуры
или функции.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рассмотрим использование оператора Exit на практике. В нашем
примере с бросанием кубика может быть бесконечный цикл (или
слишком большой), так как датчик случайных чисел может довольно
долго не выдавать число 6. Эту ситуацию можно предотвратить
досрочным выходом из цикла.
Sub Main()
Dim Rand As New Random
Dim p, i As Integer
Do While p <> 6
p = Rand.Next(1, 7)
i += 1
If i = 100 Then Exit Do
Console.WriteLine("Бросание кубика " & i.ToString & " выпало " &
p.ToString)
Loop
End Sub
Выводы
Современное содержание понятия алгоритмического процесса можно
определить следующим образом. Алгоритмический процесс – процесс
последовательного преобразования конструктивных объектов (слов,
чисел, массивов и др.), происходящий дискретными «шагами».
В языках программирования используются два типа структур
ветвления: If..Then..Else и Select.
Структуры организации цикла (For..Next, Do..While, For..Each)
позволяют выполнять один и тот же блок кода несколько раз. Код не
пропускается, как при ветвлении, а повторяется. Структуры
организации циклов являются рекурсивными стуктурами.
Для немедленного выхода из тела операторов цикла или операторов
выбора, процедур или функций используются операторы Exit.
Оператор Exit прерывает ход программы и возвращает управление в
ту подпрограмму, откуда была вызвана данная процедура или
функция, оператору, который непосредственно следует за оператором
вызова указанной процедуры или функции.
Вопросы для самопроверки
1. При каких значениях А булевы выражения будут иметь значение
True, а при каких – False?
a) NOT A>0 OR A>5
b) A>1 AND A<5 OR A>7 AND A<10
c) A<10 OR A>12 AND NOT A>20
2. Для
каждого
из
следующих
примеров
предложите
соответствующую структуру цикла и поясните свой выбор:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
а) Вывод на экран набора элементов из списка покупок,
сохраняемых в массиве.
b) Вывод на экран календаря на текущий месяц.
c) Просмотр массива в поисках определенного элемента.
d) Рисование шахматной доски с помощью таблицы в HTML.
Дополнительно задание: напишите программу, которая выполняет
одну из этих задач.
3. Сколько раз будут выполнены операторы в цикле For..Next, если
шаг отрицателен и конечное значение больше начального?
4. Сколько раз будут выполнять операторы в цикле For..Next если
шаг равен нулю?
5. Почему в операторах с постусловием тело цикла всегда
выполняется хотя бы один раз, тогда как в операторах с
предусловием тело цикла при некоторых условиях может быть
не выполнено ни разу?
6. Найдите идентичные по смыслу схемы в операторах
Do..While..Loop и Do..Until..Loop с предусловием и постусловием.
7. Приведите примеры возможных использований операторов Exit
при описании циклов.
1.
2.
3.
4.
Литература
Visual Basic.NET: Учебный курс / В. Долженков, М. Мозговой. –
СПб.: Питер, 2003. – 464 с.: ил.
Троелсен Э. C# и платформа .NET. Библиотека программиста —
СПб.: Питер, 2006 — 796 с.: ил.
Эпплман Д. Переход на VB.NET: стратегии, концепции, код. —
СПб.: Питер, 2004. – 464 с.: ил.
Объектно-ориентированное
программирование
в
Visual
Basic.NET. Библиотека программиста / Д. Кларк. – СПб.: Питер,
2005. – 352 с.: ил.
Download