Н. Джехани - Язык Ада (1988) (1160771), страница 14
Текст из файла (страница 14)
Отказ от логической модульности, представленной подпрограммой в пользу повышения скорости выполнения, нежелателен, поскольку это делает программу менее удобочитаемой, менее понимаемой и менее модифицируемой. Логическую модульность можно сохранить, не жертвуя скоростью выполнения, если подобную замену вместо программиста выполняет компилятор. Прагма 1ХЫХЕ дает указание компилятору заменить все вызовы специфицированных в ней подпрограмм нх телами: ргааша 1ХЫХЕ (3%АР); — замена вызовов подпрограммы — 5%АР копия ее тела Прагма может появиться после точки с запятой там, где может появиться оператор, описание, спецификатор, такой как «1()з и цзе, альтернатива, вариант Введение или обработчик исключения.
Существует несколько второстепенных ограничений на эти правила, относящиеся ко всем прагмам. Дальнейшие ограничения связаны с отдельными прагмами и направлены на то, чтобы гарантировать их появление в тех местах, где они осмыслены. Прагмы могут быть определенными в языке (приложение В руководства по языку Ада) илн зависящими от реализации (приложение Г руководства по языку Ада).
Приведем еще примеры прагм: ргаяша ОРТ1М1УЕ (БРАСЕ); — попытка оптимизировать использование памяти ргайша 1.1БТ (ОРГ); — прекратить печать листинга программы 1.10. Законченные примеры Для иллюстрации концепций языка Ада приводятся несколько законченных примеров. Первый пример, взятый из механики, иллюстрирует метод итерации. Остальные примеры из информатики касаются таких тем, как сортировка, матричное умножение и полиномиальные вычисления. Для иллюстрации разработки примеров программ везде, где необходимо, используется пошаговая детализация. Некоторые желательные черты хорошей методологии программирования и рекомендации для пошаговой детализации приведены в приложении. Обозначение Р; используется для 1-го шага детализации программы, а Ро — это начальный шаг.
1.10.1. Уапановившийся режим температурного распределения Этот пример взят из механики и связан с задачей теплопереноса. Проблема заключается в нахождении установившегося режима температурного распределения вдоль стенок воздушного канала (или кратера), показанного на рисунке, приведенном ниже, причем внутренняя и внешние температуры есть Т 1Х и Т О(1Т. 1 Т 01)т 100 т о(1Т Рнс.
1.1. Температурное распределенне влоль стенок воздушного канала Глава 1 Анализ теплопереноса для этой задачи позволяет свести ее к более простой задаче решения уравнения Лапласа ~7~! = 0 (где ! — температура) для сечения. Для решения уравнения Лапласа используется итерация Якоби (более детально о методе Якоби говорится в конце примера). Решение определяется следующим образом: Ро'. Выбор распределения температур для сечения !оор Пусть распределение температуры, вычисленное в последней итерации, будет старым распределением температур для этой итерации; Вычислить новое распределение температур на основании старого, подставляя новую температуру, являющуюся средним значением старых температур в четырех окружающих точках ех(! «'пеп, когда максимальное абсолютное изменение температуры во всех точках <ЕРБ епо !оор; где 0.0 ( ЕРБ ( ( 1.0 — требуемая точность вычислений.
Для представления канала в Ада-программе используется массив размерностью 100 х !00 (т. е. индексы имеют значения между 1 и 100); массив КЕО10Х определяется так: КЕО1ОХ (1, 1) имеет значение ТК1)Е, если точка 1, У находится внутри границ канала, и РАЕЧКЕ в противном случае Массив КЕО1ОХ упрощает проверку определения, находится ли точка внутри гранид канала. Граничные температуры являются константами, и нет необходимости просматривать граничные точки.
Исключение внешних граничных точек достигается просто повторениями цикла между 2 и 99. Следовательно, КЕО1ОХ будет определен только для точек (1, )) внутри диапазона 2 и 99. Вместо вычисления полных старого и нового температурных распределений для нахождения максимального абсолютного изменения температуры в любой точке это изменение будет вычисляться непрерывно всякий раз, когда найдена новая температура в точке. Поэтому абстрактный оператор «Вычислить новое распределение температур на основании старого...» в приведенном выше алгоритме детализируется следующим образом: МАХ СНАХОЕ:= 0.0; 1ог всех точек (1, з) в КЕО1ОХ !оор Новая температура в точке (1, Х) — это среднее значение старых температур в четырех окружающих точках; Пусть новое значение МАХ СНАХОЕ будет максимальным среди старых значений МАХ-СНАХОЕ и абсолютного значения разности старых и новых температур в точке (1, )) епо !оор; ВЗ Вве виве Оператор ехй згйеп, когда максимальное ...
теперь можно выразить как ехй згйеп МАХ СНАХОЕ ( ЕРБ; Главная Ада-программа, базирующаяся на приведенном выше алгоритме и детализациях, имеет вид ичгЬ ТЕХТ 1О; — подпрограммы ввода-вывода строк, настраиваемые пакеты — Н.ОАТ, 1ХТЕОЕК и другие подпрограммы ввода— вывода становятся доступными пзе ТЕХТ 10; — указанные выше подпрограммы нет — необходимости квалифицировать с помощью — ТЕХТ 10 ргосейпге 1ИЗСТ ТЕМРЕКАТ1ЗКЕ !и расйаяе 10 Н.ОАТ 1ч пеп И.ОАТ 10 (Н.ОАТ); — конкретизация настраиваемого пакета — Р1.ОАТ расйаяе 10 1ХТЕОЕК 1в пезг 1ХТЕОЕК 10 (1ХТЕОЕК); — конкретизация настраиваемого пакета — 1ХТЕОЕК вве 10 И.ОАТ, 10 1ХТЕОЕК; — ОЕТ и РОТ для РЬОАТ и 1ХТЕОЕК теперь видимы — непосредственно впЬгуре ООТБ11)Е 1е 1ХТЕОЕК гапйе 1..100; — внешняя граница канала 1уре 1111СТ (в аггау (О(ЗТБ11)Е, 01)ТБ1ГзЕ) о1 Н.ОАТ, 1Х-ТЕМР 015Т ТЕМР ЕРБ, МАХ СНАХОЕ: Н.ОАТ,' ОЬО ТЕМТ, ХЕчг' ТЕМР: 1)ОСТ, — содержат старые и новые температурные — распределения в канале КЕ010Х: сопв1апг аггау (2..99, 2..99) о1 ВООЬЕАХ:= (2..25 = > (2..99 = > ТЛЕ), 26..75 => (26..75 => РА1.БЕ, 2..25 ) 76..99 => ТЛЕ), 76..99 = > (2..99 = > ТК15Е)); — отметим удачное использование агрегатов — агрегат не следует записывать как — (26..75 = > (26..75 = > РА1,БЕ), о(Ьегв = > ТКЫЕ), — поскольку (1) двумерный агрегат массива — должен записываться как перечисление значений — одномерного массива и (2) альтернатива — оГЬегв может использоваться в агрегате — только тогда, когда его тип определяется — явно.
1ппсйоп МАХ(А, В: ш И.ОАТ) геГпгп НОАТ 1з Ьерп Ы А < В гегогп В; е1зе геГпгп А; епй 11; — такой способ использования оператора 1Т вместо — показанного ниже н обычно используемого способа Глава Г диктуется краткостью оператора. Стиль записи не должен быть слишком жестким; он должен быть гибким и соответствовать применениям Ы А ( В ФЬеп ге!пгп В; еЫе ге!пгп А; епй Ы; епй МАХ; Ьей!п чтение граничных температур и результирующей точности Р(ЗТ (" Какова внутренняя температура?"); ХЕ% 1.1ХЕ; ОЕТ(1Х ТЕМР); Р()Т (" Какова внешняя температура?"); ХЕ% 1.1ХЕ; ОЕТ(01)Т ТЕМР); Р13Т (" Какова желаемая точность?"); ХЕ% 1.1ХЕ; ОЕТ (ЕРБ); инициализация ХЕ% ТЕМР; границы инициализируются указанными температурами, а внутренняя область — средними значениями двух граничных температур !ог1 1п 01)ТБ11)Е !оор !ог Ю !п 01)ТБ11)Е !оор Ы 1 = 01)ТБ1РЕ'Р1ВБТ ог 1 = 01)ТБ10Е'ЬАБТ ог У = 01)ТБ10Е'Р1йБТ ог 1 = 01)ТБ10Е'ЬАБТ !Ьеп ХЕ% ТЕМР (1, 1):= 013Т ТЕМР; — внешние граничные точки е!зЫ йЕО1ОХ (1„1) !Ьеп ХЕ% ТЕМР (1, У):= (1Х ТЕМР+ 01)Т ТЕМР)/2.0; — внутренняя область е!яе ХЕ% ТЕМР (1, У):= 1Х ТЕМР; — точки на внутренней границе и внутри ее; — точки массива, ограниченные внутренней — границей, никогда не будут использоваться епй Ы; епй 1оор; епй !оор; вычисление установившегося температурного распределения нее еиив 1оор ОЫ) ТЕМР:= ХЕ% ТЕМР; — все готово для следующей итерации — отметим использование присваивания — для массивов МАХ СНАХОЕ:= 0.0; — максимальное изменение для любой точки — рассматривается как возрастающее 1ог 1 т О()ТБ1ЬЗЕ'НКБТ + Ь.ОЫТБПЭЕ'ЬАБТ вЂ” 1 !оор 1огЮ т ОЫТБ1РЕ'НКБТ + Ь.ОЫТБЮЕ'ЬАБТ вЂ” 1 1оор 11КЕО1ОХ (1, 1) !пеп ХЕ% ТЕМР (1, Я):= (01ЛЭ ТЕМР (1 — 1,5) + ОЬВ ТЕМР (1 + Ь5) + ОЬР ТЕМР (1, У вЂ” 1) + 01ЛЭ ТЕМР (1, Л + 1))/4.0; МАХ СНАХОЕ: = МАХ(МАХ СНАХОЕ, аоя (ХЕ% ТЕМР (1, Я) — ОЬР ТЕМР (1, У))); епо 11; епд 1оор; епо 1оор; ехй згвеп МАХ СНАХОЕ ( ЕРБ; епд !оор; — печать окончательной версии температурного распределения — формирование каждой новой строки 1ог 1 !п ОЫТБПЭЕ 1оор РОТ (" Строка" ); Р()Т (1); ХЕ% ЫХЕ; — значение 1 используется по умолчанию — в качестве фактического параметра при — вызове ХЕ% ЫХЕ 1ог 1 !и О()ТБ1РЕ !оор Р()Т (ХЕ% ТЕМР (1, Ю)); епо 1оор; ХЕ% ЫХЕ (2); епд 1оор; епо 1Х)СТ ТЕМРЕКАТЫКЕ; Инициализация массива ХЕ% ТЕМР для выбранных температур может быть записана в альтернативном виде с использованием агрегата: ХЕ% ТЕМР:= (1 ) 100 = > (1..100 = > 0(ЗТ ТЕМР), — верхняя и нижняя границы 26..75 = > (26..75 = > ЬХ ТЕМР, 1 ~ 100 = > ОПТ ТЕМР, 2..25 ) 76..99 = > (0(ЗТ ТЕМР + 11Ч ТЕМР)/2.0), — строки, вюпочающие внутренние границы, и точки внутри их 2..25 ~ 76..99 = > (1 ~ 100 = > ОЫТ ТЕМР, 2..99 = > (ОЫТ ТЕМР + 1Х ТЕМР)/2.0)); — остальные точки Глава г Такая инициализация, вероятно, реализуется более эффективно, чем приведенная ранее, поскольку управление потоком явно не задается, а это оставляет больше свободы компилятору при генерации кода.
Более того, такая инициализация не содержит никаких явных проверок. Решение вопроса о том, какая из инициализаций более удобочитаема, остается за читателем. Метод итерации Якоби всегда сходится. Новые значения (температуры в данном примере) в точках не используются до следующей итерации. В модификации этого метода, называемой методом Гаусса — Зайделя, новые значения используются сразу, как только они вычислены.