- •Указания по выполнения практических и лабораторных работ
- •Лабораторная работа № 1 Блок-схемы как графическое представление алгоритмов. Основные блоки, используемые в блок- схемах алгоритмов
- •Краткие теоретические сведения Основные этапы решения задач на компьютере
- •Языки программирования
- •Трансляторы
- •Язык программирования Паскаль
- •Использование среды программирования турбо паскаль
- •Порядок выполнения работы
- •Типы вычислительных процессов
- •Блок-схемы алгоритмов
- •Примеры составления блок-схемы алгоритма
- •Основные файлы пакета Турбо Паскаль
- •Запуск интегрированной среды программирования Турбо Паскаль
- •Работа с меню ис
- •Меню File
- •Меню Run
- •Меню Compile
- •Меню Debug
- •Меню Tools
- •Меню Options
- •Меню Window
- •Меню Help
- •Порядок выполнения работы
- •Процедуры ввода-вывода
- •Порядок выполнения работы
- •Оператор записи WriteLn аналогичен процедуре Write, но после вывода последнего в списке значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки.
- •Пример программы с использованием процедур ввода-вывода данных с различными форматами выводимых данных
- •Порядок выполнения работы
- •Операторы языка Паскаль
- •Оператор присваивания
- •Оператор безусловного перехода (go to)
- •Порядок выполнения работы
- •Оператор выбора case
- •Порядок выполнения работы
- •Оператор повтора for
- •Примеры программ с использованием оператора for
- •Оператор повтора Repeat
- •Пример программы с использованием оператора repeat
- •Пример программы с использованием операторов присваивания, повтора и выбора
- •Порядок выполнения работы
- •Пример программы с использованием оператора повтора while
- •Порядок выполнения работы
- •Примеры описания одномерных и двумерных массивов
- •Действия над массивами
- •Действия над элементами массива
- •Ввод-вывод элементов массива
- •Пример программы ввода-вывода одномерного массива
- •Пример программы ввода-вывода двумерного массива
- •Порядок выполнения работы
- •Пример программы нахождения в одномерном массиве максимального элемента
- •Порядок выполнения работы
- •Порядок выполнения работы
- •Основные логические структуры:
- •Функции в Паскале
- •Встроенные функции и процедуры
- •Арифметические процедуры и функции
- •Скалярные процедуры и функции
- •Функции преобразования типов
- •Процедуры управления программой
- •Специальные процедуры и функции
- •Вызов стандартной процедуры или функции
- •Порядок выполнения работы
- •Пример программы с использованием функции, определенной пользователем
- •Порядок выполнения работы
- •Пример программы с использованием процедуры, определенной пользователем
- •Механизм передачи параметров
- •Порядок выполнения работы
- •Нетрадиционное использование подпрограмм. Косвенная рекурсия
- •Порядок выполнения работы
- •Линейный поиск
- •Линейный поиск в упорядоченном массиве данных
- •Бинарный (двоичный) поиск
- •Пример программы с использованием алгоритма бинарного поиска
- •Порядок выполнения работы
- •Методы внутренней сортировки
- •Сортировки включением
- •Сортировка выбором
- •Порядок выполнения работы
- •Шейкерная сортировка
- •Пирамидальная сортировка
- •Обменная сортировка разделением
- •Порядок выполнения работы
- •Естественное слияние
- •Многопутевое слияние
- •Порядок выполнения работы
- •Пример разработки собственного модуля
- •Порядок выполнения работы
- •Скалярные процедуры и функции
- •Функции преобразования типов
- •Процедуры управления программой
- •Специальные процедуры и функции
- •Вызов стандартной процедуры или функции
- •Порядок выполнения работы
- •Формат описания строкового типа
- •Фрагмент описания строковых данных
- •Стандартные строковые процедуры и функции
- •Пример программы работы со стандартными строковыми процедурами и функциями
- •Примеры программ работы со строковыми переменными
- •Порядок выполнения работы
- •Пример программы работы с записями
- •Порядок выполнения работы
- •Пример программы работы с записями
- •Порядок выполнения работы
- •Операции над множествами
- •Объединение Пересечение Разность
- •Порядок выполнения работы
- •Формат описания файлового типа
- •Средства обработки файлов
- •Текстовые файлы
- •Пример программы работы с текстовым файлом
- •Порядок выполнения работы
- •Средства работы с типизированными файлами
- •Пример программы работы с типизированным файлом
- •Порядок выполнения работы
- •Средства работы с нетипизированными файлами
- •Пример программы для работы с типизированными файлами
- •Порядок выполнения работы
- •Распределение памяти при выполнении программы
- •Пример программы распределения памяти и получения доступа к полям psp.
- •Порядок выполнения работы
- •Статические и динамические переменные
- •Указатели
- •Типизированные указатели
- •Нетипизированный указатель (pointer)
- •Доступ к переменной по указателю
- •Управление динамической памятью
- •Процедуры динамического распределения
- •Пример программы с использованием динамической памяти
- •Порядок выполнения работы
- •Пример программы создания и использования связанного списка
- •Порядок выполнения работы
- •Параметр процедурного типа
- •Порядок выполнения работы
- •Контрольные вопросы
- •Литература
- •Содержание
Пример программы распределения памяти и получения доступа к полям psp.
{Программа, демонстрирующая распределение памяти}
program Demo_Size;
uses Crt;
var
P : pointer;
I : word; procedure ProgSize;
var
SysemTotalSize : word {Общий размер кучи}
PrefixSize : word {Размер PSP}
CodeSize : word {Размер сегмента кода}
DataSize : word {Размер сегмента данных}
HeapSIze : word {Размер динамической памяти}
AllocHeapSize: word {Размер занятой части динамической памяти}
Factor : real ;
S : string[80] ;
LI : byte absolute S;
1,1 : byte;
function Lin_Adr (P : pointer) : longint; {Вычисление абсолютного (линейного) адреса объекта по обычному сегментному адресу}
begin
Lin_Adr:=longint(Seg(P^)*16+0fs(Р^);
end;
begin {Начало процедуры}
SystemTotalSize := 640*1024 div 16;
PrefixSize := 256 div 16;
CodeSize := Dseg — PrefixSeg — PrefixSize;
DataSize := SegtHeapOrg^ — SSeg;
HeapSize ;= Mem[PrefixSeg:2] - Seg (HeapOrg^);
AllocHeapSize := (Lin_Adr(HeapPtr)-Lin_Adr(HeapOrg)+1) div 16;
Writein (' Распределение памяти: ');
Factor := 67 / SystemTotalSize;
L:= Round(Factor*PrefixSize) ;
FillChar(S[l],L,#176) ;
Writeln ('PSP ',PrefixSize:5,' ',S);
L := Round(Factor*CodeSize) ;
FillChar(S[l],L,#176) ;
Writeln('Код ',CodeSize:5,' ',8);
L := Round(Factor*DataSize) ;
FillChar(S[l],L,#176) ;
Writeln ('Данные ',DataSize:5,' ',S);
L := Round(Factor*HeapSize) ;
LI := Round(Factor*AllocHeapSize) ;
FillChar(S[l],LI,#176) ;
FillChar(S[LI+l],L-LI,#219) ;
Writein ('Куча:', HeapSize: 5,' ',S);
Writein end;
begin {Основная программа}
Randomize;
for I:=l to 100 do {Попробуйте поменять конечное значение параметра I (от 1 до 1000)}
GetMam(P,Random(1000)); {Занимаем часть динамической.памяти блоками случайных размеров}
ProgSize; {Выводим на экран карту памяти}
end.
Порядок выполнения работы
Изучить теоретические сведения по теме: “Изучение карты памяти. Разработка программы доступа к полям PSP”.
Изучить программу распределения памяти и доступа к полям PSP.
Показать работающую программу преподавателю.
Ответить на контрольные вопросы.
Контрольные вопросы
Адреса MS-DOS. Абсолютный адрес, сегмент, смещение.
Карта распределения памяти при выполнении программы.
Сегмент кода, сегмент данных, сегмент стека. Назначение каждого из сегментов.
Лабораторная работа № 32
Разработка программы использования динамической памяти
Цель работы: формирование знаний и умений по работе с динамической памятью. Приобретение навыков работы с динамическими переменными, указателями.
Краткие теоретические сведения
В любой вычислительной системе память относится к таким ресурсам, которых всегда не хватает. Управление памятью — одна из главных забот программиста, так как для него очень важно создавать программы, эффективно использующие память, ведь во время выполнения программы память необходима для следующих элементов программ и данных:
• сама программа пользователя;
• системные программы времени выполнения, которые осуществляют вспомогательные действия при работе программы пользователя;
• определяемые пользователем структуры данных и константы;
• точки возврата для подпрограмм;
• временная память для хранения промежуточных результатов при вычислении выражений;
• временная память при передаче параметров и т.п.
Из этого перечня видно, что управление памятью касается широкого класса объектов. Ранее в программах использовался простейший способ распределения памяти — статическое распределение, т. е. распределение памяти при трансляции программы. Статическое распределение памяти эффективно, поскольку на управление памятью не тратится ни время, ни память. В данной лабораторной работе рассматривается динамическое (во время выполнения программы) управление памятью.