рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Простейшие операторы языка Object PASCAL

Простейшие операторы языка Object PASCAL - раздел Программирование, Объектно-ориентированное программирование 2.9.1. Пустой И Составной Операторы. Операторы В Языке Pascal...

2.9.1. Пустой и составной операторы.

Операторы в языке PASCAL разделяется символом ";".

Пустой оператор — это просто пустая строка (или эквивалентная ей последовательность пробелов и переносов на новую строку), после которой стоит ";". Он ничего не делает. Иногда использовался для того, чтобы поставить перед ним метку для использования в операторе goto.

Составной оператор — блок кода от begin до end:

begin

последовательность простых или составных операторов

end;

Используется там, где по синтаксису языка PASCAL может стоять один оператор, а надо использовать последовательность операторов.

Замечание:Перед операторной скобкой end точка с запятой необязательна. Однако ее лучше ставить, так как при котировании строк в другое место программы отсутствие “;” вызовет ошибку компиляции, точно также, как и добавление новых строк в блок.

 

2.9.2. Оператор безусловного перехода goto.

Этот оператор требует наличия метки (label), на которую и производится переход. Идентификатор метки — либо целое число, меньшее <65367, либо буквенно-численный идентификатор; обычно используют число.

program MyProg2;

label 1;

var i: integer;

begin

...

if...then goto1;

...

1:...

...

end.

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

 

2.9.3. Условный оператор if.

if условие then оператор; — первая форма

В C-образных if (условие) оператор;

if условие then оператор1

else оператор2; — вторая форма

В C-образных if (условие) оператор;

Else оператор;

Пример:

if a<b

then a:=a+1

else (if a=b

then a:=a+1

else

begin

a:=a+1;

b:=b+1

end

);

Надо отметить, что после then должен стоять только один оператор, а не последовательность операторов. Поэтому запись оператора в виде

if условие then оператор1;

else оператор2;

недопустима, т.к. символ ”;”, стоящий после оператора1, рассматривается как пустой оператор, и поэтому между then и else стоят два оператора, а может быть только один. Хотя бы и составной, ограниченный операторными скобками begin и end.

В случае последовательности операторов типа:

if условие1 then if условие2 then оператор1 else оператор2;

имеющийся else относится к последнему then, поэтому лучше отформатировать текст так:

if условие1

then if условие2

then оператор1

else оператор2;

таким образом , если писать соответствующие if, then и else друг под другом, логика работы программы становится очевидной.

Пример неправильного стиля оформления:

if условие1

then if условие2

then оператор1

else оператор2;

Этот стиль подталкивает к логической ошибке при чтении программы. Надо отметить, что сама возможность такой ошибки связана с непродуманностью синтаксиса языка PASCAL (в том числе Object Pascal). Другой вариант ошибки, связанный с синтаксисом PASCAL, может быть вызван лишним символом “;” после then. Так, строки

If условие then; оператор1;

И

If условие then оператор1;

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

If условие then;

Оператор1;

Т.е. при выполнении условия выполнится пустой оператор, а оператор1 будет выполнен всегда.

 

2.9.4. Оператор выбора case.

Является аналогом if для нескольких условий выбора. Варианты синтаксиса оператора для различной формы записи условий следующие:

сase выражение of

значение1:оператор1;

...

значение2,значение3,...,значениеN:оператор2;

начальное значение..конечное значение:оператор3

else оператор

end;

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

Часть с else является необязательной.

Пример:

case (a mod b) of

0: i:=0;

1: i:=1;

2,4,6,8: i:=2;

10..100: begin

i:=3;

a:=a div10

end

else i:=4

end {/case};

. . .

В C-образных языках для аналогичных целей применяется конструкция

switch (выражение)

{

case значение1: оператор1;

……………………………

case значение N: оператор N;

default: оператор;

}

2.9.5. Оператор цикла for.

Имеется две формы синтаксиса оператора.

1) Цикл от меньшего к большему значению:

for переменная:=значение1 to значение2 do оператор; Значения должны быть перечисляемого типа. Если значение2 меньше значения1, цикл не выполняется ни разу, если они равны – один раз.

2) Цикл от большего к меньшему значению:

for переменная:=значение2 downto значение1 do оператор; - цикл от большего значения к меньшему. Шаг по умолчанию равен 1.

Примеры:

1) x:=1; for i:=1 to n step m do x:=x*i;

