Презентация "Типы данных"

Подписи к слайдам:

Типы данных

Структура рассмотренной программы имеет следующий вид:

Program MyFirstProgram; 

{Раздел описаний}

begin

{Раздел операторов}

end.

Слова Program, begin и end выделяют две части программы - раздел описаний и раздел операторов. Такая структура обязательна для любой программы, что является следствием жесткого требования языка: любой нестандартный идентификатор, используемый в исполняемых операторах, должен быть предварительно описан в разделе описаний.

Стандартные идентификаторы связаны с предварительно объявленными объектами и входят в стандартную библиотеку Турбо Паскаля. Таким, например, является идентификатор WriteLn. Стандартные идентификаторы, если они используются в программе, описывать не нужно

Описать идентификатор - это значит указать тип связанного с ним объекта программы (константы или переменной).

Понятие типа - одно из фундаментальных понятий Турбо Паскаля.

Тип определяет:

1.Способ внутреннего для компьютера представления объекта

2.Действия, которые разрешается над ним выполнять.

В рассматриваемых далее программах понадобятся следующие типы данных:

INTEGER - целочисленные данные, во внутреннем представлении занимают 2 байта; диапазон возможных значений - от -32768 до +32767; данные представляются точно;

REAL - вещественные данные, занимают 6 байт; диапазон возможных значений модуля - от 2.9Е-39 до 1.7Е+38; точность представления данных - 11...12 значащих цифр;

CHAR - символ, занимает 1 байт;

STRING - строка символов, занимает МАХ+1 байт, где МАХ - максимальное число символов в строке;

BOOLEAN - логический тип, занимает 1 байт и имеет два значения: FALSE (ложь) и TRUE (истина).

Тип константы определяется способом записи ее значения. Например: const

cl = 17;

с2 = 3 .14 ; 

сЗ = 'А';

с4 = '3.14 ' ; 

с5 = False;

При анализе этого фрагмента программы компилятор отнесет первую константу к типу INTEGER, вторую - к типу REAL, третью - к CHAR, четвертую - к STRING и последнюю - к BOOLEAN.

Признаком, позволяющим отнести константу к REAL или к INTEGER, является наличие или отсутствие десятичной точки в ее значении. Разумеется, константы С2 и С4 относятся к разным типам: С2 - к REAL (в константе есть десятичная точка), а С4 - к STRING (константа обрамлена апострофами). Константу СЗ компилятор будет считать относящейся к типу CHAR: одиночный символ в апострофах относится к CHAR, в то время как несколько символов - к STRING.

В отличие от константы переменная именует объект программы, который может изменять свое значение в ходе счета. При описании переменных за идентификатором ставятся двоеточие и имя типа. Несколько однотипных переменных можно объединять в список, разделяя их запятыми. В начале раздела описания переменных должно стоять зарезервированное слово VAR (VARiables - переменные).

Например:

var

sigma :Real; а,b,с,d :Char;

textl :String[15];

text2 :String;

flag :Boolean;.

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

В частности, длина внутреннего представления переменных типа STRING (строка символов) зависит от максимального числа символов, которые могут составлять строку. В приведенном выше примере переменная text l описана с указанием ее максимальной длины (15 символов), а в описании переменной text2 максимальная длина не указана и компилятор установит для нее предельно допустимую в Турбо Паскале длину - 255 символов.

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

Program Input_0utput; {Программа вводит два целых числа и выводит частное от деления 1-го на 2-е}

var

n1,n2 : Integer; {n1 и n2 - вводимые целые}

х : Real;{x - результат}

BEGIN

Write( 'n1 = ');{Сообщаем о вводе n1}

ReadLn (n1) ;{Вводим n1}

Write ( 'n2 = ');{Сообщаем о вводе п2}

ReadLn (n2);{Вводим п2}

x := n1/n2;{Находим результат}

WriteLn('n1/n2 =',х);{Выводим его}

END.

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

Комментарий разрешается вставлять в любое место программы, где по смыслу может стоять пробел. В качестве ограничителей комментария допускается использование фигурных скобок { и }, а также пары символов: (* - слева от комментария и *) - справа от него:

{ Это - комментарий }

(* Это - тоже комментарий *)

Пары операторов Write (..); ReadLn(..); работают следующим образом. Вначале оператор Write выводит строку на экран и оставляет курсор в конце только что выведенной строки текста.

Заметим, что оператор WriteLn(Text); в примере 1 после вывода текста осуществлял перевод строки и устанавливал курсор в начало следующей строки экрана.

Именно в этом простом действии (переводе строки) заключается единственное отличие в работе процедуры WriteLn от процедуры Write.

Затем по оператору ReadLn вызывается встроенная процедура ввода данных и программа останавливается в ожидании ввода. В этот момент необходимо набрать на клавиатуре нужное число и нажать клавишу Enter. Сразу после этого программа продолжит работу: проанализирует введенное число и перейдет к вводу следующего числа или вычислению результата. Таким образом, сигналом окончания подготовки очередного числа является нажатие на клавишу Enter, до этого момента можно стирать любой ошибочно введенный символ клавишей Backspace.

Для вычисления отношения введенных чисел используется один из основных операторов Турбо Паскаля - оператор присваивания.

В его левой части указывается имя переменной, правая часть представляет собой выражение того же типа, что и переменная. Пара символов «: =», связывающая левую и правую части оператора присваивания, означает «присвоить значение». Запомним: в операторах присваивания Турбо Паскаля всегда используются символы «: =», в то время как при описании констант - одиночный символ «=». С точки зрения синтаксиса языка, два символа «: =» рассматриваются как один специальный символ и обязательно пишутся слитно.

Выражение X = X + 1 примет вид X := X + 1;

ПРЕОБРАЗОВАНИЯ ТИПОВ И ДЕЙСТВИЯ НАД НИМИ

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

var

х: Integer; 

у: Real;

то оператор

у := х + 2;

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

х := 2.0;

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

Разумеется, запрет на автоматическое преобразование типов еще не означает, что в Турбо Паскале нет средств преобразования данных.

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

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

х := у/х; 

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

х := round(у/х);

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

С помощью следующей несложной программы Вы сможете узнать внутренний код произвольного символа.

Program Code_pf_Char;

{Программа читает символ с клавиатуры и выводит на экран этот символ несоответствующий ему внутренний код}

var

ch: Char; {В эту переменную читается символ}

begin

Write('Введите любой символ: '); 

ReadLn(ch); {Читаем один символ}

WriteLn(ch, ' = ',ord(ch)); {Преобразуем его к целому и выводим на экран}

END.

Операции, которые разрешены над различными типами.

Конечно же, в Турбо Паскале есть все четыре арифметические операции над переменными REAL И INTEGER:

+ - сложение;

 - - вычитание; 

* - умножение; 

/ - деление вещественное; 

div - деление целочисленное.

В Турбо Паскале оператор

var

X : Real;

begin

X := 1 div 2;

использования операции целочисленного деления DIV свидетельствует о том, что программист сознательно отбрасывает дробную часть результата.

Для данных типа INTEGER в Турбо Паскале есть еще одна операция MOD - получение остатка от целочисленного деления.

Например:

5 mod 2 = 1 

31 mod 16 = 15 

18 mod 3 = 0

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

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

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

DEC (X [, N] ) - уменьшает содержимое переменной X на значение выражения N (если N не задано, то на 1); тип переменной X и выражения N - INTEGER (точнее, любой целый, см. гл. 4);

INC (X [, N] ) - увеличивает значение X на N (если N не задано, то на 1).

Над символами и строками символов определена единственная операция - сцепление двух строк. Операция обозначается символом «+». Например, программа

var

st: String; 

begin

st := 'Турбо'+'-'+'Паскаль'; 

WriteLn(st);

end.

напечатает строку

Турбо-Паскаль

Все остальные действия над строками и символами реализуются с помощью встроенных процедур и функций

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

= - равно;

<> - не равно;

< - меньше;

> - больше;

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

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

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

Сравнение двух строк осуществляется следующим образом:

Символы строк сравниваются попарно друг с другом так, что первый символ первой строки сравнивается с первым символом второй строки, второй символ первой строки - со вторым символом второй и т.д. Символы сравниваются путем сравнения их кодов во внутреннем представлении. Если одна строка короче другой, недостающие символы заменяются нулем. Отношение первой несовпадающей друг с другом пары символов и принимается за отношение двух строк.

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

Функция ORD преобразует к целому не только символы, но и логические величины, поэтому

ord(false) = 0,

ord(true) = 1.

В Турбо Паскале определены следующие логические операции:

not - логическое НЕ;    or - логическое ИЛИ;

and - логическое И;     хоr - исключающее ИЛИ.

Приоритет

Операция

1

not, @

2

*, /, div, mod, and, shl , shr

3

+, - , or, xor

4

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

Логические операции применимы к операндам целого и логического типов. Если операнды - целые числа, то результат логической операции есть тоже целое число (подробнее об этом сказано в гл.4). Логические операции над логическими данными дают результат логического типа.

При вычислении выражений любого типа приоритет вычислений определяется расставленными скобками, а при их отсутствии - по табл. 2.1 (в порядке убывания приоритета).

Таблица 2.1 Приоритет операций

Примечание: Операции @ (получение адреса), shl (сдвиг влево), shr (сдвиг вправо) и in (принадлежность к множеству)

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

Если, например, b и с имеют тип INTEGER , то выражение

а = b and с < d

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

(а = b) and (с < d)