Правила эквивалентности и совместимости типов. Приведение типов (явное и неявное). 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Правила эквивалентности и совместимости типов. Приведение типов (явное и неявное).



 

 

Эквивалентность – наиболее высокий уровень соответствия типов. Требуется при вызове тех или иных функций. Подразделяется на 2 типа:

- структурная (типы эквивалентны, если эквивалентны их структуры: число составляющих компонентов и их тип);

- именная (типы эквивалентны, если эквивалентны идентификаторы их имен).

 

Типы T1 и T2 эквивалентны, если выполняется одно из следующих условий:

- T1 и T2 совпадают;

- T1 и T2 определены в одном объявлении типа;

- T1 эквивалентен некоторому типу T3, который эквивалентен типу T2 (транзитивность).

 

Integer/Integer эквивалентны; array/array – не эквивалентны

 

В языке Pascal типы будут являться эквивалентными, если соблюдается структурная и именная эквивалентность.

 

V1, V2: array // экв.

V3: array; V4: array // не экв.

 

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

 

Типы T1 и T2 будут называться совместимыми, если верен хотя бы 1 вариант из следующих:

- T1 и T2 эквивалентны;

- T1 и T2 – оба целочисленные или вещественные;

- T1 и T2 – подмножества одного типа;

- T1 является подмножеством T2;

- T1 – строка, а T2 – символ;

- T1 – нетипизированный указатель, а T2 – типизированный;

- T1 и T2 – оба процедурные, с одинаковым количеством попарно эквивалентных параметров, а для функций – с эквивалентными типами результатов.

 

CharSet и set of Char – совместимые.

 

Совместимость по присваиванию возникает тогда, когда происходит присваивание одного типа другому.

Два типа данных T1 и T2 называются совместимыми по присваиванию, если верен хотя бы 1 вариант из следующих:

- T1 и T2 эквивалентны, но не являются файлами;

- T1 и T2 совместимы, причем T2 – некоторое подмножество T1;

- T1 – объектный тип, а T2 – объектный тип-потомок T1;

- T1 – вещественный тип, а T2 – целый.

 

При отсутствии совместимости по присваиванию возникает синтаксическая ошибка.

 

Приведение типов бывает явным и неявным.

 

При явном приведении типов используется вызов специальных функций преобразования, аргументы которых принадлежат одному типу, а значение – другому. Таковыми являются функции Ord, Trunc, Round, Chr, Ptr.

 

Кроме этого, существует более общий механизм преобразования типов (автоопределенное преобразование):

Integer(20)

Char(Integer(20) * 3)

TData('x')

 

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

 

Явное приведение типов выполняется непосредственно в программе программистом.

 

Неявное преобразование типов возможно только в 2 случаях:

- если выражение составлено из вещественных и целых переменных (посредством неявного преобразования оно приобретает вещественный тип);

- если одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа). Такое может произойти при использовании записей с вариантными полями (record case of), применении типизированных указателей, содержащих одинаковый адрес, а также при размещении данных разного типа по одному и тому же физическому адресу (директива absolute).

 

Происходит автоматически при выполнении арифметических операций.

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

Частично отключить неявное приведение типов можно директивой {$R-}.

 

Классификация операторов языка. Организация ввода-вывода данных.

 

Для организации ввода/вывода существуют следующие операторы:

 

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

 

Read(A1, A2, …) // считывание данных через пробел

Readln(A1, A2, …) // считывание данных через пробел и переход на новую строку

Readln; // ожидание ответа пользователя и переход на новую строку

 

Тип переменной должен совпадать с типом предполагаемого ввода.

 

- Оператор записи, позволяющий передать данные из программы и записать их в поток вывода (файл Output). С помощью этого оператора можно вывести данные на экран либо другой внешний носитель.

 

Write(A1, A2, …) // запись данных

Writeln(A1, A2, …) // запись данных и переход на следующую строку

Writeln; // переход на следующую строку

 

Для вещественного числа можно указывать максимальное количество цифр и количество цифр после запятой в формате A:K:M, где A – вещественное число, K – максимальное количество цифр, M – количество цифр после запятой.

 

Процедура ClrScr выполняет очистку экрана.

Классификация операторов языка.

- Простые: операторы, не содержащие в себе других операторов (например, оператор присваивания, вызов процедуры, операторы goto, break, continue, exit). Состоят из единственного ключевого слова.

- Структурные: подразделяются на:

- Составной;

- Условный;

- Оператор цикла;

- Оператор присоединения. Определяются предложением языка.

- Пустой оператор: не обозначается и не выполняет никаких действий, но в целях унификации рекомендуется добавлять пустой оператор как последний оператор составного (if … begin a; b; end;). Также называется разделителем.

 

Оператор присваивания:

< Переменная >:= < Выражение >;

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

При использовании оператора присваивания типы переменной и выражения должны быть совместимы по присваиванию.

 

Оператор вызова процедур.

< Имя процедуры > (< Список фактических параметров >);

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

 

Примеры: ClrScr; Inc(I);.

 

Оператор перехода:

goto < метка >;

Определяет возможность безусловного перехода в указанную точку программы.
Метка – целое число без знака, определяется в секции label того же блока, что и оператор goto; устанавливается в необходимую строку для перехода.

 

Break: досрочно прекращает выполнение цикла.

Continue: начинает новую итерацию цикла.

Exit: досрочно завершает подпрограмму или программу.

 

 

Составной оператор: представляет собой группу (множество) простых или составных операторов, заключенных в операторные скобки begin/end.

 

Оператор присоединения.

with < ссылка на запись или объект > do

< оператор >

 

Такая конструкция позволяет ссылаться на поля или методы объекта/записи без указания имени объекта/записи.

 

Пример:

with TData(Data) do

Begin

end;

 

Оператор условия if.

if < логическое условие > then

< оператор >

Else

< оператор >;

 

Сокращенная форма:

if < логическое условие > then

< оператор >;

 

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

Оператор условия может работать в 2 формах: полная и сокращенная.

 

Полная форма предполагает наличие операторов как в секции then, так и в секции else. В некоторых случаях в секции then или else используется еще один или несколько вложенных операторов условия.

 

Сокращенная форма предполагает наличие только секции then.

 

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

 

Оператор выбора (case):

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

1 часть – выражение-селектор. В качестве такого выражения может быть представлено любое выражение порядкового типа.

2 часть – список выполняемых операторов, которые определяют, при каком значении селектора нужно запускать один из предопределенных вычислительных процессов. В качестве оператора может использоваться как простой оператор, так и составной оператор, но только один.

 

case Var of // Var – выражение-селектор

1:; // оператор 1

2:; // оператор 2

3:; // оператор 3

else; // оператор по умолчанию

end;

 

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

 

Операторы цикла.

 

Цикл – последовательность операторов, которая может выполняться более 1 раза. Для того, чтобы определить номер прохода цикла, используется переменная цикла (переменная-счетчик), значение которой определяет момент начала и завершения цикла.

 

Набор операторов, выполняющийся в цикле, является телом цикла.

 

В языке Pascal существуют 3 вида циклов: цикл с параметром (с известным числом повторений), цикл с постусловием, цикл с предусловием.

 

Цикл с параметром:

for Счетчик:= Начальное значение to Конечное значение do

< оператор >;

Используется в программе, когда заранее известно число повторений тела цикла, при этом каждое повторение цикла приводит к увеличению или уменьшению счетчика цикла. Счетчик – переменная, имеющая начальное и конечное значение.

В качестве счетчика используется переменная целочисленного типа.

Изменение счетчика происходит автоматически после завершения тела цикла.

 

Возможно использование ключевого слова downto, тогда счетчик цикла будет уменьшаться.

 

 

Цикл с предусловием:

while < логическое выражение > do

< оператор >;

 

Выход из цикла происходит, когда логическое выражение равно False.

 

Такой цикл выполняется тогда, когда число повторений не определено, и возможная ситуация, что тело цикла не выполнится ни один раз. В таком цикле сначала проверяется условие входа в цикл, и если оно истинно, то выполняется тело цикла; в противном случае, управление передается оператору, стоящему после тела цикла.

 

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

 

 

Цикл с постусловием:

Repeat

< оператор 1 >;

< оператор 2 >;

until < логическое выражение >;

 

Выход из цикла происходит, когда логическое выражение равно True.

 

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

 

Обязательное требование – в теле цикла должна происходить модификация переменной, которая влияет на логическое выражение.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-26; просмотров: 1011; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.239.52.235 (0.037 с.)