5. Стандартные процедуры и функции.

5.1.Математические функции
5.2.Функции округления и преобразования типов

5.3.Функции  порядкового типа

5.4.Процедуры порядкового типа

5.5.Строковые функции

5.6.Строковые процедуры

5.7.Прочие процедуры и функции

5.8.Процедуры ввода данных

5.9.Процедуры вывода данных


 

В языке программирования  Турбо Паскаль  все используемые процедуры и функции  объединены в стандартные модули. К основным модулям можно отнести следующие:

· SYSTEM – включает стандартные процедуры и функции языка; при использовании этого модуля  его не требуется подключать с помощью USES, так как он подключен по умолчанию;

· DOS  содержит процедуры и функции для взаимодействия с MS DOS;

· CRT -  объединяет процедуры и функции для работы с экраном в текстовом режиме и клавиатурой;

· GRAPH - состоит из процедур и функций для работы с экраном в графическом  режиме;

· OVERLAY - обеспечивает работу с оверлеями (то есть частями программы), используется  для обработки программ большого объема  при недостатке оперативной памяти;

· PRINTER  – модуль для работы с принтером.

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

 

 

5.1. Математические функции.   

Имя функции

Назначение функции

Tип результата

Abs(X)

 

Абсолютное значение (модуль)  аргумента

Abs(-3.5)=3.5

Совпадает с типом Х

ArcTan(X)

Арктангенс аргумента в радианах

ArcTan(1)=7.8539816340E-01

Real

Cos(X)

Косинус аргумента в радианах

Сos(PI/3)=5.0000000000E-01

Real

Exp(X)

Экспонента аргумента (E  в степени X)

Exp(1)=2.7182818285E+00

Real

Ln(X)

Натуральный логарифм

Ln(10)=2.3025850930E+00

Real

PI

Значение числа   p            PI=3.1415926536E+00

(более точно  3.1415926535897932385)

Real

Random

Случайное число из диапазона от 0 до 1

Real

Random(X)

Случайное число из диапазона от 0 до Х

Word

Sin(X)

Синус аргумента в радианах

Sin(PI/3)=8.6602540378E-01

Real

Sqr(X)

Квадрат аргумента

Sqr(-12)=144

Совпадает с типом Х

Sqrt(X)

Квадратный корень  аргумента

Sqrt(841)=2.9000000000E+01

Real

  

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

 

tg(X)=Sin(X)/Cos(X)

lg(X)=Ln(X)/Ln(10)

Xn=Exp(n*Ln(X))

 

Перед использованием функций Random или Random(X) обычно предварительно выполняют процедуру Randomize (процедура без параметров), которая обеспечивает несовпадение последовательностей случайных чисел, генерируемых функцией  Random или Random(X)

 

наверх

 

5.2. Функции округления и преобразования типов.

 

 

Имя функции

Тип аргумента

Тип результата

Назначение функции

Chr(X)

Целый         Chr(66)=’B

