Страница: 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
Ответить
|
Номер ответа: 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.
Ответить
|
Номер ответа: 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 |
Поиск по форуму