Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
cp:obx-proc-type [2021/06/24 14:58] iadenisov |
cp:obx-proc-type [2024/08/28 10:41] (текущий) theathlete [Пример] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Использование процедурных типов ===== | + | ====== Использование процедурных типов |
Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать // | Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать // | ||
Строка 8: | Строка 8: | ||
< | < | ||
- | MODULE | + | MODULE |
- | | + | IMPORT |
- | | + | TYPE |
- | | + | |
+ | CalculatorBool = PROCEDURE (VAR acc: BOOLEAN; a, b: INTEGER); | ||
- | | + | PROCEDURE |
- | BEGIN | + | BEGIN acc := acc + cur END Add; |
- | sl.String(' | + | |
- | | + | |
- | | + | PROCEDURE |
- | BEGIN | + | BEGIN acc := acc - cur END Sub; |
- | sl.String(' | + | |
- | | + | |
- | | + | PROCEDURE |
- | | + | BEGIN acc := acc * cur END Mul; |
- | pp: tP; | + | |
- | str: ARRAY 40 OF CHAR; | + | |
- | BEGIN | + | |
- | pp := Test1; | + | |
- | str := ' | + | |
- | pp(str); | + | |
- | pp := Test2; | + | |
- | str := ' | + | |
- | pp(str) | + | |
- | | + | |
- | END TestProcedure. | + | PROCEDURE Div(VAR acc: LONGINT; cur: INTEGER); |
+ | BEGIN acc := acc DIV cur END Div; | ||
+ | |||
+ | PROCEDURE Greater(VAR acc: BOOLEAN; a, b: INTEGER); | ||
+ | BEGIN acc := acc & (a > b) END Greater; | ||
+ | |||
+ | PROCEDURE Less(VAR acc: BOOLEAN; a, b: INTEGER); | ||
+ | BEGIN acc := acc & (a < b) END Less; | ||
+ | |||
+ | PROCEDURE ReduceLong(IN nums: ARRAY OF INTEGER; c: CalculatorLong): | ||
+ | VAR | ||
+ | i: INTEGER; | ||
+ | acc: LONGINT; | ||
+ | BEGIN | ||
+ | acc := nums[0]; | ||
+ | FOR i := 1 TO LEN(nums) - 1 DO c(acc, nums[i]) END; | ||
+ | RETURN acc; | ||
+ | END ReduceLong; | ||
+ | |||
+ | PROCEDURE ReduceBool(IN nums: ARRAY OF INTEGER; c: CalculatorBool): | ||
+ | VAR | ||
+ | i: INTEGER; | ||
+ | acc: BOOLEAN; | ||
+ | BEGIN | ||
+ | acc := TRUE; i := 1; | ||
+ | REPEAT | ||
+ | c(acc, nums[i-1], nums[i]); | ||
+ | INC(i); | ||
+ | UNTIL (i = LEN(nums)) OR ~acc; | ||
+ | RETURN acc; | ||
+ | END ReduceBool; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | VAR | ||
+ | sn: ARRAY 5 OF INTEGER; (* sn - some nums *) | ||
+ | orderedNums: | ||
+ | sum, mul: LONGINT; | ||
+ | greater, less: BOOLEAN; | ||
+ | BEGIN | ||
+ | sn[0] := 1; sn[1] := 3; sn[2] := 5; sn[3] := 7; sn[4] := 9; | ||
+ | |||
+ | sum := ReduceLong(sn, | ||
+ | Out.String(' | ||
+ | |||
+ | mul := ReduceLong(sn, | ||
+ | Out.String(' | ||
+ | |||
+ | orderedNums[0] := 7; | ||
+ | orderedNums[1] := 5; | ||
+ | orderedNums[2] := 1; | ||
+ | |||
+ | greater := ReduceBool(orderedNums, | ||
+ | Out.String(' | ||
+ | |||
+ | less := ReduceBool(orderedNums, | ||
+ | Out.String(' | ||
+ | END Start; | ||
+ | |||
+ | END FunctionalCalculator. | ||
</ | </ | ||