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.  Що таке сумісні операції?


 

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

51185. Работа с клавиатурой матричного типа 40.12 KB
  Цель работы Изучить особенности работы параллельных портов микроконтроллера. Изучить схемы подключения кнопок и матричной клавиатуры к микроконтроллеру. Научиться определять состояние кнопок при помощи программы.
51187. Інтерпретатор математичних виразів 25.62 KB
  Мета: Навчитися створювати та використовувати власні обєкти, нащадки, віртуальні функції, програмно реалізовувати деревоподібні графи.
51188. Інтерпретатор виразів з обчисленням першої та другої похідної 21.38 KB
  Мета: Удосконалити навики ООП, використавши для реалізації задачі про Інтерпретатор механізми інкапсуляції,наслідування, поліморфізму, динамічного звязування і віртуальних функцій.
51190. Построить аналитическую модель и, решив ее, определить вероятности состояний 100.94 KB
  По графу построить аналитическую модель и, решив ее, определить вероятности состояний. Рассчитать теоретическое значение показателя эффективности, заданного целью исследования задания..
51191. Подання статистичних даних: табличний та графічний методи 37.91 KB
  Макет статистичної таблиці являє собою основу, заповнену заголовками: загальним, боковими та верхніми, які зазвичай виконуються 14 шрифтом з інтервалом 1,5, як і весь текст, де приводиться таблиця.
51192. Исследование устойчивости системы с использованием критериев устойчивости Гурвица и Михайлова 80.48 KB
  Цель работы: изучение критериев устойчивости Гурвица и Михайлова. Задача: В лабораторной работе исследуется устойчивость потенциометрической следящей системы. Выбрать начальное значение Т1. Исследовать влияние коэффициентов передачи К1, К2, К3на устойчивость системы. Добиться случая устойчивой, неустойчивой и системы находящейся на грани устойчивости.