Copyright © 2009 Janusz Bonarowski 1
Ć wiczenie VB7.0_dwie_proste – instrukcja Do...Loop
Zadanie
Metodą iteracyjną znaleźć współrzędne punktu przecięcia dwu prostych.
Zadanie można zobrazować za pomocą arkusza kalkulacyjnego znajdującego się w katalogu zadania, a którego postać przedstawia rys. 1.
Rys. 1. Zadanie rozwiązane w arkuszu kalkulacyjnym
Bez stosowania metody iteracyjnej, wprost ze wzorów w ramce, przy równaniach prostych możemy uzyskać współrzędne punktu przecięcia x=3,5, y=5,5.
Zastosujmy jednak metodę iteracyjną w celu poznania sposobu wykorzystywania instrukcji cyklu Do...Loop. Instrukcja ta stosowana jest w sytuacjach, w których nie wiemy ile razy pętla ma być wykonana. W naszym przypadku, jeśli rozpoczniemy od punktu Xstart bardzo odległego od współrzędnej punktu przecięcia i gdy założymy przyrost dx bardzo mały – pętla będzie wykonywana wiele razy. Natomiast jeśli punkt startowy Xstart będzie bliski
szukanego x i dx stosunkowo duży – pętla wykona się może tylko kilkakrotnie.
Copyright © 2009 Janusz Bonarowski 2
Algorytm programu
Wczytanie:
a1, a2, b1, b2, Xstart, dx
Xbie = Xstart rozn = 100
czy rozn > 0
y1 = a1*Xbie + b1 y2 = a2*Xbie + b2
rozn = y2 – y1 Xbie=Xbie + dx
x = Xbie - dx y = a2*x + b2
Koniec TAK
NIE
Copyright © 2009 Janusz Bonarowski 3
Kod aplikacji
Private Sub btnOblicz_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnOblicz.Click
Dim a1, b1, y1, a2, b2, y2, Xstart, dx, Xbie As Double Dim rozn As Double = 100
a1 = CDbl(txta1.Text) b1 = CDbl(txtb1.Text) a2 = CDbl(txta2.Text) b2 = CDbl(txtb2.Text)
Xstart = CDbl(txtXstart.Text) dx = CDbl(txtdx.Text)
ListBox1.Items.Clear() ListBox2.Items.Clear()
Xbie = Xstart Do While rozn > 0
Call WartoscY(a1, b1, Xbie, y1) Call WartoscY(a2, b2, Xbie, y2) rozn = y2 - y1
Xbie = Xbie + dx
ListBox1.Items.Add(Xbie.ToString) ListBox2.Items.Add(rozn.ToString) Loop
lblWynik.Text = "X=" & (Xbie - dx).ToString & vbCrLf & _ "Y=" & (a2 * (Xbie - dx) + b2).ToString End Sub
Private Sub WartoscY(ByVal a As Double, ByVal b As Double, _ ByVal x As Double, ByRef y As Double) y = a * x + b
End Sub