![](/user_photo/2706_HbeT2.jpg)
- •Информатика
- •Лабораторный практикум
- •По программированию
- •На Турбо-Паскале
- •Содержание
- •Предисловие
- •Общая схема выполнения лабораторной работы
- •Лабораторная работа № 1
- •Var r,d: real; {раздел описаний переменных может
- •Блок-схема алгоритма
- •Текст программы
- •Результат расчета
- •Варианты заданий
- •Лабораторная работа № 2
- •If Pr then {здесь Pr – логическая переменная,}
- •Разбор контрольного варианта Задание
- •Блок-схема алгоритма
- •Текст программы
- •Результаты расчетов
- •Варианты заданий
- •Лабораторная работа № 3
- •Общие пояснения
- •Разбор контрольного варианта Задание
- •Алгоритм
- •Текст программы
- •Vvod: writeln('Сколько будет чисел?');
- •Варианты заданий
- •Лабораторная работа № 4
- •Задачи лабораторной работы Вопросы, изучаемые в работе
- •Задание (общее ко всем вариантам)
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Var Massiv1,Nmbs:IntMasMax; {завели 2 целочисл. Массива}
- •Разбор контрольного варианта Задание.
- •Текст программы
- •Результаты работы
- •Варианты заданий
- •Лабораторная работа № 5
- •Общие пояснения
- •Var {здесь выделяется место под все массивы }
- •Разбор контрольного варианта Задание
- •Формирование таблицы идентификаторов
- •Алгоритм
- •Текст программы.
- •Содержимое файла результатов umnik5.Res
- •Варианты заданий
- •Лабораторная работа n 6
- •Задачи лабораторной работы Вопросы, изучаемые в работе
- •Задание (общее ко всем вариантам)
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Разбор контрольного варианта Задание
- •Рассмотрение метода решения
- •Алгоритм
- •Текст программы.
- •Vvod_eps:writeln('введите минимальный размер слагаемого);
- •Результаты расчета
- •Варианты заданий
- •Лабораторная работа n 7
- •Задачи лабораторной работы Вопросы, изучаемые в работе
- •Задание (общее ко всем вариантам).
- •Требования к программе и отчету по работе
- •Содержание программы.
- •Пояснения к лабораторной работе Общие пояснения к использованию процедур и функций.
- •Механизм параметров
- •Разбор контрольного варианта Задание
- •Б Рисунок 7. Алгоритм 31-го варианталок-схема алгоритма Текст программы.
- •Лабораторная работа n 8
- •Алгоритмы построения графиков на экране
- •Стандартный модуль работы с графическим экраном Graph
- •Разбор контрольного варианта № 31 Задание
- •Алгоритм
- •Разбор контрольного варианта № 32 Задание
- •X,y:mas; { текущие значения переменных х иY}
- •Xmin,Xmax,t,tmin,tmax, { минимальное и максимальное значения х на графике }
- •Imin,Imax, { координаты экрана, соответствующиеYminиYmax}
- •Варианты заданий
- •Лабораторная работа № 9
- •Задачи лабораторной работы Вопросы, изучаемые в работе
- •Задание (общее ко всем вариантам)
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Односвязные списки
- •Двусвязные списки
- •Нульсвязные списки
- •Описание файлов с данными
- •Inc(I); { стандартная процедура увеличения на 1 }
- •Разбор контрольного варианта Задание
- •Содержание программы
- •Алгоритм
- •Текст программы
- •IfBegthen{ если добавляем в начало }
- •If Beg then { если удаление из начала }
- •Варианты заданий
- •Литература
- •Приложение а. Система меню и команды Турбо-Паскаля Меню системы программирования Турбо-Паскаль
- •Главное меню
- •Опции главного меню
- •Локальные меню
- •Основные команды встроенного редактора текста
- •Приложение б. Сообщения об ошибках
- •Сообщения об ошибках на шаге выполнения
- •Приложение в. Описание числовых файлов для лабораторных работ
- •I,j : integer; {I- счетчик элементов массива, j - номер символа в файле }
- •Приложение г. Таблица ascii-кодов (с альтернативной кодировкой)
Лабораторная работа № 9
Динамические переменные. Списки
Задачи лабораторной работы Вопросы, изучаемые в работе
Разработка программы с динамическим выделением памяти.
Работа с переменными комбинированного типа записями.
Работа с переменными ссылочного типа указателями.
Программирование списков записей.
Задание (общее ко всем вариантам)
В лабораторной работе требуется сформировать заданный тип списка, заполнить его в соответствии с указаниями варианта задания данными из входного файла (типизированного или текстового) и вывести содержимое списка в виде таблицы в выводной текстовый файл по одной записи в строку.
Файл данных Dan.datнаходится в каталогеD:\LAB1\ и состоит из записей. Первое поле каждой записи файла данных содержит фамилию и инициалы студента, второе и третье поляоценки по дисциплинам, четвертое полесреднюю оценку. ФайлDan.txtрасположен там же и содержит ту же информацию, но в форме символьных строк.
В таблице вариантов указаны условия, которым должны отвечать записи данных, выбираемые из файла, а также типы списка и файла данных. Поля заглавного (в нульсвязных списках – первого обслуживаемого) звена должны содержать сведения о типе списка и количестве звеньев в нем.
В задании для типов списков используются следующие обозначения:
Таблица 30. Обозначения типов списков
Тип списка |
Обозначение |
Односвязный линейный |
S1L |
Односвязный кольцевой, заголовок внутри |
S1KI |
Односвязный кольцевой, заголовок вне |
S1KO |
Двусвязный линейный |
S2L |
Двусвязный кольцевой, заголовок внутри |
S2KI |
Двусвязный кольцевой, заголовок вне |
S2KO |
Стек |
S0S |
Очередь |
S0O |
Дек |
S0D |
Требования к программе
Программа должна содержать комментарий с указанием названия работы, № варианта, фамилии студента и № группы.
Все созданные в программе динамические переменные в конце должны быть удалены с освобождением памяти.
В подпрограммах не использовать глобальные переменные, кроме имен файлов.
Выводимая таблица должна быть озаглавлена в соответствии с заданием (какую выборку из исходного набора данных она содержит).
В заглавном элементе списка должен быть записан тип списка в форме:
Тип списка:<обозначение>и количество записей с данными (в первом целочисленном поле)
Содержание программы
формирование заглавного звена списка;
цикл чтения записей из файла данных и занесения их в список;
заполнение полей записи заглавного звена списка;
вывод записей данных из списка в выводной файл;
удаление списка.
Общие пояснения
Переменные, которые описываются в разделе описаний (VAR), называются статическими. Память для них выделяется перед началом выполнения программы, и во время выполнения программы не может быть изменена. По окончании программы, эта выделенная память автоматически освобождается.
Однако, статические переменные в Паскале не могут в сумме превышать 64 килобайта оперативной памяти. Кроме того, уже при составлении программы необходимо предусмотреть выделение памяти на максимально возможное количество данных, так как заранее требуемый объем данных может быть не известен.
Для устранения этих недостатков можно использовать динамическое выделение памяти под данные в процессе выполнения программы. Такая динамически выделяемая память размещается уже за пределами статического сегмента, и по объему ограничена только размерами свободной памяти ЭВМ.
Переменные, которые размещаются в этой памяти, называются динамическими. У них нет имен и для обращения к ним используются указатели – статические переменные адресного типа (или, что то же самое, ссылочного типа).
Значением указателя является физический адрес переменной базового типа, задаваемого идентификатором типа. Синтаксическое выражение для описания ссылочного типа имеет вид
<типуказатель>::=^<идентификатор базового типа>
где символ ^ признак ссылочного типа;
<идентификатор базового типа>описанное ранее или стандартное имя типа.
Пример описания <типуказатель>:
Type
mas=array[1..100] of real; {тип массив вещественных чисел}
dinmas=^mas; {тип указатель для значений переменных типа mas}
Переменные ссылочного типа вводятся, как и другие переменные, путем перечисления их имен в разделе описания переменных с указанием типа.
Var
Pj:^integer; {указатель целого числа}
Pc:^char; {указатель символа}
Pd:dinmas; {указатель массива}
Для приведенного примера описания динамических переменных Pj,Pc, иPd значениями этих переменных будут, соответственно адреса данных каких-нибудь переменных базовых типов: соответственно целых, символьных и массива вещественных чисел.
Динамические переменные базового типа не имеют имен. В качестве имени для них используются конструкции вида:
^<имя указателя>
Например: Pj^, Pc^, Pd^.
Присваивать значения указателям можно тремя способами:
Записав в него адрес существующей статической переменной, получив его операцией @ : Pj:=@N; конечно, тип переменной должен соответствовать базовому типу, использованному для описания Pj.
Присваиванием значения другого указателя того же типа или стандартного значения nil.
Присваиванием указателю адреса вновь выделенного места в оперативной памяти – то есть адреса начала динамической переменной.
В данной работе будут использоваться второй и третий способы присваивания значений указателям.
Динамическое выделение памяти можно осуществить с помощью процедуры New(P), где Pпеременная типа указатель (ссылка). Эта процедура выделяет память для размещения значений динамической переменной базового типа и присваивает указателю значение адреса выделенной области памяти.
New(Pj);Pj
Чтобы обратиться к динамической переменной, необходимо применить операцию "разыменования" к указателю на эту переменную, используя знак операции "^" после имени указателя. Например, после выделения области памяти для хранения значений динамической переменной, ей можно присвоить значение оператором:
Pj^:=3;
Pj
Чтобы освободить выделенную область памяти для использования другими динамическими переменными нужно воспользоваться процедурой Dispose(Pj),которая является обратной, по отношению к процедуреNew(Pj):
Dispose(Pj);Pj
После освобождения выделенной памяти необходимо очистить указатель, ссылавшийся на удаленную динамическую переменную. Это выполняется присваиванием указателю "несуществующего" нулевого адреса nil:
Рj:=nil;Pj
При работе с динамическими переменными важно помнить, что любая память, выделенная процедурой new, должна быть освобождена в программе процедурой DISPOSE !
Динамическая память чаще всего используется для хранения табличных данных. При этом строки таблиц называются записями и описываются как переменные комбинированного типа (типа record), а столбцы описываются как поля соответствующих типов, принадлежащие этим записям. В записях также предусматриваются поля указателей (адресов в памяти) последующих и предыдущих записей для организации связей с ними.
В зависимости от количества ссылочных полей в каждой записи (элементе списка) списки делятся на нуль-, одно-, двух- и многосвязные. Если у списка имеются концевые элементы, он называется линейным, если последний элемент списка связан с первым (или с заголовком) – список называется кольцевым.
В языке Паскаль для списков, в отличие от массивов и структур, нет специального ключевого слова для описания переменных типа списка. Их создают с помощью комбинированных записей, содержащих ссылочные поля.
Ниже приведены схемы различных видов списков записей. На них символами "*" отмечены поля ссылок. Стрелками показаны связи между записями. Поля данных заглавных звеньев обычно используются для хранения общей информации о списках.