Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 380

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
1.08 Mб
Скачать

var

А,В : 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