бесплатные рефераты

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

Если выполнен RESET(F), а файл F пуст, т.е. EOF(F)=TRUE, то значение F^ неопределенно. Окно файла указывает на его конец. Для передвижения окна файла и заполнения (чтения) буферной переменной используются в некоторых версиях Паскаля специальные процедуры-операторы GET и PUT:

а) GET(F) - передвижение окна на следующую компоненту и засылка значения этой компоненты в переменную F^.

F^

7

f

3

5

7

8

^

окно

после GET(F):

F^

8

f

3

5

7

8

^

окно

б) PUT(F) - запись в файл значения F^ и сдвиг вправо. Здесь до PUT(F) надо F^ присвоить очередное значение. В режиме записи значений в файл F^ служит поставщиком значений компонент. После процедуры REWRITE(F) окно устанавливается на первую компоненту, значение F^ не определено. Затем надо определить значение F^ с помощью команды присваивания: F^:=3. Если теперь написать процедуру PUT(F), то значение F^ идет в компоненту, где стоит окно, после чего значение F^ становится неопределенным:

F^

3

f

6

4

7

8

^

окно

PUT(F)

F^

f

6

4

7

8

3

^

окно

ПРИМЕР 2. Запись чисел v1 - v5 в файл BUFFER и последующий их вывод на печать

program KVADRKOREN;

var R: real; I: integer; BUFFER: file of real;

begin

¦ rewrite(BUFFER);

¦ for I:=1 to 5 do

¦ begin

¦ ¦ BUFFER^:=sqrt(I); put(BUFFER);

¦ end;

¦ reset(BUFFER);

¦ for I:=1 to 5 do

¦ begin

¦ ¦ R:=BUFFER^;

¦ ¦ get(BUFFER); writeln(R);

¦ end;

end.

ЗАМЕЧАНИЕ. В некоторых версиях процедуры GET и PUT не существуют (в частности, это имеет место для Турбо-Паскаля). Но без них можно обойтись, т.к. существуют эквивалентные им операторы READ и WRITE. Им эквивалентны следующие составные операторы:

READ(F,V) => BEGIN V:=F^; GET(F) END;

WRITE(S,W) => BEGIN S^:=W; PUT(S) END.

10.4 Основные приемы работы с файлами

Известно существование многих версий Паскаля, каждая из которых имеет свои особенности и отличия от стандарта Паскаля. Рассмотрим некоторые приемы работы с файлами в системах Turbo-Pascal для ПЭВМ "Ямаха" и IBM PC.

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

СИНТАКСИС: assign(var F: file; NAME: string), где NAME - имя файла на диске, F - имя файловой переменной.

После выполнения этой процедуры NAME и F отождествляются, например, ASSIGN(F,'nomfile') отождествляет файловую переменную F с его именем на диске. В качестве имени файла может быть указаноего полное имя, т.е. путь к этому файлу, например:

ASSIGN(F,'С:\WORK\ MIM\nomfile').

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

СИНТАКСИС: CLOSE(var F:file), где F - имя файловой переменной.

Процедуры ASSIGN и CLOSE взаимосвязаны и работают в паре друг с другом. Как уже сказано выше, перед началом работы с файлом выполняется процедура ASSIGN(F, 'nomfile'), которая для логического файла F готовит (ищет) на диске в указанной директории файл с именем NOMFILE. При окончании работы с файлом по выполнению процедуры CLOSE происходит его обновление (в случае записи) и закрытие (в случае чтения).

В программе надо уметь задавать исходные файлы. Эти файлы надо делать в цикле, используя при этом формирование компонент, либо в форме некоторого выражения по RANDOMIZE, либо задействовать обычную команду READ для ввода данных с клавиатуры. Цикл можно делать FOR, если формирование файла идет по RANDOMIZE, или WHILE (REPEAT), если файл формируется по признаку конца ввода.

Напомним, что RANDOMIZE - процедура инициализации генератора случайных величин; RANDOM - функция генерации случайных чисел.

Рассмотрим все эти особенности на примере формирования, обработки и вывода файлов.

