- •Структуры даных і праца з імі сродкамі мовы Pascal Парадкавыя тыпы
- •Мноствы
- •Тыпізаваныя канстанты тыпу «мноства»
- •Дзеянні над масівамі
- •Дзеянні над элементамі масіву
- •Пераменныя тыпу «масіў» са стартавым значэннем, ці тыпізаваныя канстанты-масівы
- •Канстанты з тыпам «масіў»
- •Камбінаваны тып «запісы»
- •Змяненне (прывядзенне) тыпаў і значэнняў
- •Радкі сімвалаў
- •Наданне значэння радкам
- •Радковыя выразы
- •Рэдагаванне радкоў
- •Пераўтварэнне радкоў
Тыпізаваныя канстанты тыпу «мноства»
Канстанта тыпу «мноства»:
Канстанта-элемент:
Прыклад.
CONST Xset : SET OF Char=['а', 'б', 'в'];
Разгледзім выкарыстанне даных з тыпам «мноства».
Задача. Запраграміраваць рэшата Эратасфена для пошуку простых лікаў велічыні 255.
Алгарытм. Сярод усёй сукупнасці лікаў ад 2 да 255 выкраслім кратныя чарговаму простаму.
PROGRAM Proct;
VAR
Prime : SET OF 2..255;
j, i, m : Integer;
BEGIN
Write ('увядзі m <= 255');
Readln (m);
Prime := [2..m];
FOR i := 2 TO m DO
IF i IN Prime THEN
FOR j := 2 TO (m DIV i) DO
Prime := Prime-[i * j];
{выключылі ўсе кратныя простаму ліку i}
Writeln ('простыя лікі <=', m);
FOR i := 2 TO m DO
IF i IN Prime THEN Write (i:4);
END.
Заданне. Зададзена паслядоўнасць розных сімвалаў. Падлічыць, колькі сярод іх сімвалаў-лічбаў.
Алгарытм. Бяром чарговы сімвал, пакуль ён не «.». Калі ён у мностве сімвалаў-лічбаў, падлічваем яго. Раздрукоўваем вынік.
Масівы
Пераменныя тыпу «масіў», або масіў, – гэта ўпарадкаваная сукупнасць аднатыпных даных, якія захоўваюцца паслядоўна.
Тып «масіў» вызначаецца наступнай канструкцыяй:
Масіў абавязкова мае фіксаваныя памеры, якія вызначаюць, колькі элементаў захоўваецца ў ім. Любы элемент у масіве можна знайсці па яго індэксе. Індэксы – гэта выразы любога парадкавага тыпу.
Тып індэксаў паказвае, у якіх межах змяняецца індэкс масіву. Тып кампанентаў – любы вядомы тып даных.
Калі ў апісанні масіву зададзены адзін індэкс, масіў называецца аднамерным, два – двухмерным, n – n-мерным. Памеры масіву абмежаваны толькі аб’ёмам памяці. Для Turbo Pascal – гэта прыблізна 64 кб.
У секцыі TYPE можна вызначыць тыпы масіваў. Гэта будуць найменныя тыпы масіваў, якія потым скарыстоўваюцца пры вызначэннях пераменных тыпу «масіў».
Пасля аб’яўлення масіву кожны яго элемент можна апрацоўваць, указаўшы імя (ідэнтыфікатар) масіву і індэксы элемента ў квадратных дужках.
Індэксіраваныя элементы масіву называюцца індэксіраванымі пераменнымі і могуць быць выкарыстаны як простыя пераменныя.
TYPE
Array01to10 = ARRAY [ 1..10] OF Real;
Array11to20 = ARRAY [11..20] OF Real;
Гэтыя два тыпы (Array01to10 і Array11to20) па-рознаму нумаруюць свае элементы, хаця абодва ўтрымліваюць наборы з 10 значэнняў тыпу Real.
VAR
a01to10 : array01to10;
a11to20 : array11to20;
Доступ да i-га элемента масіву:
a01to10[i], i=1,…,10,
a11to20[i], i=11,…,20.
Прыклад 1.
CONST k=4; n=6;
TYPE TVector = ARRAY [1..4] OF Integer;
TMatrica = ARRAY [-4..4, -4..4] OF Real;
TMassiv = ARRAY [1..4] OF TVector;
VAR Matr : TMatrica;
Vect : TVector;
M : TMassiv; масіў масіваў}
Mas : ARRAY [1..k, 1..n] OF Char;
Доступ да элемента masij mas[i,j]. Доступ да элементаў масіву M можна ажыццявіць і так: m[i][j], і так: m[i,j].
У агульным выпадку ніхто не абавязвае аб’яўляць дыяпазон індэксаў масіву лікамі.
Прыклад 2.
TYPE
MonthType = (January, February, March, April, May);
ComplectType = ARRAY [MonthType] OF Word;
SpringType = ARRAY [March..May] OF Word;
VAR
Complect : ComplectType; {5 элементаў тыпу Word}
Spring : SpringType; {3 элементы тыпу Word}
Alpfa : ARRAY [A..Z] OF Char; {26 элементаў}
Switch : ARRAY [boolean] OF Byte; {2 элементы}
Зварот да элементаў вызначаных масіваў:
Spring[April]; Alpfa[X]; Switch[true];
Прыклад 3.
VAR
M : ARRAY[-10..0, A..C, boolean] OF Byte;
Эквівалентны запіс:
M : ARRAY[-10..0] OF ARRAY[A..C] OF
ARRAY[boolean] OF Byte;
У апошнім выпадку M[0] – масіў-матрыца тыпу
ARRAY [A..C] OF ARRAY [boolean] OF Byte;
ці
M[0] – ARRAY [A..C, boolean] OF Byte.
M[0, B] – гэта вектар тыпу ARRAY [boolean] OF Byte.
M[0, B, false] – значэнне тыпу Byte.
Выкарыстоўваць жа элементы M[0], M[0, B] даволі складана, бо трэба клапаціцца аб сумяшчальнасці тыпаў даных.
У памяці камп’ютэра масівы захоўваюцца як суцэльныя паслядоўнасці кампанентаў, пры гэтым калі ў масіве некалькі індэксаў, тады ў першую чаргу змяняецца апошні індэкс, потым перадапошні і гэтак далей да першага. Значыць, матрыцы захоўваюцца па радках:
A : ARRAY[1..5, 1..5] OF Byte;
{a[1,1], a[1,2], a[1,3],…, a[1,5], a[2,1],…, a[5,5]}
Адрас пачатку масіву ў памяці адпавядае адрасу яго першага элемента, г. зн. элемента з мінімальнымі значэннямі індэксаў.
Калі праграма ці фрагмент яе кампілюецца ў рэжыме {$R+}, тады пры звароце да элементаў масіваў будзе правярацца належнасць значэння індэкса аб’яўленаму дыяпазону, і ў выпадку памылкі (парушэнне межаў дыяпазону) узнікне памылка Range check Error.
Прыклад 4.
v : ARRAY [1..10] OF Integer;
Зварот да элемента v[11] дасць памылку на кроку кампіляцыі ў рэжыме {$R+}.
Калі ў рэжыме {$R-} узнікне аналагічная сітуацыя, праграма будзе працаваць далей, і некарэктнае значэнне індэкса можа здабыць якое-небудзь значэнне, але ўсё ж не з патрэбнага масіву. Звычайна праграму адладжваюць у рэжыме {$R+}, а эксплуатуюць пры рэжыме {$R-}.
Работа з элементам масіву займае больш часу, чым са скалярнай пераменнай, бо трэба падлічваць месцазнаходжанне элемента ў памяці. Але пры выкарыстанні масіваў праграмы становяцца больш функцыянальнымі.