Примеры решения задач с разветвляющимся вычислительным процессом
Задача 1. Определить попадание точки с координатами (x, y) в область S (рис. 1).
Сформулируем логическое условие попадания точки с координатами (x, y) в область S.
Уравнение окружности, которая ограничивает область S в первом и втором квадранте системы координат XOY имеет вид:
|
Введём логическую переменную FLAG типа Boolean.
Тогда величину FLAG, которая принимает значение true, в том случае, когда точка с координатами (x, y) принадлежит области S, можно найти по формуле:
FLAG = (X>=-A) AND (X<=A) AND ((Y<=(A*A–X*X)^(1/2) AND (Y>=0))
OR ((Y<0) AND (Y>=B)))
Либо, учитывая приоритеты выполнения операций, можно записать
FLAG = X>=-A AND X<=A AND (Y<=(A*A–X*X)^(1/2) AND Y>=0 OR
Y<0 AND Y>=B)
Код программы представлен процедурой pr1.
Sub pr1()
Dim A As Double, B As Double
Dim X As Double, Y As Double
Dim Flag As Boolean
A = InputBox(“введите A “)
B = InputBox(“введите B “)
X = InputBox(“введите X “)
Y = InputBox(“введите Y “)
Flag = X>=-A AND X<=A AND _
(Y>=0 AND Y<=(A*A–X*X)^(1/2) OR Y<0 AND Y>=B)
If Flag Then
MsgBox(“Точка попадает в область”)
Else
MsgBox(“Точка вне области”)
EndIf
EndSub
Задача 2. Для заданного с клавиатуры значения X вычислить Y по формуле:
Эту задачу можно решить двумя способами. Первый способ предусматривает использование трех операторов IF сокращенной формы. Алгоритм решения достаточно прост (см. блок-схему на рис. 2а). Последовательно проверяется три взаимно исключающих друг друга условия, образующих полную группу событий. Для любого X только одно условие примет значение true, остальные два условия равны false. Таким образом, оператор присвоения выполнится только один раз, и этот оператор будет соответствовать условию, имеющему значение true.
Программная реализация представлена процедурой pr2_1.
Второй способ предусматривает использование одного оператора If полной формы. Алгоритм этого способа реализован в виде блок-схемы, представленной на рис. 2б. Программная реализация представлена процедурой pr2_2.
Рис. 2а. Блок-схема алгоритма решения задачи 2 (вариант pr2_1)
Рис. 2б. Блок-схема алгоритма решения задачи 2 (вариант pr2_2)
Sub pr2_1() Dim X As Double, Y As Double X=InputBox(“введите X “) If X<=0 Then Y=1/4*(Abs(X)+1)^(1/4) End If If X>0 And X<1 Then Y=1/3*X^(1/3) End If If X>=1 Then Y=1/2*X^(1/2) End If MsgBox(“Y=“ & Y) End Sub | Sub pr2_2() Dim X As Double, Y As Double X = InputBox(“введитеX “) If X<=0 Then Y=1/4*(Abs(X)+1)^(1/4) ElseIf X>0 And X<1 Then Y=1/3*X^(1/3) Else Y=1/2*X^(1/2) End If MsgBox(“Y=“ & Y) End Sub |
Задача 3. Составить программу, которая по введенному значению X вычисляет и выводит значение Y = F(X), где F(X) задана графически на рис. 3.
Эта задача отличается от задачи, описанной в предыдущем примере, только тем, что нужно самостоятельно составить формулу для функции F(X). В предыдущей задаче эта формула была задана в качестве исходных данных. Таким образом, от вас требуется сделать формальную, математическую постановку задачи, которая в данном случае сводится к составлению по графику системы уравнений, аналогичной заданной в условии задачи 2.
Глядя на график (см. рис. 3) нетрудно увидеть, что на нем изображена кусочно-линейная функция, содержащая три прямых линии. Первая прямая имеет уравнение Y = –X–1 и определена для X ≤ 0. Вторая линия определена на отрезке 0 ≤ X ≤ 1 и имеет уравнение Y = X – 1. Третья прямая линия имеет уравнение Y = 0 и определена для X ≥ 1. С учетом выше сказанного, искомая формула будет иметь вид:
Блок-схема алгоритма решения задачи представлена на рис. 4.
Код программы – процедура pr3.
Sub pr3()
Dim X As Double, Y As Double
X = InputBox(“введите X “)
If X >= 1 Then
Y = 0
ElseIf X <= 0 Then
Y = -X - 1
Else
Y = X – 1
End If
MsgBox(“Y=“ & Y)
End Sub
Рис. 4. Блок-схема алгоритма решения задачи 3
Задача 4. Составить программу, которая по введенному значению X вычисляет и выводит значение Y = F(X), где F(X) задана графически на рис. 5.
Задача аналогична предыдущей, отличается от неё лишь тем, что при X<-2 значение функции Y не определено. По этой причине нельзя использовать общий блок вывода результата, а вывод результата необходимо вставить в каждую ветку программы.
В результате формализации задачи получим следующую систему уравнений:
Блок-схема алгоритма решения задачи представлена на рис. 6, а код программы представлен процедурой pr4_1.
Рис. 6. Блок-схема алгоритма решения задачи 4 (вариант pr4_1)
Sub pr4_1()
Dim X As Double, Y As Double
X = InputBox(“Введите X “)
If X >= 1 Then
Y = 0
MsgBox(“Y=“ & Y)
ElseIf X > 0 And X < 1 Then
Y = X – 1
MsgBox(“Y=“ & Y)
ElseIf X >= -2 And X <= 0 Then
Y = -X – 1
MsgBox(“Y=“ & Y)
Else
MsgBox(“Нет решения“)
End If
End Sub
Другой вариант решения той же задачи заключается в том, что используем дополнительную переменную логического типа mist, которая первоначально содержит значение false, а при вводе Х < -2 меняет своё значение на true. Анализируя значение mist, выводим либо значение переменной Y, либо сообщение о том, что задача не имеет решения. Блок-схема алгоритма этого варианта решения представлена на рис. 7. Код программы – процедура pr4_2.
Рис. 7. Блок-схема алгоритма решения задачи 4 (вариант pr4_2)
Sub pr4_2()
Dim XAs Double, Y As Double, mist As Boolean
mist = false
X = InputBox(“введитеX “)
If X >= 1 Then
Y = 0
ElseIf X > 0 And X < 1 Then
Y = X – 1
ElseIf X >= -2 And X <= 0 Then
Y = –X – 1
Else
mist = true
End If
If mist Then
MsgBox(“Нет решения “)
Else
MsgBox(“Y= “ &Y)
End If
End Sub
Задача 5. Для заданного целого положительного K и значения вещественного числа X вычислить Y = F(X) по формуле:
Блок-схема алгоритма решения задачи с применением оператора If представлена на рис. 8, а код программы – в процедуре pr5_If.
Sub pr5_If()
Dim X As Double, Y As Double, K As Integer, mist As Boolean
X = InputBox(“X=“)
K = InputBox(“K=“)
mist=false
If K=2 Or K=3 Then
Y = X^K + X + 1
ElseIf K>=4 And K<=10 Then
If X<>-1 Then
Y=1/Abs(X+1)
Else
mist=true
End If
Else
Y=Abs(X+K)^(1/2)+ Abs(X-K)^(1/2)
End If
If Not mist Then
MsgBox(“Y=“ &Y)
Else
MsgBox(“Нет решения“)
End If
End Sub
Рис. 8. Блок-схема алгоритма решения задачи 5 (вариант pr5_If)
Решим эту же задачу с использованием оператора варианта Select Case. Блок-схема алгоритма решения задачи с применением оператора Select Case отличается от блок-схемы решения с помощью оператора If. Алгоритм решения этой задачи описан с помощью блок-схемы, представленной на рис. 9, код программы представлен в процедуре pr5_Case.
Рис. 9. Блок-схема алгоритма решения задачи 5 (вариант pr5_Case)
Sub pr5_Case()
Dim X As Double, Y As Double, K As Integer, mist As Boolean
X = InputBox(“X=“)
K = InputBox(“K=“)
mist = false
Select Case K
Case 2, 3
Y = X^K + X + 1
Case 4 To 10
If X<>-1 Then
Y = 1 / Abs(X+1)
Else
mist = true
End If
Case Else
Y = Abs(X+K)^(1/2) + Abs(X-K)^(1/2)
End Select
If Not mist Then
MsgBox(“Y=“ & Y)
Else
MsgBox(“Нет решения“)
End If
End Sub
Задача 6.В прямоугольный люк трюма судна с габаритными размерами X × Y следует погрузить прямоугольный контейнер с размерами сторон L, W, H. Требуется проанализировать ситуацию и вывести на экран сообщения о том пройдёт ли контейнер в люк, а если пройдёт, то какими сторонами его опускать. Величины X, Y, L, W, H ввести с клавиатуры. В расчётах учесть технологический зазор Обратите внимание, что исходные данные должны быть введены в одних единицах измерения.
Блок-схема алгоритма решения задачи представлена на рис. 12, а код программы представлен процедурой pr6.
|
Sub pr6()
Dim X As Double, Y As Double
Dim L As Double, W As Double, H As Double
Dim d As Double
Dim Prompt As String
Dim cargo As Boolean ‘первоначальная установка – не пройдёт
X = InputBox(“Введите X”)
Y = InputBox(“Введите Y”)
L = InputBox(“Введите длину контейнера L”)
W = InputBox(“Введите ширину контейнера W”)
H = InputBox(“Введите высоту контейнера H”)
d = InputBox(“Введите технологический зазор d”
L = L + d
W = W + d
H = H + d
‘ Пройдёт ли сторонами L × W?
If X >= L And Y >= W Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами L по X, W по Y”
cargo = true
End If
If X >= W And Y >= L Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами W по X, L по Y”
cargo = true
End If
‘ Пройдёт ли сторонами L × H?
If X >= L And Y >= H Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами L по X, H по Y”
cargo = true
End If
If X >= H And Y >= L Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами H по X, L по Y”
cargo = true
End If
‘ Пройдёт ли сторонами H × W?
If X >= H And Y >= W Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами H по X, W по Y”
cargo = true
End If
If X >= W And Y >= H Then
Prompt = Prompt & vbNewLine & _
“Пройдёт сторонами W по X, H по Y”
cargo = true
End If
If cargo Then
MsgBox(Prompt)
Else
MsgBox(“Контейнер не пройдёт в люк!”)
End If
End Sub