Алгоритм
Укрупненные шаги алгоритма основной программы приведены под заголовком "содержание программы" (при оформлении отчета, алгоритмы следует включить в блок-схему программы). Рассмотрим строение процедур.
Добавление записи в дек. Исходя из схемы дека, приведенной на рис. 20, будем считать его пустым, если в нем нет ни одной записи, то есть указатели начала и конца дека указывают на nil. Если запись добавляется в пустой дек, то меняются оба указателя, если в непустой – меняется только один указатель (начала или конца). Проверку, что дек пуст, можно выполнять по содержимому любого указателя (nil или нет). Добавление записей к обоим концам выполняется почти одинаково: создается динамическая переменная типа звена дека, заполняется ее информационная часть, обе ссылки на соседние звенья делаются равными nil. Затем, в зависимости от того, к какому концу добавляется запись, меняется первая ссылка в новой записи (прицепляясь к деку) и вторая ссылка в концевой записи дека (связываясь с новой записью) или наоборот – вторая ссылка новой записи и первая ссылка конца дека. Наконец меняется указатель конца дека к которому добавлена запись.
Удаление записи из дека. В задаче требуется выбирать данные из дека с одной стороны, но для универсальности, составим процедуру выбора и удаления с заказанного конца дека. Как и в предыдущей процедуре, будем использовать логический параметр, равный истине, при работе с началом и лжи, при работе с концом дека. Если начало и конец ссылаются на одну и ту же область памяти (равны между собой), то при удалении записи дек становится пустым. Если нет, процесс выполняется в обратном порядке, по сравнению с добавлением записи.
Заполнение дека из текстового файла. Представляет собой цикл (пока не достигнут конец файла) чтения очередной строки текстового файла с заполнением информационной структуры, которую либо добавляют к началу дека (обе оценки – 5), либо к концу (обе оценки – 3), либо просто пропускают. Внутри цикла используются процедуры ввода одной строки и добавления записи в дек. При заполнении дека ведется подсчет количества записей дека.
Распечатка дека в выходной текстовый файл. Так как количество записей дека известно, вывод выполняется в форме арифметического цикла. Тело цикла содержит обращение к процедуре выбора записи из дека (из начала) и форматного вывода данных в выводной файл в виде строки таблицы.
При составлении блок-схем алгоритмов в отчете по лабораторной работе можно пользоваться именами переменных, описания которых предварительно заданы в таблице идентификаторов основной программы и подпрограмм.
Примечание: формальные параметры, передаваемые по имени (которым предшествует ключевое слово var), являются, по сути, указателями на данные, поэтому занимают в памяти по 4 байта, независимо от типа данных, на которые указывают.
Таблица идентификаторов
Таблица 32. Идентификаторы программы 31 варианта
Имя | Тип | Р-р, байт | Назначение |
Основная программа | |||
Lab_9 | имя программы | - | Работа с динамическими списками |
data | описатель | - | Описатель типа для структуры данных |
.Name | строка | Поле структуры данных для фамилии | |
.Bal1 | целое | Поле структуры данных для первой оценки | |
.Bal2 | целое | Поле структуры данных для второй оценки | |
.SrBal | вещественное | Поле структуры данных для средней оценки. | |
Pd | описатель | - | Описатель типа для указателей на звено дека |
Dek | описатель | - | Описатель типа для структуры данных записи дека |
P1 | указатель | Ссылка на следующий элемент дека | |
P2 | указатель | Ссылка на предыдущий элемент дека | |
Student | структура | Структура – составное поле данных записи дека | |
Docum | структура | Данные одной записи | |
DN | указатель | Указатель первого конца дека (начала) | |
DK | указатель | Указатель второго конца дека (конца) | |
Fin | последовательн. символьн. файл | Входной текстовый файл с данными | |
Fout | последовательн. символьн. файл | Выходной текстовый файл с таблицей результатов | |
k | целое | Количество элементов дека | |
GetStud – процедура выбора строки из входного файла | |||
St | указатель на структуру | Формальный параметр - адрес структуры с данными по студенту | |
F | указатель на файл | Формальный параметр - имя входного файла | |
P | целое | Счетчик пробелов во входной записи | |
i | целое | Порядковый № символа во входной записи | |
PutDek Процедура формирования нового звена дека | |||
NK | указатель | Формальный параметр - адрес конца дека, к которому добавляют запись | |
KN | указатель | Формальный параметр - адрес второго конца дека | |
Inf | структура | Формальный параметр – добавляемые данные | |
Beg | логическое | Признак, что добавляется к началу | |
U | указатель | Вспомогательный указатель на добавляемое звено дека | |
DelDek Процедура удаления крайнего звена дека | |||
NK | указатель | Формальный параметр - адрес конца дека, у которого удаляют запись | |
KN | указатель | Формальный параметр - адрес второго конца дека | |
Inf | указатель на структуру | Формальный параметр – адрес структуры, куда поместить выбираемые данные | |
Beg | логическое | Признак, что удаляется из начала | |
U | указатель | Вспомогательный указатель на удаляемое звено дека | |
ReadFile Процедура чтения записи из файла и заполнения дека | |||
F | указатель на файл | Формальный параметр – указатель на входной файл для входных данных | |
DekN | указатель | Формальный параметр - адрес указателя на начало дека | |
DekK | указатель | Формальный параметр - адрес указателя на конец дека | |
N | указатель | Формальный параметр - адрес переменной для числа элементов дека | |
Stud | структура | Рабочая структура для данных о студенте |
Разработанный алгоритм с использованием перечисленных идентификаторов реализуется на языке Турбо-Паскаль приведенной ниже программой.