Проанализируем работу данного фрагмента при следующих заданных значениях параметров a= 5, b= 7 . При данных значениях параметров a и b , условие расположенное после ключевого слова IF не соблюдается, а следовательно, результатом выполнения программного кода будет значение y= 5 + 7 =12 . Начинающий программист, проверив на тестовом примере программу, убеждается в правильности ее работы. Но, в программе имеется логическая ошибка! При значениях параметров a= 5, b= 3, условие расположенное после ключевого слова IF соблюдается, и начинают выполняться два оператора присваивания: сначала y= 5 − 3 = 2, а затем - оператор y= 5 + 3 = 8 . Таким образом, окончательным значением арифметического выражения будет 8, что приведет, при истинности условия, к неверному результату, хотя при несоблюдении условия программа работает корректно. Для того, чтобы избежать подобные недоразумения, в первых версиях языка программирования Basic использовался оператор безусловного перехода GOTO. Этот оператор передает управление на строчку программного кода приложения, перед которой ставится метка. Формат оператора безусловного перехода имеет следующий вид: <операторы>
…
GOTO <метка>
<операторы> <метка>:
<операторы>
Фрагмент программы, рассмотренного выше примера, будет корректно работать, если в нее внести следующие изменения: IF a>b THEN y=a-b : GOTO m1 y=a+b m1:
Однако следует заметить, что в настоящее время использование оператора GOTO в программном коде является плохим стилем программирования, а в учебном процессе может привести к снижению оценки при решении задачи, так как Visual Basic в своем арсенале содержит достаточное количество управляющих конструкций, позволяющих избежать использование оператора GOTO.
Линейный синтаксис оператора условного перехода имеет второй вид формата, который наиболее подходит к решению рассмотренной выше задачи:
IF <условие> THEN <оператор1> ELSE <оператор2> <оператор3>
Если <условие>, расположенное после ключевого слова IF соблюдается (является истинным), то выполняется <оператор1>, <оператор2> пропускается, затем выполняется <оператор3>. При несоблюдении условия <оператор1> пропускается, а выполняются операторы <оператор2> и <оператор3>. Блок-схема данного типа синтаксиса условного оператора имеет вид:
Рассмотренный выше фрагмент программного кода, при использовании данного формата оператора записывается следующим образом:
IF a>b THEN y=a-b ELSE y=a+b
Рассмотрим следующий пример. Пусть требуется вычислить значение выражения в зависимости от условий.
если x < 7
y =
если x ≥ 7
Составим блок-схему алгоритма решения данной задачи.
Таблица 6. Описание интерфейса
Объект |
Свойство |
Значение |
Текстовое окно (TextBox) |
Name |
Text1 |
Text |
||
Height |
285 |
|
Width |
1215 |
|
Left |
600 |
|
Top |
720 |
|
Текстовое окно (TextBox) |
Name |
Text2 |
Text |
||
Height |
285 |
|
Width |
1215 |
|
Left |
600 |
|
Top |
1320 |
|
Метка (Label) |
Name |
Label1 |
Caption |
X |
|
Left |
360 |
|
Top |
720 |
|
AutoSize |
True |
|
Метка (Label) |
Name |
Label2 |
Caption |
Y |
|
Left |
360 |
|
Top |
1320 |
|
AutoSize |
True |
|
Командная кнопка (CommandButton) |
Name |
Command1 |
Caption |
РЕШЕНИЕ |
|
Left |
480 |
|
Top |
2040 |
|
Width |
1335 |
|
Height |
375 |
|
Командная кнопка (CommandButton) |
Name |
Command2 |
Caption |
ВЫХОД |
|
Left |
2160 |
|
Top |
2040 |
|
Width |
1335 |
|
Height |
375 |
Программный код приложения будет иметь вид:
Private Sub Command1_Click() Dim x As Single, y As Single x = CSng(Text1.Text)
If x >= 7 Then y = Sqr(x) Else y = Sqr(Abs(x - 7))
Text2.Text = CStr(y)
Private Sub Command2_Click()
Рассмотренная выше задача может быть решена еще одним способом:
Private Sub Command1_Click() Dim x As Single, y As Single x = CSng(Text1.Text)
If x >= 7 Then y = Sqr(x)
If x<7 Then y = Sqr(Abs(x - 7)) Text2.Text = CStr(y)
В данном случае использованы два оператора условного перехода, следующие друг за другом. Такое использование линейного синтаксиса оператора возможно при решении следующей задачи. Пусть требуется вычислить значение параметра y в зависимости от
условий: |
||
a+b, a+b y= , 2 a−b, |
если если если |
a<b a=b a>b |
Изображение формы приведено на рисунке 8.
Рис. 8. Рисунок формы.
Блок-схема для решения данной задачи изображена ниже:
При составлении блок-схемы этой задачи, можно заметить, что три условия являются взаимоисключающими друг друга, поэтому в блок-схеме используется два условных блока: если a не меньше чем b и если a не равно b, то, следовательно, a больше чем b. Таким образом, если мы имеем дело с взаимоисключающими условиями, то условных блоков будет на единицу меньше чем условий.
Программный код задачи приведен ниже:
Private Sub Command1_Click()
Dim a As Integer, b As Integer, y As Single a = CInt(InputBox("a=")) b = CInt(InputBox("b="))
If a < b Then y = a + b
If a = b Then y = (a + b) / 2
If a > b Then y = a - b
MsgBox "y=" + CStr(y)
Private Sub Command2_Click()
Рассмотрим одну из распространенных ошибок наиболее часто встречающуюся при решении таких задач. Следующий программный код будет неверен!
Private Sub Command1_Click()
Dim a As Integer, b As Integer, y As Single a = CInt(InputBox("a=")) b = CInt(InputBox("b="))
If a < b Then y = a + b
If a = b Then y = (a + b) / 2 Else y = a - b
MsgBox "y=" + CStr(y)
Здесь ошибка заключается в том, что при соблюдении условия a<b, выполнится оператор присваивания y=a+b и управление будет передано на следующий оператор IF. При выполнении второго оператора условного перехода условие a=b не соблюдается (так как a<b) и выполняется ветвь ELSE. В результате значение параметра y станет равным y=a-b, а значение
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.