- •Информатика и Программирование
- •Понятие процедуры и функции в Паскале. Их назначение, применение, варианты размещения в программе
- •Сравнительный анализ возможностей процедуры и функции. Возможности преобразования процедуры в функцию и наоборот
- •Понятие рекурсии. Рекурсивные процедуры и функции, их применение, достоинства и недостатки
- •Запись как тип данных. Работа с записями: описание записи, оператор присоединения, запись с вариантами. Использование записей
- •Статическая и динамическая память. Общие сведения об управлении динамической памятью с помощью стандартных процедур и функций (GetMem, FreeMem; New, Dispose)
- •1. Автоматически по завершении всей программы.
- •2. С помощью стандартной процедуры dispose.
- •3. С помощью стандартной процедуры frеемеm.
- •4. С помощью стандартных процедур маrk и release.
- •Динамические структуры данных. Динамические массивы (одномерные и двумерные), работа с ними
- •Динамические структуры данных. Списки. Основные виды списков. Действия со списками
- •Inf1 : integer; { первое информационное поле }
- •Inf2 : string; { второе информационное поле }
- •Однонаправленные (линейные) списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •Двунаправленные, симметричные списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •Inf1 : integer; { первое информационное поле }
- •Inf2 : string; { второе информационное поле }
- •Кольцевые, циклические списки. Описание, создание, просмотр списка, добавление и удаление элементов
- •Inf1 : integer; { первое информационное поле }
- •Inf2 : string; { второе информационное поле }
- •Бинарное дерево. Основные определения и понятия. Бинарный поиск по дереву. Формирование бинарного дерева этим методом
- •Бинарное дерево. Основные операции с бинарными деревьями. Способы обхода бинарного дерева. Варианты поиска по бинарному дереву
- •Рекурсия при работе со списками и деревьями. Очередь, стек, дек как формы работы со списком, действия над ними
- •Тестирование. Понятие и цель тестирования. Правильное и неправильное определение тестирования. Основные определения. Тестирование методом «чёрного ящика». Тестирование методом «белого ящика»
- •Отладка. Общие принципы, методы отладки. Взаимосвязь процессов тестирования и отладки, использование автоматических средств отладки
- •Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Отличие объектно-ориентированного подхода от модульного при разработке программ
- •Основные отличия языка Object Pascal (Delphi) от Turbo Pascal. Динамические массивы в Delphi: описание, особенности, применение
- •Структура модулей в Delphi. Интерфейсная, исполняемая части, инициирующая и завершающая части. Процедуры и функции: особенности в Delphi
- •Работа с файлами и папками в Delphi: стандартные процедуры и функции, дополнительные возможности по сравнению с Паскалем, окна диалогов работы с файлами
- •Определение термина «сертификация», виды сертификации. Организационная система сертификации
- •Основные функции органа по сертификации
- •Правовые основы сертификации в Российской Федерации. Требования, предъявляемые к испытательным лабораториям
- •Значение метрологии программных средств для повышения их качества и конкурентоспособности
- •Качество программного средства и его оценка. Показатели качества программных средств
- •Надёжность программных средств и её оценка. Модели надёжности
- •Проблемы, цели и задачи технико-экономического анализа разработки программных средств. Показатели технико-экономического анализа
- •Оценка экономической эффективности программных средств
- •Сертификация, метрология и научно-технический прогресс
-
Динамические структуры данных. Динамические массивы (одномерные и двумерные), работа с ними
Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.
Можно отметить следующие достоинства динамической памяти:
-
Экономичность и эффективность ее использования;
-
возможность динамического изменения числа элементов в связанных структурах, например в списках;
-
статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические – и после выхода из блока до окончания программы.
-
Переменная, размещаемая динамически, не объявляется в разделе 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.