МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
МЕТОДИЧНІ ВКАЗІВКИ
до навчальної практики
з дисципліни «Програмування» (Об’єктно-Орієнтоване)
для студентів базового напрямку 6.0915
“Комп’ютерна інженерія”
Львів - 2003
Методичні вказівки до навчальної практики з дисципліни «Програмування» (Об’єктно-Орієнтоване) для студентів базового напрямку 6.0915 “Комп’ютерна інженерія”
ЗМІСТ
Мета практити 3
Порядок проходження практики 3
Створення прикладних програм 3
Створення Проекту 3
Проект програми на основі Діалогу 5
Створення Програми 9
Обробка повідомлень 16
Завдання 20
Однодокументна програма 20
Створення Програми 24
Завдання 26
Багатодокументна програма 26
Типові завдання 26
Зміст звіту про практику 27
Навчально-методичні матеріали 28
МЕТА ПРАКТИТИ
Розвинути навики використання Об’єктно-Орієетованого Програмування (ООП) при створенні програмних продуктів для операційної системи Windows та системного програмного забезпечення. Засвоїти навики використання типових об’єктно-орієнтованих бібліотек при розробці сучасного графічного інтерфейсу користувача. Познайомитись з бібліотекою класів MFC, навчитись створювати віконні програми, що будуються на основі діалогу, одно- та багатодокументної архітектури.
ПОРЯДОК ПРОХОДЖЕННЯ ПРАКТИКИ
У процесі проходження навчальної практики студенти повинні виконати індивідуальне завдання – розробити програмне забезпечення з використанням типової об’єктно-орієнтованої бібліотеки MFC (Microsoft Foundation Classes). На основі цієї засобів бібліотеки, відповідно до індивідуального, необхідно розробити графічний інтерфейс з використанням типових для ОС Windows архітектур:
- «Діалогу»;
- «Одно-документної»;
- «Багато-документної».
Для розробки програмного забезпечення використовується компілятор С++ в середовищі Microsoft Visual Studio версії 6.0 або вищої.
Після завершення розробки програмного забезпечення необхідно оформити звіт про практику та захистити його.
СТВОРЕННЯ ПРИКЛАДНИХ ПРОГРАМ
Створення Проекту
Розробка програмного забезпечення в середовищі MS Visual Studio розпочинається зі створення Проекту. Він містить інформацію про структуру класів, глобальні об’єкти, ресурси і файли програми. Розробка віконної програми MFC полягає у включенні в проект класів, що наслідують базові класи MFC, і наповненні їх необхідною функціональністю. В одному з файлів з розширенням .cpp мусить створюватись об’єкт програми (CwinApp theApp), якому передається керування після запуску прикладної програми.
Для того щоб створити новий проект даних необхідно запустити на виконання програму MS Visual C++ 6.0 основне вікно середовища зображено на Рис.1.
Рисунок 1. Середовище програмування MS Visual C++ 6.0.
Процес створення проекту підтримується майстром створення Проектів, що запускається з основного меню шляхом вибору пунктів “File” –> “New”. Цей процес типовий для створення програм з різними архітектурами (на основі «Діалогу», «Одно-документної» чи «Багато-документної»). Відрізняється він тільки компонентами, що включатимуться в прикладну програму.
Після вибору в меню середовища MS Visual C++ 6.0 пунктів “File” –> “New” появляється вікно (Рис.2) за допомогою якого вибирається майстер для створення Проекту (у нашому випадку MFC AppWizard (exe)) та задається його назва і розміщення зв’язаних з ним файлів.
Після натискання кнопки “Ok” запускається відповідний майстер, що полегшує процес заповнення Проекту об’єктами MFC відповідно до обраної архітектури.
Рисунок 2. Вікно створення нового MFC проекту.
Проект програми на основі Діалогу
У вікні, що появляються після запуску майстра для створення Проектів на основі MFC, треба вибрати вигляду головного вікна нового MFC проекту (Рис.3) і натиснути “OK”.
Рисунок 3. Вікно вибору вигляду головного вікна нового MFC проекту.
На наступному вікні треба зняти всі прапорці і ввести заголовок вікна діалогу (Рис.4).
Рисунок 4. Вікно вигляду елементів «Діалогу».
Рисунок 5. Вікно вибору властивостей проекту.
Далі треба натиснути “Next” (Рис.5)
Далі треба натиснути “Finish” (Рис.6)
Рисунок 6. Вікно вибору властивостей проекту.
Рисунок 7. Вікно сумарної інформації про новий MFC проект.
Далі прочитати сумарну інформацію про новий MFC проект (Рис.7) і, якщо результат відповідає Вашим задумкам, натиснути “OK”. В іншому випадку натиснути “Cancel” і відмінити створення нового проекту.
Після підтвердження створення Проекту середовище згенерує заготовки відповідних файлів та включить їх у Проект. Вигляд середовища програмування після створення Проекту зображено на Рис. 8.
Рисунок 8. Вікно середовища MS Visual C++ 6.0 з новим проектом.
Новий MFC Проект містить класи, ресурси і файли програми (CTestApp) та вікна діалогу (CTestDlg).
Для того щоб відкрити існуючий проект необхідно вибрати “Ореn Workspace…” або “Recent Workspaces” з “File” меню.
Створення Програми
Клас CTestApp містить функцію InitInstance(), з якої починається виконання програми і створення об’єкту програми theApp (Рис.9). В функції InitInstance() створюється об’єкт діалогу, до нього приєднується вікно діалогу і діалог відображається на екрані. Крім того є обробники натискання клавіш “OK” і “Cancel”. Там можна додати свій зміст.
Клас CTestDlg містить функції OnInitDialog() та OnPaint() (Рис.10). В функції OnInitDialog() налаштовується зовнішній вигляд вікна діалогу, а функція OnPaint() здійснює вивід вікна діалогу на екран.
Для додавання функціональності до діалогу спочатку треба нарисувати додаткові елементи керування в редакторі діалогів (Рис.11).
Рисунок 9. Клас CTestApp.
Рисунок 10. Клас CTestDlg.
Рисунок 11. Редактор діалогу.
Рисунок 12. Розміщення і налагодження елементів керування.
Для цього на панелі елементів керування вибирається відповідний елемент (Рис.12). На вікні діалогу мишею натягується прямокутник. Після відпускання кнопки миші, на вікні діалогу з’являється зображення елемента керування. Якщо на цьому елементі клацнути правою клавішею миші, то з’явиться контекстне меню елемента. Для зміни властивостей елемента керування необхідно вибрати пункт меню “Properties”.
Рисунок 13. Закладка “Загальна” вікна властивостей елемента керування.
На закладці “Загальна” вікна властивостей елемента керування (Рис.13) є ідентифікатор елемента, прапорці видимості та існування. Через ідентифікатор йде звертання до елемента керування. Коли знятий прапорець видимості – елемент є невидимий, але функціонує. Якщо встановити прапорець існування, елемент стане повністю недоступний при виконанні програми.
Рисунок 14. Закладка “Стилі” вікна властивостей елемента керування.
На закладці “Стилі” вікна властивостей елемента керування (Рис.14) є властивості зовнішнього вигляду елемента керування.
Рисунок 15. Закладка “Розширені стилі” вікна властивостей елемента керування.
На закладці “Розширені стилі” вікна властивостей елемента керування (Рис.15) є властивості зовнішнього вигляду елемента керування.
Для зв’язування елемента керування з об’єктом елемента керування треба викликати для нього “майстер” класів (Рис.16). На першій закладці знаходяться елементи карти повідомлень. На другій закладці (Рис.17) знаходяться змінні класа діалогу. Для додавання нової змінної треба натиснути “Add Variable…”.
Рисунок 16. Вікно “майстра” класів, закладка “Карта повідомлень”.
Рисунок 17. Вікно “майстра” класів, закладка “Змінні класу”.
З’явиться вікно створення нової змінної класу (Рис.18). В ньому обов’язково треба вказати назву змінної, яка починається на m_, категорію та тип змінної. Є дві категорії – за значенням та об’єктна (Рис.19). Категорія «за значенням» прив’язує значення, яким керує елемент керування, до змінної. Об’єктна прив’язує елемент керування до об’єкту елемента керування. Надалі з елементом керування можна працювати через значення або об’єкт відповідно.
Рисунок 18. Вікно створення нової змінної класу.
Рисунок 19. Вікно створення нової об’єктної змінної класу.
Після створення нової змінної вона з’являється на закладці “Змінні класу” “майстра” класів (Рис.20). Після натиснення “OK” можна побачити, що нова змінна з’явилась в середовищі у вікні перегляду класів і в тексті програми (Рис.21).
Рисунок 20. Вікно “майстра” класів після створення змінної.
Рисунок 21. Вікно середовища з новою змінною.
Обробка повідомлень
Повідомлення виникають в віконній програмі у відповідь на дії користувача. Для обробки повідомлень треба включити повідомлення в карту повідомлень і додати до класу спеціальну функцію – обробник повідомлення. Найбільш коректно ці дії виконує майстер повідомлень (Рис.22). Для додавання нового обробника повідомлень треба вибрати елемент керування, повідомлення якого будуть оброблятися, вибрати повідомлення, для якого потрібен обробник, і натиснути клавішу “Add Function…”.
Рисунок 22. Вікно “майстра” класів при створенні обробника повідомлення.
Рисунок 23. Вікно додавання обробника повідомлення.
У вікні додавання нового обробника треба ввести назву функції-обробника (Рис.23), яка обов’язково повинна починатися з On, і натиснути “OK”. В нижній частині вікна “майстра” класів з’явиться нова функція – член класу і повідомлення, яке ця функція обробляє (Рис.24). Після натиснення “OK” можна побачити, що нова функція з’явилась в середовищі у вікні перегляду класів і в тексті програми (Рис.25).
Якщо запустити програму на компіляцію і виконання, то вона створить вікно діалогу з елементами керування (Рис.26), але не буде виконувати ніяких корисних дій. Для надання програмі необхідної функціональності, треба написати реалізацію обробників повідомлень (Рис.27).
Рисунок 24. Вікно “майстра” класів після створення обробника повідомлення.
Рисунок 25. Вікно середовища з новим обробником повідомлення.
Рисунок 26. Вікно програми після запуску на виконання.
Рисунок 27. Вікно середовища з безпосереднім звертанням до елемента керування.
Обробник може звертатись до елемента керування безпосередньо (Рис.27), використовуючи функції WinApi, або через його об’єкт, використовуючи методи цього об’єкту (Рис.28). Останній підхід є коректнішим і не вимагає запам’ятовування величезної кількості функцій WinApi.
Рисунок 28. Вікно середовища з використанням об’єкта елемента керування.
Рисунок 29. Вікно програми після натиснення клавіші.
Після компіляції і виконання програми, вікно діалогу нічим не відрізняється від попереднього, але клавіша вже реагує на натиснення (Рис.29).
Завдання
Використовуючи графічний інтерфейс на основі «Діалогу» забезпечити введення даних в поля заданого об’єкту та записати ці значення у текстовий файл. Для розділення значень полів використовувати коми.
ОДНОДОКУМЕНТНА ПРОГРАМА
Початкові кроки створення Проекту для програми з однодокументною архітектурою аналогічні як і для програми на основі Діалогу. Тільки на першому кроці (Рис. 30) необхідно встановити відповідну мітку і встановлювати елементи діалогу як показано нижче.
Рисунок 30. Вікно вибору вигляду головного вікна нового MFC проекту.
Далі треба вибрати вигляд головного вікна нового MFC проекту (Рис.3) і натиснути “OK”.
На наступному вікні треба натиснути клавішу “Next” (Рис. 31).
Рисунок 31. Вікно підключення бази даних.
Рисунок 32. Вікно вибору властивостей проекту.
На наступному вікні треба зняти всі прапорці і натиснути “Next” (Рис. 32).
Далі треба розставити прапорці і натиснути “Next” (Рис. 33)
Рисунок 33. Вікно вибору вигляду проекту.
Рисунок 34. Вікно вибору властивостей проекту.
Далі треба натиснути “Next” (Рис. 34).
Рисунок 35. Вікно з переліком класів проекту.
Потім треба натиснути “Finish” (Рис. 35).
Рисунок 36. Вікно сумарної інформації про новий MFC проект.
Далі прочитати сумарну інформацію про новий MFC проект (Рис. 36) і підтвердити створення Проекту натиснувши “Oк”. В іншому випадку натиснути “Cancel” і відмінити створення нового проекту.
Рисунок 37. Вікно середовища MS Visual C++ 6.0 з новим проектом.
Новий MFC проект (Рис. 37) містить класи, ресурси і файли програми (CTestApp) та вікна програми (CMainFrame) та робочої області вікна програми (CChildView).
Для того щоб відкрити існуючий проект необхідно вибрати “Ореn Workspace…” або “Recent Workspaces” з “File” меню.
Створення Програми
Клас CTestApp містить функцію InitInstance(), з якої починається виконання програми і створення об’єкту програми theApp (Рис. 37). В функції InitInstance() створюється об’єкт вікна програми, до нього приєднується вікно програми і вікно програми на екрані.
Клас CMainFrame містить об’єкти класів CStatusBar, CToolBar та CChildView і функції, що підтримують зовнішній вигляд вікна програми (Рис. 38).
Клас CChildView містить функції PreCreateWindow() та OnPaint() (Рис. 39). У функції PreCreateWindow() налаштовується зовнішній вигляд робочої області вікна програми, а функція OnPaint() дозволяє здійснювати графічний вивід у робочу область вікна програми. Для цього вона містить об’єкт класу контексту екрана CPaintDC.
Контекст екрана інкапсулює весь графічний вивід в робочу область вікна програми.
Якщо, програма, що створюється повинна працювати з текстовими документами, то базовим класом для класу дочірнього вікна CChildView у діалозі Рис. 35 необхідно вибрати клас CEditView. Тоді, майстер створення проекту автоматично згенерує класи «документу» та «вигляду» для підтримки текстових даних, та забезпечить їх збереження у файлі.
Рисунок 38. Клас CMainFrame.
Рисунок 39. Клас CChildView.
Якщо запустити програму на компіляцію і виконання, то вона створить вікно програми (Рис. 40), але не буде виконувати ніяких корисних дій.
Рисунок 40. Вікно програми після виконання.
Завдання
Використовуючи програму з однодокументною архітектурою забезпечити читання та запис текстових файлів з полями (розділяються комами) заданих об’єктів. За допомогою розробленої програми можна додавати нові записи до відкритого файлу.
БАГАТОДОКУМЕНТНА ПРОГРАМА
Процес створення багатодокументної програми аналогічний процесу створення однодокументної. Лише у діалозі Рис. 30 необхідно вибрати прапорець “Multiple documents”.
Для того, щоб урізноманітнити вигляд у якому будуть виводитися дані для багатодокументної програми пропонується створити клас дочірнього вікна CChildView на основі стандартного для MFC касу CListView. Для цього необхідно в діалозі Рис. 35 зробити відповідний вибір. У результаті майстер проектів створить відповідні класи «документу» та «вигляду», які підтримують відображення даних у вигляді таблиці.
Нижче приведено приклад вмісту файлів заголовків та реалізації «документу» та його «вигляду» для відображення даних в таблиці.
Код для роботи з «документом»:
// CTableDoc document
class CTableDoc : public CDocument {
DECLARE_DYNCREATE(CTableDoc)
public:
CTableDoc();
virtual ~CTableDoc();
virtual void Serialize(CArchive& ar); // overridden for document i/o
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual void DeleteContents();
int GetRowTotal();
STableRow * GetTable();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
virtual BOOL OnNewDocument();
protected:
int m_RowTotal;
STableRow * m_pTable;
DECLARE_MESSAGE_MAP()
};
// ****************************************************************************
inline int CTableDoc::GetRowTotal() { return m_RowTotal; }
// ****************************************************************************
inline STableRow * CTableDoc::GetTable() { return m_pTable; }
// ****************************************************************************
BOOL CTableDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
int i;
char szInBuff[1024];
char * szCurr;
FILE * fIn = fopen(lpszPathName, "r");
size_t nLenKeyStr = strlen(g_KeyRowTotal);
while (!feof(fIn)) {
fgets(szInBuff, 1024, fIn);
szCurr = strtok(szInBuff, ";");
if (szCurr && !strncmp(szCurr, g_KeyRowTotal, nLenKeyStr)) {
m_RowTotal = atoi(szCurr + nLenKeyStr);
break;
}
}
nLenKeyStr = strlen(g_szSurfFilePref);
if (m_RowTotal) {
m_pTable = (STableRow *)malloc(m_RowTotal * sizeof(STableRow));
i = 0;
while (!feof(fIn) && i < m_RowTotal) {
fgets(szInBuff, 1024, fIn);
if (szInBuff && !strncmp(szInBuff, g_szSurfFilePref, nLenKeyStr)) {
if (szCurr = strtok(szInBuff, ";")) {
sscanf(szCurr, "%s", m_pTable[i].szVoidName);
}
if (szCurr = strtok(NULL, ";")) {
m_pTable[i].nFaceCount = atoi(szCurr);
}
if (szCurr = strtok(NULL, ";")) {
sscanf(szCurr, "%f", &m_pTable[i].fVolume);
}
if (szCurr = strtok(NULL, ";")) {
m_pTable[i].centr.x = atoi(szCurr);
}
if (szCurr = strtok(NULL, ";")) {
m_pTable[i].centr.y = atoi(szCurr);
}
if (szCurr = strtok(NULL, ";")) {
m_pTable[i].centr.z = atoi(szCurr);
}
i++;
}
}
m_RowTotal = i;
}
fclose(fIn);
return TRUE;
}
// ****************************************************************************
void CTableDoc::DeleteContents()
{
if (m_RowTotal) free(m_pTable), m_RowTotal = 0;
CDocument::DeleteContents();
}
// ****************************************************************************
Код для роботи з «виглядом»:
// CTableView view
class CTableView : public CListView
{
DECLARE_DYNCREATE(CTableView)
STableRow m_SelectedPos;
protected:
CTableView(); // protected constructor used by dynamic creation
virtual ~CTableView();
protected:
virtual void OnInitialUpdate(); // called first time after construct
public:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
DECLARE_MESSAGE_MAP()
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
public:
afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
};
// CTableView
#define NUM_COLUMNS 6
enum EListCol {
LC_OBJ_NAME = 0,
LC_FACES,
LC_VOLUME,
LC_COORD_X,
LC_COORD_Y,
LC_COORD_Z
};
static _TCHAR * g_szColumnLabel[NUM_COLUMNS] = {
_T("Name Object"), _T("Faces"), _T("Volume"), _T("X-coord"), _T("Y-coord"), _T("Z-coord")
};
static int g_nColumnFmt[NUM_COLUMNS] = {
LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT
};
static int g_nColumnWidth[NUM_COLUMNS] = {
150, 100, 100, 100, 100, 100
};
// ****************************************************************************
IMPLEMENT_DYNCREATE(CTableView, CListView)
// ****************************************************************************
CTableView::CTableView() { }
// ****************************************************************************
CTableView::~CTableView() { }
// ****************************************************************************
BEGIN_MESSAGE_MAP(CTableView, CListView)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclk)
END_MESSAGE_MAP()
// ****************************************************************************
BOOL CTableView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
return CListView::PreCreateWindow(cs);
}
// ****************************************************************************
void CTableView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl & ListCtrl = GetListCtrl();
ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
int i;
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for(i = 0; i < NUM_COLUMNS; i++) {
lvc.iSubItem = i;
lvc.pszText = g_szColumnLabel[i];
lvc.cx = g_nColumnWidth[i];
lvc.fmt = g_nColumnFmt[i];
ListCtrl.InsertColumn(i, &lvc);
}
// insert items
CTableDoc * pDoc = (CTableDoc *)GetDocument();
int nRowTotal = pDoc->GetRowTotal();
STableRow * pTable = pDoc->GetTable();
LV_ITEM lvi;
char szIntBuff[32];
lvi.mask = LVIF_TEXT;
lvi.iSubItem = 0;
lvi.iImage = i;
ListCtrl.SetItemCount(nRowTotal);
for(i = 0; i < nRowTotal; i++) {
lvi.iItem = i;
lvi.pszText = pTable[i].szVoidName;
ListCtrl.InsertItem(&lvi);
// set item text for additional columns
sprintf(szIntBuff, "%d", pTable[i].nFaceCount);
ListCtrl.SetItemText(i, LC_FACES, szIntBuff);
sprintf(szIntBuff, "%9.2f", pTable[i].fVolume);
ListCtrl.SetItemText(i, LC_VOLUME, szIntBuff);
sprintf(szIntBuff, "%d", pTable[i].centr.x);
ListCtrl.SetItemText(i, LC_COORD_X, szIntBuff);
sprintf(szIntBuff, "%d", pTable[i].centr.y);
ListCtrl.SetItemText(i, LC_COORD_Y, szIntBuff);
sprintf(szIntBuff, "%d", pTable[i].centr.z);
ListCtrl.SetItemText(i, LC_COORD_Z, szIntBuff);
}
}
// ****************************************************************************
// CTableView diagnostics
#ifdef _DEBUG
// ****************************************************************************
void CTableView::AssertValid() const
{
CListView::AssertValid();
}
// ****************************************************************************
void CTableView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
// CTableView message handlers
// ****************************************************************************
void CTableView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) {
int nRetLen;
CListCtrl & listCtrl = GetListCtrl();
POSITION pos = listCtrl.GetFirstSelectedItemPosition();
int nBuffLen = 32;
char strBuffer[32];
if (pos) {
int nItem = listCtrl.GetNextSelectedItem(pos);
nRetLen = listCtrl.GetItemText(nItem, LC_OBJ_NAME, m_SelectedPos.szVoidName, nBuffLen);
nRetLen = listCtrl.GetItemText(nItem, LC_COORD_X, strBuffer, nBuffLen);
m_SelectedPos.centr.x = atoi(strBuffer);
nRetLen = listCtrl.GetItemText(nItem, LC_COORD_Y, strBuffer, nBuffLen);
m_SelectedPos.centr.y = atoi(strBuffer);
nRetLen = listCtrl.GetItemText(nItem, LC_COORD_Z, strBuffer, nBuffLen);
m_SelectedPos.centr.z = atoi(strBuffer);
theApp.OnVoidListViewDbClick((WPARAM)&m_SelectedPos, 0);
}
*pResult = 0;
}
// ****************************************************************************
Завдання
Використовуючи програму з ,багатодокументною архітектурою забезпечити читання та запис текстових файлів з полями (розділяються комами) заданих об’єктів та відображення їх у дочірніх вікнах у вигляді таблиці.
ТИПОВІ ЗАВДАННЯ
Індивідуальними завданнями, тобто об’єктами для яких розробляється інтерфейс можуть довільні сутності довільної предметної області на вибір студента. Рекомендується продовжити розвивати завдання, що виконувалися студентами під час виконання лабораторних робіт з предмету «Програмування» ч. 2 (Об’єктно-Орієтоване).
Типовими сутностями для яких розроблятимуться моделі можуть бути:
1. Клас Box (коробка). Клас має атрибути length (довжина), wіdth (ширина) і height (висота), кожний з яких за замовчуванням дорівнює 1. Він має функції запису та читання для атрибутів. Функції запису повинні перевіряти, що атрибути – числа з плаваючою крапкою, що знаходяться в межах від 0.0 до 20.0. Він має функції-елементи, що обчислюють об’єм та площу поверхні, а також три функції для визначення обхвату коробки.
2. Клас Cylinder (циліндр). Клас має атрибути radius (радіус) і height (висота), кожний з яких за замовчуванням дорівнює 1. Він має функції запису та читання для атрибутів. Функції запису повинні перевіряти, що атрибути – числа з плаваючою крапкою, що знаходяться в межах від 1.0 до 10.0. Він має функції-елементи, що обчислюють об’єм та площу поверхні, а також три функції для визначення обхвату коробки.
3. Клас Quadrangle (чотирикутник). Клас зберігає Декартові координати чотирьох кутів чотирикутника. Конструктор приймає чотири групи координат. Повинні бути передбачені функції-елементи, що обчислюють периметр і площу, а також функція, що перевіряє чи передані координати визначають прямокутник. Довжиною повинне вважатися більше із двох вимірів.
4. Клас Circle (коло). Клас зберігає Декартові координати центра кола, а також значення точки на колі. Повинні бути передбачені функції-елементи, що обчислюють довжину кола, площу та діаметр.
5. Клас Triangle (трикутник). Клас зберігає Декартові координати трьох кутів трикутника. Конструктор приймає три групи координат. Повинні бути передбачені функції-елементи, що обчислюють периметр і площу, а також функція, що перевіряє чи трикутник є прямокутним.
6. Клас Persona (персона). Клас зберігає інформацію про персональні дані певної особи прізвище, ім’я, дату народження та ідентифікаційний код. Містить відповідні методи для доступу до полів класу та обчислення віку особи.
7. Клас LibCard (бібліотечна картка). Клас зберігає інформацію про книгу в бібліотеці: авторів, назву, рік видання та бібліотечний номер. Містить відповідні методи для доступу до полів класу.
ЗМІСТ ЗВІТУ ПРО ПРАКТИКУ
Титульна сторінка.
Мета практики.
Завдання (індивідуальне) на практику.
Аналіз завдання та опис вирішення задачі.
Текст програми (в електронному вигляді).
Описання результатів тестування.
Висновки.
НАВЧАЛЬНО-МЕТОДИЧНІ МАТЕРІАЛИ
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. Второе издание. М.: «Издательство Бином», 1999.
Страуструп Б. Язык программирования С++. Третье издание. - М.: «Издательство Бином», 1999.
Фейсон Т. Объектно-ориентированное программирование на BORLAND С++ 4.5.-М.: «Диалектика», 1999.
Грегори К. Использование Visual С++. Специальное издание. - М.: «Диалектика», 1999.
Мешков А.В., Тихомиров Ю.В. Visual С++ и MFC. Пер. с англ. – 2-е изд. перераб. и доп. – СПб.: БХВ - Петербург, 2002. – 1040 с.