Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kurs_prog_2 / MetodichkаCPP KR-2006.pdf
Скачиваний:
7
Добавлен:
17.05.2015
Размер:
451.34 Кб
Скачать

Міністерство освіти і науки України

Вінницький національний технічний університет

МЕТОДИЧНІ ВКАЗІВКИ до виконання курсової роботи з дисципліни

"Програмування"

для студентів напрямів підготовки "Комп'ютерна інженерія" та "Інформаційна безпека"

Вінниця ВНТУ 2006

Міністерство освіти і науки України

Вінницький національний технічний університет

МЕТОДИЧНІ ВКАЗІВКИ до виконання курсової роботи з дисципліни

"Програмування"

для студентів напрямів підготовки "Комп'ютерна інженерія" та "Інформаційна безпека"

Затверджено Методичною радою Вінницького національного технічного університету як методичні вказівки для студентів напрямів підготовки "Комп'ютерна інженерія" та "Інформаційна безпека". Протокол № 3 від "17" листопада 2005 р.

Вінниця ВНТУ 2006

2

Методичні вказівки до виконання курсової роботи з дисципліни "Програмування" для студентів напрямів підготовки - "Комп'ютерна інженерія" та "Інформаційна безпека". / Уклад. О.І. Черняк, О.М. Ткаченко. - Вінниця: ВНТУ, 2006 - 47с.

Рекомендовано до видання Методичною радою Вінницького національного технічного університету Міністерства освіти і науки України.

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

Укладачі: Олександр Іванович Черняк Олександр Миколайович Ткаченко

Редактор В.О. Дружиніна Коректор З.В. Поліщук

Відповідальний за випуск зав. каф. ОТ О.Д. Азаров

Рецензенти: А.В. Дудатьєв, кандидат технічних наук, доцент. В.П. Майданюк, кандидат технічних наук, доцент.

3

 

 

ЗМІСТ

 

1.

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ ....................................................

5

 

1.1. Основні поняття об’єктно-орієнтованого програмування..............

5

 

1.2.

Опис класу ...........................................................................................

5

 

1.3.

Об’єкти класу.......................................................................................

7

 

1.4.

Особливості створення методів.........................................................

8

 

1.5.

Конструктори і деструктори............................................................

10

 

1.6.

Успадкування класів.........................................................................

11

 

1.7.

Перевизначення методів...................................................................

13

 

1.8.

Дружні зв’язки...................................................................................

14

 

1.9.

Віртуальні функції ............................................................................

16

2.

РЕКОМЕНДАЦІЇ ЩОДО ОФОРМЛЕННЯ КУРСОВОЇ РОБОТИ......

17

 

2.1. Правила оформлення пояснювальної записки...............................

17

 

2.2.

Структура пояснювальної записки..................................................

18

 

2.3.

Зразок титульної сторінки................................................................

20

 

2.4.

Зразок індивідуального завдання ....................................................

21

 

2.5.

Зразок програми меню.....................................................................

23

3.

ЗАВДАННЯ ДО КУРСОВОЇ РОБОТИ...................................................

29

4.

ДОВІДКОВА ІНФОРМАЦІЯ...................................................................

38

5.

РЕКОМЕНДОВАНА ЛІТЕРАТУРА.......................................................

46

4

1. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

1.1.Основні поняття об’єктно-орієнтованого програмування

Основа об'єктно-орієнтованого програмування (ООП) – використання класів. Клас – це визначений користувачем тип даних. У класах об'єднуються структури даних і функції їх обробки. За допомогою класів мова С++ реалізує такі принципи (парадигми) теорії об’єктного програмування:

Інкапсуляція – об'єднання в одному класі групи даних і функцій обробки цих даних. В ООП дані-члени класу називаються полями цього класу, а функції-члени класу називаються його методами. Інкапсуляція ховає внутрішню структуру складного об’єкта, дозволяючи програмісту працювати на більш високому рівні. Інкапсуляцію реалізовано у С++ за допомогою створення класів зі встановленням прав доступу до їх членів.

Успадкування – можливість створення ієрархії класів, при якій класинащадки копіюють поля і методи від класів-предків. Успадкування спрощує створення класів, що мають однакові члени. Успадкування реалізовано у С++ напряму.

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

Процес об’єктно-орієнтованого програмування складається з двох основних етапів: створення класів і використання об’єктів цих класів.

Мета ООП – спрощення програм за рахунок використання у них складних об’єктів.

Переваги ООП:

структуризація інформації;

спрощення алгоритмів обробки;

зменшення кількості параметрів функцій.

можливість розпаралелювання розробки програм;

зменшення кількості помилок при розробці програм;

можливість модифікації програм.

1.2.Опис класу

Опис класу складається із заголовка та тіла і закінчується крапкою з комою. Заголовок класу складається з ключового слова class та імені класу. Крім того, у заголовку класу можуть бути вказані імена базових класів та режими наслідування. Тіло класу обмежене фігурними дужками і містить оголошення полів та методів класу, розташованих у відповідних областях доступу: public, protected чи private. Як правило, клас описується на

5

глобальному рівні перед функцією main() та перед оголошенням тих функцій, що мають параметри даного класу. Це дозволяє за допомогою оголошення створювати об’єкти даного класу. Наприклад:

class CPoint

{

private: int x; int y;

public:

void Set(int x, int y); int GetX();

int GetY();

};

main()

{

CPoint point;

...

}

Області доступу до членів класу такі:

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

protected – захищена область. До членів класу, розташованих у цій області, можна звертатись у методах даного класу або у додатково створених функціях похідних класів.

private – закрита область. До членів класу, розташованих у цій області, можна звертатись тільки у методах даного класу.

Якщо в описі класу область доступу не вказується, то за замовчуванням вона встановлюєтья private.

Опис методів класу, як правило, здійснюється після функції main(). Опис методу відрізняється від опису звичайних функцій тим, що перед його іменем через подвійну двокрапку пишеться ім’я класу. Наприклад:

class CPoint

{

int x; int y;

public:

void Set(int x, int y);

};

main()

6

{

CPoint point;

...

}

void CPoint::Set(int x, int y)

{

this->x=x; this->y=y;

}

Невеликі методи, що не мають розгалужень можна описувати безпосередньо у тілі класу. Наприклад:

class CPoint

{

private: int x; int y;

public:

int GetX(){return x;} int GetY(){return y;}

};

main()

{

CPoint point;

...

}

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

1.3.Об’єкти класу

Об’єкти класу можна створювати статично за допомогою оголошень або динамічно за допомогою оператора new. Наприклад:

...

main()

{

7

CPoint Point1, Point2, masPoints[10]; CPoint *pPoint1, *pPoint2; pPoint1=new CPoint;

int kol1=10;

pPoint2=new CPoint[kol1]; CPoint &rPoint1=Point2; int kol2=20;

CPoint &rPoint2=*new CPoint[kol2];

}

Звертання до загальнодоступних об’єктів класу з функцій, що не належать даному класу, здійснюється через ім’я об’єкта, через вказівник на об’єкт або через посилання. Наприклад:

...

main()

{

Point1.Set(12,34);

masPoints[i].Set(10,20); pPoint1->Set(20,30); int x=pPoint2[3].GetX();

int y=rPoint1.GetY(); (&rPoint2)[4].Set(pPoint1->GetX(),Point1.GetY());

}

При динамічному створенні об’єктів класу після використання їх потрібно явно знищувати за допомогою оператора delete. Наприклад:

...

main()

{

...

delete pPoint1; delete []pPoint2; delete &rPoint1; delete []&rPoint2;

}

1.4.Особливості створення методів

Ім’я функції і набір параметрів без їх імен складають сигнатуру цієї функції. При компіляції ім’я функції замінюється на її сигнатуру. Наприклад, функція Summa(int x, int y) після компіляції матиме сигнатуру Summa_int_int. У класі може бути декілька методів з однаковими іменами, але різними наборами параметрів. Виклик таких методів відбувається за їх

8

сигнатурами. Цей механізм називається перевантаженням методів. Наприклад:

class CPoint

{

int x;

int y; public:

void Set(int x, int y){this->x=x; this->y=y;} void Set(int x){this->x=x;}

};

main()

{

CPoint p1, p2; p1.Set(10); p2.Set(10,20);

}

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

class A

{

public: int x;

void Set(int x=0);

};

main()

{

A &a=*new A[10]; A b, *pA=new A; (&a)[0].Set(); b.Set(10); pA->Set();

printf("a[0].x=%d, b.x=%d, pA->x=%d",(&a)[0].x,b.x,pA->x); delete []&a;

delete pA;

}

void A::Set(int x)

{

this->x=x;

}

9

1.5.Конструктори і деструктори

Створення об’єкта класу відбувається за допомогою конструктора. Конструктор – це метод класу, що має те саме ім’я, що і сам клас. Конструктор створюється програмістом, як правило, у загальнодоступній області. Якщо програміст не створює конструктор, то він створюється неявно. Конструктор ніколи не повертає значення, але може мати параметри. Параметри конструктора використовуються для ініціалізації. Конструктор викликається при статичному чи динамічному створенні об’єктів. Команди, написані у конструкторі, виконуються після створення ним об’єкта. Якщо клас має тільки конструктор з параметрами, то не можна створювати об’єкти без ініціалізації. Клас може мати декілька перевантажуваних конструкторів, серед яких можуть бути конструктори з параметрами і без параметрів, а також конструктори з параметрами за замовчуванням. Приклади створення і використання конструкторів:

class CPoint

{

private: int x; int y;

public:

CPoint(){}

CPoint(int x){this->x=x;}

CPoint(int x, int y){this->x=x; this->y=y;}

};

main()

{

CPoint p1, p2=10, p3(10), p4(10,20); CPoint masP1[10], masP2[]={1,2,3,4,5};

CPoint masP3[4]={CPoint(11,12),CPoint(33,22)}; CPoint *pP1=new CPoint;

pP1=CPoint(1,2);

CPoint *pP2=new CPoint[3]; pP2[0]=CPoint(11,22); pP2[1]=CPoint(33,40); CPoint &rP1=CPoint(44,55);

}

Деструктор – це метод класу, що знищує об’єкти даного класу. При статичному створенні змінних деструктор викликається автоматично. При динамічному створенні змінних деструктор викликається за допомогою оператора delete. Деструктор не має параметрів і не повертає значення.

10

Деструктор має те саме ім’я, що і класс. Перед іменем деструктора пишуть знак ~. Якщо деструктор не створено явно, то він створюється за замовчуванням. Команди, написані у деструкторі, виконуються перед знищенням об’єкта. Приклад створення і використання деструктора:

class СArrayInt

{

private:

int kol; int *ar;

public:

СArrayInt(int kol=1){this->kol=kol; ar=new int[kol];} ~СArrayInt(){delete []ar;}

};

main()

{

CArrayInt Array1(10),Array2; CArrayInt *pArray=new CArrayInt(100);

...

delete pArrayInt;

}

1.6.Успадкування класів

При успадкуванні розрізняють базовий клас (предок або батьківський клас) і похідний клас (нащадок або дочірній клас). Похідний клас успадковує з базового усі поля і методи. Факт успадкування вказується записом імені базового класу у заголовку похідного класу через двокрапку після власного імені. При цьому також вказується режим успадкування. Для успадкування базовий клас необхідно описати перед похідним. Наприклад:

class CPoint

{

private: int x; int y;

public:

void SetPoint(int x, int y){this->x=x; this->y=y;}

};

class CColorPoint : public CPoint

{

private:

11

int color; public:

void SetColorPoint(int x, int y, int color)

{

this->color=color; SetPoint(x,y);

}

};

main()

{

CColorPoint ColorPoint; ColorPoint.SetColorPoint(10,10,8);

...

}

Створений у класі В метод SetColorPoint() не може напряму звертатись до змінних x та y, успадкованих з класу А, оскільки ці змінні знаходяться в області private базового кдасу. До них може звертатись тільки успадкований з класу А метод SetPoint(). Якщо потрібно, щоб метод, створений у похідному класі, міг звертатись до захищених змінних базового класу, то ці змінні повинні знаходитись в області protected базового кдасу. Наприклад:

class CPoint

{

protected: int x; int y;

public:

void SetPoint(int x, int y){this->x=x; this->y=y;}

};

class CColorPoint : public CPoint

{

private:

int color; public:

void SetColorPoint(int x, int y, int color)

{

this->color=color; this->x=x; this->y=y;

}

};

12

Існують такі режими успадкування:

public;

protected;

private.

Наприклад:

class B : protected A

{

...

};

Режими успадкування можуть змінювати у похідних класах правила доступу до успадкованих членів базових класів. Це пояснює схема:

class B : public A

 

class B : protected A

 

class B : private A

A

 

B

 

A

 

B

 

A

 

B

 

 

 

 

 

 

 

 

 

 

 

private:

private:

private:

private:

private:

private:

 

 

 

 

 

 

 

 

 

 

 

protected

protected

protected

protected

protected

protected

 

 

 

 

 

 

 

 

 

 

 

public:

public:

public:

public:

public:

public:

 

 

 

 

 

 

 

 

 

 

 

1.7.Перевизначення методів

Перевизначення методів дозволяє замінювати у похідних класах окремі методи базових класів. Метод, що перевизначається, повинен мати у похідному класі таке саме ім’я, як і у базовому. При перевизначенні у похідному класі створюється два однакових методи, але через ім’я об’єкта похідного класу або через вказівник на об’єкт похідного класу буде викликатись перевизначений метод похідного класу. Методи базового класу можна викликати у методах похідного класу через ім’я чи вказівник на об’єкт похідного класу, явно вказуючи ім’я базового класу. Наприклад:

class CPoint

{

protected: int x; int y;

public:

void Output(){fillellipse(x,y,2,2);}

...

};

class CColorPoint : public CPoint

13

{

private:

int color; public:

void Output()

{

setcolor(color);

setfillstyle(1,color)};

CPoint::Output();

}

...

};

main()

{

CColorPoint ColorPoint;

//Викликається перевизначений метод класу CColorPoint: ColorPoint.Output();

//Викликається базовий метод класу CPoint: ColorPoint.CPoint::Output();

...

}

1.8.Дружні зв’язки

Дружні зв’язки дозволяють функціям, що є дружніми до даного класу, мати доступ до будь-яких членів цього класу. Друзів визначає клас, що надає доступ до своїх членів. Дружні зв’язки можуть встановлюватись до класів, функцій чи окремих методів класів. Дружній зв’язок до деякого класу означає, що всі методи цього класу є дружніми. Дружні зв’язки встановлюються у класах, але реалізуються через об’єкти. Тому, як правило, дружні функції одним зі своїх параметрів повинні мати посилання або вказівник на об’єкт того класу, що надає дружній доступ. Приклад встановлення і використання дружнього зв’язку до класу:

class A

{

private:

friend class B; int x;

}; class B

{

private:

...

14

public:

void ResetA(A &a){a.x=0;}

};

Приклад встановлення і використання дружнього зв’язку до функції:

class A

{

private:

friend void ResetA(A &a); int x;

public:

...

};

void ResetA(A &a);

Приклад встановлення і використання дружнього зв’язку до методу класу:

class A; class B

{

private:

...

public:

void ResetA(A &a);

}; class A

{

private:

friend void B::ResetA(A &a); int x;

public:

...

};

main()

{

Aa1,a2,a3;

Bb;

b.ResetA(a1);

}

void B::ResetA(A &a)

{

15

a.x=0;

}

Дружні зв’язки слід використовувати дуже обережно. Друзів повинно бути якнайменше.

1.9.Віртуальні функції

Віртуальні функції дозволяють звертатись до перевизначених методів похідних класів через вказівники на базовий клас. Це реалізується за допомогою механізму відкладеного зв’язування, що здійснюється у базовому класі за допомогою оголошення його методів віртуальними. Наприклад:

class A

{

private:

...

public:

void f1(){...} virtual void f2(){...}

};

class B : public A

{

private:

...

public:

void f1(){...} void f2(){...}

};

main()

{

A a, *pa1, *pa2; B b, *pb; pb=&b; pa1=&a; pa2=&b;

//Викликається A::f1(): a.f1();

pa1->f1(); pa2->f1();

//Викликається B::f1(): b.f1();

16

Соседние файлы в папке kurs_prog_2