Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
оптам.docx
Скачиваний:
3
Добавлен:
24.04.2019
Размер:
204.87 Кб
Скачать

Типы данных языка Pascal

Компілятори мови Pascal вимагають, щоб відомості про обсяг пам'яті, необхідної для роботи програми, були надані до початку її роботи. Для цього в розділі опису змінних (var) потрібно перерахувати всі змінні, використовувані в програмі. Крім того, необхідно також повідомити компілятору, скільки пам'яті кожна з цих змінних буде займати. А ще було б непогано заздалегідь домовитися про різних операціях, які можна застосувати до тих чи інших змінним ... Все це можна повідомити програмі, просто вказавши тип майбутньої змінної. Маючи інформацію про тип змінної, компілятор "розуміє", скільки байт необхідно відвести під неї, які дії з нею можна робити і в яких конструкціях вона може брати участь. Для зручності програмістів у мові Pascal існує безліч стандартних типів даних і плюс до того можливість створювати нові типи. Конструюючи нові типи даних на основі вже наявних (стандартних або знову-таки визначених самим програмістом), потрібно пам'ятати, що будь-яка будівля має будуватися на хорошому фундаменті. Тому зараз ми і поговоримо про це "фундаменті". На підставі базових типів даних будуються всі інші типи мови Pascal, які так і називаються: конструюються. Поділ на базові та конструюються типи даних у мові Pascal показано в таблиці:

Базовые типы данных

Дискретные типы данных

Арифметические типы данных

Адресные типы данных

Структурированные типы данных

Целые

Вещественные

Логический

boolean

Символьный (литерный)

char

shortint

byte

integer

word

longint

real

single

double

extended

comp

Нетипизированный указатель

pointer

Конструируемые типы

Перечисляемый

week = (su, mo, tu,

we, th, fr,sa);

Типизированный указатель

^<тип>

Массив array

Строка string

Запись record

Интервал (диапазон)

budni = mo..fr;

Файл

text

file

Процедурный

Объектный1)

Типы данных, конструируемые программистом

  1. Типи даних, конструюються програмістом, описуються в розділі type за наступним шаблоном: type <імя_тіпа> = <опісаніе_тіпа>; Наприклад: type lat_bukvy = 'a' .. 'z', 'A' .. 'Z'; Базові типи даних є стандартними, тому немає потреби описувати їх у розділі type.Однак при бажанні це теж можна зробити, наприклад, давши довгим визначень короткі імена. Скажімо, ввівши новий тип даних type int = integer; можна трохи скоротити текст програми. Стандартні конструюються типи також можна не описувати в розділі type. Проте в деяких випадках це все одно доводиться робити через вимоги синтаксису.Наприклад, у списку параметрів процедур або функцій конструктори типів використовувати не можна (див. лекцію 8). Порядкові типи даних Серед базових типів даних особливо виділяються порядкові типи. Таку назву можна обгрунтувати двояко: 1. Кожному елементу порядкового типу може бути зіставлений унікальний (порядковий) номер. Нумерація значень починається з нуля. Виняток - типи даних shortint, integer і longint. Їх нумерація збігається зі значеннями елементів. 2. Крім того, на елементах будь-якого порядкового типу визначено порядок (у математичному сенсі цього слова), який безпосередньо залежить від нумерації.Таким чином, для будь-яких двох елементів порядкового типу можна точно сказати, який з них менше, а який - больше2). Стандартні підпрограми, обробні порядкові типи даних Тільки для величин порядкових типів визначені наступні функції і процедури: 1. Функція ord (x) повертає порядковий номер значення змінної x (щодо того типу, до якого належить змінна х). 2. Функція pred (x) повертає значення, що передує х (до першого елементу типу непридатна). 3. Функція succ (x) повертає значення, що випливає за х (до останнього елемента типу непридатна). 4. Процедура inc (x) повертає значення, що випливає за х (для арифметичних типів даних це еквівалентно оператору x: = x +1). 5. Процедура inc (x, k) повертає k-е значення, що випливає за х (для арифметичних типів даних це еквівалентно оператору x: = x + k). 6. Процедура dec (x) повертає значення, що передує х (для арифметичних типів даних це еквівалентно оператору x: = x-1). 7. Процедура dec (x, k) повертає ke значення, що передує х (для арифметичних типів даних це еквівалентно оператору x: = xk). На перший погляд здається, ніби результат застосування процедури inc (x) повністю співпадає з результатом застосування функції succ (x). Проте різниця між ними виявляється на кордонах допустимого діапазону. Функція succ (x) непридатна до максимального елементу типу, а от процедура inc (x) не видасть ніякої помилки, але, діючи за правилами машинного складання, додасть чергову одиницю до номера елемента. Номер, звичайно ж, вийде за межі діапазону і за рахунок усікання перетвориться на номер мінімального значення діапазону. Виходить, що процедури inc () і dec () сприймають будь-який порядковий тип немов би "замкнутим в кільце": відразу після останнього знову йде перше значення. Пояснимо все сказане на прикладі. Для типу даних type sixteen = 0 .. 15; спроба додати 1 до числа 15 призведе до наступного результату: + 1 1 1 1 1 1 0 0 0 0 Початкова одиниця буде відсічена, і тому вийде, що inc (15) = 0. Аналогічна ситуація на нижній межі допустимого діапазону довільного порядкового типу даних спостерігається для процедури dec (x) і функції pred (x): dec (min_element) = max_element Типи даних, пов'язані з порядковим Наведемо тепер порядкові типи даних більш докладно. 1. Логічний тип boolean має два значення: false і true, і для них виконуються такі рівності: 2. ord (false) = 0, ord (true) = 1, false <true, 3. pred (true) = false, succ (false) = true, 4. inc (true) = false, inc (false) = true, dec (true) = false, dec (false) = true. 5. У символьний тип char входить 256 символів розширеної таблиці ASCII (наприклад, 'a', 'b', 'я', '7 ','#'). Номер символу, що повертається функцією ord (), збігається з номером цього символу в таблиці ASCII. 6. Цілочисельні типи даних зведемо в таблицю:

Тип данных

Количество

Диапазон

байтов

битов

shortint

byte

integer

word

longint

1

1

2

2

4

8

8

16

16

32

-128..127

0..255

-32768..32767

0..65535

-2147483648..2147483647

-27..27-1

0..28-1

-215..215-1

0..216-1

-231..231-1

2. Перераховуються 3) типи даних задаються в розділі type явним перерахуванням їх елементів. наприклад: 3. type week = (sun, mon, tue, wed, thu, fri, sat)              0 1 2 3 4 5 6 Нагадаємо, що для цього типу даних: inc (sat) = sun, dec (sun) = sat. 4. Інтервальні типи даних задаються тільки кордонами свого діапазону. наприклад: 5. type month = 1 .. 12; budni = mon .. fri; 6. Програміст може створювати і власні типи даних, що є комбінацією декількохстандартних типів. наприклад: type valid_for_identifiers = 'a' .. 'z', 'A' .. 'Z','_',' 0 .. 9'; Цей тип складається з об'єднання кількох інтервалів, причому в даному випадкузмінений порядок латинських букв: якщо в стандартному типі char 'A' <'a', то тут,навпаки, 'a' <'A'. Для величин цього типу виконуються наступні рівності: inc ('z') = 'A'; dec ('0')='_', pred ('9 ') = '8'; ord ('b') = 2. Речові типи даних Нагадаємо, що ці типи даних є арифметичними, але не порядковими.

Тип

Количество байтов

Диапазон (абсолютной величины)

single

real

double

extended

comp

4

6

8

10

8

1.5*10-45..3.4*1038

2.9*10-39..1.7*1038

5.0*10-324..1.7*10308

