Житомирський військовий інститут
Національного авіаційного університету
Реферат
на тему:
Типи даних в Turbo Pascal
Житомир 2010
Структура типів даних
Будь-яка константа, змінна, значення функції або виразу характеризується своїм типом. Тип цих об’єктів визначає множину допустимих значень, які може мати об’єкт, а також множину допустимих операцій над об’єктами. Крім того тип визначає і формат внутрішнього представлення значення об’єкту.
Класифікація типів даних
Тип цих об’єктів визначає множину допустимих значень, які може мати об’єкт, а також множину допустимих операцій над об’єктами. Крім того тип визначає і формат внутрішнього представлення значення об’єкту.
Прості типи даних
До простих відносять реальні та порядкові типи даних.
Порядкові типи характеризуються кінцевим числом можливих значень. Ці значення можна упорядковувати (звідки і назва) будь-яким чином, так, що кожному з них можна зіставити деяке ціле число – порядковий номер значення.
Реальні типитакож мають кінцеве число значень, але їх кількість дуже велика, тому кожному з них зіставити ціле число просто неможливо.
Порядкові типи
До порядкових типів відносяться: цілі, логічні, символьні, переліку та тип-діапазон.
До будь-якого з них можна використати функції:
ORD(Х) – порядковий номер значення;
PRED(X) – порядковий номер попереднього значення;
SUCE(X) – порядковий номер наступного значення;
ORD(PRED(X))=ORD(X)-1;
ORD(SUCE(X))=ORD(X)+1.
Цілі типи
Опис:
Var : integer;
Тип
Діапазон значень
Довжина, байт
Byte
0…255
1
Word
0…65535
2
Integer
-32768…32767
2
ShortInt
-128…127
1
LongInt
-2147483648…2147483647
4
Byte– довжина в байт;
Word– довжина в слово;
Integer– ціле;
ShortInt – коротке ціле;
LongInt – довге ціле.
Над цілими типами визначені операції: “+”, “-“, “*”, div – цілочислове ділення.
При використані процедур і функцій з цілочисловими параметрами слід керуватися відповідністю діапазонів типів. Наприклад: integerвходить в longint, byte і т.д.
Якщо в виразі використані різні типи, то вони приводяться до базового типу – min потужності цілого типу, який не містить результат. Наприклад, integer та shortint, базовим є integer.
Логічний тип (BOOLEAN)
Значенням цього типу може бути одна з двох констант FALSE або TRUE.
Для них справедливі правила:
ORD (FALSE) = 0;
ORD (TRUE) = 1;
FALSE
Крім того є 4 стандартні логічні операції:
AND – логічний добуток (*);
OR – логічна сума;
XOR – сума по модулю “2”;
NOT – логічне заперечення (унарна операція).
Наприклад:
А = TRUE;not A=B
B = FALSEnot B=A
A and B=B A or B=A A xor B=A
A and A=A (TRUE) B or A=A B xor A=A
B and A=B A or A=A A xor A=B
B and B=B B or B=B (FALSE) B xor B=B
Опис:
Var : boolean;
Символьний тип (CHAR)
(character – символ).
Значення символьного типу є множиною всіх символів ПК. Кожен символ має код у диапазоні 0…255, так званий ASCII (American Standard Code for Information Interchange). Для представлення символів використовують апострофи: ‘A’, ‘B’, ’*’, ’”’, …
Опис:
Var : char;
Символьні значення можна вводити, виводити, присвоювати, порівнювати (при порівнянні використовується порядковий номер коду ASCII).
Стандартні символьні функції:
СHR(код символу) – повертає відповідний символ;
ORD (S)– повертає код символу S.
Приклад:
var y: char;
begin
y:=’b’;
writ
eln ( ‘y:’; pred(y):5, y:5, succ(y):5);
end.{Результат на екрані: y: a b c}
Тип переліку
Задається переліком тих значень, які він може отримати. Кожне значення іменується ідентифікатором і розташовується в круглих дужках через кому:
type
season = (winter, spring,summer, outumn);
Значенням присвоюються порядкові номери: 0,1,2,3…255.
Наприклад: ord (summer) = 2.
Значення можуть бути тільки іменними. Їх можна присвоювати і порівнювати, але не можна вводити і виводити операторами READ іWRITE.
Приклад:
type
season = (win, spr, sum, out);
var
b: byte;
c: season;
begin
readln(b);
c:= season (b);
case c of
win: writeln(‘winter’);
spr: writeln(‘spring’);
sum: writeln(‘summer’);
out: writeln(‘outumn’);
end
end.
Тип – діапазон
Визначається як інтервал значень базового типу (раніш визначеного), яким може бути будь-який порядковий тип:
ім’я> = >..maxзначення>;
Приклад:
type
day = 1..31;
month = 1..12;
letter = ‘A’..’Z’;
При визначенні типа-діпазона, слід користуватись правилами:--PAGE_BREAK--
а) – це один символ(без пробілу);
б) ліва границя не повинна перевищувати праву;
в) ім’я повинно бути правильним ідентифікатором (починатись з букви, не співпадати зі службовими словами, тільки латинські букви, цифри та підкреслення).
Реальний тип
Позначає множину дійсних значень в різних діапазонах. ТР підтримує декілька реальних типів, характеристики яких представленні в таблиці:
Тип
Діапазон значень
Число цифр
Довжина байт
Single
1.5Е-45…3,4Е38
7…8
4
Real
2,9Е-39…1,7Е38
11…12
6
Double
5Е-324…1,7Е308
15…16
8
Extended
3,4Е-4932…1,1Е4932
19…20
10
Comp
1Е-20…1Е20
19…20
8
Реальні типи можна зобразити з фіксованою і плаваючою комами: (17.38) (1738Е-2)
Для прискорення обчислень, можна переопреділяти тип REAL:
type
real = double; або
type
real = extended;
Функції перетворення реальних типів до цілочислених:
Round– округляєreal до ближнього цілого;
Trunc – усікає real шляхом відкидання дробної частини.
Структуровані типи. Масиви даних
Масиви – тип даних, який складається з фіксованої кількості елементів одного типу.
Опис масиву можна виконувати як у розділі TYPE, так і VAR.
TYPEім’я масиву> = ARRAY[діапазон]OFтип компонент>.
(ідентифікатор)(тип індексу)(базовий тип)
Тип індексу (діапазон) – будь-який порядковий тип, зокрема LongInt. Тип компонент – будь-який тип ТР, або інший масив.
Приклад:
type
M1 = array [1..100] of real;
Mat2 = array [1..10] of array [1..20] of integer;
var
vector: M1;
Arr1, Arr2: Mat2;
Інакше
var ідентефікатор> : array [діапазон] ofтип>;
Приклад:
var vector: array [1..100] of real;
Над змінними масивів можна виконувати операції присвоювання і порівняння.
Арифметичні дії, введення та виведення не можна виконувати над послідовностями, але можна над їх окремими елементами.
Елемент масиву виділяється конкретним значенням індексу. Наприклад:
var X: array [0..99] of real;
Тоді Х[0]– перший елемент, Х[1] – другий і т.д. Масив може бути одномірним, двомірним і т.д. Наприклад:
var mat2: array [1..10,1..20] of integer;
Компоненти масиву позначаються: Mat2 [1,3]; Mat2 [5,8] … Так і організовується доступ до елементів двомірних масивів.
Приклад:
Введення значень у масив М.
var M: array [ 1..10 ] of integer;
i: integer;
begin
i := 0;
repeat
i := i+1;
read ( M [ i ] )
until i = 10
end.
Обчислити значення функції Yi=(a+b+xi)/2, якщо а і b – фіксовані значення; x={3,8,12,20,25}, i=1,N.
var
A,B: real;
i, N: integer;
X, Y: array [1..5] of real;
begin
read (A, B, N);
for i := 1 to N do
begin
read ( X [i] );
Y [i] := (A + B + X[i])/2;
write ( Y [i] );
end
end.
3). Введення одномірного масиву і виведення у вигляді:
а) вектора-рядка;
б) вектора-стовпчика.
a) var M: array [1..10] of real;
i: integer;
begin
i := 0;
repeat
i := i + 1;
reat (M [i] );
until i =10 ;
for i := 1 to 10 do
write (X [i]: 5: 2,’’);
end.
b) var
M: array [1..10] of real;
i: integer;
begin
i := 0;
repeat
i := i + 1;
read (M [i] );
until i =10 ;
for i := 1 to 10 do
writeln (X [i]: 5: 2);
end.
Стандартні модулі ТР. Їх призначення
Модуль – це окремо транслюєма програмна одиниця.
Підключення модуля до програми виконують за допомогою ключового слова:
USESім’я модуля>
Основна частина засобів ТР розташована в стандартних модулях, які поставляються разом з компілятором.
Існує вісім стандартних модулів: SYSTEM, DOS, CRT, PRINTER, GRAPH, OVERLAY, TURBO3, GRAPH3.
Модуль SYSTEM– основний, в який входять всі процедури і функції стандартного Паскаля і ТР. Він підключається автоматично і не потребує запрошення USES.
Модуль DOS– призначений для забезпечення інтерфейса з програмами ОС.
Модуль CRT – містить засоби керування дисплеєм в текстовому режимі, клавіатурою, динаміком. За допомогою його процедур можна змінювати колір, створювати вікна, звукові тона.
Модуль PRINTER– забезпечує зв’язок між процесором і принтером.
Модуль GRAPH– містить 90 графічних процедур і функцій, які дозволяють відтворювати на екрані точки, відрізки, кола та ін. фігури різних кольорів і розмірів; засоби замальовування та виводу тексту у графічному режимі.
Модуль OVERLAY – розбиває великі програми на сегменти перекриття (оверлейні сегменти), які використовують загальну область пам’яті.
Модуль TURBO3 i GRAPH3 – для сумісності з версією ТР 3.0.
SYSTEM, CRT, DOSрозміщені у файлі TURBO.TPL. GRAPH– окремий файл GRAPH.TPU.
Всі модулі крім SYSTEM стають доступними після їх підключення:
USES. продолжение
--PAGE_BREAK--
Стандартні функції і оператори роботи з рядками
Символьні масиви
Символьний тип даних дозволяє працювати з окремими символами тексту. Для обробки більшої кількості текстових одиниць використовують символьні масиви або рядкові типи даних.
Розглянемо одномірні масиви, які складаються з елементів символьного типу (char). Наприклад:
var
S: array [ 1..12] of char;
Паскаль містить деякі додаткові засоби роботи з такими масивами:
Конкретні значення символьних масивів записують за допомогою зображення рядка та використання їх в присвоюванні та передачі параметрів:
S: = ‘Приклад рядка’;
Зображення рядка будується з символів масиву і обмежується апострофами.
Якщо необхідно задати апостроф, то його подвоюють {‘ ” ’}.
Допускають формування рядків з використанням десяткових кодів символів і спеціальних позначень: ( #7#17C^A^B…)
Для символьних масивів допускають операцію “+” – конкатенації (зчеплення, поєднання). Смисл операції полягає у формуванні нового символьного масиву, кількість елементів якого дорівнює сумі розмірів масивів – операндів, а значення елементів – елементи масивів, які розміщюються послідовно один за одним.
Приклад:
var S1: array [1..8] of char;
S2: array [1..5] of char;
begin
S1 := ’рядковий’;
S2 := ’масив’;
writeln (S1+’ ’+S2); {результат на екрані: Рядковий масив}
end.
! Особливість:!
в операторах присвоювання рядків символьним масивам необхідна точна відповідність довжини рядків і розмірів масивів;
операція конкатенації для символьних масивів не допускається у правій частині присвоювання. Наприклад:
S := S1+’ ’+S2; {помилка}
У таких випадках необхідно використовувати рядки, тобто рядкові типи даних.
Визначення рядкового типу даних
Рядкові типи даних є одним з розширень мови Паскаль, які найбільш використовуються. Рядковий тип узагальнює поняття символьних масивів, дозволяє динамічно змінювати довжину рядка.
При використанні у виразах рядок обмежується апострофами. Кількість символів в рядку (довжина рядка) може динамічно змінюватись від 0 до 255.
Для визначення рядкових даних використовується ідентифікатор STRING, за яким у квадратних дужках вказується максимальна довжина рядка. Якщо значення не вказане, то по замовченню довжина рядка встановлюється 255 байт.
Приклад:
Line: string [80];
Line 1: string ;
Line 2: string [255].
В приведеному прикладі змінна Line може мати будь-яку послідовність символів (кожен з яких має стандартний тип char) довільної довжини в межах від 0 до 80 символів; Line1 і Line2 – від 0 до 255 символів.
Таким чином, важливіша різниця між рядками і символьними масивами, що рядки можуть динамічно змінювати свою довжину.
Змінну рядкового типу визначають у розділі опису типів, або безпосередньо у розділі опису змінних.
Рядкові дані також можна використовувати у програмі як константу.
Формат:
type
= string [max довжина рядка];
var
: ;
або
var
: string [max довжина рядка];
Приклад:
const address = ‘пл. Соборна, 1’;
type line = string [125];
var
S1: Line;
S2: string;
S3: string [50];
Механізм динамічних рядків реалізований в мові Турбо-Паскаль достатньо просто. Для рядкових змінних пам’ять виділяється відповідно максимального значення, а використовується лише частина, яка реально зайнята символами рядка у даний час, тобто для N символів виділяється N+1 байт пам’яті, із яких N байт призначено для зберігання символів рядка, а 1 байт – для значення поточної довжини цього рядка:
Елементи рядка нумеруються цілими числами, починаючи з 1. Це іноді використовують для визначення поточної довжини рядка, наприклад:
line:= ‘ ’; {пустий рядок}
writeln (ORD (line [0] )); {на екрані число 0}
line: =‘ABCD’;
writeln (ORD (line [0] )); {на екрані число 4}
Однак, для визначення поточної довжини рядка, як правило, використовують стандартну функцію length, яке повертає ціле значення поточної довжини рядка. Але це ми розглянемо далі.
У разі присвоювання рядковій змінній виразу з довжиною більше ніж максимально допустимо для даної змінної, то символи за межами максимальної довжини не використовуються (вилучаються). Ця ситуація не є помилковою, тому переривання виконання програми у даному випадку не відбувається. Наприклад:
var line: string [4];
begin
line := ‘дуже довгий рядок’;{на екрані: дуже}
writeln (line);
end.
Таким чином рядки можуть динамічно змінювати свою довжину.
Основні операції над рядковими даними
Над рядковими даними виконують такі операції:
1. присвоювання (:=);
2. введення (Read);
3. виведення (Write);
4. поєднання (зчеплення, конкатенації – „+”);
5. порівняння (відношення).
Перші три операції виконуються стандартно, без особливостей. Тому розглянемо дві останні операції.
Операція конкатенації
Використовується для зчеплення декількох рядків в один, причому довжина результуючого рядка не повинна перевищувати 255 символів (або вказану довжину N). Інакше останні символи будуть відкинуті.
Приклади:
st := ‘a’+’b’;
st := st + ‘c’;
writeln (‘st = ‘, st){результат st =abc}
var st: string [2];
begin
st :=’1’ + ‘2’ + ‘3’;
writeln (st){на екрані 12}
end.
Операція порівняння (відношення)
Проводить порівняння двох рядкових операндів за допомогою стандартних операторів: =, , >, =,
Правила порівняння:
Порівняння проводиться зліва-направо з урахуванням внутрішнього кодування символів таблиці ASCII. Рядок буде більшим, якщо перший не співпадаючий символ має більший номер.
У менший по довжині рядок додаються символи значення CHR(0). Тому при однакових, символах короткий рядок завжди менше довгого рядка.
Результат виконання операції завжди має логічний тип і приймає значення TRUEабо FALSE.
Приклади:
1) ‘ “ ‘
2) ‘A’ > ‘1’ TRUE
3) ‘AB’ = ‘A’FALSE
4) ‘ABC’ > ‘AB’TRUE
5) ‘12’
Cтандартні засоби обробки рядків: процедури і функції
Функції:
1. CONCAT(S1,S2,…,SN) – функція типу STRING. Виконує послідовне поєднання рядків S1,S2,…,SN, кожен з яких є вираз рядкового типу (STRING). Результатом є рядок не більше 255 символів. Дана функція еквівалентна операції конкатенації: ‘S1’ + ‘S2’ + ‘S3’…
2. COPY(st: STRING; index: INTEGER; count: INTEGER): STRING або COPY (st, index, count).
Функція копіює (повертає) частину рядка, виділеного з рядка st, довжиною countсимволів, починаючи з символу під номером index.
3. LENGTH(st: STRING) функція типу INTEGER повертає довжину рядка.
4. POS(subst, st: STRING): BYTE. Функція шукає у рядку st рядок subst. Результатом є номер позиції, де рядок subst зустрічається перший раз. Якщо рядок subst не знайдено, то результатом буде 0 (нуль).
5. UPCASE(ch) – функція типу CHAR. Повертає для символьного виразу ch, яке повинно представляти собою рядкову (маленьку) латинську букву, відповідно їй велику букву. Якщо значенням функціїch є будь-який інший символ (в тому числі рядкова буква російського алфавіту), функція повертає його без змін.
Процедури:
1. DELETE(st: STRING; index, count: INTEGER) або DELETE(st, index, count)– процедура вилучає (знищує) count символів у рядку st починаючи з символу під номером index.
2. INSERT(subst: STRING; st: STRING; index: INTEGER) або INSERT(subst, st, index). – процедура вставляє рядок substу рядок st, починаючи з символу під номером index.
3. STR(X [:width[:decimals]]; st: STRING) – процедура перетворює число Х (real або integer) в рядок символів st так, як це робить це робить процедура WRITELN перед виводом. Параметри width і decimals(якщо вони присутні, тобто дужки [ ] показують на необов’язковість цих параметрів) задають формат перетворення: загальну ширину поля для представлення числаХ (width) та кількість символів дрібної частини (decimals), якщо X: REAL.
4. VAL(st, x, code) – процедура перетворює рядок символів st в значення числової змінної X (визначеного типу). Параметр code = 0, якщо перетворення пройшло успішно, тоді X дорівнює результату перетворення. Якщо виявляється помилковий символ у рядку st, то значення Х не змінюється, а codeдорівнює номеру позиції з помилковим символом.
! Особливість!: Недопустимими є пропуски (пробіли) праворуч числа у рядку st!
val (‘123_ _’, x, k){помилка, x – не змінюється, k=4 };
val (‘_ _123’, x, k){вірно, x=123, k=0 };
Приклади:
varx: real;
y: integer;
st, st1: string;
begin
st := concat (‘12’, ‘345’);{рядок st містить 12345}
st1 := copy (st, 3, Length(st)-2); {st1 містить 345}
insert(‘-’, st1, 2); {рядок st1 містить 3-45}
delete(st, pos(‘2’, st), 3); {рядок st містить 15}
str(pi: 6: 2, st ); {рядок st містить 3,14}
val (‘3.1415’, x, y); {y містить 2, х без змін}
end.
Висновок
Таким чином над рядками можна виконувати операції присвоювання, порівняння, з’єднання (конкатенації), введення та виведення. Для цього використовують широкий набір процедур та функцій.