Сделай Сам Свою Работу на 5

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

Процедуры:

1.Любым действиям с динамической переменной должна предшествовать процедура ее размещения в ОЗУ. Эта процедура имеет вид: New (Var p: Pointer). Она создает новую динамическую переменную, присваивая указателю p значение ее адреса в ОЗУ. При этом динамической переменной отводится блок памяти, соответствующий размеру типа, с которым объявлен указатель p.

2.Когда в ходе вычислительного процесса переменная становится ненужной, ее следует удалить. Это осуществляется процедурой Dispose (Var p: Pointer). Данная процедура освобождает память, занятую динамической переменной, делая значение ее указателя неопределенным.

3.Процедура GetMem (Var p: Pointer, Size: Word), где Word - 2 байта (целые числа от 0 до 65535), создает новую динамическую переменную размером Size байт, устанавливая значения указателя на начало выделяемой ей динамической области оперативной памяти.

4.ПроцедураFreeMem (Var p: Pointer, Size: Word) уничтожает динамическую переменную, освобождая Size байт. После выполнения процедуры FreeMem значение p становится неопределенным.

5.ПроцедураMark (Var p: Pointer)записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.

6.ПроцедураRealease (Var p: Pointer)освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark, т.е. очищает ту динамическую память, которая была занята после вызова процедуры Mark.

 

Функции:

1. MaxAvail: LongInt – возвращает длину в байтах самого длинного свободного участка динамической памяти.

2. MemAvail: LongInt –возвращает размер свободной области динамической памяти (в байтах).

3. Addr(X): Pointer –возвращает адрес объекта, где X - любая переменная, имя процедуры или функции.

4. SizeOf(X): Wordвозвращает объем в байтах, занимаемый X, причем X может быть либо именем переменной любого типа, либо именем типа.

Динамические массивы и матрицы

Указатели чаще всего используются для работы с динамическими массивами памяти, которые представляют собой массивы переменной длины, память под которые может выделяться и изменяться в процессе выполнения программы, как при каждом новом запуске программы, так и в разных ее частях. Обращение к i-му элементу динамического массива x имеет вид x^[i].

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

1. описать указатели;

2. распределить память;

3. обработать динамический массив;

4. освободить память.

Понятие динамического массива можно распространить и на матрицы. Динамическая матрица представляет собой массив указателей, каждый из которых адресует одну строку (или столбец). Рассмотрим описание динамической матрицы. Пусть есть типы данных massiv и указатель на него din_massiv:

type massiv=array [1..1000] of real;

din_massiv=^massiv;

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

var X: array[1..1000] of din_massiv;

Работать с матрицей необходимо следующим образом:

1. определить ее размеры (пусть N – число строк, M – число столбцов);

2. выделить память под матрицу: for i:=1 to N do

getmem(X[i], M*sizeof(real));

Каждый элемент статического массива X[i] – указатель на динамический массив, состоящий из M элементов типа real. В статическом массиве X находится N указателей.

3. для обращения к элементу динамической матрицы, расположенному в i-той строке и j-м столбце, следует использовать следующую конструкцию: X[i]^[j];

4. после завершения работы с матрицей необходимо освободить память:

for i:=1 to N do

freemem(X[i], M*sizeof(real));

 

2. Выполните следующие упражнения:

Задания уровня 1

Упражнение 1. Найти максимальный и минимальный элементы массива x(n).

1. Наберите текст программы:

 

1-ый вариант

Program din_mas1;

type massiw=array [1..150] of real;

var x:^massiw;

i, n: integer; max, min: real;

Begin

new(x); {Выделяем память под динамический массив из 150 вещественных чисел}

writeln (′Введите размер массива′); readln(n);

for i:=1 to N do

Begin

write (′x(′, i, ′)=′); readln(x^[i]);

end;

max:=x^[1]; min:=x^[1];

for i:=2 to N do

Begin

if x^[i] > max then max:=x^[i];

if x^[i] < min then min:=x^[i];

end;

writeln (′максимум= ′, max:1:4, ′минимум= ′, min:1:4);

dispose(x); {Освобождаем память}

End.

2-ой вариант

Program din_mas2;

type massiw=array [1..150] of real;

var x:^massiw;

i, n: integer; max, min: real;

Begin

writeln (′Введите размер массива′); readln(n);

getmem (x, n*sizeof(real)); {Выделяем память под n элементов массива}

for i:=1 to N do

Begin

write (′x(′, i, ′)=′); readln(x^[i]);

end;

max:=x^[1]; min:=x^[1];

for i:=2 to N do

Begin

if x^[i] > max then max:=x^[i];

if x^[i] < min then min:=x^[i];

end;

writeln (′максимум= ′, max:1:4, ′минимум= ′, min:1:4);

freemem (x, n*sizeof(real)); {Освобождаем память}

End.

2. Проанализируйте работу программ

3. Запустите программы на выполнение и проверьте их работу:Ctrl-F9

4. Для просмотра результатов выполненных программ необходимо нажать:Alt-F5

5. Сохраните программы на своем диске:<F2> A:\P12PR1и A:\P12PR2соответственно

 

3. Выполнить самостоятельно:

Задания уровня 2

1. Записать все элементы массива X= (x1, x2, …, xn), удовлетворяющие условию xiЄ[1,2], подряд в массив Y= (y1, y2, …, yn). Определить минимальный элемент массива X. Записать программу под именем P12PR3

2. Переписать элементы массива целых чисел X= (x1, x2, …, xn) в обратном порядке в массив Y=(y1, y2, …, yn). Вычислить количество четных, нечетных и нулевых элементов массива Y. Сохранить программу под именем P12PR4

 

Задания уровня 2

3. Во входном файле расположена последовательность целых чисел. Определите, имеются ли среди этих чисел два совпадающих? Сохранить программу под именем P12PR5

4.Во входном файле расположен символ, за которым следуют 20 различных целых чисел, если этот символ есть i, или 30 различных действительных чисел, если этот символ есть r. Написать программу в результате выполнения которой выводится часть данной последовательности чисел, начиная с первого по порядку и заканчивая минимальным из данных. Сохранить программу под именем P12PR6

 

 

4. Окончание работы:

1. Сохранить созданные программы.

2. Подготовить ответы на контрольные вопросы.

3. Показать работу преподавателю.

4. Завершить работу TURBO PASCAL.

 

Контрольные вопросы:

1. Чем отличаются динамические переменные от статических?

2. Что такое указатель?

3. Если все указатели хранят адреса, зачем различать типы указателей?

4. Какие есть процедуры для работы с указателями?

5. В чем преимущество динамического выделения памяти?

6. Каков порядок работы при использовании динамических переменных?


ПРАКТИЧЕСКАЯ РАБОТА №13

СОСТАВЛЕНИЕ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ МОДУЛЕЙ

В TURBO PASCAL

 

Цель работы Овладеть техникой составления программы с использованием модулей, её компиляции и записи на диск под заданным именем.

 

Задачи работыНаучиться составлять программы с использованием модулей.

Обеспечивающие средства Сборник описаний практических работ, персональный компьютер, конспект лекций.

 

Задание Составить программы для предложенных заданий с использованием модулей, отладить их и сохранить.

 

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

 

Технология работы

1. Ознакомьтесь с теоретическим материалом, необходимым для выполнения работы:

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

Unit <имя_модуля>; {заголовок модуля}

Interfaсe

{интерфейсная часть}

Implementation

{раздел реализации (исполнительная часть)}

Begin

{раздел инициализации модуля}

End.

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

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

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

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

Разработанный модуль сохраняется в файле с расширением .pas. Для компиляции можно воспользоваться внешним компилятором, поставляемым вместе с Турбо Паскалем. Команда будет выглядеть так: TPC имя_файла.pas. Если в тексте нет синтаксических ошибок, получим файл с расширением .tpu, иначе будет выведено сообщение с указанием строки, содержащей ошибку.

Другой вариант компиляции: в меню системы программирования Турбо Паскаль выбрать Compile→Destination Disk, затем - Compile→Build.

Теперь можно подключить модуль к программе, где планируется его использование.

 

2. Выполните следующие упражнения:

Задания уровня 1

Упражнение 1. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P/Q (P -целое , Q - натуральное):

1) сложение;

2) вычитание;

3) умножение;

4) деление;

5) сокращение дроби;

6) возведение дроби в степень N (N - натуральное);



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.