Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на яз выс ур указания к курсов...doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
312.83 Кб
Скачать
  • Результаты проверки работоспособности программы сохранить в файле-протоколе.

    3. Содержание пояснительной записки

    3.1 Перечень основных разделов

    Пояснительная записка должна содержать все разделы, отражающие этапы создания программного комплекса, должны быть выполнены рубрикация текста (см. как это выполнено в данном пособии), пронумерованы страницы, сделаны ссылки на используемую литературу (для ссылок используются квадратные скобки, например [3]) и составлено оглавление.

    Основные разделы пояснительной записки:

    • техническое задание на разработку информационного и программного обеспечения;

    • структура информационного и программного обеспечения;

    • описание алгоритмов и подпрограмм (функций и процедур), используемых для создания программного обеспечения;

    • тексты программных модулей;

    • протоколы работы программного обеспечения (ПО) по всем функциям, заложенным в техническом задании;

    • технические условия применения программного обеспечения, инструкция для пользователя ПО;

    • список используемой литературы.

    3.2 Структура текста курсовой работы

    3.2.1. Техническое задание

    В процессе разработки технического задания (ТЗ) студент получает первоначальные навыки в составлении ТЗ на программное обеспечение по выданному заданию на курсовую работу. В ТЗ должны быть проработаны следующие основные вопросы:

    • введение (состояние поставленной задачи на момент получения задания), где должна быть указана цель разработки, область применения программного обеспечения (ПО), сформулировано авторское наименование программного комплекса (ПК), который соответствует заданию на курсовую работу;

    • требования к ПО. Здесь должны быть перечислены все функции, которые необходимо реализовать в процессе создания ПО (ПК студент разрабатывает самостоятельно с учетом наличия готовых программных средств, которые можно включить в ПО).

    3.2.2 Структура информационного обеспечения

    При получении задания на информационно-поисковую систему (ИПС), студент должен выбрать тип организации для хранения данных и способ доступа к ним. Применительно к языку Borland Pascal можно остановиться на последовательном файле. Структура записи должна иметь все поля, необходимые для реализации заказанных функций в ТЗ. Для каждого поля записи необходимо определиться с типом данных.

    3.2.3. Структура программного обеспечения

    Структура ПК зависит от заданных функций в ТЗ и от выбора структуры информационного обеспечения. На языке Borland Pascal рекомендуется строить с использованием формы меню, где для каждого заказанного требования предусмотреть соответственно отдельную функцию.

    3.2.4. Алгоритмы по созданию процедур и функций

    Алгоритмы могут быть приведены в словесной форме, в виде графических схем, либо в некоторых случаях можно привлечь математический аппарат. Простые алгоритмы реализации программных модулей можно не приводить, обеспечив необходимыми комментариями тексты процедур (тексты разместить в следующем разделе).

    В данном разделе необходимо привести полный перечень всех подпрограмм, входящих в состав ПО с указанием выполняемой функции, описать назначение формальных параметров, пояснив тип данных для каждого параметра.

    3.2.5. Отладка программных модулей

    В этом разделе необходимо привести план тестирования ПК для контроля этапов алгоритмизации и программирования. Подготовить эталонные промежуточные и окончательные результаты, подтверждающие работу ПК по всем заложенным в ТЗ функциям.

    Привести необходимые данные для заполнения информационной базы и написать по каждому требованию ТЗ желаемый результат. Например: если организуется поиск информации, то в плане тестирования приводится контрольная информация (в обозримом объеме), по которой ведется поиск; признак поиска; желаемый результат.

    От качества предложенных тестов зависит время, затраченное на проверку ПК. Удачно подобранные промежуточные данные позволяют локализовать алгоритмические ошибки [8].

    Контроль правильности текстов программ принято рассматривать: «ручной» (без вмешательства ЭВМ) и автоматизированный (трансляция, тестирование на ЭВМ). Перед обращением к ЭВМ написанный текст программы рекомендуется просмотреть на предмет описок и смыслового расхождения с предложенным вариантом задачи. Путем сплошного просмотра текста выявляется правильность написания ключевых слов, операторов, организация циклов.

    Полезно сравнить текст с условиями задачи. "Ручная" проверка индивидуальна, но может быть эффективной, если программист способен мысленно представить во всех деталях алгоритм написанной программы.

    Автоматизированный контроль осуществляет транслятор. Трансляция выявляет синтаксические ошибки, но не более того. Правильность работы ПК проверяется на базе контрольных тестов путем многократного запуска ПК по всем функциям (требованиям) из ТЗ и сверкой результатов машинных протоколов и предложенных тестов.

    3.2.6. Тексты программных модулей

    Тексты распечатываются после получения правильных результатов по всем запланированным функциям ПО. Тексты должны быть снабжены комментариями. Комментариями нельзя злоупотреблять, большое количество загромождает суть программы, ухудшает читабельность текста, как и их полное отсутствие. При размещении пояснений по тексту ПК следует придерживаться следующих рекомендаций:

    • написать комментарии по разработанным функциям;

    • выделить логически завершенные участки, важные по содержательному пониманию работы ПК.

    3.2.7 Протоколы, подтверждающие работоспособность программного комплекса

    Для проверки работоспособности ПК необходимо:

    • самостоятельно подготовить данные, подобрав конкретные значения таким образом, чтобы можно было убедиться в правильности работы каждой заданной функции в ТЗ;

    • в программе параллельно с выводом информации на экран обеспечить вывод в файл протокола;

    • выполнить проверку конкретных значений контрольного примера по всем предусмотренным в ТЗ функциям;

    • распечатать полученный файл с протоколом работы программы, включающий распечатку данных и, если требуется, пояснения результатов.

    3.2.8 Условия использования программного комплекса

    В этом разделе должны быть приведены технические условия и состав программного обеспечения для работы вышеописанного ПК. Указать персональную ЭВМ, на которой был отлажен ПК, операционную систему, язык программирования, указав версию. Привести состав файлов, входящих в ПК в следующем виде: имя файла с расширением - размер в байтах - назначение.

    Размер ПК указать в исходном виде и в готовом к выполнению, т.е. привести размеры файлов с расширением ".pas",".exe".

    Привести размеры файлов данных с указанием числа записей.

    3.2.9 Список используемой литературы

    Список литературы приводится по общепринятым правилам для технической литературы. На приведенную литературу должны быть сделаны ссылки в тексте пояснительной записки.

    4. Вспомогательный материал

    4.1 Перечень вопросов, подлежащих изучению

    В процессе выполнения работы студент должен разобраться в следующих вопросах:

    • основы файлового ввода/вывода информации;

    • произвольный доступ к файлу;

    • организация ввода/вывода для типов, определенных пользователем;

    • основные принципы работы с динамической памятью;

    • динамические структуры данных.

    В курсовой работе рассматриваются типизированные и текстовые файлы, прямой и последовательный доступы к данным. Студенту необходимо, прежде всего, понимать, как распространяется блок описания данных на текст программы, что такое файл, поток ввода и вывода, внешнее имя файла, объявление файла в программе, связь потока ввода-вывода с внешним именем файла в среде операционной системы.

    Специфика поставленной задачи состоит в том, что размер базы данных не ограничен, поэтому для ее хранения необходимо использовать динамические структуры данных.

    Основное внимание при программировании поставленной задачи следует уделить разбиению на процедуры (функции) и спецификации их интерфейсов. Например, логично оформить в виде процедуры (функции) каждую операцию с базой данных (формирование, поиск, добавление и удаление элементов и т.д.), поскольку они представляют собой законченные действия.

    4.2. Создание и обработка файлов

    4.2.1. Общие сведения о файлах

    Под файлом понимается либо именованная совокупность внешней память ПК, либо логического устройства – потенциальный источник или приемник информации.

    Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одно типа. Типом компонентов может быть любой тип Borland Pascal, кроме файлов. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

    Работа с физическими файлами происходит через так называемые файловые переменные.

    Файловые переменные имеют специфическое применение. Над ними нельзя выполнять никаких операций (присваивать значение, сравнивать и т.д.). Их можно использовать лишь для выполнения операций с файлами (чтение, запись и т.д.).

    Элементы файла считаются расположенными последовательно, то есть так же, как элементы линейного массива. Отличие же состоит в том, что, во-первых, размеры файла могут меняться, во-вторых, способ обращения к элементам совсем другой: невозможно обратиться к произвольному элементу файла; элементы его просматриваются только подряд от начала к концу, при этом в каждый момент времени доступен только один элемент. Можно представить себе, что для каждого файла существует указатель, показывающий в данный момент на определенный компонент файла. После проведения операции чтения или записи указатель автоматически передвигается на следующий компонент.

    Файловый тип или переменную файлового типа можно задать одним из трех способов:

    <имя> = FILE OF <тип>;

    <имя> = TEXT;

    <имя> = FILE;

    Здесь <имя> – имя файлового типа (правильный идентификатор);

    FILE, OF – зарезервированные слова

    TEXT – имя стандартного типа текстовых файлов;

    <тип> – любой тип Borland Pascal, кроме файлов.

    Например:

    type

    product = record

    name : string;

    code : Word;

    cost : comp;

    end;

    text80 = file of String [80];

    var

    f1 : file of char;

    f2 : text;

    f3 : file;

    f4 : text80;

    f5 : file of product;

    В зависимости от способа объявления можно выделить три вида файлов:

    • типизированные файлы (задаются предложением FILE OF);

    • текстовые файлы (определяются типом TEXT);

    • нетипизированные файлы (определяются типом FILE).

    Вид файла, вообще говоря, определяет способ хранения информации в файле. Однако в Borland Pascal нет средств контроля вида ранее созданных файлов. При объявлении уже существующих файлов программист должен следить за соответствием вида объявления характеру файла.

    4.2.2. Доступ к файлам

    Любой программе доступны два предварительно объявленных файла со стандартными файловыми переменными: INPUT – для чтения данных с клавиатуры и OUTPUT – для вывода на экран.

    Любые другие файлы, а также логические устройства становятся доступны программе после выполнения особой процедуры открытия файла (логического устройства). Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него.

    Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре ASSIGN:

    ASSIGN (<ф.п.>, <имя файла или л.у.>);

    здесь <ф.п.> – файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);

    <имя файла или л.у.> – текстовое выражение, содержащее имя файла или логическое устройство.

    Если имя файла задается в виде пустой строка, например, ASSIGN (f, ‘’), то в зависимости от направления обмена данными файловая переменная связывается со стандартным файлом INPUT или OUTPUT.

    Имя файла – это любое выражение строкового типа, которое строится по правилам определения имен в MS-DOS (операционной системе ПК). Максимальная длина имени вместе с путем – 79 символов, например:

    var

    finp : text;

    fout : file of String;

    const

    name = ‘c:\dir\subdir\out.txt’;

    begin

    assign ( finp, ‘123.dat’ );

    assign ( fout, name );

    end.

    4.2.3.Процедуры и функции общие для всех видов файлов

    Процедура Reset( var f ); – открывает логический файл f для последующего чтения данных или, как говорят, открывает входной файл. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента.

    Процедура Rewrite( var f ); – открывает логический файл f для последующей записи данных (открывает выходной файл). После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если файл существовал, то он затирается новым.

    Процедура Close( var f ); – закрывает открытый до этого логический файл. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено. Для входных файлов использование оператора закрытия файла необязательно.

    Функция EOF( var f ): Boolean; – возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

    Процедура Rename( var f; NewName: String ); –позволяет переименовать физический файл на диске, связанный с логическим файлом f. Переименование возможно после закрытия файла.

    Процедура Erase( var f ); – уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

    Функция IOResult: Integer; – возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция IOResult работает только при выключенном режиме проверок ошибок ввода - вывода или с ключом компиляции {$I-}.

    4.2.4. Текстовые файлы

    Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Они предназначены для хранения текстовой информации.

    Текстовый файл трактуется как совокупность строк переменной длины. Доступ к каждой строке файла возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN (End Of LiNe – конец строки), а в конце всего файла – признак EOF (End Of File – конец файла). Эти признаки можно протестировать одноименными логическими функциями.

    Процедура Reset(var t:text); -открывает текстовый файл t только для чтения.

    Процедура ReWrite(var t:text); - открывает текстовый файл t только для записи.

    Процедура Append( var t: Text ) служит для специального открытия выходных файлов. Она применима к уже существующим физическим файлам и открывает их для дозаписи в конец файла.

    Процедура Read(var t:text, X1,X2,...XK) – предназначена для чтения информации из текстового файла. Переменные Х1, Х2,...ХК могут быть либо переменными целого, действительного, символьного типа, либо строкой. При вводе переменных типа char выполняется чтение одного символа из файла и присваивание считанного значения переменной. При вводе переменных типа string количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы перевода каретки. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы отбрасываются, а новое обращение к read возвращает пустую строку. Таким образом, данная процедура не в состоянии прочесть последовательность строк. Для этой цели нужно использовать процедуру readln.

    Процедура ReadLn(var t:text, X1, X2, …,XK); – идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки. Кроме того, эту процедуру можно использовать без списка ввода (Readln(t:text)), что приведет к пропуску всех символов текущей строки вплоть до EOLN.

    Процедура Write(var t:text, X1, X2, …, XK); – предназначена для записи данных в файл. Переменные X1, X2, …, XK могут быть переменными типа CHAR, STRING, BOOLEAN, а также любого целого или вещественного типа. Любой элемент списка вывода может иметь форму: OutExpr [ : MinWidth [ : DecPlaces ] ], где OutExpr – выводимое выражение; MinWidth – минимальная ширина поля, в которое записывается OutExpr; DecPlaces – количество десятичных знаков в дробной части вещественного числа.

    Процедура WriteLn(var t:text, X1, X2, …, XK); – идентична предыдущей, за исключением того, что выводимая строка символов завершается маркером конца строки. При вызове WRITELN без списка вывода в текущую позицию файла ставится маркер конца строки, что при выводе на экран приведет в переводу курсора в начало следующей строки.

    Функция EOLN(var t:text); – возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки.

    Процедура SetTextBuf( var t: Text; var Buf; BufSize: Word ); – служит для увеличения или уменьшения буфера ввода - вывода текстового файла t. Значение размера буфера для текстовых файлов по умолчанию равно 128 байтам. Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия файла. Буфер файла начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.

    Процедура Flush(var t:Text); – применяется к открытым выходным файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения.

    Функция SeekEOLn( var t: Text ): Boolean; – возвращает значение True, если до конца строки остались только пробелы.

    Функция SeekEOF( var t: Text ): Boolean; возвращает значение True, если до конца файла остались строки, заполненные пробелами.

    4.2.5. Типизированные файлы

    Компонентный или типизированный файл - это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и память ЭВМ. Длина любого компонента типизированного файла строго постоянна, что дает возможность организовывать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру).

    Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколко, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом.

    Компонентами файла могут быть все скалярные типы, а из структурированных - массивы, множества, записи. Практически во всех конкретных реализациях языка ПАСКАЛЬ конструкция "файл файлов" недопустима.

    Все операции над компонентными файлами производятся с помощью стандартных процедур: Reset, Rewrite, Read, Write, Close.

    Процедура Read(f , X[ , X1, …, XK]); – считывает из типизированного файла одну компоненту файла и присваивает ее переменной Х. Х – переменная (массив, строка, множество, запись) с таким же описанием, какое имеет компонента файла. Повторное применение процедуры обеспечит чтение следующей компоненты файла и запись ее в X. Если файл исчерпан обращение к процедуре READ вызовет ошибку ввода-вывода.

    Процедура Write(f , X[ , X1, …, XK]); – используется для записи данных в типизированный файл. Переменная Х записывается в виде одной компоненты файла. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла.

    4.2.6. Нетипизированные файлы

    Бестиповые (нетипизированные) файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном, принципы работы остаются такими же, как и с типизированными файлами.

    Перед использованием логический файл должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close.

    При открытии файла длина буфера устанавливается по умолчанию в 128 байт. BORLAND PASCAL позволяет изменить размер буфера ввода - вывода, для чего следует открывать файл расширенной записью процедур

    Reset(var f: File; BufSize: Word )

    или

    Rewrite(var f: File; BufSize: Word )

    Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение BufSize – 1 байт, максимальное - 64 К байт.

    Чтение данных из бестипового файла осуществляется процедурой

    BlockRead( var f: File; var X; Count: Word; var QuantBlock: Word );

    Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов.

    Необязательный параметр QuantBlock возвращает число блоков (буферов), прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.

    Запись данных в бестиповой файл выполняется процедурой

    BlockWrite( var f: File; var X; Count: Word; var QuantBlock: Word );

    которая осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера.

    Необязательный параметр QuantBlock возвращает число блоков (буферов), записанных успешно текущей операцией BlockWrite.

    4.2.7. Прямой и последовательный доступ

    Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы формирования (записи) компонент файла и просмотра (чтения) не могут произвольно чередоваться. Таким образом, файл вначале строится при помощи последовательного добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.

    Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ.

    BORLAND PASCAL позволяет применять к типизированным и нетипизированным файлам, записанным на диск, способ прямого доступа. Прямой доступ означает возможность заранее определить в файле блок, к которому будет применена операция ввода-вывода. В случае нетипизированных файлов блок равен размеру буфера, для типизированных файлов блок - это одна компонента файла.

    Прямой доступ предполагает, что файл представляет собой линейную последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 через 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена перед блоком с номером 2 и, наконец, условная граница с номером n находится после блока с номером n.

    Реализация прямого доступа осуществляется с помощью функций и процедур FileSize, FilePos, Seek и Truncate.

    Функция FileSize( var f ): Longint возвращает количество блоков в открытом файле f.

    Функция FilePos( var f ): Longint возвращает текущую позицию в файле f. Позиция в файле - это номер условной границы. Для только что открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения или записи первого блока текущая позиция переместится на границу с номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению FileSize.

    Процедура Seek( var f; N: Longint) обеспечивает назначение текущей позиции в файле (позиционирование). В параметре N должен быть задан номер условной границы, предшествующей блоку, к которому будет производиться последующее обращение. Например, чтобы работать с блоком 4, необходимо задать значение N, равное 3. Процедура Seek работает с открытыми файлами.

    Процедура Truncate( var f ) устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.

    4.3 Указатели и динамическая память

    4.3.1. Общие сведения

    Динамическая память (куча) – это оперативная память, предоставляемая программе при ее работе за вычетом сегментов данных и стека и собственного тела программы. По умолчанию под кучу отводится вся незанятая память. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы.

    Статическим программным объектом называется объект фиксированного размера, память под которые резервируется на все время выполнения программы. Ссылки на статические объекты (доступ) осуществляются по имени – это так называемый непосредственный доступ. При трансляции имя заменяется адресом данного объекта, то есть номеров первой ячейки памяти, отведенной для объекта.

    Динамическими программными объектами называются объекты, возникающие, исчезающие, изменяющие свои размеры во время выполнения программы.

    Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти. Как правило, указатель связывается с некоторым типом данных. Такие указатели называются типизированными. Для объявления типизированных указателей используется значок ^, который помещается перед соответствующим типом.

    type

    <имя ссылочного типа> = ^ <имя статического типа>;

    Например:

    type

    PString = ^String; {тип-указатель на строку}

    TMas = array[1..100] of word; {статический тип-массив}

    PMas = ^TMas; {тип-указатель на массив}

    var

    StPtr : PString; {переменная-указатель на строку}

    MasPtr : PMas; {переменная-указатель на массив}

    Mas : TMas; {статический массив}

    St1Ptr : ^String; {переменная-указатель на строку}

    P : Pointer; {нетипизированный указатель}

    После объявления переменные-указатели занимают по 4 байта в сегменте данных, их значениями являются произвольные адреса и им не соответствуют никакие объекты в куче. Для порождения в куче динамического объекта, на который будет указывать ранее объявленная переменная-указатель, необходима процедура NEW(P). В результате в динамической памяти порождается переменная (резервируется область памяти) типа, согласованного с указателем P.

    Указатель P принимает значения, равные адресу порожденной динамической переменной. Обращение к динамической переменной производится через указатель в формате P^.

    Процедура DISPOSE(P) – возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем P. При повторном использовании процедуры применительно к уже освободившемуся фрагменту возникает ошибка периода исполнения. После выполнения данного оператора значение переменной P становится неопределенным и ее можно считать неинициализированной, поэтому ей обязательно нужно присвоить значение nil (пустая ссылка, например P:= nil;). Это предопределенная константа типа Pointer, равная адресу 0000:0000.

    4.3.2. Динамические структуры данных

    Алгоритмы работы любой программы, предназначенной для обработки данных, зависят от способа обработки данных. Выбор структур данных должен предшествовать созданию алгоритмов.

    Если до начала работы с данными невозможно определить, сколько памяти потребуется для их хранения, память выделяется по мере необходимости отдельными блоками, связанными друг с другом с помощью указателей. Такой способ организации данных называется динамическими структурами данных, поскольку их размер изменяется во время выполнения программы. Из динамических структур в программах чаще всего используются линейные списки, стеки, очереди, и двоичные деревья. Они различаются способами связи отдельных элементов и допустимыми операциями. Динамическая структура может занимать несмежные участки оперативной памяти.

    Элемент любой динамической структуры данных представляет собой запись (record), содержащую, по крайней мере, два поля: для хранения данных и для указателя. Полей данных и указателей может быть несколько. Поля данных могут быть любого типа: простого, составного или типа указатель. Описание простейшего элемента (компонента, узла) выглядит следующим образом:

    type

    PRec = ^ TRec;

    TRec = record

    D: <тип данных>;

    Next: PRec;

    end;

    Рассмотрим реализацию основных операций с динамическими структурами данных.

    Стеки

    Стеком называется динамическая структура данных, добавление компоненты в которую и исключение компоненты из которой производится из одного конца, называемого вершиной стека. Стек работает по принципу LIFO (Last-In, First-Out) - поступивший последним, обслуживается первым.

    Обычно над стеками выполняется три операции:

    • начальное формирование стека (запись первой компоненты);

    • добавление компоненты в стек;

    • выборка компоненты (удаление).

    Для формирования стека и работы с ним необходимо иметь две переменные типа указатель, первая из которых определяет вершину стека, а вторая - вспомогательная. Пусть описание этих переменных имеет вид:

    var pTop, pAux: Pointer;

    где pTop - указатель вершины стека;

    pAux - вспомогательный указатель.

    Начальное формирование стека выполняется следующими операторами:

    New(pTop)

    pTop^.pNext:=NIL;

    pTop^.D:=D1;

    Последний оператор или группа операторов записывает содержимое поля данных первой компоненты.

    Добавление компоненты в стек производится с использованием вспомогательного указателя:

    New(pAux);

    pAux^.pNext:=pTop;

    pTop:=pAux;

    pTop^.D:=D2;

    Добавление последующих компонент производится аналогично.

    Рассмотрим процесс выборки компонент из стека. Пусть к моменту начала выборки стек содержит три компоненты:

    Первый оператор или группа операторов осуществляет чтение данных из компоненты - вершины стека. Второй оператор изменяет значение указателя вершины стека:

    D3:=pTop^.D;

    pTop:=pTop^.pNext;

    Таким образом, при чтении компонент удаляется из стека.

    Очереди

    Очередью называется динамическая структура данных, добавление компоненты в которую производится в один конец, а выборка осуществляется с другого конца. Очередь работает по принципу: FIFO (First-In, First-Out) - поступивший первым, обслуживается первым.

    Для формирования очереди и работы с ней необходимо иметь три переменные типа указатель, первая из которых определяет начало очереди, вторая - конец очереди, третья - вспомогательная.

    Описание компоненты очереди и переменных типа указатель дадим следующим образом:

    type

    PComp=^Comp;

    Comp=record

    D:T;

    pNext:PComp

    end;

    var

    pBegin, pEnd, pAux: PComp;

    где pBegin - указатель начала очереди; pEnd - указатель конца очереди; pAux - вспомогательный указатель; тип Т определяет тип данных компоненты очереди.

    Начальное формирование очереди выполняется следующими операторами:

    New(pBegin);

    pBegin^.pNext:=NIL;

    pBegin^.D:=D1;

    pEnd:=pBegin;

    Добавление компоненты в очередь производится в конец очереди:

    New(pAux);

    pAux^.pNext:=NIL;

    pBegin^.pNext:=pAux;

    pEnd:=pAux;

    pEnd^.D:=D2;

    Добавление последующих компонент производится аналогично.

    Выборка компоненты из очереди осуществляется из начала очереди, одновременно компонента исключается из очереди. Пусть в памяти ЭВМ сформирована очередь, состоящая из трех элементов:

    Выборка компоненты выполняется следующими операторами:

    D1:=pBegin^.D;

    pBegin:=pBegin^.pNext;

    Линейные списки

    В стеки или очереди компоненты можно добавлять только в какой-либо один конец структуры данных, это относится и к извлечению компонент.

    Связный (линейный) список является структурой данных, в произвольно выбранное место, которого могут включаться данные, а также изыматься оттуда.

    Каждая компонента списка определяется ключом. Обычно ключ - либо число, либо строка символов. Ключ располагается в поле данных компоненты, он может занимать как отдельное поле записи, так и быть частью поля записи.

    Основные отличия связного списка от стека и очереди следующие:

    • для чтения доступна любая компонента списка;

    • новые компоненты можно добавлять в любое место списка;

    • при чтении компонента не удаляется из списка.

    Над списками выполняются следующие операции:

    • начальное формирование списка (запись первой компоненты);

    • добавление компоненты в конец списка;

    • чтение компоненты с заданным ключом;

    • вставка компоненты в заданное место списка (обычно после компоненты с заданным ключом);

    • исключение компоненты с заданным ключом из списка.

    Для формирования списка и работы с ним необходимо иметь пять переменных типа указатель, первая из которых определяет начало списка, вторая - конец списка, остальные- вспомогательные.

    Описание компоненты списка и переменных типа указатель дадим следующим образом:

    type

    PComp= ^Comp;

    Comp= record

    D:T;

    pNext:PComp

    end;

    var

    pBegin, pEnd, pCKey, pPreComp, pAux: PComp;

    где pBegin - указатель начала списка, pEnd - указатель конца списка, pCKey, pPreComp, pAux - вспомогательные указатели.

    Начальное формирование списка, добавление компонент в конец списка выполняется так же, как и при формировании очереди. Для чтения и вставки компоненты по ключу необходимо выполнить поиск компоненты с заданным ключом:

    pCKey:=pBegin;

    while (pCKey<>NIL) and (Key<>pCKey^.D) do

    pCKey:=pCKey^.pNext;

    здесь Key - ключ, тип которого совпадает с типом данных компоненты.

    После выполнения этих операторов указатель pСKey будет определять компоненту с заданным ключом или такая компонента не будет найдена.

    Пусть pCKey определяет компоненту с заданным ключом. Вставка новой компоненты выполняется следующими операторами:

    New(pAux);

    pAux^.D:= DK1;

    pAux^.pNext:=pCKey^.pNext;

    pCKey^.pNext:=pAux;

    Для удаления компоненты с заданным ключом необходимо при поиске нужной компоненты помнить адрес предшествующей:

    pCKey:=pBegin;

    while (pCKey<>NIL) and (Key<>pCKey^.D) do

    begin

    pPreComp:=pCKey;

    pCKey:=pCKey^.pNext

    end;

    Здесь указатель pCKey определяет компоненту с заданным ключом, указатель pPreComp содержит адрес предыдущей компоненты.

    Удаление компоненты с ключом Key выполняется оператором:

    pPreComp^.pNext:=pCKey^.pNext;

    Список рекомендуемой литературы

    1. Архангельский А. Я.. Язык Pascal и основы программирования в Delphi. Учебное пособие. Бином-Пресс, 2004.- 496 с.

    2. Глинский Я. Н., Анохин В. Е., Ряжская В. А. Turbo Pascal 7.0 и Delphi. Учебное пособие. – СПб: ООО «ДиаСофтЮП», 2003.-208 с.

    3. Моргун А. Н., Кривель И. А. Программирование на языке Паскаль. Основы обработки структур данных, М.: Вильямс, 2006.-328 с.

    4. Немнюгин С. А. Turbo Pascal. Практикум. – СПб.: Изд-во «Питер», 2003.- 272 с.

    5. Немнюгин С. А. Turbo Pascal. Программирование на языке высокого уровня. – СПб.: Изд-во «Питер», 2003.- 544 с.

    6. Окулов С.М. Основы программирования – М.: ЮНИМЕДИАСТАЙЛ, 2002.- 453 с.

    7. Павловская Т. А. Паскаль. Программирование на языке высокого уровня. Учебник. – СПб.: Изд-во «Питер», 2003.- 400 с.

    8. Павловская Т. А. Паскаль. Программирование на языке высокого уровня. Практикум. – СПб.: Изд-во «Питер», 2006.- 320 с.

    Приложение a

    Образец оформления титульного листа курсовой работы

    Министерство образования и науки Российской Федерации

    Северо-Кавказский горно-металлургический институт

    (государственный технологический университет)

    Кафедра Автоматизированной обработки информации

    Курсовая работа

    по дисциплине

    Программирование на языках высокого уровня

    Выполнил:

    Студент ____________________________

    Группа _____________________________

    Проверил:

    Преподаватель: ______________________

    Дата защиты ________________________

    Оценка ________________

    Владикавказ 2008

    Приложение b

    Пример текста программы с минимальным набором функций

    program kursovik;

    uses crt;

    type

    TYear = 1000..3000;

    bibl = record {определение типа элемента данных}

    avtor:string;

    title:string;

    izdan:string;

    year:TYear;

    tirazh: word;

    end;

    PBibl = ^TBibl; {Определение типа структуры данных(список)}

    TBibl = record

    book:bibl;

    next, pred:PBibl;

    end;

    MyFile = file of bibl; {объявление файловой переменной для доступа к файлу}

    const filename = 'C:\mybibl.dat'; {задаем полное имя файла}

    var

    beg, en,au:PBibl;

    x:bibl;

    f:MyFile;

    c:char;

    function MainMenu:byte;

    {отображает главное меню и возвращает номер выбранного пункта}

    var c:byte;

    begin

    ClrScr;

    writeln; writeln;

    writeln('===========================================');

    writeln('|| MAIN MENU ||');

    writeln('===========================================');

    writeln('|| 1. Add book. ||');

    writeln('|| 2. List biblioteka. ||');

    writeln('|| 3. Sort biblioteka. ||');

    writeln('|| 4. Save to file. ||');

    writeln('|| 5. Exit. ||');

    writeln('===========================================');

    writeln;writeln;

    write('Your choise: '); read(c);

    Result:=c;

    end;{of MainMenu}

    function SortMenu:byte;

    {отображает меню сортировки, возвращает выбранный пункт меню}

    var c:byte;

    begin

    ClrScr; writeln; writeln;

    writeln('===========================================');

    writeln('|| SORT MENU ||');

    writeln('===========================================');

    writeln('|| 1. Book avtor. ||');

    writeln('|| 2. Book title. ||');

    writeln('|| 3. Book izdanie. ||');

    writeln('|| 4. Book year. ||');

    writeln('|| 5. Tirazh. ||');

    writeln('|| 6. Back to Main Menu. ||');

    writeln('===========================================');

    writeln; writeln;

    write('Your choise: '); read(c);

    Result:=c;

    end; {of SortMenu}

    procedure BookToList(var beg, en:PBibl;b:PBibl);

    {добавление элемента b в конец списка}

    begin

    if en<>nil then

    begin

    en^.next:=b;

    b^.pred:=en;

    en:=b;

    en^.next:=nil;

    end else

    begin

    en:=b;

    en^.next:=nil;

    en^.pred:=nil;

    beg:=en;

    end;

    end;

    function AddBook(en:PBibl; var beg:PBibl):PBibl;

    {добавление нового элемента в динамический список}

    var b:Pbibl;

    begin

    new(b);

    readln;

    Write('Avtor : ');Readln(b^.book.avtor);

    Write('Title : ');Readln(b^.book.title);

    Write('Izdanie : ');Read(b^.book.izdan);

    Write('Year : ');Readln(b^.book.year);

    Write('Tirazh : ');Readln(b^.book.tirazh);

    BookToList(beg, en, b);

    AddBook:=en;

    end; {of AddBook}

    procedure LoadBase(var beg, en:PBibl);

    {загрузка базы из файла в динамический список}

    var book:PBibl;

    x:bibl;

    begin

    beg:=nil; en:=beg;

    assign(f, filename);

    {I-}

    reset(f);

    if IOResult=0 then

    begin

    while not eof(f) do

    begin

    new(book);

    read(f,x);

    book^.book.avtor:=x.avtor;

    book^.book.title:=x.title;

    book^.book.izdan:=x.izdan;

    book^.book.year :=x.year;

    book^.book.tirazh:=x.tirazh;

    BookToList(beg, en, book);

    end;

    end;

    {I+}

    end;{of LoadBase}

    procedure ExitProgram;

    {Освобождение памяти и выход из программы}

    var book:PBibl;

    begin

    book:=beg;

    while book<>nil do

    begin

    beg:=beg^.next;

    dispose(book);

    book:=beg;

    end;

    halt;

    end;{of Exit}

    procedure List(beg:PBibl);

    {вывод содержимого базы на экран из списка}

    var book:PBibl;

    function str_(s:string;n:byte):string;

    var i:byte;

    s1:string;

    begin

    s1:='';

    for i:=1 to n - Length(s) do s1:=s1+' ';

    Result:=s1;

    end;

    begin

    book:=beg;

    writeln('==========================================');

    writeln('|| Avtor || Title || Izdanie || Year || Tirazh ||');

    writeln('===========================================');

    while book<>nil do

    begin

    writeln('|| ',book^.book.avtor,str_(book^.book.avtor,13),

    '|| ',book^.book.title,str_(book^.book.title,24),

    '|| ',book^.book.izdan,str_(book^.book.izdan,12),

    '|| ',book^.book.year:5,

    '|| ',book^.book.tirazh:7,'||');

    book:=book^.next;

    end;

    writeln('===========================================');

    readkey;

    end;{of List}

    procedure Save(beg:PBibl);

    {запись данных списка в файл}

    var book:PBibl;

    begin

    rewrite(f);

    book:=beg;

    while book<>nil do

    begin

    write(f,book^.book);

    book:=book^.next;

    end;

    close(f);

    writeln('Bibl has been saved!!!');

    readkey;

    end;{of Save}

    procedure Sort(beg:PBibl;sort_krit:byte);

    {сортировка списка по критерию sort_krit }

    var flag:byte;

    krit:boolean;

    b:PBibl;

    temp:bibl;

    begin

    repeat

    b:=beg;

    flag:=0;

    while b^.next<>nil do

    begin

    case sort_krit of

    1:krit := b^.book.avtor>b^.next^.book.avtor;

    2:krit := b^.book.title>b^.next^.book.title;

    3:krit := b^.book.izdan>b^.next^.book.izdan;

    4:krit := b^.book.year>b^.next^.book.year;

    5:krit := b^.book.tirazh>b^.next^.book.tirazh;

    end;

    if krit then begin

    flag:=1;

    temp :=b^.book;

    b^.book:=b^.next^.book;

    b^.next^.book:=temp;

    b:=beg;

    end

    else b:=b^.next;

    end;

    until flag=0;

    List(beg);

    end;

    procedure SortBase(beg:PBibl);

    {выбор критерия сортировки из меню}

    begin

    while true do

    case SortMenu of

    1: Sort(beg,1);

    2: Sort(beg,2);

    3: Sort(beg,3);

    4: Sort(beg,4);

    5: Sort(beg,5);

    6: exit;

    else begin

    writeln('Input number between 1 and 6!!! ');

    readkey;

    end;

    end;

    end;

    begin{of main program}

    beg:=nil;

    en:=beg;

    LoadBase(beg, en);

    while true do

    case MainMenu of

    1: begin

    repeat

    en:=AddBook(en, beg);

    write('Continue input (Y/N)? ');

    read(c);

    until c in['N','n'];

    end;

    2: List(beg);

    3: SortBase(beg);

    4: Save(beg);

    5: ExitProgram;

    else begin

    writeln('Input number between 1 and 5!!! ');

    readkey;

    end;

    end;

    end.

    Приложение c Пример протокола работы программы

    1. Создание нового файла

    Просмотр информации

    Ф.И.О. автора

    Название книги

    Год

    Издательство

    Тираж

    Шилдт Г

    Самоучитель С++

    1998

    BHV

    500

    Касаткин А.И.

    Программирование

    1990

    Минск

    1000

    Брябрин В.М

    ПО ПЭВМ

    1988

    Наука

    1000

    Кормен Т.

    Алгоритмы

    2000

    Москва

    2000

    Хансен Г.

    Базы данных

    1998

    Бином

    3000

    Нейбауэр

    Программирование

    1998

    BHV

    4000

    1. Добавление информации в файл

    Просмотр информации

    Ф.И.О. автора

    Название книги

    Год

    Издательство

    Тираж

    Шилдт Г

    Самоучитель С++

    1998

    BHV

    500

    Касаткин А.И.

    Программирование

    1990

    Минск

    1000

    Брябрин В.М

    ПО ПЭВМ

    1988

    Наука

    1000

    Кормен Т.

    Алгоритмы

    2000

    Москва

    2000

    Хансен Г.

    Базы данных

    1998

    Бином

    3000

    Нейбауэр

    Программирование

    1998

    BHV

    4000

    Шилдт Г.

    Программирование

    1996

    BHV

    5000

    1. Поиск информации

      1. по названию: Программирование

    Просмотр информации

    Ф.И.О. автора

    Название книги

    Год

    Издательство

    Тираж

    Касаткин А.И.

    Программирование

    1990

    Минск

    1000

    Нейбауэр

    Программирование

    1998

    BHV

    4000

    Шилдт Г.

    Программирование

    1996

    BHV

    5000

      1. по Ф.И.О автора: Шилдт Г.

    Просмотр информации

    Ф.И.О. автора

    Название книги

    Год

    Издательство

    Тираж

    Шилдт Г

    Самоучитель С++

    1998

    BHV

    500

    Шилдт Г.

    Программирование

    1996

    BHV

    5000

      1. по Ф.И.О автора: Кузнецов

    В библиотеке нет книг заданного автора!

    1. Удаление информации по фамилии автора

    Фамилия автора для удаления: Кормен Т.

    Информация удалена!

    Просмотр информации

    Ф.И.О. автора

    Название книги

    Год

    Издательство

    Тираж

    Шилдт Г

    Самоучитель С++

    1998

    BHV

    500

    Касаткин А.И.

    Программирование

    1990

    Минск

    1000

    Брябрин В.М

    . ПО ПЭВМ

    1988

    Наука

    1000

    Хансен Г.

    Базы данных

    1998

    Бином

    3000

    Нейбауэр

    Программирование

    1998

    BHV

    4000

    Шилдт Г.

    Программирование

    1996

    BHV

    5000

    Приложение d Примерный перечень заданий на курсовую работу

    1. Информационно-поисковая система Библиотека

    2. Информационно-поисковая система Гостиничный комплекс

    3. Информационно-поисковая система Абитуриент

    4. Информационно-поисковая система Студент

    5. Информационно-поисковая система Фильмотека

    6. Информационно-поисковая система Отдел кадров

    7. Информационно-поисковая система Склад товаров

    8. Информационно-поисковая система Ателье проката

    9. Информационно-поисковая система Поликлиника

    10. Информационно-поисковая система Аптека

    11. Информационно-поисковая система Железнодорожный вокзал

    12. Информационно-поисковая система Междугородняя телефонная станция

    13. Информационно-поисковая система Аэропорт

    14. Информационно-поисковая система Туристическое агентство

    15. Информационно-поисковая система Спортшкола