- 9 - 2. ЛАБОРАТОРНАЯ РАБОТА "СОВМЕСТНАЯ ОБРАБОТКА ДВУХ ФАЙЛОВ" 2.1. Цель работы Ознакомиться с понятиями ключа обработки и базового клю- ча, рассмотреть особенности обработки нескольких последова- тельных файлов, спроектировать и отладить программу совместной обработки двух файлов. 2.2. Методические указания к лабораторной работе 2.2.1. Основные определения Файл представляет собой совокупность данных о некотором множестве субъектов или объектов. Запись файла содержит дан- ные, относящиеся к одному и тому же субъекту или объекту. В предметной области субъекты или объекты распознаются по своим характеристикам и могут быть выделены в ней. Для различения записей файла используются поля (реквизиты) записи, которые называются ключевыми. Ключом (идентификатором) записи называ- ется поле или совокупность полей, позволяющих идентифицировать запись или группу нескольких записей одного типа. Обычно конкретное значение ключа записи определяет одну, уникальную запись, но в некоторых файлах для одного значения ключа может быть группа из нескольких записей ( дубликаты или мультитплет. Если согласно постановке задачи дубликаты могут быть, то необходимо определить, каким образом их обрабатывать: первую запись группы, последнюю запись группы, выдать сообще- ние об ошибке или использовать все данные группы, например, суммировать некоторые поля. Упорядочение записей файлов производится по возрастанию или убыванию некоторых управляющих полей записей файлов. Ключ сортировки файла - это иерархическая совокупность полей записи, используемая для сортировки. В простейших случаях ключ записи и ключ сортировки совпа- дают, но часто при разработке программ может оказаться, что ключ сортировки не соответствует требованиям обработки, тогда может потребоваться дополнительная пересортировка файла. Ключ записи может содержать поля, присутствие которых не имеет ни- какого значения для данной программы или в нем могут отсутствовать некоторые поля, по которым должны стыковаться файлы. Таким образом, понятий ключа записи и ключа сортировки оказывается недостаточно для проектирования программ, поэтому введем определения ключа обработки и базового ключа. Ключ обработки - это иерархическая совокупность полей, по которым производится совместная обработка файлов. Каждый из ключевых реквизитов обработки присутствует хотя в одном вход- ном файле. Базовый ключ представляет собой текущее значение ключа обработки. Иначе говоря, базовый ключ содержит значения ключе- вых полей, для которых производится в данный момент обработка. Если файлы отсортированы по возрастанию ключей, то в каж- дый текущий момент работы программы должна выполняться обра- - 10 - ботка записей из тех файлов, которые имеют наименьшее значение ключа, т.е. bk=min(ki), где bk - базовый ключ, ki - текущее значение ключа i-го файла. Изучение возможных значений базового ключа позволяет сде- лать следующие выводы: множество возможных значений базового ключа равно объеди- нению множеств значений ключей всех файлов, участвующих в об- работке; комбинация, когда для какого-то значения базового ключа отсутствуют записи во всех файлах является невозможной (запре- щенной); для n файлов максимально возможное число различных комби- наций сочетания ключей равно 2 в степени n минус 1. 2.2.2. Проектирование совместной обработки файлов На первом уровне структура программы совместной обработки файлов содержит ветвление для определения исключительной ситу- ации отсутствия входных данных "Все файлы пусты". Для непустых файлов второй уровень программы представляет собой циклическую обработку базового ключа, которая выполняется, пока не закон- чатся все входные файлы. Обработка одного значения базового ключа (третий уровень разбиения программы) заключается в вы- полнении трех этапов: выбор базового ключа; основная обработка; чтение файлов. Эти три этапа так или иначе присутствуют в программах совместной обработки файлов, только программируются они раз- личными способами в зависимости от применяемого метода. Для определения значений базового ключа необходимо выб- рать наименьший из ключей всех файлов в случае сортировки фай- лов по возрастанию ключей. В случае трех файлов выбор базового ключа может быть запрограммирован следующим образом: IF KLA < KLB THEN BKL:=KLA ELSE BKL:=KLB; IF KLC < BKL THEN BKL:=KLC; Для проектирования этапа основной обработки необходимо составить таблицу истинности (таблицу решений с ограниченным входом), в которой перечисляются в качестве аргументов все комбинации сочетания ключей, а функциями являются действия, которые должны выполняться для получения выходных результатов. Каждому значению базового ключа соответствует наличие или отсутствие записи во входном файле, т.е. наличие значения ба- зового ключа в каждом из файлов является булевой (логической) переменной, которая принимает два значения - истинно (1) или ложно (0). Определить значение этой переменной можно путем сравнения текущего значения ключа файла и базового ключа. Воз- можные комбинации наличия ключей удобно перечислять с помощью - 11 - двоичных чисел, отводя для каждого файла один разряд. Для n двоичных разрядов существует 2^n различных чисел. Нулевой ми- нитерм, т.е. отсутствие записей для данного базового ключа во всех файлах является невозможным (запрещенным) и отмечается специальным знаком пустого множества в этой строке таблицы истинности для всех действий. Для каждой из оставшихся 2^n-1 строк определяются требуемые действия, которые отмечаются зна- ком "Х" в соответствующем столбце таблицы истинности. После минимизации таблицы истинности вручную или с использованием программы минимизации таблиц решений получаются упрощенные логические выражения в дизъюнктивной нормальной форме, позволяющие оптимальным образом построить логическую структуру этапа основной обработки. Уменьшение количества пре- дикатов в тексте программы повышает ее быстродействие. Основ- ная обработка представляет собой древовидную, сложную или ком- бинированную альтернативную структуру, в ветвях которой разме- щаются команды выполнения действий или операторы вызова соот- ветствующих подпрограмм. Ввод данных (чтение) из файлов целесообразно оформить в виде подпрограммы (прил. 1), в которой предусматривается вы- полнение чтения только при выполнении условия, что файл еще не закончился. В подпрограмме (процедуре) чтения предусматрива- ется формирование ключа файла, подсчет количества введенных записей. Можно организовать выбор записей по какому-либо кри- терию, проверку на ошибку. Использование булевой переменной "признак конца файла" и засылка максимальных значений в ключе- вые поля файла при обнаружении его конца позволяет упростить структуру основной программы совместной обработки файлов и исключить ошибки при обработке последних записей файлов. В обработке нескольких файлов большое значение имеет пра- вильное расположение команд ввода (чтения файлов). Обычно ко- манды ввода первых записей всех файлов располагаются в начале программы. Расположение остальных команд ввода можно опреде- лить, используя следующее правило: команда ввода записи файла, как правило, располагается там, где заканчивается использова- ние для обработки записи данного файла. Легко можно найти место для размещения команды чтения одного файла - это послед- няя корневая ветвь основной обработки. Команду чтения другого файла можно записать следующим образом: IF KLB = BKL THEN CHTENB; Таким образом, основными этапами совместной обработки n файлов являются: программирование n-1 альтернативы для выбора базового клю- ча; составление и минимизация таблицы истинности для програм- мируемых действий; составление по полученным логическим выражениям для действий логической структуры основной обработки; программирование n-1 альтернативы для размещения команд чтения файлов. Проведенный анализ и опыт использования логического - 12 - конструирования программ для совместной обработки файлов поз- воляют сформулировать следующие правила, которые помогут избе- жать некоторых ошибок и повысить эффективность программ: 1). При минимизации логических выражений для действий склевать клетки таблицы решений необходимо только один раз, в противном случае соответствующее действие в программе может выполниться неоднократно. 2). Первую альтернативу основной обработки можно сов- местить с последней альтернативой выбора базового ключа, зап- рограммировав ее надлежащим образом (добавить символ "="), например, IF KLD <= BKL THEN BEGIN BKL:=KLD; (* НАЧАЛО ВЕТВИ D ОСНОВНОЙ ОБАБОТКИ *) ... 3). В случае двух входных файлов выбор базового ключа и альтернативу для чтения одного из файлов можно явно не выде- лять, а совмещать с основной обработкой. 4). Файл может быть обработан в данном модуле, если все или старшие ключевые реквизиты файла совпадают с ключом обра- ботки. Разработанный с учетом рассмотренных положений текст программы совместной обработки двух файлов представлен в прило- жении 2. 2.3. Порядок выполнения работы 2.3.1. Разработать форму машинограммы для сравнения двух последовательных файлов, которые отсортированы по возрастанию первого, ключевого поля. Определить какому периоду времени соответствуют первый и второй файлы и примечания для различных сочетаний ключей файлов. 2.3.2. Разработать таблицу решений для этапа основной об- работки. 2.3.2. В программе предусмотреть создание (ввод) двух последовательных файлов с одинаковой структурой записей ("ста- рый" и "новый") и сравнение полученных файлов. Возможно использование меню для определения требуемых режимов обработки. 2.3.3. Написать, отладить программу и получить контроль- ный пример, проверяющий все варианты обработки. 2.3.4. В отчет по лабораторной работе включается: постановка задачи с описанием структуры записей файла, таб- лица решений для основной обработки, минимальные логические выражения для действий; иерархическая схема программы со спецификацией; схема программы по ГОСТ 19.701-90 или структурограмма; текст программы; контрольный пример: распечатки файлов, машинограмму. 2.4. Задания - 13 - Совместная обработка файлов, рассматриваемая в данной ла- бораторной работе предусматривает получение на выходе машиног- раммы результатов сравнения (стыковки) двух файлов. На входе используются последовательные файлы, содержащие записи одина- ковой структуры и отсортированные по возрастанию первого поля. В контрольном примере предусмотреть проверку всех ветвей обработки. Данные в файлах должны соответствовать предметной области. 2.4.1. Структуры записей: 1). Код материала, плотность, тип материала (сталь, чугун, пластмасса и т.д.). Файлы: разные годы. 2). Наименование творческого коллектива, численность кол- лектива, количество проведенных концертов. Файлы: разные годы. 3). Номер школы, процент сдавших нормы ГТО, вид школы (неполная средняя, средняя, гимназия, лицей и т.д.). Файлы: разные годы. 4). Инвентарный номер станка, максимальная скорость реза- ния, тип станка (фрезерный, токарный, сверлильный). Файлы: начало и конец года. 5). Номер спортсмена, результат в секундах, страна (Россия, Норвегия и т.д.). Файлы: этапы Кубка Мира. 6). Время измерения (в минутах от начала процеса плавки), температура, процент углерода. Файлы: технические условия и фактически. 7). Номер телефона, сумма к оплате, тип телефона (квартирный, учреждение). Файлы: по плану и фактически. 8). Наименование детали, изделия, масса, тип (деталь, узел, изделие. Файлы: разные годы. 9). Инвентарный номер чертежа, наименование изделия, тип чертежа (сборочный, деталировка). Файлы: разные годы. 10). Табельный номер, фамилия, оклад, пол: М - мужской, Ж - женский. Файлы: разные годы. 11). Фамилия депутата Совета, Думы, номер округа, процент голосов "ЗА". Файлы: предыдущие и нынешние выборы. 12). Наименование действующей электростанции, мощность, тип (АЭС, ГЭС, ТЭС и т.д.). Файлы: разные годы. 13). Код изделия, изготовитель, выпущено за год. Файлы: разные годы. 14). Номер зачетной книжки, ФИО студента, номер группы. Файлы: разные годы. 15). Наименование товара, поставщик, цена. Файлы: прошлый и текущий месяцы. 16). Инвентарный номер книги, автор, название, выходные данные. Файлы: разные годы. 17). Номер поезда, пункт прибытия, тип поезда (пассажирский, скорый и т.д.). Файлы: разные даты. 18). Номер зачетной книжки, ФИО студента, специальность, средний балл. Файлы: разные годы. 19). Адрес, район города, номер жилуправления, сумма к оплате. Файлы: по плану и фактически. 2.5. Контрольные вопросы 1. Понятие ключа сортировки файла, ключа обработки, базо- вого ключа. 2. Этапы совместной обработки нескольких файлов. 3. Выбор базового ключа. 4. Ввод данных при совместной обработке файлов. 5. Завершение совместной обработки файлов. 6. Варианты обработки дубликатов.