Внутреннее проектирование и разработка программных средств.pptx
- Количество слайдов: 97
Внутреннее проектирование и разработка программных средств Лектор: Смирнов Александр Алексеевич
План лекции 1. Определение ППП. 2. Составные части ППП. 3. Модель предметной области. 3. 1. Табличный вариант модели предметной области 3. 2. Граф предметной области. 4. Использование теории формальных грамматик, для описания встроенного языка пакета прикладных программ. 5. Конструирование управляющей программы пакета прикладных программ. 5. 1 Модуль лексического разбора 5. 2 Модуль синтаксического анализа
План лекции (окончание) 5. 3 Модуль управления 5. 4 Информатор 5. 5 Модуль помощи (HELP)
Литература 1. Смирнов А. А. Прикладное программное обеспечение. Учебное пособие. М. , МЭСИ, 2011. 2. Гагарина Л. Г. , Виснадул Б. Д. , Кокорева Е. В. Технология разработки программного обеспечения. М. ИНФРА-М. , 2013 3. Голицына О. Л. , Попов И. И. , Партыка Т. Л. Программное обеспечение. М. ФОРУМ. , 2010
Определение пакета прикладных программ Под пакетом прикладных программ (ППП, application program package) понимается совокупность совместимых программ, предназначенных для решения прикладных задач определенной предметной области. Основной отличительной особенностью пакета прикладных программ является наличие встроенного языка прикладной системы. Пакеты прикладных программ включают специальную подсистему помощи пользователю (режим HELP).
Свойства пакета прикладных программ Можно выделить следующие общие свойства пакета прикладных программ: Ø пакет состоит из нескольких программных единиц Ø пакет предназначен для решения задач определенного класса Ø в пределах своего класса пакет обладает определенной универсальностью, т. е. позволяет решать практически все задачи данного класса Ø в пакете предусмотрены средства управления, позволяющие выбирать конкретные возможности, из числа имеющихся в пакете. Пакет допускает настройку на конкретные условия применения Ø пакет ориентирован на пользователя, имеющего определенный уровень квалификации в той области знаний, к которой относятся решаемые пакетом задачи Ø пакет имеет специальные средства помощи и обучения
Классификация пакетов прикладных программ ППП можно подразделить на • методо-ориентированные пакеты • проблемно-ориентированные пакеты • интегрированные пакеты. Примерами интегрированных пакетов являются MICROSOFT OFFICE, FRAMEWORK, SYMPHONY
Составные части ППП Пакет прикладных программ можно рассматривать как объединение ü встроенного языка ü информационной базы ü управляющих программных модулей ü обрабатывающих программных модулей ü обслуживающих программных модулей
Программа на встроенном языке (ПВЯ) Командная (управляющая) информация представляется на формальном, специально разработанном встроенным языке пакета. Задание пользователя, записанное на встроенном языке пакета, называют программой на встроенном языке (ПВЯ).
Управляющие программные модули Управляющая программа в общем случае состоит из следующих блоков (модулей): Øведущий блок Øмодуль лексического разбора Øмодуль синтаксического анализа Øмодуль управления Øинформатор Øмодуль помощи.
Обрабатывающие программные модули Программные модули пакета, реализующие алгоритмы обработки данных, затребованные в ПВЯ, называются обрабатывающими модулями.
Обслуживающие программные модули Поддержание ППП в работоспособном состоянии обеспечивается специальными модулями, которые называются обслуживающими модулями.
Предметная область пакета прикладных программ Область деятельности, к которой относятся задачи, решаемые пакетом прикладных программ, называется предметной областью пакета. Реальная действительность воспроизводится с существенными ограничениями, зависящими от области деятельности, поставленных целей и мощности вычислительных средств.
Модель предметной области ППП можно представить: Ø совокупность данных Ø связи между данными
Совокупность данных Данное может характеризоваться: §именем §типом §значением Например, имя “PRICE” может обозначать реквизит с содержательным названием “ЦЕНА ИЗДЕЛИЯ” Под типом данного понимается совокупность его свойств.
Связи между данными можно подразделить на два вида: Øсвязи по определению Øфункциональные связи
Представление модели предметной области МПО = {X, R, F}, где X- множество данных; R- множество связей по определению; F- множество функциональных связей. Например, если в модели имеется одномерный массив “A” и целое данное “N”, определяющее размерность массива “A”, то можно считать, что данное “A” подчинено данному “N”.
Предикатом называется функция, аргументами которой являются имена (значения) данных, а возвращаемый результат имеет логическое значение “истинно” или “ложно”. Если предикат не выполняется, то значение соответствующего данного считается неопределенным.
Функциональные связи Отдельный обрабатывающий модуль можно рассматривать как функцию B= f (A), где vвеличина «А» представляет собой набор входных данных для конкретного модуля vвеличина «В» представляет собой набор выходных данных модуля
Табличный вариант модели предметной области Таблица данных (элементы множества данных) Номер П/п 1 2 Название Данного Имя Данного Тип Данного Число N поставщиков Целое Список кодов A поставщиков Вектор из N целых элементов
Табличный вариант модели предметной области Таблица связей по определению (связи подчинения) Номер п/п. 1 Старшее данное N Подчиненные данные A
Табличный вариант модели предметной области Таблица задач ( Функциональные связи ) Функции Иденти- Входные Номер обрабатыва- фикатор параметры п/п. ющего модуля 1 Отбор неоплаченны OTBOR N, A х поставок Выходные параметры M, B
Вершины графа предметной области Вершинами могут быть обозначены следующие стадии обработки: 1 - начальная стадия; 2 - обеспечение ввода информации; 3 - проверка корректности введенной информации; 4 - получение выходных документов; 5 - завершение работы.
Дуги графа предметной области Дугами могут быть обозначены следующие алгоритмы: 1 - ввод с внешнего носителя; 2 - ввод с клавиатуры; 3 - тестирование информации; 4 - просмотр и редактирование информации; 5 - получение выходной формы; 6 - контрольная распечатка файла; 7 - сохранение информации на внешнем носителе.
Граф предметной области 1 1 о 3 2 о 2 5 3 о 4 4 7 о 6 5 о GPO 1 2 2 3 3 4 4 5
Нотация Бэкуса -Наури : : = - по определению есть | - логическое сложение (или) <. . . > - скобка для обозначения нетерминального символа [. . . ] - обозначение необязательного элемента
Пример формальной грамматики <ПВЯ>: : = <оператор> [<оператор>] <оператор>: : = <имя оператора> <разделитель> [<параметр>] <признак конца оператора> <имя оператора> : : = ВВОДД | ВВОДК | ТЕСТ | ПРОСМ | ВЕДОМ | РАСП | СОХР <разделитель> : : = =
Пример формальной грамматики <параметр>: : = <символьная константа> : : = <буква> [<буква>| <цифра>| < спец. символ>] <буква>: : = А | Б | В. . . Я | A| B| C … Z <цифра>: : = 0 | 1 | 2. . . 9 < спец. символ> : : = : | | _ <признак конца оператора>: : = ;
Пример ПВЯ ВВОДД = A: ISX; TECT = ЭКРАН; ВЕДОМ = ПРОМ_ИТ; СОХР = ДИСКЕТА;
Модули управляющей программы Ведущий модуль Модуль управления Лексический разбор Информатор Синтаксический анализ Модуль помощи (HELP)
Ведущий модуль Unit_VED; INTERFACE Uses Windows, Messages, Sys. Utils, Classes, Graphics, Controls, Forms, Dialogs, Std. Ctrls;
Ведущий модуль (продолжение 1) Type TForm_VED = class(TForm) CMDINPUT: TButton; CMDPROCESS: TButton; CMDEXIT: TButton; Lb. PVJA: TLabel; Ed. PVJA: TEdit; MESINF: TMemo; Lb. HELP 1: TLabel;
Ведущий модуль (продолжение 2) Lb. HELP 2: TLabel; CMDHELP: TButton; procedure CMDPROCESSClick(Sender: TObject); procedure Form. Activate(Sender: TObject); procedure CMDEXITClick(Sender: TObject); procedure CMDINPUTClick(Sender: TObject); procedure CMDHELPClick(Sender: TObject); End; Var Form_VED: TForm_VED; PVJA: String; {Программа на встроенном языке}
Ведущий модуль (продолжение 3) IMPLEMENTATION {$R *. DFM} Procedure TForm_VED. Form. Activate(Sender: TObject); begin Caption: ='Управляющая программа'; Cmd. Input. Caption: ='ВВОД ПВЯ'; Cmd. Process. Caption: ='ВЫПОЛНЕНИЕ'; Cmd. Exit. Caption: ='ВЫХОД'; Cmd. Help. Caption: ='СПРАВКА';
Ведущий модуль (продолжение 4) Lb. PVJA. Caption: ='Программа на встроенном языке'; Lb. PVJA. Autosize: =True; MESINF. TEXT: ='Выполняется управляющая программа'; Lb. Help 1. Visible: =False; Lb. Help 2. Visible: =False; EDPVJA. TEXT: = ''; EDPVJA. Set. Focus; end;
Ведущий модуль (продолжение 5) Procedure TForm_VED. CMDINPUTClick(Sender: TObject); { Ввод программы на встроенном языке пакета} Begin PVJA: = EDPVJA. TEXT; CMDPROCESS. Set. Focus; End;
Ведущий модуль (продолжение 6) Procedure TForm_VED. CMDPROCESSClick(Sender: TObject); {Обработка события: нажатие клавиши "ВЫПОЛНЕНИЕ"} Type. Tinf= Record KV: Integer; {Код возврата} PB: Integer; {Признак блока} End; { Type. Tinf } T_YV= Array[1. . 40] Of Integer; {Тип для управляющего вектора} T_PAR= Array[ 1. . 40] Of String; {Тип для вектора параметров}
Ведущий модуль (продолжение 7) Var YV: T_YV; {Управляющий вектор} PAR: T_PAR; {Вектор параметров} KSL: Integer; {Количество расшифрованных слов ПВЯ} TINF: Type. Tinf; {Таблица информатора}
Ведущий модуль (продолжение 8) Procedure Lan (PVJA: String; {Программа на встроенном языке} Var YV: T_YV; {Управляющий вектор} Var Par: T_Par; {Вектор параметров} Var Ksl: Integer; {Количество расшифрованных слов ПВЯ} Var Tinf: Type. Tinf {Таблица информатора}); { Блок лексического разбора} Begin End; {Procedure}
Ведущий модуль (продолжение 9) Procedure San ( YV: T_YV; Ksl: Integer; Var Tinf: Type. Tinf) ; {Блок синтаксического анализа} Begin End; Procedure Yprava (YV: T_YV; Par: T_PAR; Ksl: Integer; Var Tinf: Type. Tinf); Begin {Модуль управления} End; {Procedure}
Ведущий модуль (продолжение 10) Procedure Inform (Tinf: Type. Tinf); { Блок информатора} Begin End;
Ведущий модуль (продолжение 11) Begin With TINF DO Begin Lan ( PVJA, YV, Par, Ksl, Tinf); { Выполнение блока лексического разбора} Inform ( Tinf );
Ведущий модуль (продолжение 12) If KV =0 then Begin San (YV, Ksl, Tinf); {Выполнение блока синтаксического анализа} Inform ( Tinf ); If KV=0 Then Begin Yprava( YV, Par, Ksl, Tinf); {Выполнение блока управления} Inform ( Tinf ); End;
Ведущий модуль (продолжение 13) End; { With } MESINF. LINES. ADD ('Завершение работы управляющей программы'); END;
Ведущий модуль (окончание) Procedure TForm_VED. CMDEXITClick(Sender: TObject); Begin Close; End; Procedure TForm_VED. CMDHELPClick(Sender: TObject); { Метод, обеспечивающий помощь пользователю} Begin End; End.
Лексический разбор (Пример работы модуля)
Лексический разбор (конечный автомат)
Лексический разбор (таблица конечного автомата)
Лексический разбор (модуль в среде DELPHI) Procedure Lan (PVJA: String; {Программа на встроенном языке} Var YV: T_YV; {Управляющий вектор} Var Par: T_Par; {Вектор параметров} Var Ksl: Integer; {Количество расшифрованных слов ПВЯ} Var Tinf: Type. Tinf {Таблица информатора});
Лексический разбор (продолжение 1) Var Slov: Array[1. . 7] of String; {Терминальный словарь} Kts: Integer; {Количество элементов в терминальном словаре} Sost: Integer; {Состояние системы} Stroka: String; {Рабочие переменные} J, L, Nom, Ls, Ln: Integer;
Лексический разбор (продолжение 2) Begin With Tinf Do Begin PB: =1; Kv: =0; Ksl: =0; Kts: =7; Sost: =0;
Лексический разбор (продолжение 3) Slov[1]: = 'ВВОДД'; Slov[2]: = 'ВВОДК'; Slov[3]: = 'ТЕСТ'; Slov[4]: = 'ПРОСМ'; Slov[5]: = 'ВЕДОМ'; Slov[6]: = 'РАСП'; Slov[7]: = 'СОХР';
Лексический разбор (продолжение 4) J: =1; Ln: = Length (PVJA); While (J<=Ln) And (Kv=0) Do Begin Stroka: = Copy(PVJA, J, Ln-J+1); If Copy(Stroka, 1, 1) = ' ' Then J: =J+1 Else Begin Case Sost of
Лексический разбор (продолжение 5) 0: Begin {Поиск оператора} Ls: = 0; For L: = 1 to Kts Do Begin Nom: = Pos(Slov[L], Stroka); If Nom = 1 Then Begin Ksl: = Ksl + 1; YV[Ksl]: = L ; PAR[Ksl]: = '';
Лексический разбор (продолжение 6) Ls: = Length(Slov[L]); J: = J + Ls; Sost: = 1; End; If Ls = 0 Then {Оператор не найден} Kv: = 4; End;
Лексический разбор (продолжение 7) 1: Begin {Поиск разделителя} If Copy(Stroka, 1, 1) = '=' Then Begin Sost: = 2; J: = J + 1; End Else Kv: = 6; End;
Лексический разбор (продолжение 8) 2: Begin {Засылка параметра} If Copy(Stroka, 1, 1) = '; ' Then Begin Sost: = 0; J: = J + 1; End Else Begin Par[Ksl]: = Par[Ksl]+ Copy(Stroka, 1, 1); J: = J +1 ; End;
Лексический разбор (окончание) End; {Case} End; {Else} End; {While } If (Sost = 1) And (Kv = 0) Then KV: = 5; If (Sost = 2) And (Kv = 0) Then Kv: = 7; End; {With} End; {Procedure}
Модуль синтаксического анализа В зависимости от поставленной задачи блок синтаксического анализа обеспечивает следующие действия: üконтролирует соответствие управляющего вектора графу предметной области; üобеспечивает использование аппарата умолчания; üобеспечивает использование макрокоманд.
Модуль синтаксического анализа N_VER=1 YV 1 3 5 7 GPO 1 - 2 1 / 2 2 - 3 2 / 3 3 - 4 3 / 4 4 - 5 K_VER = 5
Модуль синтаксического анализа (DELPHI) Procedure San ( YV: T_YV; Ksl: Integer; Var Tinf: Type. Tinf) ; {Блок синтаксического анализа} Var GPO: Array[1. . 7, 1. . 2] of Integer; {Граф предметной области} N_VER: Integer; {Номер начальной вершины} K_VER: Integer; {Номер конечной вершины} I: Integer;
Модуль синтаксического анализа (продолжение 1) Begin With Tinf Do Begin PB: = 2; Kv: = 0;
Модуль синтаксического анализа (продолжение 2) {Загрузка ГПО} GPO[1, 1]: = 1; GPO[1, 2]: = 2; GPO[2, 1]: = 1; GPO[2, 2]: = 2; GPO[3, 1]: = 2; GPO[3, 2]: = 3; GPO[4, 1]: = 2; GPO[4, 2]: = 3; GPO[5, 1]: = 3; GPO[5, 2]: = 4; GPO[6, 1]: = 3; GPO[6, 2]: = 4; GPO[7, 1]: = 4; GPO[7, 2]: = 5;
Модуль синтаксического анализа (окончание) N_VER: = 1; K_VER: = 5; I: =1; WHILE (I<=KSL) and (KV=0) Do Begin If GPO[ YV[I], 1] = N_VER Then N_VER: = GPO[ YV[I], 2] Else Kv: = 8; I: = I+ 1; End; If (N_VER<>K_VER) AND (KV=0) Then KV: = 16; End; {WITH} End;
Модуль синтаксического анализа (аппарат умолчания) YV 1 (3) 5 7 GPO 1 - 2 1 2 2 …. 3 2 3 3 - 4 3 / 4 4 - 5
Фрагмент программного кода, реализующий аппарат умолчания If GPO [ YV [ I ] , 1 ] = N_VER Then N_VER : = GPO [ YV [ I ], 2 ] Else Begin {Ошибка в управляющем векторе} J: = 1; Key. D: = False; While (J <= 7) And (Key. D = False) Do Begin
( Продолжение программного кода) If (N_Ver = GPO[J, 1]) And (GPO[YV[I], 1] = GPO[J, 2]) Then {Найдена дуга, которая позволяет исправить управляющий вектор} Begin For K: = Ksl Down. To I Do YV[K+1]: =YV[K]; {Модификация управляющего вектора} YV[I]: =J; Key. D : =True; N_VER: = GPO[ YV[I], 2 ]; KSL : = KSL +1; End
( Продолжение 2) Else J: =J+1; End; {While J} If Key. D = False Then {Управляющий вектор исправить не удалось} Kv: = 8; End; {If} I: = I+ 1 ; End; {While I}
( Продолжение 3) If (N_VER <> K_VER) AND (KV = 0) Then Begin { Незавершенная программа на встроенном языке пакета} J: = 1; Key. D: = False; While (J <= 7) And (Key. D = False) Do Begin If (N_Ver=GPO[J, 1]) And (K_Ver = GPO[J, 2]) Then {Найдена дуга, которая позволяет исправить управляющий вектор}
( Продолжение 4) Begin KSL : = KSL +1; Yv[KSL]: =J; Key. D: = True; End Else J: =J+1; End; {While J}
( окончание программного кода) If Key. D = False Then {Управляющий вектор исправить не удалось} KV: = 16 ; End; {WITH} End; If N_Ver = GPO [7, 1] Then
Модуль синтаксического анализа (макрорасширения)
Пример формирования управляющего вектора из макрокоманды
Фрагмент программы, обеспечивающий реализацию макрокоманды Procedure San ( Var YV: T_YV; Var Ksl: Integer; Var Tinf: Type. Tinf) ; {Вариант модуля синтаксического анализа с использованием макрокоманд} Var GPO: Array[1. . 7, 1. . 2] of Integer; {Граф предметной области} N_VER: Integer; {Номер начальной вершины} K_VER: Integer; {Номер конечной вершины} I: Integer;
Фрагмент программы обеспечивающий реализацию макрокоманды (продолжение 1) {Описание таблицы макрокоманд} Macro_C: Array [1. . 30, 1. . 3] Of Integer; Nmac: Integer; {Количество строк в таблице макрокоманд} Key. D: Boolean;
Фрагмент программы обеспечивающий реализацию макрокоманды (продолжение 2) Begin With Tinf Do Begin PB: = 2; Kv: = 0; Nmac: =3; Macro_C[1, 1]: = 50; Macro_C[1, 2]: =1; Macro_C[1, 3]: =40; Macro_C[2, 1]: = 40; Macro_C[2, 2]: =30; Macro_C[2, 3]: =7; Macro_C[3, 1]: = 30; Macro_C[3, 2]: =3; Macro_C[3, 3]: =5;
Фрагмент программы обеспечивающий реализацию макрокоманды (продолжение 3) Key. D: =True; While Key. D Do Begin Key. D: = False; For I: = 1 To Ksl Do For J: = 1 To Nmac Do If Yv[I] = Macro_C[J, 1] Then Begin Key. D: = True; Im: = I; Jm: = J; End;
Фрагмент программы обеспечивающий реализацию макрокоманды (окончание) If Key. D Then Begin For K : = Ksl Down. To Im Do Yv[K+1]: = Yv[K]; Yv[Im]: = Macro_C[Jm, 2]; Yv[Im+1]: = Macro_C[Jm, 3]; Ksl: = Ksl+1; End; {Загрузка ГПО и остальной программный код блока синтаксического анализа} … End;
Модуль управления Procedure Yprava (YV: T_YV; Par: T_PAR; Ksl: Integer; Var Tinf: Type. Tinf); {Модуль управления} Var Parm: String; J, Kvo: Integer;
Модуль управления (продолжение 1) Procedure Vvodd (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для ввода информации с внешнего носителя} Begin Kvo: =0 ; End;
Модуль управления (продолжение 2) Procedure Vvodk (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для ввода с клавиатуры} Begin Kvo: =0 ; End;
Модуль управления (продолжение 3) Procedure TEST (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для тестирования информации} Begin Kvo: =0 ; End;
Модуль управления (продолжение 4) Procedure PROSM (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для просмотра информации} Begin Kvo: =0 ; End;
Модуль управления (продолжение 5) Procedure Vedom (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для получения ведомости} Begin Kvo: =0 ; End;
Модуль управления (продолжение 6) Procedure RASP (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для распечатки информации} Begin Kvo: =0 ; End;
Модуль управления (продолжение 7) Procedure Soxr (PARM: String; Var KVO: Integer); { Заглушка (STUB) обрабатывающей процедуры, предназначенной для сохранения информации} Begin Kvo: =0 ; End;
Модуль управления (продолжение 8) Begin With Tinf Do Begin PB: = 3; Kv: = 0; Kvo: = 0 ; For J: =1 to Ksl Do Begin Parm: = Par[J];
Модуль управления (продолжение 9) CASE YV [J] OF 1: Vvodd ( Parm, kvo); 2: Vvodk ( Parm, kvo); 3: Test ( Parm, kvo); 4: Prosm ( Parm, kvo); 5: Vedom ( Parm, kvo); 6: Rasp ( Parm, kvo); 7: Soxr ( Parm, kvo); End; {Case}
Модуль управления (окончание) if Kv < Kvo then Kv: = Kvo; End; {For} End; {With} End; {Procedure}
Информатор Procedure Inform (Tinf: Type. Tinf); { Блок информатора} Begin With Tinf Do Begin
Информатор (продолжение 1) Case PB Of 1: Begin MESINF. LINES. ADD('Выполнен лексический разбор'); Case Kv Of 0: MESINF. LINES. ADD('Нормальное завершение'); 4: MESINF. LINES. ADD('Оператор задан неверно');
Информатор (продолжение 2) 5: MESINF. LINES. ADD('Отсутствует ПВЯ после имени оператора'); 6: MESINF. LINES. ADD('Разделитель задан неверно'); 7: MESINF. LINES. ADD('Отсутствует символ конца оператора'); End;
Информатор (продолжение 3) 2: Begin MESINF. LINES. ADD('Выполнен синтаксический анализ'); Case Kv Of 0: MESINF. LINES. ADD('Нормальное завершение'); 8: MESINF. LINES. ADD('Неверный порядок операторов'); 16: MESINF. LINES. ADD('Программа не завершена'); End;
Информатор (окончание) 3: MESINF. LINES. ADD('Выполнились обрабатывающие процедуры'); End; { Case } End; { With } End;
Модуль помощи (HELP) Procedure TForm_VED. CMDHELPClick (Sender: TObject); { Метод, обеспечивающий помощь пользователю} Begin Lb. Help 1. Caption: = 'СТРУКТУРА ОПЕРАТОРА'; Lb. Help 2. Caption: = '<ИМЯ ОПЕРАТОРА>=<ПАРАМЕТР>; ';
Модуль помощи (HELP) (окончание) Lb. Help 1. Autosize: =True; Lb. Help 2. Autosize: =True; Lb. Help 1. Visible: = True; Lb. Help 2. Visible: = True; CMDPROCESS. Set. Focus; End;
Внутреннее проектирование и разработка программных средств.pptx