Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

20.7. Есть несколько переменных с разными значениями. Как получить имя переменной, в которой находится наибольшее значение?

В: Есть несколько переменных с разными значениями. Как получить имя переменной, в которой находится наибольшее значение?

О:

Для примера возьмём несколько переменных и значений:

VariableA=1
VariableB=2
VariableC=3
VariableD=4
  1. Вносим названия этих переменных и их значения в два разных массива под одним индексом:

    $varname[0]="VariableA" & varvalue[0]=VariableA
    $varname[1]="VariableB" & varvalue[1]=VariableB
    $varname[2]="VariableC" & varvalue[2]=VariableC
    $varname[3]="VariableD" & varvalue[3]=VariableВ
  2. Теперь определяем максимальное значение в массиве varvalue:

    varmax=max('varvalue')
  3. Осталось определить индекс элемента с этим значением:

    indexMax=arrpos('varvalue',varmax)
  4. Имя переменной получить уже несложно:

    *pl "Максимальное значение в переменной "+$varname[indexMax]

Можно написать функцию, которая будет возвращать название переменной с максимальным значением:

!#maxVar
! $args[0] — $args[8] — названия переменных
! массивы для временного хранения названий переменных и их значений:
local $varname, varvalue
! 1
loop local i=0 while $args[i]<>'' step i+=1:
    dynamic "$varname[]='<<$args[i]>>' & varvalue[]=<<$args[i]>>"
end
! 2
local max_=max('varvalue')
! 3
local index_=arrpos('varvalue',max_)
! 4
$result=$varname[index_]

Вызов функции:

@maxVar('VariableA','VariableB','VariableC','VariableD')

Поскольку для работы данной функции в любом случае требуется цикл, можно несколько изменить алгоритм:

!#varMax
local $max_='args[19]'
loop local i=0 while $args[i]<>'' step i+=1:
    $max_=$dyneval("if <<$args[i]>> > <<$max_>>:
        $result='<<$args[i]>>'
    else
        $result='<<$max_>>'
    end"
)
end
$result=$max_