ПРИМЕР 2. Для двух целочисленных файлов F и G одинаковой длины образовать третий целочисленный файл H, компоненты которого определяются по правилу: Hi=MAX{Fi,Gi}. В программе предусмотреть вывод на экран все трех файлов

program MAXELEM;

type FT = file of integer;

var F,G,H: FT;

I,J: integer;

procedure VIVODFILE(var A:FT);

begin

¦ reset(A);

¦ while not eof(A) do

¦ begin

¦ read(A,I); write(I:4);

¦ end; writeln;

end;

begin { формирование исходных файлов }

¦ assign(F,'F'); assign(G,'G');

¦ randomize; rewrite(F); rewrite(G);

¦ for I:=1 to 10 do

¦ begin

¦ J:= random(10)-5; write(F,J);

¦ ¦ J:= random(10)-5; write(G,J);

¦ end;

¦ VIVODFILE(F); close(F);

¦ VIVODFILE(G); close(G);

¦ assign(H,'H');

¦ { формирование файла результата }

¦ reset(F); reset(G); rewrite(H);

¦ while not eof(F) do

¦ begin

¦ ¦ read(F,I); read(G,J);

¦ ¦ if I > J then write(H,I) else write(H,J);

¦ end; VIVODFILE(H);

¦ close(H);

end.

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

procedure DOBAVLENIE(N: integer; var A:file);

var B: file; I,J: integer;

begin

¦ { Запись файла А в файл B }

