Стандартные функции Pascal| Язык Паскаль

Стандартные функции языка Pascal

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

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

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

Арифметические и тригонометрические функции

Арифметические функции можно использовать только с величинами целого и вещественного типа.

Функция Назначение Тип результата
abs(x) абсолютное значение аргумента совпадает с типом аргумента
sqr(x) квадрат аргумента совпадает с типом аргумента
sqrt(x) квадратный корень аргумента вещественный
cos(x) косинус аргумента вещественный
sin(x) синус аргумента вещественный
arctan(x) арктангенс аргумента вещественный
exp(x) ex вещественный
ln(x) натуральный логарифм вещественный
int(x) целая часть числа вещественный
frac(x) дробная часть числа вещественный

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

abs(выражение) – абсолютное (то есть положительное) значение параметра.
abs(-2), abs(0), abs(2). Результат: 2, 0, 2
abs(-2.0), abs(0.0), abs(2.0). Результат: 2.0, 0.0, 2.0

sqr(выражение) – квадрат параметра.
sqr(-2), sqr(0), sqr(2). Результат: 4, 0, 4
sqr(-2.0), sqr(0.0), sqr(2.0). Результат: 4.0, 0.0, 4.0

Функция sqr возводит значение аргумента (записанного внутри скобок) в квадрат. В Паскале нет оператора возведения в произвольную степень. Возведение в степень здесь осуществляется с использованием логарифмов. Вместо математического выражения ax на Pascal можно написать exp(ln(a) * x).

Остальные арифметические функции принимают целый или вещественный параметр; результат в любом случае будет вещественным:

sqrt(выражение) – квадратный корень.
sqrt(16), sqrt(0.64), sqrt(0). Результат: 4.0, 0.8, 0.0
sqrt(-16). Результат: ошибка

ln(выражение) – натуральный логарифм.
ln(1), ln(2.7182):4:1, ln(7.5):4:1. Результат: 0.0, 1.0, 2.0
ln(0), ln(-1). Результат: ошибка

exp(выражение) – экспонента.
exp(0):4:1, exp(1):8:5, exp(2.014903):4:1. Результат: 1.0, 2.71828, 7.5
exp(-1):7:4. Результат: 0.3579
Примечание: e-1 = 1 / e

Ниже приведены тригонометрические функции, используемые в языке программирования Pascal. Их аргумент может быть целым или вещественным; результат в любом случае – вещественный.

1 радиан = 180 / пи

sin(выражение) – синус угла, измеренного в радианах
sin(-pi / 6):4:1. Результат: -0.5
sin(0):4:1. Результат: 0.0
sin(pi / 2):4:1. Результат: 1.0

cos(выражение) – косинус угла, измеренного в радианах
cos(-pi / 6):4:1. Результат: 0.8
cos(0):4:1. Результат: 1.0
cos(pi):4:1. Результат: -1.0

arctan(выражение) – арктангенс
arctan(1e35):8:5. Результат: 1.57080
arctan(0):4:1. Результат: 0.0
arctan(-1):8:5. Результат: 0.78540

Функции преобразования из вещественного в целый тип

Когда целое значение присваивается вещественной переменной, оно автоматически преобразуется в вещественный тип и никакие функции для этого не требуются. Такое преобразование типов называется неявным. Так, если переменную объявить как real, а затем присвоить ей целое число 5, то последнее автоматически преобразуется в 5.0.

Обратного неявного преобразования нет: будет ошибкой пытаться присваивать переменной целого типа вещественный результат.

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

trunc(вещественное_выражение) – преобразует вещественное в целый тип, отбрасывая дробную часть.
trunc(3.1), trunc(3.8). Результат: 3, 3
trunc(-3.1), trunc(-3.8). Результат: -3, -3

round(вещественное_выражение) – преобразует вещественное в целый тип, округляя до ближайшего целого.
round(3.1), round(3.8). Результат: 3, 4
round(-3.1), round(-3.8). Результат: -3, -4

Здесь возможны недоразумения. Пусть вещественная переменная x имеет значение 3.499999. Если это значение напечатать с использованием оператора write(x:8:5), то получится 3.50000, в то время как write(round(x)) даст 3, а не 4. Это затруднение можно обойти при помощи небольшой поправки, например write(round(x + 0.000001)) (в предположении, что значение переменной x заведомо положительное).

Применять функции trunc и round к параметрам целого типа нельзя. Например, будут ошибкой такие выражения, как trunc(3) или round(3).

Логические функции

Функция odd используется для проверки четности или нечетности целого выражения. Аргумент функции величина типа longint.
odd(целое_выражение) – возвращает true, если параметр – нечетный, в противном случае возвращает false.
odd(3), odd(2), odd(0). Результат: true, false, false
odd(-3), odd(-2). Результат: true, false
odd(3.0). Результат: ошибка

Следующие функции служат для определения конца строки или конца файла соответственно. Функция eoln используется только с текстовыми файлами, которые организованы как строки символов. Функцию eof не следует использовать при вводе данных с клавиатуры.
eoln(имя_файла) – возвращает true, если была прочитана последняя литера текущей строки.

while not eoln do begin
    read(i); {целый тип, пробелы пропускаются}
    writeln(i:3)
end;
while not eoln do begin
    read(a); {вещественный тип, пробелы пропускаются}
    write(a:5:1)
end;

eof(имя_файла) – возвращает true, если была прочитана последняя литера файла (попытка дальнейшего чтения ведет к ошибке).

while not eof(f) do begin
    while not eoln(f) do begin
        read(ch); {тип char, пробелы учитываются}
        write(ch)
    end;
    writeln
end;
while not eof(g) do begin
    read(ch); {признак конца строки читается как пробел}
    write(ch)
end;

Функции над дискретными типами

Функция ord

Буквы от ‘A’ до ‘Z’ следуют в возрастающем порядке, иными словами, каждая буква имеет порядковое значение, соответствующее ее месту в алфавите. Это порядковое значение может быть получено посредством функции ord.
ord(выражение) – возвращает порядковый номер литеры или значения другого дискретного типа.
ord(‘I’), ord(‘J’). Результат: 73, 74 (код ASCII)

Порядковый номер литеры зависит от используемого кода. Но, независимо от используемого кода, порядковые значения букв следуют по возрастанию:
ord(‘A’) < ord(‘B’) < ord(‘C’) … < ord(‘Z’)
хотя ord(‘Z’) – ord(‘A’) и не обязательно равно 25. То же самое и со строчными буквами:
ord(‘a’) < ord(‘b’) < ord(‘c’) … < ord(‘z’)

Определенной связи между прописными и соответствующими строчными буквами нет, но можно без опасений полагаться на то, что ord(‘a’) – ord(‘A’) имеет то же значение, что и ord(‘z’) – ord(‘Z’).

Независимо от используемого кода, порядковые значения цифр также расположены по возрастанию:
ord(‘0’) < ord(‘1’) < ord(‘2’) … < ord(‘9’)
и, более того, порядковые значения соседних цифр отличаются на 1; так, ord(‘9’) – ord(‘0’) = 9. Отсюда следует, что численное значение цифры d (типа char) может быть получено так
value := ord(d) – ord(‘0’).

Паскаль поддерживает типы char, integer и т.д. В дополнение к ним программист вправе определить и другие типы путем перечисления последовательности констант. Например, тип, заданный перечислением:
type days = (mon, tue, wed, thu, fri, sat, sun);

Константы типа, заданного перечислением, имеют порядковые значения, отсчитываемые от нуля. Например, ord(mon) возвращает 0, ord(sun) возвращает 6; mon < sun.

Тип boolean – перечисляемый тип, который автоматически задается как
type boolean = (false, true);
следовательно, ord(false) дает 0, ord(true) дает 1; false < true.

Функция chr

Обратной для ord является функция chr.
chr(выражение) – возвращает литеру, порядковое значение которой задается параметром; неправильное значение влечет ошибку.
chr(73), chr(74). Результат: I, J (кодировка ASCII)
chr(1000). Результат: ошибка

Функции succ и pred

Порядковые значения редко бывают нужны сами по себе. Часто достаточно знать следующий или предыдущий элемент в установленном порядке. Для этой цели служат функции succ и pred.
succ(выражение) – возвращает элемент, следующий за тем, который указан в качестве параметра.
succ(‘A’), succ(‘0’), succ(0). Результат: B, 1 (символ), 1 (число)
succ(false). Результат: true
pred(выражение) – возвращает элемент, предшествующий тому, который указан в качестве параметра.
pred(‘Z’), pred(‘9’), pred(9). Результат: Y, 8 (символ), 8 (число)
pred(true). Результат: false

Эти две функции можно использовать для определения следующих и предшествующих элементов для типа, заданного перечислением. Возьмем тип days, определенный ранее: pred(sun) возвращает sat, succ(mon) возвращает tue.

Однако было бы неверно писать writeln(pred(sun)), поскольку элементы перечисляемого типа нельзя читать или печатать, что, конечно, снижает выгоду от использования таких типов. Наилучшее приближение к writeln(pred(sun) – это оператор writeln(ord(pred(sun))), печатающий число 5 (порядковое значение элемента sat).

Функцию succ удобно использовать для управления циклом:

i := 0;
repeat
    i := succ(i);
    ……
until i = 10;