
лаба5
.docxМІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
Інститут ІКНІ
Кафедра ПЗ
ЗВІТ
До лабораторної роботи №5
На тему: “ Створення та використання класів.”
З дисципліни: “Об’єкно-орієнтоване програмування”
Лектор:
Доцент каф. ПЗ
Коротєєва Є.В.
Виконав:
Студент гр. ПІ-13
Янко А.В.
Прийняв:
Асистент каф. ПЗ
Климаш Т.С.
Львів – 2014
Тема: Створення та використання класів.
Мета: Навчитися створювати класи, використовувати конструктори для
ініціалізації об’єктів, опанувати принципи створення функцій-членів. Навчитися використовувати різні типи доступу до полів та методів класів.
Теоретичні відомості
Ідея класів має на меті дати інструментарій для відображення будови об’єктів реального світу - оскільки кожен предмет або процес має набір характеристик (відмінних рис) іншими словами, володіє певними властивостями і поведінкою. Програми часто призначені для моделювання предметів, процесів і явищ реального світу, тому в мові програмування зручно мати адекватний інструмент для представлення цих моделей.
Клас є типом даних, який визначається користувачем. У класі задаються властивості і поведінка будь-якого предмету або процесу у вигляді полів даних (аналогічно до того як це є в структурах) і функцій для роботи з ними. Створюваний тип даних володіє практично тими ж властивостями, що і стандартні типи. Конкретні величини типу даних «клас» називаються екземплярами класу, або об'єктами. Об’єднання даних і функцій їх обробки з одночасним приховуванням непотрібної для використання цих даних інформації називається інкапсуляцією (encapsulation). Інкапсуляція підвищує ступінь абстракції програми: дані класу і реалізація його функцій знаходяться нижче рівня абстракції, і для написання програми з використанням вже готових класів інформації про них (дані і реалізацію функцій) не потрібно. Крім того, інкапсуляція дозволяє змінити реалізацію класу без модифікації основної частини програми, якщо інтерфейс залишився тим самим (наприклад, при необхідності змінити спосіб зберігання даних з масиву на стек). Простота модифікації, як уже неодноразово зазначалося, є дуже важливим критерієм якості програми.
Опис класу в першому наближенні виглядає так:
class <ім'я> {
[private:]
<Опис прихованих елементів>
public:
<Опис доступних елементів>
}; //Опис закінчується крапкою з комою.
Специфікатор доступу private і public керують видимістю елементів класу. Елементи, описані після службового слова private, видимі тільки всередині класу. Цей вид доступу прийнятий у класі за замовчуванням. Інтерфейс класу описується після специфікатора public. Дія будь-якого специфікатора поширюється до наступного специфікатора або до кінця класу. Можна задавати кілька секцій private і public, їх порядок значення не має.
Поля класу: можуть мати будь-який тип, крім типу цього ж класу (але можуть бути вказівниками або посиланнями на цей клас);
можуть бути описані з модифікатором const, при цьому вони ініціалізуються тільки один раз (за допомогою конструктора) і не можуть змінюватися;
можуть бути описані з модифікатором static (розглядається в наступних лабораторних).
Ініціалізація полів при описі не допускається.
Конструктори.
Конструктор призначений для ініціалізації об’єкту і викликається автоматично при його створенні. Автоматичний виклик конструктора дозволяє уникнути помилок, пов’язаних з використанням неініціалізованих змінних. Нижче наведені основні властивості конструкторів:
Конструктор не повертає жодного значення, навіть типу void. Неможливо отримати вказівник на конструктор.
Клас може мати декілька конструкторів з різними параметрами для різних видів ініціалізації (при цьому використовується механізм перевантаження).
Конструктор без параметрів називається конструктором за замовчуванням.
Параметри конструктора можуть мати будь-який тип, крім цього ж класу. Можна задавати значення параметрів за замовчуванням. Їх може містити тільки один з конструкторів.
Якщо програміст не вказав жодного конструктора, компілятор створює його автоматично.
Такий конструктор викликає конструктори за замовчуванням для полів класу і конструктори за замовчуванням базових класів. У разі, коли клас містить константи або посилання, при спробі створення об'єкту класу буде видана помилка, оскільки їх необхідно ініціалізувати конкретними значеннями, а конструктор за замовчуванням цього робити не вміє.
Конструктори не наслідуються.
Конструктори не можна описувати з модифікаторами const, virtual і static.
Конструктори глобальних об’єктів викликаються до виклику функції main. Локальні об’єкти створюються, як тільки стає активною область їх дії. Конструктор запускається і при створенні тимчасового об'єкта (наприклад, при передачі об’єкта з функції).
Конструктор викликається, якщо в програмі зустрілася будь-яка із синтаксичних конструкцій:
імя_класу ім’я_об’єкту [(список параметрів)];
//Список параметрів не повинен бути порожнім
імя_класу (список параметрів);
//Створюється об'єкт без імені (список може бути //порожнім)
ім’я_класу ім’я_об’екту = вираз;
//Створюється об’єкт без імені і копіюється
Завдання для лабораторної роботи
Створити клас відповідно до варіанту (див. Додаток).
При створенні класу повинен бути дотриманий принцип інкапсуляції.
Створити конструктор за замовчуванням та хоча б два інших конструктори для початкової ініціалізації об’єкта.
Створити функції члени згідно з варіантом.
Продемонструвати можливості класу завдяки створеному віконному застосуванню.
Лабораторне завдання
Клас Complex – комплексне число. Клас повинен містити функції-члени, які реалізовують: а)Додавання б)Віднімання в)Множення г)Піднесення до n-го
степеня д)Отримання кореня n-го степеня е)Задавання значень полів є)Зчитування (отримання значень полів) ж)Представлення в тригонометричній формі з)Введення комплексного числа з форми и)Виведення комплексного числа на форму.
Код програми
#include <clx.h>
#pragma hdrstop
#include <math.h>
#include <iostream.h>
#pragma argsused
using namespace std;
class Complex {
private:
double re;
double im;
public:
Complex (void){
}
Complex (double a,double b){
re=a;
im=b;
}
~Complex(void){
}
int n;
public:
void Sum(Complex a,Complex b){//Обчислення суми комплексних чисел
re=a.re + b.re;
im=a.im + b.im;
cout<<" Suma arif.forma: "<<re<<" + "<<im<<"i"<<endl;
double f1=sqrt(re*re+im*im);
double f2=re/f1;
double f3=im/f1;
cout<<" Trigonometr.suma "<<endl;
cout<<f1<<"(cos("<<f2<<")+isin("<<f3<<"))"<<endl;
}
void Riz(Complex a,Complex b){ //Обчислення різниці комплексних чисел
re=a.re-b.re;
im=a.im-b.im;
cout<<" Riznutsa: "<<re<<" + "<<im<<"i"<<endl;
double f1=sqrt(re*re+im*im);
double f2=re/f1;
double f3=im/f1;
cout<<"Trigonometr. riznutsa"<<endl;
cout<<f1<<"(cos("<<f2<<")+isin("<<f3<<"))"<<endl;
}
Complex Dobutok(Complex a,Complex b){ //Обчислення добутку комплексних чисел
Complex x;
x.re=a.re*b.re - a.im*b.im;
x.im=a.im*b.re + a.re*b.im;
cout<<" Mnozenja: "<<x.re<<" + "<<x.im<<"i"<<endl;
double f1=sqrt(x.re*x.re+x.im*x.im);
double f2=x.re/f1;
double f3=x.im/f1;
cout<<" Trigonometr. mnozenja"<<endl;
cout<<f1<<"(cos("<<f2<<")+isin("<<f3<<"))"<<endl;
return x;
}
Complex Dil(Complex a,Complex b){// Обчислення ділення комплексних чисел
Complex x;
if(b.re*b.re+b.im*b.im == 0)
{
cout<<" Dilenja na 0 ";
}
else
{
x.re=(a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im);
x.im=(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im);
cout<<" Dilenja: "<<x.re<<" + "<<x.im<<"i"<<endl;
double f1=sqrt(x.re*x.re+x.im*x.im);
double f2=x.re/f1;
double f3=x.im/f1;
cout<<" Trigonometr.dilenja: "<<endl;
cout<<f1<<"(cos("<<f2<<")+isin("<<f3<<"))"<<endl;
}
return x;
}
Complex Stepin(Complex a,Complex b){// Обчислення степеня комплексного числа
Complex x;
int n;
cout<<" VVedit Stepin Chysla: "<<endl;
cin>>n;
double r=sqrt(a.re*a.re+a.im*a.im);
double rn=pow(2,r);
double f2=n*a.re/rn;
double f3=n*a.im/rn;
cout<<" Trigonometr. forma vozvedenja v stepin a: "<<endl;
cout<<rn<<"(cos("<<f2<<")+isin("<<f3<<"))"<<endl;
return x;
}
Complex Korin(Complex a,Complex b){// Обчислення кореня комплексних чисел
Complex x;
int m;
int k;
cout<<" Vvedit chyslo korin stepenja: "<<endl;
cin>>m;
cout<<" Vvedit nomer korenja: "<<endl;
cin>>k;
double r=sqrt(a.re*a.re+a.im*a.im);
double rn= pow(2,r);
double f1=(m*a.re/rn+2*3,14*k)/m;
double f2=(m*a.im/rn+2*3.14*k)/m;
cout<<" Trigonometr. forma vuchuslenja korenja iz a: "<<endl;
cout<<rn<<"(cos("<<f1<<")+isin("<<f2<<"))"<<endl;
return x;
}
Complex Prusvoenja(Complex a,Complex b){//операція присвоєння, експонента комплексного числа
Complex x;
double r=sqrt(a.re*a.re+a.im*a.im);
double f2=a.re/r;
cout<<" Exponenta a: "<<endl;
cout<<r<<"e^(i*"<<f2<<")"<<endl;
return x;
}
void ShowComplex(){//вивід комплексного числа
cout<<"Vvedit Chyslo "<<endl;
cin>>re;
cin>>im;
cout<<" Arif.forma: "<<re<<" + "<<im<<"i"<<endl;
double z=sqrt(re*re+im*im);
cout<<" Modul chusla: "<<z<<endl;
cout<<" Trigonometr. forma "<<endl;
double f=re/z;
double f1=im/z;
cout<<z<<"(cos("<<f<<")+isin("<<f1<<"))"<<endl;
}
};
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
Complex a;
Complex b;
Complex c;
a.ShowComplex();
b.ShowComplex();
c.Sum(a,b);
c.Riz(a,b);
c.Dobutok(a,b);
c.Dil(a,b);
c.Stepin(a,b);
c.Korin(a,b);
c.Prusvoenja(a,b);
//c.ShowComplex();
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Результат виконання роботи
Виведення операцій над комплексними числами(рис.1).
Рис.1
Висновок
Виконавши дану лабораторну роботу, я навчився створювати класи, використовувати конструктори для ініціалізації об’єктів, опанував принципи створення функцій-членів, а також навчився використовувати різні типи доступу до полів та методів класів.