Class Block

{

public:

Block(){p = new Type [kol];}

~Block(){delete [] p;}

operator Type * ();

protected:

Type * p;

};

template <class Type, int kol>

Block <Type, kol>:: operator Type *()

{

return p;

}

 

В даному випадку опис об'єкту має вигляд:

 

Block <char, 128> buf;

Block <monstr, 100> stado;

 

Після створення та відлагодження шаблони класів зручно поміщати в заголовні файли.

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

 

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

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

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

 

template <class Data> void List <Data>::print();

 

спеціалізований метод для виведення списку символів виглядатиме таким чином:

 

void List <char>::print()

{

... // Тіло спеціалізованого варіанту метода print

}

 

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

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

 

class Block <int, 100>

{

public:

Вlоск(){р = new int [100];}

~Block(){delete [ ] p;}

operator int *( );

protected:

int * p;

};

 

Block <int, 100>:: operator int *()

{

return р;

}

При визначенні екземплярів шаблону Block з параметрами int і 100 буде задіяний спеціалізований варіант.

 

8.9 Переваги та недоліки шаблонів

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

Стандартна бібліотека C++ надає великий набір шаблонів для різних способів організації зберігання і обробки даних (див. розділ "Контейнерні класи").

 

Завдання

 

Перелік варіантів завдань:

Варіант 1

Скласти програму, яка містить динамічну інформацію про наявність автобусів в автобусному парку.

Відомості про кожен автобус містять:

• номер автобуса;

• прізвище і ініціали водія;

• номер маршруту.

Програма повинна забезпечувати:

• початкове формування даних про всі автобуси в парку у вигляді списку;

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

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

• за запитом видаються відомості про автобуси, що знаходяться в парку, або про автобуси, що знаходяться на маршруті.

 

Варіант 2

Скласти програму, яка містить поточну інформацію про книги в бібліотеці.

Відомості про книги містять:

• номер УДК;

• прізвище і ініціали автора;

• назва;

• рік видання;

• кількість екземплярів даної книги в бібліотеці.

Програма повинна забезпечувати:

• початкове формування даних про всі книги в бібліотеці у вигляді двійкового дерева;

• додавання даних про книги, що знов надходять в бібліотеку;

• видалення даних про списувані книги;

• за запитом видаються відомості про наявність книг в бібліотеці, впорядковані по роках видання.

Варіант 3

Скласти програму, яка містить поточну інформацію про заявки на авіаквитки.

Кожна заявка містить:

• пункт призначення;

• номер рейсу;

• прізвище і ініціали пасажира;

• бажану дату вильоту.

Програма повинна забезпечувати:

• зберігання всіх заявок у вигляді списку;

• додавання заявок в список;

• видалення заявок;

• виведення заявок по заданому номеру рейсу та даті вильоту;

• виведення всіх заявок.

 

Варіант 4

Скласти програму, яка містить поточну інформацію про заявки на авіаквитки.

Кожна заявка містить:

• пункт призначення;

• номер рейсу;

• прізвище та ініціали пасажира;

• бажану дату вильоту.

Програма повинна забезпечувати:

• зберігання всіх заявок у вигляді двійкового дерева;

• додавання та видалення заявок;

• по заданому номеру рейсу та даті вильоту виведення заявок з їх подальшим видаленням;

• виведення всіх заявок.

Варіант 5

Скласти програму, яка містить поточну інформацію про книги в бібліотеці.

Відомості про книги містять:

• номер УДК;

• прізвище та ініціали автора;

• назва;

• рік видання;

• кількість екземплярів даної книги в бібліотеці.

Програма повинна забезпечувати:

• початкове формування даних про всі книги в бібліотеці у вигляді списку;

• при взятті кожної книги вводиться номер УДК, і програма зменшує значення кількості книг на одиницю або видає повідомлення про те, що необхідної книги в бібліотеці немає, або необхідна книга знаходиться на руках;

• при поверненні кожної книги вводиться номер УДК, і програма збільшує значення кількості книг на одиницю;

• за запитом видаються відомості про наявність книг в бібліотеці.

Варіант 6

Скласти програму, яка містить динамічну інформацію про наявність автобусів в автобусному парку.

Відомості про кожен автобус містять:

• номер автобуса;

• прізвище і ініціали водія;

• номер маршруту;

• ознака того, де знаходиться автобус - на маршруті або в парку.

Програма повинна забезпечувати:

• початкове формування даних про всі автобуси у вигляді списку;

• при виїзді кожного автобуса з парку вводиться номер автобуса, і програма встановлює значення ознаки "автобус на маршруті";

• при в'їзді кожного автобуса до парку вводиться номер автобуса, і програма встановлює значення ознаки "автобус в парку";

• за запитом видаються відомості про автобуси, що знаходяться в парку, або про автобуси, що знаходяться на маршруті.

Варіант 7

Скласти програму, яка відшукує прохід по лабіринту.

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

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

 

Варіант 8

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

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

Варіант 9

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

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

Вказівка: слід створити список зайнятих ділянок і список вільних ділянок пам'яті на диску.

Варіант 10

У файловій системі каталог файлів організований як лінійний список. Для кожного файлу в каталозі містяться наступні відомості:

• ім'я файлу;

• дата створення;

• кількість звернень до файлу.

Скласти програму, яка забезпечує:

• початкове формування каталогу файлів;

• виведення каталогу файлів;

• видалення файлів, дата створення яких менше заданої;

• вибірку файлу з найбільшою кількістю звернень.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

 

 

Варіант 11

Предметний покажчик організований як лінійний список.

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

Скласти програму, яка забезпечує:

• початкове формування предметного покажчика;

• виведення предметного покажчика;

• виведення номерів сторінок для заданого слова.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 12

Текст допомоги для деякої програми організований як лінійний список.

Кожна компонента тексту допомоги містить термін (слово) і текст, що містить пояснення до цього терміну. Кількість рядків тексту, що відносяться до одного терміну, від однієї до п'яти.

Скласти програму, яка забезпечує:

• початкове формування тексту допомоги;

• виведення тексту допомоги;

• виведення пояснюючого тексту для заданого терміну.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 13

Картотека в бюро обміну квартир організована як лінійний список.

Відомості про кожну квартиру містять:

• кількість кімнат;

• поверх;

• площа;

• адреса.

Скласти програму, яка забезпечує:

• початкове формування картотеки;

• введення заявки на обмін;

• пошук в картотеці відповідного варіанту: при рівності кількості кімнат та поверху і відмінності площ в межах 10% виводиться відповідна картка і видаляється із списку, в іншому випадку заявка, що поступила, включається в список;

• виведення всього списку.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 14

Англо-російський словник побудований як двійкове дерево.

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

Скласти програму, яка:

• забезпечує початкове введення словника з конкретними значеннями лічильників звернень;

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

• проводить виведення початкового і нового словників.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 15

Анкета для опиту населення містить дві групи питань.

Перша група містить відомості про респондента:

• вік;

• стать;

• освіта (початкова, середня, вища).

Друга група містить власне питання анкети, відповідь на які або ТАК, або НІ.

Скласти програму, яка:

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

• на основі аналізу анкет видає відповіді на наступні питання: а) скільки чоловіків старше 40 років, що мають вищу освіту, відповіли ТАК на питання анкети; б) скільки жінок молодше 30 років, що мають середню освіту, відповіли НІ на питання анкети; в) скільки чоловіків молодше 25 років, що мають початкову освіту, відповіли ТАК на питання анкети;

• проводить виведення всіх анкет і відповідей на питання.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 16

Скласти програму, яка містить поточну інформацію про книги в бібліотеці.

Відомості про книги містять:

• номер УДК;

• прізвище і ініціали автора;

• назва;

• рік видання;

• кількість екземплярів даної книги в бібліотеці.

Програма повинна забезпечувати:

• початкове формування даних про всі книги в бібліотеці у вигляді списку;

• додавання даних про книги, що знов надходять в бібліотеку;

• видалення даних про списувані книги;

• за запитом видаються відомості про наявність книг в бібліотеці, впорядковані по роках видання.

 

 

Варіант 17

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

Скласти програму, яка:

• забезпечує початкове формування картотеки у вигляді лінійного списку;

• проводить виведення всієї картотеки;

• вводить номер телефону і час розмови;

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

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 18

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

Скласти програму, яка:

• забезпечує початкове формування картотеки у вигляді двійкового дерева;

• проводить виведення всієї картотеки;

• вводить номер телефону і час розмови;

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

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 19

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

• номер поїзда;

• станція призначення;

• час відправлення.

Дані в інформаційній системі організовані у вигляді лінійного списку.

Скласти програму, яка:

• забезпечує первинне введення даних в інформаційну систему і формування лінійного списку;

• проводить виведення всього списку;

• вводить номер поїзда і виводить всі дані про цей поїзд;

• вводить назву станції призначення і виводить дані про всі поїзди, які слідують до цієї станції.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

Варіант 20

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

Для кожного поїзда вказується:

• номер поїзда;

• станція призначення;

• час відправлення.

Дані в інформаційній системі організовані у вигляді двійкового дерева.

Скласти програму, яка:

• забезпечує первинне введення даних в інформаційну систему і формування двійкового дерева;

• проводить виведення всього дерева;

• вводить номер поїзда і виводить всі дані про цей поїзд;

• вводить назву станції призначення і виводить дані про всі поїзди, які слідують до цієї станції.

Програма повинна забезпечувати діалог за допомогою меню і контроль помилок при введенні.

 

 


РОЗДІЛ 9. МОДУЛЬНІ ПРОГРАМИ

(проектування об’єктно-орієнтованого програмування)

9.1 Короткі відомості

 

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

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

Збірка здійснюється одним з двох способів.

1. Об'єднуються початкові тексти.

2. Програма збирається з об'єктних модулів; об'єктний модуль – це результат компіляції однієї одиниці трансляції початкового тексту.

У C++ об'єднання початкових текстів робиться за допомогою препроцесора. Недолік – компіляція програми може займати багато часу. Другий спосіб був створений для того, щоб уникнути компіляції всієї програми цілком. Такий спосіб називається роздільною трансляцією. Процес збірки повної програми з об'єктних модулів називається компоновкою, і виконує цю роботу програма-компонувальник, яка входить до складу системи програмування. Ця програма часто називається "лінкером" (від англійського слова linker), що, власне, і має на увазі "складальника". При компоновці в програму збираються не тільки розроблені модулі, але і стандартні. Стандартні модулі не транслюються разом з програмою – вони поставляються разом з системою у вигляді об'єктних модулів і об'єктних бібліотек.

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

9.2 Збірка вихідних текстів

 

Розроблений клас зберігається в окремому файлі ім’я_файлу.срр. Наприклад, реалізацію двостороннього списку можна назвати ім'ям List.срр. Інший модуль-файл з ім'ям main.срр може містити код програми-клієнта, що використовує стек. При створенні проекту засобами інтегрованого середовища файл main.срр має бути єдиним в проекті.

Файл List.cpp повинен включати наступну конструкцію:

 

#ifndef _LIST // "вартовий" визначений?

#define _LIST // визначення "вартового"

class List

{ //визначення класу

};

#endif /*_LIST */ // кінець #ifndef

Перший рядок може бути записаний по-іншому,

#if !defined(_STACK) // "вартовий" визначений?

 

що еквівалентно попередньому варіанту. Така послідовність команд препроцесора називається "вартовим" включення і призначена для запобігання повторному включенню вмісту файлу в програму.

Приклад вмісту файлу main.cpp:

 

#include "List.cpp" // файл з реалізацією стеку

#include <iostream> // системний заголовок

using namespace std; // стандартний простір імен

 








Дата добавления: 2014-12-26; просмотров: 1955;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.071 сек.