3.4*10-4932..1.1*104932

-263+1..263-1

Оператори введення і висновку

Для уведення вихідних даних найчастіше використовується процедура ReadLn: ReadLn(A1,A2, .AK);

Процедура робить читання До значень вихідних даних і привласнює ці значення перемінним А1, А2, ., АК.

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

Значення вихідних даних можуть відокремлюватися друг від друга пробілами і натисканням клавіш табуляції і Enter.

Не допускається поділ чисел, що вводяться, комами!

Для висновку результатів роботи програми на екран використовуються процедури: Write(A1,A2, .AK);WriteLn(A1,A2, .AK);

Перший з цих операторів робить висновок значень перемінних А1, А2, .,АК у рядок екрана. Другий оператор, на відміну від першого, не тільки робить висновок даних на екран, але і робить перехід до початку наступної екранного рядка. Якщо процедура writeln використовується без параметрів, то вона просто робить пропуск рядка і перехід до початку наступної рядка.

Перемінний, складовий список висновку, можуть відноситися до цілого, дійсному, символьному чи булевскому типів. Як елемент списку висновку крім імен перемінних можуть використовуватися вираження і рядки.

Форма представлення значень у полі висновку відповідає типу перемінних і виражень: величини цілого типу виводяться як цілі десяткові числа, дійсного типу - як дійсні десяткові числа з десятковим порядком, символьного типу і рядка - у виді символів, логічного типу - у виді логічних констант TRUE і FALSE.

Оператор висновку дозволяє задати ширину полючи висновку для кожного елемента списку висновку. У цьому випадку елемент списку висновку має вид А:ДО, де А - чи вираження рядок, ДО - вираження або константа цілого типу. Якщо виведене значення займає в поле висновку менше позицій, чим ДО, то перед цим значенням розташовуються пробіли. Якщо виведене значення не міститься в ширину полючи ДО, то для цього значення буде відведена необхідна кількість позицій.

Для величин дійсного типу елемент списку висновку може мати вид А:ДО:М, де А - перемінного чи вираження дійсного типу, ДО - ширина полючи висновку, М - число цифр дробової частини виведеного значення. ДО і М - чи вираження константи цілого типу. У цьому випадку дійсні значення виводяться у формі десяткового числа з фіксованою крапкою.

Приклад запису операторів висновку: var rA, rB: Real; iP,iQ:Integer; bR, bS: Boolean; chT, chV, chU, chW: Char;begin . . . WriteLn(rA, rB:10:2); WriteLn(iP, iQ:8); WriteLn(bR, bS:8); WriteLn(chT, chV, chU, chW);end.

ЦИКЛ З ПЕРЕДУМОВОЮ Цикл з передумовою реалізується через Pascal-оператор while B do ОР1, який працює за правилом: “Якщо булевий вираз В істинний, то виконується оператор(и) ОР1. Якщо булевий вираз В – хибний, то виконання операторів ОР1 припиняється.” ЦИКЛ З ПОСТУМОВОЮ Цикл з постумовою реалізується через Pascal-оператор repeat ОР1 until В, який працює за правилом: “Якщо булевий вираз В хибний, то виконується оператор(и) ОР1. Якщо булевий вираз В істинний, то виконання операторів ОР1 припиняється.”

Оператори Turbo-Pascal. Оператор присвоєння. Складений оператор

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

begin  оператор1;  ........  операторN  end

Оператори записують в операторні дужки початок і кінець, відокремлюють один від одного крапкою з комою. Виконуються оператори в порядку запису.  Зверніть увагу, що в Паскалі символ крапка з комою служить для відокремлення операторів один від одного, а не для завершення оператора. Тому після останнього оператора (перед ключовим словом end) крапку з комою ставити не потрібно. Однак, якщо вона є, то у випадку складеного оператора цей символ сприймається як порожній оператор (оператор, який не виконує ніяких дій). В операторі if, де синтаксис вимагає запису одного оператора, наявність крапки з комою приводить до повідомлення про помилку.  Можна сформулювати таке правило:

крапку з комою після оператора пишуть завжди, крім випадків, коли наступним словом є end, until або слово else оператора if.

Оператор присвоєння має вигляд : < зміна >:=< вираз > ;

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

Вирази, присутні в операторі присвоєння, можуть бути арифметичними, логічними і рядковими. Розглянемо арифметичні вирази. До їх складу входять числа, числові змінні та константи, стандартні функції, з'єднанні арифметичними операціями та круглими дужками.

Для арифметичних операцій над числовими операндами встановлена така черговість (пріоритет) виконання:

1)обчислення функцій; 2) множення (*), ділення (/), ділення націло div), остача від ділення (mod); 3) додавання (+), віднімання (-).

Для зміни порядку виконання арифметичних операцій використовують круглі дужки. Операції одного і того ж самого пріоритету виконуються зліва направо у порядку їх появи у виразі.

Умовні оператори

Умовні оператори дозволяють вибирати для виконання ті чи інші частини програми в залежності від деяких умов. Якщо, наприклад, у програмі використовуються речові змінні x і z, і на якомусь етапі рішення задачі потрібно обчислити z = max (x, y), то бажаний результат виходить в результаті виконання або оператора присвоювання z: = x, або оператора присвоювання z: = y. Оскільки значення змінних x і y заздалегідь невідомі, а визначаються в процесі обчислень, то в програмі необхідно передбачити обидва ці оператора присвоювання. Однак насправді повинен виконатися один з них. Тому в програмі має бути вказівка ​​про те, в якому випадку треба вибирати для виконання той чи інший оператор присвоювання. Ця вказівка ​​природно сформулювати з використанням відносини x> y. Якщо це відношення при поточних значеннях x і y справедливо (приймає значення true), то для виконання повинен вибиратися оператор z: = x; в іншому випадку для виконання повинен вибиратися оператор z: = y (при x = y байдуже, який оператор виконувати,так що виконання оператора z: = y в цьому випадку дасть правильний результат). Для завдання подібного роду розгалужуються обчислювальних процесів у мовах програмування існують умовні оператори. Розглянемо повний умовний оператор Паскаля:

if B then S1 else S2 Тут if (якщо), then (то) і else (інакше) є службовими словами, В - логічне вираження, аS1 та S2 - оператори. Виконання такого умовного оператора в Паскалі зводиться до виконання одного з вхідних в нього операторів S1 або S2: якщо задане в операторі умова виконується (логічний вираз У приймає значення true), то виконується оператор S1, в іншомувипадку виконується оператор S2. Алгоритм рішення згаданої вище завдання обчислення z = max (x, y) можна задати у вигляді умовного оператора Паскаля.

Оператор вибору.

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

Загальний вигляд оператора вибору варіанту:

case <вираз-селектор> of <список констант 1>:<оператор 1>; ................................  <список констант N> : <оператор N>; else <оператор> end;

Оператор case виконується наступним чином. Спочатку обчислюється значення < виразу - селектора >, потім реалізується той оператор, константа вибору якого співпадає із значенням селектора. Якщо ні одна з констант не рівна значенню селектора , то виконується оператор, що стоїть за службовим словом else. Якщо else відсутнє, то активізується оператор, що знаходиться за словом end, тобто наступний оператор після case. Селектор повинен відноситися до одного з цілочисельних типів (що знаходяться в діапазоні –32768 .. 32767), булевого, символьного чи типу користувача. Забороняється використання селектора дійсного чи рядкового типу. Список констант вибору складається з довільної кількості значень чи діапазонів, відділених один від одного комами. Границі діапазону записується двома константами через розподільник "..". Тип констант в будь-якому випадку повинен співпадати із типом селектора.

Приклад.

case I of 1: Z:=I+10; 2: Z:=I+100; 3: Z:=I+1000 end;