¦ assign(B,'B');reset(A; rewrite(B);

¦ while not eof(A) do

¦ begin read(A,I); write(B,I); end;

¦ { Добавление новых элементов в файл B }

¦ for I:=1 to n do

¦ begin

¦ J:= random(10)-5; write(B,J);

¦ end;

¦ { Запись файла B в файл A }

¦ rewrite(A); reset(B);

¦ while not eof(B) do

¦ begin read(B,I); write(A,I); end;

end.

10.5 Текстовые файлы

Среди всех файлов особое место занимают текстовые файлы. Особенностью текстовых файлов является объединение в них символов в строки. Каждая строка кончается специальным символом конца строки. Этот специальный символ (литера) не входит в стандартный тип CHAR и не имеет графического представления. Нас и не интересует вид этого символа. Главное, что с ним связана логическая функция EOLN (конец строки). EOLN(F) = TRUE, если окно указывает на признак конца строки. Заметим, что если EOLN(F) = TRUE, то при чтении элементов из файла в символьную переменную она принимает значение пробела (пробел - аналог конца строки). Для записи в файл признака конца строки служит стандартная процедура WRITELN.

Текстовые файлы, т.е. файлы с делением на строки, описываются с помощью слова TEXT, например, VAR X, D: TEXT.

ПРИМЕР 3. Определить количество строк в файле с именем BOOK

program NOMBRELINE;

var K: integer; BOOK: text; S: char;

begin { Формирование файла BOOK }

¦ assign(BOOK,'f1'); rewrite(BOOK); read(S);

while S<> '.' do begin

¦ while S <> '#' do begin

¦ write(BOOK,S); read(S); end;

¦ writeln(book);read(S); end; close(BOOK);

¦ { Подсчет числа строк в текст; BOOK }

¦ K:= 0; reset(BOOK); writeln;

¦ while not eof(BOOK) do

¦ begin

¦ if eoln(BOOK) then K:=K+1; read(BOOK,S); write(S);

¦ end;

¦ writeln('В текстовом файле BOOK ', K,' - строк');

end.

ПОЯСНЕНИЕ. В программе сначала формируется текстовый файл, у которого строки кончаются символом "$", а сам текст - символом ".". Текст вводится с клавиатуры в виде непрерывной цепочки, например:

Наша Маша громко плачет,Уронила в речку мячик.$Тише, Машенька, не плачь,$Не утонет в речке мяч.$.

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

Наша Маша громко плачет,

Уронила в речку мячик.

Тише, Машенька, не плачь,

Не утонет в речке мяч.

Итак, для записи литеры "конец строки" используется процедура WRITELN(F), где F находится в режиме записи.

T

a

g

c

d

^

окно

WRITELN(T):

T

a

g

c

d

#

^

окно

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

В режиме чтения для работы с литерой "конец строки" есть процедура READLN. По этой процедуре окно файла устанавливается на первый элемент следующей строки файла.

T

d

b

c

d

#

e

f

^

окно

READLN(T):

T

d

b

c

d

#

e

f

^

окно

ПРИМЕР 4. Дано некоторое стихотворение в виде текстового файла ACROSTIH. Напечатать слово, образованное первыми буквами строк стихотворения (акростих)

program SLOVO(ACROSTIH); program FORMFIL;

var L:char; T: text; var F: text; S: char;

begin begin

¦ assign(T,'ACROSTIH'); ¦ assign(F,'ACROSTIH');

reset(T); ¦ rewrite(F); read(S);

¦ while not eof(T) do ¦ while S <> '?' do

¦ ¦ begin

¦ begin ¦ while S <> '#' do

¦ ¦ begin

read(T,L); write(L); ¦ write(F,S); read(S);

¦ ¦ end;

¦ readln(T); ¦ writeln(F);read(S); end;

¦ end; ¦ close(F);

end. end.

ПОЯСНЕНИЕ. Программа FORMFIL формирует текстовый файл ACROSTIH как было показано в примере 3. В программе SLOVO файл ACROSTIH выступает как внешний. Ему соответствует файловая переменная T. Оператор READLN(T) последовательно устанавливает окно файла на начало строк текста.

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

ПРИМЕР 5. Посчитать число знаков препинания в указанном текстовом файле

function PUNCTUATION(var CHARFILE: text): integer;

var SYMBOLNOMB: integer;

SYMBOL: char;

begin

SYMBOLNOMB:=0; reset(CHARFILE);

while not eof(CHARFILE) do

begin

read(CHARFILE, SYMBOL);

if SYMBOL in ['.',',',' ',':','...] then

SYMBOLNOMB:= SYMBOLNOMB + 1

end;

PUNCTUATIОN:= SYMBOLNOMB

end.

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

assign(FIL,'FIL');

reset(FIL);

n:=PUNCTUATION(FIL);

close(FIL);

writeln('число знаков препинания в тексте FIL =', n).

11. ССЫЛОЧНЫЙ ТИП. ПЕРЕМЕННЫЕ С УКАЗАТЕЛЯМИ

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

НАПРИМЕР:

а) с помощью описания VAR A, B: INTEGER в программе вводятся в употребление две статические переменные с именами А и В, значениями которых будут целые числа;

б) описание VAR X: ARRAY[1..10] OF REAL oпределяет (порождает) переменную регулярного типа (массив), значением которой может быть упорядоченная последовательность из десяти вещественных чисел.

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

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

Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и соответствующей ячейки памяти.

Так, например, при описании VAR A, B: INTEGER в памяти ЭВМ резервируются две ячейки, которые маркируются соответственно А и В.

Будем считать, что до начала работы программы эти ячейки пусты (на самом деле они содержат "мусор" или 0). Если теперь в программе переменным А и В присвоить значения А:= 1 и В:= 2, то эти ячейки заполнятся соответствующими данными значениями.

При описании VAR X: ARRAY[1..10] OF REAL в памяти ЭВМ резервируются подряд 10 ячеек памяти, которые идентифицируются соответственно X[1], X[2],..., X[10].

Если теперь сделать

FOR I:= 1 TO 10 DO READ(X[I]),

то эти ячейки заполнятся десятью числами, вводимыми с клавиатуры. При упоминании в программе имен А и В фактически указывается на содержимое ячеек А и В, т.е. на значение переменных. Так, если следует оператор WRITE(A), то печатается не А, а значение переменной А, т.е. число 2.

Из этих рассуждений следует, что для таких переменных (статических) область памяти закрепляется на все время работы программы. Поэтому ячейка с адресом А всегда будет хранить только целые числа, а группа ячеек с адресами Х[1],...,X[10] - 10 вещественных чисел. Ничто другое в эти части памяти не может быть помещено.

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

Мы уже сталкивались с такой ситуацией:

CONST N =.....

VAR X: ARRAY [1..N];

или

VAR Y: STRING [N].

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

1. Пусть в заданном тексте из слов произвольной длины требуется найти первое по порядку слово, которое обладает некоторым свойством (не содержит, например, букву "а").

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

2. Бывает, что какой-то программный объект (например, массив чисел, множество, список) нужен не на все время работы программы, а только на какую-то часть. Хотелось бы после отработки данного объекта разместить на этом месте памяти другой объект.

11.1 Определение ссылочного типа

Для работы с динамическими объектами статические переменные не подойдут, здесь предусматривается специальный тип значений - ссылочный. Значением данного типа является ссылка на какой-либо программный объект, осуществляющая непосредственный доступ к этому объекту. На машинном языке такая ссылка указывает на место памяти, т.е. адрес соответствующего объекта. А так как ссылочная переменная есть переменная, то возможно изменение значения ссылок и одна и та же переменная может указывать на любую ячейку памяти.

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

Имя ячейки

Такие переменные называются переменными типа указатель (переменными ссылочного типа) или просто указателями (ссылками).

Итак, слова - синонимы:

Значение указателя есть адрес объекта (ссылка на объект), посредством которого он и доступен в программе.

Итак, указываемый объект есть динамический объект. Он хранится в ячейке, которая не имеет своего собственного имени (не обозначается именем переменной), а используется лишь ссылка на эту ячейку. Здесь для сравнения можно привести ситуацию, когда называют зрителя в зале театра: "Зритель, сидящий на 3-м месте в 5-м ряду".

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

Как задать ссылочный тип, т.е. как описать указатель? Указатель обозначают обычным идентификатором. О том, что это указатель, говорит присутствие символа "^".

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

НАПРИМЕР:

TYPE MAS = ARRAY [1..100] OF INTEGER;

DINMAS = ^MAS;

VAR P: ^INTEGER; Q: ^CHAR;

RABMAS: DINMAS.

ЗДЕСЬ: P - ссылка на динамический объект целого типа, Q - ссылка на динамический объект литерного типа, RABMAS - ссылка на динамический объект, значением которого является массив из 100 чисел.

11.2 Создание динамических переменных. Процедура NEW

Описание переменных P и Q ссылочного типа в разделе объявлений еще не резервирует память для записи значений динамической переменной соответствующего типа.

Здесь вводятся в употребление статические переменные P и Q (транслятор резервирует место в памяти, необходимое для размещения ссылки). Пустые клетки в схеме означают, что пока переменные P и Q не имеют никаких ссылок на динамические объекты.

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

Это процедура с параметром - ссылочной переменной, сопоставленной порождаемому динамическому объекту.

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

ЗАМЕЧАНИЕ. Резервирование места для динамической переменной идет уже в ходе выполнения программы, а не при ее трансляции, как для статических переменных. Говорят, что NEW устанавливает водораздел между статическими и динамическими переменными.

КАРТА ПАМЯТИ

MSX-DOS

Библиотека PASCAL

TURBO-система

Исходный текст программы

Объектный ход программы

Указатель

-----------------

Куча

ПРИМЕЧАНИЕ. Здесь указана примерная схема карты памяти при работе системы Турбо-Паскаль.

11.3 Переменные с указателями

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

Имя динамической переменной складывается из имени статической переменной типа указатель, поставленной в программе в соответствие данному динамическому объекту, и символа "^" после ссылочной переменной, свидетельствующего о том, что здесь речь идет не о ее значении, а о значении того программного объекта, на который эта ссылочная переменная указывает.

НАПРИМЕР:

Р - указатель: 5 ряд, 6 место,

Р^ - человек, сидящий в 5 ряду на 6 месте;

или

А - указатель,

А^ - имя динамической переменной, на которую указывает А.

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

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

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. Подсчет числа вхождений заданной буквы в первое по порядку слово максимальной длины из заданного текста, заканчивающегося точкой

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


© 2010 РЕФЕРАТЫ