Студопедия — Lab6.cpp
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Lab6.cpp






#include " stdafx.h"

#include " Employee.h"

#include < iostream>

#include < fstream>

#include < conio.h>

#include < string.h>

#include " ContractorEmployee.h"

#include " DaypaymentEmployee.h"

#include " HourlyEmployee.h"

using namespace std;

void loademploee (Employee* a[], int & n){

char FN[20], LN[20]; int age, arg; double pay;

char sel; // Селектор, що задає тип оплати

ifstream file (" emp.dat"); // Створюємо вхідний потік для читання

// file і звязуємо його з зовнішнім файлом emp.dat.

n = 0;

while (file.peek ()! = EOF){ // Поки немає кінця файлу …

file > > sel;

file > > FN;

file > > LN;

file > > age;

file > > pay;

file > > arg;

switch (sel){

case 'h': a[n] = new HourlyEmployee (FN, LN, age, pay, arg);

break;

case 'c': a[n] = new ContractorEmployee (FN, LN, age, pay);

break;

case 'd': a[n] = new DaypaymentEmployee (FN, LN, age, pay, arg);

break;

}

n++;

}

}

void main(){

setlocale(LC_ALL, " Ukrainian");

int n=3;

Employee* a[3];

//clrscr();

loademploee (a, n);

double s=0, r;

for(int i=0; i< =3; i=i+1)

{r=a[i]-> CalculatePay ();

s+=r;

a[i]-> print();

cout < < r < < " $\n"; }

 

cout< < " За цей мiсяць заплачено: ";

cout < < s < < " $\n";

cout< < " Натиснiть будь-яку клавiшу! ";

while(! kbhit());

}


Рис. 1. Вигляд вікна в результаті компіляції програми

 

 

Рис. 2. Вміст файлу emp.dat

 

Рис. 3. Діаграма класів

7.5. Індивідуальні завдання

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

2. Створити абстрактний базовий клас з віртуальною функцією: норма. Створити похідні класи: комплексні числа, вектор з 10 елементів, матриця (2× 2). Визначити функцію норми: для комплексних чисел – модуль числа, для вектора – корінь квадратний з суми квадратів елементів, для матриці – максимальне значення за модулем. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

3. Створити абстрактний клас криві для обчислення залежностей y від x. Створити похідні класи: пряма, еліпс, гіпербола з своїми функціями обчислення y(x) залежно від вхідного параметра х (рівняння прямої – у=ах+b, еліпса – x2/a2+y2/b2=1, гіперболи – x2/a2-y2/b2=1). Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

4. Створити абстрактний базовий клас з віртуальною функцією – сума прогресії. Створити похідні класи: арифметична прогресія і геометрична прогресія. Кожен клас має два поля типу double. Перше – перший член прогресії, друге – постійна різниця для арифметичної і постійне відношення – для геометричної прогресії. Визначити функцію обчислення суми, де параметром є кількість елементів прогресії (арифметична прогресія: aj=a0+jd, j=0, 1, 2, … і її сума sn=(n+1)(a0+an)/2, геометрична прогресія: aj=a0rj, j=0, 1, 2, … і її сума sn=(a0-anr)(1-r). Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

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

6. Створити абстрактний базовий клас з віртуальною функцією – площа поверхні. Створити похідні класи: пералелепіпед, тетраедр, куля з своїми функціями площі поверхні. Площа поверхні паралелепіпеда – 6xy, кулі – 4π r2, тетраедра – a2*31/2. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

7. Створити абстрактний базовий клас з віртуальною функцією – об’єм. Створити похідні класи: пералелепіпед, піраміда, тетраедр, куля з своїми функціями об’єму. Об’єм паралелепіпеда – xyz, піраміди – xyh, кулі – 4π r3/3, тетраедра – a3*21/2/12. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

8. Створити абстрактний клас – ссавці. Визначити похідні класи – тварини і люди. У тварин визначити похідні класи коней і корів. Визначити віртуальні функції опису людини, коня і корови. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

9. Створити базовий клас – батько, у якого є ім’я. Визначити віртуальну функцію виведення імені на екран. Створити похідний клас дитина, у якого є поле по-батькові. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

10. Створити абстрактний базовий клас з віртуальною функцією – корені рівняння. Створити похідні класи: клас лінійних рівнянь і клас квадратних рівнянь. Визначити функцію обчислення коренів рівнянь. Для перевірки визначити масив вказівників на абстрактний клас, яким присвоюються адреси різних об’єктів.

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

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

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

14. У відкритій частині базового класу знаходиться віртуальний метод, який виводить назву свого класу. Утворити два похідні класи DerA i DerB. Від класів DerA i DerB шляхом множинного успадкування створити клас DerAB. Перевизначити в кожному з класів віртуальну функцію так, щоб вона виводила на екран дійсне ім’я класу об’єкту, з якого вона викликається. Для кожного з класів створеної ієрархії створити по одному об’єкту і для кожного з них викликати віртуальну функцію. Створити масив із N вказівників на базовий клас ієрархії. Для кожного з них створити динамічний об’єкт, по одному для кожного з класів ієрархії. Викликати віртуальні функції для кожного з динамічних об’єктів за допомогою вказівників.

15. Написати програму з використанням віртуальних методів, яка оголошує клас Point, що визначає координати пікселя на екрані дисплею та віртуальний метод MoveTo його випадкового переміщення по екрану. Визначити похідний клас Circle, який успадковує клас Point, визначає радіус коло та пере визначає віртуальний метод MoveTo для випадкового переміщення кола в межах екрану.

7.6. Контрольні запитання

1. Чи проявляється поліморфізм при перезавантаженні операторів і функцій?

2. Чи наслідується конструктор у похідному класі?

3. Для чого використовуються віртуальні функції?

4. Чи можуть функції похідного класу використовувати закриті члени базового класу?

5. Чи можливе повторне визначення віртуальних функцій у похідному класі?

6. Що таке повністю віртуальна функція?

7. Які властивості мають дружні функції та дружні класи?

8. Що таке поліморфізм в ООП?

9. Чи може виклик однієї і тієї ж функції з однаковими параметрами при використанні принципів ООП дати різні результати?

10. В якому випадку множинного наслідування базовий клас та його функції описуються віртуальними?

11. Поясніть коментарі в наведеному прикладі програми.

12. Поясніть суть правила домінування імен при множинному наслідуванні.

Лабораторна робота №8. Шаблони функцій і класів

МЕТА РОБОТИ: навчитись створювати та використовувати шаблони функцій та узагальнені класи.

8.1. Програма роботи

8.1.1. Отримати завдання.

8.1.2. Написати програми відповідних класів, основну та відповідні допоміжні функції, згідно з вказівками до виконання роботи.

8.1.3. Підготувати власні коректні вхідні дані (вказати їх формат і значення) і проаналізувати їх.

8.1.4. Оформити електронний звіт про роботу та захистити її.

8.2. Вказівки до виконання роботи

8.2.1. Студент, згідно з індивідуальним номером, вибирає своє завдання з розд. 8.5 і записує його до звіту.

8.2.2. Оголошення класу (структури), основну та відповідні допоміжні функції необхідно запрограмувати так, як це показано у розд. 8.4.

8.2.3. Власних вхідних даних необхідно підготувати не менше двох комплектів. Їхні значення мають бути коректними, знаходитися в розумних межах і відповідати тим умовам, які стосуються індивідуального завдання.

8.2.4. Звіт має містити такі розділи:

● мету роботи та завдання з записаною умовою задачі;

● коди всіх використовуваних.h і.ccp файлів, а також пояснення до них;

● результати реалізації програми;

● діаграму класів та діаграму варіантів використання з поясненням;

· висновки, в яких наводиться призначення програми, обмеження на її застосування і можливі варіанти удосконалення, якщо такі є.

8.3. Теоретичні відомості

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

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

Узагальнена функція – це функція, яка перевантажує сама себе.

template < class Ttype> тип ім'я_функції (список_параметрів)

{

// тіло функції

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

Узагальнені класи особливо корисні тоді, коли в них використовується логіка, яку можна узагальнити. Наприклад, алгоритми, які підтримують функціонування черги цілочисельних значень, також надаються і для черги символів. Механізм, який забезпечує підтримку зв'язного списку поштових адрес, також годиться для підтримки зв'язного списку, призначеного для зберігання даних про запчастини до автомобілів. Після створення узагальнений клас зможе виконувати визначену програмістом операцію (наприклад, підтримку черги або зв'язного списку) для будь-якого типу даних. Компілятор автоматично згенерує коректний тип об'єкта на основі типу, що задається під час створення об'єкта.

Загальний формат оголошення узагальненого класу має такий вигляд:

template < class Ttype > class ім'я_класу {

.

.

.

}

У цьому записі елемент Ttype є " заповнювачем" для імені типу, який буде заданий під час реалізації класу. У разі потреби можна визначити декілька узагальнених типів даних, використовуючи перелік елементів, розділених між собою комами.

Створивши узагальнений клас, можна створити його конкретний примірник, використовуючи такий загальний формат:

ім'я_класу < тип > ім'я_об'єкту;

У цьому записі елемент тип означає ім'я типу даних, які оброблятимуться примірником узагальненого класу. Функції-члени узагальненого класу автоматично є узагальненими. Тому програмісту не потрібно використовувати ключове слово template для безпосереднього визначення їх такими.

8.4. Зразок виконання роботи

Завдання 1. Створити шаблон функції для визначення абсолютного значення числа і продемонструвати її роботу для різних типів: int, double, float, long.

#include " stdafx.h"

#include < iostream>

#include < string>

#include < ctime>

#include < conio.h>

using namespace std; // Використання стандартного простору імен

 

template < class aType> aType myAbs(aType num)

{

return num < 0? -num: num;

}

 

int main()

{

cout < < myAbs(-10) < < " \n"; // Для типу int

cout < < myAbs(-10.0) < < " \n"; // Для типу double

cout < < myAbs(-10L) < < " \n"; // Для типу long

cout < < myAbs(-10.0F) < < " \n"; // Для типу float

 

cout< < " press any key! ";

while(! kbhit());

 

}

Рис.1. Вигляд вікна виконавчого файлу, діаграма класів та діаграма варіантів використання завдання 1

Завдання 2. Створити шаблонний клас масиву, в якому є методи для обчислення суми і середнього значення чисел, які зберігаються в даному масиві. В головній функції продемонструвати роботу масиву з типами даних int і float.

 

#include " stdafx.h"

#include < iostream>

#include < ctype.h>

#include < string>

#include < conio.h>

#include < stdlib.h>

using namespace std;

 

template< class T, class T1> class array1

{

private:

T *data;

int size;

int index;

public:

array1(int size);

T1 sum(void);

T average_value(void);

void show_array1(void);

int add_value(T);

};

 

template< class T, class T1> array1< T, T1>:: array1(int size)

{ setlocale(LC_ALL, " Ukrainian");

data = new T[size];

if (data == NULL)

{ cerr < < " Недостатньо пам'ятi - програма завершується"; cout < < endl;

exit(1);

}

array1:: size = size;

array1:: index = 0;

}

 

template< class T, class T1> T1 array1< T, T1>:: sum(void)

{ T1 sum = 0;

for (int i = 0; i < index; i++) sum += data[i];

return(sum);

}

 

template< class T, class T1> T array1< T, T1>:: average_value(void)

{ T1 sum =0;

for (int i = 0; i < index; i++) sum += data[i];

return (sum / index);

}

 

template< class T, class T1> void array1< T, T1>:: show_array1(void)

{ for (int i = 0; i < index; i++) cout < < data[i] < < ' ';

cout < < endl;

}

 

template< class T, class T1> int array1< T, T1>:: add_value(T value)

{ if (index == size)

return(-1); // Масив повен

else

{

data[index] = value;

index++;

return(0); // Успiшно

}

}

 

void main(void)

{

setlocale(LC_ALL, " Ukrainian");

// Масив з 100 елементiв

array1< int, long> numbers(100);

// Масив з 200 елементiв

array1< float, float> values(200);

int i;

for (i = 0; i < 50; i++) numbers.add_value(i);

numbers.show_array1();

cout < < " Сума чисел рiвна "; cout < < numbers.sum () < < endl;

cout < < " Середнє значення рiвне "; cout < < numbers.average_value() < < endl;

for (i = 0; i < 100; i++) values.add_value(i * 100);

values.show_array1();

cout < < " Сума чисел рiвна "; cout< < values.sum() < < endl;

cout < < " Середнє значення рiвне "; cout< < values.average_value() < < endl;

while(! kbhit());

}

Рис.2. Вигляд вікна виконавчого файлу, діаграма класів та діаграма варіантів використання завдання 2

 

8.5. Індивідуальні завдання







Дата добавления: 2014-11-10; просмотров: 2869. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

ЛЕЧЕБНО-ПРОФИЛАКТИЧЕСКОЙ ПОМОЩИ НАСЕЛЕНИЮ В УСЛОВИЯХ ОМС 001. Основными путями развития поликлинической помощи взрослому населению в новых экономических условиях являются все...

МЕТОДИКА ИЗУЧЕНИЯ МОРФЕМНОГО СОСТАВА СЛОВА В НАЧАЛЬНЫХ КЛАССАХ В практике речевого общения широко известен следующий факт: как взрослые...

СИНТАКСИЧЕСКАЯ РАБОТА В СИСТЕМЕ РАЗВИТИЯ РЕЧИ УЧАЩИХСЯ В языке различаются уровни — уровень слова (лексический), уровень словосочетания и предложения (синтаксический) и уровень Словосочетание в этом смысле может рассматриваться как переходное звено от лексического уровня к синтаксическому...

Расчет концентрации титрованных растворов с помощью поправочного коэффициента При выполнении серийных анализов ГОСТ или ведомственная инструкция обычно предусматривают применение раствора заданной концентрации или заданного титра...

Психолого-педагогическая характеристика студенческой группы   Характеристика группы составляется по 407 группе очного отделения зооинженерного факультета, бакалавриата по направлению «Биология» РГАУ-МСХА имени К...

Общая и профессиональная культура педагога: сущность, специфика, взаимосвязь Педагогическая культура- часть общечеловеческих культуры, в которой запечатлил духовные и материальные ценности образования и воспитания, осуществляя образовательно-воспитательный процесс...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия