Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 79

| END;


Рис. 6.16

- 121 -


| >{ $R+} { можно при необходимости восстановить режим }

| BEGIN

| >{ Заполнение каким-либо образом массивов B1, B2 и B3; }

| >...

| >S := '123456789';

| >{ печать суммы всех значений элементов массива B1 : }

| >WriteLn( Sum( B1, 201));

| >{ сумма элементов B2 с 100-го по 200-й включительно: }

| >WriteLn( Sum( B2[100], 101));

| >{ сумма 10 элементов массива B3, начиная с 'b'-го : }

| >WriteLn( Sum( B3['b'], 10));

| >{печать суммы кодов символов строки S с '1'-го по '9'-й}

| >WriteLn( Sum( S[1], 9));

| END.


Рис 6.16 (окончание)


Как видно, функция Sum не боится несовместимости типов. Но она будет корректно работать только с массивами, элементами которых являются значения типа Byte. Мы сами задали это ограничение, определив тип XType, к которому впоследствии приводим все, что передается процедуре через параметр X. Обращаем внимание на диапазон описания массива XType: 1..1. Если режим компиляции $R имеет знак минус (состояние по умолчанию), то можно обратиться к массиву с практически любым индексом i и будет получен i-й элемент, считая от первого. Мы задаем индексы 1..1 чисто в иллюстративных целях. Можно было записать


| TYPE


ХТуре = Array [ 0..65520 ] of Byte;


забронировав максимальное число элементов (описание типа без объявления переменной не влияет на потребление памяти программой). В таком случае состояние ключа компиляции $R не играет роли. Функция Sum может начать отсчитывать элементы с любого номера (см. рис. 6.16). Можно даже послать в нее строку, и ее содержимое будет принято за байты (а не символы) и тоже просуммировано. Несложно написать обратную процедуру для заполнения произвольной части различных массивов. Надо лишь, чтобы базовый тип этих массивов совпадал с тем, который вводится внутри процедуры для приведения бестипового параметра. И, конечно, вовсе не обязательно ограничиваться одними массивами. Рассмотренный пример можно распространить и на записи, и на ссылки, и на

- 122 -

числовые переменные. Но будут рискованными операции передачи через бестиповый параметр таких данных, как множества или элементы вводимых перечислимых типов, из-за особенностей их машинного представления.


6.9.6.4. Рекурсия. Использование рекурсии — традиционное преимущество языка Паскаль. Турбо Паскаль в полной мере позволяет строить рекурсивные алгоритмы. Под рекурсией понимается вызов функции (процедуры) из тела этой же самой функции (процедуры).


Рекурсивность часто используется в математике. Так, многие определения математических формул рекурсивны. В качестве примера можно привести формулу вычисления факториала: