Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как заменить чтоб goto небыло / 5 сообщений из 5, страница 1 из 1
19.12.2014, 13:56
    #38838101
Dimmf28
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить чтоб goto небыло
У меня есть такой метод в нем использовал goto как обойти его

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
Dim x0(2) As Double
Dim y(2) As Double
'Const alfa = 1.618
'Const beta = 0.618
Const alfa = 1
Const beta = 0.5
Const N = 100
Const R = 0.5
Dim t0   As Double
Const M = 3
Dim k As Integer
Dim j As Integer
Dim eta(2) As Double
Dim fnew, fold As Double
Dim znew(2) As Double

Private Sub Command1_Click()
Cls
fnew = 0
fold = 0
Debug.Print ("")
t0 = 0.7
k = 0
j = 1
x0(1) = 0.5
x0(2) = 1
Do

7:

Do
 If (j > M) Then
    If (t0 > R) Then
        t0 = t0 * beta
    Else
        Print ("Result=" & x0(1) & "  " & x0(2) & " k=" & k & "t0=" & t0)
        Exit Sub
        
    End If
    j = 1
    
    GoTo 7
    
 End If
Call geteta(eta())

'Debug.Print (eta(1) & " " & eta(2))
Call gety(y())
'Debug.Print (y(1) & " " & y(2))
fnew = resfunnew(y())
fold = resfunnew(x0())
'Debug.Print (fnew & " " & fold)
'Print (fnew & " " & fold)
j = j + 1
Loop While (fnew > fold)

'Oaa?iia iai?aaeaiea

znew(1) = x0(1) + alfa * (y(1) - x0(1))
znew(2) = x0(2) + alfa * (y(2) - x0(2))

fnew = resfunnew(znew())
'Print (fnew)

If (fnew < fold) Then


k = k + 1
'Ia?aiacia?ei noa?o oi?ee o e oaaa t
Debug.Print ("z1=" & znew(1) & "  z2=" & znew(2) & " x1=" & x0(1) & "  x2=" & x0(2))
x0(1) = znew(1)
x0(2) = znew(2)

t0 = alfa * t0
j = 1
    
End If
Loop While (k < N)
End Sub
Function geteta(ByRef eta() As Double)
Randomize Timer
    eta(1) = 2 * Rnd() - 1
    eta(2) = 2 * Rnd() - 1
    geteta = eta
End Function

Function gety(ByRef y() As Double)
Dim znamen As Double
Dim ytype(2) As Double
znamen = t0 / (((eta(1) ^ 2 + eta(2) ^ 2)) ^ (1 / 2))
y(1) = x0(1) + znamen * eta(1)
y(2) = x0(2) + znamen * eta(2)
gety = y
End Function

Function resfunnew(ByRef eta() As Double)
'resfunnew = 4 * (eta(1) - 5) ^ 2 + (eta(2) - 6) ^ 2
resfunnew = 2 * eta(1) ^ 2 + eta(1) * eta(2) + eta(2) ^ 2
End Function
...
Рейтинг: 0 / 0
19.12.2014, 14:19
    #38838122
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить чтоб goto небыло
авторчтоб goto небыло достаточно удалить эту ненужную строку.

PS. А разбираться, что эта "лапша" делает - вот уж вряд ли.
...
Рейтинг: 0 / 0
19.12.2014, 14:48
    #38838165
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить чтоб goto небыло
Видимо достаточно GoTo заменить на Exit Do и видимо с созданием флага и присвоением ему значения, чтобы не выполнять If (fnew < fold) Then
...
Рейтинг: 0 / 0
19.12.2014, 16:08
    #38838286
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить чтоб goto небыло
The_Pristдостаточно GoTo заменить на Exit DoЕсли бы GoTo отправлял выполнение в точку после Do - да. Но он-то отправляет в точку ПЕРЕД Do, то есть на новую итерацию... а Continue в VB не имеется.
...
Рейтинг: 0 / 0
19.12.2014, 16:25
    #38838311
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить чтоб goto небыло
AkinaЕсли бы GoTo отправлял выполнение в точку после Do - даПоэтому я и написал про необходимость создания флага. Потому что если поставить флаг перед
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
If (fnew < fold) Then
типа того:
If flag = false then'если флагу не присвоено true - то не выполняем блок после первого Do
If (fnew < fold) Then
...
end if
end if
'как раз та точка, которая и создает петлю перед 7:
Loop While (k < N)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как заменить чтоб goto небыло / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]