Witam,
Mam taki kod i zastanawiam się, dlaczego zapętla się na amen:
Function funkcja(x As Double) As Double
funkcja = (x * x) - 5
End Function
Private Sub CommandButton1_Click()
Dim a, b, dok, fa, fb, f0, x0, wb As Double
a = TextBox1.Text
b = TextBox2.Text
dok = TextBox3.Text
If Not IsNumeric(a) Or Not IsNumeric(b) Or Not IsNumeric(dok) Then
MsgBox ("Podaj poprawne dane!")
Else
fa = funkcja(Val(a))
fb = funkcja(Val(b))
If (fa * fb) > 0 Then
MsgBox ("Funkcja nie spełnia warunków!")
Else
Do While Abs(Val(a) - Val(b)) > Val(dok)
x0 = ((Val(a) + Val(b)) / 2)
f0 = funkcja(Val(x0))
If Abs(Val(f0)) < Val(dok) Then
MsgBox ("Poprawny koniec obliczeń!")
TextBox4.Text = x0
Exit Do
End If
If (fa * f0) < 0 Then
b = x0
Else
a = x0
fa = f0
End If
Loop
End If
End If
End Sub
Teoretycznie powinno wszystko grać, ale po podaniu danych i naciśnięciu przycisku Oblicz, program się wiesza.
EDIT: OK, znalazłem jedną (i pewnie nie ostatnią) z nieprawidłowości. Mianowicie po dojściu do sytuacji, gdzie do funkcji ma zostać przekazany argument o wartości 2,5 (wyliczony w drugim kroku pętli Do While, gdzie dane wejściowe to a = 0 i b = 10), tenże argument nie zostaje przekazany. Zostaje przekazany argument 2. Przy okazji poprawiłem kod, ale nadal nie zmienia to faktu, że nie działa to dobrze.
Reasumując:
x0 = ((Val(a) + Val(b)) / 2) ' tutaj przy drugim kroku wchodzą wartości 0 i 5, co daje po obliczeniach wartość zmiennej x0 = 2,5
f0 = funkcja(Val(x0)) ' tutaj powinien do funkcji zostać przekazany argument 2,5, a przekazuje się argument 2