Спеціалізація шаблонів класу

Можна спеціалізувати шаблон класу, передбачивши для специфічних типів явну реалізацію деяких методів. Наприклад:

const int defSize=100;

template<class T>

Class Array

{public:

Array(int size=defSize){

//...

}

~Array()

{

//...

}

void add(T item);

protected:

//елементи даних

};

void Array<char*>::add(char*str)

{//...

cout<<"метод для типу char";

}

template<class T>

void Array<T>::add(T t)

{//...

cout<<"загальний метод";

}

У прикладі визначається спеціалізований варіант методу add для типу <char*>. Наступний приклад демонструє результат заміни цього методу:

Int main(void)

{int i1=10;

Array<int>iArray;

iArray.add(i1);

char*msg="Hello,world!";

Array<char*>strArray;

strArray.add(msg);

return 0;}

Можна також передбачити повне перевизначення шаблона класу, що служить для роботи з деяким особливим типом. При спеціалізації цілого шаблонного класу треба передбачити визначення:

a спеціалізованого шаблонного класу, помістивши його після визначення узагальненого;

a для всіх елементів-функцій.

Розглянемо таку задачу. Нехай маємо у файлі array.h описаний вище шаблонний клас Array і визначений деякий тип користувача у файлі string.h. Тоді можемо записати

#include <string.h>

#include "array.h"

class Array<string>

{public:

Array(int size=defSize)

{//…

}

~Array()

{//...

}

void add(string str,int indx=-1);

};

void Array<string>::add(string str,int indx=-1)

{//тіло функції

}

Int main(void)

{int i1=10;

Array<int>iList;

iList.add(i1);

string str("Добрий ранок!\n");

Array<string>sList;

sList.add(str);

return 0;}

Реалізація шаблонів С++ не дозволяє перевантажити ім'я шаблона класу. Наприклад, не можна визначити одночасно Array<class T> та Array<class T,int size>.

Недоліки шаблонів:

a програма міститиме повний код представників шаблона для кожного з породжувальних типів. Це може збільшити розмір виконуваного модуля;

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

Завдання для самостійної роботи

1. Вивчити роботу наведеного нижче шаблона для різних типів даних щодо швидкодії програми:

template<class T>inline const T& min(const T& t1,const T& t2)

{return t1>t2? t2:t1;}

template<class T>inline const T& max(const T& t1,const T& t2)

{return t1>t2? t1:t2;}

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

3. Написати функціональний шаблон сортування масиву елементів довільного типу (включаючи класи користувача).

4. Доповнити та протестувати приклад шаблонного класу Аrray.

5. Описати шаблон деякого класу з опцією Global і відповідний шаблон з опцією External в іншому модулі. Скомпілювати та протестувати програму.

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

а) параметри при виклику функції точно відповідають тим, що вказані при її описі;

б) параметри при виклику точно не відповідають указаним при описі, але існує шаблон, який дозволяє згенерувати функцію з точною відповідністю параметрів;

в) не існує функції чи шаблона з точною відповідністю параметрів, але ми діємо за правилами перетворення типів.

7. Розробити тип даних string для роботи з рядками, визначивши для нього операції додавання й віднімання.

8. Розробити тип даних vector (для роботи з векторами), визначивши для нього операції додавання й віднімання.

9. Розробити тип даних matrix (для роботи з матрицями), визначивши для нього операції додавання й віднімання.

10. Розробити тип даних complex3 (для роботи з числами вигляду a+ib+jc, а,b,c є R, де i,j – уявні одиниці, i*i=-1, j*j=-1,i*j=0), визначивши для нього операції додавання й віднімання.

11. Розробити тип даних masyv (для роботи із масивами), визначивши для нього операції додавання й віднімання та передбачивши контроль виходу індексу за задану границю.

12. Розробити тип даних set (для роботи з множинами), визначивши для нього операції додавання й віднімання.

13. Розробити тип даних spysok (для роботи з динамічними змінними), визначивши для нього операції додавання як дописування в кінець і віднімання – як вилучення зі списку.

14. Розробити тип даних file (для роботи з файлами), визначивши для нього операції додавання й віднімання як конкатенацію й вилучення однакових елементів.

