Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вложенные операторы If. Логические операции и выражения

Поиск

Умный компьютер решает сложные логические задачи. Для этого нужны сложные средства языка. Рассмотрим их.

Вложенные операторы If

Согласно синтаксической схеме оператора If, после Then и Else может стоять любой оператор Visual Basic, в том числе и If.

Решим задачу: В компьютер вводится число (пусть для конкретности это будет дальность какого-нибудь выстрела). Если оно находится в интервале от 28 до 30, то напечатать текст ПОПАЛ, иначе - НЕ ПОПАЛ.

Сначала составим алгоритм: Введи число. Если оно меньше 28, то печатай НЕ ПОПАЛ, в противном случае надо еще подумать. А о чем же думать? А вот о чем: Если число меньше 30, то печатай ПОПАЛ, иначе печатай НЕ ПОПАЛ.

А теперь по составленному алгоритму напишем программу:

Private Sub Command1_Click()

a = InputBox("Введите дальность выстрела")

If a < 28 Then

MsgBox ("НЕ ПОПАЛ")

Else

If a < 30 Then MsgBox ("ПОПАЛ") Else MsgBox ("НЕ ПОПАЛ")

End If

End Sub

Здесь оператор If a < 30 входит в состав оператора If a < 28. Говорят, что он вложен в него.

Эту же программу можно записать и без вложенного If:

Private Sub Command1_Click()

a = InputBox("Введите дальность выстрела")

If a < 28 Then

MsgBox ("НЕ ПОПАЛ")

ElseIf a < 30 Then

MsgBox ("ПОПАЛ")

Else

MsgBox ("НЕ ПОПАЛ")

End If

End Sub

 

Задание 26: Усложним задание 19 из 5.3: В компьютер вводятся длины трех отрезков. Компьютер должен ответить на вопрос, правда ли, что эти отрезки могут образовать треугольник.

Указание: Для этого каждый отрезок должен быть меньше суммы длин двух других отрезков.

Логические операции

Применение вложенных If создает довольно громоздкую, трудную для понимания программу. Поэтому в Visual Basic есть возможность записывать многие программы короче и понятнее, используя вместо вложенных друг в друга If только один If. Для этого используются так называемые логические операции. Что это такое, разберем на примерах.

 

Задача "Разборчивая принцесса". В прихожей у принцессы - длинная очередь женихов. Принцессе нравятся только голубоглазые маленького роста. Устав принимать женихов и отбирать из них подходящих, принцесса вместо себя поставила компьютер, написав для него программу, которая говорит ВЫ МНЕ ПОДОЙДЕТЕ тем, у кого цвет глаз голубой и рост меньше 140 см. Остальным программа говорит ДО СВИДАНИЯ.

Вот эта программа:

Dim Tsvet As String 'Цвет

Dim Rost As Integer: 'Рост

Private Sub Command1_Click()

Tsvet = InputBox("Каков цвет ваших глаз?")

Rost = InputBox("Введите ваш рост в сантиметрах")

If Tsvet = "Голубой" And Rost < 140 Then Print "ВЫ МНЕ ПОДОЙДЕТЕ" Else Print "ДО СВИДАНИЯ"

End Sub

 

Мы видим, что условие в операторе If уже не такое простое, как мы описывали раньше, а сложное, то есть состоящее из двух условий, соединенных знаком логической операции And (переводится "и"). Весь оператор If можно прочесть так - если цвет глаз голубой И рост меньше 140 сантиметров, то печатай ВЫ МНЕ ПОДОЙДЕТЕ, иначе печатай ДО СВИДАНИЯ.

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

Поэтому наш оператор If ответит ДО СВИДАНИЯ и высоким голубоглазым, и высоким неголубоглазым, и маленьким неголубоглазым. И лишь маленьким голубоглазым он ответит ВЫ МНЕ ПОДОЙДЕТЕ. В общем, And - строгий знак.

 

