можно ли использовать MaximumFuntion в Entry Funciton in Progress 4gl

Я новичок в прогрессе, и я пытаюсь понять, как заставить это работать. Моя задача - получить список целочисленных значений от пользователя, разделенных точкой с запятой, и сообщить самое высокое и самое низкое значение в этом списке. До сих пор я использовал функцию ввода, чтобы помочь мне получить только целые числа, введенные пользователем одно за другим. вот так

repeat I = 1 to  totalEntries:
    m = entry (I, Userinput, ";").
    display m. 
end.

После этого я хотел бы узнать максимальное значение всех записей. как я могу это сделать, так как максимальная функция принимает более одного значения для сравнения.


person nikita    schedule 05.05.2015    source источник


Ответы (2)


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

DEF VAR i     AS INT.
DEF VAR nlist AS CHAR INIT "1;2;7;3;6;9".

DEF VAR imin  AS INT.
DEF VAR imax  AS INT.

imin = INTEGER(ENTRY (1, nlist, ";")).
imax = INTEGER(ENTRY (1, nlist, ";")).

REPEAT i = 2 TO  NUM-ENTRIES(nlist, ";"):

    IF INTEGER(ENTRY(i, nlist, ";")) > imax THEN
        imax = INTEGER(ENTRY(i, nlist, ";")).

    IF INTEGER(ENTRY(i, nlist, ";")) < imin THEN
        imin = INTEGER(ENTRY(i, nlist, ";")).

END.

MESSAGE imax.
MESSAGE imin.
person Austin    schedule 05.05.2015
comment
определить переменную numberEntry как представление символа как заполнение без отмены. - person nikita; 05.05.2015
comment
Эй, Остин, спасибо за ответ, однако я дважды проверил, и есть функция под названием «Максимум», пожалуйста, найдите код ниже. Это вся моя процедура, которая у меня есть до сих пор. Определите переменную NumberEntry как представление символа как заполнение без отмены. Определите переменную UsersInput как символ без отмены. Определите переменную i как целое число без отмены. Определите переменную totalEntries как целое число без отмены. Определите переменную m как символ без отмены. Определите переменную n как символ без отмены. Определите кнопку bНайти. - person nikita; 05.05.2015
comment
Определить основной номер кадра Метка ввода «Введите числа, разделенные точкой с запятой» пропустить bНайти метку «Найти максимальное и минимальное» с боковыми метками. /*Триггер для кнопки*/ При выборе bFind в главном фрейме выполните: /*Получение пользовательского ввода*/ Usersinput = (numberEntry :screen-value). /*чтобы узнать, сколько символов ввел пользователь.*/ totalEntries = num-entries(UsersInput, ‘;’). Показать общие записи. /*Логика для извлечения входных значений пользователей одно за другим.*/ Повторить i = 1 до totalEntries: M = entry(i, UsersInput, «;»). Показать м. Конец. /*Логика поиска максимального элемента. */ ..... конец. - person nikita; 05.05.2015
comment
Максимальная функция не будет работать со списком записей. Это работает следующим образом: МАКСИМУМ(1,2,3) вернет 3. Итак, НЕ МАКСИМУМ (1,2,3) - person Jensd; 05.05.2015

Как грустно Остин, в Progress нет встроенной функции, которая выдавала бы максимальное или минимальное число из списка.

В своем комментарии вы упомянули, что MAXIMUM (1,2,3) работал. Да, это работает, но вы должны понимать, что вы передаете функции три параметра, а не список чисел внутри одной переменной CHAR.

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

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

FUNCTION iMax RETURNS INTEGER
    ( INPUT pData AS CHAR ):

    DEF VAR iOutput     AS INT  NO-UNDO.
    DEF VAR iCount      AS INT  NO-UNDO.

    iOutput = ?.

    DO iCount = 1 TO NUM-ENTRIES(pData,';'):
        IF iOutput = ? THEN DO:
            iOutput = INT(ENTRY(iCount,pData,';')).
            NEXT.
        END.
        iOutput = MAX(iOutput,INT(ENTRY(iCount,pData,';'))).
    END.

    RETURN iOutput.

END FUNCTION.

FUNCTION iMin RETURNS INTEGER
    ( INPUT pData AS CHAR ):

    DEF VAR iOutput     AS INT  NO-UNDO.
    DEF VAR iCount      AS INT  NO-UNDO.

    iOutput = ?.

    DO iCount = 1 TO NUM-ENTRIES(pData,';'):
        IF iOutput = ? THEN DO:
            iOutput = INT(ENTRY(iCount,pData,';')).
            NEXT.
        END.
        iOutput = MIN(iOutput,INT(ENTRY(iCount,pData,';'))).
    END.

    RETURN iOutput.

END FUNCTION.

/****************/

Define variable NumberEntry as character view-as fill-in no-undo. 
Define variable UsersInput as character no-undo. 
Define variable i as integer no-undo. 
Define variable totalEntries as integer no-undo. 
Define variable m as character no-undo. 
Define variable n as character no-undo. 
Define button bFind. 
Define frame main numberEntry label "Enter numbers separated by semi colon" skip 
    bFind label "Find Max and Min" with side-labels. /*Trigger for button*/ 
On choose of bFind in frame main do: /*Retrieve the users input*/ 
    Usersinput = (numberEntry:screen-value). /*to find out how many characters the user has enterd.*/ totalEntries = num-entries(UsersInput,';'). Display totalentries. /*Logic to extract Users input values one by one.*/ 
    Repeat i = 1 to totalEntries: M = entry(i, UsersInput, ";"). 
        Display m. 
    End. /*Logic to find the maximum element. */ ..... 
    MESSAGE 'MAXIMUM :' iMax(UsersInput) SKIP 
            'MINIMUM :' iMin(UsersInput)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.

VIEW FRAME main.
ENABLE ALL WITH FRAME main.
WAIT-FOR CHOOSE OF bfind.

Вы можете вызвать iMax() или iMin() и получить значения MAX или MIN из функций Progress MAXIMUM и MINIMUM, используя список CHAR значений INTEGER, разделенных точкой с запятой, без необходимости создавать полный блок кода для сравнения и получения информации для каждой ситуации, которая представляет нужно.

Надеюсь, поможет.

person Bruno    schedule 06.05.2015
comment
Хм, теперь я вижу, где я ошибся, код работает нормально. Спасибо вам, ребята :-) - person nikita; 06.05.2015