15. Розробити тип даних file (для роботи з файлами), визначивши для нього операції додавання й віднімання як конкатенацію й вилучення однакових елементів.

16. Розробити тип даних integral (для обчислення інтегралів функцій), визначивши для нього операції додавання й віднімання.

17. Розробити тип даних SLAR (для зображення систем лінійних алгебраїчних рівнянь), визначивши для нього операції додавання й віднімання.

18. Розробити тип даних inthuge (для роботи з цілими числами, розмір яких виходить за межі розмірів стандартних типів даних мов програмування), визначивши для нього операції додавання й віднімання.

19. Розробити тип даних permanent (для обчислення й зображення компонент матриць), визначивши для нього операції додавання й віднімання.

20. Розробити тип даних differencial (для запису лінійних диференціальних рівнянь n -го порядку), визначивши для нього операції додавання й віднімання.

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

22. Розробити тип даних shape (для зображення опуклих багатокутників у просторі R2), визначивши для нього операції додавання як об'єднання вершин і віднімання як теоретико-множинне віднімання множини вершин.

23. Розробити тип даних sitka (для зображення множини точок, що є вузлами деякої сітки з довжиною сторони D у визначеній обмеженій області), визначивши для нього операції додавання й віднімання.

24. Розробити тип даних tablycia (для зображення й виведення числової інформації у вигляді таблиці), визначивши для нього операції додавання й віднімання.

25. Розробити тип даних vkazivnyk (для роботи з покажчиками), визначивши для нього операції віднімання й додавання до цілого числа.

26. Розробити тип даних polar (для роботи з комплексними числами в полярній системі координат), визначивши для нього операції додавання й віднімання.

27. Розробити тип даних polinom (для роботи з багаточленами), визначивши для нього операції додавання й віднімання.

28. Розробити тип даних function (для роботи з функціями, що повертають цілі числа й мають один параметр типу int), визначивши для нього операції додавання, віднімання, побудови графіка тощо.

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

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

31. Розробити клас, що зображує факультет. Факультет характеризується повною й короткою назвою, інститутом, до якого він належить, і списком навчальних груп. Інститут характеризується назвою та адресою. Група характеризується назвою, кількістю студентів і середнім балом за підсумками останньої сесії. Забезпечити можливість отримувати відповідну інформацію про факультет, успішність студентів тощо та редагувати її.

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

33. Розробити клас, що зображує методичний посібник. Посібник характеризується автором, назвою, дисципліною й кількістю видач примірників. Видача примірників характеризується датою та ім’ям студента. Автор характеризується ім’ям, прізвищем і назвою кафедри. Забезпечити можливість отримувати відповідну інформацію про посібник і редагувати її.

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

35. Розробити клас, що зображує студентську групу. Група характеризується факультетом, номером і списком студентів. Студент характеризується ім'ям, прізвищем і середнім балом за останню сесію. Факультет характеризується назвою й фахом. Забезпечити можливість отримувати відповідну інформацію про групу й редагувати її.

36. Розробити клас, що зображує університет. Університет характеризується назвою, вулицею, номером будинку, списком факультетів і ректором. Ректор характеризується ім’ям, прізвищем і вченим ступенем. Факультет характеризується назвою, фахом і кількістю студентів. Забезпечити можливість отримувати відповідну інформацію про університет і редагувати її.

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

38. Розробити клас, що зображує навчальний корпус інституту. Навчальний корпус належить до інституту і характеризується назвою та списком аудиторій. Інститут характеризується адресою й назвою. Аудиторія характеризується номером, місткістю і зайнятістю (зайнята/не зайнята). Забезпечити можливість отримувати відповідну інформацію про навчальний корпус і редагувати її.

39. Написати програму моделювання роботи аеродрому (можна використати клас Літак і похідні від нього). Аеродром може обслуговувати одночасно не більше k літаків. Якщо посадки вимагають більше k літаків, то зайві мають чекати дозволу. Якщо паливо закінчується, то літак падає. Аеродром обслуговує кожен літак деякий фіксований час, що залежить від його типу. Процес надходжень літаків вважати пуассонівським з деяким параметром (інтервал між надходженням літаків виражається співвідношенням

,

де – деякий параметр, – випадкова величини, що має рівномірний розподіл на (0,1)). Аеродром має функціонувати заданий час. Процес функціонування відобразити графічно.

40. Написати програму моделювання океану. Океан повинен мати три типи елементів: 1 – Риби; 2 – Хижаки, що поїдають риб і собі подібних; 3 – Перешкоди. Моделювання здійснити поетапно. На кожному етапі моделювання кожен живий об'єкт (риба, хижак):

а) аналізує простір навколо себе;

б) здійснює певні дії, якщо може (хижак поїдає жертву);

в) рухається в можливому напрямку. Стан океану відобразити графічно.

Сам океан можна задати за допомогою статичного двовимірного масиву покажчиків на клас Океан, що є полем класу Океан. Кожен елемент масиву при ініціалізації є адресою елемента одного з трьох похідних від базового класу (Риба, Хижак, Перешкода)або NULL, якщо в певному місці океану нічого немає.

41. Нехай маємо позитивно, негативно заряджені та нейтральні однотипні частинки, які рухаються з певними швидкостями, розміщені:

а) в обмеженій частині площини;

б) у тривимірному просторі.

Кожна заряджена частинка має заряд певної величини. Сила взаємодії зарядів пропорційна відстані між ними (однойменні відштовхуються, різнойменні – притягуються). При наближенні різнойменних частинок на відстань вважатимемо, що вони утворюють дві нейтральні. При наближенні зарядженої та нейтральної частинок на відстань заряджена віддає нейтральній половину заряду. Швидкість руху пропорційна силі, що діє на частинку. Побудувати модель руху частинок і визначити результат через деякий час. Дати графічну інтерпретацію.

42. Побудувати модель повітряної битви літаків:

а) є два однотипних літаки, що не рухаються (зависли в повітрі), які по черзі випадково стріляють один в одного. Битва закінчується, якщо один з літаків переміг (Клас Літак має поля: життя, координати, функції стрільби.);

б) запрограмувати попередній випадок, зробивши літаки рухомими;

в) надати літакам додатковий параметр – область видимості. Якщо один з літаків потрапляє в область видимості іншого, то постріл другого відбувається майже напевно (з невеликою ймовірністю похибки);

г) ввести поля паливо та боєприпаси. Якщо паливо закінчується, то літак стає нерухомим;

д) поширити останній варіант на групу об'єктів;

е) вводити в бій літаки різних типів (типи визначаються максимальними значеннями найпростіших параметрів – кількістю боєприпасів, пального);

є) додати можливість дозаправки й відновлення боєприпасів у повітрі через введення особливих транспортних літаків, які також можуть збиватись;

ж) ввести n типів зброї на літаках і n відповідних систем захисту від кожного типу зброї. Якщо певний тип захисту знищено, то відбувається зменшення змінної життя літака;

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

і) ввести можливість нападу на ворожі аеродроми та їх знищення.

Координати ворожих баз спочатку невідомі. Аеродроми мають потужну систему захисту.

43. Моделювання організму:

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

б) у клітину ввести масив покажчиків на клас Клітина, у якому зберігаються адреси сусідніх клітин. У процесі моделювання звичайна клітина стає плазмоклітиною випадково. Плазмоклітини випадково генерують антитіла, які можуть дифундувати (переходити) з клітини в клітину довільно. Довільна клітина в деякий момент часу може мати певну кількість антитіл, що є особливими утвореннями. Клітина повинна мати температуру та "знати" температури сусідів. Якщо температура одного з сусідів збільшується, то її температура також зростає, наприклад за законом , де – попередня температура клітини, – нова, – температура сусідньої клітини, – загальна кількість клітин організму (або якась константа);

в) описати вірусну клітину як особливий тип. Можна вважати, що довільна клітина чи група клітин у певний момент часу можуть стати вірусними. При виникненні вірусної клітини створюється конфліктна ситуація, під час якої зростає температура сусідніх здорових клітин (закон зростання залежить від потужності вірусу, наприклад , де p – потужність вірусної клітини, s – деяка константа), а потім – усього організму (закон подальшої зміни – див. п. а)). Антитіла рухаються з певною швидкістю (фіксованою для кожного організму) в напрямку збільшення температур. Якщо в якийсь момент часу сумарна потужність антитіл у сусідніх з вірусною клітинах стає більше потужності вірусної клітини, то остання стає здоровою й набуває кількість антитіл, що дорівнює різниці їх вихідної сумарної кількості в клітинах, які боролися з вірусною, і потужності вірусної клітини. Тоді боротьба починається з іншою вірусною клітиною, температури перерозподіляються. Якщо всі сусіди клітини стали здоровими, то її температура зрівнюється з температурою сусідів. Якщо потужність вірусу така, що кількість антитіл сусідньої клітини не може компенсувати її, то вірус заражує відповідну клітину, і вона сама стає вірусом з потужністю, рівною різниці потужності вірусу й кількості антитіл у ній. Якщо заражено більше половини клітин організму, то він гине;

г) ввести залежність потужності вірусів від температури організму.


АВТОМАТНА ТЕХНОЛОГІЯ

Програмування

Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного

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

Ми розглядатимемо не загальну теорію СА (хоча й вивчимо деякі властивості й визначення), а "автоматний" стиль мислення для розв’язання задач певного класу.

Модель СА – така сама алгоритмічна модель, як і блок-схема. Проте автомат має якості, яких у ній немає. Принциповою суттю СА є наявність станів, на основі яких відбуваються всі дискретні перетворення.

Скінченний автомат як формалізм. Роботу лексичного аналізатора краще описувати формалізмом СА.

Означення 9.1. СА – це п'ятірка (К, VT, F, H, S), де

К –скінченна множина станів; VT –скінченна множина допустимих вхідних символів; F –відображення множини K × VTK, що визначає поведінку автомата; відображення F часто називають функцією переходів; H К – початковий стан; S K – завершальний стан (або скінченна S K завершальних станів). F (А, t) = B означає, що зі стану А по вхідному символу t відбувається перехід у стан B.

У кожен поточний момент часу СА може перебувати в одному з можливих станів (кількість станів, у яких може знаходитися СА, скінченна). Автомат послідовно прочитує символи вхідного тексту (рядки). Кожен прочитаний символ або переводить автомат у новий стан, або залишає його в поточному. Формально автомат можна описати за допомогою функції переходів. Її аргументами є попередній стан автомата і поточний прочитаний символ, а значенням – новий стан автомата.

СА зручно задавати діаграмою його переходів або станів. Діаграма є орієнтованим графом, вершинами якого є однойменні стани автомата; дуга з вершини qi у вершину qk з надписаною над нею літерою аj проводиться тоді й тільки тоді, коли F (qi, аj)= qk, тобто коли автомат зі стану qi під впливом аj має перейти в стан qk. У разі, коли перехід з qi у qk здійснюється під впливом будь-якої з літер деякої підмножини S, S Í А, усі літери цієї підмножини підписуються над відповідною дугою. Якщо довільний стан qi входить у S, то даний факт на діаграмі наголошується жирним кружком, що виділяє вершину qi. Це означає, що автомат перебуває в одному зі своїх завершальних станів.

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

