Розробка шаблону математичного класу багатовимірних векторів
Поняття та види векторів. Прості математичні операції над ними. Векторний добуток, його геометричні та алгебраїчні властивості. Визначення та реалізація програмного класу багатовимірних векторів. Перевантажені оператори та дружні оператор-функції.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 15.01.2012 |
Размер файла | 110,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Міністерство освіти та науки України
Криворізький державний педагогічний Університет
Кафедра інформатики та прикладної математики
Курсова робота
Тема: Розробка шаблону математичного класу багатовимірних векторів
Виконав:ст.гр.І-07
Мальченко А.Л.
м. Кривий Ріг
2010
План
Введення
1. Вектори. Основні поняття
1.1 Види векторів
1.2 Лінійно-залежні вектори
2. Операції над векторами
2.1 Прості математичні операції над векторами
2.2 Векторний добуток
3. Визначення програмного класу багатовимірних векторів
3.1 Поля
3.2 Конструктор і деструктор
3.3 Перевантажені оператори та дружні оператор-функції
Висновки
Література
Додаток 1. Лістинг програми, реалізуюча шаблон класу багатовимірних векторів. Файл „vector.h”
Додаток 2. Лістинг програми, демонструючої роботу класа. Файл „Client.cpp”.
Введення
Мета даної роботи - розробити шаблон математичного класу багатовимірних векторів.
У стрункому будинку математики більш складні математичні об'єкти будуються з простіших. Багатомірний числовий вектор може бути представлений сукупністю його дійсних або комплексних координат по осях багатовимірної координатної системи.
Для кожного класу математичних об'єктів визначено допустимий набір математичних операцій і способи їх реалізації. У даній роботі визначимо і реалізуємо операції, допустимі для математичних векторів.
У великих алгоритмічних мовах (наприклад, ADA) передбачаються складні математичні типи, але широко використовуються малі мови високого рівня, такі як Си, не містять цих можливостей. Це дає можливість глибоко вивчити обчислювальні алгоритми, доводячи їх до програмної реалізації з супутнім виловлювання алгоритмічних помилок.
Найбільш зручним інструментом для створення класів математичних об'єктів є об'єктно-орієнтоване програмування і його підтримка в мові Си ++. Ця мова дає можливість варіювати методи створення математичних об'єктів шляхом визначення в класі необхідної кількості конструкторів, здійснити перевизначення стандартних операцій для знову створених класів, використовувати потужний механізм одиночного і множинного спадкоємства властивості базових класів у похідних класах, створювати параметризованні класи та функції з підстановкою типів параметрів у процесі конструювання відповідних об'єктів. Послідовне нарощування ієрархії математичних типів на базі вже створених дозволяє істотно знизити трудомісткість програмування за рахунок виключення повторюваних послідовностей дій і уникнути внесення програми нових помилок.
1. Вектори. Основні поняття
Деякі фізичні величини, як, наприклад, температура, маса, щільність, називають скалярними. Деякі інші величини, як, наприклад: сила, переміщення точки, швидкість, прискорення, називають векторними.
Кожна скалярна величина може бути охарактеризована одним числом, що виражає відношення цієї величини до відповідної одиниці виміру. Навпаки, для характеристики векторної величини одного числа недостатньо. Це пояснюється тим, що векторні величини, крім розмірності, мають ще спрямованістю.
Число елементів вектора рахункове, може бути скінченим або нескінченним. Елементи можна отримати за допомогою дискретної спектральної функції f (щ), де аргумент щ з натурального безлічі перераховує виміру, а функція повертає значення координати в цьому вимірі. Самі вектори, залишаючись одновимірними масивами, часто використовуються для кодування координат точок, станів в багатовимірних просторах, системах. Дане функціональне трактування також дозволяє узагальнити вектор до об'єкта з непреривномерного простору.
Наприклад, скалярний добуток векторів є окремим випадком скалярного множення функцій
Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Будемо розуміти під векторним об'єктом в n-мірному просторі послідовність з n чисел (у загальному випадку комплексних), які будемо називати складовими вектора.
Сукупність всіх таких векторів утворює n-мірний векторний простір .
Вектори є предметом так званого векторного обчислення подібно до того, як числа є предметом арифметики. В векторному численні над векторами здійснюються деякі операції, вони суть математичні абстракції деяких однакових операцій вироблених з різними конкретними векторними величинами.
Два вектора будемо вважати рівними тоді і тільки тоді, коли всі їх компоненти рівні.
1.1 Види векторів
Нульовий вектор (нуль-вектор) - вектор, початок якого збігається з його кінцем. Нульовий вектор має норму 0 і позначається Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
або .
Нульовий вектор визначає таке переміщення простору при якому кожна точка простору переходить в себе, іншими словами: нульовий вектор це перетворення простору.
З нульовим вектором не пов'язують ніякого напряму в просторі (тобто його можна вважати спрямованим на всі боки). Нульовий вектор прийнято вважати співнапрямленим до будь-якого вектору. Вважається, що нульовий вектор одночасно паралельний і перпендикулярний до будь-якого вектору простору.
Всі координати нульового вектора в будь-якій афінної системі координат дорівнюють нулю.
Для будь-якого вектора Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Для будь-якого числа c
Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Нульовий вектор дорівнює сумі будь-яких двох протилежних векторів:
Радіус-вектор (зазвичай позначається Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
або просто )--Вектор, що задає положення точки в просторі щодо деякої заздалегідь фіксованої точки, що називається початком координат .
Для довільної точки в просторі, радіус-вектор - це вектор, що йде з початку координат в цю точку.
Довжина радіус вектора або його модуль, визначає відстань, на якій точка знаходиться від початку координат, а стрілка вказує напрям на цю точку простору.
Одиничний вектор або орт (одиничний вектор нормованого векторного простору) - вектор, норма (довжина) якого рівна одиниці обраного масштабу.
Одиничний вектор , колінеарний з заданим: (нормований вектор) визначається за формулою:
В якості базисних часто вибираються саме одиничні вектори, тому що це спрощує обчислення. Такі базиси називають нормованими. У тому випадку, якщо ці вектора також ортогональні, такий базис називається ортонормованним базисом.
Ізотропної вектор - комплексний вектор ,який має нульову довжину.
Формально, вектор евклідового n-мірного простору (комплексного або дійсного) ізотропний, якщо його фундаментальна форма F дорівнює нулю:
.
1.2 Лінійно-залежні вектори
Лінійно-залежними будемо вважати вектори , якщо існують такі не всі нульові константи , що
У противному випадку вектори вважаються лінійно-незалежними.
В останньому рівнянні зліва стоїть вектор-сума, що може по зробленому визначенням бути дорівнює нулю при всіх нульових складових. Якщо кількість векторів , То це векторне рівняння рівносильно системі з , рівнянь з невідомими Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Якщо число векторів більше розмірності простору , тобто число рівнянь менше числа невідомих, то система мабуть буде мати відміне від нульового рішення і наші вектори будуть відповідно лінійно-незалежні. Іншими словами - число лінійно-незалежних векторів не більше розмірності простору.
При (число рівнянь дорівнює кількості невідомих) система може мати нульове рішення (а вектори можуть бути лінійно-незалежними) тільки тоді, коли її визначник дорівнює нулю.
Таким чином, для лінійної незалежності векторів необхідно і достатньо, щоб визначник, складений із складових векторів, був відмінний від нуля або щоб ранг матриці, складеної з векторів, був рівним числу векторів.
Використання скалярного твори дозволяє записати систему однорідних алгебраїчних рівнянь у вигляді:
.
Звідки очевидно, що її рішення зводиться до знаходження вектора х, ортогонального до всіх векторах .
2. Операції над векторами
2.1 Прості математичні операції над векторами
Діями над векторами називаються операції додавання векторів і множення векторів на числа.
1) Складання векторів буде зводитися до складання їх складових.
Нехай дані вектори і однакової розмірності n. Тоді сумою цих векторів буде вектор .
У векторної алгебри вводиться дію віднімання векторів: як в арифметиці, воно назад дії додавання і віднімання зводиться до відповідних складових.
Для векторів і різницею буде вектор
2) Множення вектора на число визначимо як операцію множення всіх складових вектора на це число.
Результатом множення вектора на число а буде вектор .
Сенс операції множення вектора (геометричного) на число можна висловити наочно такий спосіб: при збільшенні вектора а на число а вектор а розтягується в а разів. Звичайно, це вираження умовно; наприклад, якщо то «розтягування» в а раз по суті означає зменшення довжини а в два рази якщо а - число від'ємне , то «розтягування» в а «раз» слід розуміти як така зміна вектора, при якому цей вектор подовжується в а раз і змінює свій напрямок на протилежне.
3) скалярним добутком двох векторів і називається число, яке дорівнює такій сумі: : .
Скалярним добутком двох векторів називається сума попарних творів їх відповідних складових.
Взаємно-ортогональними або взаємно-перпендикулярними будемо називати два вектори, якщо їх скалярний добуток дорівнює нулю.
Корінь квадратний з скалярного добутку вектора Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
на цей же вектор
;.
Називають нормою, довжиною або модулем вектора х.
Модуль нульового вектора дорівнює нулю.
4) Операцію нормування за модулем визначимо як ділення кожної складової вектора на його модуль, або ж множення ненульового вектора на величину, зворотну модулю:
.
5) Модуль (евклідова норма) вектора. Вектор в N-мірному евклідовому просторі має координати. Тоді норма вектора (або його довжина) дорівнюватиме:
2.2 Векторний добуток
Векторний добуток вектора a на вектор b називається вектор c, що позначається і задовольняє наступним вимогам:
довжина вектора c дорівнює добутку довжин векторів a і b на синус кута ц; між ними
вектор c ортогональний з векторів a і b
вектор c спрямований так, що трійка векторів abc є правою.
Геометричні властивості векторного добутку
Необхідною і достатньою умовою коллінеарність двох векторів є рівність нулю їх векторного добутку.
Модуль векторного твори [ab] дорівнює площі S паралелограма, побудованого на приведених до спільного початку векторах a та b
Якщо e - орт векторного добутку a і b, а S - площа паралелограма, побудованого на приведених до спільного початку векторах a та b, то для векторного добутку справедлива формула:
Якщо c - будь-який вектор, р - будь-яка площина, яка містить цей вектор, e - одиничний вектор, який лежить в площині р і ортогональний до c, g - одиничний вектор, ортогональний до площини р і спрямований так, що трійка векторів ecg є правою, то для будь-якого лежить в площині р вектора a справедлива формула
Размещено на http://www.allbest.ru/
44
Размещено на http://www.allbest.ru/
Алгебраїчні властивості векторного добутку
(властивість антикомутативності);
(властивість асоціативності щодо множення на скаляр);
(властивість дистрибутивності по складанню);
для будь-якого вектора a.
Вираз для векторного добутку в декартових координатах
Якщо два вектори a і b визначено своїми прямокутними координатами
то їx векторний добуток має вигляд
Для запам'ятовування цієї формули зручно використовувати символ визначника:
3. Визначення програмного класу багатовимірних векторів
Опишемо клас математичних векторів, що буде реалізовувати основні операції над векторами.
Оскільки операції над векторами не залежать від того, якого типу будуть складові вектора (цілі, дійсні, комплексні) то доцільно описати не клас, а шаблон класу.
З використанням шаблонів тип даних, що використовується класом, буде задаватися як параметр. Це дозволяє один і той же клас використовувати з кількома різними типами даних без необхідності програмувати нову версію класу для кожного конкретного типу даних. Шаблони дають можливість створювати багатократно використовувані програми.
Компілятор правильно буде генерувати правильний тип об'єкта на основі типу, заданого при створенні об'єкта.
Клас vector для роботи з векторними об'єктами -- параметризований, тобто ми визначаємо тільки шаблон, за яким для конкретних типів, підставляє замість MathType, компілятор автоматично генерує клас.
template < class MathType > class vector
Розглянемо поля визначається класу.
3.1 Поля
Вектор буде характеризуватися розмірністю (довжиною), яка може бути будь-яким натуральним числом. Скаляр можна розглядати як вектори розмірності 1, комплексні числа - як вектора розмірності 2 і т.д. У загальному випадку розмірність вектора дорівнює числу його складових, тобто розмірність вектора
Відповідне поле класу
Long vector;
Дані, що характеризують вектор, ми будемо зберігати за вказівником
MathType *vec;
У цьому випадку дані - компоненти, або, як їх ще називають, координати вектора. Ця назва не випадкова: геометричні вектора розмірності 2 - направлені відрізки на площині - можуть бути об'єднані в декартовій системі координат з арифметичними координатами своїх кінців, якщо вважати їх такими що виходять із початку координат.
Таким чином, клас містить всього два поля - вказівник на масив об'єктів MathType і змінну, що зберігає кількість компонент вектора.
Ці поля оголошуємо з специфікатором доступу private, тобто вони будуть недоступні за межами класу, але видимі для дружніх функцій. Причому отримати значення довжини вектора можна за допомогою методу
Long getLenVector (void) {return lenVector;}
3.2 Конструктори і деструктор
Клас буде реалізовувати кілька конструкторів. Кожен буде виділяти пам'ять під покажчик на певну кількість компонентів і ініціалізувати компоненти певними значеннями. У разі невдачі при динамічному виділенні пам'яті буде викидатися виняток. Розглянемо конструктори докладніше.
template <class MathType>
vector<MathType>::vector(void):lenVector(1)
{
try
{
vec=new MathType [lenVector];
}
catch(xalloc)
{
throw (string ( "Не вистачає пам'яті \ n"));
}
* vec = 0;
}
Це конструктор за замовчуванням, що створює нульовий вектор одиничної розмірності. Необхідний при динамічному створенні масивів векторів. Геометрично такий вектор - це точка на числовій прямій в позначці «0»; такий підхід пов'язаний з труднощами вирішення питання про розмірності вектора за замовчуванням і аж ніяк не є єдино правильним. Основна причина появи цього конструктора тут - це вимоги компілятора.
template <class MathType>
vector<MathType>::vector(char *f)
{
ifstream fp(f,ios::in);
if(!fp)
throw (string ( "Не можу відкрити файл" + string (f) + "\ n"));
fp>>lenVector;
if (lenVector <= 0) / / перевірка на коректність
throw (string ( "Розмірність вектора некоректна \ n"));
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string ( "не вистачає пам'яті \ n"));
}
for(long i=0; i<lenVector&&fp>>vec[i];i++);
}
Параметром конструктора є ім'я текстового файлу. Передбачається, що першим числом в цьому файлі є розмірність вектора, після якого слідують дані. Цей конструктор визначає, звідки ми можемо взяти дані про вектор - розмірність і компоненти.
template<class MathType>vector<MathType>::
vector(long value):lenVector(value)
{
if(lenVector<=0)
throw (string ( "Розмірність вектора некоректна \ n"));
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string ( "не вистачає пам'яті \ n"));
}
for (long i = 0; i <lenVector; i++)
vec[i]=0;
}
Параметром цього конструктора є розмірність вектора; після створення компоненти вектора обнуляються. Якщо, приміром, яка приймається розмірність -5, то ми отримаємо вектор виду (0, 0, 0, 0, 0).
template<class MathType>vector<MathType>::
vector(long value,MathType *array):lenVector(value)
{
if(lenVector<=0)
throw (string ( "розмірність вектора некоректна \ n"));
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw ( "не вистачає пам'яті \ n");
}
for (long i=0; i<lenVector;i++)
vec [i] = array [i];
}
Цей конструктор намагається створити вектор розмірності, заданої першим параметром, і заповнити його даними з масиву. Корисний в тому випадку, коли компоненти вектора заздалегідь відомі.
Нехай, наприклад, параметри цього конструктора - розмірність 3 і якийсь масив з числами 1,2,3,4,5,6, .... У цьому випадку даний конструктор створить вектор (1,2,3).
template<class MathType>vector<MathType>::
vector(vector<MathType>&value)
:lenVector(value.getLenVector())
{
try
{
vec = new MathType [lenVector];
}
catch (xalloc)
{
throw (string ( "не вистачає пам'яті \ n"));
}
for (long i=0;i <lenVector; i++)
vec[i]=value[i];
}
Конструктор копіювання (ініціатор копії), що створює новий вектор із уже наявного. Розмірність нового вектора встановлюється в розмірність старого, а дані переписуються без змін. У результаті його виконання ми одержуємо вектор, ідентичний копіюємому, але знаходиться в іншій ділянці пам'яті.
Template<class MathType>
Vector<MathType>::~vector()
{
jf(vec)
deleted[]vec;
}
Деструктор. Звільняє динамічно розподілену пам'ять з-під компонент вектора.
3.3 Перевантажені оператори та дружні оператор-функції
Усі методи класу, окрім двох віртуальних функцій In та Out, загальнодоступні (public), їх можна використовувати для маніпуляцій з векторними об'єктами.
Перевантаження операторів дозволяє визначити значення операторів С++ щодо заданого нами класу. Коли оператор перевантажується, він не втрачає своїх властивостей, навпаки, набуває нових, додаткові значення в контексті того класу, де він був визначений.
У класі перевизначені 15 оператор-функцій (11 бінарних і 4 унарний) і 3 дружніх бінарних операторів-функцій.
Коли оператор-функція - член класу перевантажує бінарний оператор, у неї буде тільки один параметр. Цей параметр отримає той об'єкт, який розташований праворуч від оператора. Об'єкт ліворуч генерує виклик оператор-функції і передається неявно через вказівник this.
Функція складання двох векторів. Складає вектора тільки співпадаючих розмірів, вектор-результат конструюється і повертається.
При цьому вектора однакових розмірів складаються за законом:
.
template <class MathType> vector <MathType>
vector <MathType>:: operator + (vector <MathType> second)
jf (lenVector!=second.lenVector
throw (string ( "складові вектора мають різні довжини \ n"));
vector <MathType> temp (lenVector);
for (long i=0;i<lenVector;i++)
temp [i] = vec [i] + second [i];
return temp;
}
функція для віднімання векторів однакової розмірності аналогічна функції складання; віднімає перший вектор з другого, конструюючи і повертаючи результат як новий вектор. При цьому вектора однакові за розмірності віднімаються згідно із законом: .
Прототип функції
template <class MathType> vector <MathType>
vector <MathType>:: operator-= (vector <MathType> second);
Скалярний добуток двох векторів однакової розмірності - число того ж типу, що й компоненти вихідних векторів. Його можна отримати за наступним законом:
template <class MathType> MathType vector <MathType>::
operator* (vector <MathType> &second) (
if (lenVector! = second.lenVector)
throw (string ( "скалярний добуток векторів з незбіжними розмірами неможливо \ n"));
MathType temp = 0;
for (long i=0; i <lenVector; i++)
temp = temp + ((*this) [i]*second[i]);
return temp;
}
Ще одна функція, що перевантажують операцію множення в дещо іншому контексті, а саме - як множення вектора на скаляр. Результатом є вектор тієї ж розмірності, що й вихідний. Добутком вектора на число m буде вектор, тобто вектор, кожна компонента якого помножена на це число.
template <class MathType> vector <MathType>
vector <MathType>:: operator*(MathType value)
vector <MathType> temp = (*this);
for (long i = 0; i <lenVector; i++)
temp[i] = temp (temp [i]) * value;
return temp;
}
Множення скаляру на вектор операція комутативна, що не рятує нас від необхідності знову перевантажити операцію множення, з тими ж аргументами але в іншому порядку. Це вже буде дружня функція, тобто класу вона не належить, але має доступ до його закритим полям і методам. Покажчик this не передається, як параметрів фігурують обидва аргументу - число типу MathType і об'єкт класу vector.
template <class MathType> vector <MathType>
operator * (MathType number, vector <MathType> value)
{
return value * number;
}
Скорочене множення вектора на число. Перший аргумент цієї функції - вектор - після виконання даної операції модифікується, копія результату повертається.
template <class MathType> vector <MathType>
vector <MathType>:: operator *= (MathType number)
{
return (* this) = (* this) * number;
}
Присвоєння - операція, яка не може бути перевантажена з використанням механізму дружніх функцій. Першим, неявним параметром цієї функції є поточний об'єкт (*this), другий - об'єкт присвоюється поточним. При цьому, якщо розмірності присвоюється і поточного векторів співпадають, компоненти останнього просто переписуються. В іншому ж випадку розмірність поточного вектора встановлюється в розмірність копіюємого, а пам'ять під компоненти розподіляться, і тільки тоді відбувається перепис даних. Що повертається значенням є сам поточний вектор.
template <class MathType> vector <MathType>
vector <MathType>:: operator = (vector <MathType> value)
{
if (lenVector! = value.getLenVector ())
{
delete [] vec;
lenVector = value.lenVector;
try
{
vec = new MathType [lenVector];
}
catch (xallox)
{
throw (string ( "Не вистачає пам'яті \ n"));
}
for (long i = 0; i <lenVector; i + +)
vec [i] = value [i];
return * this;
}
Індексування елементів вектора - це операція, яка повертає посилання на компоненту вектору з заданим номером. Якщо цей номер виходить за границі розмірності вектору, після діагностики викидається виключення. Так як задану функція посилаюча, то її можливо використовувати в операторах присвоєння як зліва, так і справа - адже модифікуя посилковий об'єкт, ми фактично діємо на те, що під ним переховується, тобто на саму векторну компоненту.
Template <class MathType>
MathType& vector<MathType>::operator[](long index)
{
if(index>=0&&index<lenVector)
return vec[index];
throw (string(“індекс за межами вектору”));
}
перегружена операція виводу вектору в поток. При цьому виводяться тільки компоненти вектора, розділені пробілами; розмірність не вказується. Модифікований поток повертається.
Template <class MathType>
Istream& operator>>(istream &is,vector<MathType> x)
{
x.In(is);
return is;
}
Введення вектору з потоку визначається шляхом прийому з потоку кількості чисел, рівного розмірності вектора. Модифікований поток вводу повертається для участі в подальших операціях введення з нього
Template <class MathType>
void vector<MathType>::IN(istream &is)
{
for(long i=0;i<lenVector;i++)
is>>(*this)[i];
}
Висновки
В результаті виконання даної роботи був реалізований шаблон математичного класу багатовимірних векторів.
Багатовимірні вектора розглядаються як кінцева послідовність компонентів, кожна з яких представляє собою числове значення, будь-то ціле, дійсне або комплексне.
Вектор розглядається як об'єкт класу, в якому всього два поля - динамічний масив, що містить компоненти (координати) вектора, і довге ціле, що містить кількість компонент вектора.
Шаблон класу реалізує конструктори без параметра (за замовчуванням), з параметрами, конструктор копіювання і деструктор. Також він перевантажує такі операції над векторами, як бінарний плюс, бінарний мінус, скорочена додавання, скорочене віднімання, множення (вектора на число і числа на вектор), скорочене множення, унарний плюс і мінус унарний, скалярний добуток векторів, визначення модуля вектора, нормування вектора. Перевантажені операції рівності і нерівності векторів, привласнення, а також оператор доступу до елементу вектора. Також шаблон містить віртуальні методи - порівняння векторів та введення / виводу в потік. Перевантажені операції <<і>>, які спираються на реалізовані віртуальні методи.
На базі розробленого шаблону можна визначити шаблон класу матриць (вектор векторів), шаблон класу поліномів відомого порядку (вектор коефіцієнтів).
Визначивши ієрархію математичних класів (з визначенням всередині класів всіх необхідних для їх використання в обчисленнях операцій), можна конструювати в програмі їх об'єкти шляхом оголошення, тобто синтаксично так само, як і стандартні для використовуваної мови типи (цілі, речові та ін.) Така реалізація може служити інструментом для вирішення багатьох завдань чисельних методів, при рішенні диференціальних рівнянь.
Література
1. А.П. Полищук, С.А. Семериков. МЕТОДЫ ВЫЧИСЛЕНИЙ в классах языка С++. Учебное пособие для студентов вузов. - г.Кривой Рог, издательский отдел КГПИ, 1999год.
2. Гербарт Шилд. Полный справочник по С++. 4-е издание. - издательский дом «Вильямс», Москва - Санкт-Петербург--Киев. 2003г.
3. Джефф Элджер. Библиотека программиста. С++.
4. Дональд Бокс. Сущность технологии СОМ. Библиотека программиста. - СПб.: Питер, 2001.
5. Ефимов Н.В. Краткий курс аналитической геометрии. Издание 12-е. -М.: Наука, 1975.
вектор програмний багатовимірний
Додаток 1
Лістинг програма, реалізуюча шаблон класу багатовимірних векторів. Файл „vector.h”
#ifndef __VECTOR_H
#define __Vector_H
/*podcluchenie zagolovochnix failov, neobxodimic dlia vipolnenia mat operazii*/
#include <math.h>
#include <fstream.h>
template <class MathType>
class vector
{
private:
long lenVector;
MathType *vec;
virtual void In(istream &);
virtual void Out(ostream &);
public:
vector(void);
vector(long);
vector(char*);
vector(long,MathType*);
vector(vector<MathType>&);
~vector(void);
long getLenVector(void){return lenVector;}
vector<MathType> operator+ (vector<MathType>);
vector<MathType> operator+=(vector<MathType>);
vector<MathType> operator- (vector<MathType>);
vector<MathType> operator-=(vector<MathType>);
vector<MathType> operator* (vector<MathType>);
vector<MathType> operator*=(vector<MathType>);
MathType operator*(vector<MathType>&);
friend vector<MathType>
operator*(MathType,vector<MathType>);
friend ostream& operator<<(ostream&,vector<MathType>);
friend istream& operator>>(istream&,vector<MathType>);
bool operator==(vector<MathType>&);
bool operator!=(vector<MathType>&);
MathType& operator[](long);
vector<MathType> operator=(vector<MathType>);
vector<MathType> operator-(void);
vector<MathType> operator+(void);
MathType operator!(void);
vector<MathType> operator~(void);//norming
virtual bool IsEqual(void*);
};
/*constructor bez parametrov - sozdaetsia vector edinichnoi dlini i inicializaruetsia znacheniem 0*/
template <class MathType>
vector<MathType>::vector(void):lenVector(1)
{
/*v sluchae oshibki pri videleniii pamiati vibrasivaem iscluchenie*/
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
*vec=0;
}
/*constructor copirovania*/
template<class MathType>
vector<MathType>::vector(vector<MathType>&value):lenVector(value.getLenVector())
{
/*v sluchae oshibki pri videleniii pamiati vibrasivaem iscluchenie*/
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
for(long i=0;i<lenVector,i++)
vec[i]=value[i];
}
/*constructor s parametrami, sozdaet nulevoi vector zadanoi dlini*/
template <class MathType>
vector<MathType>::vector(long value):lenVector(value)
{
/*v sluchae necorectnogo znachenia dlini vectora vibrasivaem iscluchenie*/
if(lenVector<=0)
throw ("razmernost' vectora neccorektna \n");
/*v sluchae oshibki pri videlenii pamiati vibrasivaem isckluchenie*/
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
for(long i=0;i<lenVector;i++)
vec[i]=0;
}
/*constructor s paramtrami, sozdaet vector zadanoi dlini i inicializiruet ego zadannivi znacheniami*/
template<class MathType>
vector<MathType>::vector(long value,MathType*array):lenVector(value)
{
/*v sluchae necorectnogo znachenia dlini vibrasivaem iscluchenie*/
if(lenVector<=0)
throw (string("razmernost' vectora ne corectna \n"));
/*v sluchae oshibki pri videlenii pamiati vibrasivaem iscluchenie*/
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
for(long i=0;i<lenVector;i++)
vec[i]=array[i];
}
/*constructor s parametrami, vichiotivaet vector iz faila*/
template <class MathType>
vector<MathType>::vector(char *f)
{
ifstream fp(f,ios::in);
if(!fp)
/*v sluchae neudachnogo otkritia faila vibrasivaem iscluchenie*/
throw (string("ne mogu otkrit' fail"+string(f)+"\n"));
fp>>lenVector;
/*v sluchae nekkorektnogo znachenia dlini vibrasivaem iscluchenie*/
if(lenVector<=0)
throw (string("razmernost' vectora necorektna \n"));
/*v sluchae oshibki pri vidilenii pamiati vibrasivaem isclucenie*/
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
for (long i=0;i<lenVector&&fp>>vec[i];i++);
}
/*destruktor*/
template <class MathType>
vector<MathType>::~vector()
{
if(vec)
delete[]vec;
}
template <class MathType>
vector<MathType> vector<MathType>::operator+(vector<MathType>second)
{
/*proverka raszmernosti vectorov - dolgna bit' odinakovoi*/
if(lenVector!=second.lenVector)
throw (string("slagaemie vectori imeut eazlichnie dlini \n"));
vector<MathType> temp(lenVector);
for (long i=0;i<lenVector;i++)
temp[i]=vec[i]+second[i];
return temp;
}
template <class MathType>
vector<MathType> vector<MathType>::operator+=(vector<MathType>second)
{
return *this=*this+second;
}
template <class MathType>
vector<MathType> vector<MathType>::operator-(vector<MathType>second)
/*proverka razmernosti vectorov*/
{
if(lenVector!=second.lenVector)
throw (string("vichitaemie vecori imeutrazlichnie dlini \n"));
vector<MathType> temp(lenVector);
for(long i=0; i<lenVector; i++)
temp[i]=vec[i]-second[i];
return temp;
}
template <class MathType>
vector<MathType> vector<MathType>::operator-=(vector<MathType>second)
{
return *this=(*this)-second;
}
template <class MathType>
vector<MathType> vector<MathType>::operator-(void)
{
vector<MathType> temp(lenVector);
for(long i=0;i<lenVector;i++)
temp[i]=-(*this)[i];
return temp;
}
template <class MathType>
vector<MathType> vector<MathType>::operator+(void)
{
return *this;
}
/*umnogenie vectora na chislo*/
template <class MathType>
vector<MathType> vector<MathType>::operator*(MathType value)
{
vector<MathType> temp=(*this);
for(long i=0;i<lenVector;i++)
temp[i]=(temp[i])*value;
return temp;
}
/*umnogenie chisla na vector*/
template <class MathType>
vector<MathType> operator*(MathType number,vector<MathType>value)
{
return value*number;
}
template <class MathType>
vector<MathType> vector<MathType>::operator*=(MathType number)
{
return (*this)=(*this)*number;
}
/*scaliarnoe proizvedenie vectorov*/
template <class MathType>
MathType vector<MathType>::operator*(vector<MathType> &second)
{
if(lenVector!=second.lenVector)
throw (string("umnogenie vectorov s nesovpadauchimi razmerami nevozmogno \n"));
MathType temp=0;
for(long i=0;i<lenVector;i++)
temp=temp + ((*this)[i]*second[i]);
return temp;
}
template <class MathType>
vector<MathType> vector<MathType>:: operator=(vector<MathType>value)
{
if(lenVector!=value.getLenVector())//razmeri ne sovpadaut
{
delete []vec;
lenVector=value.lenVector;
try
{
vec=new MathType[lenVector];
}
catch(xalloc)
{
throw (string("ne xvataet pamiati \n"));
}
}
for(long i=0;i<lenVector;i++)
vec[i]=value[i];
return *this;
}
template <class MathType>
bool vector<MathType>::IsEqual(void *x)
{
if(lenVector!=((vector<MathType>*)x)->lenVector)
return false;
for(long i=0; i<lenVector; i++)
if((*this)][i]!=(*(vector<MathType>*)x)[i])
return false;
return true;
}
template <class MathType>
bool vector<MathType>::operator==(vector<MathType> &second)
{
return IsEqual(&second);
}
template <class MathType>
inline bool vector<MathType>::operator!=(vector<MathType> &second)
{
return!((*this)==second);
}
template <class MathType>
inline MathType vector<MathType>:: operator!(void)
{
return sqrt((*this)*(*this));
}
template <class MathType>
MathType& vector<MathType>::operator[](long index)
{
if (index>=0&&index<lenVector)
return vec[index];
throw (string("index vne diapazona vectora \n"));
}
template <class MathType>
ostream& operator<<(ostream &os,vector<MathType> x)
{
x.Out(os);
return os;
}
template <class MathType>
istream& operator>>(istream &is,vector<MathType> x)
{
x.In(is);
return is;
}
template <class MathType>
void vector<MathType>::Out(ostream &os)
{
for(long i=0;i<lenVector;i++)
{
os.precision(6);
os<<(*this)[i]<<" ";
}
}
template <class MathType>
void vector<MathType>::In(istream &is)
{
for(long i=0;i<lenVector;i++)
is>>(*this)[i];
}
template <class MathType>
vector<MathType> vector<MathType>::operator~(void)
{
vector<MathType> temp(lenVector);
/*scaliarnoie proizvedenie tekychego obekta na camogo cebia*/
MathType modul=!(*this);
for (long i=0;i<lenVector&&modul;i++)
temp[i]=(*this)[i]/modul;/*napravliauchii cosinusi*/
return temp;
}
#endif
Додаток 2
Лістинг програми, демонструючої роботу класу. Файл „Client.cpp”
#include "vector.h"
#include <stdio.h>
#include <conio.h>
#include <cstring.h>
#include <except.h>
void print_rus(string);
main()
{
print_rus("primer realizacii shablona classa matematimat vectorov \"vector.h\".\n\n");
print_rus("*****sozdanie ob'ektov tipa \"vector\" s ispolzovaniem konstruktorov...\n");
vector <int>V1;
print_rus("...bez parametrov. sozdalsia vector V1 s edinstvennoi komponentoi 0.\n");
cout<<"V1\t"<<V1<<endl;
vector <int>V2(10);
print_rus("...s parametrom. sozdalsia vector V2 10 komponentami, kazdaia iz kotorix 0.\n");
cout<<"V2\t"<<V2<<endl;
int array1[5]={10,15,20,10,2};
vector <int>V3(5,array1);
print_rus("...s parametrami. sozdalsia vector V3 c 5 komponentami, znachenia kotorix\n polucheni iz massiva.\n");
cout<<"V3\t"<<V3<<endl;
char nameFile[64]={"v.txt"};
vector <int>V4(nameFile);
print_rus("\n... s parametrom. sozdalsia vector V4, komponenti vichitani iz ukazanogo faila\n");
cout<<"V4\t"<<V4<<endl;
vector <int>V5(V3);
print_rus("\n...kopirovania. sozdalsia vector V5, ravnii vectoru V3\n");
cout<<"V5\t"<<V5<<endl;
print_rus("dlia prodoilgenia nagmite lubuu klavishu...");
getch();
clrscr();
print_rus("*****demonstracia ispolzovania arifmetichescix operacii nad vectorami\n\n");
print_rus("snachala - deistvia nad vectorami odinakovix razmernostei.\n");
int ar1[7]={1,2,3,4,5,6,7};
int ar2[7]={-3,15,27,48,0,1,4};
int ar3[7]={9,8,7,6,5,4,3};
int ar5[6]={-1,-2,-3,-4,-5,-6};
vector <int>a1(7,ar1);
vector <int>a2(7,ar2);
vector <int>a3(7,ar3);
vector <int>a4(7);
cout<<"a1\t"<<a1<<"\na2\t"<<a2<<"\na3\t"<<a3<<"\na4\t"<<a4<<endl;
print_rus("umnogenie vectora na chislo\n a1 * 3\t");
cout<<a1*3<<endl;
print_rus("umnogenie chisla na vector\n 7 * a2\t");
cout<<7*a2<<endl;
print_rus("vipolnim deistvia:\na4 = a1 + a2 +a3 * 2 - 2 * a1 + a4\n");
try
{
a4=a1+a2+a3*2-2*a1+a4;
}
catch(string str)
{
print_rus(str);
}
cout<<"a4\t"<<a4<<endl;
print_rus("deistvia nad vectorami beodibakovi razmernostei.\n");
vector <int>a5(6,ar5);
cout<<"a1\t"<<a1<<"\na3\t"<<a3<<"\na5\t"<<a5<<endl;
print_rus("vipolnim deistvie a3 + a5\n");
try
{
a3+a5;
}
catch (string str)
{
print_rus(str);
}
print_rus("dlia prodolgenia raboti nagmite lubuu klavishu...");
getch();
clrscr();
print_rus("*****demonstracia ispolzovania operacii sravnenia nad vectorami\n\n");
vector <int>b1(a1);
vector <int>b2(a2);
vector <int>b3(a3);
int arb4[10]={2,-6,45,14,0,23,56,7,-7,4};
vector <int>b4(10,arb4);
cout<<"b1\t"<<b1<<"\tb2\t"<<b2<<"\nb3\t"<<b3<<"\nb4\t"<<b4<<endl;
print_rus("sravnim vectora: b1 i b2\n");
if(b1==b2)
print_rus("vectora ravni\n");
else print_rus("vectora ne ravni\n");
print_rus("---vectora b2 i b3\n");
if(b2==b3)
print_rus("vectora ravni\n");
else print_rus("---vectora ne ravni\n");
print_rus("---vectora b3 i b3\n");
if(b3==b3)
print_rus("vectora ravni\n");
else print_rus("vectora ne ravni\n");
print_rus("---vectora b3 i b4\n");
if(b3==b4)
print_rus("vectora ravni\n");
else print_rus("vectora ne ravni\n");
print_rus("dlia prodolgenia nagmite lubuu klavishu...");
getch();
clrscr();
print_rus("*****demonstracia ispolzovania operacii normirovania\n\n");
double ard1[7]={12.75,3.14,25.16,78.01,24.17,41.36,36.45};
float arf[7]={0.12,1.25,1.47,2.48,0.51,4.72,1.48};
vector<double> d1(7,ard1);
vector<float> f1(7,arf);
cout<<"a1\t"<<a1<<"\n"<<~a1<<"\nd1\t"<<d1<<"\n"<<~d1<<"\nf1\t"<<f1<<"\n"<<~f1<<endl;
getch();
}
void print_rus(string s)
{
static char buf[512];
static char str[512];
unsigned int i;
for(i=0;i<s.length();i++)
str[i]=s.get_at(i);
str[i]='\0';
CharToOem(str,buf);
cout<<buf;
}
Файл «v.txt»
5 1 0 0 3
Размещено на Allbest.ru
Подобные документы
Поняття об’єктно-орієнтовного програмування, поява відносин класів. Структури як складені типи даних, побудовані з використанням інших типів. Область дії класу і доступ до його елементів. Конструктор та деструктор класу. Розробка базового класу STRING.
курсовая работа [280,9 K], добавлен 19.08.2010Створення програмного модуля "Множина" та організація його правильної структури, визначення методів та властивостей цього модуля (елементами множини є цілі числа). Реалізація математичних операцій з множинами з забезпеченням використання цього класу.
курсовая работа [76,1 K], добавлен 25.09.2010Базис векторного простору. Програма визначення лінійної залежності або незалежності векторів, написана на мові програмування Turbo Pascal. Головна процедура системи - Procedure Lineq. Виконання перевірки умови залежності з масиву знайдених розв’язків.
курсовая работа [34,1 K], добавлен 28.03.2009Основні типи даних, математичні оператори й функції, що використовуються у Visual Basic. Числові, рядкові й логічні дані. Описання даних у підрозділі програми. Приклад використання функції перетворення даних. Елементи управління та їх змінені властивості.
лабораторная работа [306,7 K], добавлен 28.11.2010Поняття абстрактного класу в об’єктно-орієнтованому програмуванні. Описання класу pruzhyna, створення консольної програми для обчислення коефіцієнта передачі пружини стискання з циліндричної проволоки круглого перетину за заданою формулою і параметрами.
курсовая работа [100,7 K], добавлен 25.11.2011Базові типи змінних. Елементарний ввід-вивід. Умовні оператори та оператори множинного вибору. Основні функції вводу даних із клавіатури scanf, gets, getchar. Визначення основних (базових) типів даних. Вивід повідомлення при невірно заданому ключі.
контрольная работа [74,6 K], добавлен 03.10.2010Побудова графіків в декартовій системі координат. Обчислення максимального, мінімального та середнього значення функції. Робота в середовищі Mathcad та Excel. Сортування і фільтрація даних. Дії над масивами випадкових чисел. Створення векторів і матриць.
курсовая работа [341,2 K], добавлен 15.12.2015Поняття електронного підручника, його розробка, основні переваги та недоліки. Вивчення теоретичного курсу з теорії границь, диференціального та інтегрального числення функції однієї змінної. Застосування інтеграла Рімана, його означення та властивості.
дипломная работа [2,6 M], добавлен 12.02.2013Реалізація операцій ініціалізації (завдання початкових властивостей), запису класу у файл та читання класу з файлу. Функції інформаційної системи "Фермерське господарство", модулі створення та перегляду файлу, додавання даних в файл, пошуку даних.
курсовая работа [4,9 M], добавлен 16.03.2012Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016