- •Предисловие
- •Лабораторная работа №1 программирование арифметических выражений
- •Лабораторная работа №2 программирование линейных алгоритмов
- •Ввод и вывод данных при помощи текстового окна (-TextBox)
- •Ввод и вывод данных с помощью системных функций InputBox() и MsgBox()
- •Лабораторная работа №3 программирование разветвляющихся процессов
- •Лабораторная работа № 4 программирование циклов с параметрами
- •Лабораторная работа № 5 программирование циклов с предусловием
- •Лабораторная работа № 6 программирование циклов с постусловием
- •Лабораторная работа №7 программирование вложенных циклов
- •Программирование одномерных массивов
- •Лабораторная работа № 9 программирование многомерных массивов
- •Оглавление
Лабораторная работа №3 программирование разветвляющихся процессов
Цель работы – выработать навыки составления алгоритмов и программ, где на определенном этапе производится выбор очередного выполняемого оператора в результате анализа некоторых условий.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ:
Оператор условного перехода может иметь как линейный, так и блочный синтаксис.
Линейный синтаксисоператораIF…THENимеет следующий формат:
IF<условие>THEN<оператор1>
<оператор2>
<оператор3>
Если <условие>,расположенное после ключевого словаIFсоблюдается, то выполняется<оператор1>,затем последовательно выполняются операторы:<оператор2> и<оператор3>. В случае несоблюдения условия <оператор1> пропускается, а выполняются операторы:<оператор2>и<оператор3>.
Блок–схема данного формата имеет вид:
Используя данный формат оператора условного перехода необходимо помнить о часто встречающихся ошибках. Например, при вычислении значения выражения параметра в зависимости от условий:
, наиболее распространенной является следующая ошибка:
IF a>b THEN y=a-b
y=a+b
Проанализируем работу данного фрагмента при следующих заданных значениях параметров . При данных значениях параметрови, условие расположенное после ключевого словаIFне соблюдается, а следовательно, результатом выполнения программного кода будет значение. Начинающий программист, проверив на тестовом примере программу, убеждается в правильности ее работы. Но, в программе имеется логическая ошибка! При значениях параметров, условие расположенное после ключевого словаIFсоблюдается, и начинают выполняться два оператора присваивания: сначала, а затем - оператор. Таким образом, окончательным значением арифметического выражения будет 8, что приведет, при истинности условия, к неверному результату, хотя при несоблюдении условия программа работает корректно. Для того, чтобы избежать подобные недоразумения, в первых версиях языка программированияBasicиспользовался оператор безусловного переходаGOTO. Этот оператор передает управление на строчку программного кода приложения, перед которой ставится метка. Формат оператора безусловного перехода имеет следующий вид:
<операторы>
…
GOTO<метка>
<операторы>
<метка>:
<операторы>
Фрагмент программы, рассмотренного выше примера, будет корректно работать, если в нее внести следующие изменения:
IF a>b THEN y=a-b : GOTO m1
y=a+b
m1:
Однако следует заметить, что в настоящее время использование оператора GOTOв программном коде является плохим стилем программирования, а в учебном процессе может привести к снижению оценки при решении задачи, так какVisualBasicв своем арсенале содержит достаточное количество управляющих конструкций, позволяющих избежать использование оператора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
Рассмотрим следующий пример. Пусть требуется вычислить значение выражения в зависимости от условий.
Составим блок-схему алгоритма решения данной задачи.
Напишем программный код данного приложения. Форма приложения будет иметь следующий вид (см рис. 7).
Рис. 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 | |
Командная кнопка (CommandBatton) |
Name |
Command1 |
Caption |
РЕШЕНИЕ | |
Left |
480 | |
Top |
2040 | |
Width |
1335 | |
Height |
375 | |
Командная кнопка (CommandBatton) |
Name |
Command2 |
Caption |
ВЫХОД | |
Left |
2160 | |
Top |
2040 | |
Width |
1335 | |
Height |
375 |
Программный код приложения будет иметь вид:
Private SubCommand1_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)
End Sub
Private Sub Command2_Click()
End
End Sub
Рассмотренная выше задача может быть решена еще одним способом:
Private SubCommand1_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)
End Sub
В данном случае использованы два оператора условного перехода, следующие друг за другом. Такое использование линейного синтаксиса оператора возможно при решении следующей задачи. Пусть требуется вычислить значение параметра в зависимости от условий:
Изображение формы приведено на рисунке 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)
End Sub
Private Sub Command2_Click()
End
End Sub
Рассмотрим одну из распространенных ошибок наиболее часто встречающуюся при решении таких задач. Следующий программный код будет неверен!
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)
End Sub
Здесь ошибка заключается в том, что при соблюдении условия a<b, выполнится оператор присваиванияy=a+bи управление будет передано на следующий операторIF. При выполнении второго оператора условного перехода условиеa=bне соблюдается (так какa<b) и выполняется ветвьELSE. В результате значение параметраyстанет равнымy=a-b, а значениеy=a+bбудет утрачено. Для решения такого типа задач рекомендуется использовать блочный синтаксис оператора условного перехода.
Блочный синтаксисоператора условного перехода может иметь следующие виды форматов:
1)
IF<условие>THEN
<блок операторов>
END IF
Если <условие>, расположенное после ключевого слова IFсоблюдается, то выполняется<блок операторов>, расположенный между ключевыми словамиTHENиEND IF, затем управление передается на следующий оператор, расположенный за ключевым словомEND IF. В случае, когда условие не соблюдается, <блок операторов>пропускается и управление передается на следующий оператор, который расположен после ключевого словаEND IF.Признаком блочного синтаксиса является переход на следующую строчку после ключевого словаTHENи наличие ключевого словаEND IF. Под обозначением<блок операторов>подразумевается любое количество различных операторовVisualBasic.
Программный код, использующий блочный синтаксис оператора условного перехода для рассмотренного выше примера, может быть написан следующим образом:
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
End If
If a = b Then
y = (a + b) / 2
End If
If a > b Then
y = a - b
End If
MsgBox "y=" + CStr(y)
End Sub
Private Sub Command2_Click()
End
End Sub
Для начинающих программистов, во избежание логических ошибок рекомендуется использовать данный формат оператора, так как он является более наглядным.
2) Второй вариант формата блочного синтаксиса оператора условного перехода представлен ниже:
IF<условие>THEN
<блок операторов №1>
ELSE
<блок операторов №2>
END IF
Данный формат оператора работает следующим образом. Если <условие>, расположенное после ключевого словаIFсоблюдается, то выполняется<блок операторов №1>,расположенный межу ключевыми словамиTHENиELSE. Затем, управление передается на оператор, следующий после ключевого словаEND IF. При несоблюдении условия,<блок операторов №1>пропускается, выполняется<блок операторов №2>,находящийся между ключевыми словамиELSEиEND IFи управление передается на следующий оператор, расположенный после ключевого словаEND IF.
Приведем пример написания программы с данным типом формата. Программный код вычисления функции будет иметь следующий вид:
Private SubCommand1_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))
END IF
Text2.Text = CStr(y)
End Sub
3) Третий вариант формата блочного синтаксиса оператора условного перехода может быть представлен следующим образом:
IF<условие №1>THEN
<блок операторов №1>
[ ELSEIF<условие №2>THEN
<блок операторов №2> ]
[ ELSEIF<условие №3>THEN
<блок операторов №3> ]
[ ELSEIF<условие №4>THEN
<блок операторов №4> ]
[ ELSE
<блок операторов №5> ]
END IF
Если <условие №1>,расположенное после ключевого словаIFсоблюдается, то выполняется<блок операторов №1>,находящийся между ключевым словомTHENи строкой программного кодаELSEIF<условие №2>THEN, затем, управление передается на следующий оператор, который располагается за ключевым словомEND IF. При несоблюдении<условия №1>,осуществляется проверка<условия №2>. При соблюдении данного условия выполняется блок<операторов №2> и управление передается на оператор, расположенный после ключевого словаEND IF, которое обозначает конец блочного оператора условного перехода. Таким образом, последовательно осуществляется проверка условий и, в зависимости от их истинности выполняется тот или иной блок операторов. В случае, когда ни одно из условий не соблюдается, выполняется блок<операторов №5>, расположенный между ключевыми словамиELSEиEND IFи управление передается на следующий оператор, который располагается после ключевого словаENDIF. Рассмотрим пример программного кода вычисления функции
для данного формата оператора:
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
ElseIf a = b Then
y = (a + b) / 2
Else
y = a - b
End If
MsgBox "y=" + CStr(y)
End Sub
ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ:
Составить блок-схему алгоритма и написать программу, вычисляющую значение выражения, в зависимости от условий.
Private
Sub Command1_Click()
Dim x As
Single, y As
Single
x = CInt(Text1.Text)
If x<3 Then y =
x^2+3*x^3
ElseIf x=3 Then y =
(2*x^3+x)/(2*x^3-Exp(x)) Else y =
Log(Abs(x-1)) End
If
Text2.Text=CStr(y)
End Sub
Private Sub
Command2_Click() End End
Sub
ЗАДАНИЕ:
Составить блок-схему алгоритма и написать программу, вычисляющую значение выражения, в зависимости от условий.
Private
Sub Command1_Click() Const
p=3.1415926
Dim x As
______, y As
_________
__ = CInt(Text1.Text)
If ______ Then y =
___________
ElseIf _______
Then y =
___________ Else y =
___________/_______ End
If
Text2.______=CStr(___)
End Sub
Private Sub
Command2_Click() _______ End
Sub