Основною властивістю стану є те, що в ньому СА чекає обмежений набір вхідних дій. Будь-який алгоритм має вхідну й вихідну інформацію. Її можна розділити на два типи: змінні (напр., операції над властивостями об'єктів) і функції. Друга властивість стану – видача набору фіксованих значень вихідних змінних. Це означає, що в будь-який момент часу визначені значення всіх вихідних змінних, оскільки алгоритм завжди перебуває в якомусь стані.

На рис. 9.1. подано діаграму автомата К,що працює зі словами алфавіту A = { а, b, c }. Автомат має два стани, q 0 і q 1, завершальним є стан q 1. Почавши роботу в стані q 0, автомат при отриманні на вхід літер а, b у новий стан не переходить; при отриманні літери с здійснюється перехід у стан q 1; далі
Рис. 9.1

наступна літера залишає автомат у тому самому стані. Таким чином, автомат K розпізнає мову L 1, що складається зі слів, які мають у своєму складі літеру с, тому запропонована мова є регулярною.

Природно, що при виконанні дій можливі виклики вкладених СА.

Кількість станів і наборів значень вихідних змінних обмежена. Діаграми станів, що ілюструють роботу СА, стали невід'ємною частиною основних принципів об'єктно-орієнтованого програмування.

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

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

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

M = 1 2 3 4 5 6 7 8 9 0

N = 1 2 3 4 5 3 2 4 43 6 7 8 9 0

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

Масиви позначимо M і N, а номери їх елементів – відповідно i і j.

Необхідно написати програму знаходження й друку вставок.

Побудуємо діаграму станів. Позначимо початковий стан як А. Перебиратимемо елементи масиву, використовуючи цикл (NonStop=true). Вихід із циклу(NonStop=false)обробки масивів здійснюється після закінчення елементів або в обох масивах, або в одному. Із початкового стану здійснюється перехід до поки що невідомого стану й виконання певних дій. Цей етап подано на рис. 9.2.

Рис. 9.2

Розглянемо новий стан В. У ньому порівнюватимемо елементи двох масивів. Поки порівнювані елементи рівні – послідовності збігаються. Тому стан В назвемо станом очікування появи вставки, або нерівності поточних елементів масивів. У цьому стані виконуватиметься приріст номерів елементів масивів на одиницю (i=i+1;j=j+1). Оскільки робота починається з першого елемента масивів, то i=1; j=1. Це перша дія при виході з початкового стану.

У стані В порівнюватимемо елементи M[i] і N[j]. У разі їх нерівності (локальна подія M[i]<>N[j]) переходимо в невідомий поки стан (позначимо його С) із запам'ятовуваннямпоточних номерів елементів масивів у додаткових змінних i1=i;j1=j (рис. 9.3).

У стані В може закінчитися список елементів масивів – M[i]=0 і N[j]=0. Якщо досягнутий кінець другого масиву й не досягнутий першого (подія EndN, або N[j]=0), то формується повідомлення про помилку і здійснюється вихід. Для цього вводиться перехід зі стану В у стан А за локальною подією ЕndN з дією на переході Write('Error') і NonStop=false, де Write('Error') друк повідомлення про помилку. Якщо обидва черговіелементи масивів нульові, то відбувається локальна подія ЕndМ&EndN і програма переходить у стан А з дією коректного завершення NonStop=false.

Рис. 9.3

Таким чином, у стані В вибираємо чергову пару елементів порівнюваних масивів і чекаємо появи однієї з трьох локальних подій:

1. EndM & not EndN – закінчилися елементи в другому масиві й не закінчилися в першому.

2. EndM & EndN – закінчилися елементи в обох масивах.

3. M[i]<>N[j] – знайшли незбіжні елементи.

За кожною із цих подій здійснюється перехід зі стану В або до стану А – за подіями 1 і 2, або до невідомого поки що стану С – за подією 3. Якщо жодна з цих подій не трапилася в поточному циклі, то програма залишається в стані В, що відображається дугою з В у В.

Розглянемо події, які відбуватимуться в стані С. У цьому стані відбувається очікування появи елемента N[j1], збіжного з M[i1]. Настання цієї події свідчить про завершення вставки. У стані С необхідно здійснити приріст індексу j1 елемента другого масиву і друк відповідного елемента (рис. 9.4).

Іншою локальною подією є кінець послідовності другого масиву, тобто ЕndN(N[j1]=0). За цією подією здійснюється перехід у початковий стан А і формується код виходу з циклу NonStop=false.

Поки не будуть знайдені збіжні елементи, знаходимося в стані С. Задачу розв'язано.

Рис. 9.4

Введемо такі означення для реалізації СА у вигляді програми.

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

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

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

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

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

Іншими словами: стан програми, що реалізує СА – це зациклення на одному й тому самому фрагменті програми до настання локальної події. Позначимо стан як where.

Означення 9.4. Переходом назвемо зміну поточного стану на інший.

При цьому змінна стану where змінює своє значення.

Кожен перехід супроводжується деякою дією. Це означає, що при настанні локальної події потрібно не тільки змінити змінну where, але й виконати задану послідовність операторів. Тому загальний вигляд розв'язання задачі за допомогою СА такий:

int NonStop=1;

While(NonStop)

{

//тіло автомата;

}

де NonStop –ознака продовження циклу, який перед передаванням керування оператору while має бути встановлений на значення true.

Уся логіка роботи програми полягає в циклічній обробці станів. Вихід із циклу здійснюється за виконання умови закінчення обробки. У тілі циклу відбувається обробка кожного зі станів. СА може бути реалізований так:

While (NonStop)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: