Б С Бусигін - Прикладна інформатика - страница 46

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

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

8.26.2. Множини

Тип "множина" (рос.-множество) задається або перерахуванням значень (перелічимий тип), або відрізком типу, або ім'ям скалярного типу. Наприклад:

Type

Letter    = Set Of 'A'..'Z'; All = Set Of 11..88;

SubColr = Set Of   (Red, Green); AllLet    = Set Of Char;

При визначенні множин необхідно враховувати наступні обмеження:

- базисний тип - повинен бути будь-яким скалярним типом (пам'ятайте, що тип Real не є скалярним!);

- максимальне число елементів - не більш 256-ти;

- значення елементів з базисного типу повинне належати множині 0..255. Множини   можуть   обчислюватися   за  посередництвом   виразів над

множинами. Ці вирази складаються з констант, змінних і операцій.

Константи з множин - це список підмножин, що складають множину:

['A'..'Z',   'a'..'z', '0'..'9']

Змінні типу множина при використанні підкоряються спеціальному синтаксису - укладаються у квадратні дужки:

Sbyte  :=  [1,  2,   3,   4,   10,  20, 30];

Schar  :=  ['a',   'б', 'в'];

Sdiap  :=  [1..4];  {то ж, что і  [1,  2,   3, 4]}

Schar  := ['a..n','p..9'];

Empty :=  []; {Так записується порожня множина}

8.26.3. Операції застосовні до множин

Над множинами визначені наступні операції:

S1 = S2 {Рівність множин. Дорівнює True якщо S1 і S2 складаються з

тих самих значень незалежно від порядку} S1 <> S2 {Нерівність множин. Дорівнює True якщо хоч один елемент відрізняється}

S1   <=   S2 {Входження S1 у множину S2 . Перевірка на підмножину.

Дорівнює True, якщо всі елементи S1 містяться в S2, незалежно від порядку проходження} S1   >=  S2 {Включення S2 у множину S1 . Перевірка на надмножину.

Дорівнює True, якщо всі елементи S2 містяться в S1, незалежно від порядку проходження} E   in   S1 або E   in    [.. ]   {Перевірка входження (приналежності)

елемента E у множину S1 або приналежність базовому типу [.. ] } S1 + S2 {Об'єднання множин. Нова множина містить всі елементи з S1,

S2 крім тих, що дублюються} S1   -   S2 {Різниця множин. Нова множина містить елементи S1 без елементів S2 }

S1 * S2 {Перетинання множин. Нова множина містить тільки елементи, що містяться одночасно в S1 і S2 }

Наприклад.

[1, 2, 3] = [1, 3, 2] {Дасть True}

[1, 2] <>  [1],  5 in  [0..5] {Дасть True}

[1, 2] +  [3,  4] {Дасть [1, 2, 3, 4]}

[1, 2, 3,  4]  -  [3,  4] {Дасть [1, 2]}

[1, 2, 3,  4]   *   [3,  4,  5,   6] {Дасть [3, 4]}

Наведемо приклад програми, що використовує множини при перевірці натискання клавіш клавіатури (рис. 8.81).

8.26.4. Ввід-вивід даних і файлова система MS-DOS

Будь-який обмін даними припускає наявність: джерела інформації, каналу зв'язку та її приймача (рис. 8.82).

Канал зв'язку

Джерело -> Приймач

Рис. S.S2. Загальний вид процессу обміну даними

У випадку обміну даними між програмою і периферійними пристроями ПК, одним кінцем каналу обміну даними завжди є оперативна пам'ять ПК (ОЗП). Інший кінець цього каналу у Турбо Паскалі визначений як файл

(рис. S.S3).

Program ChekSymbol;

Uses Crt;

Type

Let =

Set Of 'A'..#255;

Var

 

Ch

: Char;

Yes

: Let;

No

: Let;

YesNo

: Let;

Begin

 

Yes: =

['Y', 'y', 'Д', 'д'];

No :=

['N', 'n', 'H', 'н'];

YesNo:=Yes+No;  {Об'єднання множин} Write('Пpoдoвжити?(Д/H)');

Repeat

Ch:=ReadKey;  {Функція ReadKey повертає код нажатого

символу}

Until   Ch   In   YesNo;    {Перевірка на належність Ch

множині припустимих значень відповідей користувача}

If Ch In No Then Halt;

WriteLn(Ch);  {Виводимо символ, який введений користувачем}

WriteLn('Для закінчення натисніть будь-яку клавішу ');

Repeat Until KeyPressed; End.

Рис. 8.82. Використання множин при опитуванні клавіатури

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

32S

Аналогічно при читанні з файлу зчитується не стільки, скільки запитується, а скільки уміститься в буфер. Наприклад, якщо з файлу на диску зчитується 4 числа з загального числа 64, то наступні 60 читаються вже з буферу (!).

MS-DOS

Рис. S.S3. Канали вводу-виводу в ТП

Операція виводу даних означає пересилання даних з робочої пам'яті (ОЗП) у файл, а операція введення - заповнення ячеєк пам'яті даними, отриманими з файлу.

Файлова система в ТП складається з двох рівнів: логічних файлів і фізичних файлів.

8.26.5. Поняття логічного файлу

Логічний файл описується в програмі ТП як змінна файлового типу. Після цього вона зв'язується з фізичним файлом MS-DOS і може використовуватися для операцій уведення-висновку. Так, якщо ми хочемо працювати з текстовим файлом 'A:\TEXT.DAT' , то в програмі повинні бути поміщені такі рядки:

Var

f   :   Text; {Оголошуємо логічну файлову змінну f для роботи з текстовим файлом}

Begin

      Assign( f,   'A:\TEXT.DAT');     {Пов'язуємо     фізичний файл

'A:\TEXT.DAT' на диску A: з логічним файлом f}

End.

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

8.26.6. Фізичні файли в MS-DOS

В операційній системі MS-DOS містяться два види фізичних файлів:

- файли на магнітних носіях (флоппі-диск, вінчестер, віртуальний диск);

- зовнішні пристрої MS-DOS (файлові моделі цих пристроїв).

У ТП імена файлів першого типу можуть бути строковими константами або зберігатися у строкових змінних. Наприклад:

'C:\PAS\TESTFILE.PAS' 'A:\TEST.TXT' \PRIMER.DAT'

Імена пристроїв MS-DOS мають фіксовані імена і використовуються як звичайні файли (табл.. 51).

Фізичні файли-пристрої в MS-DOS організовуються як текстові файли і для їх нормальної роботи треба зв'язувати їх імена з текстовими логічними файлами. Імена фізичних файлів-пристроїв записуються також як у простих текстових файлів: 'CON', 'PRN' і т.д.

Таблиця 8.51

Стандартні імена файлів-пристроїв MS-DOS

Ім'я

Файл-пристрій

Примітка

CON

Консоль (клавіатура й екран)

Ввід з CON - це читання з клавіатури, а вивід у CON - це запис на екран

LPT1 LPT2 LPT3

Паралельні порти виводу

Через ці імена файлів відбувається вивід даних на принтер або інші пристрої

PRN

Принтер. Синонім імені

LPT1

Ім'я для звертання до принтера, підключеного до порту LPT1

COM1 COM2

Послідовні порти

Імена файлів-пристроїв для вводу-виводу даних через серійні порти комунікації

NUL

Фіктивний пристрій

Це бездонний файл, що приймає що завгодно, але завжди порожній

Не визначена така структура даних, як файл у пам'яті ПК! Будь-який оголошений логічний файл має сенс тільки після позв'язування з зовнішнім фізичним файлом або файлом-пристроєм.

8.26.7. Файлові типи ТП

Турбо Паскаль підтримує три файлових типи (тобто способів організації зберігання різних типів даних на диску):

- текстові файли (типу Text);

- компонентні файли (типу File Of    . . .   [наприклад, Real]);

- безтипові файли (типу File).

Текстові файли - це файли, що складаються з ASCII-кодів, включаючи розширені і управляючі коди. Текстові файли організуються по рядках (рос.-строках). Кінцем рядка є спеціальний символ EOL (End Of Line - кінець рядка), що складається з двох ASCII-кодів CR = #13 (Carriage Return - повернення каретки) і LF = #10 (Line Feed - переведення рядка), які не друкуються на екрані при вводі!. Будь-яку інформацію (числову, символьну чи строкову) текстовий файл зберігає у виді послідовностей текстових (тип Char ТП) символів, що її зображують.

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

Безтипові файли теж складаються з машинних представлень даних. Їхня відмінність від компонентних файлів полягає в тому, що вони містять довільні набори байтів. Усі без винятку файли обов'язково містять у своєму кінці спеціальний код End Of File - EOF, називаний кінцем файлу.

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

8.26.8. Текстові файли

Текстовий файл можна розглядати як послідовність символів, розбиту на рядки спеціальним маркером. На практиці такий маркер уявляє собою послідовність із двох символів ASCII: повернення каретки (рос.-возврат каретки) спг(код 13) (CR - Carriage Return) і переклад рядка (рос.-перевод строки) спг(код 10) (LF - Line Feed) (див. додаток 6). Ці два символи задають стандартні дії по управлінню текстовими файлами. Зокрема, редактор ТП виводить у своєму вікні рядки тексту на основі аналізу появи пари кодів (CR/LF). Тобто, наприкінці кожного рядка завжди присутня пара цих управляючих символів. Вони вставляються в текстовому редакторі ТП наприкінці кожної рядка, ввід якого закінчується натисканням клавіші Enter. При натисканні наприкінці будь-якого рядка на клавішу Del поточний рядок і наступний поєднуються (тобто ці два символи разом вилучаються).

Для роботи з текстовими файлами використовуються спеціальні процедури:

Assign(f; Name:String) - зв'язує файлову змінну f з повним зовнішнім ім'ям файлу на диску, включаючи маршрут до нього.

AssignCRT(Var f:Text) - зв'язує файлову змінну з екраном монітора. Визначена в Unit Crt. Ця процедура необхідна у тому випадку, коли приходиться виводити інформацію на екран через файлову змінну і потрібно використовувати поточний установлений колір символів. Якщо просто використовувати процедуру Assign, то текст буде виводитися білим кольором на чорному тлі.

Append(Var f:Text) - відкриває існуючий файл для додавання рядків тексту. Якщо файл відсутній на диску, то виникає помилка вводу-виводу.

Rewrite(f) - створює новий текстовий файл, до якого можна лише додавати рядки. Якщо файл з таким ім'ям вже існує на диску, то він видаляється і створюється новий.

Reset(f) - використовується лише до існуючого файлу, після чого з цього файлу можна тільки послідовно читати. Коли новий текстовий файл закривається, до нього автоматично додається маркер кінця файлу EOF (Ctrl+Z).

Read(Var f:text, W1[,W2, ...Wn]) - розширення стандартної процедури читання Read, що дозволяє працювати зі значеннями символьного типу, читаючи інформацію з файлу (якщо він заданий, інакше з клавіатури) у задані змінні. Здійснює читання з файлу f, де W1[,W2, ...Wn] - змінні стандартного паскалевського типу, у які і містяться або символи, або числа, отримані інтерпретацією символів цифр із файлу f. Тобто, рядок із двох символів «4» і «б» інтерпретується як число 46 і т.д. Роздільниками у рядку в цьому випадку є символ пробілу, а поміж рядками - маркер кінця рядка (CR/LF).

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика