Лекции.Орг


Поиск:




Примеры решения задач с разветвляющимся вычислительным процессом

Задача 1. Определить попадание точки с координатами (x, y) в область S (рис. 1).

Сформулируем логическое условие попадания точки с координатами (x, y) в область S.

Уравнение окружности, которая ограничивает область S в первом и втором квадранте системы координат XOY имеет вид:

Рис. 1. Область S

Введём логическую переменную 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.


 

       
 
 
   
Рис. 12. Блок-схема алгоритма решения задачи 7  


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



<== предыдущая лекция | следующая лекция ==>
Глава 3. Реальности загробной жизни Эль Бренан. | Отдел Plasmodiophoromycota.
Поделиться с друзьями:


Дата добавления: 2016-12-05; Мы поможем в написании ваших работ!; просмотров: 1194 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Настоящая ответственность бывает только личной. © Фазиль Искандер
==> читать все изречения...

810 - | 693 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.