42625

ДОСЛІДЖЕННЯ СУВОРОЇ ТИПІЗАЦIЇ, ПРИВЕДЕННЯ ТИПIВ ТА МЕХАНІЗМІВ ОБХОДУ СУВОРОЇ ТИПІЗАЦІЇ НА ОСНОВІ НЕТИПІЗОВАНИХ (АДРЕСНИХ) ВКАЗІВНИХ ЗМІННИХ

Лабораторная работа

Информатика, кибернетика и программирование

Теоретичні відомості В алгоритмічних мовах всі операції в виразах виконуються з операндами визначених типів. Часто трапляється так що є необхідним конструювати вирази з програмних обєктів різних типів даних або вирази що розташовані праворуч та ліворуч оператору привласнення генерують значення різних типів. В мовах програмування існує явне та неявне приведення типів.

Украинкский

2013-10-30

83.5 KB

6 чел.

Лабораторна  робота 7

ДОСЛІДЖЕННЯ СУВОРОЇ ТИПІЗАЦIЇ, ПРИВЕДЕННЯ ТИПIВ ТА

МЕХАНІЗМІВ ОБХОДУ СУВОРОЇ ТИПІЗАЦІЇ НА ОСНОВІ

НЕТИПІЗОВАНИХ (АДРЕСНИХ) ВКАЗІВНИХ ЗМІННИХ

Мета лабораторної роботи - вивчення суворої типізації, правил приведення типів та механізму обходу суворої типізації.

Теоретичні відомості

В алгоритмічних мовах всі операції в виразах виконуються з операндами визначених типів. Часто трапляється так, що є необхідним конструювати вирази з програмних об’єктів різних типів даних, або вирази, що розташовані праворуч та ліворуч оператору привласнення, генерують значення різних типів. В таких випадках застосовуються механізми приведення значень одного типу до значень іншого типу. В мовах програмування існує явне та неявне приведення типів.

Засоби явного приведення (перетворення) значень типів

Паскаль:

<приведення>:: =<індикатор типу> (<вираз>)

Наприклад:

bS := byte(iG);     

iT := integer(45/bS);   

Сі:

<приведення>:: =<індикатор типу> (<вираз>)|(<індикатор типу>) <вираз>

Наприклад:

iCount = int (fG/3.14);     

fCoeff1 = (float)dCoeff2;

Засоби неявного приведення (перетворення) значень типів

Мова Паскаль є суворо типізованою і дозволяє лише один випадок неявного приведення типів. Мова С не суворо типізована і тому має більш складну систему неявного приведення типів.

Паскаль:

значення  цілих типів до значень дійсного типу.

Сі:

- знакове коротке до довгого – розширення знаковим бітом уліво

- беззнакове коротке до довгого – розширення уліво нульовим бітом

- знакове довге до короткого – відсікання вправо з установленням знакового біту (для знакових)

- беззнакове довге до короткого - відсікання вправо. лівий біт набуває знакової функції (для знакових)

- знакове до беззнакового – лівий біт втрачає знакову функцію

- беззнакове до знакового – лівий біт набуває знакової функції

- ціле до дійсного – перетворюється у довге, а далі у дійсне

- дійсне у ціле – перетворюється у довге

- дійсне у дійсне з подвійною точністю – доповнення мантиси нульовими битами праворуч

- дійсне з подвійною точністю у дійсне –  відсікання молодших бітів мантиси

Неявне приведення типів є небажаною ситуацією, тому що результат такого приведення може бути не передбачуваним, і його використання може призвести до важких помилок у програмі. Кращим шляхом є застосування явного приведення типів.

Обхід суворої типізації

В окремих випадках, коли неможливе застосування явного чи неявного приведення типів, для перетворення значень використовуються механізми обходу суворої типізації. Один з таких механізмів передбачає використання нетипізованих вказівних змінних, оголошених як pointer (Паскаль), void* (Сі).

Механізм базується на можливості нетипизованих покажчиків посилатися на ім’я змінної будь-якого типу (дія 1). Потім вміст нетипізованого покажчика може бути присвоєним типізованому покажчику (дія 2). Типізований покажчик дозволяє застосовувати операцію розименування для доступу до комірок пам’яті, на які вказує покажчик. Вміст комірок буде інтерпретованим як такий, що має тип, котрим типізований покажчик.

Паскаль:

  p := @R;

Або

  p := U1;

  U2 := p;

Сі:

  v = &R;

Або

  V = U1;

  U2 = (type's U2) v;

U1, U2 – типізовані вказівні змінні; R - проста змінна;  type's U2 - явне приведення типу.

Приклад програм, які демонструють механізм обходу суворої типізації:

{ Паскаль }     // Сі

Program ost;     void main()

Var      {

fA : real;      float fA;

nB : integer;      int nB;

pnB : ^integer;     int *pnB;

pP: pointer;      void *pP;

        Begin

{ fA => nB }     \\ fA => nB     

fA  := 267.7;     fA  = 267.7;

pP  := @fA;     pP  = &fA;

pnB  := pP;      pnB  = (int*)pP;

nB  := pnB^;     nB = *pnB;

        End.      }

Завдання

Написати програми на мовах Паскаль та Сі, які складаються з наступних дій:

  1.  Опису змінних наступних типів: Longint, Integer, Real – на мові Паскаль та int, float, unsigned short – на мові Сі.
  2.  Ініціювання змінних, що описанні в п.1 даного завдання, значеннями згідно з варіантом (табл.1).
  3.  Опису змінних наступних типів: Integer, Char, Shortint – на мові Паскаль та double, int, char – на мові Сі.
  4.  Ініціювання змінних, що описанні в п.3 даного завдання, використовуючи змінні, що описанні в п.1 даного завдання, за допомогою:
    •  неявного приведення типів;
    •  явного приведення типів;
    •  механізму обходу суворої типізації.

Примітка: необхідно дотримуватись порядку перечислення типів у п.1 та п.3 даного завдання.

Таблиця 1

№ варіанта

Паскаль

Сі

Longint

Integer

Real

int

float

unsigned short

1

5679876

20836

67.9

23678

1.23e4

11974

2

237658

3917

-9.3e2

926

4.811e-1

1914

3

9876765

405

213.08

13915

4.78e5

9765

4

11133557

16329

-45.77774

9742

-3.54e3

34033

5

5576921

286

7.4e-2

30679

2.57e-4

2384

6

233897

1753

-8.2e1

19923

-5.87e1

677

7

7531908

4055

883.23

27652

7.9e3

74

8

38749

953

-1.543e2

17443

3.908e-4

4476

9

10432056

231

4.79e-3

3841

954.67

6429

10

496302

700

34.7623

682

-8.4e2

25921

11

5739184

2753

123.87

-6306

5.1e-1

126

12

700644

13138

-6.54e3

37

95.41

5743

13

21153870

96

88.99

31765

-7.293e3

26543

14

6938102

4248

9.05e-1

5876

21.09

333

15

849251

364

-50.63

274

1.001e-2

78

Контроль знань та вмінь

Таблиця вмінь

Таблиця 2

Перетворення значень та обхід суворої типізації

Об'єкти різних типів

Обхід суворої типізації

Приведення

неявні

явні

п

с

п

c

п

c

Контрольні запитання

  1.  Що таке сумісність типів?
  2.  Що таке приведення? Як воно може виконуватись?
  3.  Що таке суворо  типізована мова?
  4.  Наведіть правила неявного приведення у мовах Паскаль та Сі.
  5.  Що таке еквівалентність типів? Якою вона буває?
  6.  Що таке сумісність типів для привласнення?
  7.  Що таке сумісні операції?


 

А также другие работы, которые могут Вас заинтересовать

19646. Становление Древнерусского государства. Норманская теория 11.2 KB
  Становление Древнерусского государства. Норманская теория В IX веке у восточных славян возникает госво. Согласно норманнской теории сформулированной немецкими учеными Г. Ф. Миллером и Г.З. Байером в XVIII веке создание русского госва приписывалось скандинавским викинга
19647. Первые Киевские князья 14.56 KB
  Первые Киевские князья В 879 г. Рюрика на новгородском престоле сменил Олег Вещий.В 882г. Олег совершил поход на Киев и убил правящих там князей Дира и Аскольда а затем провозгласил себя правителем единого киевсконовгородского государства. Позднее в XIX веке оно получит н
19648. Причины феодальной раздробленности на Руси 14.66 KB
  Причины феодальной раздробленности на Руси: Господство натурального хозяйства и как следствие слабые экономические связи между районами государства. Усиление отдельных княжеств правители которых уже не желают подчиняться киевскому князю. Постоянные усобиц...
19649. Значение Батыева нашествия и установления монгольского ига 15.09 KB
  31 мая 1223 г. на реке Калке монголы разгромили лишенное единства русское войско. Это поражение имело большое моральное значение для будущего завоевания Руси возник миф о непобедимости монголов. В 1237 г. началось нашествие монголов на Русь. Были разорены Рязань Москва Сузд...
19650. Причины образования единого Российского государства 16.25 KB
  В XIII-XIV веках сложились предпосылки образования русского централизованного государства экономические и политические. Причины образования единого Российского государства: Потребность в сплочении сил Руси для освобождения от ордынского ига Необходимость по
19651. Иван Грозный 14.34 KB
  Вопрос № 11. 3 февраля 1565 г. Иван Грозный учредил опричнину. Опричнина период в истории России с 1565 года до самой смерти Ивана Грозного обозначившийся государственным террором и системой чрезвычайных мер. Также это система управления по которой территория делится на д...
19652. Реформы Избранной Рады 14.53 KB
  1533-1584 правление Ивана Грозного. Для подготовки проекта преобразований Иван создает неформальный кружок единомышленников Избранную Раду. Реформы Избранной Рады: 1550 г. принят новый Судебник основой для которого послужил Судебник 1497 г. Помещики именуются го
19653. Причины Смутного времени 13.79 KB
  Причины Смутного времени: Династический кризис. Завершение династии Рюриковичей. Намечающееся отставание России от Запада приводит к появлению большого числа сторонников развития по западному пути. Растущее недовольство общества властью. Началом С
19654. 1613 – 1645 правление Михаила Романова 14.54 KB
  1613 1645 правление Михаила Романова На престол его поставили в 13летнем возрасте. Естественно невозможно быть руководителем разрушенной страны так рано. Ему помогал править отец Филарет. Будучи Патриархом Руси и наставником сына он принес много пользы. Была восстановле...