Программа для задачи ПОПАЛ - НЕ ПОПАЛ при использовании логических операций значительно упростится:

Private Sub Command1_Click()

a = InputBox("Введите дальность выстрела")

If a > 28 And a < 30 Then MsgBox ("ПОПАЛ") Else MsgBox ("НЕ ПОПАЛ")

End Sub

Задача "Неразборчивая принцесса". Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все голубоглазые независимо от роста. Программа неразборчивой принцессы будет отличаться от программы разборчивой одним единственным знаком логической операции:

If Tsvet ="Голубой" Or Rost<140 'Если цвет голубой ИЛИ рост<140

Знак логической операции Or переводится "или".

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

Поэтому теперь оператор If ответит ВЫ МНЕ ПОДОЙДЕТЕ и высоким голубоглазым и маленьким голубоглазым и маленьким неголубоглазым. И лишь высоким неголубоглазым он ответит ДО СВИДАНИЯ.

 

Знаками And и Or можно объединять сколько угодно условий. Например:

If a>2 Or x=b Or c<>1 Then k=99 Else k=33

Здесь выполнится оператор k=99, если верно хотя бы одно из трех условий, и лишь когда все три неверны, будет выполняться оператор k=33.

 

Кроме логических операций And и Or применяется еще логическая операция Not (переводится "НЕ"). Запись If Not a>b Then... переводится так - ЕСЛИ НЕПРАВДА, ЧТО a больше b, ТО.... Вот фрагмент:

a=2: b=3: If Not a>b Then k=1 Else k=0

Здесь выполнится оператор k=1, так как неправда, что 2>3.

Логические выражения

Выражения

a>b

a > 28 And a < 30

Tsvet ="Голубой" OrRost<140

a>2 Or x=b Or c<>1

имеют ту общую черту, что про каждое из них можно сказать, верно оно или нет в каждый момент времени. Такие выражения называются логическими выражениями. Если логическое выражение верно, то говорят, что оно имеет значение True (Правда). Если логическое выражение неверно, то говорят, что оно имеет значение False (Ложь). Любое логическое выражение может стоять в качестве условия в операторе If.

Логические выражения могут быть сложными - содержать одновременно операции And, Or, Not. Например, такое:

a>2 And Not b>3 Or s>8

Чтобы его понять, нужно знать порядок действий. В арифметике сначала выполняется умножение, потом сложение. В логических выражениях сначала выполняется Not, затем And, затем Or. Для облегчения понимания не возбраняется расставлять скобки:

(a>2 And ( Not b>3)) Or s>8

Это выражение равносильно предыдущему.

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

a>2 And Not (b>3 Or s>8)

 

 

Примеры:

ФРАГМЕНТ РЕЗУЛЬТАТ
a=8: b=6: If a>b And b>7 Then k=1 Else k=0 k=0
a=8: b=6: If a>b Or b>7 Then k=1 Else k=0 k=1
a=8: b=6: If a<b Or b>7 Then k=1 Else k=0 k=0
a=8: b=6: If Not a=8 Then k=1 Else k=0 k=0

Задание 27: "Замысловатая принцесса". Определите, кто нравится принцессе, по фрагменту из ее программы:

If Tsvet ="Черный" And (Rost<180 Or Rost>184) Then Print "ВЫ МНЕ ПОДОЙДЕТЕ" Else Print "ДО СВИДАНИЯ"

 

Задание 28: Усложним нашу задачу про ПОПАЛ - НЕ ПОПАЛ: Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или равно 30 - то ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ, если число меньше нуля - НЕ БЕЙ ПО СВОИМ.

Задание 29:

Человек вводит с клавиатуры строку, смысл которой - приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать нужно в соответствии со следующей таблицей:

ПРИВЕТСТВИЕ ЧЕЛОВЕКА ОТВЕТ КОМПЬЮТЕРА
Привет Привет
Здравствуйте Здравствуйте
Добрый день Салют
Приветик Салют
Салют Салют
Здравия желаю Вольно
Любое другое приветствие Я вас не понимаю

 

5.8. Оператор вариантаSelect Case

У авторов языков программирования есть похвальное стремление сделать язык попроще, попонятнее. Они с ужасом взирают на многочисленные "иначе если" и логические операции и стараются, где можно, от них избавиться. Возьмем, например, такую задачу: Компьютер спрашивает школьника, какую он получил отметку по физике, и реагирует на нее подходящим текстом. Вот программа без нововведений, использующая If:

Dim Otmetka As Integer

Private Sub Command1_Click()

Otmetka = InputBox("Какую отметку ты получил по физике?")

If Otmetka = 1 Or Otmetka = 2 Then

Print "Кошмар!"

ElseIf Otmetka = 3 Then

Print "Неважно"

ElseIf Otmetka = 4 Then

Print "Неплохо"

ElseIf Otmetka = 5 Then

Print "Молодец!"

Else

Print "Таких отметок не бывает"

End If

End Sub

Здесь может вызвать раздражение слишком часто встречающееся имя Otmetka, а также то, что и в такой простой задаче не обошлось без логических операций. Хорошо бы программу можно было писать попроще, например, так (по-русски):

Выбери вариант отметки

Вариант 1, 2

печатай "Кошмар!"

Вариант 3

печатай "Неважно"

Вариант 4

печатай "Неплохо"

Вариант 5

печатай "Молодец!"

Вариант остальное

печатай "Таких отметок не бывает"

Конец выбора

И такой оператор варианта был придуман и назван Select Case, что и означает в переводе ВЫБЕРИ ВАРИАНТ. Я просто-напросто переписываю русский вариант программы по-английски:

Dim Otmetka As Integer

Private Sub Command1_Click()

Otmetka = InputBox("Какую отметку ты получил по физике?")

Select Case Otmetka

Case 1, 2

Print "Кошмар!"

Case 3

Print "Неважно"

Case 4

Print "Неплохо"

Case 5

Print "Молодец!"

Case Else

Print "Таких отметок не бывает"

End Select

End Sub

Логика работы Select Case абсолютно такая же, как и у блочного If. В процессе исполнения оператора компьютер сравнивает значение переменной Otmetka по очереди со всеми значениями, перечисленными в вариантах. Наткнувшись на совпадающее значение, он выполняет операторы, стоящие в этом варианте. На этом исполнение оператора Select Case завершается. Если же совпадающего значения так и не нашлось, то выполняются операторы, стоящие в варианте Else (в нашей программе он полезен на тот случай, если ученик болен манией величия и вводит число 6).

 

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

Private Sub Command1_Click()

a = 3

Select Case a * a + 1

Case 8, 4 * a, 26

k = 0

Print k

Print a

Case 7, 10, 84 To 90

k = 1

Print k

Case Is < 0, 2, 4, 12 To 18 + a, 44, 68, Is > 100 + a

k = 3

End Select

End Sub

Эта программа напечатает 1. Здесь мы видим несколько новых для нас элементов:

Во-первых, после слов Select Case стоит не переменная, а выражение, поэтому с перечисленными в вариантах значениями будет сравниваться число 10, полученное как 3*3+1. В качестве значений вариантов тоже могут быть выражения, как, например, у нас - 4 * a.

Во-вторых, здесь у нас в двух вариантах не по одному, а по нескольку выполняющихся операторов.

В-третьих - конструкция 84 To 90. Она обозначает то же, что и 84,85,86,87,88,89,90, и служит в нашем случае для сокращения записи.

В-четвертых - конструкция Is< 0. Слово Is служит заменителем выражения a*a+1 и тоже используется для сокращения. Таким образом, Select Case не только сравнивает значения на равенство, но и проверяет неравенства.

