Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Определить пиковые значения в массиве... Добавлено: 23.06.06 16:04  

Автор вопроса:  papa
Всем приветы.
Есть массив нужно определить максимальное значение из каждых 50 элементов массива....
Т.е.
FOR i = @l_psData.iFirstValid TO @l_psData.iLastValid
IF (Period < MaxPeriod) THEN
   IF (@l_psData.@pfValue > Trend ) THEN
       Period = Period + 1
       Trend = Максимальный элемент из элементов с i по i-Period
ELSE
 Period = Period + 1
       Trend = Минимальный элемент из элементов с i по i-Period
ELSE
Period = 0
NEXT

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 XPEHOMETP



Вопросов: 3
Ответов: 30
 Профиль | | #1 Добавлено: 23.06.06 19:30
Не понял. Так, как написано, это не массив, а структура. В справке по Power Basic (раздел User-Defined Types and Unions) есть вариант, когда массив является одним из полей структуры. Пусть будет структура, в ней массив на 50 элементов, надо найти наибольший, так? Если не так, то я не понял. Перебирать 50 неупорядоченных полей в структуре - это я не знаю как.

И так, пусть будет массив в структуре. Или просто массив, какая разница? Ищем максимум. Чего, казалось бы, проще? Пишем цикл по всем элементам, прочесываем на максимум.

massiv - имя массива, если абстрагироваться от структуры. Он на 50 элементов, стало быть, размерность заявлена как

DIM massiv(49) - на 50 элементов с номерами от 0 до 49. Надо выбрать максимальный элемент (пусть будет massmax). Как следует из кода, пригодится также минимальный элемент - massmin. Их можно поискать стандартными функциями MAX и MIN таким способом:

massmax = massiv(0)
massmin = massiv(0)

' - пока взяли первое значение за начальное приближение
FOR i = 0 to 6
massmax = MAX(massmax,massiv(i*7+1),massiv(i*7+2),massiv(i*7+3),massiv(i*7+4),massiv(i*7+5),massiv(i*7+6))
massmin = MIN(massmin,massiv(i*7+1),massiv(i*7+2),massiv(i*7+3),massiv(i*7+4),massiv(i*7+5),massiv(i*7+6),massiv(i*7+7))
NEXT


Так как MAX и MIN способны скушать любое количество аргументов, я в данном случае предлагаю скармливать им за каждый проход цикла по 7 новых элементов массива + 1, признанный максимальным (минимальным) ранее, всего 7 циклов по 7 элементов, и того 49, + еще самый первый (нулевой), уже использованный как приближение. Так мы накроем весь массив. Семь элементов - это не принципиально, может быть и 1 + максимальное (минимальное) значение, найденное ранее, тогда число циклов будет равно числу элементов в массиве минус 1.

Ответить

Номер ответа: 2
Автор ответа:
 XPEHOMETP



Вопросов: 3
Ответов: 30
 Профиль | | #2 Добавлено: 23.06.06 19:34
Не знаю, как это редактировать, там в предыдущем посте ошибочка получилась. Про massmin написано правильно, а в функцию MAX для massmax надо добавить еще один аргумент: massiv(i*7+7)

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 25.06.06 09:07
 Странный какой-то код. Зачем нужен цикл если его счётчик(i) не используется? "@l_psData.@pfValue" - это у тебя в цикле константа или вылезло за контекст?

Ответить

Номер ответа: 4
Автор ответа:
 papa



Вопросов: 1
Ответов: 1
 Профиль | | #4 Добавлено: 26.06.06 10:28
Спасибо за помощь всем....
Сделал вот так - привожу полный цикл... Работает
FOR i = @l_psData.iFirstValid TO @l_psData.iLastValid
            IF (@l_psData.@pfValue > Trend AND @l_psData.@pfValue[i-1] < Trend) THEN
                Cross = 1
                Maximum = @l_psData.@pfValue
            ELSEIF (@l_psData.@pfValue < Trend AND @l_psData.@pfValue[i-1] > Trend) THEN
                Cross = -1
                Minimum = @l_psData.@pfValue
            ELSE
                Cross=0
            END IF
            IF (Cross <>0) THEN
                Period = 0
            END IF
            IF (Period < MaxPeriod) THEN
                IF (@l_psData.@pfValue > Trend ) THEN
                    Period = Period + 1
                    ' Highest
                    Maximum = MAX(Maximum, @l_psData.@pfValue)
                    @a_psResultRec.@psResultArray.@pfValue = _
                                    CSNG(ForceFloatRange(@l_psData.@pfValue*(1-l_fKo/100)))
                END IF
                IF (@l_psData.@pfValue > Trend ) THEN
                    Period = Period + 1
                    ' Lowest
                    Minimum = MIN(Minimum, @l_psData.@pfValue)
                    @a_psResultRec.@psResultArray.@pfValue = _
                                    CSNG(ForceFloatRange(@l_psData.@pfValue*(1+l_fKo/100)))
                END IF
            ELSE
                @a_psResultRec.@psResultArray.@pfValue = 0
                'IF (@l_psData.@pfValue > Trend ) THEN
                    ' Highest
                ' Maximum = MAX(Maximum, @l_psData.@pfValue)
                ' @a_psResultRec.@psResultArray.@pfValue = _
                ' CSNG(ForceFloatRange(@l_psData.@pfValue*(1-l_fKo/100)))
                'END IF
                'IF (@l_psData.@pfValue > Trend ) THEN
                    ' Lowest
                ' Minimum = MIN(Minimum, @l_psData.@pfValue)
                ' @a_psResultRec.@psResultArray.@pfValue = _
                ' CSNG(ForceFloatRange(@l_psData.@pfValue*(1+l_fKo/100)))
                'END IF
            END IF

          @a_psResultRec.@psResultArray.iFirstValid = @l_psData.iFirstValid
          @a_psResultRec.@psResultArray.iLastValid = @l_psData.iLastValid
        NEXT i

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам