Описание процедур и функций

Описание процедур имеет таковой вид:

procedure ();

;

В отличие от процедур, функции возвращают итог. Описание функции имеет форму:

function (): ;

В перечне параметров возможно показывать переменные каковые мы передаём в процедуру либо каковые приобретаем. Причём, в случае, если переменную из перечня параметров мы планируем изменить, тогда нужно перед переменной указать var.

Возможно так же показывать для переменной значение по умолчанию. Для этого, по окончании типа переменной через символ = нужно указать значение.

В большинстве случаев, наименование процедуры либо функции должно быть уникально. Но, часто бывает, что нужно для одной и той же функции показывать разные параметры. Исходя из этого, в компиляторе, чтобы не было необходимости задавать разные заглавия процедур, предусмотрена так называемая перегрузка функции. процедуры и Функции, каковые смогут повторяться отмечаются зарезервированным словом overload.

Разглядим функций и объявления процедур:

// Перегруженная функция с одной переменной

procedure my_write(str_inp1: string); overload;

// Перегруженная функция с двумя переменными

procedure my_write(str_inp1, str_inp2: string); overload;

// Перегруженная функция с тремя переменными

procedure my_write(str_inp1, str_inp2, str_inp3: string); overload;

Так, в программе мы можем задавать разное значение не вспоминая о том, какое наименование процедуры нужно указать для какого именно случая. По сути, у нас оказалась процедура, которая трудится подобно стандартной процедуре write. Мы можум писать:

my_write(‘Привет!’);

семь дней(‘Привет!’, ‘Иванов Иван Иванович’);

my_write(‘Привет!’, ‘Иванов Иван Иванович’, ‘Как Вы поживаете ?’);

Если бы процедура не была перегружаемой, компилятор не разрешил бы Вам применять разное количество параметров.

// Задаём значения по умолчанию

procedure get_user(str_inp1: string=’Иванов’;age: integer=20);

// По окончании исполнения, процедуры возвращаем параметр age

procedure get_user(str_inp1: string=’Иванов’;var age: integer=20);

// Функция с одним входным параметром. Возвращает значение косинуса

function my_cos(x: real): real;

// Функция без параметра, но с возвратом значения

function my_cos: string;

направляться подчернуть, что функции и процедуры возможно задавать так же в типах данных. Такие типы именуются: процедурный тип, тип-функция.

Пример таких процедур и функций:

Type

fmy_curr = function (summa: currency; nds: currency): currency;

fmy_proc = procedure (mess: string);

Строковые типы

Строчок является последовательностью знаков, заключенную в одинарные либо двойные кавычки. [7]

Константа типа Char является строкой раз мером в 1 знак.[7]

Примеры строчков:

‘Привет!’, “Тест”, “A”

Разглядим какие конкретно типы строчков имеется в Object Pascal.

Тип строчка Большая протяженность Имеется ли нулевой знак в конце
ShortString 255 байт нет
AnsiString 2 Гб имеется
String 255 байт/2 Гб нет/имеется
WideString 1 Гб имеется

Тип String по умолчанию воспринимается компилятором, как AnsiString.

В случае, если указать директиву {$H-}, тогда String воспринимается, как ShortString. По умолчанию, действует директива {$H+} – AnsiString.

Тип ShortString – это стандартные Паскалевые строки с ограничением в 255 знаков. Нулевой знак содержит длину строчка (в виде знака). Для того, чтобы взять длину строчка по нулевому байту нужно привести к процедуре – ord(). К каждому знаку маленькой строки возможно обратиться по индексу, к примеру:

Stroka[8] – возвращает 8-й знак.

Stroka[53] – возвращает 53 знак.

ord(Stroka[0]) – возвращает количество знаков в строчке.

Для определения длины строчка всех типов возможно воспользоваться стандартной функцией – Length().

К примеру:

length(‘Строчок’); — возвратит цифру 6.

Для объединения строчков употребляется символ +. К примеру:

new_str:=’Иванов ‘+’Иван’; // Переменная new_str примет значение Иванов Иван

str:=’str’+IntToStr(55); // Переменная str примет значение str55

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

function AnsiCompareStr(const S1, S2: string): Integer;

// Сравнивает две строки S1 и S2 в кодировке с учётом регистра.

// Возвращает значение меньше 0, в случае, если S1S2.

function AnsiCompareText(const S1, S2: string): Integer;

// Подобна прошлой функции, но сравнение происходит без учёта регистра.

function AnsiLowerCase(const S: string): string;

// Возвращает в кодировке ANSI строчок S, преобразованную у нижнему регистру.

function AnsiPos(const Substr, S: string): Integer;

// Возвращает позицию (индекс) первого вхождения Substr в S. В случае, если Substr нет

// в S, тогда возвращается 0.

function AnsiUpperCase(const S: string): string;

// Возвращает строчок S в кодировке ANSI, преобразованную к верхнему регистру.

function Concat(s1 [, s2,…,sn]: string): string;

// Возвращают строчок, сцеплённую из строчков s1..sn. Подобна операции + для строчков.

function Copy(S; Inex, Count: Integer): string;

// Параметр S-строчок либо динамический массив. Эта функция возвращает построку S,

// начинающуюся с знака S[Index] и содержащую Count знаков.

procedure Delete(var S: string; Index, Count: Integer);

// Удаляет из строчка S подстроку, начинающуюся с знака Index и содержащую Сount

// знаков.

procedure Insert(Source: String; var S: string; Index: integer);

// Вставляет строчок Source в S, начиная с знака с номером Index.

function Length(S): Integer;

// Возвращает число знаков в строчке S.

function Pos(Substr; S: String): Integer;

// Возвращает позицию первого вхождения строчка Substr в строчок S.

// В случае, если вхождений нет, тогда возвращается 0

procedure SetLength(var S; NewLength: Integer);

// Эта процедура устанавливает строчок либо динамический массив к длине NewLength

// Параметр S есть строчком либо динамическим массивом.

function StringOfChar(Ch: Char; Count: Integer): String;

// Создаёт строчок, складывающуюся из Count раз повторяющегося знака Сh

function Trim(const S: string): String;

// Удаляет из строчка S все управляющие и пробелы знаки.

function TrimLeft(const S: string): String;

// Удаляет из строчка S все управляющие и пробелы знаки слева в строчке.

function TrimRight(const S: string): String;

// Удаляет из строчка S все управляющие и пробелы знаки справа в строчке.

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

Перечислим главные функции для преобразования типов:

function IntToStr(Value: Integer): String; Overload;

function IntToStr(Value: Int64): String; Overload;

// Функция для преобразования целого числа в строчок.

// Как видите, имеется две функции IntToStr. Одна для Integer, вторая для Int64

function FloatToStr(Value: Extended): String;

// Преобразует вещественное значение Value в строчок.

procedure Str(X [:Width [:Decimal]]; var S);

// Преобразует строчок S в целое число.

// Не необходимые параметры Width — протяженность всего числа.

// Decimal — протяженность цифр по окончании запятой.

function StrToInt(const S: string): Integer;

// Преобразует строчок в целое число. Строчок обязана содержать лишь цифровые

// знаки.

function StrToFloat(const S: string): Extended;

// Преобразует строчок S в настоящее число. Строчок обязана содержать лишь

// знак разделителя и цифровые символы дробной части.

Procedure Val(S; var V; var Code: Integer);

// Преобразует строчок S в вещественный либо целочисленный тип, в зависимости от

// типа данных V. В параметре Code выводится успешность преобразования.

// В случае, если Code=0, тогда тогда преобразование прошло удачно, в противном случае переменная

// Code выводит позицию первого ошибочного знака.

function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision,

Digits: Integer): String;

// Разрешает преобразовавть вещественное значение в строковое с возможностью

// настройки вида отображения строчка

// Параметры данной функции:

// Value — число, которое мы будем преобразовывать на строчок.

// Format — форматирование строчка. Задаёт внешний вид строчка.

// Precision — точность представления числа.

// Digits — значение зависит от применяемого формата.

// Значения Format смогут быть:

// ffGeneral — неспециализированный цифровой формат. Число отображается с десятичной точкой.

// К примеру: 34342.993

// ffExponent — Отображение в научном формате.

// К примеру: 34342.993E-5

// ffFixed — число с фиксированной запятой. Число отображается с десятичной точкой.

// К примеру: 34342.993

// ffNumber — числовой формат. Показывается число с фиксированной десятичной точкой

// и вместе с тем, к этому показываются разделители групп разрядов. К примеру: 3,434,232.99

// ffCurrency — финансовый формат. Подобен формату ffNumber, но в конце ещё дописывается

// финансовая единица. К примеру: 3,332,234.32 грн.

Имеется ещё две серьёзные функции, каковые я не перечислил: Format(), FmtStr(Result,…). По действию они схожи, но первая возвращает итог из вызова функции, а вторая – как параметр.[15]

Разглядим семантику данных функций:

function Format(const Format: string; const Args: array of const): string; overload;

function Format(const Format: string; const Args: array of const; const FormatSettings: TFormatSettings): string; overload;

procedure FmtStr(var StrResult: string; const Format: string; const Args: array of const); overload;

procedure FmtStr(var StrResult: string; const Format: string; const Args: array of const; const FormatSettings: TFormatSettings); overload;

Пример применения функции Format:

Write(Format(‘Мне %d лет’),[29]); // Программа выведет на экран: Мне 29 лет

Как видите, вместо %d ф-ция Format подставило значение 29.

Существует пара спецификаторов формата, используемых с функцией Format. Любой из спецификаторов предваряется знаком процента и переменным числом внутренних доводов, представленных в следующем перечне [15]:

d: integer;

e: scientific;

f: fixed;

g: general;

n: number;

m: Money;

p: Pointer;

s: string;

x: Hex;

Приведём ещё пара примеров применения ф-ции Format:

Wirite(Format(‘Сумма счёта: %m’,[13.2]));

// Выводит: Сумма счёта: 13,2 грн

Write(Format(‘Появилась неточность:’+Chr(13)+’%s: %s.’, [E.ClassName, E.Message]));

// Выводится на экран сообщение о том, что появилась неточность и на следующих строчках

// приводится текст самой неточности

Тип-диапазон

Тип-диапазон – базисный тип. С его помощью, возможно задать диапазон значений, каковые может принимать переменная. В случае, если значение переменной будет выходить за диапазон, тогда на протяжении исполнения программы появится неточность. Для того, чтобы отключить диагностику диапазонов возможно применять директиву {$R-}, а для включения – {$R+}.

Пример задания типов-диапазонов:

Type

numbers=(first, second, third); // Три значения: first, second, third

num_age=20..120; // Значения смогут приниматься от 20 до 120

rus_sim=’а’..’я’; // Знаки от а до я

Типы даты и времени

Тип дата (TDateTime) рекомендован для хранения информации о дате и времени. Значения этого типа являются 8-ми байтовые вещественные числа с фиксированной запятой. Целая часть для того чтобы числа обозначает количество дней, прошедших с 30 декабря 1899 года, а дробная – часть дней, прошедших с 0 часов. Так, целая часть разрешает выяснить дату, а дробная – время.[7]

Нужно учитывать, что в разных государствах дата возможно представлена в разном виде.

Так, к примеру для Украины и России принято написание:

17.09.2006 16:19 (сутки, месяц, год, часы, 60 секунд)

А для США:

2006.09.17 4:19PM (год, месяц, сутки, часы, 60 секунд)

Приведём функции для работы с временем и датой [7].

function Date: TDateTime;

// Функция возвращает текущую дату

function DateTimeToStr(DateTime: TDateTime): String;

// Функция преобразует время и дату DateTime к строковому типу

procedure DateTimeToString(var Result: String; const Format: String;

DateTime: TDateTime);

// Преобразует время и дату в строчок и помещает итог в переменную Result

// с применением формата Format.

function DateToStr(Date: TDateTime): string;

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

// в глобальной переменной ShortDateFormat.

function DateOfWeek(Date: TDateTime): Integer;

// Возвращает сутки семь дней для указанной даты Date. Обратите внимание, что

// 1-воскресенье, 2-понедельник,…, 7 — суббота.

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

// Процедура разбивает длату на отдельные цифры: год (Year), месяц (Month), сутки (Day).

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

// Процедура разбивает время на отдельные цифры: час, 60 секунд, секунды, миллисекунды.

function EncodeDate(Year, Month, Day: Word): TDateTime;

// Формирует дату из отдельных цифр: год, месяц, сутки.

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

// Функция формирует время из отдельных цифр: часы, 60 секунд, секунды, миллисекунды.

function FormatDateTime(const Format: String; DateTime: TDateTime): String;

// Преобразует время и дату в строчок в соответствии с заданным форматом даты/времени.

function IsLeapYear(Year: Word): Boolean;

// Функция контролирует есть ли заданный год высокосным

function Now: TDateTime;

// Функция возвращает текущую время и дату

function StrToDate(const S: string): TDateTime;

// Функция преобразует строчок S в дату.

function StrToDateTime(const S: string): TDateTime;

// Функция преобразует строчок S в время и дату.

function StrToTime(const S: string): TDateTime;

// Функция преобразует строчок S на протяжении.

function TimeToStr(Time: TDateTime): String;

// Функция преобразует время Time в строчок

В некоторых функциях указывается строчок формата даты. Ниже обрисуем вероятные знаки-спецификаторы для строчка формата [7]:

c Отображает время и дату в виде мм/дд/гг чч.мм.сс. К примеру: 01/25/2006 17.31.42. Время не отображается, в случае, если дробная часть парамета DateTime равна нулю.
d Отображается сутки как число без ведущего нуля (1-31).
dd Отображается сутки как число с ведущим нулём (01-31).
ddd Отображается наименование в сокращенном виде. К примеру: Sun, Sat.
dddd Отображается наименование дня абсолютно. К примеру: Sunday, Saturday.
ddddd Отображает дату в формате дд.мм.гг К примеру: 17.09.06
dddddd Отображает дату в формате д месяц г. К примеру: 23 October 1999.
m Отображает месяц как число без ведущего нуля (0-12). В случае, если этот спецификатор идёт за спецификатором h, тогда отображается не месяц, а 60 секунд.
mm Отображает месяц как число с ведущи нулем (0-12). В случае, если этот спецификатор идёт за спецификатором h, тогда отображается не месяц, а 60 секунд.
mmm Отображается наименование месяца в сокращенном виде. К примеру: Jan, Dec.
mmmm Отображается полное наименование месяца. К примеру: January, December.
yy Отображается год как число, складывающееся из двух цифр (00-99).
yyyy Отображается год как число, складывающееся из четырёх цифр (0000-9999).
h Отображаются часы без ведущего нуля (0-23).
hh Отображается час с ведущим нулём (00-23).
n Отображаются 60 секунд без ведущего нуля (0-59).
nn Отображаются 60 секунд с ведущим нулём (00-59).
s Отображаются секунды без ведущего нуля (0-59).
ss Отображаются секунды с ведущим нулём (00-59).
z Отображаются миллисекунды без ведущего нуля (0-999).
zzz Отображаются миллисекунды с ведущим нулём (000-999).
t Отображается время в формате чч:мм. К примеру: 14:53.
tt Отображается время в формате чч:мм:сс. К примеру: 17:43:55
am/pm Отображается время в двенадцатеричном формате. am – до полудня, pm – по окончании полудня. К примеру: 7:33 am
a/p Время в шестнадцатеричном формате. a – до полудня, p – по окончании полудня.
ampm Время в шестнадцатеричном формате, но без установки метки до полудня либо по окончании полудня.
‘xx’/”xx” Знаки xx, хорошие от знаков-спецификаторов, помещенные в строчок Format, отображаются на экране дисплея без каких-либо преобразований. К примеру: “hh hour, nn minutes, ss seconds”, для 17:54:23 будет от ображено: 17 hour 54 minutes 23 seconds.

В случае, если строчок формата указывается безлюдной, тогда будет форматироваться так, как словно бы указан знак c.[7]

Массивы

Массивы бывают статические либо динамические. В статических массивах не изменяется количество элементов на протяжении исполнения программы, а в динамических массивах – изменяется количество элементов.

Статические массивы