В-пятых, здесь отсутствует вариант Else. Это значит, что если бы в нашей программе мы вместо a=3 написали a=0, то оператор Select Case, не найдя совпадения, не выбрал бы ни один из своих вариантов и, не найдя также Else, завершил бы свою работу, так ничего и не сделав.

 

Чем платим за удобство Select Case по сравнению с If? Что может If такого, чего не может Select Case? Самое главное - условия в If могут быть совершенно произвольны, а в Select Case мы привязаны к a*a+1.

 

Вот синтаксис оператора Select Case:

Select Case проверяемое выражение

[Case значение, значение ……

[ операторы

операторы

……………... ]]

[Case значение, значение ……

[ операторы

операторы

……………... ]]

…………………….……………….

[Case Else

[ операторы

операторы

……………... ]]

End Select

 

Здесь значение - это:

- выражение

- выражение To выражение

- Is знак сравнения выражение

 

Выражения могут быть не только числовые, но и строковые. Пример:

Private Sub Command1_Click()

a = "Дом"

Select Case a

Case "Домик"

k = 3

Print a

Case "Дом"

k = 0

Print k

End Select

End Sub

Здесь будет напечатан 0.

 

Задание 30: Ученик вводит с клавиатуры букву русского алфавита. Компьютер должен сказать, какой звук обозначает это буква - гласный, согласный звонкий, согласный глухой или какой-нибудь другой (можно и НЕ ЗНАЮ).

Задание 31: Если у вас есть микрофон и вы можете записывать свой голос в файл, то попробуйте усовершенствовать ваш диалог с компьютером из 4.9. Пусть компьютер подает вам реплики голосом. Для этого вам заранее придется записать на диск некоторое количество звуковых файлов с репликами компьютера и при помощи оператора Select Case выбирать между ними в зависимости от реплики человека с клавиатуры. Вы сразу же заметите, что компьютер поглупел, но зато стал изъясняться вслух.

Улучшаем калькулятор.

Наш калькулятор не предохранен от попыток выполнения арифметических действий над текстом и от деления на ноль. Предохраним его от этого, а также научимся ставить пароль на проект.

Проверка ввода чисел в текстовое поле

Давайте запустим наш калькулятор в том виде, который он получил в 4.5

Dim Чис1 As Double 'Переменная, содержащая число из текстового поля Число1

Dim Чис2 As Double 'Переменная, содержащая число из текстового поля Число2

Dim Рез As Double 'Переменная-результат, предназначенный для текстового поля Результат

_____________________________________________________________________________

Private Sub Кл_сложения_Click()

Чис1 = Число1.Text 'Значения исходных данных переходят в переменные из текстовых полей

Чис2 = Число2.Text

Рез = Чис1 + Чис2 'Обработка переменных для получения результата

Результат.Text = Рез 'Значение результата переходит из переменной в текстовое поле

End Sub

…………………………..

Попробуем ввести в верхнее текстовое поле вместо числа какую-нибудь ерунду, например, КУ-КУ. Щелкнем по кнопке сложения. Visual Basic выдает сообщение об ошибке "Type mismatch" - несовпадение типов числовой переменной Чис1 и вводимой текстовой информации. Все верно.

Теперь подумаем - хорошо ли это, что Visual Basic реагирует на ваши неправильные действия собственными сообщениями об ошибке? Для вас, которые уже что-то умеют в программировании и делают калькулятор исключительно для собственного удовольствия, может быть и хорошо. Ну а представьте, что вы решили похвастаться калькулятором перед своей подругой, которая знакома с программированием только понаслышке, и она, работая на нем, допустила такую же ошибку? Что она подумает, увидев неожиданно возникшее окно с непонятными английскими словами? Вы думаете, она поймет, что это сообщение об ошибке? Скорее всего она подумает, что это сломался компьютер. И на какие кнопки, скажите на милость, ей нажимать? "Ну и гадость твой калькулятор!" - скажет она наконец и будет сто раз права.

