Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 3 создание презентаций-тестов.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.09 Mб
Скачать

2.Логически прерываемые

3.Объектного типа

Вычисляемый цикл предназначен для повторения одного блока кода заданное количество раз. Вычисляемые циклы применяются в тех случаях, когда заранее известно, сколько раз нужно выполнить блок кода.

Вычисляемые циклы разделяются Visual Basic с помощью циклической структуры For-Next и For Each-Next.

Цикл For… Next

For переменная_цикла = начало To конец Step шаг

. блок кода

Exit For

. блок кода

Next переменная _цикла

В данном случае переменная_цикла является именем переменной, которая считает количество шагов цикла. Переменные начало и конец определяют начальное и конечное значение переменная_цикла, а шаг – величину наращивания переменная_цикла после каждого выполнения цикла.

Когда в программе встречается цикл For-Next, переменная_цикла получает значение начало, затем выполняется блок кода вплоть до оператора Next. Далее переменная_цикла увеличивается на величину шаг и сравнивается со значением конец. Если значение переменная_цикла больше, чем значение конец, то цикл прерывается и управление переходит к оператору, следующему за оператором Next. Если значение переменная_цикла меньше или равно значению конец, то блок кода цикла выполняется ещё раз. Так продолжается до тех пор, пока значение переменная_цикла не станет больше значения конец.

Когда встречается оператор Exit For, цикл немедленно прерывается и управление переходит к оператору, следующему за оператором Next. Обычно оператор Exit For применяется для прекращения процесса поиска чего-нибудь, когда вы искали это циклически и нашли.

Если зарезервированное слово Step и величина шаг опущены, то величина переменная_цикла наращивается на 1 после каждого шага цикла. Если величина конец меньше величины начало и величина шаг отрицательна, цикл считается по убывающей, а не по возрастающей.

Счётчик цикла - это обычная переменная, доступная в любом месте цикла и используемая в блоке его кода для выбора различных величин или ячеек. Счётчиком цикла обычно является целое число, используемое в качестве индекса массива переменных или в качестве аргумента метода Cells для выбора ячейки таблицы.

После завершения цикла значение счётчика больше значения конец (или меньше значения конец, если цикл считался по убывающей). Этот фактор удобно использовать, чтобы определить, завершился ли цикл нормально или был преждевременно прерван оператором Exit For.

Особенность:

Поскольку переменная цикла является обычной переменной, то её можно изменить в любом месте блока кода цикла. Однако изменений переменной цикла необходимо избегать: такие изменения легко могут привести к непредсказуемым результатам.

Циклы объектного типа реализуются структурой For Each...Next. Процесс выполнения данного цикла аналогичен циклу For…Next. Однако, в качестве переменной цикла используется не счётчик, определяющий количество повторов, а объект из выделенного набора. В качестве набора может быть использована как область ячеек, так и массив.

For Each <элемент> in <набор>

<Тело цикла>

Next <элемент>,

Где <элемент> и <набор> являются переменными типа Variant.

В этом синтаксисе элемент представляет собой переменную типа Variant, что обеспечивает возможность содержать объект. Переменная набор является некоторым набором объектов. В процессе выполнения цикла объект выбирается из набора и помещается в переменную элемент, и это позволяет использовать переменную элемент в блоке кода цикла для осуществления необходимых действий с объектом. Аналогично циклу For...Next оператор Exit For прерывает цикл до его окончания.

C использованием цикла For Each - Next, рассмотрим пример заполнения области случайным набором действительных чисел.

Dim c

Sub Oblast()

For Each C in Selection

C.Value=RND * 10

Next C

End Sub

Цикл Do - Loop является наиболее универсальным из логически прерываемых циклов. существуют четыре конфигурации этого цикла:

1.условие True в начале

2.условие True в конце

3.условие False в начале

4. методов Show и Hide четырех конфигураций:

Условие True в начале.

Do While условие

...блок кода

Exit Do

...блок кода

Loop

Условие True в конце.

Do

...блок кода

Exit Do

...блок кода

Loop While условие.

Условие False в начале.

Do Until условие

...блок кода

Exit Do

...блок кода

Loop

Условие False в конце.

Do

...блок кода

Exit Do

...блок кода

Loop Until условие

Зарезервированные слова While и Until определяют логику условия, причем While указывает, что цикл будет выполняться до тех пор, пока условие принимает значение True, а Until указывает, что цикл будет выполняться до тех пор, пока условие не станет True. Отношение между While и Until можно выразить следующим образом:

While условие = Until Not условие

Оператор Exit Do предназначен для преждевременного прекращения цикла и обычно применяется в логической структуре (вроде оператора If), которая проверяет альтернативное условие прерывания цикла, например ошибку.

Запись условия в начале или в конце цикла определяет, где это условие будет определяться. Когда условие определяется в начале цикла, цикл выполняется (или не выполняется), если условие исходно удовлетворено. Такой вид цикла удобно применять в тех случаях, когда когда цикл не должен выполняться до тех пор, пока условие не будет выполнено.

Например, при чтении дискового файла можно использовать функцию EOF() для проверки очередной части файла в поисках маркера его конца. Если вы попытаетесь прочесть маркер конца файла, ваша программа остановится с ошибкой; таким образом, перед тем, как прочесть из файла какие либо данные, необходимо проверять очередную часть файла в поисках маркера конца файла. Чтобы сделать это, можно использовать следующее

Open “Myfile.txt” For Input As #1 ’ Открытие файла.

Do Until EOF(1) ’ Проверка на конец файла.

Input #1, A$ ’ Если нет, то чтение данных.

.

. ’ Код преобразования величины A$

.

Loop

Close #1 ’ Закрытие файла по концу работы.

В этом фрагменте кода функция EOF() проверяет маркер конца файла. Если вы еще не дошли до конца файла, функция EOF() возвратит False и цикл выполниться, прочитав из файла строку и обработав ее. Если функция EOF() обнаружит маркер конца файла, то она возвратит True и цикл прервется.

Запись условия в конце цикла.

Запись условия в конце цикла означает, что цикл выполнится хотя бы один раз. Этот вид цикла применяеися в тех случаях, когда когда цикл должен быть выполнен хотя бы один раз, чтобы сформировать условие, которое затем будет проверятьсяю. Он используется в основном для поиска, например, конкретного значения в массиве.

Так, следующая процедура находит в массиве первый положительный элемент:

’ Поиск первого положительного элемента массива.

Function FirstPos(theArray) As Single

Dim J As Integer, Value As Single

J = LBound(theArray) -1 ’Инициализация J

Do ’Начало цикла

J = J + 1 ’Наращивание J

Value = theArray(J) ’Выбор элемента массива

Loop Until Value > 0 ’Проверка элемента

FirstPos = Value

End Function

В этой процедуре theArray является переменной типа Variant, и следовательно, позволяет передать из таблицы массив. Функция Lbound() возвращает нижний предел индекса массива. Переменная J устанавливается не единицу меньше этого предела, так как в начале цикла она будет увеличена на 1, что и даст значение нижнего предела индекса массива. Цикл начинается оператором Do, затем наращивается переменная J и из массива выделяется элемент с соответствующим индексом. В конце цикла этот элемент проверяется, и если он положительный, то цикл прерывается, причем переменная Value равна положительному элементу массива, а переменная J - индексу этого элемента массива.

Такая процедура предполагает, что один из элементов массива будет иметь положительное значение. Если это точно неизвестно, то необходимо проверять значение переменной J и прерывать цикл, когда J превысит верхний предел индекса массива. Иначе вы получите ошибку выполнения 9 «Subscript out of range». Что бы проверить переменную J, процедуру нужно модифицировать следующим образом:

’ Поиск первого положительного элемента массива

Function FirstPos2(theArray) As Single

Dim J As Integer, Value As Single

J = LBound(theArray) -1 ’Инициализация J

Do ’Начало цикла

J = J + 1 ’Наращивание J

If J > UBound (theArraay) Then ’Превышение верхнего предела?

Value = CVFrr (xlErrValue) ’Установка кода ошибки, если нет ни одного положительного элемента

Exit Do ’Прерывание цикла

End If

Value = theArray(J) ’Выбор элемента массива

Loop Until Value > 0 ’Проверка элемента

FirstPos2 = Value

End Function

В этой версии процедуры значение переменной J после каждого наращивания сравнивается с верхним пределом индекса массива, полученном с помощью функции UBond(). Если переменная J превысит верхний предел, то переменной Value будет присвоен код ошибки #VALUE!, чтобы показать, что ни один элемент массива не соответствует заданному условию. В этом случае цикл будет прерван оператором Exit Do. Обратите внимание на то, что теперь функция возвращает значение типа Variant, - это позволяет передать код ошибки.