Опубликован: 31.08.2006 | Доступ: свободный | Студентов: 3927 / 218 | Оценка: 4.14 / 3.89 | Длительность: 39:16:00
ISBN: 978-5-9570-0021-3
Лекция 8:

Циклы и таймеры

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >

Цикл Do

В качестве альтернативы циклу For...Next можно написать цикл Do, который исполняет группу операторов до тех пор, пока некоторое условие не станет равно True. Циклы Do ценны тем, что зачастую вы не сможете заранее узнать, сколько раз цикл должен повторяться. Например, вы можете позволить пользователю вводить имена в базу данных до тех пор, пока пользователь не введет в поле ввода слово "Готово". В этом случае можно использовать цикл Do, повторяющийся до тех пор, пока не будет введено слово "Готово".

Цикл Do имеет несколько форматов, зависящих от того, где и как вычисляется условие цикла. Чаще других встречается такой синтаксис:

Do While условие
блок выполняемых операторов
Loop

Например, следующий цикл Do будет запрашивать у пользователя данные и отображать их в текстовом поле до тех пор, пока не будет введено слово "Готово":

Dim InpName As String
Do While InpName <> "Готово"
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> "Готово" Then TextBox1.Text = InpName
Loop

Условный оператор в этом цикле имеет вид InpName <> "Готово", и компилятор Visual Basic транслирует его в значение "повторять цикл до тех пор, пока переменная InpName не будет содержать слова Готово". Это приводит к одному интересному моменту, касающемуся циклов Do: если условие в начале цикла не равно True при первом выполнении оператора Do, то цикл Do никогда не исполняется. Таким образом, если строковая переменная InpName содержит значение "Готово" до начала цикла (возможно, в результате более раннего присвоения значения в процедуре события), Visual Basic пропустит весь цикл и продолжит выполнение со строки, расположенной вслед за ключевым словом Loop.

Если вы хотите, чтобы в программе цикл всегда выполнялся хотя бы один раз, поместите проверку условия в конце цикла. Например, цикл

Dim InpName As String
Do
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> " Готово" Then TextBox1.Text = InpName
Loop While InpName <> " Готово"

в основном, такой же, как и предыдущий цикл Do, но здесь условие цикла проверяется после того, как из функции InputBox было получено имя. Преимущество этого варианта в том, что он обновляет переменную InpName до того, как будет произведена проверка условия цикла, и, таким образом, предыдущее значение "Готово" не приведет к пропуску выполнения цикла. Проверка условия цикла в конце гарантирует, что ваш цикл выполнится хотя бы один раз, но часто это будет приводить к тому, что вам потребуется добавлять дополнительные операторы для обработки данных.

Примечание. Предыдущие примеры кода для выхода просили пользователя ввести слово "Готово". Обратите внимание, что проверка введенного теста учитывает регистр букв, что означает, что ввод слов "готово" или "ГОТОВО" не приведет к завершению программы. Это можно проверить нечувствительной к регистру введенного текста функцией StrComp, которая обсуждается в "Исследование текстовых файлов и обработка строк" .

Предотвращение бесконечных циклов

Из-за существующей структуры циклов Do, очень важно проектировать проверки условий таким образом, чтобы каждый цикл имел реальную точку выхода. Если проверка условий выполнения цикла никогда не даст в результате False, цикл будет выполняться бесконечно и ваша программа перестанет реагировать на ввод. Рассмотрим следующий пример:

Dim Number as Double
Do
Number = InputBox("Введите число для возведения в квадрат. Введите -1 для выхода.")
Number = Number * Number
TextBox1.Text = Number
Loop While Number >= 0

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

К сожалению, пользователь, закончив работу, не сможет выйти, так как представленное условие выхода не работает. Когда пользователь вводит -1, программа возводит его в квадрат, и переменной Number присваивается значение 1. (Проблему можно решить, поставив другое условие выхода.) Отслеживание бесконечных циклов при написании циклов Do очень важно. К счастью, если вы тщательно тестируете программу, то их довольно легко обнаружить.

Важно! Убедитесь, что каждый цикл имеет работающее условие выхода.

В следующем упражнении показано, как можно использовать цикл Do для преобразования температур по шкале Фаренгейта в температуры по шкале Цельсия. Эта простая программа запрашивает ввод от пользователя с помощью функции InputBox, преобразует температуру и отображает вывод в окне сообщения.

Преобразование температур с помощью цикла Do
  1. В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  2. В папке c:\vbnet03sbs\Гл.7 создайте новый проект Windows Application (Приложение Windows) на Visual Basic с именем My Celsius Conversion. Будет создан новый проект и в Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма. На этот раз вы поместите весь код программы в процедуре события Form1_Load, так что при запуске приложения Visual Basic попросит вас ввести температуру по Фаренгейту. Для запроса данных используется функция InputBox, а для отображения преобразованных данных - функция MsgBox.
  3. Сделайте двойной щелчок мышью на форме. В Редакторе кода появится процедура события Form1_Load.
  4. Введите в процедуре события Form1_Load следующие операторы программы:

    Dim FTemp, Celsius As Single
    Dim strFTemp As String
    Dim Prompt As String = "Введите температуру по Фаренгейту."
    Do
    strFTemp = InputBox(Prompt, "Пересчет температуры")
    If strFTemp <> "" Then
    FTemp = CSng(strFTemp)
    Celsius = Int((FTemp + 40) * 5 / 9 - 40)
    MsgBox(Celsius, , "Температура по Цельсию")
    End If
    Loop While strFTemp <> ""
    End

    Совет. Убедитесь, что в конце процедуры события Form1_Load вы добавили оператор End.

    Этот код выполняет необходимые вычисления. Первая строка объявляет две переменные одинарной точности - FTemp и Celsius - которые хранят температуры по Фаренгейту и Цельсию соответственно. Вторая строка объявляет строковую переменную с именем strFTemp, которая хранит строковую версию температуры по Фаренгейту. Третья строка объявляется строковую переменную с именем Prompt, которая будет использоваться функцией InputBox, и присваивает ей начальное значение. Цикл Do запрашивает у пользователя температуру по Фаренгейту, преобразует ее в шкалу Цельсия, а затем отображает на экране с помощью функции MsgBox.

    Значение, введенное пользователем, сохраняется в переменной strFTemp. Функция InputBox всегда возвращает значение строкового типа, даже если пользователь вводит число. Так как мы хотим выполнить с введенным значением математические вычисления, переменная strFTemp должна быть преобразована в число. Для преобразования строки в число одинарной точности используется функция CSng. CSng - это одна из нескольких функций, предназначенных для преобразования строки в другие типы данных. Затем преобразованное значение одинарной точности сохраняется в переменной FTemp.

    Цикл выполняется до тех пор, пока пользователь не щелкнет на кнопке Cancel (Отмена), или до тех пор, пока не нажмет на (Enter) или не щелкнет на OK при отсутствии в поле ввода какого-либо значения. Щелчок на кнопке Cancel (Отмена) или ввод пустого значения возвращают пустую строку (""). Цикл проверяет, не пуста ли строка, с помощью проверки условия While, стоящего в конце цикла. Оператор программы

    Celsius = Int((FTemp + 40) * 5 / 9 - 40)

    производит преобразование значений шкалы Фаренгейта в шкалу Цельсия. Этот оператор реализует стандартную формулу преобразования, но при этом использует функцию Int, чтобы возвратить в переменную Celsius значение, которое не содержит десятичных знаков. (Все, что находится справа от десятичной точки, отбрасывается.) Это отрезание приносит в жертву точность, но помогает вам избежать появления длинных нечитаемых значений типа 21.11111, которое является эквивалентом по Цельсию для температуры в 70 градусов по Фаренгейту.

  5. Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.

    Примечание. Готовая программа Celsius Conversion находится в папке c:\vbnet03sbs\Гл.7\celsius conversion.

    Теперь попробуйте запустить эту программу.

  6. Щелкните на кнопке Start (Начать) стандартной панели инструментов. Программа запустится, и функция InputBox запросит у вас температуру по Фаренгейту.
  7. Введите 212. Ваш экран должен выглядеть примерно так.


  8. Щелкните на OK. Температура в 212 градусов по Фаренгейту преобразуется в 100 градусов по Цельсию.


  9. Щелкните на OK. Введите в поле ввода 72 и снова щелкните на OK. Температура в 72 градуса по Фаренгейту преобразуется в 22 градуса по Цельсию.
  10. Щелкните на OK, а затем выйдите из программы, щелкнув на Cancel (Отмена) в диалоговом окне ввода. Программа закроется, и вернется среда разработки.
< Лекция 7 || Лекция 8: 123456 || Лекция 9 >
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Светлана Ведяева
Светлана Ведяева
Россия, Саратов