Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцый для 1 курса-1 семестр.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
2.95 Mб
Скачать

Камбінаваны тып «запісы»

Гэты тып даных больш падрабязна разгледзім далей. Цяпер зробім та­кое азначэнне запісу.

Запіс – гэта структура неаднародных даных, у якой ёсць найменныя па­лі розных тыпаў.

Для азначэння запісу прымяняюць службовыя словы RECORD і END.

Напрыклад, наступны запіс мае сваімі палямі рознахарактарныя даныя:

TYPE

Person=RECORD

F_I_O : STRING;

{прозвішча, імя, імя па бацьку  255 сімвалаў}

Ves, Rost : Real;

Telephone : Longint; {нумар тэлефона}

Ozenki : ARRAY[1..4] OF Byte;

END;

Тып Person цяпер задае даныя з радка (F_I_O), двух лікаў з дроба­вай часткай (Ves, Rost), аднаго цэлага доўгага ліку.

VAR Nehta : person;

Пад іменем Nehta разумеецца данае з канкрэтнымі значэннямі. До­ступ да палёў здзяйсняецца пры дапамозе селектара запісу:

імя_пераменнай.імя_поля

Nehta.F_I_O – гэта значэнне радка з прозвішчам.

Nehta.Telephone – тэлефон.

Палямі запісаў можа быць што заўгодна, нават іншыя запісы, а ко­ль­касць палёў – вялікай. У адрозненне ад масіваў і мностваў палі запісу мо­гуць мець розныя тыпы. Доступ да палёў адбываецца па імені.

Пры заданні першапачатковых значэнняў даным тыпу «запіс» ро­бяць так:

CONST Htosti : person=(F_I_O : 'XXX'; Ves : 50.5;

Rost : 158; Telephone : 265539;

Ozenki : (5,4,3,4));

Поле ад свайго значэння аддзяляецца знакам «:». Парадак чар­га­ван­ня палёў павінен адпавядаць парадку іх апісання ў тыпе, палі павінны раз­дзя­ляц­ца не коскай, а «;», як гэта робіцца ў апісанні тыпу «запіс».

Падрабязна гэты тып разгледзім потым.

Змяненне (прывядзенне) тыпаў і значэнняў

У мове Pascal існуе вельмі магутны сродак, які дазваляе абысці ўсе маг­чы­мыя абмежаванні на сумяшчальнасць тыпаў ці значэнняў (на­пры­клад, у аператары «:=»). Гэта аперацыя прывядзення тыпаў. Яна пры­мя­ня­ец­ца толькі для пераменных і значэнняў.

Сутнасць гэтай аперацыі ў наступным. Пры вызначэнні тыпу мы вы­зна­ча­ем форму захавання інфармацыі ў аператыўнай памяці, і пе­ра­мен­ная дадзенага тыпу будзе прадстаўлена ў памяці наперад вядомай струк­ту­рай. Але калі «паглядзець» на яе вобраз у памяці з пункту глед­жан­ня машыннага ўяўлення другога тыпу, тады можна будзе трактаваць тое ж самае значэнне як значэнне, прыналежнае да другога тыпу.

Фармат аперацыі прывядзення тыпаў:

Імя_тыпу (пераменная_ці_значэнне);

Гэта імя_тыпу павінна быць вядома ў праграме (азначана праг­ра­міс­там або стандартнае).

Прывядзенне тыпаў не перавызначае тыпы пераменных, а толькі дае маг­чы­масць парушыць правілы сумяшчэння тыпаў пры ўмове, што ад­па­вед­ныя значэнні сумяшчальныя ў машынным уяўленні.

Прыклад.

VAR Si : 0..255;

Тады аператар Si:='A' дасць памылку на этапе кампіляцыі, а апе­ра­тар Char(Si):='A' дазволіць зрабіць наданне значэння. Магчымы і дру­гі падыход: Si:=Ord('A'), у гэтым выпадку вынік вяртаецца як Byte.

Аналагічна змяненню тыпу пераменных можна змяняць уласна тып значэнняў, а таксама выніковы тып выразаў, г. зн. дазволены такія пе­ра­ў­т­ва­рэн­ні:

Boolean(1)

Гэта лагічнае значэнне TRUE

Longint(1)

Гэта 1, размешчаная ў 4 байтах

Char(130-1)

Сімвал з кодам ASCII нумар 129

Integer('Y')

Код сімвала 'Y' у фармаце Integer, (ord('Y') вяртае вынік як Byte)

Новы тып можа быць даўжэйшым ці карацейшым, чым пер­ша­па­чат­ко­вы тып значэння.

Прывядзенне тыпаў як пераменных, так і значэнняў – нетрывіяльная апе­ра­цыя. Яна патрабуе даволі высокага ўзроўню ведаў тэхнічных пад­ра­бяз­нас­цей мовы. Напрыклад, трэба ведаць, як захоўваюцца складаныя тыпы да­ных (масівы, запісы, мноствы), адрасы, лікі, радкі ў памяці, якія па­ме­ры ім адводзяцца. Прывядзенне тыпаў мае сэнс толькі пры су­па­ста­ўнас­ці ма­шын­ных уяўленняў значэнняў. Успомнім, што цэлыя і са­праў­дныя зна­чэн­ні маюць зусім рознае машыннае кадзіраванне. Значыць, пры­вядзен­не цэлых пераменных да сапраўдных тыпаў і наадварот – вель­мі ры­зы­коў­ная аперацыя.

Калі адзін парадкавы тып пераўтвараецца ў іншы, такое пе­раў­т­ва­рэн­не можа прывесці да ўсячэння ці павелічэння памераў памяці, пры па­раў­нан­ні з зыходным значэннем. Пры гэтым можна атрымаць «дрэнныя» ад­ка­зы:

VAR li : Longint; i : Integer;

BEGIN

li := 1234567; {>32767}

I := Integer(li+1);

Writeln(i);

END.

Першапачаткова ў пераменнай l маем: (1 234 567)10 = (12D 687)16   Longint. Пераменная lі атрымае значэнне двух апошніх байтаў, пры гэ­тым старэйшы біт гэтага поля змяшчае значэнне 1, г. зн. пе­ра­мен­ная і будзе мець адмоўнае значэнне і надрукуецца –10 616. Гэта добра ві­даць з наступнай схемы.

Заўвага 1. Пры прывядзенні значэння ў больш шырокі тып (на­пры­клад, Longint(1)) значэнні будуць цалкам запісаны ў малодшыя бай­ты, калі ж значэнне прыводзіцца да больш кароткага тыпу, ад яго бя­руц­ца зноў жа малодшыя байты (а старэйшыя ігнаруюцца). У такім вы­пад­ку прыведзенае значэнне можа не раўняцца зыходнаму.

Прыклад. Вынік выканання Byte(534)будзе роўны 22;

534 кадзіруецца ў тып Word як 2 162 + 22 = 2 16+ 16 + 6. Значыць,

53410 = 21616.

0

2

1

6

Малодшы байт (16)16 = 16 + 6 = 22 мы атрымалі, а старэйшы – ас­ноў­ны – згубіўся.

Заўвага 2. Калі зыходнае значэнне адмоўнае, а зададзены тып па­шы­рае памер яго захавання, тады знак будзе захоўвацца.

Калі ж практычна трэба карыстацца аперацыяй прывядзення тыпаў? Та­ды, напрыклад, калі працуем на мяжы значэнняў для дадзенага тыпу.

VAR A, B : Word;

BEGIN

A := 55000;

B := A-256;

Write ( А + B );

Паколькі А + В  65535, а А + В дае тып выразу Word, значыць, вы­нік дзеяння Word(A+B) заведама дрэнны. Выправім гэтую сітуацыю так:

Write(Longint(A)+B)