2) for i:=10 downto 1 do writeln(i);

3) for s='d' to 'z' do

begin

...

end.

C-образные языки:

for (инициализация; условие продолжения; изм. Счетчиков)

{тело цикла};

BARSIC: for(i=i1..i2)do(…);

for(i=a..b, step=s)do(…);

 

2.9.6. Оператор цикла while...do – цикл с предусловием.

while условие do оператор;

Пока условие сохраняет значение true — в цикле выполняется оператор, иначе — действие цикла прекращается. Если условие с самого начала false, цикл сразу прекращается, и тело цикла – оператор – не выполнится ни разу.

Пример:

i:=1; x:=1;

while i<=n do

begin

x:=x*i;

i:=i+1

end;

 

2.9.7. Оператор цикла repeat...until – цикл с постусловием.

repeat

оператор1; {тело цикла}

оператор2; {тело цикла}

...

операторN {тело цикла}

until условие выхода;

Если условие принимает значение true, цикл прекращается. Тело цикла выполняется до проверки условия, поэтому оно всегда выполнится хотя бы один раз.

Пример:

i:=0; x:=1;

repeat

i:=i+1;

x:=x*i

until i<n;

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

repeat

until false;

Оператор repeat until является достаточно непоследовательным с точки зрения семантики английского языка и логики языка PASCAL. Его использование вызывает много ошибок у пользователей в англоязычных странах. Гораздо более последователен синтаксис языка Java, где в качестве цикла с постусловием используется конструкция do{…}while(…).

 

2.10. Структурные типы данных

2.10.1. Правила совместимости и автоматического преобразования типов

Тождественность типов переменных — а) если они описаны вместе или б) имеют один и тот же идентификатор имени типа, или в) их типы имеют идентификаторы, приводимые к одному и тому же имени типа.

Пример а):

var a,b,c:integer;

переменные a, b, c имеют тождественные типы.

Пример б):

var a1,a2:tA1;

a3:tA1;

Переменные a1, a2, a3 имеют тождественные типы.

Пример в):

type t1=real;

t2=real;

var a:real;

b:t1;

c:t2;

Переменные a, b, c имеют тождественные типы, так как все они приводимы к типу real.

Совместимые по присваиванию (за исключением множеств, указателей, файловых типов и структурных типов, имеющих компоненты файловых типов):

если var a1:tT1;

a2:tT2;

то присваивание a1:=a2 возможно, если

a. tT1 и tT2 тождественны;

b. tT2 — подтип tT1, либо оба — подтипы другого типа (в том числе пользовательского) с диапазоном значений tT1, перекрывающим диапазон tT2 . Например, ShortInt – это подтип Integer; byte – также подтип Integer, и одновременно подтип Word, и так далее. Другой пример – тип – диапазон: type t= -50..20 является подтипом ShortInt и т.п.

c. tT2 — вещественный тип, значения которого попадают в диапазон вещественного типа tT1;

d. tT2 — целый тип, tT1 — вещественный;

e. tT2 и tT1 —строковые (любой длины);

f. tT1 — строковый, tT2 — литерный (т.е. char).

g.

2.10.2. Пользовательские типы. Массивы. Строковые типы.

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

program Prog3;

type

tA1=array[1..100] of integer;

tA2=array[10..20] of real;

tA3=array[1..10] of char;

tA4=array[1..10,1..20] of real;

tA5=array[-10..5] of tA3;

var aA1a,aA1b:tA1;

aA2:tA2;

aA3:tA3;

i:integer;

ch:char;

r:real;

begin

for i:=1 to 100 do aA1a[i]:=i*i;

for i:=1 to 100 do aA1b[i]:=aA1a[i]*2+1;

...

for i:=1 to 20 do aA2[i]:=sin(i);

i:=...;

...;

ch:=...;

r:=aA1[i]/aA2[i-3]+sqrt(i);

aA3[1]:='a';

...;

aA3[i]:=ch;

ch:=aA3[i+1];

...

end.

В других языках:

С,C++:

int A1[100];

A1[0]=5;A1[99]=14;

int A2[10][20];

Java:

int[]A1;

A1=new int[100];

В TP и Delphi имеется предопределенный тип

type string=array[1..255] of char;

а также его подтипы string[n], где n может меняться от 1 до 255.

Описание

var s:string[10];

практически эквивалентно

var s:array[1..10] of char;

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

program MyArray;

var a:array [1..10] of real;

f:text;

i:integer;

begin

assign File(f,'dat.txt');

randomize;

rewrite(f);

for i:=1 to 10 do

begin

a[i]:=random;

writeln(f,a[i]:8:4);

end;

close File(f);

writeln;

writeln('Press <Enter> to read file')

readln;

reset(f);

for i:=1 to 10 do

begin

readln(f,a[i]);

writeln(a[i]:8:4)

end;

close File(f);

readln

end.

Объяснение операций работы с файлами будет дано позже.

 

2.10.3. Перечисления

type имя типа = (идентификатор1, идентификатор2,…, идентификаторN);

Примеры:

month = (Jan,Feb,March,Apr,May,June,Jul,Aug,Sept,Oct,Nov,Dec);

type t1 = (x1,x2,x3);

var ab:t1;

m:month;

begin

case m of

Dec,Jan,Feb: operator1;

March..May: operator2

else operator2;

a:=x2;{ord(a)gacm1}

b:=x3;{ord(b)gacm2}

……

a:=t1(0);{явное приведение типа – обратно к функции ord}

В других языках:

C++:

enum Month carrentMonth;

if (carrentmonth!=Jan){…}

Но:

Jan==0,Feb==1,…;

Можно даже

Enum Month{Jan=1,Feb,…,Dec=14};

 

2.10.4. Множества

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

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

Формат задания типа “множество”:

type

Имя_типа1=set of (порядковый_тип);

Имя_типа2=set of значение1..значение2;

Пример:

type

My=set of char;

MyInterval=set of 1..10;

MyEnumeration=set of (Jan,Feb,…);

var

aSet1: MyChars;

aSet2: MyInterval;

const

aLetter:set of myChars=[‘I’,’k’,’l’,’z’];{Определение

множества без предварительного описания в разделе типов}

begin

aSet1:=[‘a’,’b’,’z’];

……

aSet1:=[ ];

end

В данном примере переменная aSet1 и статическая переменная aLetter могут принимать любые значения , aSet2 — любое значение в диапазоне 1..10; . Попытка присвоить другие значения вызовет ошибку времени исполнения.

В выражениях на языке Паскаль (т.е. в разделах реализации процедур, функций или в теле программы) значения множеств указываются в квадратных скобках: [1,2,3,4], ['a','b','c'], ['a'..'z']. Если множество не имеет элементов, оно называется пустым и обозначается как [].

 

Внимание!Количество элементов множества не должно превышать 256, соответственно номера значений базового типа, получаемые функцией ord(MyElement) для элемента MyElement нашего множества, должны находиться в диапазоне 0..255.

 

Объем памяти, занимаемый одним элементом множества, составляет один байт. Объем памяти для переменной типа множество вычисляется по формуле:

Объем памяти = (Max div 8) -(Min div 8) + 1,

где Max и Min — верхняя и нижняя границы базового типа.

При работе с множествами допускается использование операций отношения "=", "<>", ">=", "<=", объединения ”+”, пересечения “*”, разности “-“ множеств и операции in. Результатом выражений с применением этих операций является значение True или False.

Операция "равно" (=).

A=B

Два множества A и B считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.

Операция "не равно" (<>).

A< >B

Два множества A и B считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.

Операция "больше или равно" (>=).

A>=B

Используется для определения принадлежности множеств. Результат операции A>=B равен True, если все элементы множества B содержатся в множестве A. В противном случае результат равен False.

Операция "меньше или равно" (<=).

A<=B

Используется аналогично предыдущей операции, но результат операции A<=B равен True, если все элементы множества A содержатся в множестве B. В противном случае результат равен False.

Операция in.

X in A

Используется для проверки принадлежности какого-либо значения выражения x указанному множеству A. Обычно применяется в условных операторах. Не путать с оператором <=, который используется для сравнения двух множеств.

При использовании операции in проверяемое на принадлежность значение и множество в квадратных скобках не обязательно описывать в разделе описаний.

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

if (a=1) or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then ... можно заменить более коротким выражением if a in [1,2,3,4,5,6] then ... . Иногда операцию in пытаются записать с отрицанием: X not in M. Такая форма ошибочна, так как две операции следуют подряд; правильная инструкция имеет вид not (X in M).

Объединение множеств (+).

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

Пересечением множеств (*).

Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.

