Будь-який похідний клас може, в свою чергу, стати базовим для інших класів, і таким чином формується напрямлений граф ієрархії класів та об’єктів. В ієрархії похідний об’єкт успадковує дозволені для успадкування компоненти всіх базових об’єктів. Іншими словами, в об’єкта є можливість доступу до даних і методів усіх своїх базових класів.
Успадкування в ієрархії класів може відображатись і у вигляді дерева, і у вигляді більш загального напрямленого ациклічного графу. Дозволяється множинне успадкування - можливість для деякого класу успадковувати компоненти кількох ніяк не зв’язаних між собою базових класів.
Наприклад, за таким визначеннямS: X, Y, Z {...};
клас S породжений класами X, Y, Z, звідки він успадковує
компоненти.[2]
2. Постановка завдання
Основним етапом в розв’язку поставленої задачі є її постановка. Під час постановки завдання програміст повинен визначитися з вхідними даними, побудувати математичну модель задачі, вирішити основні проблеми.
В нашому випадку нам необхідно розробити систему обліку абонентів. Для початку нам необхідно розібратися з вхідними даними. Наша система повинна вміщувати в собі повну інформацію про кожного співробітника фірми, а саме:
· прізвище, ім’я, по-батькові;
· дату народження;
· адресу проживання;
· номер телефону;
Розібравшись зі вхідними даними нам потрібно визначитись, які функції виконуватиме наша система. Так як нам необхідно розробити програму обліку співробітників. То функції будуть наступними:
Добавлення нового абонента.
Відображення переліку всіх абонентів системи.
Видалення абонента.
Пошук абонента за визначиними критеріями (ПІБ, область, район, номер телефону).
Визначивши основні функції перейдемо до вирішення проблеми зберігання вихідних даних. Так як проект міститиме об’ємну кількість інформації, її доцільно буде зберігати у вигляді таблиць БД Access. І на кінець, нам потрібно вибрати мову програмування, для реалізації проекту. Для нашого проекту ми виберемо мову С++.
3. Побудова об’єктної моделі
Для побудови об'єктної моделі даної системи необхідно виконати наступні етапи:
визначення об'єктів і класів;
визначення залежностей між об'єктами;
визначення зв'язків;
побудова діаграми ієрархії класів.
.1 Визначення об'єктів та класів і зв’язків між ними
Аналізуючи постановку завдання і предметну область, можна виділити набір можливих класів. В цей набір будуть входити як стандартні класи мови програмування так і користувацькі класи, спроектовані користувачем
До стандартних класів, які будуть використовуватись в програмі належатимуть:
Форма 1 (Form1)
Форма 2 (Form2)
Кнопки (Button)
Текстові блоки (textBox)
Конектори (oleDbConnection)
Мітки (Label)
Таблиця (DataGridView)
Також в програмі будуть використовуватися власні класи:
Абстрактний клас Дані (dani)
Похідний клас Персональні дані (pdani)
Похідний клас Адреса(adress)
Агрегатний клас Абонент(Abonent)
Після визначення класів нам потрібно виділити об’єкти кожного з вище зазначених класів. Нижче наведено об’єкти класів:
В класі Form1 наявні об’єкти: 3 об’єкти класу Button, об’єкт класу Form2 об’єкт класу DataGridView і об’єкт класів oleDbConnection та oleDbDataAdapter.
Після того як ми визначилися з класами та об’єктами нам потрібго визначити зв’зки між ними.
Між виділеними класами потрібно виділити явні і неявні зв’язки.
Між класами Form1 s Form2 існує зв’язок використання. Клас Form1 викликає інші класи на виконання.
Клас Form2 передає дані від об’єктів класу textBox об’єкту класу Emploee.
Клас Abonent передає дані отримані від класу Form2 об’єкту класу oleDbConnection.
Класи Adress та pdani успадковуються від абстрактного класу dani.
Класи adress та pdani мають зв’язок агрегації з класом
Abonent. Остальній утворюється внаслідок множинного успадкування від перших.
.2 Побудова діаграми ієрархії класів
Провівши аналіз залежностей між класами на предмет виявлення зв'язків можна побудувати діаграму (ієрархію) класів. Діаграма класів дозволяє графічно відобразити кількість класів нашої майбутньої програми і зв’язки між цими класами. Для фізичного чи логічного проектування предметної області програмного додатка прийнято використовувати систему позначень Буча.
Для побудови цих діаграм використовуються такі основні елементи:
. Ілюстрація класу (рис. 1).
Рис. 1. Зображення класу
. Ілюстрація об’єкта (рис. 2).
Рис. 2. Зображення об’єкта
. Спеціалізація класів:
абстрактний клас (наприклад, клас тварин тощо) (рис. 3).
Рис. 3. Зображення абстрактного класу
дружній клас (такий клас, що має доступ до закритих членів
інших класів) (рис. 4).
Рис. 4. Зображення дружнього класу
4. Таблиця стрілок для подання відношень:
Таблиця 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Відповідно до побудованої об’єктної моделі системи, в якій ми визначили класи та об’єкти, а також встановили зв’язки між ними створими діаграму класів на основі нотації Буча.
Діаграма класів зображена на Рис. 5
Рис. 5. Діаграма класів у нотації Буча
4. Реалізація програми в середовищі Visual Studio C++
.1 Інтерфейс програми
Для гарної роботи нашої майбутньої програми, вона повинна бути легкою у використанні. Щоб програмою могли користуватися будь-які користувачі, створюють графічний інтерфейс. В Visual Studio C++ інтерфейс програми створюється за допомогою простих маніпуляцій «мишкою». Для цього просто на панелі інструментів потрібно вибрати необхідний компонент і помістити його на робочу область.
Для початку створення програми відкриваємо середовище
програмування Visual Studio C++ за допомогою піктограми на робочому столі
комп’ютера. В розділі створити вибираємо вкладку Windows Form і задаємо місце,
де буде зберігатися наш проект. Після цих дій перед нами появиться середовище
розробки зображене не рис.6.
Рис.6.Середовище розробки Visual Studio C++
Далі нам потрібно розробити інтерфейс програми. Для цього
Форму1 помістимо компонент DataGridView з панелі інструментів і 3 компоненти
Button. Так як наш проект буде зберігати дані в БД Access, то потрібно створити
зв’язок БД з нашою програмою. Для цього вибираємо компонент oleDbDataAdapter.
Після цього перед нами появиться майстер добавлення підключення де вказуємо
шлях до нашої БД. Вікно майстра зображено на рис. 7.
Рис.7. Вікно майстра добавлення підключення
Після того як ми створили інтерфейс програми і налаштували зв’язок з БД, можна перейти до програмування програми. Для цього вибираємо вкладку редактора коду і вводимо необхідні оператори. Лістинг коду Форми1 наведений в додатку 1.
Далі нам потрібно до нашого проекту додати 3 додаткові форми. Для цього потрібно вибрати наступні пункти: Проект->Додати новий елемент-> Форма Windows. Після цього аналогічним чином створюємо інтерфейс і програмуємо. Лістинг коду форми 2 наведені в додатках 2.
Оскільки наша програма містить користувацькі класи, потрібно
до проекту також додати файл заголовків де будуть описані наші класи. Для цього
виконуємо наступні команди: Проект->Додати клас. Перед нами появиться вікно
де потрібно описати наші класи. Для початку описуємо абстрактний клас dani:
ref class dani
{:::String ^dates;(void);void get()=0;
};
Абстрактний клас дані має одну чисто віртуальну функцію
virtual void get() яка повертає значення «0». Від цього класу успадковубться два
інших класи: adress та pdani.
Розглянемо перший клас:
ref class pdani:dani
{::String ^PIB;::String ^tell;
System::String ^dnar;()
{="";="";
dnar="";
}get()
{PD;^F2=gcnew Form2();.PIB=F2->textBox1->Text;
PD.dnar=F2->textBox2->Text;.tell=F2->textBox8->Text;->textBox1->Text="";
F2->textBox2->Text="";->textBox8->Text="";
};
};
Цей клас містить в собі 3 атрибути типу System::String, конструктор і один метод void get(). Метод void get() слугує для отримання значень від об’єктів класів textbox.
Другий клас аналогічний першому але він призначений для отримання інформації, яка відповідає даним про місце проживання абонента. Опис цього класу наведений нижче:
class adress:dani
{::String ^misto;::String ^obl;::String ^rajon;::String ^vul;
System::String ^bud;()
{="";="";="";
vul="";
bud="";
}get()
{Adr;^F2=gcnew Form2();
Adr.misto=F2->textBox3->Text;
Adr.obl=F2->textBox4->Text;
Adr.rajon=F2->textBox5->Text;
Adr.vul=F2->textBox6->Text;
Adr.bud=F2->textBox7->Text;
F2->textBox3->Text="";->textBox4->Text="";->textBox5->Text="";->textBox6->Text="";->textBox7->Text="";
};
};
Від вище наведених класів внаслідок множинного успадкування
утворюється клас Abonent:
ref class Abonent:pdani,adress
{:(void);::String ^PIB;::String ^dnar;::String ^tell;::String ^misto;::String ^obl;::String ^rajon;::String ^vul;
System::String ^bud;search()
{^F2=gcnew Form2();
F2->listBox1->Items->Clear();
int j;
System::String ^str;
str=F2->textBox1->Text;
for (j=0;j<F2->dataGridView1->RowCount;j++)
{
tell=F2->dataGridView1->Rows[j]->Cells[7]->FormattedValue->ToString();
rajon= F2->dataGridView1->Rows[j]->Cells[4]->FormattedValue->ToString();
obl= F2->dataGridView1->Rows[j]->Cells[3]->FormattedValue->ToString();
PIB= F2->dataGridView1->Rows[j]->Cells[0]->FormattedValue->ToString();
if((PIB==str) || (osvita==str) || (spec==str))
{
dnar= F2->dataGridView1->Rows[j]->Cells[1]->FormattedValue->ToString();
misto= F2->dataGridView1->Rows[j]->Cells[2]->FormattedValue->ToString();
vul= F2->dataGridView1->Rows[j]->Cells[5]->FormattedValue->ToString();
bud= F2->dataGridView1->Rows[j]->Cells[6]->FormattedValue->ToString();->listBox1->Items->Add(PIB+" "+dnar+" "+misto+" "+obl+" "+rajon+" "+vul+ " "+bud+" "+tell);
}
};get()
{PD;Adr;Abn;.PIB=PD.PIB;.misto= Adr.misto;.dnar=PD.dnar;.tell=PD.tell;.obl= Adr.obl;.rajon= Adr.rajon;.vul= Adr.vul;.bud= Adr.bud;
}set()
{^F2=gcnew Form2();->oleDbConnection1->Open();->oleDbDataAdapter1->InsertCommand->CommandText= "INSERT INTO `Абоненти` (`ПІБ`, `Дата народження`, `Місто`, `Область`, `Район`, `Вулиця`, `Будинок`, `Телефон`) VALUES ('"+PIB+"','"+dnar+"', '"+misto+"', '"+obl+"', '"+rajon+"', '"+vul+"', '"+bud+"', '"+tell+"')"; ->oleDbDataAdapter1->InsertCommand->ExecuteNonQuery();->oleDbConnection1->Close();
};
};
Цей клас містить в собі всі атрибути попередніх класів, а також три методи:
1. Метод void search() відповідає за пошук інформації за такими критеріями: ПІБ, номер телефона, область та район
. Метод void get() відповідає за отримання інформації від батьківських класів
. Метод void set() відповідає за збереження даних в БД
Після того як інтерфейс програми ми сформували, провели
процес її програмування, необхідно виконати перевірку правильності роботи.
Перевірка програми наведена в наступному розділі.
.2 Тестування програми
Щоб переконатися що програма працює вірно при різних варіантах вхідних даних необхідно провести її тестування. Тестування надає можливості зробити висновки виконання проекту і виявити можливі несправності. Щоб розпочати тестування програми натискаємо на клафішу «F5». Після цього перед нами появиться вікно нашої програми. Вікно програми зображено на рис. 8.
Як видно з рисунка вище, наша програма відображає дані з БД, отже цей блок проекту працює вірно і жодних помилок не виникає. Далі перевіряємо процес добавлення нових даних. Для цього натискаємо кнопку «Прийняти працівника». Перед нами з’являється вікно де ми можемо вводити в задані поля інформацію. Скріншот вікна показаний на рис. 9.
Рис. 8. Вікно програми.
Рис. 9. Вікно добавлення працівника
Після введення даних натискаємо кнопку прийняти і перевіряємо
чи добавились дані в БД. Помилок при добавлені не виникло тому можна зробити
висновок, що і ця частина програми працює вірно. Вікно з добавленими даними
зображено на рис.10.
Рис. 10. Вікно з добавленими даними
Завершальним кроком перевірки працездатності програми є
перевірка функції пошуку. Для цього в поле вводу критерію вводимо дані для
пошуку (даними можуть слугувати ПІБ абонента, номер телефону, область чи район)
і натискаємо клавішу «знайти абонента». Результати пошуку показані на рис. 11.
Рис.11. Результати пошуку
Провівши тестування розробленої нашої програми, можна зробити
висновок, що програма працює правильно при будь-яких вхідних даних і не видає
помилок.
Висновок
В ході виконання завдання курсової роботи з об’єктно-орієнтованого програмування, мною було вивчено базові конструкції мови програмування С++ з позиції об’єктного програмування; використано на практиці знання отримані мною на заняттях з дисципліни «Об’єктно-орієнтованого програмування»; розроблено і протестовано систему обліку співробітників, яка здійснює наступні функції: прийняття нового працівника,звільнення працівника та пошук працівника в базі за заданим критерієм, розвинено вміння викроистовувати основні приципи ООП і вміння працювати з класами та об’єктами.
Навички роботи з мовами програмування отримані мною під час
виконання курсової роботи необхідні для подальшого удосконалення професійних
здібностей програміста, збільшення рівня кваліфікації. Адже практичне
застосування теоретичних знань є однією з найбільш важливих частин підготовки
майбутнього спеціаліста.
1. Інформатика. Мова програмування С++. Спецкурс. 10-12 класи. Навчальний посібник / Лєхан С.А. - Шепетівка, «Аспект», 2007 - 160 с.
2. Об’єтно-орієнтоване програмування мовою С++, Навчальний посібник,Т.Є.Рак, Львів,2011 - 401с
. Борис Пахомов - C C++ и MS Visual С++ 2010 для начинающих - БХВ-Петербург, 2011 - 736 с.
Додаток 1
Лістинг Form1
#pragma once
#include "Form2.h"
#include "Dani.h"
#include "Abonent.h"kur {namespace System;namespace System::ComponentModel;namespace System::Collections;namespace System::Windows::Forms;namespace System::Data;namespace System::Drawing;
/// <summary>
/// Сводка для Form1
/// </summary>ref class Form1: public System::Windows::Forms::Form
{:(void)
{();
//
//TODO: добавьте код конструктора
//
}:
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
~Form1()
{(components)
{components;
}
}: System::Windows::Forms::Label^ label2;: : System::Windows::Forms::ListBox^ listBox1;: System::Data::OleDb::OleDbCommand^ oleDbSelectCommand1;: System::Windows::Forms::Label^ label1;: System::Data::OleDb::OleDbCommand^ oleDbInsertCommand1;: System::Windows::Forms::TextBox^ textBox1;: System::Windows::Forms::Button^ button3;: System::Data::DataColumn^ dataColumn8;: System::Windows::Forms::Button^ button2;: System::Data::OleDb::OleDbCommand^ oleDbUpdateCommand1;: System::Windows::Forms::Button^ button1;: System::Data::DataTable^ dataTable1;: System::Data::DataColumn^ dataColumn1;: System::Data::DataColumn^ dataColumn2;: System::Data::DataColumn^ dataColumn3;: System::Data::DataColumn^ dataColumn4;: System::Data::DataColumn^ dataColumn5;: System::Data::DataColumn^ dataColumn6;: System::Data::DataColumn^ dataColumn7;: System::Windows::Forms::DataGridView^ dataGridView1;: System::Data::OleDb::OleDbCommand^ oleDbDeleteCommand1;: System::Data::OleDb::OleDbCommand^ oleDbSelectCommand2;: System::Data::OleDb::OleDbCommand^ oleDbInsertCommand2;: System::Data::OleDb::OleDbCommand^ oleDbUpdateCommand2;: System::Data::OleDb::OleDbCommand^ oleDbDeleteCommand2;: System::Data::OleDb::OleDbDataAdapter^ oleDbDataAdapter1;: System::Windows::Forms::DataGridViewTextBoxColumn^ пІБDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ датаНародженняDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ містоDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ областьDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ районDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ вулицяDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ будинокDataGridViewTextBoxColumn;: System::Windows::Forms::DataGridViewTextBoxColumn^ телефонDataGridViewTextBoxColumn;: System::Windows::Forms::BindingSource^ bindingSource1;: System::Data::DataSet^ dataSet1;: System::Data::DataTable^ dataTable2;: System::Data::DataColumn^ dataColumn9;: System::Data::DataColumn^ dataColumn10;: System::Data::DataColumn^ dataColumn11;: System::Data::DataColumn^ dataColumn12;: System::Data::DataColumn^ dataColumn13;: System::Data::DataColumn^ dataColumn14;: System::Data::DataColumn^ dataColumn15;: System::Data::DataColumn^ dataColumn16;: System::Data::OleDb::OleDbConnection^ oleDbConnection1;: System::ComponentModel::IContainer^ components;: