МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ ИЖЕВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ МЕТОДИЧЕСКИЕ УКАЗАНИЯ к выполнению лабораторных работ по курсу "Технология разработки и САПР программного обеспечения" для студентов 4 курса 7 семестра специальности 22.04 ИЖЕВСК 2000 . - 2 - Составитель: канд.экон.наук И.В.Килин УДК 681.3.06 Методические указания к выполнению лабораторных работ по курсу "Технология разработки и САПР программного обеспечения" для студентов 4 курса 7 семестра специальности 22.04. Состав. И.В.Килин. - Ижевск, 2000, 23 с. Методические указания содержат теоретический материал, рекомендации и задания для лабораторных работ по курсу "Техно- логия разработки и САПР программного обеспечения" и предназна- чены для студентов специальности 22.04 -"Программное обеспече- ние вычислительной техники и автоматизированных систем". Библиогр.: 4 назв. Печатается по решению редакционно-издательского совета Ижевского механического института . - 3 - ВВЕДЕНИЕ В методических указаниях приведены основные теоретические сведения, рекомендации и задания для выполнения трех лабора- торных работ, которые позволяют ознакомиться студентам с прог- раммами-генераторами программного обеспечения, разработать собственный вариант генератора, использовать для получения не только программной документации, но и любых других текстовых докуметов макрогенератор, а также разработать и отладить достаточно сложную программу совместной обработки четырех фай- лов, используя метод Варнье. Лабораторные работы дают возможность студентам оценить различные пути достижения главной цели программирования: соз- дание надежного и эффективного программного обеспечения в наи- более короткий срок. В первых двух лабораторных работах умень- шению количества ошибок и повышению производительности труда программистов способствует использование заранее отлаженных и тщательно проверенных фрагментов программ и документации: про- тотипов, шаблонов или макроопределений. В третьей лабораторной работе используется метод логического конструирования прог- рамм, основанный на теории множеств и математической логике и представляющий набор формализованных правил. . - 4 - 1. ЛАБОРАТОРНАЯ РАБОТА "ГЕНЕРАТОР ПРОГРАММ ОБРАБОТКИ МЕНЮ" 1.1. Цель работы Ознакомиться с генерацией исходного текста программ на языке высокого уровня, создать собственный вариант генератора программ обработки меню. 1.2. Методические указания по выполнению лабораторной ра- боты "Генератор программ обработки меню" 1.2.1. Структура программ обработки меню Использование меню в программировании делает программное обеспечение более удобным и приятным в работе, требует меньшей квалификации от пользователей, позволяет сравнительно просто объединять отдельные модули в пакеты программ. Большинство современных программных пакетов имеет развитые средства обра- ботки меню. Типичная программа обработки меню выполняет следующие действия: выдача меню на экран дисплея; ввод выбранного режима меню; выполнение программных действий, предусмотренных для данного режима (пункта) меню; возврат на выдачу меню или за- вершение программы. Меню состоит из отдельных пунктов, режимов, которые имеют соответствующие наименования или сообщения. Пункты меню могут быть пронумерованы и располагаться как по горизонтали, так и по вертикали. Выбор пункта меню может осуществляться путем ввода номера пункта или путем выделения пункта меню курсором или цветом. При выборе определенного пункта выполняется, как правило, соответствующая процедура. Если меню содержит несколько вло- женных уровней, то процедура обработки меню низшего уровня (подменю) строится по той же структуре, что и главная програм- ма. После выполнения процедуры обычно вновь выдается меню это- го же уровня и обработка повторяется. Для выхода из меню дан- ного уровня и перехода в меню высшего уровня или завершения программы предусматривается ввод номера пункта 0 или нажатие клавиши ESC. При попытке ввести номер пункта, отсутствующий в меню, выдается сообщение об ошибке. При выборе пункта меню клавишами управления курсором может быть организовано цикли- ческое движение по меню: при прямом движении по меню за последним пунктом следует первый, а при обратном движении за первым пунктом следует последний. 1.2.2. Генерация программ обработки меню Генерация программ представляет собой хорошее средство повышения производительности труда программистов, уменьшения количества ошибок, сокращения сроков разработки и внедрения программного обеспечения. В большинстве случаев используются специализированные генераторы, ориентированные на определенный класс программ, например, генераторы программ отчетов, ввода данных, обработки запросов. Генерация осуществляется путем объединения постоянных частей текста программы (шаблона или прототипа) с переменной информацией, задаваемой в заказе на генерацию. - 5 - Прототип программы может содержаться в отдельном файле или может быть размещен в тексте программы-генератора. В зака- зе на генерацию программы обработки меню необходимо указать для каждого пункта меню его наименование и имя процедуры, вы- зываемой при выборе этого пункта. Текст процедуры может быть помещен в генерируемую программу из библиотеки или из заказа на генерацию. При отсутствии готовой процедуры обработки одно- го пункта меню может автоматически генерироваться программная заглушка. Текст сгенерированной программы на языке программи- рования может быть подвергнут дополнительной доработке и кор- ректировке обычными средствами. 1.2.3. Пример генератора программ обработки меню В качестве основы для выполнения лабораторной работы предлагается вариант программы, генерирующий простейшие прог- раммы обработки меню. Программа GENMENU2 "Генератор программ обработки меню" написана на языке Паскаль (прил. 1), вводит с клавиатуры заказ на генерацию, использует два входных файла: "Библиотека макрорасширений" с текстами процедур обработки выбранного пункта меню (не реализовано, предусмотрено на даль- нейшее расширение функций генератора) и файл F.DAT, содержащий имена процедур и наименования предопределенных пунктов меню. В выходной файл (по умолчанию PROGMENU.PAS) записывается сгене- рированная программа. В начале выполнения программы запрашивается имя файла библиотеки макрорасширений (для ответа нажать клавишу ENTER) и имя файла для сгенерированной программы (расширение файла .PAS указывать обязательно). При вводе заказа на генерацию номера пунктов задаются программой, начиная с 1. Пункт номер 0 соответствует выходу из меню и генерируется автоматически. Сначала вводятся предопре- деленные (накопленные в результате разработки других программ) пункты меню из файла F.DAT, для чего необходимо указать номер записи файла. Завершение использования файла F.DAT - ввод но- мера 0. Затем вводятся данные с клавиатуры в две строки по каждому пункту меню: первая строка - имя процедуры и вторая строка - наименование пункта меню. Для завершения ввода необ- ходимо набрать 0 в качестве имени процедуры. В конце программы программы выдается сообщение о том, ку- да записана сгенерированная программа. 1.3. Порядок выполнения работы 1.3.1. Выполнить постановку задачи: в создаваемый генера- тор программ необходимо добавить не менее трех функций из предлагаемых для модификации генератора. 1.3.2. Взяв за основу простейший вариант программы-гене- ратора, скорректировать его с учетом постановки задачи. 1.3.3. Отладить полученный генератор таким образом, чтобы генерируемые программы выполнялись без дополнительной доработ- ки их текста. 1.3.4. Отчет по лабораторной работе содержит следующие разделы: постановка задачи; блок-схема программы-генератора; текст программы-генератора; контрольный пример должен отражать процесс генерации прог- - 6 - рамм; текст сгенерированной программы обработки меню; контрольный пример работы сгенерированной программы; заключение должно содержать описание обнаруженных ошибок в первоначальном варианте генератора и предложения по улучше- нию генератора программ обработки меню. 1.4. Задания Для расширения возможностей генератора програм обработки меню предлагается реализовать следующие дополнительные функ- ции, предусматривающие: 1. Создание многоуровневого меню. 2. Выбор варианта с помощью клавиш управления курсором и выделения цветом. 3. Сообщение об ошибочном ответе с задержкой. 4. Выдачу звуковых сигналов при ошибочных действиях и при выборе режима меню. 5. Использование библиотеки макрорасширений для хранения текстов процедур обработки режимов меню вместо программных заглушек. 6. Использование внешних процедур. 7. Настройку генератора перед работой (выбор цвета, вари- антов генерации и т.д.). 1.5. Контрольные вопросы 1. Что представляет собой процесс генерации программ? 2. Варианты программ обработки меню. 3. Практические примеры программ обработки меню. 4. Библиотеки макрорасширений и библиотеки модулей прог- рамм. . - 7 - 2. ЛАБОРАТОРНАЯ РАБОТА "МАКРОГЕНЕРАЦИЯ" 2.1. Цель работы Спроектировать несколько макроопределений и ознакомиться с использованием макрогенератора для получения исходного текста программ на языке высокого уровня, деловой и программ- ной документации, оценить работу предложенного макрогенерато- ра. 2.2. Методические указания по выполнению лабораторной ра- боты "Макрогенерация" 2.2.1. Процесс макрогенерации Макрогенерация расширяет возможности специализированных генераторов программ , ориентированных на определенный класс программ, например, генераторы программ отчетов, ввода данных, обработки запросов. Макрогенерация применяется в языках прог- раммирования типа ассемблеров и макроассемблеров и неявно присутствует в трансляторах с языков высокого уровня. В данной лабораторной работе макрогенератор используется для автомати- зированного получения любых текстов. Как обычно, генерация осуществляется путем объединения постоянных частей текста с переменной информацией, задаваемой в заказе на генерацию. От- личия макрогенератора от специализированных генераторов следу- ющие: весь текст располагается вне программы в библиотеке мак- роопределений (постоянная часть) или в заказе (переменная часть); в библиотеке может быть несколько макроопределений, каж- дое из которых имеет уникальное имя; переменные части указываются в макроопределении с помощью формальных параметров; в процессе макрогенерации можно использовать любое коли- чество макроопределений с заменой формальных параметров на соответствующие фактические, одно и то же макроопределение мо- жет вызываться несколько раз. Указанные особенности макрогенератора показывают, что он обладает большими возможностями по сравнению со специализиро- ванными генераторами. 2.2.3. Пример макрогенератора Программа MAKGEN2 "Макрогенератор" написана на языке Паскаль (прил. 2), использует два входных файла: "Библиотека макроопределений" (по умолчанию MACROLIB.DAT), второй файл - "Заказ на макрогенерацию"(по умолчанию DTABL.DAT). Сгенериро- ванный текст помещается в выходной файл (по умолчанию VYHOD.DAT), сообщения о работе программы выдаются на экран дисплея. В библиотеке макроопределений первая строка каждого мак- роопределения содержит латинскую букву "M", затем пробел и имя макроопределения, а последняя строка должна содержать только одну букву "M". Формальные параметры в макроопределении должны содержать амперсанд "&", за которым следует имя или номер. В заказе на макрогенерацию вызов макроопределения осу- - 8 - ществляется с помощью указания символа "$", за которым следует имя макроопределения. В следующих строках заказа устанавлива- ется соответствие между формальными и фактическими параметра- ми: в первой колонке указывается амперсанд "&", со второй ко- лонки - имя или номер формального параметра, с колонки номер 41 начинается фактический параметр, а в колонках 78-80 указы- вается его длина. В начале выполнения программы запрашивается имя файлов библиотеки макроопределений, результатов генерации и заказа. В процессе работы каждое макроопределение, имя которого встретилось в заказе, отыскивается в библиотеке макрорасшире- ний. Если поиск удачный, то производится замена формальных па- раметров на фактические и преобразованный текст макрорасшире- ния записывается в выходной файл. При неудачном поиске выда- ется сообщение "* В БИБЛИОТЕКЕ НЕТ ДАННЫХ ДЛЯ ЗАКАЗА". В конце программы программы выдается сообщение "* КОНЕЦ ПРОГРАММЫ, НАЖМИТЕ ENTER *". 2.3. Порядок выполнения работы 2.3.1. Разработать макроопределения трех типов: деловая документация, программная документация и программный текст. Определить параметры и описать макроопределения. 2.3.2. Создать и распечатать библиотеку макроопределений. 2.3.3. Сгенерировать и распечатать конкретные примеры де- ловой и программной документации. 2.3.4. Отладить макроопределение для программного текста таким образом, чтобы генерируемые программы выполнялись без дополнительной доработки их текста. 2.3.5. С целью изучения возможностей и обнаружения ошибок в макрогенераторе повторить макрогенерацию с различными ошиб- ками в заказе. 2.3.4. Отчет по лабораторной работе содержит следующие разделы: постановка задачи; описание макроопределений с параметрами; блок-схема для макроопределения программного текста; контрольный пример должен отражать процесс макрогенерации текстов, необходимо распечатать библиотеку макроопределений и заказ на макрогенерацию, полученные тексты, результаты работы сгенерированной программы; заключение должно содержать описание обнаруженных ошибок в макрогенераторе и предложения по устранению ошибок и улучше- нию работы макрогенератора. 2.4. Задания Разработать макроопределения для деловой документации: 1. Заявка для прохождения практики. 2. Справка с места учебы. 3. Служебная записка. 4. Заявление о приеме на работу. 5. Заявление об увольнении. 6. Заявление о переводе. 7. Заявление опредоставлении отпуска. 8. Служебное письмо-просьба. 9. Служебное письмо-ответ. 10. Приходный-расходный ордер. - 9 - 11. Приказ. 12. Выписка из протокола. Разработать макроопределения для программной докумен- тации (указать ссылку на соответствующий ГОСТ): 1. Назначение и условия применения. 2. Входные данные. 3. Выходные данные. 4. Сообщения. 5. Руководство программиста. 6. Руководство оператора. 7. Руководство системного программиста. 8. Технологическая инструкция. 9. Техническое задание. 10. Описание постановки задачи. 11. Описание архитектуры программного обеспечения. Разработать макроопределения для текстов программ: 1. Сортировка методом "пузырька". 2. Сортировка "выбором". 3. Сортировка методом "вставки". 4. Обработка двух основных файлов. 5. Обработка основного файла с файлом-справочником. 6. Поиск заданного элемента в массиве. 7. Печать с одним уровнем итогов. 8. Печать с двумя уровнями итогов. 9. Выборочное копирование файла. 10. Слияние отсортированных файлов. 2.5. Контрольные вопросы 1. Что представляет собой процесс макрогенерации? 2. Макрогенерация в ассемблерах. 3. Практические примеры возможных областей применения макрогенерации. 4. Библиотеки макроопределений и библиотеки модулей прог- рамм. 5. Позиционные и ключевые параметры. . - 10 - 3. ЛАБОРАТОРНАЯ РАБОТА "ИСПОЛЬЗОВАНИЕ МЕТОДА ВАРНЬЕ ДЛЯ ПРОГРАММИРОВАНИЯ СОВМЕСТНОЙ ОБРАБОТКИ ЧЕТЫРЕХ ФАЙЛОВ" 3.1. Цель работы Ознакомиться с основными положениями метода Варнье, рассмотреть особенности обработки нескольких последовательных файлов, спроектировать и отладить программу совместной обра- ботки четырех файлов с использованием метода Варнье. 3.2. Методические указания к лабораторной работе 3.2.1. Основные определения Файл представляет собой совокупность данных о некотором множестве субъектов или объектов. Запись файла содержит дан- ные, относящиеся к одному и тому же субъекту или объекту. В предметной области субъекты или объекты распознаются по своим характеристикам и могут быть выделены в ней. Для различения записей файла используются поля (реквизиты) записи, которые называются ключевыми. Ключом (идентификатором) записи будем называть поле или совокупность полей, позволяющих идентифици- ровать запись или группу нескольких записей одного типа. Обычно конкретное значение ключа записи определяет одну, уникальную запись, но в некоторых файлах для одного значения ключа может быть группа из нескольких записей: дубликаты или мультитплет. Если согласно постановке задачи дубликаты могут быть, то необходимо определить, каким образом их обрабатывать: первую запись группы, последнюю запись группы, выдать сообще- ние об ошибке или использовать все данные группы, например, суммировать некоторые поля. Упорядочение записей файлов производится по возрастанию или убыванию некоторых управляющих полей записей файлов. Ключ сортировки файла - это иерархическая совокупность полей записи, используемая для сортировки. В программах сов- местной обработки файлов важную роль играет выбор ключевых по- лей, согласованность ключевых признаков, правильное определе- ние их иерархии - непременное условие эффективности обработки данных. В простейших случаях ключ записи и ключ сортировки совпа- дают, но часто при разработке программ может оказаться, что ключ сортировки не соответствует требованиям обработки, тогда может потребоваться дополнительная пересортировка файла. Ключ записи может содержать поля, присутствие которых не имеет ни- какого значения для данной программы или в нем могут отсутствовать некоторые поля, по которым должны стыковаться файлы. Таким образом, понятий ключа записи и ключа сортировки оказывается недостаточно для проектирования программ, поэтому введем следующие определения. Ключ обработки - это иерархическая совокупность полей, по которым производится совместная обработка файлов. Каждый из ключевых реквизитов обработки присутствует хотя в одном вход- ном файле. Базовый ключ представляет собой текущее значение ключа обработки. Иначе говоря, базовый ключ содержит значения ключе- вых полей, для которых производится в данный момент обработка. Допустим, ключи файлов A, B, C, D состоят из одного поля, - 11 - файлы отсортированы по возрастанию ключей, которые имеют сле- дующие значения (табл. 1). Таблица 1 Значения ключей файлов ┌───────────────────┐ │ Ф А Й Л Ы │ ├────┬────┬────┬────┤ │ A │ B │ C │ D │ ├────┼────┼────┼────┤ │ 1 │ 1 │ 1 │ 1 │ │ 2 │ 2 │ 2 │ 3 │ │ 3 │ 3 │ 5 │ 5 │ │ 4 │ 4 │ 5 │ 7 │ │ 5 │ 9 │ 9 │ 9 │ │ 6 │ 10 │ 10 │ 11 │ │ 7 │ 11 │ 13 │ 13 │ │ 8 │ 12 │ 14 │ 15 │ └────┴────┴────┴────┘ Из таблицы 1 видно, что любой из четырех файлов не содер- жит полный набор значений ключа обработки, поэтому в каждый текущий момент работы программы должна выполняться обработка записей из тех файлов, которые имеют наименьшее значение клю- ча, т.е. bk=min(ki), где bk - базовый ключ, ki - текущее значение ключа i-го файла. Перечислим все значения базового ключа (табл. 2) и отме- тим знаком "Х" наличие данного значения в соответствующем фай- ле. Таблица 2 Значения базового ключа ┌───────┬───────────────┐ │БАЗОВЫЙ│ НАЛИЧИЕ │ │ КЛЮЧ │ В ФАЙЛАХ │ │ ├───┬───┬───┬───┤ │ │ A │ B │ C │ D │ ├───────┼───┴───┴───┴───┤ │ 2 │ Х Х Х │ │ 3 │ Х Х Х │ │ 4 │ Х Х │ │ 5 │ Х Х Х │ │ 6 │ Х Х │ │ 7 │ Х Х │ │ 8 │ Х │ │ 9 │ Х Х Х │ │ 10 │ Х Х │ │ 11 │ Х Х │ │ 12 │ Х │ │ 13 │ Х Х │ │ 14 │ Х │ │ 15 │ Х │ └───────┴───────────────┘ Изучение таблицы значений базового ключа позволяет сде- лать следующие выводы: - 12 - множество возможных значений базового ключа равно объеди- нению множеств значений ключей всех файлов, участвующих в об- работке; комбинация, когда для какого-то значения базового ключа отсутствуют записи во всех файлах является невозможной (запре- щенной); для n файлов максимально возможное число различных комби- наций сочетания ключей равно 2 в степени n минус 1. 3.2.2. Проектирование совместной обработки файлов Структуру программы совместной обработки любого числа входных файлов разберем, используя метод Варнье (метод логи- ческого конструирования программ). На первом уровне струк- тура программы содержит повторную обработку базового ключа, которая выполняется, пока не закончатся все входные файлы. Об- работка одного значения базового ключа (второй уровень разбие- ния программы) заключается в выполнении трех этапов: выбор базового ключа; основная обработка; чтение файлов. Эти три этапа так или иначе присутствуют в программах совместной обработки файлов, только программируются они раз- личными способами в зависимости от применяемого метода. Для определения значений базового ключа необходимо выб- рать наименьший из ключей всех файлов в случае сортировки фай- лов по возрастанию ключей. Выбор базового ключа - это сложная альтернативная структура: сначала сравниваются ключи двух фай- лов и минимальный из них присваивается базовому ключу, затем ключи остальных файлов поочередно сравниваются с базовым клю- чом. Количество альтернатив, которые необходимо запрограммиро- вать для выбора базового ключа, равно числу входных файлов ми- нус один. В тексте исходной программы выбор базового ключа представляет собой последовательность операторов ветвления: IF KLA < KLB THEN BKL:=KLA ELSE BKL:=KLB; IF KLC < BKL THEN BKL:=KLC; IF KLD < BKL THEN BKL:=KLD; Для проектирования этапа основной обработки необходимо составить таблицу истинности (таблицу решений с ограниченным входом), в которой перечисляются в качестве аргументов все комбинации сочетания ключей, а функциями являются действия, которые должны выполняться для получения выходных результатов. Каждому значению базового ключа соответствует наличие или отсутствие записи во входном файле, т.е. наличие значения ба- зового ключа в каждом из файлов является булевой (логической) переменной, которая принимает два значения - истинно (1) или ложно (0). Определить значение этой переменной можно путем сравнения текущего значения ключа файла и базового ключа. Воз- можные комбинации наличия ключей удобно перечислять с помощью двоичных чисел, отводя для каждого файла один разряд. Для n двоичных разрядов существует 2^n различных чисел. Нулевой ми- нитерм, т.е. отсутствие записей для данного базового ключа во всех файлах является невозможным (запрещенным) и отмечается специальным знаком пустого множества в этой строке таблицы - 13 - истинности для всех действий. Для каждой из оставшихся 2^n-1 строк определяются требуемые действия, которые отмечаются зна- ком "Х" в соответствующем столбце таблицы истинности. После минимизации таблицы истинности вручную или с использованием программы минимизации таблиц решений получаются упрощенные логические выражения в дизъюнктивной нормальной форме, позволяющие оптимальным образом построить логическую структуру этапа основной обработки. Уменьшение количества пре- дикатов в тексте программы повышает ее быстродействие. Основ- ная обработка представляет собой древовидную, сложную или ком- бинированную альтернативную структуру, в ветвях которой разме- щаются команды выполнения действий или операторы вызова соот- ветствующих подпрограмм. В обработке нескольких файлов большое значение имеет пра- вильное расположение команд ввода (чтения файлов). Кроме обыч- ного для метода логического конструирования программ располо- жения команд ввода первых записей всех файлов в логической последовательности "НАЧАЛО ПРОГРАММЫ", существует специальное правило расположения команд ввода: команда ввода записи файла, как правило, располагается в той логической последователь- ности, где заканчивается использование для обработки записи данного файла. Легко можно найти логическую последовательность для размещения команды чтения одного файла - это последняя корневая ветвь основной обработки. Для остальных файлов прог- раммируются дополнительные альтернативы, в которых чтение соответствующего файла выполняется, если ключ файла равен ба- зовому ключу; вторая ветвь альтернативы - пустая. Например, для программы обработки четырех файлов команда чтения одного из файлов (допустим, А) размещена в конце основной обработки, тогда альтернативы для чтения остальных файлов могут быть за- писаны следующим образом: IF KLB = BKL THEN CHTENB; IF KLC = BKL THEN CHTENC; IF KLD = BKL THEN CHTEND; Таким образом, основными этапами логического конструиро- вания программ совместной обработки n файлов являются: программирование n-1 альтернативы для выбора базового ключа; составление и минимизация таблицы истинности для програм- мируемых действий; составление по полученным логическим выражениям для действий логической структуры основной обработки; программирование n-1 альтернативы для размещения команд чтения файлов. Проведенный анализ и опыт использования логического конструирования программ для совместной обработки файлов поз- воляют сформулировать следующие правила, которые помогут избе- жать некоторых ошибок и повысить эффективность программ: 1). При минимизации логических выражений для действий склевать клетки таблицы решений необходимо только один раз, в противном случае соответствующее действие в программе может выполниться неоднократно. 2). Первую альттернативу основной обработки можно сов- местить с последней альтернативой выбора базового ключа, зап- рограммировав ее надлежащим образом, например, - 14 - IF KLD <= BKL THEN BEGIN BKL:=KLD; (* НАЧАЛО ВЕТВИ D ОСНОВНОЙ ОБАБОТКИ *) ... 3). В случае двух входных файлов выбор базового ключа и альтернативу для чтения одного из файлов можно явно не выде- лять, а совмещать с основной обработкой. 4). Файл может быть обработан в данном модуле, если все или старшие ключевые реквизиты файла совпадают с ключом обра- ботки. 3.3. Порядок выполнения работы 3.3.1. Разработать таблицу решений для этапа основной об- работки, минимизировать логические выражения для действий. 3.3.2. Записать в виде диаграмм Варнье структуру данных выхода, структуру данных полного входа и структуру программы в логических последовательностях. 3.3.3. Написать, отладить программу и получить контроль- ный пример, проверяющий все варианты обработки. 3.3.4. Отчет по лабораторной работе содержит следующие разделы: постановка задачи; таблица решений для основной обработки; диаграммы Варнье, описывающие структуру данных выхода, структуру данных полного входа и структуру программы в логи- ческих последовательностях; блок-схема программы в логических последовательностях; текст программы; контрольный пример. 3.4. Задания Совместная обработка файлов, рассматриваемая в данной ла- бораторной работе соответствует задаче оперативного учета де- талей, материалов и т.п. На входе используются фаайлы, содер- жащие данные об остатках, приходе и расходе деталей. Четвертый файл является справочным или содержит данные об остатках, по- лученных в результате инвентаризации, или содержит значения ключевых реквизитов удаляемых записей. На выходе необходимо получить следущие результаты: скорректированнный файл учета; машинограмму учета движения деталей; машинограмму ошибок, где содержаться сведения о деталях с отрицательными остатками и отсутствующих в справочнике. Спроектированную таблицу решений для основной обработки согла- совать с преподавателем. В ней предусмотреть возможность выво- да в скорректированный файл учета новых записей с неотрицатель- ными остатками. В контрольном примере предусмотреть проверку всех ветвей обработки. Данные в файлах должны соответствовать предметной области. 3.4.1. Структуры записей: 1). Деталь, остаток, приход, расход; 2). Счет, остаток вклада, приход, расход; 3). Фирма, количество акций, покупка, продажа; 4). Материал, остаток, поступление, выдача; 5). Тара, количество в наличии, поступление, возврат; 6). Изделие, запас в магазине, получение, продажа; 7). Вторичные ресурсы, остаток, отправлено на переработ- - 15 - ку, принято; 8). Код ткани, наличие в ателье, получено, использовано; 9). Код ЗИП, наличие на складе, получено, выдано; 10). Код инструмента, остаток, получено, выдано. 3.4.2. Количество записей по ключу: 1). приход - одна, расход - несколько; 2). приход - несколько, расход - одна; 3). приход - несколько, расход - несколько. 3.4.3. Четвертый файл: 1). Справочник наименований. 2). Инвентаризация. 3). Аннулируемые детали. 4). Брак, списано, потери, хищения. 3.5. Контрольные вопросы 1. Понятие ключа файла, ключа обработки, базового ключа. 2. Этапы совместной обработки нескольких последовательных файлов. 3. Выбор базового ключа. 4. Ввод данных при совместной обработке файлов. 5. Минимизация логических выражений для действий и струк- тура основной обработки. ЛИТЕРАТУРА 1. Кастеллани К. Автоматизация решения задач управления: Пер. с франц. - М.: Мир, 1982. 2. Кинг Д. Создание эффективного программного обеспече- ния. - М.: Мир, 1991. 3. Фаронов В.В. Турбо Паскаль. Книга 1. Основы Турбо Паскаля. - М.: МВТУ - ФЕСТО ДИДАКТИК, 1992. 4. Язык описания данных КОДАСИЛ / Пер. с англ. - М.: Ста- тистика, 1981. . - 16 - Приложение 1 (* -- ГЕНЕРАЦИЯ ПРОГРАММ ВЫДАЧИ МЕНЮ -- *) (* -- ТРЕТЬЯКОВА О.В. ГР. 4-19-2 05.06.90 -- *) program genmenu(f,input,output,vyh); (* -- ИЗ input ВВОДЯТСЯ НОМЕРА ВЫБИРАЕМЫХ ИЗ F ПРОЦЕДУР --*) label 10; const n=30; type tz=record a:integer; b:string[8] end; var z:tz; f,vyh,MACROLIB:text; IMFILBIB,IMFILVYH,imvyh:string; i,j,v:integer; m:array [1..n] of string[8]; SOOB: ARRAY [1..N] OF STRING[78]; REGIM:STRING[78]; k:array [1..n] of integer; PROCEDURE OPROC(B:STRING); (* ОПИСАНИЕ ПРОЦЕДУРЫ *) BEGIN writeln(vyh,'PROCEDURE ',b,';'); writeln(vyh,'BEGIN'); writeln(vyh, WRITELN('' ---- РАБОТАЕТ ПРОЦЕДУРА ',B,''');'); writeln(vyh,'END; (* ',B,' *)'); END; (* OPROC *) begin writeln('ГЕНЕРАТОР ПРОГРАММ МЕНЮ.'); WRITELN('ВВЕДИТЕ ИМЯ ФАЙЛА:'); WRITELN(' БИБЛИОТЕКИ МАКРОРАСШИРЕНИЙ'); READLN(IMFILBIB); IF LENGTH(IMFILBIB)<>0 THEN ASSIGN(MACROLIB,IMFILBIB) ELSE ASSIGN(MACROLIB,'MACROLIB.DAT'); WRITELN(' РЕЗУЛЬТАТОВ ГЕНЕРАЦИИ'); READLN(IMFILVYH); IF LENGTH(IMFILVYH)=0 THEN IMFILVYH:='PROGMENU.PAS'; ASSIGN(VYH,IMFILVYH); (* writeln('КУДА ЗАПИСЫВАТЬ СГЕНЕРИРОВАННУЮ ПРОГРАММУ?'); readln(imvyh); assign(vyh,imvyh); *) rewrite(vyh); assign(f,'f.dat'); writeln(vyh,'(* -- СГЕНЕРИРОВАННАЯ ПРОГРАММА --*)'); writeln(vyh,'PROGRAM MENU(INPUT,OUTPUT);'); writeln(vyh,'VAR VYBOR:INTEGER;'); with z do begin i:=1; writeln('ВВЕДИТЕ НОМЕРА ПРОЦЕДУР ИЗ ФАЙЛА F.DAT'); WRITELN('ДЛЯ ',I,'.'); readln(v); while v<>0 do begin reset(f); a:=0; if not eof(f) then readln(f,a,b); - 17 - while not eof(f) and (v<>a) do BEGIN READ(F,A); readln(f,b,REGIM); END; if v=a then begin OPROC(B); M[I]:=B; K[I]:=I; SOOB[I]:=REGIM; I:=I+1; END; WRITELN('ДЛЯ ',I,'.'); readln(v); END; (* ВВОД ИМЕНИ ПП И РЕЖИМА С КЛАВИАТУРЫ *) WRITELN('ВВОДИТЕ ИМЯ ПРОЦЕДУРЫ (КОНЕЦ = 0)'); WRITELN('В СЛЕДУЮЩЕЙ СТРОКЕ - СООТВЕТСТВУЮЩИЙ РЕЖИМ МЕНЮ'); REPEAT WRITELN('ДЛЯ ',I,'. '); READLN(B); IF B<>'0' THEN BEGIN READLN(REGIM); K[I]:=I; M[I]:=B; SOOB[I]:=REGIM; OPROC(B); I:=I+1; END; UNTIL B='0'; I:=I-1; writeln(vyh,' BEGIN'); writeln(vyh,' VYBOR:=1;'); writeln(vyh,' WHILE VYBOR<>0 DO'); writeln(vyh,' BEGIN'); writeln(vyh,' WRITELN;'); writeln(vyh,' WRITELN(''ПРОГРАММА MENU'');'); for j:=1 to i do writeln(vyh, ' WRITELN(''',j,'. ',SOOB[J],' (',m[j],')',''');'); writeln(vyh,' WRITELN(''0. ВЫХОД'');'); writeln(vyh,' WRITELN;'); writeln(vyh,' READ(VYBOR);'); writeln(vyh,' CASE VYBOR OF'); for j:=1 to i do begin write(vyh,' ',k[j],': ',m[j]:6); if j<>i then writeln(vyh,';') else begin writeln(vyh); writeln(vyh,' END;') end; end; writeln(vyh,' END;'); 10: writeln(vyh,'END.') end; WRITELN('СГЕНЕРИРОВАННАЯ ПРОГРАММА ЗАПИСАНА В ФАЙЛ ', IMFILVYH); close(vyh) end. . - 18 - Приложение 2 (* -- МАКРОГЕНЕРАТОР -- *) (* -- ТЮТРЮМОВА О.В. ГР. 4-15-2 06.06.90 -- *) PROGRAM MAKGEN(BIB,TABL,F); LABEL 1,2,3,4,7,8,9; VAR IMPAR:ARRAY[1..30] OF CHAR; (* ИМЯ & *) IMFILBIB,IMFILVYH,IMFILZAK:STRING; ITABL,IBIB:ARRAY[1..80] OF CHAR; (* ИМЯ ЗАКАЗА И МАКРО *) DL:ARRAY[1..20] OF INTEGER; (* ДЛИНА ФАКТ ПАРАМЕТРА *) FORM:ARRAY[1..20,1..39] OF CHAR; (* ФОРМ ПАРАМЕТРЫ *) FACT:ARRAY[1..20,41..78] OF CHAR; (* ФАКТ ПАРАМЕТРЫ *) FIXBIB,KOLZN,KOLSTR,I,C,K,FIXTAB,KOLOBR,PR: INTEGER; X,Y,ZNAK: CHAR; BIB,TABL,F:TEXT; (* *) PROCEDURE ZAPIS; BEGIN KOLZN:=DL[C]; FOR K:=41 TO (41+KOLZN) DO WRITE(F,FACT[C,K]) END; (* ZAPIS *) (* *) PROCEDURE ZAMENA; LABEL 2,3; VAR PROV: INTEGER; BEGIN (* ЧТЕНИЕ ИМЕНИ & *) FIXBIB:=0; I:=1; READ(BIB,Y); PR:=1; WHILE NOT EOF(BIB) AND NOT (Y IN [':','.',' ',',',#13,';','!']) DO BEGIN IMPAR[I]:=Y; (* WRITE(Y); *) READ(BIB,Y); FIXBIB:=I; I:=I+1 END; IF (EOF(BIB) AND (FIXBIB=0)) THEN BEGIN PR:=0; WRITELN('* БИБЛИОТЕКА ЗАКОНЧИЛАСЬ, ИМЯ НЕ ПРОЧИТАНО *'); GOTO 2 END ELSE ZNAK:=Y; (* РАБОТА С СОЗДАННЫМ МАССИВОМ *) C:=1; (* ПРОВЕРКА ПО ПЕРВОМУ СИМВОЛУ *) 3: WHILE (C<=KOLSTR) AND (FORM[C,3]<>IMPAR[1]) DO C:=C+1; IF C>KOLSTR THEN BEGIN WRITE(F,'&'); WRITE('&'); FOR I:=1 TO FIXBIB DO BEGIN WRITE(F,IMPAR[I]); WRITE(IMPAR[I]); END; WRITELN(' - НЕТ ФАКТИЧЕСКОГО ПАРАМЕТРА'); - 19 - (* WRITELN; *) GOTO 2 END; PROV:=1; IF FIXBIB>1 THEN BEGIN K:=4; I:=2; (* НАЧАТА ПРОВЕРКА СЛЕД. СИМВОЛОВ *) WHILE (FORM[C,K]=IMPAR[I]) AND (I<=FIXBIB) DO BEGIN K:=K+1; PROV:=I; I:=I+1 END END; IF FIXBIB=PROV THEN ZAPIS ELSE BEGIN C:=C+1; GOTO 3 END; 2: WRITE(F,ZNAK); END; (* ZAMENA *) (* *) PROCEDURE POISK; LABEL 5,6; BEGIN PR:=1; 5: WHILE NOT EOF(BIB) AND (Y<>'M') DO READLN(BIB,Y); IF EOF(BIB) THEN BEGIN PR:=0; GOTO 6 END; IF Y='M' THEN (* ??? *) 6: END; (* POISK *) PROCEDURE IMIAMAK; BEGIN WRITE(' '); FOR I:=1 TO FIXTAB DO WRITE(ITABL[I]); END; (* IMIAMAK *) BEGIN (* НАЧАЛО ПРОГРАММЫ *) WRITELN; writeln('МАКРОГЕНЕРАТОР.'); WRITELN('ВВЕДИТЕ ИМЯ ФАЙЛА:'); WRITELN(' БИБЛИОТЕКИ МАКРОРАСШИРЕНИЙ'); READLN(IMFILBIB); IF LENGTH(IMFILBIB)=0 THEN BEGIN IMFILBIB:='MACROLIB.DAT'; WRITELN(IMFILBIB); END; ASSIGN(BIB,IMFILBIB); (* БИБЛИОТЕКА МАКРО *) RESET(BIB); WRITELN(' РЕЗУЛЬТАТОВ ГЕНЕРАЦИИ'); READLN(IMFILVYH); IF LENGTH(IMFILVYH)=0 THEN BEGIN - 20 - IMFILVYH:='VYHOD.DAT'; WRITELN(IMFILVYH); END; ASSIGN(F,IMFILVYH); (* ВЫХОДНОЙ ФАЙЛ *) REWRITE(F); WRITELN(' ЗАКАЗА'); READLN(IMFILZAK); IF LENGTH(IMFILZAK)=0 THEN BEGIN IMFILZAK:='DTABL.DAT'; WRITELN(IMFILZAK); END; ASSIGN(TABL,IMFILZAK); (* РАБОТА С ЗАКАЗОМ *) RESET(TABL); READ(TABL,X); 7: WHILE NOT EOF(TABL) AND (X<>'$') DO READLN(TABL,X); IF EOF(TABL) THEN BEGIN WRITELN('* ОТСУТСТВИЕ ЗАКАЗА *'); GOTO 4 END; (* ЗАПОМИНАНИЕ ИМЕНИ ЗАКАЗА *) READ(TABL,X); I:=1; WHILE NOT EOF(TABL) AND (X<>#32) AND (X<>#13) DO BEGIN ITABL[I]:=X; READ(TABL,X); FIXTAB:=I; I:=I+1 END; (* ЗАПИСЬ ЗАКАЗА В МАССИВ *) C:=1; READ(TABL,X); READ(TABL,X); WHILE NOT EOF(TABL) AND (X<>'$') DO BEGIN FORM[C,1]:=X; FOR K:=2 TO 40 DO READ(TABL,FORM[C,K]); FOR K:=41 TO 78 DO READ(TABL,FACT[C,K]); READLN(TABL,DL[C]); C:=C+1; KOLSTR:=C+1; READ(TABL,X) END; (* ПОИСК ИМЕНИ В БИЛИОТЕКЕ BIB *) (* ПРОВЕРКА ДВУХ ПЕРВЫХ СИМВОЛОВ *) RESET(BIB); 8: IF NOT EOF(BIB) THEN READ(BIB,Y) ELSE BEGIN IMIAMAK; WRITELN('* В БИБЛИОТЕКЕ НЕТ ДАННЫХ ДЛЯ ЗАКАЗА'); GOTO 4 END; IF Y='M' THEN BEGIN 9: IF NOT EOF(BIB) THEN READ(BIB,Y) ELSE GOTO 4; IF Y<>' ' THEN - 21 - BEGIN POISK; IF PR=0 THEN GOTO 4; (* ПРИ ПОИСКЕ НАЙДЕН СИМВОЛ М, ИДЕМ НА ПРОВЕРКУ СЛЕД.СИМВОЛА*) GOTO 9 END; END; (* ЧТЕНИЕ И ЗАНЕСЕНИЕ ИМЕНИ В МАССИВ *) I:=1; IF NOT EOF(BIB) THEN READ(BIB,Y) ELSE GOTO 4; WHILE NOT EOF(BIB) AND (Y<>#32) AND (Y<>#13) DO BEGIN IBIB[I]:=Y; READ(BIB,Y); FIXBIB:=I; I:=I+1 END; IF EOF(BIB) THEN GOTO 4; (* СРАВНЕНИЕ ИМЕН *) I:=1; IF FIXBIB=FIXTAB THEN BEGIN WHILE (ITABL[I]=IBIB[I]) AND (I<=FIXTAB) DO I:=I+1; IF I>FIXTAB THEN BEGIN (* ВЫПОЛНЕНИЕ ЗАМЕНЫ *) IMIAMAK; WRITELN(' - НАЧАЛО ОБРАБОТКИ МАКРО'); KOLOBR:=0; 1: IF NOT EOF(BIB) THEN READ(BIB,Y); WHILE NOT EOF(BIB) AND NOT EOLN(BIB) AND (Y<>'&') DO BEGIN WRITE(F,Y); READ(BIB,Y) END; IF EOF(BIB) THEN GOTO 4; IF EOLN(BIB) THEN BEGIN IF Y='M' THEN BEGIN READ(BIB,Y); (* ПРОВЕРКА КОНЦА *) WRITE(F,Y); IF (Y=' ') OR (Y=#13) THEN BEGIN WRITELN('КОНЕЦ МАКРО С ДАННЫМ ИМЕНЕМ.'); READLN(BIB); GOTO 4 END END ELSE BEGIN WRITE(F,Y); GOTO 1 END END; IF Y='&' THEN BEGIN KOLOBR:=KOLOBR+1; ZAMENA; IF PR=0 THEN GOTO 4 - 22 - ELSE GOTO 1 END; END ELSE BEGIN (* НЕСОВПАДЕНИЕ ИМЕН *) IF EOF(BIB) THEN GOTO 4 ELSE BEGIN READLN(BIB,Y); POISK; GOTO 8 END; END; END ELSE BEGIN (* ПОИСК КОНЦА МАКРО *) (* НЕСОВПАДЕНИЕ ИМЕН-КОЛ СИМВОЛОВ *) READLN(BIB,Y); POISK; GOTO 8 END; 4: IF NOT EOF(TABL) THEN GOTO 7; CLOSE(F); CLOSE(BIB); CLOSE(TABL); WRITELN('* КОНЕЦ ПРОГРАММЫ, НАЖМИТЕ ENTER *'); READLN; END. . - 23 - СОДЕРЖАНИЕ ВВЕДЕНИЕ 3 1. ЛАБОРАТОРНАЯ РАБОТА "ГЕНЕРАТОР ПРОГРАММ ОБРАБОТКИ МЕНЮ" 4 1.1. Цель работы 4 1.2. Методические указания по выполнению лабораторной работы 4 1.2.1. Структура программ обработки меню 4 1.2.2. Генерация программ обработки меню 4 1.2.3. Пример генератора программ обработки меню 4 1.3. Порядок выполнения работы 5 1.4. Задания 6 1.5. Контрольные вопросы 6 2. ЛАБОРАТОРНАЯ РАБОТА "МАКРОГЕНЕРАЦИЯ" 7 2.1. Цель работы 7 2.2. Методические указания по выполнению лабораторной 7 2.2.1. Процесс макрогенерации 7 2.2.3. Пример макрогенератора 7 2.3. Порядок выполнения работы 8 2.4. Задания 8 2.5. Контрольные вопросы 9 3. ЛАБОРАТОРНАЯ РАБОТА "ИСПОЛЬЗОВАНИЕ МЕТОДА ВАРНЬЕ ДЛЯ 10 3.1. Цель работы 10 3.2. Методические указания к лабораторной работе 10 3.2.1. Основные определения 10 3.2.2. Проектирование совместной обработки файлов 12 3.3. Порядок выполнения работы 14 3.4. Задания 14 3.5. Контрольные вопросы 15 ЛИТЕРАТУРА 15 Приложение 1 16 Приложение 2 18 Игорь Викторович Килин МЕТОДИЧЕСКИЕ УКАЗАНИЯ к выполнению лабораторных работ по курсу "Технология разработки и САПР программного обеспечения" для студентов 4 курса 8 семестра специальности 22.04 Подписано в печать 00.00.00. Формат 60х84/16. Бумага писчая. Плоская печать. Усл.печ.л.0,00. Уч.изд.л.0,00. Тираж 100 экз. Заказ Бесплатно. Редакционно-издательский отдел Ижевского механического инсти- тута. Адрес института и ротапринта: 426069,Ижевск,Студенческая ул.,7. - 24 -