Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

osn_progr_final

.pdf
Скачиваний:
37
Добавлен:
12.02.2016
Размер:
3.27 Mб
Скачать

protected: int numitems; T *items;};

template <class T>

void Stack<T>::push( T t ) { items[numitems++] = t;

}

template <class T> T Stack<T>::pop()

{return items[--numItems];}

В наведеному прикладі реалізований клас для реалізації стеку. Як бачимо з прикладу, в даному випадку визначається шаблонний клас, у якому фігурує невідомий тип даних Т. Якщо функцiя визначається як невбудована (див. приклад), то її заголовок має такий формат:

template <список_аргументiв_шаблону>

тип_результату iм'я_класу <арг_шаблона>::iм'я_функцiї (парамет-

ри...)

{ //тiло функцiї}

Можна використовувати ключове слово inline для визначення вбудованого методу ззовнi шаблона:

template <class Type>

inline void className <Type>::methodName( int i )

{ // тiло функцiї}

8.13.2.2 Константи та типи як параметри шаблону

Як згадувалося вище , параметри шаблона класу можуть бути або типами, або константами. Розглянемо приклад, коли параметрами виступають константи. Визначимо шаблон класу Stack так, щоб розмір стека виступав в якості параметра. Назвемо такий шаблон Stack1. Для цього замість рядків

const size_t defStackSize = 512; template <class T>

class Stack

слід написати:

template <class T, size_t defStackSize> class Stack1

Тоді defStackSize виступає в якості константи, яку необхідно задавати при визначенні екземпляра класу. Як i класи, шаблони можуть мiстити статичнi елементи даних, статичнi елементи-функцiї, дружнi функцiї та класи. Не можна визначати внутрiшнiй шаблон в тiлi iншого шаблона класу. Однак, можна оголосити iнший внутрiшнiй

301

клас, який використовує один чи декiлька параметрiв шаблону.

8.13.2.3 Використання шаблонних класів

Щоб створити представник шаблонного класу, можна просто вказати iм'я шаблона з списком аргументiв, якi помiщенi в дужки , в якостi специфiкатора типу. Список аргументiв шаблона модифiкується наступним чином:

-кожний аргумент, який має вигляд 'class iдентифiкатор' (параметр типу), замiнюється iменем дiйсного типу;

-кожний аргумент, що має вигляд 'iм'я_типу iдентифiкатор' (нетиповий

параметр), замiнюється константним виразом. Приклад:

Stack<int> stackekz;

//утворюється екземпляр шаблонного класу stackekz з типом //int в якості параметра

Stack<int> stackekz1(40);

//утворюється екземпляр шаблонного класу stackekz1 з //типом int в якості параметра та викликається конструк //тор класу з параметром 40

Stack<long> *pstackekz[10];

//оголошується масив з 10 елементів вказівників на тип //Stack з типом long в якості параметра

Створивши представник шаблона класу, можна працювати з ним аналогiчно, як з екземпляром звичайного класу.

Приклад:

int main( void )

{Stack<int> Stack0fInt(10); Stack0fInt.push( 33 ); Stack0fInt.push( 44 ); Stack0fInt.push( 55 );

cout <<

"помiщенi значення рiвнi: "

<<

Stack0fInt.pop()

<< ','

<<

Stack0fInt.pop()

<< ','

<< Stack0fInt.pop()

<< end1;

Stack<double> StackofDouble(10);

 

Stack0fDouble.push(2.3456);

Stack0fDouble.push(4.8967); Stack0fDouble.push(-1.345);

cout << "помiщенi значення рiвнi: "

<< Stack0fDouble.pop()

<< ','

<< Stack0fDouble.pop()

<< ','

<< Stack0fDouble.pop()

<< end1;

302

return 0;}

До шаблоного класу можна застосувати ключове слово typedef, щоб спростити його використання.

Наприклад,

Stack<long> lstsk; Stack<long> *plstck; Stack<long> alstck[10];

можна спростити до

typedef Stack<long> LStack; LStack lstck;

LStack *plstck; LStack alstck[10];

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

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

Приклад:

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*>. Наступний приклад демонструє результат заміни цього

303

методу:

int main(void) { int i1=10;

Array<int> iArray; iArray.add(i1);

char *msg="Hello, world!"; Array<char *> strArray; strArray.add(msg);

return 0;}

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

-Передбачити визначення спецiалiзованого шаблонного класу, помiстивши його пiсля визначення узагальненого класу.

-Передбачити визначення для всiх елементiв-функцiй. Розглянемо приклад. Нехай маємо в файлі 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;}

Реалiзацiя шаблонiв С++ не дозволяє перевантажити iм'я шаблона

304

класу. Наприклад, не можна визначити одночасно Array<class T> та

Array<class T, int size>.

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

-Програма буде мiстити повний код представникiв шаблона для кожного iз породжуючих типiв. Це може збiльшити розмiр виконуваного модуля.

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

ЗАВДАННЯ

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.Написати програму для ілюстрації дій компілятора при виклиці функції. Для цього визначити деяку функцію, функціональний шаблон та розглянути випадки:

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

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

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

ДОДАТКОВІ ЗАВДАННЯ З С++

305

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

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

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

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

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

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

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

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

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

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

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

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

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

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

306

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

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

17.Розробити тип даних sitka (для представлення множини точок,

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

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

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

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

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

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

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

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

25 Розробити клас, що представляє факультет. Факультет характеризується повною і короткою назвою, інститутом, до якого він від-

307

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

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

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

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

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

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

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

308

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

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

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

ln(1 )/ ,

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

34.Написати програму моделювання океану . Океан повинен мати три види елементів : риби, хижаки, що поїдають риб та собі подібних та перешкоди. Моделювання здійснити поетапно. На кожному етапі моделювання кожен живий об’єкт(риба, хижак)

а) аналізує простір навколо себе б) проводить певні дії (хижак поїдає жертву, наприклад)

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

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

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

а) у обмеженій області площини б) в трьохвимірному просторі.

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

309

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

36. Побудувати модель повітряної битви літаків (кораблів тощо).

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

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

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

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

д) Поширити останній варіант на групу об’єктів е) Розглянути літаки різних типів (типи визначаються максималь-

ними значеннями найпростіших параметрів - кількість боєприпасів, кількість прального).

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

Деякі міркування на закінчення розділу

С++ - це потужний засіб створення програмного забезпечення в рамках об’єктно-орієнтованого підходу. Як бачимо, в С++ реалізовані структури даних, що ідеально підходять для моделювання об’єктів реального світу. Екземпляри класів С++ мають свою внутрішню структуру, свої властивості, що визначаються функціями-членами. Чим більше методів та полів даних має клас - тим “розумнішими” є його представники. Все як і в реальному світі. Прогулюючись з своїм

310

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]