Не выходит построить алгоритм с определением направления

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Не выходит построить алгоритм с определением направления

Сообщение kibernetics » 31.01.2017 (Вт) 18:49

Всем привет!
В общем, суть в чём,
1) есть прямая с числами: от 1 до 15.
1__2__3__4__5__6__7__8__9__10__11__12__13__14__15
2) рандомно получаются два числа, к примеру 2 и 5.
3) надо нарисовать линию от 2 до 5, т.к. отрезок от 5 до 2 гораздо длиннее.

второй пример:
2) получили рандомно два числа, 14 и 3
3) если мы проведём отрезок от 3 до 14 то это займёт 12 чисел, а надо искать минимальное количество чисел на отрезке. значит надо идти в обратную сторону, от 14 до 3. И тогда, вначале рисуем прямую от 14 до 15, а затем, от 1 до 3.

Бывает так что уже голова кипит от алгоритма, не получается написать логику для нахождения направления.
Нужно найти в какую сторону надо отрисовывать минимальный отрезок.  
И просто рисовать по форме, через PSet.
Получится, нечто вроде:
____ _____
______
____
____________
_______ ___
Вот мой код, правда тестировал на VBA по экселю:
Код: Выделить всё
Private Sub sectorp()
    Dim number  As Integer
    Dim i       As Integer
    Dim y       As Integer
    Dim j       As Integer
    Dim k       As Integer
    Dim l       As Integer
    Dim previ   As Integer
   
   
    previ = -1
    y = 26
    
    For i = 0 To 10
        number = Int(15 * Rnd()+1)
        If previ = -1 Then
            previ = number
        Else
            If previ >= number Then
                l = previ
            Else
                l = number
            End If
           
            If number - previ <= 7 And number - previ > -1 Then
                For j = previ To l
                    Cells(y, j) = ChrW(9679)
                Next
            ElseIf number - previ < 0 And number - previ > -7 Then
                For j = number To l
                    Cells(y, j) = ChrW(9679)
                Next
            Else
                For j = previ To 15
                    Cells(y, j) = ChrW(9679)
                Next
               
                For j = 1 To number
                    Cells(y, j) = ChrW(9679)
                Next
            End If
            previ = number
        End If
        y = y + 1
    Next
   
End Sub


Глючит, не работает. Одни диапазоны правильно определяет, другие - нет. Запутался уже совсем.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Не выходит построить алгоритм с определением направления

Сообщение Хакер » 31.01.2017 (Вт) 19:22

kibernetics писал(а):3) надо нарисовать линию от 2 до 5, т.к. отрезок от 5 до 2 гораздо длиннее.

Какая-то ересь.

Длина отрезка — вещь по определению инвариантная относительно того, что считать за начало, а что за конец. Как может быть отрезок от Москвы до Киева быть гораздо длиннее, чем от Киева до Москвы, если это действительно отрезок, то есть участок прямой, являющийся по определению кратчайшим путём.

Или это вовсе не отрезок? И что значит «нарисовать», если речь идёт о какой-то абстрактной числовой прямой?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Не выходит построить алгоритм с определением направления

Сообщение Mikle » 31.01.2017 (Вт) 19:34

Хакер писал(а):Длина отрезка — вещь по определению инвариантная относительно того, что считать за начало, а что за конец.

Я так понял, у него за 15 снова идёт 1, двигаться можно только вперёд.
kibernetics писал(а):надо искать минимальное количество чисел на отрезке

Это делается одной строкой:
Код: Выделить всё
If ((x1 - x2 + 15) mod 15) < 7.5 Then 'числа x1 и x2 нужно поменять местами

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Не выходит построить алгоритм с определением направления

Сообщение kibernetics » 03.02.2017 (Пт) 15:58

Mikle писал(а):Это делается одной строкой:
Код: Выделить всё
If ((x1 - x2 + 15) mod 15) < 7.5 Then 'числа x1 и x2 нужно поменять местами


не знаю. что-то не срабатывает у меня этот код.
Код: Выделить всё
Private Sub test()
    Dim i As Integer
    Dim number As Integer
    Dim previ As Integer
   
    Randomize
    previ = -1
    
    For i = 0 To 10
       
        number = Int(15 * Rnd() + 1)   'случайный шарик
        If previ > -1 Then
            If ((previ - number + 15) Mod 15) < 7.5 Then 'числа x1 и x2 нужно поменять местами
                Debug.Print number & " -> " & previ
            Else
                Debug.Print number & " <- " & previ
            End If
        End If
        previ = number
    Next
End Sub

выпадает 13, затем 14, рисует не правильно: 14 <- 13
а надо, 13 -> 14.

Вот примеры (13-14-2-10),
previ, number
13 -> 14
14 -> 2, т.к. 14,15,1,2 короче чем 2-14
2 <- 10, т.к. 2,1,15,14,13,12,11,10 короче, чем 2-10

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Не выходит построить алгоритм с определением направления

Сообщение Mikle » 03.02.2017 (Пт) 18:59

Там наоборот, "числа x1 и x2 НЕ нужно менять местами".
Или замени "<" на ">".
Писал без среды VB6, не проверил.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Не выходит построить алгоритм с определением направления

Сообщение kibernetics » 03.02.2017 (Пт) 20:05

всё равно не то.... :(
рисует как попало.
вот пример "правильного" рисования.
сверху нумерация от 0 до 36
слева числа выпадений, ну и сама закраска.
range.JPG
range.JPG (38.31 Кб) Просмотров: 3591

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Не выходит построить алгоритм с определением направления

Сообщение Mikle » 03.02.2017 (Пт) 20:21

kibernetics писал(а):сверху нумерация от 0 до 36

У меня для от 1 до 15, как ты показал в начале.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Не выходит построить алгоритм с определением направления

Сообщение kibernetics » 03.02.2017 (Пт) 20:28

да без разницы, можно от 1 до 15, тоже самое...
это я просто для примера привёл.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Не выходит построить алгоритм с определением направления

Сообщение Teranas » 03.02.2017 (Пт) 21:08

//Забадал, сам подумать не могёшь
Код: Выделить всё
  If Abs(n1 - n2) > (max + 1) \ 2 Then
    klen = max + 2 - Abs(n2 - n1)
    ' Переход через max
  Else
    klen = Abs(n2 - n1) + 1
    ' Нет перехода через max
  End If
Последний раз редактировалось Teranas 04.02.2017 (Сб) 1:10, всего редактировалось 1 раз.
С уважением, Андрей.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Не выходит построить алгоритм с определением направления

Сообщение Mikle » 03.02.2017 (Пт) 22:51

kibernetics писал(а): можно от 1 до 15, тоже самое...

Приведи пример, который не сработает.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Не выходит построить алгоритм с определением направления

Сообщение Sam777e » 04.02.2017 (Сб) 12:14

Нумерация, согласно картинке, от 0 до n-1; то есть, у тебя n = 37.

Код: Выделить всё
Sub Paint1(a As Long, b As Long)
  Dim j As Long
 
  For j = a To b
    Cells(2, j + 1).Interior.ColorIndex = 39
  Next j
End Sub


Sub myPaint(ByVal a As Long, ByVal b As Long, n As Long)
  Dim j As Long

  Range(Cells(2, 1), Cells(2, n)).Interior.ColorIndex = xlNone
 
  If b < a Then
    j = a: a = b: b = j
  End If

  If (b - a + 1) <= (a + 1) + (n - b) Then
    Paint1 a, b
  Else
    Paint1 0, a
    Paint1 b, n - 1
  End If
End Sub


Прогони, проверь . . .
Здоровья и удачи

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Не выходит построить алгоритм с определением направления

Сообщение kibernetics » 04.02.2017 (Сб) 23:29

Sam777e писал(а):Прогони, проверь . . .

Оооо, даа, добрый человек!
Кажется заработало...
Спасибо, что вмешался в тему.
Ну вообще всем спасибо, кто принимал участие. Не лезло ничего в голову, уж простите. 


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Mail.ru [бот] и гости: 55

    TopList  
cron