- •Информатика и Программирование
- •4.Понятие процедуры и функции в Паскале. Их назначение, применение, варианты размещения в программе
- •7.Сравнительный анализ возможностей процедуры и функции. Возможности преобразования процедуры в функцию и наоборот
- •8.Понятие рекурсии. Рекурсивные процедуры и функции, их применение, достоинства и недостатки
- •10.Запись как тип данных. Работа с записями: описание записи, оператор присоединения, запись с вариантами. Использование записей
- •12.Статическая и динамическая память. Общие сведения об управлении динамической памятью с помощью стандартных процедур и функций (GetMem, FreeMem; New, Dispose)
- •1. Автоматически по завершении всей программы.
- •2. С помощью стандартной процедуры dispose.
- •3. С помощью стандартной процедуры frеемеm.
- •4. С помощью стандартных процедур маrk и release.
- •13.Динамические структуры данных. Динамические массивы (одномерные и двумерные), работа с ними
- •14.Динамические структуры данных. Списки. Основные виды списков. Действия со списками
- •15.Однонаправленные (линейные) списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •16.Двунаправленные, симметричные списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •17.Кольцевые, циклические списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •18.Бинарное дерево. Основные определения и понятия. Бинарный поиск по дереву. Формирование бинарного дерева этим методом
- •19.Бинарное дерево. Основные операции с бинарными деревьями. Способы обхода бинарного дерева. Варианты поиска по бинарному дереву
- •20.Рекурсия при работе со списками и деревьями. Очередь, стек, дек как формы работы со списком, действия над ними
- •21.Тестирование. Понятие и цель тестирования. Правильное и неправильное определение тестирования. Основные определения. Тестирование методом «чёрного ящика». Тестирование методом «белого ящика»
- •22.Отладка. Общие принципы, методы отладки. Взаимосвязь процессов тестирования и отладки, использование автоматических средств отладки
- •23.Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Отличие объектно-ориентированного подхода от модульного при разработке программ
- •25.Основные отличия языка Object Pascal (Delphi) от Turbo Pascal. Динамические массивы в Delphi: описание, особенности, применение
- •26.Структура модулей в Delphi. Интерфейсная, исполняемая части, инициирующая и завершающая части. Процедуры и функции: особенности в Delphi
- •27.Работа с файлами и папками в Delphi: стандартные процедуры и функции, дополнительные возможности по сравнению с Паскалем, окна диалогов работы с файлами
- •28.Определение термина «сертификация», виды сертификации. Организационная система сертификации
- •29.Основные функции органа по сертификации
- •30.Правовые основы сертификации в Российской Федерации. Требования, предъявляемые к испытательным лабораториям
- •31.Значение метрологии программных средств для повышения их качества и конкурентоспособности
- •32.Качество программного средства и его оценка. Показатели качества программных средств
- •33.Надёжность программных средств и её оценка. Модели надёжности
- •34.Проблемы, цели и задачи технико-экономического анализа разработки программных средств. Показатели технико-экономического анализа
- •35.Оценка экономической эффективности программных средств
- •36.Сертификация, метрология и научно-технический прогресс
13.Динамические структуры данных. Динамические массивы (одномерные и двумерные), работа с ними
Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.
Можно отметить следующие достоинства динамической памяти:
1) Экономичность и эффективность ее использования;
2) возможность динамического изменения числа элементов в связанных структурах, например в списках;
3) статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические – и после выхода из блока до окончания программы.
4) Переменная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе. компилятор не планирует выделение места в памяти под такие переменные.
В Delphi:
Динамический массив — это массив, память для которого выделяется динамически. Размерность динамического мас¬сива на момент компиляции не известна. Для объявления такого мас¬сива применяется обычное описание, но без указания размерности. Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.
Динамические массивы— это тип данных с управля¬емым временем жизни, поэтому можно не думать о своевременном освобождении выделенной им памя¬ти — она будет освобождена автоматически, когда дан¬ная переменная покинет область видимости.
Описание динамического массива:
Type <Имя типа массива> = Array of <Тип элементов>
Память для элементов динамического массива выделяется с помощью вызова стандартной процедуры Setlength. Первым ее параметром является имя массива, а вторым задается требуемое количество его элементов. Использование таких массивов удобно тогда, когда мы изначально не можем точно определить его размер.
Пример динамического массива:
TYPE CODES = ARRAY OF INTEGER;
VAR A:CODES;
BEGIN
SETLENGTH (A,30);
A[0]:= 'POOH LIKES HUNNY'
END;
Необходимо учитывать, что динамический массив индексируется значениями, отсчет которых начинается с 0. Чтобы обратиться к первому элементу массива, необходимо использовать индекс 0, а к последнему – 29.
При необходимости память, выделенную под массив, можно освободить самостоятельно (например, если массив использовал слишком большое ее количество). Для этого достаточно просто присвоить массиву значение nil. Например: A:= nil;
Пример многомерного динамического массива:
Type Codes = array of array of array of integer;
var A:Codes;
Begin
Setlength (A,10,20,30);
end;
Массив А имеет 10 элементов, каждый массив A[i] имеет 20 элементов, а массивы A[i][j] – 30 элементов
Динамические массивы в Pascal.
Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой). Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» 4 байта статической памяти.
Описание типа указатель:
Type <идентификатор указателя>=^<тип>;
P=^Word; P – идентификатор типа «указатель» на данные типа WORD.
Динамическая память может быть выделена двумя способами:
New (p), где Р – переменная типа «типизированный указатель»
Getmem (P, size), где Р – переменная типа «указатель» требуемого типа, а size – целочисленное выражение размера запрашиваемой памяти в байтах. Эта процедура создает новую динамическую переменную требуемого размера и свойства, а также помещает адрес этой созданной переменной в переменную Р типа «указатель». Доступ к значению созданной переменной можно получить с помощью P^.
При работе с массивами практически всегда возникает задача настройки программы на фактическое количество элементов массива. В зависимости от применяемых средств решение этой задачи бывает различным.
Первый вариант - использование констант для задания размерности массива. Такой способ требует перекомпиляции программы при каждом изменении числа обрабатываемых элементов.
PROGRAM FIRST;
CONST
N : INTEGER = 10;
{ ЛИБО N = 10; }
VAR
A : ARRAY [ 1..N ] OF REAL;
I : INTEGER;
BEGIN
FOR I := 1 TO N DO
BEGIN
WRITELN (' ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');
READLN ( A [ I ] )
END;
{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ N}
Второй вариант - программист планирует некоторое условно максимальное (теоретическое) количество элементов, которое и используется при объявлении массива. При выполнении программа запрашивает у пользователя фактическое количество элементов массива, которое должно быть не более теоретического. На это значение и настраиваются все циклы работы с массивом.
PROGRAM SECOND;
VAR
A : ARRAY [ 1..25 ] OF REAL;
I, NF : INTEGER;
BEGIN
WRITELN ('ВВЕДИТЕ ФАКТИЧЕСКОЕ ЧИСЛО ЭЛЕМЕНТОВ’,
‘ МАССИВА <= 25 ');
READLN ( NF );
FOR I := 1 TO NF DO
BEGIN
WRITELN ('ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');
READLN ( A [ I ] )
END;
{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ NF}
Этот вариант более гибок и технологичен по сравнению с предыдущим, так как не требуется постоянная перекомпиляция программы, но очень нерационально расходуется память, ведь ее объем для массива всегда выделяется по указанному максимуму. Используется же только часть ее.
Вариант третий - в нужный момент времени надо выделить динамическую память в требуемом объеме, а после того, как она станет не нужна, освободить ее.
PROGRAM DYNAM_MEMORY;
TYPE
MAS = ARRAY [ 1..2 ] OF < ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА >;
MS = ^ MAS;
VAR
A : MS;
I, NF : INTEGER;
BEGIN
WRITELN ('ВВЕДИТЕ ФАКТИЧЕСКОЕ ЧИСЛО ЭЛЕМЕНТОВ МАССИВА');
READLN ( NF );
GETMEM ( A, SIZEOF ( < ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА>)*NF);
FOR I := 1 TO NF DO
BEGIN
WRITELN ('ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');
READLN ( A^ [ I ] )
END;
{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ NF}
. . . . .
FREEMEM (A, NF*SIZEOF (< ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА>));
END.