Та же проблема стоит и перед всеми профессиональными программистами, которые создают свои продукты для использования людьми, не обязанными ничего знать о программировании. Программист обязан сделать так, чтобы на все неправильные действия пользователя реагировал не Visual Basic своими непонятными сообщениями, а сама программа, причем понятно, по-русски, и тут же давала возможность исправиться.

Для этого в Visual Basic должны быть средства. И они там есть. Что нам нужно сейчас? Нам нужно средство, которое определяло бы, число ли записано в текстовом окне или же все, что угодно, но только не число. Это функция IsNumeric. Ее аргумент может быть любого типа, в том числе и строкой. Функция анализирует строку и если видит, что она состоит из цифр, знака минус и запятой таким образом, что получается число (и больше ничего в строке нет), то функция получает значение True, что означает "Правда", в противном случае - False, что означает "Ложь". Проверим:

Оператор Debug.Print IsNumeric("КУ-КУ") печатает False.

Оператор Debug.Print IsNumeric("-67,3") печатает True.

Раз так, то функцию IsNumeric можно включать в логические выражения и использовать в качестве условия оператора If. Например,

If IsNumeric("-67,3") Then MsgBox ("Это число") Else MsgBox ("Это не число")

что означает: "Если -67,3 - число, то …" Поэтому же совсем не обязательно писать If IsNumeric("-67,3") = True Then ….

 

Алгоритм работы калькулятора с проверкой звучит примерно так: Если в текстовом поле Число1 введено число и в текстовом поле Число2 введено число, то делай все, что положено, иначе выдавай сообщение "Вводите только числа". Процедура сложения с учетом этого алгоритма будет выглядеть так:

Private Sub Кл_сложения_Click()

If IsNumeric (Число1) And IsNumeric (Число2) Then

Чис1 = Число1.Text

Чис2 = Число2.Text

Результат.Text = Чис1 + Чис2

Else

MsgBox ("Вводите только числа")

End If

End Sub

Здесь я немного сэкономил на переменной Рез. Поскольку мы ее никак не обрабатываем, я обошелся без нее. Процедуры для остальных действий пишутся аналогично.

Запрет деления на ноль

Вторая ошибка, на которую реагирует Visual Basic, это деление на ноль. От нее мы избавимся, если запретим компьютеру делить на ноль, записав вместо оператора

Результат.Text = Чис1 / Чис2

такой:

If Чис2 <> 0 Then Результат.Text = Чис1 / Чис2 Else MsgBox ("На ноль делить нельзя")

Вот как будет выглядеть теперь процедура деления:

Private Sub Кл_деления_Click()

If IsNumeric(Число1) And IsNumeric(Число2) Then

Чис1 = Число1.Text

Чис2 = Число2.Text

If Чис2 <> 0 Then Результат.Text = Чис1 / Чис2 Else MsgBox ("На ноль делить нельзя")

Else

MsgBox ("Вводите только числа")

End If

End Sub

Как видите, здесь в состав многострочного If входит однострочный.

Ставим пароль на калькулятор

Ваш калькулятор стал достаточно надежен и удобен. Теперь его не стыдно показать друзьям. Ну а защищаться от врагов будем паролем.

Наша задача - сделать так, чтобы при попытке запустить калькулятор на экране появлялось приглашение ввести пароль, известный только вам. При попытке ввода неправильного пароля, программа должна заканчивать свою работу.

Поскольку приглашение на ввод пароля должно появляться раньше всего остального, то программируем его в процедуре Form_Load, в самом начале. Предварительно объявим строковую переменную для хранения пароля и выдумаем сам пароль, например, "калям".

Dim Parol As String 'Переменная-пароль

Private Sub Form_Load()

Parol = InputBox("Введите пароль")

If Parol <> "калям" Then MsgBox ("Пароль неверный!"): End

End Sub

Новый для вас оператор End делает всего одну вещь - вызывает завершение программы.

Запустите проект и проверьте, как он работает.

То же самое можно было бы запрограммировать короче, без использования переменной:

Private Sub Form_Load()

If InputBox("Введите пароль") <> "калям" Then MsgBox ("Пароль неверный!"): End

End Sub

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

Вы скажете: Кто угодно перед запуском моей программы посмотрит в ее текст и сразу же увидит пароль. Совершенно верно. Чтобы текст программы не был виден, преобразуйте проект в исполнимый файл, как мы это делали в 2.13.

Сделаем так, чтобы в случае ввода пароля в текстовое поле там появлялись не буквы пароля, а звездочки. В этом случае никто из-за вашей спины не сможет пароль подсмотреть. Для этого достаточно до ввода пароля выполнить строку

Text1. PasswordChar = " * "

Функция MsgBox

В 2.10 я вкратце описал, как пользоваться оператором MsgBox. Здесь я более подробно разберу действие функции MsgBox. Функция отличается от оператора тем, что она встречается в выражениях и в правой части оператора присваивания, и еще тем, что подобно переменной имеет значение. Например, возьмем оператор присваивания:

y = MsgBox("Привет!")

При выполнении этого оператора мы увидим на экране точно такое же окно сообщения, как при выполнении оператора

MsgBox("Привет!")

Но вдобавок к этому, после того, как мы нажмем на кнопку ОК, переменной y будет присвоено некое значение. Что это за значение и зачем оно нужно, мы сейчас выясним.

 

Задача: В текстовом поле Visual Basic для нашей пользы печатает, сколько будет дважды два. После чего, заботясь о нашем зрении, он выводит следующее окно сообщения:

 

 

При нажатии на Yes шрифт увеличивается, при нажатии на No ничего не происходит.

Вот программа:

Private Sub Command1_Click()

Text1.Text = 2 * 2

y = MsgBox ("Не мелковат ли шрифт?", vbQuestion + vbYesNo, "Забота о пользователе")

If y = vbYes Then Text1.FontSize = 20

End Sub

Пояснения: Здесь полужирным шрифтом я выделил новые для вас элементы. Константа vbQuestion означает приказ изменить внешний вид окна сообщения, конкретнее - изобразить в нем картинку со знаком вопроса. Константа vbYesNo означает приказ поместить в окне сообщения кнопки Yes и No. Знаком плюс эти константы соединены, так как имеют некие численные значения, о которых вам, впрочем, не обязательно задумываться. После нажатия на кнопку Yes функция MsgBox приобретает значение vbYes. После нажатия на кнопку No функция MsgBox приобретает значение vbNo. Поэтому фрагмент

If y = vbYes …

можно перевести так: "Если была нажата кнопка Yes …"

 

Вот константы для задания внешнего вида окна сообщения: VbCritical, vbQuestion, vbExclamation, vbInformation.

Вот константы для задания кнопок в окне сообщения: VbOKOnly, vbOKCancel, vbAbortRetryIgnore, vbYesNoCancel, vbYesNo, vbRetryCancel.

Вот константы для задания значения функции MsgBox после нажатия на кнопку: vbOK, vbCancel, vbAbort, vbRetry, vbIgnore, vbYes, vbNo.

Поэкспериментируйте со внешним видом окна сообщения. Поведение окна сообщения определяется еще кое-какими константами, но мы на них не будем останавливаться.

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

OK - просто принять сообщение к сведению, Cancel - отменить намечавшееся действие, Abort - прекратить неудавшуюся попытку (например, когда ваша процедура занимается распечаткой документа на принтере и приходит сообщение "Принтер не готов"), Retry - повторить неудавшуюся попытку, Ignore - проигнорировать предупреждение и продолжать, как ни в чем не бывало, Yes-No - ответить да или нет на вопрос, содержащийся в сообщении.



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 454; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.44.156 (0.011 с.)