Разностью множеств (-).

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

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

2.10.5. Файловые типы. Операторы write, writeln, assignFile, read, readln,reset, rewrite, closeFile.

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

Файлы являются структурными типами с особыми правилами работы с ними. В данном параграфе описываются операторы для работы с файлами.

Задание переменной файлового типа производится так:

type tF=file of t1

var f:tF;

либо var f:file of t1;

тут t1 – базовый тип файлового типа, то есть тип ячеек, из которых состоит файл.

Для работы с файлами надо сначала определить файловую переменную (например, F1), имеющую тип, соответствующий типу файла, с которым будет осуществляться работа. Для этого используется процедура: assign(F1, Name: string), где строковое выражение Name содержит полное имя файла, удовлетворяющее требованию операционной системы. Пример:

var F1: file of integer;

assign File(F1,'data1.x');

Файловая переменная (в нашем случае F1) выполняет роль указателя на файл, а оператор assign “перещелкивает” его с одного файла на другой. Причем до первого assign значение этого указателя неопределено.

В процессе работы файловой переменной можно переприсваивать имена файлов.

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

Для работы с текстовыми файлами существует предопределенный тип файлов Text:

var F: text;

assign File(F,'data.txt');

Существуют также нетипизированные файлы. Соответствующие файловые переменные описываются как var F:file.

Операторы write и writeln — полиморфные операторы с произвольным числом и типом параметров. Первым параметром является файловая переменная, далее через запятую следуют выводимые в файл переменные или выражения.

 

Неформатный вывод в файл:

· write(F1,a); write(F1,b,c,...,d) — вывод в файл “подряд” всех значений. Эквивалентно write(F1,a,b,c,…,d).

· writeln(F1,a); writeln(F1,b,c,...,d) — имеет смысл только для текстовых файлов. После вывода всех перечисленных в операторе параметров в конец добавляется перевод на новую строку. В данном примере — после вывода a и после вывода d.

Другой пример:

writeln(F1a); writeln(F1b);...; writeln(F1c); — после вывода в файл любого параметра туда добавляется перевод на новую строку.

Оператор writeln; без параметров используется для перехода на новую строку.

 

Форматный вывод в текстовый файл:

· write(F1x:n1) — вывод значения целой, вещественной, булевской или строковой величины x (либо x как элемент множества) в правую сторону поля длинной n1. Если x - вещественная величина , она выводится в научной нотации.

· write(F1x:n1:n2) — вывод вещественной величины x в нотации с фиксированной десятичной точкой, n2 (лежащее от 0 до 24) — число знаков после точки. Например, при x=1.234567e-987 оператор write(F1x:12:3) дает -1.234e-0987, а write(F1x:12:2) дает -1.23e-0987.

Оператор read(F,a) читает из файла, назначенного файловой переменной F, значение с текущего места позиционирования считывающей головки и передвигает головку на один элемент файла по направлению к концу файла. Установка в конец файла должна производиться программным путем с проверкой значения предопределенной переменной Eof на значение true, достигаемое в случае, если вместо следующего элемента в файле стоит маркер конца файла.

Консоль (монитор и клавиатура компьютера) является файлом чтения/записи по умолчанию, когда файловая переменная не указывается. Запись эквивалентна выводу в текстовом режиме на экран, чтение – вводу с клавиатуры. В Delphi такой формы операторов wride, writeln, read, reddln пользуются только в специальном режиме имитации консоли.

Оператор readln; обычно используют для приостановки работы программы до нажатия пользователем клавиши <Enter>, readln(a) — для ввода с клавиатуры значения переменной a.

Оператор rewrite(F) создает новый файл с именем, назначенным в данный момент файловой переменной F. Если файл с таким именем уже существует, он без предупреждения затирается.

Установка в начало файла производится оператором reset(F).

После окончания работы с файлом (перед новым вызовом assignFile(F,…) или выходом из программы) надо выполнить команду closeFile(F), иначе операционная система будет поддерживать файл открытым. Максимальное число одновременно открытых файлов зависит от версии и установок операционной системы. Если closeFile(F) вызвать после очередного assignFile , то предыдущий файл останется открытым и закроется операционной системой только после выхода из программы. Закроется же текущий файл, на который была настроена переменная F во время вызова последнего assign с ее участием.

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

В Delphi имеется расширение PASCAL. Вместо операторов assign и close, использовавшихся в ТР, приняты совершенно идентичные им, но имеющие более осмысленные названия assignFile и closeFile. Кроме того, имеются операторы blockRead и blockWrite, позволяющие производить блочные чтения и запись с произвольного места в файле. Надо отметить, что при работе с текстовыми файлами лучше пользоваться этими операторами. Имеются также:

· булевская функция fileExists (имя файла), возвращающая true, если файл с таким именем существует,

· процедура flush (файловая переменная) – очищает буфер с немедленной записью в файл,

· процедура seek(var F;N:longInt) – смещает указатель файла F к компоненту с номером N (нумерация идет от нуля),

· функция fileSize(varF):longInt – возвращает число компонентов файла ,

· функция filePoz(varF):longInt – возвращает текущую позицию в файле (то есть для очередных чтения или записи).

Замечание: переход в конец файла – с помощью seek(F,fileSize(F)). Кроме того, имеется много других процедур и функций.

 

2.11. Указатели. Динамические переменные. Динамическое выделение и высвобождение памяти

В языке PASCAL имеются структурные типы особого рода (pointers), получившие название указателей, либо, что то же самое, ссылок. Они предназначены для динамического выделения памяти под данные. В разделе декларации указатели описываются следующим образом: если имеется некий предопределенный или определенный пользователями тип tAnyType, то тип — указатель на переменную var MyVariable:tAnyType описывается как type tpAnyType=^tAnyType, а переменная ссылочного типа может быть описана либо как var pAnyType:tpAnyType, либо сразу как var pAnyType:^tAnyType без специального объявления типа tpAnyType.

В отличие от обычных переменных в ссылочных находятся не сами данные, а только адреса ячеек, в которых эти данные хранятся. Поэтому под ссылочные переменные выделяется одинаковое (4 байта) количество памяти независимо от типа данных, на которые указатель ссылается.

Память под данные выделяется только после использования оператора New, который имеет две формы — процедуры и функции. Изначально указатель ссылается в неопределенное место памяти, что может привести к грубым ошибкам при попытке доступа к данным, на которые он указывает. Ссылочной переменной любого типа может быть присвоено значение nil, означающее, что он никуда не указывает. Попытка доступа к данным через такой указатель также вызовет ошибку, однако перед вызовом указатель может быть проверен на то, не равен ли он nil.

Рассмотрим следующий пример:

procedure PtrDemo1;

var p1,p2:^Integer;

a,b:Integer;

begin

a:=1;

b:=2;

New(p1); {в "куче"(heap) динамически выделена ячейка — область под

"безымянную" переменную типа Integer, указатель p1 настроен

на эту ячейку}

p1^:=a+5; {в эту ячейку записывается значение 6}

p2:=p1; {на эту ячейку теперь указывают и p1, и p2, в ней - число 6}

New(p1); {динамически выделяется еще одна ячейка, p1 переключается на нее,

а p2 остался настроен на прежнюю}

b:=p2^-1; {переменной b присваивается значение, содержащееся в первой

ячейке, уменьшенное на 1,то есть 5}

{значение p1^не определено, p2^= 6}

dispose(p1); {высвобождаем память, выделенную под ячейку2}

dispose(p2); {высвобождаем память, выделенную под ячейку1}

end;

В данном примере видно, что указатель можно использовать не только для динамического выделения памяти, как это происходит с p1 , но и для сохранения программой связи с выделенной ячейкой, для чего используется p2. Если бы мы вовремя не настроили p2 на первую динамически выделенную ячейку памяти, при втором вызове New(p1) мы бы потеряли к ней доступ, указатель p1 "перещелкнулся" бы на вторую динамически выделенную ячейку, и образовывался бы так называемый "мусор" (garbage) в памяти: область, помеченная операционной системой как занятая задачей, но самой задаче уже недоступная.

Следующий тонкий момент при работе с указателями — высвобождение динамически выделенной памяти. К окончанию работы программы вся динамически выделенная память должна быть "возвращена обратно". Это делается с помощью оператора dispose, который "уничтожает" (т.е. высвобождает) ячейку, на которую ссылается указатель. Сам указатель при этом не уничтожается и может быть в дальнейшем использован!

Часто встречающаяся в программах ошибка — использование указателя доступа к данным после того, как ячейка на которую он ссылался, высвобождена. Этот случай аналогичен попытке использования неинициализированных (т.е. "не настроенных" на конкретную ячейку) указателей и часто кончается "зависанием" компьютера, такие указатели часто называют "висящими" ("dangling pointer").

Пример работы с указателями:

program PtrDemo2;

type tpInt=^Integer; {тип "ссылочный на Integer"}

var p1,p2:tpInt;

...

begin

...

New(p1); {выделили ячейку1 и настроили на нее p1}

...

New(p2); {выделили ячейку2 и настроили на нее p2}

...

dispose(p2); {высвободили ячейку2, но p2 "жив"}

p2:=p1; {настроили p2 на ячейку1}

New(p1); {выделили ячейку3 и настроили на нее p1}

...

dispose(p1); {высвободили ячейку3}

...

dispose(p2); {высвободили ячейку1}

end.

Следует помнить, что каждому New (вызванному, к примеру, с указателем p1) должен соответствовать свой dispose(вызванный, к примеру, с p2), и чтобы указатели p1 и p2 указывали бы на одну и ту же ячейку. Попытка лишний раз сделать dispose, т.е. повторно высвободить один и тот же участок памяти, обычно сразу заканчивается аварийной остановкой программы. Иногда указатели используются для получения ссылки на переменную, процедуру или функццию. Для этого в Object Pascal имеется функция addr (вместо нее можно использовать символ @ при соответствующей установке опции компилятора).

 

– Конец работы –

Эта тема принадлежит разделу:

Объектно-ориентированное программирование

На сайте allrefs.net читайте: "Объектно-ориентированное программирование"

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Простейшие операторы языка Object PASCAL

Что будем делать с полученным материалом:

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

Все темы данного раздела:

Object PASCAL
(72 часа) Вадим Валериевич Монахов, доцент кафедры вычислительной физики СпбГУ Введение   1.1. Основной принцип ст

Алфавит языка PASCAL. Идентификаторы.
Основной алфавит языка PASCAL состоит из латинских букв и цифр. Буквы: ABCD...XYZ — заглавные (прописные), abcd...xyz — строчные, а также знак _

Простые и составные специальные символы, используемые на ПК.
Перечисленный ниже набор несколько расширяет стандарт PASCAL, однако на ПК является стандартом de facto. Простые специальные символы: + Плюс – “сложени

Стандартные типы данных. Двоичное представление чисел и дополнительный код.
Целые типы Byte: 0..255 — байтовый (1 байт) ShortInt: -128..127 — короткое целое (1 байт) Word: 0..65535 — 16-ричное слово (2 байта) Inte

Арифметические операторы.
Бинарные полиморфные (тип результата определяется по правилам приведения типов, см. далее): + сложение (все целые и вещественные типы, строковые типы, множества).

Логические операторы и операции отношения.
Логические операторы: and логическое "И". Пример: a and b or логическое "ИЛИ": a or b xor логическое "исключающее ИЛИ": a xor b not

Потеря точности, потеря порядка и переполнение при арифметических операциях.
Пусть x1 – арифметическая переменная real, x2 – вещественная extended. Тогда выполнение присваиваний x2:=1+1e-14 даст 1.00000000000001, а x1:=1+1e-14 даст 10000000000000,т.к. числа real имеют всего

Структура простейшей программы.
В PASCAL любое число пробелов, символов <TAB> или переносов на новую строку везде приводится к одному пробелу (конечно, кроме строковых выражений). Имя файла с текстом программы должно быть т

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

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

Модули. Секции декларации, интерфейса и реализации. Области видимости.
На самом деле общая структура модуля при наличии в нем класса несколько сложнее. Обсудим ее более подробно. Написание собственного модуля (unit) начинается с указания имени модуля. В нашем

Классы, экземпляры класса, наследование, иерархия.
Объектный тип (например, tDot) называется классом. Переменная данного типа — объект или, что то же самое, экземпляр класса. То есть при задании Var dDot:tDot переменная dDot – это

Пример объектно-ориентированной программы: движение фигур по экрану.
unit Figures; interface uses…; type tLocation= object X,Y:Integer; procedure Init(X_,Y_:Integer); function GetX:Integer;

Виртуальные методы. Конструкторы. Раннее и позднее связывание. Полиморфизм.
В приведенной выше программе при описании объектов некоторые методы заданы как виртуальные (virutal). В этом случае перед вызовом какого-либо метода соответствующего экземпляра класса (переменной о

Динамические объекты. Выделение и высвобождение памяти. Деструкторы.
Указатель на объект устроен так же, как обычные указатели:    

Правила присваивания. Совместимость типов для объектов.
Для потомков при использовании их "на месте" прародителей любого уровня имеется два основных варианта совместимости типов (по вызовам и по присваиваниям) между: 1. экземплярами о

Пример на создание, присваивание и уничтожение динамических объектов.
Unit FigDemo1; Uses…,Figures,FigArc; var FigKey:char; Ang1_ini,Ang2_ini,R_ini,X_ini,Y_ini:Integer; newX,newY,newR:Integer; pFigure:tpDot; outside:Boolea

Пример динамического выделения и высвобождения памяти для однонаправленного списка объектов.
Создадим список, в котором хранятся различные фигуры — объекты иерархии с классом-прародителем tDot. Введем запись типа "узел", ссылающийся на одну фигуру и один другой (предыдущий) узел:

Очередь, стек, двунаправленный список.
Совершенно аналогичным образом можно создавать объект — двунаправленный список, в котором каждый узел имеет указатели как "влево" (на предыдущий узел), так и "вправо" (на послед

Классы, объекты, поля и методы.
В Object Pascal класс — тип записи, который может иметь в своем составе поля данных и методы (а также свойства, но о них будет отдельный разговор). Пример описания класса и переменн

Свойства.
В Delphi пожелание ООП "не обращаться из программы к полям, а действовать через методы" нашло отражение в новом для ООП принципе — свойствах объекта. Свойство определяется

Создание и уничтожение объектов. Конструкторы и деструкторы.
В Object Pascal объекты могут быть только динамическими! Любая переменная объектного типа — это указатель, но доступ к объекту идет без 'шляпки', а создание нового объекта осуществляется не операто

Наследование. Статические, виртуальные, динамические и абстрактные методы.
Все классы Delphi — потомки класса tObject. Если нет указания, какой класс является прародителем, значит, это tObject. Определение tMyObject=class ... end; полно

Области видимости объектов.
В Delphi существуют зарезервированные слова public ("общие"), protected ("защищенные") и private ("личные") для определения специальных правил видимости областей кода

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

Специальные средства для работы с MS Windows: сообщения.
Для обработки сообщений Windows в Delphi существует механизм динамических методов, называемых сообщениями. Они должны быть описаны в классе как процедуры, имеющие один параметр, передаваемый по име

События и их делегирование. Обработка событий.
События — это свойства процедурного типа. Их название принято начинать с префикса "on". Для описания события некого типа (как описать новый тип события будет рассказано далее) в объекте н

Методы класса и указатели на класс.
Некоторые методы бывает нужно вызывать без создания экземпляра класса (например, для получения информации о имени класса, размере экземпляра класса и т.п.). Такие методы называются методами класса

Дополнительные возможности Object Pascal.
4.17.4. Функции а) могут возвращать значения определенных пользователем типов, включая сложные; б) внутри каждой функции предопределена доступная по чтению и записи локальн

Визуальное проектирование в среде Delphi.
Перед началом работы обычно надо настроить пути к библиотеке Delphi, а в Delphi 3.0 также установить пакеты. Это связано с тем, что Windows 95 (и, тем более, NT 4.0) имеет индивидуальные настройки

Создание экранных форм. Инспектор объектов.
При входе в Delphi автоматически открывается проект "по умолчанию". Изначально это проект с пустой экранной формой, на которой пунктиром показана сетка, к которой идет привязка для выравн

Палитра компонентов.
Мы будем описывать только наиболее важные свойства и события для компонентов и перечислим только наиболее часто используемые компоненты из стандартных библиотек Delphi 3.0. Для Delphi 2.0 практичес

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

Особенности разработки DLL
Работа программ с DLL (Dynamic Link Library) поддерживается операционной системой, а не компилятором какого-либо языка программирования. Они представляют собой универсальный механизм использования

ActiveX
Подпроцессы (Threads) Для создания дополнительного подпроцесса в программах Delphy предназначен специальный модуль (в репозитории он представлен пиктограммой Thread Object

Использование библиотек OpenGL и GLU
5.21. Создание программистом собственного компонента Литература 1. В.В.Фаронов . Delphi 6. Учебный курс.- М.:"Нолидж", 2001.- 608 с.

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги