Множество заключительных состояний – {}

{Symplest scaner}

program Symplest_Scanner;

{Программа читает текстовой файл,

выделяет слова и распознает идентификаторы}

type

status=(ordin, ident, news);

chars=set of char;

var

letter, digit, separ:chars;

anytxt:string;

s:status;

i:integer;

c:char;

F:text;

begin

letter:=['A'..'Z','a'..'z'];

digit :=['0'..'9'];

separ :=[' '];

repeat

writeln(' Введите имя обрабатываемого файла');

readln(anytxt);

assign(F, anytxt);

{$I-} reset(F); {$I+}

i:=IOResult;

if i<>0 then

writeln(' Ошибочка ',i:3,' , попробуйте еще раз');

until i=0;

s:=news;

while not eof(F) do

begin

while not eoln(F) do

begin

read(F, c);

write( c);

case s of

news : if c in letter then s:=ident

else if not(c in separ) then s:=ordin;

ident: if c in separ then

begin s:=news; writeln('*') end

else

if not((c in letter) or (c in digit))

then s:=ordin;

ordin: if c in separ

then begin s:=news; writeln end;

end;

end;

if s=ordin then begin s:=news; writeln end;

if s=ident then begin s:=news; writeln(' *') end;

readln(F);

end;

end.

9.4 Копия любого файла

program Copy;

var c:byte;

f, g:file of byte;

begin

assign(f,'file. abc');

assign(g,’file_copy. abc’);

reset(f); rewrite(g);

while not(eof(f)) do

begin

read(f, c);

write(g, c);

end;

close(f);

end.

Лекция 10

10.1 Процедуры и функции

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

Процедуры и функции (подпрограммы) представляют собой записи на алгоритмическом языке частей алгоритма (подалгоритмов). В разделе описаний процедур и функций секции описаний программы помещаются тексты описания процедур и функций, в секции действий программы осуществляется обращение к процедурам и функциям программы (вызов процедур и функций).

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

procedure <имя>(<формальные параметры>);{заголовок процедуры}

<секция описаний процедуры>

begin

<секция действий процедуры>

end;

function <имя>(<формальные параметры>):<тип>;{заголовок функции}

<секция описаний функции>

begin

<секция действий функции>

end;

Заголовок подпрограммы служит для организации обмена данными (параметрами) между программой и подпрограммой (исходные данные для работы подпрограммы и результаты работы подпрограммы). В функции один из результатов работы подпрограммы приписывается ее имени, тип результата (и функции) – <тип> – указывается в заголовке. В качестве типа <тип> может использоваться любой простой, строковой или ссылочный. В секции описаний подпрограммы приводятся описания локальных (внутренних) меток, констант, типов данных, переменных и подпрограмм, в секции действий подпрограммы записывается алгоритм работы подпрограммы. При обращении к подпрограмме указывается ее имя и фактические параметры.

Формальные параметры представляют собой список через «точку с запятой» предложений вида:

[var/const]<список переменных>:<имя типа>

Необязательные параметры var и const указывают способ передачи данных. Ключевое слово var означает, что данные передаются по адресу. Такие данные называются параметрами-переменными. Ключевое слово const означает, что данные передаются по адресу, но с защитой от изменения их значений. Такие данные называются параметрами-константами. Если перед списком переменных ключевое слово отсутствует, то данные передаются по значению. Такие параметры называются параметрами-значениями.

Обращение к подпрограммам осуществляется по следующей схеме:

Вызов процедуры (как самостоятельного оператора):

<имя>(<список фактических параметров>)

Вызов функции (в выражении, где допустим тип функции):

…<имя>(<список фактических параметров>)…

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

Тип передачи

Ключевое слово

Фактический параметр

По значению

-

Любые выражения соответствующего типа

По адресу

var

Имена переменных

По адресу

const

Любые выражения соответствующего типа

Между формальными (в описании подпрограммы) и фактическими (при обращении к подпрограмме) параметрами должно быть согласование по количеству, типам и порядку следования. (!)

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

НЕ нашли? Не то? Что вы ищете?

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

Вот примеры использования подпрограмм (процедур и функций) в Паскале:

1. Программа вычисляет величину y=max(min(x1,x2,x3),max(min(x3,x5,x4),x4))

program minmax;

var y, x1,x2,x3,x4,x5:real;

function max(a, b:real):real;

begin if a>b then max:=a else max:=b end;

function min(a, b:real):real;

begin if a<b then min:=a else min:=b end;

begin

readln(x1,x2,x3,x4,x5);

y:=max(min(x1,min(x2,x3)),max(min(x3,min(x5,x4)),x4));

writeln(y)

end.

Обратите внимание на порядок обращений к подпрограммам!

2. Программа подсчитывает количество символов ‘A’,’B’ и ‘C’ в введенной пользователем строке:

program ABC;

var s:string; i:integer;

procedure kolABC(s:string; var kolA, kolB, kolC:integer);

begin

kolA:=0; kolB:=0; kolC:=0;

for i:=1 to length(s) do

case s[i] do

‘A’: kolA:=kola+1;

‘B’: kolB:=kolB+1;

‘C’: kolC:=kolC+1;

end;

end;

begin

readln(s);

kolABC(s, kolA, kolB, kolC);

writeln(kolA, kolB, kolC);

end.

Функция ввода данного типа integer с защитой:

function enter_integer(s:string):integer;

var i, n:integer;

begin

repeat

readln(s);

val(s, n,i);

if i=0 then enter_integer:=n

until i=0;

end;

10.2 Передача параметров в процедуры и функции

Как было сказано выше (!), список фактических параметров должен соответствовать списку формальных параметров по количеству (очевидно), порядку следования (очевидно), по типу (как это?).

Если передача данных осуществляется по значению, то значение фактического параметра должно быть присвоено переменной, являющейся формальным параметром. Если передача данных осуществляется по адресу, то переменной, являющейся фактическим параметром, должно быть присвоено «новое» значение в подпрограмме. В любом случае необходима совместимость по присваиванию. Например, легко понять, что при описании формального параметра массива не может использоваться описатель массива вида array [Ind] of type, поскольку в вызывающей программе, в этом случае, невозможно описать переменную того же типа, то есть, совместимую с формальным параметром. Вот как следует поступать:

program factich_par;

type mass=array [1..10] of real;

var i:integer;

m:mass;

procedure pr_mass(m:mass);

var i:integer;

begin

for i:=1 to 10 do write(m[i]:10:5); writeln

end;

begin

for i:=1 to 10 do read(m[i]);

pr_mass(m)

end.

Указанный механизм передачи данных в подпрограмму позволяет обрабатывать в подпрограмме только массивы, определенного в вызывающей программе типа. Это хорошее «паскалевское» решение. В качестве некоего послабления (и отклонения от принципов строгой типизации данных) в ТР (не в стандарте!) можно воспользоваться следующим механизмом передачи массивов в подпрограмму, называемым «открытым массивом». При описании открытого массива указывается лишь базовый тип, в качестве фактического параметра может использоваться любой массив с тем же базовым типом, в качестве индексного типа используется диапазон 0..N, где N – номер максимального элемента индексного типа фактического параметра:

program Open_array;

var i:integer;

m:array [0..10] of real

procedure pr_mass(m:array of real;{Open array});

var i:integer;

begin

for i:=0 to 10 do write(m[i]:10:5); writeln

end;

begin

for i:=0 to 10 do read(m[i]);

pr_mass(m)

end.

10.3 Глобальные переменные. Перекрытие (экранирование)

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

Каждый объект (константа, тип данных, переменная или подпрограмма), описанный в программе на Паскале, имеет свою область «видимости» (соответствующее описание имеет свою область действия). Область действия описания начинается с места описания и заканчивается концом блока (оператором end), в котором выполнено описание. Для программы, структура которой условно изображена на схеме, подпрограмма А «видна» в любой части программы после ее описания. Подпрограмма В определена для секции действий программы. Подпрограммы А1 и А2 могут использоваться в секции действий подпрограммы А, причем подпрограмма А1 может быть использована в подпрограмме А2. Ни подпрограмма А1, ни подпрограмма А2 не могут выть использованы вне описания подпрограммы А. Подпрограмма А может быть вызвана в описании подпрограммы В (в секции действия В, или в секциях действия В1, В2, В21 и В22).

Аналогично определяется область действия описания типов данных, констант и переменных. Объект (подпрограмма, константа, тип данных или переменная) «виден» в тексте программы с места описания, до конца блока, в котором находится описание. Объект, использованный в блоке, входящем в область «видимости» его описания, называется глобальным по отношению к этому блоку. Использование глобальных объектов для обмена данными между программой и подпрограммой является альтернативой для механизма формальных и фактических параметров. Выбор способа передачи данных (для каких данных использовать механизм глобальных параметров, а для каких механизм формальных и фактических параметров) является одним из важнейших вопросов разработки проекта программы (не зависимо от того, на каком языке программирования будет реализован проект).

Внутри блока могут использоваться как глобальные, так и локальные объекты. К локальным объектам относятся формальные параметры и параметры, описанные внутри блока. Если локальный параметр совпадает по имени с одним из глобальных параметров, то глобальный параметр в данном блоке недоступен (правило экранирования). Внутреннее описание более сильное, оно перекрывает описание внешнего блока.

Program prog;

var i, x:integer; {глобальные переменные}

procedure p1(u:integer; var v:integer);

var i, y:integer; {локальные переменные}

begin

x:=1;

i:=2; y:=3;

writeln(x, i,y, u,v);

u:=7; v:=8;

end;

Begin

x:=0; i:=0;

writeln(x, i);

p1(i, i);

writeln(x, i);

end.

Результат работы программы:

00

12300

18

10.4 Процедурные типы

В TP можно использовать переменные процедурного типа. Переменные процедурного типа позволяют передавать в подпрограмму имена процедур и функций. Вот примеры описаний процедурных типов:

Type Proc1 = Procedure (a, b,c:real; var d:real);

Proc2 = Procedure (var a, b:real);

Func1 = Function: string;

Proc3 = Function (var s:string):real;

PROC = procedure; { процедура без параметров }

PROC4 = procedure (var x : real; y : integer);

FUN2 = function (x, y : real) : real;

var f : FUN2;

Переменную f можно использовать, например, так:

{$F+}{Использование дальней адресации}

function deg(a, b:real):real;

begin {вычисляем степень: a**b}

deg:=exp(ln(a)*b);

end;{deg}

{$F-}

begin {программа}

f := deg; writeln('2**15=',f(2,15));

end.

10.6 Рекурсия. Косвенная рекурсия

Функция вычисления факториала:

1. Рекуррентное определение

function Factor(n:integer):integer;

var i, f:integer;

begin

f:=1;

for i:=2 to n do f:=f*i;

Factor:=f;

end.

2.Рекурсивное определение

function Fact(n:integer):integer;

var f:integer;

begin

if n=0 then f:=1 else f:=Fact(n-1)*n

end.

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

1.  В алгоритме существует нерекурсивная ветка.

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

Работа рекурсивной функции вычисления факториала показано на слайдах (прилагаются).

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

Лекция 11

11.1 Статическая и динамическая память программы

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

В языке ТР имеются механизмы использования динамической памяти на этапе выполнения программы. Необходимость в использовании динамической памяти возникает, если по условию задачи не удается заранее предвидеть потребный объем статической памяти. Вот пример такой задачи: (*) Распечатать последовательность вводимых с клавиатуры символов в обратном порядке.

11.2 Динамическая память (куча, heap) с точки зрения ТР

Пусть Т – некоторый тип данных, тогда ^T – новый тип данных, такой, что q:^T – переменная (называемая указателем), которая может принимать значение адреса участка динамической памяти, куда может быть записано значение типа Т.

Инициализация указателя осуществляется процедурой new(q). Процедура new выделяет в области динамической памяти участок свободной памяти, объем которой достаточен для хранения данного типа Т, и переменной q присваивает значение адреса начала этого участка. Выделенный участок памяти объявляется занятым в области динамической памяти, сам выделенный участок является динамической переменной типа Т с именем q^.

Инициализация динамической переменной может быть осуществлена как и инициализация обычных статических переменных. Например, если t:T – инициализированная переменная типа Т, то можно выполнить присваивание динамической переменной q^:=t.

Когда динамическая переменная q^ выполнила свою функцию, и больше не нужна, от нее следует избавиться, освободив отведенную под нее память. Это можно сделать с помощью процедуры DISPOSE(q). Динамическая переменная q^ перестает существовать, память, отведенная под нее, становится свободной, а указатель q становится неопределенной (неинициализированной) переменной.

В ТР существует предопределенная константа NIL, совместимая со всеми указателями, которую можно трактовать, как «несуществующий адрес». Если переменной-указателю присвоить значение NIL (q:=NIL), то указатель q становится инициализированной переменной, однако q^ - бессмысленно.

11.3 Операции над указателями

Указатель может находиться в одном из трех состояний:

1.  Указатель не инициализирован. Указатель можно инициализировать процедурой NEW, значением другого (инициализированного) указателя, или константой NIL.

2.  Указатель инициализирован процедурой NEW. Можно использовать динамическую переменную q^, сам указатель сравнивать с другими указателями (только на совпадение или несовпадение), переинициализировать любым способом (см.1.);

3.  Указатель инициализирован константой NIL. Можно указатель сравнивать с другими указателями (только на совпадение или несовпадение), переинициализировать любым способом (см.1.);

11.4 Геометрическая интерпретация

Указатель q:^T описан в тексте программы на ТР. С помощью процедуры new(q) указатель q инициализируется. Диспетчер динамической памяти выделяет участок свободной памяти размером sizeof(T) в области динамической памяти (в куче) и адрес его начала присваивает переменной q. Теперь динамическая переменная q^ типа Т доступна для использования, однако, пока не инициализирована. Инициализировать ее можно, например, присваиванием q^:=t, где t – константа типа Т.

11.5 Динамическая цепочка

Зачем нужна динамическая переменная? Одиночная динамическая переменная не представляет никакого интереса. Интерес представляют различные структуры данных, созданные в области динамической памяти. Такие структуры создаются и развиваются на этапе выполнения программы, они могут быть адаптированы к текущим данным, объемы которых становятся известными лишь на этапе выполнения программы. Вернемся к задаче (*). Пользователь набирает на клавиатуре последовательность символов. Окончание набора фиксируется набором комбинации клавиш Ctrl+z, Enter. Для хранения введенных символов необходимо использовать структуру данных достаточного объема. Все статические структуры данных (структуры данных, созданные в статической памяти) имеют ограничения на количество вводимых символов. Попробуем организовать хранение введенных с клавиатуры символов в динамической памяти. Для этого в программе опишем новый тип данных, представляющий собой запись, содержащую поле типа char для хранения введенного символа, и поле типа «указатель» на следующую запись:

PElem=^Elem;

Elem=Record

inf:char;

next:PElem

end

В начале работы программы создается пустая цепочка записей. После каждого ввода очередного символа создается новая запись и подсоединяется к цепочке. Пусть p – данное типа PElem, x:char, тогда

·  p:=nil; {Создана пустая цепочка}

·  while not eof do

begin

readln(x);

new(q);

q^.inf:=x;

q^.next:=p;

p:=q;

end;

Задача: Распечатать третью запись цепочки, если она есть.

writeln(p^.next^.next^.inf) {а если ее нет?!}

Задача: Распечатать k-ую запись цепочки.

q:=p;

i:=1;

while (q<>nil) and (i<k) do

begin

i:=i+1;

q:=q^.next;

end;

if q<>nil then writeln(q^.inf) else writeln(‘нет записи’);

Распечатать информационные части стека p.

Традиционное решение

Рекурсивное решение

Procedure prnchar(p:PElem);

Var q:PElem;

begin

q=p;

while p<>NIL do

begin

write(p^.inf);

p=p^.next

end

end

Procedure prnchar(p:PElem);

begin

if p<>NIL then

begin

write(p^.inf);

prnchar(p^.next)

end

end

Задача: Распечатать информацию, вводимую с клавиатуры, в прямом порядке.

Задача: Перевернуть файл (используем цепочку)

Лекция 12

12.1 Цикл жизни программы. Проект программы

Программа, как и живой организм, рождается, развивается и умирает. Продолжительность жизни программы и ее судьба определяется назначением программы и ее качеством. Жизненный цикл программы можно описать так:

Проектирование ó Кодирование óОтладкаóТестирование óВедение

Проектирование программы – это основной этап зарождения программы. Именно на этом этапе закладывается качество будущей программы.

Проектирование = типы данных + структуры данных + процедуры и функции + алгоритмы

На этапе проектирования программы определяется язык (или языки) программирования для реализации проекта.

Кодирование – воплощение проекта в коды на выбранном алгоритмическом языке. Творческая составляющая этапа кодирования ограничена рамками проекта. От кодировщика во многом зависит читабельность текста программы.

Хорошо спроектированная и закодированная программа не требует отладки. Однако, разработчики проекта и кодировщики могут ошибаться. Поэтому еще на этапе проектирования программы предусматриваются средства тестирования. Тестирование – контроль правильности работы программы. В случае обнаружения ошибок и недочетов исправления делаются и в проекте программы и в ее коде.

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

12.2 Характеристики качества программ

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

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

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

·  Модифицируемость (или открытость). Доступность исходного кода программы. Иногда под модифицируемостью понимают предусмотренные в проекте программы возможные изменения.

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

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

·  Надежность. Эффективное функционирование в условиях воздействия различных отрицательных факторов.

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

12.3 Программное окружение

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

Для создания и поддержки программного окружения в языках программирования разработаны свои средства. В языке ТР это модули.

12.4 Модули

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

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

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

uses <список модулей через запятую>

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

Структура модуля:

Unit <имя модуля>;

interface

[uses...]

<описания глобальных типов данных, переменных, констант, процедур и функций>

implementation

[uses...]

<реализация>

begin

<инициализация>

end.

Имя файла, содержащего исходный текст модуля (.pas) или объектный код (tpu), должно совпадать с именем модуля. Если имя модуля длиннее восьми символов, то оно должно совпадать с именем файла по первым восьми символам.

В списке uses имен модулей не должно быть «рекурсий» и «циклов»

При работе с модулями следует помнить, что в среде ТР имеется возможность управлять размещением кодов в файловой системе и режимами трансляции:

Options/Directories/EXE&TPU - сюда будут помещены загрузочные и объектные коды

Options/Directories/Unit Directories - здесь будет осуществляться поиск объектных (TPU) кодов модулей

Compile/Compile – компиляция только программы

Compile/Make – компиляция программы и модулей, текст которых был изменен

Compile/Build – компилируется и программа, и все модули

Пример

Печать данного перечислимого типа. Вот простой пример модуля (пусть имя файла с представленным ниже текстом My_Unit. pas):

Unit My_Unit;

Interface

type Color=(Red, Yellow, Green);

procedure WriteColor(x:Color);

Implementation

var mass:array[Color] of string[6];

procedure WriteColor;

begin writeln(mass[x]:6) end;

begin

mass[Red]:=' Red';

mass[Yellow]:='Yellow';

mass[Green]:='Green'

end.

После трансляции этого модуля средствами интегрированной среды ТР в директории модулей интегрированной среды образуется файл My_Unit. tpu. Теперь можно воспользоваться новым средством

Uses My_Unit;

var Col:Color;

begin

Col:=Red;

WriteColor(Col)

end.

На экране появится Red

12.5 Обзор модуля System

Модуль System не нужно указывать в предложении uses, поскольку он доступен каждой программе ТР по умолчанию. В модуле предопределены переменные Input и Output как стандартные текстовые файлы ввода и вывода.

12.5.1 Процедуры и функции, обслуживающие файловую систему

При работе с файловой системой используются следующие договоренности:

s àdisk:\kat\kat\...\file – поиск объекта file осуществляется с корневого каталога; s àdisk:kat\kat\...\file – поиск с текущей директории указанного диска.

GetDir(d:byte;var s:string); (d=0 – текущий дисковод, 1 – a:, 2 – b: и т. д.), s – текущий каталог.

ChDir, MkDir, RmDir(s:string) – изменение, создание, удаление пустого

Rename(f; newname:string) – переименование файла;

Задача: Написать процедуру удаления любого каталога (даже непустого).

12.5.2 Процедуры управления работой программы

Exit - выход из программы, функции, процедуры.

Halt(kod:word) - выход из программы.

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

GetMem, FreeMem(var p:pointer; size:word) - создает, уничтожает динамическую переменную.

MaxAvail, MemAvail:longint - объем максимального непрерывного участка и полный свободный объем динамической памяти;

Mark, Release(var p:pointer); - создает, удаляет новую кучу

12.5.4 Функции для работы с указателями

Addr(x):pointer; х - идентификатор переменной, процедуры или функции.

Seg(x):word;

Ofs(x):word;

Ptr(segm, ofset:word):pointer;

Программы с параметрами:

ParamCount:word; - количество параметров в командной строке (разделители пробелы и таб)

ParamStr(index:word):string; - возвращает заданный параметр командной строки.

Пример - программа, вычисляющая сумму

program sum;{ex_04}

var

s, x:real;

i, j,k:integer;

begin

s:=0;

i:=ParamCount;

j:=1;

while j<=i do

begin

val(ParamStr(j),x, k);

if k=0 then s:=s+x;

j:=j+1;

end;

writeln(s:10:5)

end.

Sum. pas ->sum. exe

Option/Directories

Выполнение в DOS: sum 3 5 7

Выполнение в ТР: Run..., Parameters

12.6 Список процедур и функций модуля

Процедуры управления

Procedure Break Обеспечивает немедленный выход из операторов повторения. 

Procedure Continue Завершает очередной итерационный цикл операторов повторения.

Procedure Exit Позволяет немедленно выйти из текущей подпрограммы. При вызове из тела основной программы завершает ее работу.

Procedure Halt [ (ExitCode: Word)] Останавливает выполнение программы и возвращает управление в операционную систему. Необязательный параметр ExitCode определяет код завершения программы.

Procedure RunError [ (ErrorCode: Byte)] Останавливает выполнение программы и генерирует ошибку периода выполнения программы. Необязательный параметр ErrorCode определяет код ошибки.

Процедуры динамического распределения памяти

Procedure Dispose(var P: Pointer [,Destructor]) Уничтожает динамическую переменную, связанную с указателем Р. Необязательный параметр Destructor определяет метод-деструктор для динамического объекта.

Procedure FreeMem(var P: Pointer; Size: Word) Уничтожает динамическую переменную P размером Size байт.

Procedure GetMemt(var Р: Pointer; Size: Word) Создает новую динамическую переменную Р заданного размера Size.

Procedure Mark(var P: Pointer) Записывает в указателе Р текущее состояние кучи.

Procedure New(var P; Pointer [,Constructor]) Создает новую динамическую переменную, связанную с указателем Р. Необязательный параметр Constructor определяет метод-конструктор для динамического объекта.

Procedure Release (var P: Pointer) Возвращает кучу в состояние, которое было сохранено в указателе Р процедурой Mark.

Функции динамического распределения памяти

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5