Статический тип массивов представляет собой фиксированное количество однотипных элементов. Этот тип массива имеют такую форму:

Type

=array [] of ;

К примеру:

Type

month_names=array [1..12] of string; // массив для 12 элементов массива

matrix=array [1..100, 1..100] of real; // Матрица 100×100.

Элементами статического массива смогут быть каждые типы, не считая Int64 и LongWord.

Для доступа к элементу массива нужно писать: не2] – обращение ко второму элементу. В Паскале копировать сходу две переменные различных типов элементов запрещено. Нужно копировать любой элемент массива лично. В случае, если же переменные однообразного типа, тогда Вы имеете возможность скопировать элементы несложным присваиванием, к примеру: arr2:=arr1;

Пример: Сделаем программу в которой производится ввод элементов массива. Позже, делается копирование элементов во второй массив, целочисленного типа и данный массив выводится на экран.

Вот листинг программы:

program consple_laz; // Программа копирует элементы массива Arr1 в элемент массива Arr2. {$mode objfpc}{$H+} {$AppType CONSOLE} Uses SysUtils; var Arr1: array[0..6] of real; // Первый массив. (откуда копируем) Arr2: array[0..6] of integer; // Второй массив. (куда копируем) i: integer; begin // Запрашиваем ввод элементов массива for i:=0 to 6 do begin write(Format(‘Arr1[%d]=’,[i])); readln(Arr1[i]); end; // Копируем элементы массива for i:=0 to 6 do Arr2[i]:=Round(Arr1[i]); // Так как элементы 2-го массива целочисленные, // тогда их округляем // Пропускаем расстояние Writeln; Writeln(‘======================’); Writeln; // Выводим элементы массива на экран for i:=0 to 6 do writeln(Format(‘Arr2[%d]=%d’,[i,Arr2[i]])); // Обратите внимание // на применении ф-ции Format Readln; // Ожидаем ожидания нажатия клавиши end.

Итог исполнения программы:

Arr1[0]=33.424 Arr1[1]=33.344 Arr1[2]=2 Arr1[3]=44.43 Arr1[4]=2.423 Arr1[5]=4.3 Arr1[6]=523 ====================== Arr2[0]=33 Arr2[1]=33 Arr2[2]=2 Arr2[3направляться=44 Arr2[4]=2 Arr2[5]=4 Arr2[6]=523

Динамические массивы

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

Var

: array of ;

К примеру:

Var

power: array of integer;

chars_table: array of char;

arr_string: array of string;

Динамические массивы смогут быть так же многомерными. Для объявления многомерного массива нужно добавить array of, причёмс лишь раз, сколько имеется измерений.

К примеру:

Var

power: array of array of integer; // двух-мерный массив

chars_table: array of array of array of char; // трёхмерный массив

arr_string: array of array of string; // двухмерный массив

Установка длины массива производится посредством процедуры SetLength.

К примеру:

SetLength(power,10); // Устанавливаем 10 элементов в массиве power

SetLength(chars[1],30); // Устанавливаем 30 элементов в 1-м элементе массива

Высвободить память массива возможно посредством функции SetLength, указав нулевойр азмер. Так же возможно присвоить переменной мас сива nil либо привести к функции finalize(массив).

Динамические массивы смогут передаваться в качестве входного параметра.

К примеру:

procedure mess(mess_in[: array[1..3] of string); // Передаётся массив

// со статическим массивом

procedure set_power(power_input array of integer); // Передаётся массив с

// динамическим массивом из целых чисел

procedure set_power(var power_input array of integer);

// Передаётся и возвращается массив с динамическим числом целых чисел

Напомню, что посредством функции Low Вы имеете возможность выяснить предельное число элементов в массиве, а посредством High – предельное число элементов.

Пример. Сделаем программу, в которой задаётся указанное количество элементов, а позже они будут просортированы по способу безлюдного стакана (либо безлюдного пузырька).

Способ безлюдного стакана содержится в применении дополнительной переменной для временного хранения значения при обмене информации при сортировке.

Листинг программы:

program consple_laz; // В программе осуществляется ввод массива. // Затем, массив сортируется и итог выводится на экран. {$mode objfpc}{$H+} {$AppType CONSOLE} uses SysUtils; type ArrInt=array of real; // Динамический массив настоящих чисел // Процедура осуществляет ввод элементов procedure inp_elems(var arr_inp: ArrInt); var i: integer; begin for i:=low(arr_inp) to high(arr_inp) do begin Write(Format(‘Elem[%d]= ‘,[i])); ReadLn(arr_inp[i]); end; end; // Процедура для сортировки элементов способов безлюдного стакана procedure inp_elems_sort(var arr_inp: ArrInt); var i,i2: integer; elem_tmp: real; begin for i:=high(arr_inp) downto low(arr_inp) do for i2:=low(arr_inp) to i do begin if arr_inp[i]

Итог исполнения программы:

Count Elements= 5 Elem[0]= 333.2 Elem[1]= 23.24 Elem[2]= 242.2 Elem[3]= 2 Elem[4]= 4452 ===== Result ==== Elem[0]=2,00 Elem[1]=23,24 Elem[2]=242,20 Elem[3]=333,20 Elem[4]=4452,00

Множества

Множества определяются конструкцией:

=set of ;

В множества смогут входить элементы любых типов данных, не считая: word, integer, longint, int64.

Пример задания множества:

Type

rus_liter= set of ‘а’..’я’;

number_des= set of 0..10;

Элементы множеств задаются так:

rus_l := [‘а’,’г’,’д’];

num :=[0, 1, 2, 3];

Множества возможно объяединять (+), отнимать (-), сравнивать (=), контролировать на вхождение элемента в множество (in).

К примеру:

[‘а’,’г’,’д’]+[‘а’,’е’,’ж’] — окажется [‘а’,’г’,’д’,’е’,’ж’]

[‘а’,’г’,’д’]-[‘а’,’е’,’ж’] — окажется [‘г’,’д’]

Пересечение множества реализуется посредством символа *. Пересечением множества являются элементы, каковые входят в оба множества. К примеру:

[‘а’,’г’,’д’]*[‘а’,’е’,’ж’] — окажется [‘а’]

Над множествами возможно делать операции сравнения.

= — правильно, в случае, если все элементы в сравниваемых множествах совпадают.

— правильно, в случае, если хотябы один элемент в одном из множеств отличается.

= — действительно, в случае, если множества справа входит в множество слева от операции сравнения.

in – проверка на вхождение подмножества в множество. Правильно, в случае, если подмножество входит в множество.

К примеру:

[‘а’] in [‘а’,’г’,’д’] — вернёт true.

Записи

Запись – это тип данных, что включает в себя последовательность переменных разных типов данных.

Объявляется запись так:

Type

= record

: ;

: ;

: ;

end;

Пример:

Type

TRec_UserInfo = record

UserName: String;

Fam: String;

Im: String;

BirthDay: TDateTime;

end;

var r: TRec_UserInfo;

Обратиться к элементу записи возможно так:

r.UserName:=’Sergey’;

r.Fam:=’Рудюк’;

r.Im:=’Сергей’;

r.BirthDay:=StrToDate(‘17.04.1977’);

Оператор With

В примере, приведённом выше, мы обращались к каждому элементу записи лично, любой раз повторяя ввод всего пути к переменной. Это не сложно делать, в то время, когда переменная не громадная, конечно путь к конечной переменной не большой. Но, в настоящих программах такое написание сделало бы написание программы изнурительным занятием да ещё и тексты получались бы не читабельными. Для того, чтобы не повторять написание переменных любой раз в Pascal был введён оператор With:

with do ;

К примеру, пример обрисованный выше возможно написать:

with r do

Begin

UserName:=’Sergey’;

Fam:=’Рудюк’;

Im:=’Сергей’;

BirthDay:=StrToDate(‘17.04.1977’);

end;

Как видите, нам не приходилось любой раз вводить r. Помимо этого, в случае, если внезапно переменная изменится, её хватит поменять в одном месте, в том месте где with, а не поменять в каждой строке. В громадных и сложных программах таковой подход оправданный, исходя из этого специалисты используют его довольно часто.

Лекция 3: Функции и процедуры


Интересные записи:

Понравилась статья? Поделиться с друзьями: