Совместимость и преобразование типов данных
Turbo Pascal – типизированный язык. Концепция типов предполагает, что применяемые в языке операции определены только над операндами совместимых типов. Совместимость типов учитывается при согласовании формальных и фактических параметров подпрограмм и выполнении операций присваивания. Несовместимость типов определяется на этапе компиляции. Если типы операндов выражения или формальных и фактических параметров подпрограмм неодинаковы, но совместимы, то производится преобразование типов для приведения их к одному и тому же допустимому типу. Принадлежат ли переменные одному типу данных, зависит от того, как в языке трактуется эквивалентность. Она может быть структурная и именная. При первой анализируется структура переменных: число их компонентов и их типы. Пример type t1=array [1..10] of integer; t2=array [1..10] of integer; var v1,v2: t1; v3: t2; При структурной эквивалентности Т1 и Т2 – один тип. В языке Pascal применяется именная эквивалентность. Типы переменных совпадают тогда и только тогда, когда при их описании используется один и тот же идентификатор типа. Т1 и Т2 – 2 разных типа! Типы Т1 и Т2 идентичны (одинаковы), если - Т1 и Т2 – один и тот же тип; - определены один через другой, т.е. type Т1=Т2; type Т2=Т1; При вычислении выражений и при выполнении операции присваивания операнды должны быть совместимы. Во время вычисления выражений два типа операндов совместимы, если: 1) оба они одного типа; 2) один – вещественный, другой – целый; 3) один является диапазоном типа второго операнда; 4) оба – диапазоны одного и того же базового типа; 5) оба – множества, составленные из элементов одного и того же базового типа данных; 6) оба – строки; 7) один тип – строка, другой – символ.
Пусть Т1 – тип переменной левой части присваивания, Т2 – тип результата выражения его правой части. Присваивание возможно, если: 1) Т1 и Т2 – один тип; 2) Т1 и Т2 – совместимые порядковые типы и значение Т2 лежит в диапазоне возможных значений Т1; 3) Т1 и Т2 – вещественные типы и значение Т2 лежит в диапазоне возможных значений Т1; 4) Т1 – вещественный тип, Т2 – целый; 5) Т1 – строка, Т2 – строка или символ; 6) Т1 и Т2 – совместимые множества и все элементы Т2 принадлежат множеству возможных значений Т1; Преобразование типов может быть явным и неявным. При явном преобразовании типов используют вызовы специальных функций, аргументы которых принадлежат одному типу, результат – другому. Пример Ord, Odd, Trunc, Round, Chr. Данные одного типа могут автоматически (неявно) преобразовываться в данные другого типа перед выполнением операций в выражениях и через выполнение операций присваивания. Неявное преобразование типов возможно в трех случаях: а) в выражениях из вещественных и целочисленных данных целые автоматически преобразуются в вещественные, результат будет вещественного типа; б) при выполнении операции присваивания переменной вещественного типа значения целого типа значение целого типа преобразуется в значение вещественного типа, после чего оно присваивается переменной левой части оператора присваивания; в) одна и та же область памяти попеременно содержит данные то одного, то другого типа (совмещение в памяти данных разных типов). Например, при использовании записей с вариантными полями. Явное преобразование может быть с помощью стандартных функций и с помощью операции приведения типа. Форма операции <имя типа>(<имя переменной> / <выражение>); Операция приведения может находиться, как в левой части оператора присваивания, так и в правой. Если она находится в левой части оператора присваивания, то в скобках может быть только имя переменной. Если в правой, то и выражение.
Пример Явное преобразование символов и чисел. uses crt;
var si:0..255; a:byte; c:char; begin clcscr; char(si):=’a’; {Приведение типа в левой части: из чего char преобразуется для si!!} writeln(char(si)+’s’); {as} writeln(si); {97} si:=ord(‘C’); {Приведение типа в правой части: во что char преобразуется!!} writeln(si); {67} si:=byte (‘E’); {Приведение типа в правой части: во что char преобразуется!!} writeln(si); {69} a:=byte(‘E’); writeln(a); {69} char(a):=’B’; writeln(char(a)); {B} writeln(a); {66} byte(c):=si; {Приведение типа в левой части: из чего si преобразуется для char!!} writeln(byte(c)+200); {269} writeln(c); {E} byte(c):=a; writeln(c); {B} end. Пример Явное преобразование целых и перечислимых типов. type Days=(mon, tues, wen, thurs, fri, sat, sun); var aDay:Days; num:byte; begin clrscr; Days(Num):=sun; {Приведение типа в левой части: из чего Days преобразуется для byte!!} writeln(ord(Days(num)),ord(sun),num); {666} aDay:=Days(num); {Приведение типа в правой части: во что byte преобразуется!!} writeln(ord(Days(num)),ord(aDay),num); {666} num:=byte(fri); writeln(ord(fri), num); {44} num:=ord(fri); writeln(Ord(fri), num); {44} aday:=Days(num+1); writeln(ord(Days(num+1)), num+1); {55} num:=byte(pred(fri)); writeln(num); {3} end.
Бестиповые параметры Можно использовать параметры-переменные и параметры-константы без указания типов. Фактическим параметром может быть переменная любого типа; ответственность за правильность использования параметра возлагается на программиста. Пример function Equal(var Param1; Param2; Len:word); Для формальных параметров Param 1, Param 2 в качестве фактических параметров могут быть использованы любые переменные простого типа, массивы, записи и др. Параметр без типа внутри подпрограммы перед его использованием надо привести (преобразовать) к конкретному определенному типу. Пример Программа для вычисления максимального значения с использованием функции с бестиповым формальным параметром. type tarr = array[1..100] of integer; var massiv: tarr; maxim, i, k: integer; function max(var mas; n: byte): integer; type tarray=array[1..maxint] of integer; var ma:integer; i:byte; begin ma:=tarray(mas)[1]; for i:=2 to n do if ma<tarray(mas)[i] then ma:=tarray(mas)[i]; end; begin writeln(‘Введите число элементов массива ’); read(k); writeln(‘Введите элементы массива’); for i:=1 to k do read(massiv[i]); maxim:=max(massiv,k); writeln(maxim); end.
Читайте также: II. Типовые задачи. Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|