Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Процедуры преобразования типов




Процедура Str (x, s) преобразует числовое значение x в строку s, при этом для x может быть задан формат, как в процедурах вывода writeи writeln. Например:

x:= 123;s:= str(x:6,s);

Результат: s = ' 123'.

Процедура Val (s, x, errcode) преобразует строку s в значение числовой переменной x, при этом строка s должна содержать символьное представление числа. В случае успешного преобразования переменная errcode равна нулю. Если же обнаружена ошибка, то errcode будет содержать номер позиции первого ошибочного символа, а значение x не определено.

14. Запись — это составной тип данных, состоящий из фиксированного числа элементов одного или нескольких типов. Описание типа записи начинается словом record и заканчивается словом end. Между ними заключен список элементов, называемых полями, с указанием идентификаторов полей и типа каждого поля:

type
TPerson = record
FirstName: string[20]; // имя
LastName: string[20]; // фамилия
BirthYear: Integer; // год рождения
end;
Идентификаторы полей должны быть уникальными только в пределах записи. Допускается вложение записей друг в друга, т.е. поле записи может быть в свою очередь тоже записью.

Чтобы получить в программе реальную запись, нужно создать переменную соответствующего типа:

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

Как любой тип, создаваемый программистом, тип "запись" должен быть объявлен в разделе type. В общем виде объявление типа "запись" выглядит так:

Имя = record

Поле_1: Тип_1; Поле_2: Тип_2; Поле_К: Тип_К;

end;

где: Имя — имя типа "запись"; record — зарезервированное слово языка Delphi, означающее, что далее следует объявление компонентов (полей) записи; поле_i и тил_i — имя и тип i-го компонента (поля) записи, где i=1,..., k; end — зарезервированное слово языка Delphi, означающее, что список полей закончен. Примеры объявлений:

 

Массив записей - это новый тип массива, в котором разрешается накапливать в виде записей разнородные данные. Отличительная особенность такого массива наличие именованных полей.

MATLAB поддерживает следующие функции при работе с массивами записей:

Функция Описание
struct Создать массив записей.
fieldnames Получить имена полей.
getfield Получить содержимое поля.
setfield Установить содержимое поля.
rmfield Удалить поле.
isfield Истинно, если это поле массива записей.
isstruct Истинно, если это массив записей.

Пользователь может расширить состав функций, создавая специальные М-файлы для обработки конкретных данных.

Определение структуры. Структура - это массив записей с именованными полями, предназначенными для хранения данных; причем поле может содержать данные любого типа.

15. Множеством называется совокупность однотипных элементов, рассматриваемых как единое целое. В Паскале могут быть только конечные множества. В Турбо Паскале множество может содержать от 0 до 255 элементов.

В отличие от элементов массива элементы множества не пронумерованы, не упорядочены. Каждый отдельный элемент множества не идентифицируется, и с ним нельзя выполнить какие-либо действия. Действия могут выполняться только над множеством в целом.

Тип элементов множества называется базовым типом. Базовый тип может быть любым скалярным, за исключением типа Real.

Конструктор множества. Конкретные значения множества задаются с помощью конструктора множества, представляющего собой список элементов, заключенный в квадратные скобки. Сами элементы могут быть либо константами, либо выражениями базового типа. Вот несколько примеров задания множеств с помощью конструктора:

[3,4,7,9,12] — множество из пяти целых чисел;

[1.. 100] — множество целых чисел от 1 до 100;

['a','b','c'] — множество, содержащее три литеры а, Ь, с;

['a'.,'z','?','!'] — множество, содержащее все прописные латинские буквы, а также знаки? и!.

Символы [] обозначают пустое множество, т.е. множество, не содержащее никаких элементов.

Не имеет значения порядок записи элементов множества внутри конструктора. Например, [1,2,3] и [3,2,1] эквивалентные множества.

Каждый элемент в множестве учитывается только один раз. Поэтому множество [1,2,3,4,2,3,4,5] эквивалентно [1.. 5 ].

Переменные множественного типа описываются так:

Var <идентификатор>: Set Of <базовый тип>

Например:

Var A,D: Set Of Byte;

В: Set Of ' a'.. ' z;

C: Set Of Boolean;

Нельзя вводить значения во множественную переменную оператором ввода и выводить оператором вывода. Множественная переменная может получить конкретное значение только в результате выполнения оператора присваивания следующего формата:

<множественная переменная>: <множественное выражение>

Например:

А:=[50,100,150,200];

B:=['m', 'n','k'];

С:=[True,False];

D:=A;

Кроме того, выражения могут включать в себя операции над множествами.

16. Для множеств определены следующие операции:
+ объединение множеств;
- разность множеств;
* пересечение множеств;
= проверка эквивалентности двух множеств;
<> проверка неэквивалентности двух множеств;
<= проверка того, является ли левое множество подмножеством правого множества;
>= проверка того, является ли правое множество подмножеством левого множества;
in проверка того, входит ли элемент, указанный слева, в множество, указанное справа.
Результатом операций объединения, разности или пересечения является соответствующее множество, остальные операции дают результат логического типа.

Операция (=)
два множества А и В равны, если они состоят из одних и тех же элементов, порядок следования элементов значения не имеет.

Операция (<>)
два множества А и В не равны, если они отличаются по мощности (количеству элементов) или по значению хотя бы одного элемента.

Операция (>=)
используется для определения принадлежности множеств. Результат операции А>=В – TRUE, если все элементы множества В содержатся в множестве А.

Операция объединения множеств (+)
объединением двух множеств является третье множество, содержащее элементы обоих множеств без дублирования.

Операция пересечения (*)
пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.

Операция разности (-)
разностью двух множеств является третье множество, элементы которого не входят во второе множество, но содержатся в первом.

Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что даст возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного тиля. Таким компонентом может быть любой тип Turbo Pascal, кроме файлового. Например, допускается файл записей или файл строк, но нельзя создать «файл файлов». В-третьих, длина создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Компилятор Turbo Pascal поддерживает три типа файлов: текстовые, типизированные и нетипизированные.

17. Особое место в языке ПАСКАЛЬ занимают текстовые файлы, компоненты которых имеют символьный тип. Для описания текстовых файлов в языке определен стандартный тип Тext:

var TF1, TF2: Text;

Текстовые файлы представляют собой последовательность строк, а строки - последовательность символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки.

С признаком конца строки связана функция EOLn(var T:Text):Boolean, где Т - имя текстового файла. Эта функция принимает значение TRUE, если достигнут конец строки, и значение FALSE, если конец строки не достигнут.

Для операций над текстовыми файлами, кроме перечисленных, определены также операторы обращения к процедурам:

ReadLn(T) - пропускает строку до начала следующей;

WriteLn(T) - завершает строку файла, в которую производится запись, признаком конца строки и переходит к началу следующей.

Для работы с текстовыми файлами введена расширенная форма операторов ввода и вывода. Оператор

Read(T,X1,X2,...XK)

эквивалентен группе операторов

begin Read(T,X1); Read(T,X2);........... Read(T,XK) end;

Здесь Т - текстовый файл, а переменные Х1, Х2,...ХК могут быть либо переменными целого, действительного или символьного типа, либо строкой. При чтении значений переменных из файла они преобразуются из текстового представления в машинное.

К текстовым файлам относятся стандартные файлы INPUT, OUTPUT.

Рассмотренные ранее операторы ввода - вывода являются частным случаем операторов обмена с текстовыми файлами, когда используются стандартные файлы ввода - вывода INPUT, OUTPUT.

Работа с этими файлами имеет особенности:

· имена этих файлов в списках ввода - вывода не указываются;

· применение процедур Reset, Rewrite и Close к стандартным файлам ввода - вывода запрещено;

· для работы с файлами INPUT, OUTPUT введена разновидность функции EOLn без параметров.

TURBO PASCAL вводит дополнительные процедуры и функции, применимые только к текстовым файлам, это SetTextBuf, Append, Flush, SeekEOLn, SeekEOF.

Процедура SetTextBuf(var f: Text; var Buf; BufSize: Word) служит для увеличения или уменьшения буфера ввода - вывода текстового файла f. Значение размера буфера для текстовых файлов по умолчанию равно 128 байтам. Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять разиер буфера до открытия файла. Буфер файла начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.

Процедура Append(var f: Text) служит для специального открытия выходных файлов. Она применима к уже существующим физическим файлам и открывает из для дозаписи в конец файла.

Процедура Flush(var f: Text) применяется к открытым выходным файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения.

Функция SeekEOLn(var f: Text): Boolean возвращает значение True, если до конца строки остались только пробелы.

Функция SeekEOF(var f: Text): Boolean возвращает значение True, если до конца файла остались строки, заполненные пробелами.

18.

19. Бестиповые файлы позволяют записывать на диск произвольные участки пвмяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с компонентными файлами.

Перед использованием логический файл

var f: File;

должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close.

При открытии файла длина буфера устанавливается по умолчанию в 128 байт. TURBO PASCAL позволяет изменить размер буфера ввода - вывода, для чего следует открывать файл расширенной записью процедур

Reset(var f: File; BufSize: Word)

или

Rewrite(var f: File; BufSize: Word)

Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение BufSize - 1 байт, максимальное - 64 К байт. Чтение данных из бестипового файла осуществляется процедурой BlockRead(var f: File; var X; Count: Word; var QuantBlock: Word);

Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов. Необязательный параметр QuantBlock возвращает число блоков (буферов), прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.

Запись данных в бестиповой файл выполняется процедурой BlockWrite(var f: File; var X; Count: Word; var QuantBlock: Word); которая осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Необязательный параметр QuantBlock возвращает число блоков(буферов), записанных успешно текущей операцией BlockWrite.

20. Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов file of:

var имя: file of тип_компонент;

 

Компоненты могут быть любого типа, кроме файлового. В операциях ввода-вывода могут участвовать только величины того же типа, что и компоненты файла, например:

type mas = array [1.. 100] of real;

var a, b: mas;

f: file of mas;

begin

assign(f, 'some_file.dat'); rewrite(f);

...

write(f, a, b);

close(f)

end.

 

21.

22. Подпрограмма - это отдельная функционально независимая часть программы.

23. Подпрограммы решают три важные задачи:

· избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;

· улучшают структуру программы, облегчая ее понимание;

· повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификациях программы.

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

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

Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).

Help содержит подробные описания предусмотренных средой программирования процедур и функций. Для вызова подсказки при работе со стандартными процедурами и функциями нужно поставить на имя подпрограммы курсор и нажать клавиши <Ctrl+F1>. Справочная информация о процедурах и функциях в Help имеет стандартную структуру.

Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.

Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.

Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных и с помощью параметров подпрограммы.

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

Память для локальных (т.е. описанных в подпрограмме) переменных выделяется на время исполнения данной подпрограммы в специальной области, называемой стеком. При завершении работы подпрограммы память освобождается, поэтому все внутренние результаты работы подпрограммы не сохраняются от одного обращения к другому.

24. Список параметров, то есть величин, передаваемых в подпрограмму и обратно, содержится в ее заголовке. Для каждого параметра обычно задается его имя, тип и способ передачи. Либо тип, либо способ передачи могут не указываться.

Важно запомнить, что в заголовке подпрограммы нельзя вводить описание нового типа, там должны использоваться либо имена стандартных типов, либо имена типов, описанных программистом ранее в разделе type.

В Паскале четыре вида параметров:

· значения;

· переменные;

· константы;

· нетипизированные параметры.

Кроме того, по другим критериям можно выделить особые виды параметров:

· открытые массивы и строки;

· процедурные и функциональные параметры;

· объекты.

Параметры-значения

Параметр-значение описывается в заголовке подпрограммы следующим образом:

имя: тип;

 

Например, передача в процедуру Р величины целого типа записывается так:

procedure P(x: integer);

 

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

Механизм передачи следующий: из ячейки памяти, в которой хранится переменная, передаваемая в подпрограмму, берется ее значение и копируется в область сегмента стека, называемую областью параметров. Подпрограмма работает с этой копией, следовательно, доступа к ячейке, где хранится сама переменная, не имеет. По завершении работы подпрограммы стек освобождается. Такой способ называется передачей по значению.

При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение. Тип выражения должен быть совместим по присваиванию с типом параметра.

Например, если в вызывающей программе описаны переменные

var x: integer;

c: byte;

y: longint;

 

то следующие вызовы подпрограммы Р, заголовок которой описан выше, будут синтаксически правильными:

P(x); P(c); P(y); P(200); P(x div 4 + 1);

 

Недостатками передачи по значению являются затраты времени на копирование параметра, затраты памяти в стеке и опасность его переполнения, когда речь идет о параметрах, занимающих много места - например, массивах большого размера. Поэтому более правильно использовать для передачи в подпрограмму исходных данных параметры-константы, о которых речь пойдет чуть дальше.

Параметры-переменные

Признаком параметра-переменной является ключевое слово var перед описанием параметра:

var имя: тип;

 

Например, передача в процедуру Р параметра-переменной целого типа записывается так:

procedure P(var x: integer);

 

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

 

25. Язык Perl допускает, чтобы подпрограмма вызывала саму себя. Подпрограмма, вызывающая сама себя, называется рекурсивной. При написании, рекурсивных подпрограмм следует иметь в виду, что все переменные, значения которых изменяются внутри подпрограммы, должны быть локальными, то есть объявленными при помощи функции my() или local(). В этом случае при каждом вызове подпрограммы создается новая копия переменной, что позволяет избежать неопределенности и замещения текущего значения переменной ее значением из следующего вызова подпрограммы.

Рекурсивные подпрограммы следует применять осторожно. Многие алгоритмы, являющиеся по сути итеративными, можно реализовать при помощи рекурсивной подпрограммы, но такая подпрограмма окажется неэффективной по времени выполнения и потребляемым ресурсам памяти. Вместе с тем, существуют задачи, решить которые можно только при помощи рекурсивных алгоритмов. В этом случае применение рекурсивных подпрограмм является не только вполне оправданным, но и необходимым. Одной из таких задач, которую операционная система решает постоянно, является рекурсивный просмотр дерева каталогов. Рассмотрим пример рекурсивной Perl-подпрограммы tree(), которая делает то же самое: просматривает дерево каталогов, начиная с каталога, заданного (листинг 9.10).

Листинг 9.10. Рекурсивный просмотр дерева каталогов

sub tree { local (*ROOT); my ($root) = $_[0]; opendir ROOT, $root; my (@filelist) = readdir ROOT; closedir ROOT; for $x (@filelist) { if ($х ne "." and $x ne "..") { $x = $root."/".$x; print " $x\n" if (-f $x); if (-d $x) { print "$x:\n"; tree($x); } } }}

Здесь использованы встроенные подпрограммы Perl opendir(), closedir(), readdir(), применяемые соответственно для открытия каталога, закрытия каталога и чтения его содержимого. Подпрограмма tree(), рекурсивно просматривая каталог, переданный ей в качестве параметра, выводит имена вложенных подкаталогов и содержащихся в них файлов.

26.
Динамическая память -- это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кбайт), стека (обычно 16 Кбайт) и собственно тела программы. Размер динамической памяти можно варьировать в широких пределах. По умолчанию этот размер определяется всей доступной памятью ПК и, как правило, составляет не менее 200...300 Кбайт.
Динамическая память -- это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования динамической памяти. Такая необходимость возникает, например, при разработке систем автоматизированного проектирования (САПР): размерность математических моделей, используемых в САПР, может значительно отличаться в разных проектах; статическое (т.е. на этапе разработки САПР) распределение памяти в этом случае, как правило, невозможно. Наконец, динамическая память широко используется для временного запоминания яных при работе с графическими и звуковыми средствами ПК. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от этого статическое размещение осуществляется компилятором Турбо Паскаля в процессе компиляции программы. При динамическом размещении заранее не известны ни тип, ни количество размещаемых данных, к ним нельзя обращаться по именам, как к статическим переменным.

Указателем называется переменная, предназначенная для хранения адресов областей памяти. В указателе можно хранить адрес данных или программного кода. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе — смещение.

Указатели делятся на стандартные и определяемые программистом. Величины стандартного типа pointerпредназначены для хранения адресов данных произвольного типа:

var p: pointer;

Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:

type pword = ^word; { читается как "указатель на word" }...var pw: pword;

Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых. Тип указателя на данные можно описать и непосредственно при описании переменной:

var pw: ^word;

Для указателей определены только операции проверки на равенство и неравенство и присваивания. Правила присваивания указателей:

· Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.

· Указатели стандартного типа pointer совместимы с указателями любого типа.

· Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.

Операция @ и функция addr позволяют получить адрес переменной:

var x: word; { переменная } pw: ^word; { указатель на величины типа word }...pw:= @w; { или pw:= addr(w); }

Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации (разыменования), обозначаемая с помощью символа ^:

pw^:= 2; inc(pw^); writeln(pw^);

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

Стандартные функции для работы с указателями:

· addr(x): pointer — возвращает адрес х (аналогично операции @), где х — имя переменной или подпрограммы;

· seg (x): word — возвращает адрес сегмента для х;

· ofs (x): word — возвращает смещение для х;

· cseg: word — возвращает значение регистра сегмента кода CS;

· dseg: word — возвращает значение регистра сегмента данных DS;

· ptr (seg, ofs: word): pointer — по заданному сегменту и смещению формирует адрес типа pointer.

27. Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен — к ним обращаются через указатели.

· Процедура new(var p: тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель p, и адрес начала этого участка заносит в этот указатель.

· Функция new(тип_указателя): pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка.

new применяется для типизированных указателей.

· Процедура getmem(var p: pointer; size: word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю p. Если выделить требуемый объем памяти не удалось, программа аварийно завершается. Указатель может быть любого типа.

Пример работы с динамическими переменными.

type pword = ^word; rec = record d: word; s: string; end; var p1, p2: pword; p3: ^rec;

В разделе исполняемых операторов программы запишем операторы:

new(p1); p2:= new(pword); new(p3);

В результате выполнения процедуры new(p1) в хипе выделяется объем памяти, достаточный для размещения переменной типаword, и адрес начала этого участка памяти записывается в переменную p1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром p3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа rec.

Доступ к выделенным областям осуществляется с помощью операции разадресации:

p1^:= 2; p2^:= 4; p3^.d:= p1^; p3^.s:= 'Вася';

В этих операторах в выделенную память заносятся значения.

Динамические переменные можно использовать в операциях, допустимых для величин соответствующего типа, например:

inc(p1^); p2^:= p1^ + p3^.d;with p3^ do writeln (d, s);

Для освобождения динамической памяти используются процедуры Dispose и Freemem, причем, если память выделялась с помощью new, следует применять Dispose, в противном случае — Freemem.

· Процедура Dispose(var p: pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой или функцией New, и значение указателя p становится неопределенным.

· Процедура Freemem (var p: pointer; size: word) освобождает участок памяти размером size, начиная с адреса, находящегося в p. Значение указателя становится неопределенным.

Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release.

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

· Процедура Release(var p: pointer) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark.

При завершении программы используемая ею динамическая память освобождается автоматически.

При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof.

28. Стек — динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека.

По определению, элементы извлекаются из стека в порядке, обратном их добавлению в эту структуру, т.е. действует принцип "последний пришёл — первый ушёл".

Наиболее наглядным примером организации стека служит детская пирамидка, где добавление и снятие колец осуществляется как раз согласно определению стека.

Стек можно организовать на базе любой структуры данных, где возможно хранение нескольких однотипных элементов и где можно реализовать определение стека: линейный массив, типизированный файл, однонаправленный или двунаправленный список. В нашем случае наиболее подходящим для реализации стека является однонаправленный список, причём в качестве вершины стека выберем начало этого списка.

Выделим типовые операции над стеком и его элементами:

· добавление элемента в стек;

· удаление элемента из стека;

· проверка, пуст ли стек;

· просмотр элемента в вершине стека без удаления;

· очистка стека.

29. Очередь — это информационная структура, в которой для добавления элементов доступен только один конец, называемый хвостом, а для удаления — другой, называемый головой. В англоязычной литературе для обозначения очередей довольно часто используется аббревиатура FIFO (first-in-first-out — первый вошёл — первым вышел).

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

Выделим типовые операции над очередями:

· добавление элемента в очередь (помещение в хвост);

· удаление элемента из очереди (удаление из головы);

· проверка, пуста ли очередь;

· очистка очереди.

30. В линейном списке каждый элемент связан со следующим и, возможно, с предыдущим. В первом случае список называется односвязным, во втором — двусвязным. Если последний элемент связать указателем с первым, получится кольцевой список.

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

Над списками можно выполнять следующие операции:

· начальное формирование списка (создание первого элемента);

· добавление элемента в конец списка;

· чтение элемента с заданным ключом;

· вставка элемента в заданное место списка (до или после элемента с заданным ключом);

· удаление элемента с заданным ключом;

· упорядочивание списка по ключу.

Для работы со списком в программе требуется определить указатель на его начало. Чтобы упростить добавление новых элементов в конец списка, можно также завести указатель на конец списка.

Функция поиска элемента find возвращает true, если искомый элемент найден, и false в противном случае. Поскольку одного факта отыскания элемента недостаточно, функция также возвращает через список параметров два указателя: на найденный элемент p и на предшествующий ему pp. Последний требуется при удалении элемента из списка.

Вопросы к экзамену

по дисциплине «Программирование и основы алгоритмизации»

для студентов групп АР и АМ

 

  1. Операторы ветвления. Условный оператор if. Привести пример.
  2. Операторы ветвления. Оператор варианта case.
  3. Операторы цикла. Цикл с предусловием. Привести пример.
  4. Операторы цикла. Цикл с постусловием. Привести пример.
  5. Операторы цикла. Цикл с параметром. Привести пример.
  6. Процедуры передачи управления. Привести пример.
  7. Оператор перехода goto.
  8. Перечисляемый тип данных. Привести пример.
  9. Интервальный тип данных. Привести пример.
  10. Одномерные массивы. Понятие массива. Объявление массива. Инициализация массива. Привести пример.
  11. Двумерные массивы. Понятие массива. Объявление массива. Инициализация массива. Привести пример.
  12. Строки. Типы строк. Операции над строками. Привести пример.
  13. Строки. Процедуры и функции для работы со строками. Привести пример.
  14. Записи. Объявление записи. Массивы записей. Привести пример.
  15. Множества. Понятия множества. Пример множества.
  16. Множества. Операции над множествами. Привести пример.
  17. Файлы. Файловый тип. Доступ к файлам. Привести пример.
  18. Текстовые файлы. Процедуры и функции для работы с текстовыми файлами. Привести пример.
  19. Бестиповые файлы. Процедуры и функции для работы с файлами. Привести пример.
  20. Компонентные файлы. Прямой доступ. Процедуры и функции для реализации прямого доступа.
  21. Процедуры и функции для работы со всеми типами файлов.
  22. Подпрограммы. Процедуры. Глобальные и локальные переменные. Привести пример.
  23. Подпрограммы. Функции. Глобальные и локальные переменные. Привести пример.
  24. Подпрограммы. Виды параметров подпрограмм. Привести пример для каждого вида параметров.
  25. Подпрограммы. Рекурсивные подпрограммы.
  26. Работа с динамической памятью. Указатели. Процедуры и функции для работы с указателями. Привести пример.
  27. Работа с динамической памятью. Динамические переменные. Процедуры и функции для работы с динамическими переменными. Привести пример.
  28. Динамические структуры данных. Стеки.
  29. Динамические структуры данных. Очереди.
  30. Динамические структуры данных. Линейные списки.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных