Методическое пособие 380
.pdfvar
А,В : real;
{Процедура вычисления квадратов двух чисел и вывода на экран их суммы}
procedure Sum_Square(X, Y : real); {X,Y - формальные параметры}
begin Х:=Х*Х; Y:=Y*Y;
Writeln('Cyммa квадратов = ',X+Y);
end; |
{Конец процедуры} |
begin |
{Начало основной программы} |
А:=1.5; В:=3.4;
Sum_Square (А,В) ; {Вызов процедуры Sum_Square с
передачей ей значений фактических параметров А и В} end.
При вызове процедуры Sum_Square с фактическими параметрами А, В значения этих параметров (один раз) копируются в соответствующие формальные параметры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В.
Параметры-переменные. Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова Var с обязательным указанием типа. Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например:
procedure Example(var M,N : integer; var Y : real) ;
41
Если формальный параметр определен как параметрпеременная, то при вызове процедуры ей передается сама переменная, а не ее копия, и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные.
Пример программы, использующей параметрыпеременные:
program Sum_Sub_Square; var
A,В : real ;
SumAB, SubAB : real;
{Процедура с параметрами-переменными Sum, Sub} procedure Sum_Sub(X,Y : real; var Sum, Sub : real); begin
Sum:=X*X+Y*Y; |
|
|
Sub:=X*X-Y*Y; |
|
|
end; |
{Конец процедуры} |
|
begin |
{Начало основной программы} |
|
А:=1.5; |
|
|
В:=3.4; |
|
|
Sum_Sub(A,B, |
SumAB,SubAB); |
{Вызов процедуры с |
передачей ей фактических параметров-значений А, В и параметров-переменных SumAB, SubAB}
Writeln('Сумма квадратов чисел',А,' и ',В,'= ', SumAB); Writeln("Разность квадратов чисел',А,’и',В,'=', SubAB); end.
42
5. ОСНОВЫ РАБОТЫ СО СТРОКОВЫМ ТИПОМ ДАННЫХ НА ЯЗЫКЕ OBJECT PASCAL
5.1. Понятие строки. Особенности строкового типа данных
Строка — это последовательность символов кодовой таблицы персонального компьютера. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки равна 255 байт.
Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе описания переменных. Строковые данные могут использоваться в программе также в качестве констант.
Недопустимо применение строковых переменных в качестве селектора в операторе Case.
Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка.
Формат описания строкового типа
Type<имя типа> =String [максимальная длина строки]; Var<идентификатор, . . . > : <имя типа>;
Переменную типа String можно задать и без описания
типа:
Var<идентификатор, . . . > : String [максимальная длина строки];
43
Фрагмент описания строковых данных
Const Address = 'ул. Карпинского, 33'; {Строковая константа}
Type Flot = string[125];
Var Fstr : Flot; |
|
{Описание с заданием типа) |
|
St1 : String; |
{По умолчанию длина строки St1= |
||
255} |
|
|
|
St2, St3 : string[50] ; |
|
|
|
Nazv |
: string[280]; |
(Ошибка, длина строки Nazv |
превышает 255}
Строка в языке Турбо Паскаль трактуется как цепочка символов. (Для строки из N символов отводится N+1 байт; N байт-для хранения символов строки, а один байт — для значения текущей длины строки).
К любому символу в строке можно обратиться, указав его номер. В самом начале строки (под нулевым номером) расположен байт, содержащий значение текущей длины строки.
0 1 2 3 … N+1 N
текущая длина строки Поэтому для определения объема памяти в байтах,
требуемой для размещения строки, к значению ее максимальной длины прибавляется 1.
Например, для размещения в памяти переменных Fstr, St1, St2 требуется соответственно 126, 35 и 51 байт (см. приведенный выше пример).
Рассмотрим структуру размещения строки в памяти на следующем примере. Пусть М — максимальная длина строки, L — текущая длина, А — ячейка памяти.
Тогда:
А —содержит величину текущей длины;
44
А+1 — первый символ строки; A+L — последний значащий символ; A+L+1
… — незанятые ячейки памяти А+М
5.2. Описание стандартных процедур и функций для работы со строками
Delete (Str,Poz,N) — удаление N символов строки Str, начиная с позиции Poz. Если значение Poz > 255, возникает программное прерывание.
Insert (Strl, Str2, Роz) –вставка строки Str1 в строку Str2, начиная с позиции Poz.
Например:
Var
Sl, S2 : string[ll] ;
…
S1 := ' ЕС ';
S2 := 'ЭВМ1841'; Insert(S1,S2,4) ;
В результате выполнения последнего выражения значение строки S2 станет равным 'ЭВМ ЕС 1841'.
Str (IBR,St) — преобразование числового значения величины IBR и помещение результата в строку St. После IBR может записываться формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины.
Val (St,IBR,Code) — преобразует значение St в величину целочисленного или вещественного типа и помещает результат
вIBR. Значение St не должно содержать незначащих пробелов
вначале и в конце. Code — целочисленная переменная. Если
45
во время операции преобразования ошибки не обнаружено, значение Code равно нулю, если ошибка обнаружена (например, литерное значение переводится в цифровое), Code будет содержать номер позиции первого ошибочного символа, а значение IBR не определено.
Copy (St,Poz,N) — выделяет из строки St подстроку длиной N символов, начиная с позиции Poz. Если Poz > Length(St), то результатом будет пробел; если Poz > 255, возникнет ошибка при выполнении. Функция Length описана ниже. Poz, N — целочисленные выражения.
Concat (Strl,Str2,...,StrN) — выполняет сцепление строк
Strl, Str2,..,StrN в том порядке, в каком они указаны в списке параметров. Сумма символов всех сцепленных строк не должна превышать 255.
Length (St) — вычисляет текущую длину в символах строки St. Результат имеет целочисленный тип.
Pos (Strl,Str2) — обнаруживает первое появление в строке Str2 подстроки Strl. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Strl. Если в Str2 подстроки Strl не найдено, результат равен 0.
UpCase (Ch) — преобразует строчную букву в прописную. Параметр и результат имеют литерный тип. Обрабатывает буквы только латинского алфавита.
В целом, работу со стандартными строковыми процедурами и функциями можно свести в следующую таблицу (таблица 3):
46
Таблица 3 Стандартные процедуры и функции для работы со
строковым типом данных
Процедура/ |
|
|
Описание |
|
|
||
Функция |
|
|
|
|
|||
|
|
|
|
|
|
||
Delete (St,Poz,N) |
Удаление |
N |
символов строки St, начиная с |
||||
позиции Poz |
|
|
|
|
|||
|
|
|
|
|
|||
Insert |
Вставка строки Str1 |
в строку Str2, |
начиная с |
||||
(Str1,Str2,Poz) |
позиции Poz |
|
|
|
|
||
Str (IBR, St) |
Преобразование числового значения величины |
||||||
IBR и помещение результата в строку St |
|||||||
|
|||||||
|
Преобразует значение St в величину |
||||||
|
целочисленного или вещественного типа и |
||||||
|
помещает результат в IBR. Значение St не |
||||||
|
должно содержать незначащих пробелов в |
||||||
Val (St,IBR,Cod) |
начале и |
в |
конце. |
Cod |
- целочисленная |
||
переменная, в которой содержится 0, если |
|||||||
|
|||||||
|
ошибки не обнаружено, и номер позиции |
||||||
|
первого ошибочного символа, если произошла |
||||||
|
ошибка. Значение |
IBR в |
этом |
случае не |
|||
|
определено. |
|
|
|
|
||
|
Выделяет из строки St подстроку длиной N |
||||||
Copy (St,Poz,N) |
символов, |
начиная |
с позиции Poz.Poz N- |
||||
|
целочисленные выражения |
|
|
||||
Concat |
Выполняет сцепление строк Str1,Str2,…,StrN в |
||||||
том порядке, в каком они указаны в списке |
|||||||
(Str1,Str2,…,StrN) |
|||||||
параметров. |
|
|
|
|
|||
Length (St) |
Вычисляет текущую длину в символах строки |
||||||
St.Результат имеет целочисленный тип. |
|||||||
|
|||||||
|
Обнаруживает первое появление в строке Str2 |
||||||
|
подстроки |
|
Str1. |
Результат |
имеет |
||
Pos(Str1,Str2) |
целочисленный тип и равен номеру той |
||||||
позиции, где находится первый символ |
|||||||
|
|||||||
|
подстроки Str1.Если в Str2 подстроки Str1 не |
||||||
|
найдено, то результат равен нулю. |
|
|||||
UpCase (Сh) |
Преобразует |
строчную букву в прописную. |
|||||
Параметр и результат имеют литерный тип. |
|||||||
|
47
6. ОСНОВЫ РАБОТЫ С ФАЙЛОВЫМИ ТИПАМИ
6.1. Типы файлов
Object Pascal поддерживает три файловых типа:
–текстовые файлы;
–типизированные файлы;
–нетипизированные файлы.
Доступ к файлу в программе происходит с помощью переменных файлового типа. Переменную файлового типа описывают одним из трех способов:
file of тип - типизированный файл (указан тип компоненты);
text - текстовый файл;
file - нетипизированный файл.
Примеры описания файловых переменных:
var
f1: file of char; f2: file of integer; f3: file;
t: text;
6.2. Методы для работы с файлами
Любые дисковые файлы становятся доступными программе после связывания их с файловой переменной, объявленной в программе. Все операции в программе производятся только с помощью связанной с ним файловой переменной.
Assign(f, FileName) связывает файловую переменную f с физическим файлом, полное имя которого задано в строке FileName. Установленная связь будет действовать до конца
48
работы программы, или до тех пор, пока не будет сделано переназначение.
После связи файловой переменной с дисковым именем файла в программе нужно указать направление передачи данных (открыть файл). В зависимости от этого направления говорят о чтении из файла или записи в файл.
Reset(f) открывает для чтения файл, с которым связана файловая переменная f. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента. Процедура завершается с сообщением об ошибке, если указанный файл не найден.
Если f - типизированный файл, то процедурой reset он открывается для чтения и записи одновременно.
Rewrite(f) открывает для записи файл, с которым связана файловая переменная f. После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если указанный файл уже существовал, то все данные из него уничтожаются.
Close(f) закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено.
EOF(f): boolean возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.
Rename(f, NewName) позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.
Erase(f) уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.
IOResult возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном
49
завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция IOResult работает только при выключенном режиме проверок ошибок ввода - вывода или с ключом компиляции {$I-}.
6.3. Текстовые файлы
Текстовый файл - это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.
Чтение из текстового файла:
Read(f, список переменных);
ReadLn(f, список переменных);
Процедуры читают информацию из файла f в переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символыразделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие ReadLn от Read в том, что в нем после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.
Запись в текстовый файл:
Write(f, список переменных);
50