Рефераты. Алгоритмический язык Паскаль

Короче, А^ - переменная "старого" типа, которой можно присваивать конкретные значения.

Итак, пусть в программе содержатся:

VAR P: ^INTEGER; Q: ^CHAR;

NEW (P); NEW (Q).

Теперь в программе порождаются динамические переменные типов INTEGER и CHAR, которым с помощью оператора присваивания можно давать конкретные значения: Р^:= 58; Q^:= 'a'.

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

R:= R + P^ + 2; P^:= P^ div 3.

В качестве ссылочной переменной может использоваться и более сложная конструкция, являющаяся частичной переменной, имеющей соответствующий ссылочный тип. Так, если в программе есть описания ссылочного типа TYPE REFREAL = ^REAL и переменной этого типа VAR A: ARRAY[1..50] OF REFREAL (в силу которого значением переменной А может быть массив элементов ссылочного типа, причем каждая из ссылок указывает на вещественное значение), то в качестве ссылочной переменной может фигурировать переменная с индексом, например, А[2]^ или А[K+5]^. Значением этих переменных с указателями будут вещественные числа. Иначе, определив

TYPE P = ARRAY[1..50] OF INTEGER; VAR B: ^P,

переменная В будет указателем на массив типа Р и в этом случае элементы массива обозначаются так - В^[2], B^[K+5].

ПРИМЕР 1. Поиск буквы во множестве букв и печать общих букв двух множеств

programm SETUK;

type MN = set of char;

var A,B: ^MN; C: MN; I,D: char;

begin

¦ new(A); A^:= ['a','c','o'];

¦ write('введите букву, которую надо найти:'); rеаdln(d);

¦ if D in A^ then writeln('да')

¦ else writeln('нет');

¦ new(B); B^:= ['g','c','o']; C:= A^ * B^;

¦ writeln('общие буквы множеств:');

¦ for I:= 'a' to 'z' do

¦ if I in C then write (I,' ')

end.

ПОЯСНЕНИЕ. В этой программе используются два динамических множества А и В, а также статическое множество С. Место, занимаемое в памяти под запись множеств A и B может быть освобождено после получения множества C.

ВЫВОДЫ (отличия динамической переменной от статической):

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

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

Для идентификации значения динамической переменной используется переменная с указателем.

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

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

Пусть объявлены переменные VAR Q, R: ^INTEGER и указатель R содержит адрес динамической переменной, значение которой равно 1, а Q - адрес динамической переменной, значение которой равно 2:

NEW(Q); NEW(R); Q^:= 2; R^:= 1.

Тогда оператор Q:= R перешлет в Q тот же адрес, что хранится в R, т.е. теперь Q будет "показывать" на то же значение (ту же ячейку памяти), что и R, а значение, на которое показывало Q раньше, будет навсегда утеряно. Этот процесс представлен схемой:

VAR Q,R:^INTEGER;

R

Q

NEW(R);

R

*

R^

NEW(Q);

Q

*

Q^

R^:=1;

R

*

1

R^

Q^:=2;

Q

*

2

Q^

Q:=R

R

*

1

R^ или Q^

Q

*

2

Потеряно

Можно присваивать значения одной динамической переменной другой, но того же типа. В этом случае значения обеих динамических переменных становятся равными, но значения указателей при этом не изменяются. Например, выполнена команда присваивания Q^:= R^, в результате получим одинаковое значение у двух переменных, как это показано на схеме:

До

После

R

*

1

R

*

1

Q

*

2

Q

*

1

Обмен значениями динамических переменных не изменяет значения ссылочных переменных. В этом случае, в отличие от оператора Q:=R, после выполнения которого Q и R "смотрят" на одну и ту же динамическую переменную, содержащую 1, каждая переменная Q и R указывает на свою динамическую переменную, хотя они обе содержат 1.

ЗАМЕЧАНИЕ. Следует различать пустой и неопределенный указатели. Так, при объявлении с помощью VAR некоторой переменной P (VAR P: ^INTEGER), ее значение является неопределенным. Если же имеет место оператор NEW(P), то ссылочная переменная получает свое конкретное значение - адрес ячейки памяти соответствующей динамической переменной P^. Переменная P может получить значение без оператора NEW только в случае присваивания пустой ссылки P:=NIL или ссылки, уже ранее получившей свое значение с помощью оператора NEW.

Итак, никакие действия со ссылочными переменными нельзя производить до действия оператора NEW. В примере

VAR I,J: ^ INTEGER;

NEW (I);

оператор I:= J не законен, т.к. J еще не определена, но допустим оператор J:=I.

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

program FINDLITER;

type MAS = array [1..100] of string[1];

LINK = ^MAS;

var R, REZSLOVO, TEKSLOVO: LINK;

max,i,k,j: integer;

S: string[100]; BUKWA: string[1];

begin

¦ max:= -1; i:= 0; new(TEKSLOVO); new(REZSLOVO);

¦ writeln('Введите текст: '); readln(S);

repeat

¦ for j:= 1 to length(S) do

¦ begin

¦ ¦ BUKWA:= copy(S,j,1);

¦ ¦ if (BUKWA <> ' ') and (BUKWA <> '.')

¦ then begin i:= i+1;

¦ ¦ TEKSLOVO^[i]:= BUKWA; end

¦ ¦ else if i > max then

¦ ¦ begin max:= i; R:= REZSLOVO;

¦ ¦ REZSLOVO:= TEKSLOVO;

¦ ¦ TEKSLOVO:= R; end;

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.