Композиція та успадкування класів
Міністерство
освіти та науки України
Національний
університет «Львівська політехніка»
Кафедра
інформаційних
систем
та мереж
Звіт
до розрахункової роботи
з
дисципліни: «Об’єктно-орієнтоване програмування»
на
тему:
«Композиція
та успадкування класів»
Львів
2014
Зміст
Завдання для розрахункової роботи
Формулювання задачі
Структура програми
Проектування інтерфейсу користувача
Розроблення графічних схем класів та
алгоритмів
Контрольний приклад та аналіз
результатів комп’ютерної реалізації програми
Список використаної літератури
Додаток(тексти програм)
Завдання для розрахункової роботи
Завдання 6
. Створити клас ОСОБА (прізвище,
ім’я, по батькові, дата народження, стать та ін.).
. Визначити конструктори
ініціалізації, копіювання, деструктори та методи для зміни і читання значень
полів даного класу.
. Перевантажити операцію () для
встановлення значень полів даних, операцію присвоєння об’єктів = , потокові
операції введення >> та виведення << об’єктів.
. Створити похідний клас СЛУЖБОВЕЦЬ
з додатковими полями - організація, спеціальність за дипломом, посада, оклад,
стаж роботи. Визначити необхідні дані, методи, конструктори та деструктори,
методи або операторні функції введення-виведення.
. У межах ієрархії класів побудувати
поліморфічний кластер на основі віртуального методу читання прізвища особи або
назви організації. Продемонструвати механізм пізнього зв’язування.
. Розробити клас ОРГАНІЗАЦІЯ, що
містить масив об’єктів класу СЛУЖБОВЕЦЬ. Знайти кількість осіб, стаж роботи
яких перевищує наперед задане значення.
. Для роботи з масивом об’єктів
побудувати та використати клас-ітератор.
Формулювання задачі
Відповідно до завдання мені потрібно
буде побудувати 3 класи:
Особа
Службовець
Організація (з вбудованим класом
ітератором)
Клас Особа буде базовим класом та
буде містити такі поля: прізвище, ім’я, по
батькові, дата народження, стать. Та містити в собі віртуальні інтерфейсні
методи та методи з перевантаженими операціями.
Клас Службовець буде доповнювати
клас Особа ще декількома полями такими як: організація,
спеціальність за дипломом, посада, оклад, стаж роботи.
Клас організація буде містити
масив-контейнер для зберігання об’єктів типів Особа та Службовець, а також
інтерфейсний метод для маніпулювання даними всередині контейнера.
Структура програми
У створюваній програмі
використовується багатофайлова система побудови коду. Головна програма включає
в себе заголовкові файли інших програмних модулів які відповідно містять в собі
оголошення та визначення класів котрі використовуються у програмі.
При такій організації структури
програми її можна утотожнити із загальною структурою побудови програми. Тому
буде використана така файлова структура:.cpp - файл коду програми який містить
у собі виклики методів та створення базових об’єктів..h - заголовковий файл що
оголошує та визначає похідний клас з даним та методами..h - заголовковий файл
що містить контейнерний клас з масивом об’єктів та методами маніпулювання
ними..h - заголовковий файл що оголошує та визначає базовий клас з даним та
віртуальними методами для подальшого перевизначення.
Проектування інтерфейсу користувача
У даній програмі використано
консольний інтерфейс користувача. Головне меню запускається за допомого методу
класу «Організація» та містити в собі 5 пунктів:
1 - Add Emploee -
Додати працівника
- Edit Emploee -
Редагувати працівника
- Print Personal
Info - Надрукувати персональні дані працівників
- Count of E with
Exp > then - Знайти кількість осіб, стаж роботи яких перевищує наперед
задане значення
- Exit
- вихід з програми
Дане меню створено за допомогою
switch-case оператора використаного у циклі.
Розроблення графічних схем класів та
алгоритмів
Графічні схеми розроблені та
побудовані засобами середовища програмування.
Діаграма залежностей для проекту:
Деталізована діаграма методів класів
та алгоритмів:
Класи «Ітератор» та «Організація»
Класи «Персона» , «Службовець» та
допоміжна структура «Дата»
Інструкція користувачу
Після запуску програми з’явиться
головне меню та базово задані дані створені за допомогою конструкторів різних
типів.
При виборі пункту 1 потрібно ввести
через пробільні символи дані про нового працівника.
У другому пункті також потрібно
ввести повні дані якими буде замінено попередню інформацію.
Третій пункт використовуючи пізнє
зв’язування виводить інформацію з базового класу.
Четвертий - відповідно до завдання,
за допомогою методу класу «Організація» виведе кількість наявних в базі
працівників досвід роботи яких перевищує задане число.
П’ятий пункт завершує роботу з
програмою, почергово викликаючи деструктори та вивільняючи пам’ять.
Контрольний приклад та аналіз
результатів комп’ютерної реалізації програми
Запуск програми
Додавання працівника
Результат
Результат
Друк персональної інформації шляхом
видобування інформації із базового класу
Виведення кількості працівників з
досвідом більше заданого
Вихід з програми
Список використаної
літератури
Конспект
лекцій з дисципліни: «Об’єктно-орієнтоване програмування», Кравець П.О., 2013
рік
«Об’єктно-орієнтоване
програмування», підручник, Кравець П.О.
Медіа
ресурс:
<http://om.univ.kiev.ua/users_upload/15/upload/file/prog_lecture_09.pdf>
Додаток(тексти програм)
клас алгоритм графічний інтерфейс
Код головної програми
#define
_CRT_SECURE_NO_WARNINGS
#include
<cstdlib>
#include <iostream>
#include
"Person.h"
#include
"Employee.h"
#include
"Organization.h"namespace std;main()
{("chcp 1251
>
nul");FBI;<Employee>I(FBI);S("Іванов","Іван","Іванович",0,12,5,87,"FBI","CS","Manager",5424,5);.Add(S);.Add("Сидорів","Сидір","Сидорович",0,11,2,90,"NASA","SA","Tester",3123,2);*
SA = new
Employee("Головач","Олена","Федорівна",1,2,9,91,"FBI","FL","Makler",3444,1);.Add(*dynamic_cast<Employee*>(SA));SA;.MainMenu();
}
Код класу «Organization»
#pragma once
#include
"Employee.h"const Amount_Employes = 40;Organization
{Array[
Amount_Employes ];:int NowCount;MainMenu()
{c;(true)
{("cls");<<"Organizationstuff:
"<<endl;();<<endl<<"1 - Add Emploee
"<<endl;<<"2 - Edit Emploee
"<<endl;<<"3 - Print Personal Info
"<<endl;<<"4 - Count of E with Exp >
then"<<endl;<<"0 - Exit "<<endl;=
getchar();temp;n;(c)
{:<<"Wrong
choise "<<endl;;'0':<<"Exit";
_sleep(200);('.');
_sleep(200);('.');
_sleep(200);('.');
_sleep(200);(0);;'1':<<"Enter
Data:"<<endl;>>temp;(temp);;'3':();;'2':<<"Enter #
of Emploee"<<endl;>>n;(n>NowCount && n<0)
{<<"Wrong
#"<<endl;>>n;
}-;<<"Enter
new Data:"<<endl;>>temp;[n] = temp;;'4':<<"Then
:"<<endl;>>n;<<"Exp
Count:"<<ExpCount(n)<<endl;;
}("pause");
}
}* GetBase()
{Array;
}ExpCount(int N)
{Count = 0;(int i =
0; i < NowCount; i++)
{(
(Array[i]).GetExperience() > N)
{
++Count;
}
}Count;
}PrintAll()
{<<"--------------------------------------------------------------------------------------------------------------------------------"<<endl;<<"SNameNameFNameGenderBirth
DateOrganizationSpecialtyPositionExperienceSalary"<<endl;<<"--------------------------------------------------------------------------------------------------------------------------------"<<endl;(int
i = 0; i < NowCount; i++)
{<<Array[i]<<endl;
}
}PrintPerson()
{<<"---------------------------------------------------"<<endl;<<"SNameNameFNameGenderBirth
Date"<<endl;<<"---------------------------------------------------"<<endl;(int
i = 0; i < NowCount; i++)
{<<(Person)Array[i]<<endl;
}
}Add(Employee &
E)
{[NowCount] = E;
++NowCount;
}Add(char SN[],char
N[],char F[],bool G,int DD,int MM,int YYYY,char O[],Sp[],char P[],int S,int E)
{t(SN,N,F,G,DD,MM,YYYY,O,,P,S,E);[NowCount]
= t;
++NowCount;
}()
{
}
~Organization()
{
}
};Organization::NowCount
= 0;<class T>Iterator
{= (T*)t.GetBase();
}
& GetCurData()
{*I;
}
& operator++()
{*I+=1;
}&
operator++(int)
{*I+=1;
}
& operator--()
{*I-=1;
}
&
operator--(int)
{*I-=1;
}
& operator=(T
& t)
{I=t;
}
()
{}
~Iterator()
{}
};
Код класу “Person”
#pragma once
#include<cstring>
#include<iostream>namespace
std;Date
{DD;MM;YYYY;(){}(int
D,int M,int Y)
{= D;= M;= Y;
}
};Person
{SName[32];Name[32];FName[32];Gender;
:Date BDate;*
SetSName(char * SN)
{(SName,SN);SName;
}* SetName(char *
N)
{(Name,N);Name;
}* SetFName(char *
FN)
{(FName,FN);FName;
}&
SetGender(bool G)
{= G;Gender;
}* SetDate(int
DD,int MM, int YYYY)
{.DD = DD;.MM =
MM;.YYYY = YYYY;& BDate;
}
(){}(char SN[],char
N[],char F[],bool G,int DD,int MM,int YYYY):(G), BDate(DD , MM , YYYY)
{(SName,SN);(Name,N);(FName,F);
}
(Person & P)
{= P.Gender;(SName,
P.SName);(Name,P.Name);(FName,P.FName);.DD = P.BDate.DD;.MM = P.BDate.MM;.YYYY
= P.BDate.YYYY;
}~Person(){}
istream &
operator >> (istream & is,Person&);
ostream&
operator<<(ostream&, Person&);
& operator ()
(char SN[],char N[],char F[],bool G,int DD,int MM,int YYYY)
{= G;.DD = DD;.MM =
MM;.YYYY = YYYY;(SName,SN);(Name,N);(FName,F);
}
char *GetSName()
{SName;
}char *GetName()
{Name;
}char *GetFName()
{FName;
}boolGetGender()
{Gender;
}struct Date
GetDate()
{BDate;
}int
GetExperience(){return 0;}
};& operator
<<(ostream & os,Person & P)
{.widen(10);os<<P.GetSName()<<'\t'<<P.GetName()<<'\t'<<P.GetFName()
<<'\t'<<(P.GetGender()?'Ж':'Ч')<<'\t'
<<P.GetDate().DD<<'.'<<P.GetDate().MM<<'.'<<P.GetDate().YYYY;
{is>>P.SetName("")>>P.SetSName("")>>P.SetFName("")
>>P.SetGender("")>>P.BDate.DD>>P.BDate.MM>>P.BDate.YYYY;
};
Код класу «Emploee»
#pragma once
#include
<cstring>
#include
"person.h"Employee : public Person
{Organization[32];Specialty[32];Position[32];Salary;Experience;:GetExperience()
{Experience;
}(Employee & E)
{(Organization,E.Organization);(Position,E.Position);(Specialty,E.Specialty);=
E.Salary;= E.Experience;
}(char SN[],char
N[],char F[],bool G,int DD,int MM,int YYYY,char O[],Sp[],char P[],int S,int E)
:Salary(S),Experience(E),Person(SN,N,F,G,DD,MM,YYYY)
{(Organization,O);(Position,P);(Specialty,Sp);
}char *GetSName()
{Person::GetSName();
}
char *GetName()
{Person::GetName();
}
char *GetFName()
{Person::GetFName();
}
boolGetGender()
{Person::GetGender();
}struct Date
GetDate()
{Person::GetDate();
}(){}
~Employee(){}
istream&
operator >> (istream & is,Employee& P);ostream& operator
<<(ostream & os, Employee& P);
};& operator
<<(ostream & os, Employee & P)
{.widen(10);os<<P.GetSName()<<'\t'<<P.GetName()<<'\t'<<P.GetFName()
<<'\t'<<(P.GetGender()?'Ж':'Ч')<<'\t'
<<P.GetDate().DD<<'.'<<P.GetDate().MM<<'.'<<P.GetDate().YYYY
<<"\t\t"<<P.Organization<<"\t\t"<<P.Specialty<<"\t\t"<<P.Position
<<"\t\t"<<P.Experience<<"\t\t"<<P.Salary;
}& operator
>> (istream& is, Employee& P )
{is>>P.SetName("")>>P.SetSName("")>>P.SetFName("")
>>P.SetGender("")>>P.BDate.DD>>P.BDate.MM>>P.BDate.YYYY
>>P.Organization>>P.Specialty>>P.Position>>P.Experience>>P.Salary;
};