Назад Домой! Дальше Лекция 1_3. Простые типы: порядковые, тип-диапазон (интервальный), перечисляемый, вещественные. Арифметические функции.


Порядковые типы

Это данные, для которых можно чётко ответить на вопросы: следующее значение? предыдущее значение? Например - целые числа: за числом 8 следует 9, а перед ним - 7. Символьные данные - упорядочены по своим кодовым значениям. Для порядковых типов в Паскале есть функции: ORD(X) - порядковый номер X, PRED(X) - предыдущее значение для X, SUCC(X) - значение, следующее за X. Где X - выражение. Например, программа

var X: Char;
begin
 X:= 'F'; writeln('SUCC(F) = ', SUCC(X));
 writeln('=> ',Char(Byte(X)+3));
 writeln('==>',SUCC(Char(Byte(X)+3)));
 readln;
end. 
------
Выводит результат:
------------------
Turbo Pascal  Version 7.0
SUCC(F) = G
=> I
==>J
----

В программе показано, что параметром SUCC(<выражение порядкового типа>) является ВЫРАЖЕНИЕ. Применено преобразование типов: Byte(Char) и наоборот Char(Byte). Понятие порядковый тип пригодится в дальнейшем.


Тип-диапазон (интервальный тип)

Для данных порядкового типа можно объявить подтип, называемый тип-диапазон. Синтаксис описания таких типов:
Type <имя типа> = <мин.значение>..<макс.значение>; Например:
type Rus_Zaglavn = 'А'..'Я';
Тип Rus_Zaglavn (русские заглавные) - это подтип символьного типа Char. Тип-диапазон часто применяется при описании массивов (о массивах -далее). Если при работе программы значения какой-то переменной НЕ ДОЛЖНЫ выходить за известный диапазон, то тип-диапазон можно применить для контроля правильности работы программы. Например:

-------
label nacalo;
var Lat_Zaglavn: 'A'..'Z'; SS: string[100];
begin
 SS := '';
 nacalo:
 write('Введите лат. заглавную букву (Z - выход)'); 
 readln(Lat_Zaglavn);
 SS := SS + Lat_Zaglavn;
 if Lat_Zaglavn < 'Z' then goto nacalo;
end.
-------
Результат нормальной работы программы:
Введите лат. заглавную букву (Z - выход)P
P
Введите лат. заглавную букву (Z - выход)R
PR
Введите лат. заглавную букву (Z - выход)I
PRI
Введите лат. заглавную букву (Z - выход)V
PRIV
Введите лат. заглавную букву (Z - выход)E
PRIVE
Введите лат. заглавную букву (Z - выход)T
PRIVET
Введите лат. заглавную букву (Z - выход)I
PRIVETI
Введите лат. заглавную букву (Z - выход)K
PRIVETIK
Введите лат. заглавную букву (Z - выход)Z
PRIVETIKZ
--------------
Результат ввода недопустимого символа (9)
Error 201: Range check error.
------
Примечание: чтобы такой контроль работал, 
нужно включить опцию компилятора: [X] Range checking.
Для этого: Меню\Options\Compiler\ установить 
 [X] Range checking.
---------------

Перечисляемые типы

Применение этих типов облегчаем программирование и понимание текста программы. Например, числа 1..12 можно использовать для обозначения месяцев, но можно описать тип:
type mesac = (jan, feb, mar, apr, may, jun, jul, avg, sen, oct, nov, dec); И переменную этого типа:
var MM: mesac; Тогда можно использовать значения jan..dec в качестве значений переменной MM. Такие значения не вводятся и не выводятся, поэтому приходится применять преобразование типов при вводе-выводе. При этом jan преобразуется в 0. Программа:

-------------
type mesac = (jan, feb, mar, apr, may, jun, jul,
     avg, sen, oct, nov, dec);
var MM: mesac;
begin
  write('Введите лучший месяц в году 1..12 --> ');
  readln(byte(MM));
  MM := PRED(MM); {потому что номер января = 0}
write('Лучший месяц для Вас - ');
if MM = jan then writeln('январь') else
if MM = feb then writeln('февраль') else
if MM = mar then writeln('март') else
if MM = apr then writeln('апрель') else
if MM = may then writeln('май') else
if MM = jun then writeln('июнь') else
if MM = jul then writeln('июль') else
if MM = avg then writeln('август') else
if MM = sen then writeln('сентябрь') else
if MM = oct then writeln('октябрь') else
if MM = nov then writeln('ноябрь') else
if MM = dec then writeln('декабрь');
readln;
end.
----------------
Результат работы:
----------------
Введите лучший месяц в году 1..12 --> 3
Лучший месяц для Вас - март
--------------

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

---------------
type mesac = (jan, feb, mar, apr, may, jun, jul,
     avg, sen, oct, nov, dec);
var MM: mesac;
const mes: array [mesac] of string = 
 ('январь','февраль','март','апрель','май',
  'июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
begin
  write('Введите лучший месяц в году 1..12 --> ');
  readln(byte(MM));
  MM := PRED(MM);
  write('Лучший месяц для Вас - ');
  writeln(mes[MM]); readln;
end.
------
Результат тот же.
------

Вещественные типы

Это вещественные числа. В Паскале и Делфи несколько вещественных типов, отличающихся точностью и диапазоном значений.

 Turbo Pascal обеспечивает пять предопределенным вещественных типов. Каждый
 тип имеет свой диапазон и точность:

    Тип       Диапазон           Точность  Байт
    Real      2.9e-39..1.7e38     11-12    6
    Single    1.5e-45..3.4e38     7-8      4
    Double    5.0e-324..1.7e308   15-16    8
    Extended  3.4e-4932..1.1e4932 19-20    10
    Comp     -9.2e18..9.2e18      19-20    8

 Обратите внимание: тип Comp - 64-разрядное целое число. В нем можно хранить
 только интегральные значения в диапазоне (-2 63 + 1)..(2 63 - 1).

 Turbo Pascal поддерживает две модели генерации объектного кода с числами с
 плавающей запятой :
  - Программная поддержка чисел с плавающей запятой {$N-}
  - Аппаратная (80x87) поддержка чисел с плавающей запятой {$N+}

 Вы можете использовать директиву компилятора $N для переключения между двумя
 моделями.

 В режиме $N+, директива компилятора $E управляет, включать ли библиотеки
 эмуляций 80x87 в готовую программу. 
 Для современных компьютеров нужно установить: {$N-} {$E-} 
 (Меню\Options\Compiler\
[X] 8087/80287
[ ] Emulation
)

Список арифметических функций (Турбо Паскаль)

 
----------------------------------------------------------
     Функция                      Описание
----------------------------------------------------------
   Abs         Возвращает абсолютное значение аргумента

   ArcTan      Возвращает арктангенс аргумента

   Cos         Возвращает косинус аргумента

   Exp         Возвращает экспоненту аргумента

   Frac        Возвращает дробную часть аргумента

   Int         Возвращает целую часть аргумента

   Ln          Возвращает натуральный логарифм аргумента

   Pi          Возвращает значение числа Pi
               {3.1415926535897932385}

   Sin         Возвращает синус аргумента

   Sqr         Возвращает аргумент в квадрате

   Sqrt        Возвращает квадратный корень аргумента

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

Z = ab

Логарифмируем обе части. Получим:

ln(Z)=b*ln(a); следовательно:

Z = eb*ln(a) = exp(b*ln(a)) ... (1)

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

Назад Дальше

Rambler's Top100
Hosted by uCoz