2.1 Целые типы

Эти типы обозначают множества целых чисел в различных диапазонах. Значения целого типа могут задаваться в десятичном, например, 5; -10, или шестнадцатеричном виде (шестнадцатеричном константы начинаются со знака $), например, $1A; $FFFF.

 

Тип
Размер в байтах
Диапазон допустимых значений
Shortint
1
-128…127 (-27…27-1)
Integer
2
-32768…32767 (-215…215-1)
Longint
4
-231…231-1
Byte
1
0…255 (0…28-1)
Word
2
0…65535 (0…216-1)

 

Над целыми числами допустимы следующие операции:

  1. 4 арифметических операции:
  2. + сложение* умножениеb:=a*b;

    - вычитание/ делениеc:=10/2-b;

  3. 2 дополнительных операции:
  4. div – деление нацелоb:=10 div 3 -> b=3; p:=32 div 5 -> p=6

    mod – остаток от деленияb:=10 mod 3 -> b=1; p:=32 mod 5 -> p=2

  5. операции сравнения:
    <, >, <=, >=, =, <>

 

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

 

Группа вещественных типов обозначает множества вещественных значений в различных диапазонах. Вещественные числа могут задаваться в форме с фиксированной точкой (например, 3.14159265; –10.2) или с плавающей точкой (например, 1.2Е–2 = 1.2× 10-2; 2.1234Е15 = 2.1234× 1015).

 

Тип
Размер в байтах
Число значащих цифр
Диапазон
Real
6
11-12
10-39…1038
Single
4
7-8
10-45…1038
Double
8
15-16
10-324…10308

Операции над переменными вещественного типа:

  1. 4 арифметических операции:+,*, -, /
  2. операции сравнения:

<, >, <=, >=, =, <>

Типы результатов операций

 

Операция Типы операндов Тип результата
+, *, - Целые.Хотя бы один вещественный Целый.Вещественный
/ Целые, вещественные Вещественный
div, mod Целые Целые
<, >, =, <>, <=, >= Целые, вещественные Логический (п.2.4.)

 

2.3 Cимвольный тип данных

Char 1 байт 256 значений

Значениями этого типа являются символы из набора ASCII – американского стандартного кода для обмена информацией.

Каждый символ имеет свой код от 0 до 255. Символы с кодами 0-127 – стандартные символы ASCII:

0-31 – управляющие символы;

32-47 – знаки препинания;

48-57 – цифры;

58-127 – латинские буквы.

Расширение кода ASCII: 128-255 – русские буквы, псевдографика (│, ┌, ┐, └, ┘…).

Символы, имеющие графическое представление, заключаются в кавычки: С=’*’. Для символов, не имеющих графического представления, используется знак #, после которого записывается код символа:

 

Пример:

#10 перевод строки Var c: char;

#13 переход к началу строкиx: integer;

#7 звуковой сигнал begin

#8 возврат на символ c:=’*’; x:=10;

Writeln(#7,a); writeln (#7,c,x,c);

Writeln(#10,x);end.

Для переменных символьного типа допустимы операции сравнения, при этом сравниваются коды символов:

‘ ’<’10’

‘0’<’9’

‘a’>’A’

‘A’<’Z’

‘a’>’Z’

‘a’<’z’

Коды прописных латинских букв: A - 65; B – 66; C – 67 и т.д.

Коды строчных латинских букв: a - 97; b – 98; c – 99 и т.д.

Для преобразования символа в число, равное коду символа, и наоборот, используются следующие функции:

chr(x) – преобразование ASCII-кода в символ; аргумент – целый 0-255;

ord(x) – преобразование символа в целое число.

Пример:

 Var n1,n2: integer; 
     c1,c2: char; 
begin 
  c1:=’D’; n1:=ord(c1); writeln('n1 =', n1); 
  n2:=66; c2:=chr(n2); writeln('c2 =', c2); 
end. 

 

на экране:

n1 = 68

c2 = B

 

2.4 Логический тип данных

Описание: varn: boolean;

Данные логического типа boolean могут принимать только два значения: true (истина) и false (ложь). Для значений логического типа допустимы операции сравнения, причем true>false.Также применяются 4 логических операции:

and логическое умножение

or логическое сложение

xor исключающее “или”

not отрицание

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

 

X
Not X
true
false
false
true

 

X
Y
X and Y
X or Y
X xor Y
true
true
true
true
false
true
false
false
true
true
false
true
false
true
true
false
false
false
false
false

 

Пример 1:

not (5>2) = false

(5>2) and (3<10) = true

(8<>9) or (4>5) = true

not (5=2) xor (3>2) = false

 

Пример 2:

 

 var test: boolean; 
     a, b: integer; 
 begin 
   writeln (‘Введите а и b’); 
   readln (a,b); 
   test:=a>b; 
   writeln (‘а > b - ’, test); 
 end.

 

Пусть, например,
введены числа: 5 16

тогда test:=5>16;

на экране: а > b - False

 

При сравнении данных типа BOOLEAN учитывается внутреннее соглашение Турбо Паскаля, в соответствии с которым FALSE есть нулевой байт, a TRUE - байт с единицей в младшем разряде. Заметим, что функция ORD преобразует к целому не только символы, но и логические величины, поэтому

ord(false) = 0,

ord(true) = 1.

 

2.5 Ограниченные типы

На основе стандартных типов можно строить собственные типы, ограничивая диапазон возможных значений: 1..10, -100..10, ‘a’..’z’ и т.п.

Пример:

 var a: 2..5;
     b: ‘a’..’z’;
 begin
    a:=3;
    b:=0; {ошибка: несоответствие типов  – переменной символьного типа присваивается целое число} 
    a:=0; {ошибка: выход за границы диапазона  2..5} 
 end.

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

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

var svet: (red, yellow,green);

oper: (plus, minus);

Тип boolean – частный случай перечислимого типа.

 

2.7 Описание типов

Новые типы данных в Паскаль определяются посредством описаний, начинающихся со слова TYPE. Описание состоит из имени типа и значения типа, между которыми ставится знак “=”.

Пример:

Type  dec=1..10;
      abc=’A’..’z’;
      int=integer;
vara: dec;b: abc;c: int; {в разделе описания переменных var можно использовать не только стандартные типы данных, но и новые типы, описанные программистом в разделе Type }

 

2.8 Преобразование типов

Как уже говорилось, тип переменной позволяет не только устанавливать длину ее внутреннего представления, но и контролировать те действия, которые выполняются над ней в программе. Контроль над использованием переменных еще на этапе компиляции программы - важное преимущество Турбо Паскаля перед другими языками программирования, в которых допускается автоматическое преобразование типов. В Турбо Паскале почти невозможны неявные (автоматические) преобразования типов. Исключение сделано только в отношении констант и переменных типа INTEGER (целые), которые разрешается использовать в выражениях типа REAL (вещественные). Если, например, переменные X и Y описаны следующим образом:

var х: integer;
    у: Real;

то оператор

у:=х + 2;

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

х:=2.0;

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

Таким образом, переменным можно присваивать значения только своего типа; единственное исключение: переменная вещественного типа, а значение – целого (в этом случае целое число будет преобразовано в вещественное с дробной частью, равной 0).

Разумеется, запрет на автоматическое преобразование типов еще не означает, что в Турбо Паскале нет средств преобразования данных. Они, конечно же, есть, но их нужно использовать явно. Для преобразования данных в языке существуют встроенные функции, которые получают в качестве параметра значение одного типа, а возвращают результат в виде значения другого типа. В частности, для преобразования REAL в INTEGER имеются даже две встроенные функции такого рода: ROUND округляет REAL до ближайшего целого, a TRUNC усекает REAL путем отбрасывания дробной части (см. п.1.5).

Например, ошибочным будет оператор

х := у/х; 

но правильным

х := round(у/х);

(объявления переменных см. выше).

Например, для преобразования данных типа CHAR (символ) в целое число предназначена функция ORD, обратное преобразование INTEGER в CHAR осуществляет функция CHR.

Наличие двух операций деления есть еще одно проявление основополагающего принципа Турбо Паскаля: программист должен явно подтверждать компилятору, что он готов к возможным последствиям преобразования типов. Если, например, в языке Фортран используется выражение 1/2 , то результат этого выражения будет зависеть от того, переменной какого типа он будет присвоен: если N есть переменная целого типа, а Х- вещественного, то в программе на Фортране присваивания

N = 1/2

X = 1/2

дадут значения 0 для N и 0.5 для X. В Турбо Паскале такой двусмысленности нет: выражение 1/2 всегда имеет значение 0.5 и поэтому оператор

 var N :integer;
 begin 
  N := 1/2;

просто недопустим. В то же время допустимые в Турбо Паскале операторы:

 var X : Real; 
     N: integer; 
begin 
    N := 1 div 2;
    X := 1 div 2;

И, наконец, об операциях отношения и логических операциях.

Над данными типа REAL, INTEGER, CHAR, STRING определены следующие операции отношения (сравнения):

= - равно;

<> - не равно;

< - меньше;

> - больше;

<= - меньше или равно,

>= - больше или равно.

В операциях сравнения должны участвовать однотипные операнды. Исключение сделано опять-таки в отношении REAL и INTEGER, которые могут сравниваться друг с другом. Результат применения операции отношения к любым операндам имеет тип BOOLEAN.

 

2.9 Порядок вычисления выражений

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

Приоритет операций:

  1. вычисления в круглых скобках ( )
  2. вычисления значений функций
  3. унарные операции not
  4. операции типа умножение *, /, div, mod, and
  5. операции типа сложение +, -, or, xor
  6. операции сравнения >, <, <=, >=, =, <>

Следует учесть, что в отличие от многих других языков программирования в Турбо Паскале логические операции имеют более высокий приоритет, чем операции отношения. В связи с этим, в сложных логических выражениях обычно необходимо расставлять скобки. Если, например, b и с имеют тип INTEGER , то выражение

а = b and с < d

вызовет сообщение о синтаксической ошибке, так как сначала выполнится операция b and с. Правильным будет выражение:

(а = b) and (с < d)

 

Задачи для самоконтроля

2.1. Вычислить значения выражений

а) 20 div 6; б) 20 mod 6;

в) 2 div 5; г) 2 mod 5;

д) 4 div 0; е) 2.0 mod 2.

2.2. а)Преобразовать арифметическое выражение в линейную форму записи, пригодную для ввода в компьютер. Использовать следующие обозначения операций: умножение *, деление /, возведение в степень ^, т.е. x3 = x^3.

 

б)Преобразовать линейную форму записи арифметического выражения в “многоэтажное” представление, обычно используемое в математике:

   B:=(x/(y+3*(x–y))^2–(y+9)^3/4)/(x^2*y)+9.5*y^2+y*(8+x/(2*y));
 

2.3. Какие операторы являются ошибочными?

 var x:integer;
     y:real;
Begin 
  x:=3.4; y:=5;
  x:=6; y:=2.5;
  x:=y;
  y:=x;
  x:= 6/3;
  x:= 6 div 3; y:= 6 div 2;

2.4. Вычислить значения выражений

а) not (6>=4) and (2<8)

б) ((5>=9) or (4>2)) and (6<12)