1.1.5. Информационный адаптер
С учетом вешеизложенного для осуществления универсального информационного интерфейса необходимо:
1) произвести контроль наличия исходных данных для каждого отдельного модуля;
2) задать недостающие исходные данные;
3) проверить соответствие типов, структур и последовательности данных аналогичным характеристикам данных, принятым в вызываемом модуле;
4) преобразовать данные в случае несоответствия типов;
5) обеспечить передачу данных вызываемому модулю в соответствии с типом обмена;
6) организовать среду, определяемую языком программирования модуля;
7) проверить резулбтаты;
8) выполнить обратное преобразоавание данных в вид, принятый для хранения промежуточных результатов;
9) сохранить результаты работы модуля для дальнейшего использования;
Реализация описанных функций выполняется программой-адаптером. Информационное обеспечение адаптера (рисунок 1.1) включает в себя таблицы описателей модулей, наборов данных, область обмена.
МФ - модули
формирования; МВв - модули ввода; ТОНД - таблица описателей наборов данных; ТОМ - таблица описателей модулей; ПУС - программа установки среды; ТОВх - таблица описателей входов; МВыв - модули вывода; ОО - области обмена;
Рисунок 1.1 - Информационное обеспечение программного адаптера
Таблица описателей модулей содержит: имя модуля; идентификатор языка программирования; признак типа обмена, принятый в модуле (параметры, общие области, наборы данных); количество параметров; имя описателей входов модуля; имя области обмена; имя описателя набора данных.
Таблица описателей входов модуля содержит: имя параметра локальное; имя параметра глобальное; характеристику параметра (входной, выходной, модифицируемый); вид структуры (переменная строка, массив арифметический, массив строк, структура, массив структур и т.д.); размерность (для массива); длину (для строк); основание системы счисления (для переменной или элемента массива); форму представления; точность.
Таблица описателей наборов данных содержит: имя набора; имя DD-предложения; тип организации; метод доступа; формат и длина блока; атрибуты записи.
Для обеспечения преемственности данных следует предусмотреть область памяти, куда заносились бы те результаты работы каждого модуля, которые принимают участие в дальнейших расчетах. Этой цели служит область обмена - память, выделенная для промежуточных результатов, передаваемых от модуля к модулю. В нее заносятся исходные данные для первого модуля, результаты вычислений, недостающие данные для промежуточных модулей.
Для организации области обмена необходимо:
1) осуществить анализ данных, которые будут циркулировать в среде программного комплекса в составе САПР с целью определения одинаковых по смыслу переменных;
2) всем одинаковым по смыслу переменным присвоить одно и то же имя, отражающее семантику этих переменных (глобальные переменные);
3) каждой переменной, встречающейся только один раз, присвоить уникальное имя, отражающее семантику величины (локальные переменные);
4) каждой глобальной и локальной переменной поставить в соответствие тип и структуру, являющиеся наиболее информативными;
Указанная совокупность переменных составляет область обмена, в которой хранится текущее значение каждой из переменных в наиболее информативном виде.
В крупных САПР, программы которых оперируют с большим числом входных, промежуточных и результирующих переменных, области обмена удобно организовывать в виде некоторого банка данных. Это позволяет возложить часть функций, выполняемых адаптером, на СУБД, что в конечном итоге сокращает время на разработку информационного и программного обеспечения САПР.
Таким образом, адаптер выполняет всю совокупность операций по организации информационного взаимодействия между программными модулями. В случае разноязыковых модулей адаптер практически берет на себя выполнение соответствующих функций операционной системы. Достаточно сложной является также задача построения области обмена, поскольку ее решение связано со структурированием всех переменных, участвующих в информационном обмене. В крупных САПР, программные модули которых оперируют с большим числом входных, промежуточных и результирующих переменных, функции адаптера по организации и взаимодействию с обменными областями целесообразно переложить на типовые СУБД.
Банки данных в настоящее время находят все более широкое применение для организации межмодульного интерфейса. Их использование наиболее эффективно, когда совокупность модулей программного обеспечения зафиксирована и не подлежит изменениям в дальнейшем. В этом случае необходимо составить логическую схему для всей области обмена, в которой были бы указаны наименования переменных, их взаимосвязи, тип представления. Обращение из программных модулей для получения значений необходимых переменных должно выполняться с помощью операторов взаимодействия с СУБД. Применение банков данных для целей организации информационного обмена сокращает сроки разработки информационного и программного обеспечения САПР. /1/
2. АЛГОРИТМИЧЕСКАЯ ЧАСТЬ
2.1. Математическое решение задачи
Пусть даны два уравнения с двумя неизвестными
F1(x,у)=0, (1)
F2(x,у)=0
действительные корни которых требуется найти с заданной степенью точности.
Мы предположим, что система (1) допускает лишь изолированные корни. Число этих корней и их грубо приближенные значения можно установить, построив кривые F1(x,у)=0; F2(x,у)=0 и определив координаты их точек пересечения.
Пусть х=x0; у=y0-приближенные значения корней системы (1), полученные графически или каким-нибудь другим способом (например, грубой прикидкой).
Дадим итерационный процесс, позволяющий при известных условиях уточнить данные приближенные значения корней. Для этого представим систему (1) в виде
x=j1(x,y),
y=j2(x,y)
и построим последовательные приближения по следующим формулам:
x1=j1(x0,y0); y1=j2(x0,y0);
x2=j1(x1,y1); y1=j2(x1,y1); (3)
xn+1=j1(xn,yn); yn+1=j2(xn,yn)
Если итерационный процесс (3) сходится, т. е. существуют пределы
x=lim xnиh=lim yn,
n®¥n®¥
то, предполагая функции j1(x,y) и j2(x,y) непрерывными и переходя к пределу в равенстве (3) общего вида, получим:
lim xn+1=lim j1(xn,yn)
n®¥ n®¥
lim xn+1=lim j2(xn,yn)
n®¥n®¥
Отсюда x=j1(x,h); h=j2(x,h)
т. е. предельные значения x и h являются корнями системы (2), а следовательно, и системы (1). Поэтому, взяв достаточно большое число итераций (3), мы получим числа xn и yn, которые будут отличаться от точных корней x=x и y=hсистемы (1) сколь угодно мало. Поставленная задача, таким образом, окажется решенной. Если итерационный процесс (3) расходится, то им пользоваться нельзя.
Теорема. Пусть в некоторой замкнутой окрестности R {a£x£A; b£y£B}(рис.) имеется одна и только одна пара корней x=x и y=hсистемы (2). Если:1) функции j1(x,y) и j2(x,y) определены и непрерывно дифференцируемы в R; 2) начальные приближения x0, y0 и все последующие приближения xn, yn (n=1,2...) принадлежат R; 3) в R выполнены неравенства
½¶j1/¶x½+½¶j2/¶x ½£q1<1
½¶j1/¶x½+½¶j2/¶x ½£q2<1
то процесс последовательных приближений (3) сходится к корням x=xи y=hсистемы (2), т.е.
x=lim xnиh=lim yn,
n®¥ n®¥
Рисунок 2.1-Графики уравнений в замкнутой окрестности.
Структурная схема решения задачи представлена на рисунке 2.2.
Нет Да
Рисунок 2.2-Структурная схема решения задачи.
3. РАЗРАБОТКА СТРУКТУРЫ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
3.1. Построение структуры программного обеспечения
При программировании использовался язык программирования TurboPascal. Текст программы приведен в приложении A. На рисунке 3.1 представлена структура программы, решающей поставленную задачу. Программа имеет монолитно-модульную структуру.
Рисунок 3.1-Монолитно-модульная структура программы
Опишем некоторые основные стандартные процедуры и функции, используемые для формирования собственных процедур.
Для установки (инициализации) графического режима служит функция initgraph ( ).
InitGraph(gd,gm,'');
(gd-graphic driver, gm-graphic mode);
Функция initgraph( )считывает в память соответствующий драйвер, устанавливает видеорежим, и определяет маршрут к директории, в которой находится драйвер egavga.bgi.
При работе с цветом активно использовалась функция SetColor (intcolor), выставляющая цвет надписи и фоновый цвет. В программе с помощью этой функций выводились следующие цвета:
1) синий - SetColor(LightBlue);
2) красный - SetColor(LightRed);
3) белый - SetColor (White);