
1) По значению сall-by-value
пересылка значений фактических параметров в ячейки формальных параметров
2) по адресу (ссылке, имени)
CALL-BY-REFERENCE
пересылка адресов фактических параметров в ячейки формальных параметров
Назначение:
Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.
Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры.
Средства для использования параметров-подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, MatLab).
Средства паскаля для работы с подпрограммами-параметрами:
Процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:
TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer);
FUNC1=FUNCTION : REAL;
G=FUNCTION (x,y,z:real);
Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.
Некоторые особенности использования подпрограмм-фактических параметров:
Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.
Function sn(x:real):real;
begin sn:=sin(x)
end;
В языках Borland Pascal и Turbo Pascal подпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная с Turbo Pascal 6.0) cразу за заголовком подпрограммы.
Билет 21
Описание вызова процедур в паскале.
Вызов процедуры:
procedure ИмяПроцедуры [(CписокФормальныхПараметров)]
Описания (Const… Type… Var… процедуры и функции) begin Операторы end;
Билет 22
Понятие о функциях в паскале. Их описание и вызов.
ФУНКЦИИ
Имя функции - не только имя алгоритма, но и имя результата. Функция, как правило, имеет один основной результат.
function ИмяФункции [(CписокФормалПарам)] :ТипФункции
Описания (Const… Type… Var… процедуры и функции) begin Операторы ИмяФункции :=результат
end;
Обращение к функции производится в выражениях посредством использования указателя фукции:
ИмяФункции[(Список фактических параметров)];
Указатель функции может стоять только в правой части оператора присваивания.
Билет 23
Понятие о статистической памяти, стеке процедур. Глобальные и локальные имена. Область действия и время жизни переменных «Чистые процедуры».
Глобальные и локальные имена:
Глобальные имена - это имена, которые действуют на протяжении всей программы (или внешнего блока), они объявляются в соответствуюших разделах программы (или внешнего блока).
Локальные имена - это имена, которые действуют в пределах блока подпрограммы, это внутренние имена подпрограммы.
К локальным именам относятся формальные параметры и все имена, описанные в блоке подпрограммы. Вне блока подпрограммы локальные имена не определены.
Локальное имя может использоваться в одном блоке, глобальные имена могут являться общими для нескольких блоков и использоваться для передачи данных между блоками.
Область памяти для локальных и глобальных имен:
В Паскале данные, описанные в блоке программы, хранятся в так называемом статическом сегменте памяти; память под них распределяется при компиляции.
Локальные данные подпрограммы хранятся в специальной области оперативной памяти – стеке; память под эти данные распределяется каждый раз при вызове подпрограммы и освобождается при завершении работы подпрограммы.
Область действия имени:
Область действия имени - это часть программы, в которой имя может быть доступно.
Область действия локального имени - блок подпрограммы, в которой оно объявлено; глобального – весь текст программы от места объявления до последнего слова End (с точкой).
Глобальное имя доступно в подпрограмме только в том случае, если в подпрограмме оно не объявлено еще раз.
Время жизни (существования) данных:
Время жизни – это время, в течение которого по данные распределена память.
По времени жизни данные делятся на статические, автоматические, динамические.
Статические данные существуют все время выполнения программы.
Автоматические данные существуют во время выполнения подпрограммы , в которой описаны.
Динамические данные получают место в памяти с помощью операторов динамического распределения памяти.
В Паскале статические данные - это глобальные данные, автоматические – локальные.
Билет 24
Процедуры-параметры в Турбо-Паскале.
Средства паскаля для работы с подпрограммами-параметрами:
Процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:
TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer);
FUNC1=FUNCTION : REAL;
G=FUNCTION (x,y,z:real);
Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.
Некоторые особенности использования подпрограмм-фактических параметров:
Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.
Function sn(x:real):real;
begin sn:=sin(x)
end;
В языках Borland Pascal и Turbo Pascal подпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная с Turbo Pascal 6.0) cразу за заголовком подпрограммы.
Назначение:
Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.
Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры.
Средства для использования параметров-подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, MatLab).
Билет 25
Примеры корректного использования глобальных переменных.
Program Primer;
Var a,i:real;
Procedure p1;
Var i:real;
Begin . . . a:=...; i:=...;
End{p1};
Procedure p2;
Var i:real;
Begin . . . a:=...; i:=...;
End{p2};
Begin {раздел действий программы}
i:=...; a:=...;
р1; р2; р2
End.
a-глобальная переменная, под нее отведена одна ячейка в статическом сегменте памяти, которая доступна программе и процедурам р1 и р2. Под переменную с именем i программы отводится ячейка памяти статического сегмента; под переменные i процедур память в стеке распределяется столько раз, сколько раз осуществляется вход в блок процедур (в нашем примере три раза: при вызове р1 и при каждом вызове р2); при выходе из блока (т. е. при завершении работы процедуры) ячейка с именем i каждый раз освобождается. Так как в каждой процедуре имеется локальное имя i, глобальное i программы в процедурах недоступно.
Билет 26
Модули Турбо паскаля. Их назначение. Структура модуля. Использование готовых модулей.
Модуль - это автономно компилируемая программная единица, включающая в себя различные разделы описаний (типов, констант, переменных, процедур и функций) и, возможно, некоторые исполняемые операторы (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов).
Модуль - это автономно компилируемая программная единица.
Модуль может быть подключен к любой паскаль-программе или к другому модулю (программной единице).
Модуль включает в себя различные разделы описаний (типов, констант, переменных, процедур и функций).
Модуль делится на две основные части: интерфейсную (interface) и исполняемую (implementation). В интерфейсной части даются описания, которые могут использоваться в программной единице, к которой подключен модуль. В исполняемой части приводятся описания, доступные только внутри модуля.
Кроме описаний, модуль может содержать некоторые операторы, подготавливающие условия для использования модуля (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов). Такие операторы содержатся в части модуля, которая называется инициализирующей. Эта часть не является обязательной.
В Объектном Паскале модуль также может иметь завершительную часть (finalization), состоящую из операторов, обеспечивающих грамотное завершение программной единицы, использующей модуль.
Структура модуля (ТП, ОП):
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[BEGIN
инициирующая_часть]
END.
Структура модуля (ОП):
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[INITIALIZATION
инициирующая_часть]
[FINALIZATION
завершающая_часть]
END.
Имя файла, содержащего модуль:
Имя_модуля.pas
При компиляции ТП: Имя_модуля.pas => Имя_модуля.tpu ОП: Имя_модуля.pas => Имя_модуля.dcu
Использование модулей:
Если модуль использует другие модули, то предложение USES может стоять либо после слова INTERFACE, либо после слова IMPLEMENTATION. Модули, подключенные в интерфейсной части, доступны в любой точке рассматриваемого модуля; модули, подключенные в исполняемой части, доступны в любом месте модуля, за исключением интерфейсной части. Примеры использования модулем других модулей будут рассмотрены позже.
Билет 27
Символьная информация в Паскале.
СИМВОЛЬНЫЕ ДАННЫЕ ПРИНИМАЮТ ЗНАЧЕНИЯ НА МНОЖЕСТВЕ ВСЕХ СИМВОЛОВ, КОТОРЫЕ МОЖНО ВВЕСТИ С КЛАВИАТУРЫ КОМПЬЮТЕРА
Объявление символьных переменных в Объектном Паскале:
Var a:char; b: widechar;
Символьный тип – порядковый:
Все значения упорядочены, так как имеют номер (код) в таблице кодирования.
К символьным данным (как к данным любого порядкового типа) применимы встроенные функции: ORD(сh) – возвращает код символа сh; CHR(x) – возвращает символ с кодом x; SUCC(сh) – определение следующего за сh символа по кодовой таблице; PRED(сh) –определение предшествующего символа).
Строковые типы Объектного Паскаля:
Тип ShortString эквивалентен типу string Турбо Паскаля.
Данные типа AnsiString (могут содержать до 231 символов типа char.
Тип WideString соответствует строкам максимальной длины до 230 символов типа widechar.
Тип String: при {$H+} - AnsiString (по умолчанию), при {$H+} – ShortString.
Типы AnsiString и WideString - ссылочные, динамические, типы; они имеют 8 служебных байтов (вместо одного нулевого у ShortString): служебные байты содержат длину строки и ссылку на строку в динамической памяти (куче).
Объектный Паскаль разрешает для определения длины строки использовать только функцию LENGTH, а для установления нового значения длины только процедуру SetLength(строка, новая_длина_строки)
Если для обработки строк используются встроенные подпрограммы, то длина строки отслеживается автоматически, иначе программист должен использовать SetLength.
Функции, работающие со строками:
CONCAT(S1 ,S2,...,SN)-функция типа STRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметров S1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.
COPY(ST,INDEX,COUNT)-функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером INDEX.
LENGTH(ST)-функция типа INTEGER; возвращает длину строки ST.
POS(SUBST,ST)-функция типа INTEGER; отыскивает в строке ST первое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.
Процедуры, работающие со строками :
DELETE(ST,INDEX,COUNT)-удаление COUNT символов из строки ST, начиная с символа с номером INDEX.
INSERT(SUBST, ST, INDEX) - вставка подстроки SUBST в строку ST, начиная с символа с номером INDEX.
STR(X[:WIDTH[:DECIMALS]],ST) -преобразование значения типа REAL или INTEGER в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования (WIDTH - длину числа, DECIMALS - длину дробной части; параметр DECIMAL имеет смысл указывать только для вещественных чисел).
VAL(ST, X, CODE) - преобразование строки ST во внутреннее представление целого или вещественного числа Х; параметр CODE содержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строке ST, где обнаружен ошибочный символ; пробелы перед числом в строке ST должны отсутствовать.
Шаги обработки строки таблицы:
выделение смысловых полей -подстрок (с помощью функции COPY);
преобразование некоторых полей из символьного представления в числовое (с помощью процедуры VAL);
анализ символьных полей с помощью функции POS;
подготовка строки выходных данных с помощью STR и CONCAT.
Билет 28
Переменные сложной структуры. Тип Запись.
Тип Запись:
Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя.
Компоненты записи также называются полями записи.
Записи используются для работы с данными, содержащими в себе информацию разного типа (числовую, символьную и т. д.); примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация.
Сравнение двух типов: массив и запись:
Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны).
Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.
Описание типа запись:
TYPE имя_типа = RECORD
список_1_имен_полей: тип_1;
список_2_имен_полей : тип_2;
. . .
список_N_имен_полей: тип_N;
END;
Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).
Обращение к полю записи:
Имя_записи.Имя_поля
Пример.
VAR C:COMPLEX; D,D1:DATE; B:BOOK;
BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith';
{*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*} . .
Билет 29
Задача обработки данных, предоставленных в табличной форме. Два варианта решения с использованием строк и записей. Сравнение этих вариантов.
Программа, использующая запись, алгоритмически проще, чем программа со строками.
Платой за упрощение является разрушение структуры таблицы при вводе: строка таблицы распределяется по нескольким строкам экрана монитора компьютера.
Вариант 30
Файлы в программировании:
Файл - это последовательность однотипных компонент. Число компонент файла не ограничено. После последней компоненты файла стоит специальный код, называемый признаком конца файла; этот код обычно ставится автоматически, без участия программиста.
В классическом понимании файл рассматривается как абстрактное обобщение данных на устройстве с последовательным доступом, типичным представителем которого является магнитная лента. В библиотеках современных языков программирования, конечно, имеются средства и для работы с файлами прямого доступа.
Программное и физическое имена файлов:
Программное имя - это имя переменной файлового типа.
Физическое имя - это имя устройства или файла на диске.
Существуют специальные операторы, устанавливающие соответствие (связывающие) программное и физическое имена файла.
Текстовые и двоичные файлы:
Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении.
Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования. В Турбо Паскале рассматривается два вида двоичных файлов: типизированные и нетипизированные. В случае типизированных файлов байты файла разбиваются на ячейки в соответствии с типом компонент файла; например, для файла с базовым типом integer каждая пара байтов (для 32-разрядных компьютеров – четверка) рассматривается как целое значение; типизированные файлы хранят данные во внутреннем представлении. Для нетипизированных файлов представление информации безразлично, файл рассматривается как последовательность нулей и единиц.
Классический подход к работе с файлами – основные шаги:
Объявление файловой переменной – программного имени файла – различно для разных видов файлов
Текстовый файл:
Var ИмяФайла: textfile; {ТП:text }
Типизированный файл:
Var ИмяФайла: file of БазовыйТип;
Нетипизированный файл:
Var ИмяФайла: file;
Связывание программного и физического имен файлов
AssignFile (ПрограммноеИмя, ФизическоеИмя);{в ТП Assign}
ПрограммноеИмя – переменная, описанная как файл;
ФизическоеИмя – имя файла на диске (полное) или имя устройства.
После оператора AssignFile в программе используется только программное имя файла.
Пример:
Var f: text; …
Begin …
Assign( f, ‘d:\student\a.txt‘ );
{Далее используется только f}
Открытие файла (для чтения или для записи)
Reset (ИмяФайла); {открытие файла для чтения}
Rewrite (ИмяФайла); {открытие файла для записи}
Пример:
Var f: text; …
Begin …
Assign( f, ‘d:\student\a.txt‘ );
Reset(f); {или для записи Rewrite(f)}…
Чтение из файла или запись в файл – различно для разных видов файлов
Пока для примера рассмотрим чтение/запись для текстовых файлов:
Read (ИмяФайла, СписокВвода);
Write (ИмяФайла, СписокВывода);
Пример: Read(n,a,b); Write(‘s=‘, s);{полная аналогия консольному вводу-выводу}
Также можно использовать Readln и Writeln.
Замечание. При работе с файлами используется функция EOF(ИмяФайла). EOF возвращает значение True, если считан признак конца файла, и значение False в противном случае.
EOF – сокр. от End Of File
Закрытие файла
CloseFile(ИмяФайла); {для ТП - Close }
Закрытие файла предполагает следующие действия:
Сохранение изменений в файле.
Перерегистрация файла в каталоге.
Разрушение связи между программным и физическим именами файлов.
Открытие файла для чтения:
Поиск файла с заданным физическим именем; если не найден, то сообщение об ошибке.
Указатель файла устанавливается на первую компоненту.
Компонента, на которой стоит указатель, считывается в буфер.
Если считан признак конца файла, то функция EOF устанавливается в значение True, иначе – в значение False.
Открытие файла для записи:
Поиск файла с заданным физическим именем; если файл не найден, то создается новый файл
Содержимое файла очищается.
Указатель файла устанавливается на конец файла (после последней компоненты).
Функция EOF устанавливается в значение True.
Открытие файла для дополнения:
Поиск файла с заданным физическим именем; если не найден, то сообщение об ошибке.
Указатель файла устанавливается на конец файла (после последней компоненты).
Функция EOF устанавливается в значение True.
Билет 31
Динамические данные.
Динамические данные:
описываются не данные, а их адреса (указатели);
распределяются и уничтожаются в памяти на этапе выполнения программы по специальным командам;
место в памяти – динамическая память (англ. куча – heap);
время жизни и область действия указателей определяется как для обычных (локальных или глобальных) переменных
Описание динамического массива:
Var имя_массива: Array of Array of…Array of тип_элемента;
Ключевые слова Array of записываются в описании столько раз, сколько индексов у массива (т. е. какова его размерность).
По существу объявленное имя_массива является указателем на массив.