Тема 4.5. Программирование алгоритмов регулярных циклических структур
Напомним, что циклическими называются структуры, в которых предусмотрена возможность многократного повторения выполнения участка алгоритма.Этот участок называетсятелом цикла. Различают циклические структуры двух видов: с заранее известным и с заранее неизвестным числом повторений цикла.
Циклические структуры, в которых число повторений цикла заранее известно или может быть определено до начала цикла, называются регулярными циклическими структурами(см.рис. 2.3.2-6Темы 2.3дисциплины Информатики).
В блоке организации цикла используется специальная переменная, которая предназначена для определения условия останова цикла – i. Эта переменная называетсяпараметром цикла. Блоки, следующие за заголовком цикла, составляюттело цикла. Тело цикла выполняется для всех значений параметра циклаi, начинающегося со значенияm1 и изменяющегося с шагомh до значенияm2.
Циклическая структура, в которой число повторений цикла заранее неизвестно, а определяется только в процессе выполнения алгоритма, называется итеративной циклической структурой. В зависимости от места расположения условия продолжения цикла (или выхода из цикла) итеративные циклические алгоритмы подразделяются на два вида: с предусловием и с постусловием
Таким образом, алгоритмы регулярной циклической структуры характеризуются заданным известным числом повторений: иногда это число задается явно, иногда его предварительно вычисляют. К базовым алгоритмам, использующихрегулярные циклические структуры относятся:алгоритмы вычисления значений функций одной или нескольких переменных, где аргументы изменяются в известном диапазоне и с заданным шагом изменения; алгоритмывычисления конечных сумм и произведенийи многие другие. Программирование такой алгоритмической структуры на языкеVB осуществляется при помощи оператораFor. Next.
Если из условия задачи следует, что число повторений циклазаранее не определено, а вычисляется в процессе выполнения алгоритма, тоусловие выхода из цикладолжно быть определено в процессе его выполнения. При этом важно, чтобы в условие выхода из цикла входила переменная, значение которой изменялось бы в теле цикла, иначе выполнение цикла будет бесконечным. Выход из регулярного цикла по условию осуществляется операторомExit For.
Оператор For. Nextимеет следующий формат:
For параметр = выражение_1 To выражение_2 [Step выражение_3]
Здесь параметр цикла – это переменная, для которой значение вычисленноговыражение_1 является начальным значением; значение вычисленноговыражение_2 – конечным значением; а значение вычисленноговыражение3 – шаг изменения параметра цикла. Причемшаг изменения параметраможет быть как положительным, так и отрицательным. По умолчанию значение шага равно1. Блок Операторов, находящихся между конструкциямиForиNext,называетсятелом цикла, количество повторений которого определяется числом возможных значений параметра цикла. Перед каждым повторением цикла, в том числе первым входом в цикл, текущее значениепараметрацикла сравнивается со значениемвыражение_2(конечным значением). После каждого выполнения операторовтела циклак переменной (параметруцикла) прибавляется значениевыражение_3 (шаг) и снова производится сравнение параметра с конечным значением.Телоцикла перестает выполняться, когда значениепараметрастанет больше конечного значения (шаг положителен) или меньше конечного значения (шаг отрицателен). Если условие выхода из цикла выполняется при начальном значении параметра, то тело цикла пропускается, и управление сразу же передается оператору, следующему заNext.Для выхода из цикла до его завершения можно использовать операторExit For.
При организации вложенных циклов (цикл в цикле) используются пары операторов For…Next, которые не должны “пересекаться” друг с другом. Другими словами, каждой конструкцииFor должна соответствовать конструкцияNext. При этом конструкцияNext для внутреннего цикла должна предшествовать конструкцииNextвнешнего цикла. Для преждевременного выхода из каждого цикла по условию можно использовать операторExit For.
Пример 4.5.1-1. Примеры реализации регулярных циклических алгоритмов. В приведенных ниже примерах реализующих различные варианты организации регулярных циклических алгоритмов, число повторений цикла –nможет быть определено через граничные значения и шаг изменения параметра следующим образом:,
где m1иm2, соответственно, нижняя и верхняя граница изменения параметра цикла, аh– шаг изменения параметра. Квадратные скобки здесь обозначают — получение целой части от результата деления.
For i = 1 To 10 For j = 1 To 2
‘тело внутреннего цикла
If g=2 Then Exit For Next j
В примере на рис. 4.5.1-2 тело цикла будет выполняться 10 х 2=20 раз, при условии что переменная gне будет равна 2.
For a = -5 To -7 Step -0.5
m = СStr(Sin(a))
Dim i As Integer, A As Integer
For i = 1 To 3
В примере на рис. 4.5.1-4тело цикла будет выполняться три раза, так как шаг по умолчанию равен единице; первая итерация: i=1, А=3; вторая итерация: i=2, А=6; третья итерация: i=3, А=18.
Dim i As Integer, A As Integer
For i = 3 To 1 Step -1
На рис. 4.5.1-5 тело цикла будет выполняться три раза: первая итерация: i=3, А=9; вторая итерация: i=2, А=18; третья итерация: i=1, A=18.
Dim i As Integer
For i=1 To 100
If i = 50 Then Exit For
Изначально цикл на рис. 4.5.1-6 должен выполнить 100 итераций, но, поскольку при значении счетчика, равном50, выполняется операторExit For,будет произведено всего50итераций.
Dim i As Integer
For i = 1 To 1000
‘ Пустой цикл может использоваться для задержки времени.
До сих пор мы использовали элемент управления TextBox для ввода или вывода одной строки, а для вывода нескольких строк текста использовали элемент управления ListBox. Однако в элемент управления TextBox можно выводить и несколько строк текста. Для вывода нескольких строк в элемент управления TextBox надо установить свойство Multiline элемента управления TextBox в значение True, а свойство ScrollBars — в значение Vertical. При использовании этих простых настроек объект однострочного текстового полястановится объектом многострочного текстового поля с полосами прокрутки, облегчающими доступ к нему.
Пример 4.5.1-2. Создать проект, демонстрирующий реализацию регулярных циклических структур.
- ЗапуститьVS и создать новый проект VBWindowsApplication с именем Пример-4-5-1-2,а на появившейся форме двойным щелчком мышью создать элемент управления Button в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью является быстрым способом создания на форме объекта со стандартными размерами. Теперь этот объект можно перетащить туда, куда его требуется поместить, и настроить его свойства.
- Перетащить объект кнопки вправо и поместить его в центре верхней части формы.
- Открыть окно Свойства (Properties), а затем установить свойство Text кнопки в значение Цикл.
- Дважды щелкнуть мышью в окне Элементы управления (ToolBox) на элементе управления TextBox.VSсоздаст на форме небольшой объект текстового поля.
- Установить свойство Multiline этого объекта текстового поля в значение True, а затем установить его свойство ScrollBarsв значение Vertical. Эти настройки подготавливают текстовое поле к отображению нескольких строк текста.
- Переместить текстовое поле так, чтобы оно располагалось ниже кнопки, и увеличить его так, чтобы оно заняло примерно треть формы.
- Дважды щелкнуть мышью на форме.
Появится окноРедактор кода (Code Editor). В это окно необходимо добавить процедуру Cykl( ) и ее вызов из процедуры события Button1_Click( ), приведенные на рис. 4.5.1-8.
Public ClassForm1SubCykl(ByValLineAs String)DimiAs IntegerFori = 1To10TextBox1.Text = TextBox1.Text & Line & i & vbCrLfNextiEnd SubPrivate SubButton1_Click(ByValsenderAsSystem.Object, _ByValeAsSystem.EventArgs)HandlesButton1.ClickDimLineAsString=«Line «Cykl(Line)EndSubEndClass |
Рис. 4.5.1-8 После объявления переменной, используется цикл For. Next, который десять раз отображает в объекте текстового поля строку Linei, где i — это текущее значение переменной-счетчика (другими словами, от Line1 до Line10). Символы конкатенации строк (&) в текстовом поле объединяют воедино части каждой строки. Вначале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых строк не удаляются. Затем для отображения новой строки и перевода курсора к левой границе и на следующую строку, объединяются строка «Line», текущий номер строки и символ перевода строки vbCrLf. Оператор Next завершает цикл. Обратите внимание, что при вводе начала цикла For VS автоматически добавляет в конец цикла оператор Next.
- Чтобы сохранить изменения, необходимо щелкнуть на кнопке Сохранить все (Save All) на стандартной панели инструментов.
- Щелкнуть на кнопке Начать отладку (Start Debugging) на панели инструментов.
- Щелкнуть на кнопке Цикл формы.
Цикл For. Next отобразит в текстовом поле 10 строк, как показано на рис. 4.5.1-9. Рис. 4.5.1-9
- Снова щелкните на кнопке Циклформы.
Цикл For. Next отобразит на форме еще 10 строк. Чтобы увидеть все строки, можно воспользоваться вертикальной полосой прокрутки. При каждом повторении цикла в объект текстового поля добавляет10 новых строк. Необходимо обратить внимание, что в объекте текстового поля не останется места. Даже если отображается всего несколько строк текста, на это потребуется время. А многострочный объект имеет практическое ограничение на размер текста в 32 Кб. Если требуется вывести текст большего размера или получить дополнительные опции форматирования, используйте элемент управления RichTextBox из окна Элементы управления (ToolBox) –похожий, но более мощный элемент управления для отображения и обработки текста. Пример 4.5.1-3.Написать процедуры ввода/вывода, которые могут использоваться в алгоритмах циклических структур. vvodDbl1( )иvivodDbl1( )- процедуры ввода и вывода данных типаDoubleв текстовые поля, vvodSng3( ) иvivodSng3( )- процедуры ввода и вывода данных типаSingleв текстовые поля, vvodInt4( )иvivodInt4( )- процедуры ввода и вывода данных типаIntegerв текстовые поля, vvodLng5( )иvivodLng5( ) — процедуры ввода и вывода данных типа Long в текстовые поля, vivodDblFx6( ) иvivodLngFx7( ) — процедуры форматного вывода значения одной переменной типаDoubleиLong, vivodDblFxy8( ) — процедуры форматного вывода значения двух переменных типаDouble. Процедуры vvodDbl1( ),vivodDbl1( ),vvodSng3( ),vivodSng3( ), vvodIDbl2( )иvivodDbl2( )приведены в теме 4.3, процедурыvvodInt4( )иvivodInt4( ) приведены в теме 4.4, а процедурыvvodLng5( ),vivodLng5( ), vivodDblFx6( ),vivodLngFx7( ),vivodSngFxy8( ), vvodInt9( ),vivodInt9( )представлены на рис. 4.5.1-10 и 4.5.1-16.
‘процедура-Function ввода данных типаLongиз текстового поля TextBoxFunctionvvodLng5(ByValTAsTextBox)As LongReturn CLng(T.Text)End Function |
Рис. 4.5.1-10
‘Процедура-Subвывода данных типаLongв TextBoxSubvivodLng5(ByVallAs Long,ByValTAsTextBox)T.Text =CStr(l)End Sub |
Рис. 4.5.1-11
‘Процедура-Subформатного вывода данных типа Double в TextBoxSubvivodDblFx6(ByValxAs Double, ByValTAsTextBox)T.Text = T.Text + Format(x,«0.000 «)End Sub |
Рис. 4.5.1-12
‘Процедура-Subформатного вывода данных типаLongв TextBoxSubvivodLngFx7(ByValxAs Long,ByValTAsTextBox)T.Text = T.Text + Format(x,«0»)EndSub |
Рис. 4.5.1-13
‘Процедура-Subформатного вывода значений двух переменных‘типаSingleвTextBoxSubvivodSngFxy8(ByValxAs Single,ByValyAs Single, ByValTAsTextBox)T.Text = T.Text + Format(x,«0.000 «) + Space(8) + _Format(y,«0.000 «) + vbCrLfEnd Sub |
Рис. 4.5.1-14
‘процедура-Function ввода данных типаIntegerиз функцииInputBox( )FunctionvvodInt9(ByValpAs String,ByValTAsTextBox)As IntegerT.Text = InputBox(P)Return CInt(T.Text)End Function |
Рис. 4.5.1-15
‘Процедура вывода данных типаIntegerфункциейMsgBoxSubvivodInt9(ByValIAs Integer, _ByValSAsString,ByValTAsTextBox)T.Text = MsgBox(CStr(I), S)EndSub |
Рис. 4.5.1-16