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 наиболее часто встречаются в программах. Рассмотрим некоторые из них.
Имя
функции |
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 |
Функция. Возвращает число байт, занимаемых аргументом |
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- координаты правого нижнего угла) |
Ввод данных в языке Турбо Паскаль выполняется стандартными процедурами (операторами) 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
Read (A[I,J]);
Readln
End;
Входной поток: 3 5 1
-4
7 9
2) For
I:=1 to 2 do
Read (A[I,J]);
Входной
поток:
3 5
1
-4
7 9
3)
For
I:=1 to 2 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
Процедура (оператор) 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- ширина поля.
Если ширина поля избыточна, то слева помещаются пробелы. Если же ширины поля не хватает для вывода, то заданное значение для ширины поля игнорируется и выводится реальное число.
Если
описать
переменную
вещественного
типа, то
возможны
следующие
варианты
вывода этой
переменной:
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
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.