powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как заменить чтоб goto небыло
5 сообщений из 5, страница 1 из 1
Как заменить чтоб goto небыло
    #38838101
Dimmf28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть такой метод в нем использовал 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
Как заменить чтоб goto небыло
    #38838122
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчтоб goto небыло достаточно удалить эту ненужную строку.

PS. А разбираться, что эта "лапша" делает - вот уж вряд ли.
...
Рейтинг: 0 / 0
Как заменить чтоб goto небыло
    #38838165
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо достаточно GoTo заменить на Exit Do и видимо с созданием флага и присвоением ему значения, чтобы не выполнять If (fnew < fold) Then
...
Рейтинг: 0 / 0
Как заменить чтоб goto небыло
    #38838286
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Pristдостаточно GoTo заменить на Exit DoЕсли бы GoTo отправлял выполнение в точку после Do - да. Но он-то отправляет в точку ПЕРЕД Do, то есть на новую итерацию... а Continue в VB не имеется.
...
Рейтинг: 0 / 0
Как заменить чтоб goto небыло
    #38838311
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как заменить чтоб goto небыло
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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