Chr(Ord(‘M’)=’M’

Char

 

Преобразование ASCII-кода в символ

(0-255)

Frac(X)

Real

  Frac(-12.34)=-.34

Real

Дробная часть вещественного числа        Х-Int(Х)

Int(X)

Real

Int(-12.34)=-12

Real

Целая часть вещественного числа

High(X)

 

Порядковый,

массив, строка,

открытый массив

Совпадает с аргументом

 

Получение максимального значения номера элемента

Low(X)

 

Порядковый,

массив, строка,

открытый массив

Совпадает с аргументом

 

Получение минимального значения номера элемента

Ord(X)

Порядковый

Ord( ‘A’)=65

Ord(Chr(86))=86

LongInt

Возвращает число, соответствующее символу   Х  в ASCII- таблице

Round(X)

Real

Round(-1.2)=-1

Round(-1.5)=-2

Round(1.2)=1

Round(1.5)=2

LongInt

Округление до ближайшего целого

Trunc(X)

Real

Trunc(-1.2)=-1

Trunc(-1,5)=-1

Trunc(1.2)=1

Trunc(1.5)=1

LongInt

Отбрасывание дробной части

 

наверх

5.3. Функции порядкового типа.

 

Имя функции

Назначение функции

Odd(X)

 

Проверяет, является ли аргумент нечетным числом

Odd(0)=false

Odd(1)=true

Odd(2)=false

Odd(-1)=true

Pred(X)

Возвращает предшествующее значение аргумента

Pred(10)=9

Pred(-10)=-11

Succ(X)

Возвращает последующее значение аргумента

Succ(10)=11

Succ(-10)=-9

 

наверх

 

5.4. Процедуры порядкового типа.

 

Имя процедуры

Назначение процедуры

Dec(X [,dx])

Уменьшает значение переменной Х на величину dx (если параметр dx не задан, то на –1)

k:=5;  Dec(k)=4

          Dec(k,2)=3

          Dec(k,-2)=7

Inc(X [,dx])

Увеличивает значение переменной Х на величину dx (если параметр  dx не задан, то на +1)

k:=5;  Inc (k)=6

          Inc (k,2)=7

          Inc (k,-2)=3

 

наверх

 

5.5. Строковые   функции.

 

Имя функции

Назначение функции

Concat(<строка1>,<строка2>,..)

Сцепление строк

Сoncat(‘A’,’BC’,’_1’)=’ABC_1’

Copy(<строка>,<позиция>,<количество>)

Копирование  части строки с заданной позиции

Copy  (‘INFORMATION’,3,5)=’FORMA’

Length(<строка>)

Определение текущей длины строки

Length('строка’)=6

Pos(<подстрока>,<строка>)

Определение позиции первого вхождения подстроки в строку

Pos(‘e’,‘Определение’)= 4

Pos(‘к’,‘Определение’)= 0 

 

Для функции Concat общая длина полученной строки не должна превышать 256 байт. Знак «+» для строковых данных также означает операцию конкатенации.

Для функции Copy, если позиция в строке превышает длину этой строки, то результатом будет пустая строка. Если <позиция>+ <количество>  больше длины строки, то копируются лишь последние символы. Если же <позиция> не принадлежит  интервалу [1,255], то возникает ошибка при выполнении программы.

 

наверх

5.6. Строковые процедуры.

 

Имя  процедуры

Назначение процедуры

Delete(<строка>,<позиция>,<количество>)

Удаление части строки с заданной позиции

1)  S:=’abcdefgh’;

     Delete(S,2,4);

      Результат: S=’afgh’

2)  S:=’abcdefgh’;

     Delete(S,2,10);

      Результат: S=’a’

Insert(<подстрока>,<строка>,<позиция>)

Вставка подстроки  в строку с заданной позиции

S:=’abcdefgh’;

Insert(‘XXL’,S,3);

Результат: S=’abXXLcdefgh

Str(<число>,<строка>)

Преобразование  числового значения в строку символов

1)  Str(567,A);

      Результат: A=’567’

2) )B:=567;  {B:integer}

      Str(B:5,A);

      Результат: A=’_ _567’

3) B:=5.67E+3;  {B:real}

      Str(B:8:0,A);

      Результат: A=’_ _ _ _5670’

 

Val (<строка>,<число>,<код>)

Преобразование строки в числовое значение (если нет ошибки, то < код>=0)

1)A:=’135’;

    Val(A,R,Code);

     Результат: R=135; Code=0

2)A:=’_135’;

    Val(A,R,Code);

     Результат: R=не определено; Code=1

3)A:=’2.5Е+4’;

    Val(A,R,Code);

     Результат: R=25000; Code=0 

 

Для процедуры Delete, если <позиция> превышaет длину строки, то строка не меняется. Если <позиция>+ <количество>  больше длины строки, то удаляется конец строки с указанной позиции. Если же <позиция> не принадлежит  интервалу [1,255], то возникает ошибка при выполнении программы.

 

Для процедуры Insert, если в результате вставки получается строка, длина которой превышает максимальную длину исходной строки, то последние символы вставляемой строки не добавляются. Если <позиция> превышает фактическую длину исходной строки, определяемой функцией Length, то результатом является сцепленная строка.

 

Для процедуры Val в строке не разрешаются предшествующие преобразуемому числу и последующие за числом пробелы.

 

наверх

5.7. Прочие процедуры и функции.

 

Имя  функции

Модуль

Назначение процедуры или функции

Keypressed

Crt

Функция. Возвращает значение True, если на клавиатуре была нажата клавиша и False в противном случае

ReadKey

Crt

Функция. Приостанавливает выполнение программы до нажатия на любую клавишу

SizeOf(X)

System

Функция. Возвращает число байт, занимаемых аргументом

WhereX

Crt

Функция. Возвращает горизонтальную координату текущей позиции курсора относительно текущего окна

WhereY

Crt

Функция. Возвращает вертикальную  координату текущей позиции курсора относительно текущего окна

ClrScr

Crt

Процедура. Очищает экран

Delay (Х)

Crt

Процедура. Приостанавливает работу программы на Х миллисекунд

Exit

System

Процедура. Преждевременное завершение процедуры, функции или основной программы

FillChar(X,COUNT,Value)

System

Процедура. Заполняет заданное количество COUNT последовательных байт переменной Х значением Value

GetDate(<год>,<месяц>,

<число>,<день недели>)

Dos

Процедура. Возвращает текущую дату

GotoXY(X,Y)

Crt

Процедура. Перемещает курсор в нужное место экрана

Window(X1,Y1,X2,Y2)

Crt

Процедура. Определяет текстовое окно на экране(X1,Y1- координаты верхнего левого угла; X2,Y2- координаты правого нижнего угла)

 

наверх

 

5.8. Процедуры ввода данных.

 

 Ввод данных в языке Турбо Паскаль выполняется стандартными процедурами (операторами) READ или READLN, вывод - процедурами WRITE или WRITELN. Процедуры READ и READLN используют для ввода символов (тип данных CHAR),  строк (тип данных STRING) или числовых данных (тип данных INTEGER, BYTE, REAL  и др.).

Вызов процедуры READ имеет следующий вид:

 

READ ([<имя файла>,]<список переменных>);

 

Для процедуры READLN соответственно:

 

READLN ([<имя файла>,]<список переменных>);

 

При отсутствии <имени файла>  считывание данных производится из стандартного файла INPUT; при этом стандартными устройствами считаются клавиатура или дисплей, связанные с файлом INPUT.

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

Необходимо помнить:

    - Типы переменных и констант должны совпадать (исключение составляет  только тип данных REAL, для которых можно при вводе указывать переменные и константы типа INTEGER).

    - Вводимые числовые данные должны быть разделены одним или несколькими пробелами; нельзя отделять пробелами знак от числа и цифру от цифры одного и того же числа.

    - Если вводится строка (тип данных STRING), то READ считывает столько символов, сколько допустимо по максимальной длине, заданной в описании VAR.

    - При вводе последовательности символов (тип данных CHAR или STRING) пробел воспринимается как символ.

 

Например.

А) Ввод числовых данных:

Var B,A,D: Real;

         K: Integer;                                Входной поток данных:

          . . .                                                   2.5  –4.95  20  1.25Е2

        Read(A,D);                                   После ввода: 

        Read(K,B);                                    A=2.5; D=-4.95; K=20; B=125

Б) Ввод числовых и строковых данных.

Var A: Real; 

         B: Integer;

          C1,C2,C3: Char;                          Входной поток данных:

          D: String[5];                                 2.5 10 KLMКОШКА

           . . .                                                  После ввода:

         Read(A,B,C1,C2,C3,D);                 A=2.5; B=10; C1=’ ’;

                                                                    C2=’K’;C3=’L’;

                                                                     D=’MКОШК’

Из примера видно, что ввод смешанных данных (и числовых и строковых) из одного входного потока осуществляется не совсем верно. Если же во входном потоке данных после 0 не поставить пробел, то это приводит к ошибке ввода данных (ERROR 106). Поэтому рекомендуется вводить числовые значения отдельно от символов или строк.

При выполнении оператора READ конец строки ввода (нажатие клавиши <Еnter>) приравнивается  к вводу пробела, разделяющего элементы данных во входном потоке; в этом случае нет перехода к следующей строке данных во входном потоке, а  входные данные последовательно считываются в соответствующие переменные.

Например, для одних и тех же операторов ввода входной поток может быть разным:

      Read(A,B,C);             Входной поток: 2 9 5 3 7  или

      Read(D,Е);                 Входной поток 1 строка: 2 9 5

                                                                      2 строка: 3 7

      Отличие оператора READ от READLN состоит в том, что после считывания последней переменной при READLN остаток строки ввода игнорируется. Следующий за ним оператор READ или READLN считывает данные с начала новой строки, т.е. оператор  READLN реагирует на конец строки (нажатие клавиши <Еnter>) и в случае его обнаружения происходит переход к следующей строке данных во входном потоке данных. Возможно использование оператора READLN без параметров; в этом случае обеспечивается безусловный переход к следующей строке данных во входном потоке.

      Например, рассмотрим ввод элементов двумерного массива разными способами:

          1)  For I:=1 to 2 DO      

                Begin                                                         

                     For J:=1 to 3 do

                                Read (A[I,J]);

                    Readln

                End;

                                                               Входной поток:   3  5  1

                                                                                          -4  7  9

 

           2)  For I:=1 to 2 do                      

                        For J:=1 to3 do    

                                Read (A[I,J]);

                                                               Входной поток:  3  5  1

                                                                                          -4  7  9

           3)     For I:=1 to 2 do  

                         For J:=1 to 3 do                                                    

                                Readln(A[I,J]);                                                  

                                                               Входной поток:  3

                                                                                           5

                                                                                           1

                                                                                          -4

                                                                                           7

                                                                                           9

     

В следующем примере наглядно показано, что при использовании READLN данные, находящиеся в конце строки, игнорируются.

      Var A,B,C,D:integer;                Входной поток:

                                                                       1 строка:  10  20  30  40  50

                                                                   2 строка:  60

            Readln(A,B,C);

            Readln(D);                               Результат:               

                                                                       A=10;B=20;C=30;D=60

 

наверх

 

5.9. Процедуры вывода данных.

 

Процедура (оператор) WRITE предназначена для вывода выражений следующих типов: Integer, Byte, Real, Char, String, Boolean и др.

 

               WRITE ([< имя файла или устройства >,]<список выражений>);

 

Если <имя файла>  отсутствует, то вывод осуществляется в стандартный файл OUTPUT (на экран дисплея). Если указано < имя файла >, этот файл должен быть описан или подготовлен заранее.

Для вывода на печать используется логическое устройство LST; при этом должен быть подключен стандартный модуль PRINTER (т.е. в начале программы должно быть предложение Uses Printer;).

Оператор WRITE выводит значения выражений из списка на текущую строку до ее заполнения. Если за ним следует оператор вывода, а текущая строка еще не заполнена, то вывод осуществляется на ту же строку.

Например:

       X:=5; Y:=10;

       Write (‘X=’, X);

       Write (‘ Y=’,Y);                                  На печать:X=5 Y=10

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

Оператор вывода с форматом:

 

          WRITE ([< имя файла или устройства >,]R1:N1,R2:N2,…, Rm:Nm);

 

Здесь - R1,R2,…,R m- выводимые переменные;

                       N1,N2,…,N m- ширина поля.

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

5.9.1 Особенности вывода вещественных значений.

Если описать переменную вещественного типа, то возможны следующие варианты вывода этой переменной:

1)  Write(R);                Вывод осуществляется в нормализованном виде (экспоненциальная форма):

 

     | -  d.dddddddddd E   +|-   dd

 

2)  Write(R:N) ;          Вывод в нормализованном виде с выравниванием по правой границе поля длиной N. Минимальное значение N равно 8. При задании меньшего размера ширины поля компилятор добавляет недостающие разряды до 8.

 

3) Write(R:N:M) ;      Вывод в форме с фиксированной точкой и с М десятичными знаками после точки(0<=M<=24).

Например,    

VAR B,d:real;

          C:integer;

          A:string[10];

                          . . .

              A:=’книга’;

              B:=1253E-5;

              C:=12;

                   d:=1253E2;

 Write(LST,’B=’,B:10:3,’ C=’,C:8,’ A=’,A:7,’ b1=’,b:8,’ d=’,d:6);

 

          На печать будет выведено (здесь _ означает символ пробел, который на экране не виден):

В=_ _ _ _ _ 0.013_С=_ _ _ _ _ _12_А=_ _книга_B1=_1.3E-02_D=_1.3E+05

 

          Процедура WRITELN имеет аналогичный вид:

 

WRITELN ([<имя файла или устройства>,]<список выражений>);

 

При вызове этой процедуры завершается формирование текущей строки файла. Следующий оператор WRITE или WRITELN формирует новую строку. Можно использовать WRITELN без параметров.

Например, при совместном использовании операторов WRITE и WRITELN можно регулировать вывод по строкам:

Var A,B,C,D,E:integer;

Begin

        A:=1;  B:=2;  C:=3;  D:=4;  E:=5;

        Writeln (‘ A=’,A,’ B=’,B);

        Write(‘ C=’,C);

        Writeln(‘ D=’,D,’ E=’,E);

End.

На экран дисплея результат будет выведен в двух строках:

 _A=1_B=2

 _C=3_D=4_E=5

 

Вывод матрицы A (M,N) целых чисел на экран в виде прямоугольной таблицы можно реализовать следующими операторами:

             . . .

For I:=1 to M do

Begin

      For J:=1 to N do

           Write(A[I,J]:5);

       Writeln

End;

 

А вывод матрицы A(M,N) вещественных чисел на принтер в виде таблицы с одним разрядом после запятой представлен следующей программой.

 

Uses Printer;

Var A:array[1..10,1..10]of real;

       M,N:integer;

Begin

       Readln(M,N);

       For I:=1 to M do

          For J:=1 to N do                                     

                Read(A[I,J]);

       For I:=1 to M do

          Begin

                For J:=1 to N do

                   Write(Lst,A[I,J]:6:1);

              Writeln(Lst)

          End;

       Readkey

End.

 

наверх

 

к следующей главе

Hosted by uCoz