Совместимость и преобразование типов данных - курсовая работа

Совместимость и преобразование типов данных - курсовая работа

Курсовой проект по программированию

Составила: Ира Комарова IT2V

Таллинн 2004 г.

Введение

Язык программирования Pascal был разработан в 1968-1971 гг. Никлаусом Виртом в Цюрихском Институте информатики (Швейцария), и назван вчесть Блеза Паскаля – известного математика, философа и физика 17-го века. Начальная цель разработки языка диктовалась необходимостью сотворения инструмента "для обучения программированию как периодической дисциплине Совместимость и преобразование типов данных - курсовая работа". Но очень скоро нашлась чрезвычайная эффективность языка Pascal в самых различных приложениях, от решения маленьких задач численного нрава до разработки сложных программных систем - компиляторов, баз данных, операционных систем и т.п. К истинному времени Pascal принадлежит к группе более всераспространенных и фаворитных в мире языков программирования:

• есть бессчетные реализации Совместимость и преобразование типов данных - курсовая работа языка фактически для всех машинных архитектур;

• разработаны 10-ки диалектов и проблемно-ориентированных расширений языка Pascal;

• обучение программированию и научно-технические публикации в значимой степени базируются на этом языке.

Описание типов данных

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

Типы данных разделяются на обыкновенные и сложные. Обыкновенные типы делятся на стандартные (предопределенные) типы и типы определяемые юзером (пользовательские типы).

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

Но остается возможность воззвания к их начальному смыслу при помощи квалифицируемого идентификатора с указанием имени модуля System. К примеру: System.Integer, System.Real.

К стандартным типам относятся:

• группа целых типов (Shortint, Integer, Longint, Byte, Word);

• группа вещественных типов (Single Совместимость и преобразование типов данных - курсовая работа, Real, Double, Extended, Comp);

• группа логических (булевских) типов (Boolean, ByteBool, WordBool, LongBool);

• символьный тип (Char);

• строковый тип (String, Pchar);

• указательный тип (Pointer);

• текстовый тип (Text).

Символьный тип, целые и булевские типы относят к, так именуемым, порядковым типам.

Порядковые типы характеризуются последующими качествами:

1. Огромное количество допустимых значений хоть какого Совместимость и преобразование типов данных - курсовая работа порядкового типа представляет собой упорядоченную последовательность , каждый элемент которой имеет собственный порядковый номер. Порядковый номер представляется целым числом. 1-ое значение хоть какого порядкового типа имеет номер 0, последующий номер 1 и т.д. Исключение составляют порядковые типы Integer, Shortint, Longint, где порядковым номером значений этих типов является само значение.

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

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

К пользовательским типам относятся:

• перечисляемый тип;

• интервальный тип;

• указательные типы (не считая стандартного типа Pointer);

• структурированные типы;

• процедурный тип.

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

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

Форма записи:

type = ;

Пример:

type

vec = integer;

bool = boolean;

Стандартные функции языка Паскаль

Для выполнения нередко встречающихся операций и преобразований данных, относящихся к различным типам, есть заблаговременно определенные функции, которые именуются СТАНДАРТНЫМИ. Для воззвания к функции нужно задать ее имя и Совместимость и преобразование типов данных - курсовая работа в скобках перечень аргументов (характеристик).

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

1. Имя функции записывается строчными знаками латинского алфавита.

2. Аргумент функции записывается в круглых скобках после имени функции.

3. Аргументом функции может быть константа, переменная, либо арифметическое выражение такого же типа

Сейчас разглядим некие стандартные Совместимость и преобразование типов данных - курсовая работа функции:

Функция Действие Тип Х Тип возвращаемого значения

SQRT(X) вычисляет квадратный корень из аргумента Х действительный действительный

SQR(X) вычисляет квадрат аргумента Х целый действи-тельный целый действи-тельный

RANDOM(X) возвращает случайное число, перед вызовом функции лучше использовать в программке оператор RANDOMIZE включающей случайную инициализацию генератора случайных чисел целый Совместимость и преобразование типов данных - курсовая работа, положительный соответствует типу переменной принимающей значение

SIN(X) вычисляет синус аргумента Х действительный действительный

COS(X) вычисляет косинус аргумента Х действительный действительный

Абс(X) вычисляет абсолютное значение (модуль) аргумента Х целый действи-тельный целый действи-тельный

ODD(X) инспектирует Х на четность длинноватое целое логический

ORD(X) определяет порядковый номер знака Х хоть какой Совместимость и преобразование типов данных - курсовая работа тип не считая реального длинноватое целое

CHR(X) определяет знак стоящий по порядковому номеру Х byte символьный

PRED(X) определяет предшествующее значение по отношению к Х хоть какой тип не считая реального тот же тип

SUCC(X) определяет следующее значение по отношению к Х хоть какой тип не считая реального тот же Совместимость и преобразование типов данных - курсовая работа тип

ARCTAN(X) вычисляет арктангенс аргумента Х действительный действительный

EXP(X) вычисляет экспоненту от аргумента Х действительный действительный

LN(X) вычисляет натуральный логарифм от Х действительный действительный

TRUNC(X) находит целую часть от Х действительный длинноватое целое

ROUND(X) округляет Х в сторону наиблежайшего целого действительный длинноватое целое

INT(X) возвращает целую часть аргумента Х Совместимость и преобразование типов данных - курсовая работа действительный действительный

FRAC(X) возвращает дробную часть аргумента Х действительный действительный

DEC(X,N) уменьшает значение переменной Х на данное число N хоть какой тип не считая реального тот же тип

INC(X,N) наращивает значение переменной Х на данное число N хоть какой тип не считая реального тот же тип

PI Совместимость и преобразование типов данных - курсовая работа возвращает значение числа - действительный

Примеры:

1. ORD(‘R’)=82; ORD(5)=5;

2. CHR(68)=’D’; можно вызывать эту функцию через #, если аргумент функции константа (#68='D');

3. PRED(‘N’)=’M’; PRED(87)=86;

4. SUCC(‘S’)=’T’; SUCC(87)=88;

5. PI=3.141592653897932385;

6. ROUND(3.1415)=3;

7. LN(1)=0.000;

8. SQRT(36)=6.000;

9. SIN(90*pi/180)=1.000.

Замечание:

В тригонометрических функциях аргумент должен быть задан исключительно в радианной мере угла.

Сопоставимость и Совместимость и преобразование типов данных - курсовая работа преобразование типов данных.

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

Два типа числятся совместимыми, если

• оба они есть один и тотже тип.

• один тип есть тип-диапазон второго типа.

• оба они являются типами-диапазонами 1-го и такого же базисного типа.

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

• оба они есть процедурные типы с схожим типом результата (для типа-функции), схожим количеством характеристик и схожим типом взаимно соответственных характеристик.

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

Идентичность типов.

Идентичность типов требуется от формальных характеристик процедур и функций и соответственных им фактических характеристик во время вызова.

Два типа Совместимость и преобразование типов данных - курсовая работа Т1 и Т2 схожи в последующих случаях:

T1 и Т2 – один и тот же идентификатор типа (integer; real и т.д. и т.п.);

Один тип объявляется эквивалентным другому.

type

T1 = boolean;

T2 = T1;

T3 = boolean;

M1 = array [1..5] of integer;

M2 = array [1..5] of integer;

var

V1, V2 = array [1..10] of integer;

Так, типы Т1, Т Совместимость и преобразование типов данных - курсовая работа2, Т3 и boolean – схожи, а М1 и М2 – не схожие типы, но все же, переменные V1 и V2 – переменные схожих типов.

Сопоставимость типов.

Сопоставимость типов требуется в выражениях (в том числе и в операциях дела).

Два типа Т1 и Т2 схожи в последующих случаях:

Т1 и Т2 – один Совместимость и преобразование типов данных - курсовая работа и тот же тип либо они схожи;

Т1 и Т2 – вещественные типы;

Т1 и Т2 – целые типы;

Один тип – вещественный, а другой – целый;

Один тип представляет собой тип – спектр другого;

Оба типа являются типами – спектрами какого-то 1-го типа;

Оба типа являются типами – огромными количествами с совместимыми Совместимость и преобразование типов данных - курсовая работа базисными типами;

Один тип является строчкой, а другой – эмблемой либо строчкой.

Сопоставимость для присваивания.

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

Т1 и Т2 – схожие типы Совместимость и преобразование типов данных - курсовая работа и не являются файловыми типами либо структурированными типами, содержащими составляющие файлового типа на любом уровне структурированности;

Т1 и Т2 – совместимые порядковые типы и значение типа Т2 находится в границах вероятных значений объекта типа Т1;

Т1 и Т2 – вещественные типы и значение типа Т2 находится в границах вероятных значений объекта типа Т Совместимость и преобразование типов данных - курсовая работа1;

Т1 – вещественный тип, а Т2 – целый;

Т1 и Т2 – строчки;

Т1 – строчка, а Т2 – знак;

Т1 и Т2 – совместимые типы – огромного количества и все составляющие значения типа Т2 находятся в огромном количестве Т1.

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

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

Type Mytype = (A, B, C, D);

. . . . . . . . . . . . . . . . .

Mytype (2);

Integer (D);

Pointer (Longint (A) + $FF);

Char (127 Mod C);

Byte (K);

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

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

Type

Byt = Array [1..2] Of Byte;

Int = Array [1..2] Of Integer Совместимость и преобразование типов данных - курсовая работа;

Rec = Record

X: Integer;

Y: Integer;

End;

Var

VByt: Byt;

VInt: Int;

VRec: Rec;

Begin

Byt (VInt[1])[2]:= 0;

Int (VRec)[1]:= 256;

End.

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

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

• выражение из целых и вещественных Совместимость и преобразование типов данных - курсовая работа приводится к вещественным

• одна и та же область памяти трактуется попеременно как содержащая данные то 1-го, то другого типа.

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

Абсолютный адресок - пара чисел, разделённых двоеточием - 1-ое - сектор, 2-ое - смещение.

Пример:

B: Byte Absolute $0000:$0055;

W: Longint Absolute 128:0;

Если за Absolute указан идентификатор переменной, то происходит совмещение в памяти данных различного типа, причём 1-ые байты внутреннего представления данных будут размещаться по одному Совместимость и преобразование типов данных - курсовая работа и тому же абсолютному адресу:

Var

X: Real;

Y: Array [1..3] Of Integer Absolute X;

Эквивалентность типов

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

Структурная эквивалентность

Два атрибута типа T1 и T2 именуются (структурно) эквивалентными, если

• их базисные Совместимость и преобразование типов данных - курсовая работа типы BT1 и BT2, соответственно, совпадают либо

• BT1=arr(M,N,T1'), BT2=arr(M,N,T2') и T1' эквивалентен T2', либо

• BT1=rec([F1:T11,...,Fn:T1n]), BT2=rec([F1:T21,...,Fn:T2n]) и T1i эквивалентен T2i для каждого i, либо Совместимость и преобразование типов данных - курсовая работа

• BT1=ref(T1'), BT2=ref(T2') и T1' эквивалентен T2' и

• предположение об эквивалентности T1 и T2 не противоречит условиям 1-4.

Несколько странноватое условие 5 связано с рекурсивностью типов. Оно делает отношение структурной эквивалентности большим посреди отношений, удовлетворяющих условиям 1-4.

П р и м е р:

Пусть

T1=rec([info:int,next:T1])

T Совместимость и преобразование типов данных - курсовая работа2=rec([info:int,next:T2])

Применяя только правила 1-4, получим, что T1 и T2 эквивалентны, если T1 и T2 эквивалентны. Правило 5 принуждает прийти к выводу, что T1 и T2 вправду эквивалентны (на основании только правил 1-4 можно сделать и оборотный вывод).

Если б не было ссылочных и, как следует, рекурсивных типов (как Совместимость и преобразование типов данных - курсовая работа в Фортране либо Алголе 60), то определение структурной эквивалентности сводилось бы к условию 1, т.е. к равенству базисных типов.

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

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

1. Для каждого описания идентификатора типа, переменной либо параметра declared(I,B,Inf), где Inf равно type(T), var(T) либо par(T), типу T ставится в соответствие новый нетерминал t.

2. Если нетерминалу t соответствует базисный тип arr(m,n,T1), то типу T1 ставится в соответствие новый Совместимость и преобразование типов данных - курсовая работа нетерминал t1 и вводится правило t -> arr m n t1.

3. Если нетерминалу t соответствует базисный тип rec([f1:T1,...,fn:Tn]), то типу Ti ставится в соответствие новый нетерминал ti для каждого i и вводятся правила t -> ref i fi ti.

4. Если нетерминалу t соответствует базисный тип Совместимость и преобразование типов данных - курсовая работа ref(T1), где T1=int либо T1=real, то вводится правило t -> T1.

5. Если нетерминалу t соответствует базисный тип ref(tid(I,B)), а типу tid(I,B) уже сопоставлен нетерминал t1, то вводится правило t -> ^ t1.

Нетерминалы этой грамматики эквивалентны, если и только если надлежащие типы структурно эквивалентны.

Остаётся конвертировать Совместимость и преобразование типов данных - курсовая работа эту грамматику к автоматному виду и применить метод нахождения всех пар эквивалентных состояний.

Отношение структурной эквивалентности вправду является эквивалентностью, т.к. оно рефлексивно, транзитивно и симметрично. Не считая того, два типа структурно эквивалентны и тогда только тогда, когда они допускают одни и те же последовательности операций. Это делает Совместимость и преобразование типов данных - курсовая работа такую эквивалентность обычный и понятной программерам. Её главным и очень значимым недочетом является непростой и массивный метод проверки эквивалентности. Как понятно создателю, структурная эквивалентность была принята исключительно в языке Алгол 68.

Предикат consist в данном случае определим последующим образом:

consist(T1,T2):base_type(T1,BT1),base_type(T2,BT2),

(BT Совместимость и преобразование типов данных - курсовая работа1=int,BT2=real ; % приводимость

equiv(BT1,BT2) ; % эквивалентность

error("Несопоставимые типы")).

Именная эквивалентность

При стандартизации языка Паскаль была принята именная эквивалентность. Согласно её определению эквивалентными могут быть только именованные типы, т.е. типы с атрибутами int, real либо tid(_,_):

1. Именованный тип эквивалентен сам для себя.

2. Если тип T=tid(I,B) имеет описание Совместимость и преобразование типов данных - курсовая работа declared(I,B,T1), где T1 – именованный тип, то типы T и T1 эквивалентны.

Это очень ограничительное определение. Даже в Паскале допустимо присваивание

U:=V,

если переменные U и V описаны как

var U,V: array[1..10]of real,

хотя имеют неименованный тип "массив". Но в том же Паскале этот оператор Совместимость и преобразование типов данных - курсовая работа недопустим из-за неэквивалентности типов переменных, если они описаны как

var U: array[1..10]of real;

var V: array[1..10]of real;

Чтоб окутать все эти случаи, компилятор для каждого вхождения выражения типа, начинающегося с array, record либо ^ (т.е. не являющегося идентификатором типа), вводит уникальное имя типа – псевдоним, по этому различные вхождения Совместимость и преобразование типов данных - курсовая работа 1-го и такого же выражения типа оказываются неэквивалентными в смысле именной эквивалентности.

В согласовании со произнесенным следует внести конфигурации в правила DC-грамматики для нетерминала type, определяющие атрибут типа. В их врубается сейчас порождение и описание псевдонимов типа. Для генерации новых "имен" можно использовать самые различные способы Совместимость и преобразование типов данных - курсовая работа; мы тут воспользуемся предикатом recorda, генерирующем в качестве псевдонима уникальную ссылку на пустой терм, записываемый по ключу alias. описание этого псевдонима типа врубается в виде предиката declared.

type(B,tid(A,B)) -->

[array,`[,n(M),`:,n(N),`],of],type(B,T),

{recorda(alias,_,A),

assert(declared(A,B Совместимость и преобразование типов данных - курсовая работа,type(arr(M,N,T)))}.

type(B,tid(A,B)) -->

[record],field(B,F),fields(B,LF),

LF]))),

[end].

type(B,tid(A,B)) -->

[`^,id(I)],

{(type_id2(I,B,B1,type(_));

assert(declared(I,B,type(referred))),

B1=B),

recorda(alias,_,A),

assert(declared(A,B,type(ref Совместимость и преобразование типов данных - курсовая работа(I,B1)))}.

Предикат consist в данном случае определяется последующим образом:

consist(T1,T2):T1=int,T2=real ; % приводимость

equiv(T1,T2) ; % эквивалентность

error("Несопоставимые типы").

equiv(T,T).

equiv(tid(I,B),tid(I1,B1)):declared(I,B,type(tid(I1,B1)));

declared(I1,B1,type(tid(I,B))).

Именная эквивалентность сравнимо просто Совместимость и преобразование типов данных - курсовая работа реализуется. Но это – отношение (рефлексивное и симметричное) не транзитивно, и потому не является эквивалентностью ни в математическом, ни в обычном, обыденном смысле. Понятие псевдонима типа обычно не даётся программерам, Потому начинающие программеры на Паскале нередко делают ошибки, вроде обозначенных в примере. Мотивацией для введения именной эквивалентности в 1970-е годы послужило Совместимость и преобразование типов данных - курсовая работа желание избежать ошибок программирования, вроде присваивания "яблокам" "крабов", когда и те, и другие описаны как целые. С развитием объектно-ориентированного программирования подобные ухищрения стали лишними, а именная эквивалентность осталась в неких языках как анахронизм.

Структурно-именная эквивалентность

Этот тип эквивалентности самый обычный: эквивалентными числятся типы, имеющие однообразный Совместимость и преобразование типов данных - курсовая работа базисный тип. Предикат consist в данном случае определяется последующим образом:

consist(T1,T2):base_type(T1,BT1),base_type(T2,BT2),

(BT1=int,BT2=real ; % приводимость

BT1=BT2 ; % эквивалентность

error("Несопоставимые типы")).

При всем этом нет необходимости вводить псевдонимы типа, как в случае именной эквивалентности. Заместо предиката acc_type при анализе доступа можно Совместимость и преобразование типов данных - курсовая работа использовать предикат base_type.

Отношение структурно-именной эквивалентности рефлексивно, симметрично и транзитивно. По вложению оно лежит строго меж структурной и именной эквивалентностями. Им просто воспользоваться на практике.

Примеры

1.

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

Program Code_pf_Char;

{Программа читает знак с клавиатуры и Совместимость и преобразование типов данных - курсовая работа выводит на экран

этот знак и соответственный ему внутренний код}

var

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

begin

Write('Введите хоть какой знак: ');

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

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

END.

Обращаем внимание: при вызове

WriteLntch,' = ',ord(ch));

третьим Совместимость и преобразование типов данных - курсовая работа параметром воззвания указан вызов функции ORD (СН) , что исходя из убеждений языка является выражением; в почти всех случаях при вызове процедур и функций в качестве характеристик вызова можно указывать не только лишь переменные либо константы, да и выражения с их ролью.

2.

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

Непроизносимые гласные:

Сочетания "вств" и "стн" транскрибируются как [ств] и [сн] соответственно, т. е.:

1) /вств/ -> [ств]

2) /стн/ -> [лнц]

Реализация 2-ух данных правил на Совместимость и преобразование типов данных - курсовая работа языке Паскаль:

program transcription;

var

Word: String;

I, J, K: Integer;

begin

Write('Введите слово: '); ReadLn(Word);

K := Pos('вств', word);

while (K 0) do

begin

delete(Word, K, 1);

K := Pos('вств', Word);

end;

K := Pos('стн', Word);

while (K 0) do

begin

delete(Word, K+1, 1);

K := Pos('стн', Word);

end;

WriteLn('Транскрипция: ', Word);

end Совместимость и преобразование типов данных - курсовая работа.

Как видно из примера, два правила, изложенные в лингвистическом описании, реализуются программкой в 20 с излишним строк. Несложно увидеть, что а) такая запись очень громоздка, б) она трудна для восприятия, в) она совсем не имеет ничего общего с записью, естественной для языковеда и потому плохо отражает сущность происходящих преобразований. А если Совместимость и преобразование типов данных - курсовая работа б мы немножко усложнили правила, введя несколько слов-исключений, требуя проверить, не является ли транскрибируемое слово производным от 1-го из их, программка возросла бы вдвое либо более.



sovetskoe-grazhdanskoe-pravo-8-glava.html
sovetskoe-obshestvo-posle-vojni.html
sovetskomu-pravitelstvu-kreml-moskva.html