Ім'я файлу: КурсоваРобота_ЛогiновОлександр.docx
Розширення: docx
Розмір: 43кб.
Дата: 17.05.2022
скачати


ПРИВАТНЕ АКЦІОНЕРНЕ ТОВАРИСТВО «ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД
МІЖРЕГІОНАЛЬНА АКАДЕМІЯ УПРАВЛІННЯ ПЕРСОНАЛОМ”»


ФАКУЛЬТЕТ КОМП’ЮТЕРНО-ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Курсова робота з дисципліни:

" Об’єктно-орієнтоване програмування"

на тему:

"Розробка класу матриця"

Спеціальність:121

Студент(ка):Логiнов О.С.

Викладач:Тінькова Ю.О.

2022 р.
Поняття Матриця в європейській науці було введено в роботах У. Гамільтона та А. Келі у середині XIX століття.

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

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

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

Безліч об'єктів з однаковим набором властивостей та поведінкою називається класом.

Інкапсуляція даних

Цей термін включає логічне зв'язування даних з конкретною операцією. Вона так само означає, що вони є не глобальними доступними всій програмі, а локальними – доступними тільки малої її частини. Інкапсуляція також автоматично має на увазі захист даних. Саме для цього призначена структура class С++. У класі управління функціональними деталями об'єкта здійснюється за допомогою специфікаторів private, public, protected. Для створення об'єктів класу є спеціальні методи, які називають конструкторами. Вони потрібні для коректної ініціалізації об'єкта. Наприклад, при створенні матриці заданих розмірів конструктор повинен виділити пам'ять зберігання елементів цієї матриці. Знищенням об'єкта займається спеціальний метод класу, який називають деструктором. Його завдання – звільнити ресурси, які займає об'єкт (закрити використовувані файли, з'єднання з базами даних тощо). Одним із принципів об'єктно-орієнтованого програмування (ООП) – інкапсуляція. Цей термін характеризує приховування окремих деталей внутрішнього пристрою класу від зовнішніх щодо нього об'єктів чи користувачів.

Клас «Матриця» (Matrix) містить змінні, доступ яких може бути здійснено лише з методів класу. Такий підхід використовується для того, щоб захистити змінні від несанкціонованого доступу.Наприклад, якщо дати можливість програмісту, який буде працювати з об'єктом класу Matrix, змінювати напряму значення змінних для зберігання розміру матриці, ці значення можуть стати некоректними (негативними, дуже великими, або не відповідними дійсним розмірам). А, виконуючи те саме за допомогою методів класу, можна включити в них перевірку коректності введених значень. Для нашого класу таким способом може бути спосіб введення матриці.

Ієрархія класів

У випадку можна уявити собі ієрархію класів як родовід в генеалогічному дереві, де клас С++ є шаблоном для створення класів-нащадків. Об'єкти, одержані з опису класу, називають екземплярами цього класу. Можна створити ієрархію класів з класом-батьком та кількома класами-нащадками. Основою цього є похідні класи.

успадкування

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

Поліморфізм

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

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

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

Конструктор викликається щоразу, коли створюється об'єкт його класу. Завдання конструктора у разі полягає у зв'язуванні віртуальної функції з таблицею адресної інформації. Під час компіляції адреса віртуальної функції невідома; натомість їй відводиться позиція у таблиці адрес. Ця позиція міститиме адресу функції .

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

Як відомо, структура даних є модель даних у вигляді математичної структури.
S = (M1, …, Mk, p1,…,pn).
Відповідно до цього можна навести такі визначення:

Структура даних Матриці

A = (aij),
где i = 1..n; j = 1..n есть
Sa = (Ma, p1a, p2a),
Где Ma = {a11, a12, …, ann-1,ann} – базисна множина,
– відносини слідування.
Для структури даних Матриця пропонується реалізувати такі операції:

порівняння:

складання/віднімання матриць:

множення матриць.

Нехай aij – елементи матриці A, а bij – елементи матриці B. Лінійні операції:

Множення матриці A на число λ (позначення: λA) полягає у побудові матриці B, елементи якої отримані шляхом множення кожного елемента матриці A на це число, тобто кожен елемент матриці B дорівнює bij = λaij

Додавання матриць A + B є операція знаходження матриці C, всі елементи якої дорівнюють попарній сумі всіх відповідних елементів матриць A і B, тобто кожен елемент матриці C дорівнює cij = aij + bij


Віднімання матриць A − B визначається аналогічно до складання, це операція знаходження матриці C, елементи якої cij = aij - bij

Додавання та віднімання допускається тільки для матриць однакового розміру.. Множення матриць (позначення: AB, рідше зі знаком множення ) — є операція обчислення матриці C, елементи якої рівні сумі творів елементів у відповідному рядку першого множника та стовпці другого. У першому множнику має бути стільки ж стовпців, скільки рядків у другому. Якщо матриця A має розмірність , B — то розмірність їх твору AB = C є.

Основні характеристики матриць:

-кількість рядків

-кількість стовпців

-масив елементів
Характеристики класу Матриця
Клас має приватні та загальнодоступні члени-дані та члени-функції (методи). Для зберігання компонентів матриці використовується одновимірний масив елементів типу параметра шаблону. Для створення об'єкта передбачено три конструктори: конструктор за замовчуванням, конструктор з параметрами, конструктор копіювання та деструктор. Для виконання безлічі матричних операцій створено перевантажені операції: привласнення (=), додавання (+), віднімання (-), множення (*) і т.п. На базі операторів введення/виводу С++ розроблені функції введення матриць з потоку та виведення їх у потік, що передбачають у разі файлового введення/виводу як текстову форму зберігання, так і бінарну.

Доступ до членів-даним класу – числу рядків та стовпців матриці здійснюється за допомогою методів size_row( ) та size_col( ). Доступ до елементів матриці створено перевантажений оператор виклику функції operator( ) (dim x, dim x), де dim – перевизначений тип unsigned char. Виклик функції використовується як оператор індексування, який приймає два аргументи. Аналогічно створено оператора виклику функції з одним аргументом operator( ) (dim x). Для цього класу – це дуже важливі перевантажені оператори, т.к. вони використовуються у всіх функціях та операторах, у яких відбувається звернення до елементів матриці.

Опис функцій, конструкторів та деструкторів класу:

Конструктор за замовчуванням Matrix( ):

Конструктор за замовчуванням створює матрицю нульового.

розміру. Надалі розмір цієї матриці можна змінити за допомогою функції newsize (i, j).Конструктор із параметрами Matrix(dim, dim=1):

Це звичайний конструктор з параметрами, який приймає як параметри розміри матриці та створює одновимірний динамічний масив розміром m*n, де m – число рядків, а n – число стовпців матриці. З метою можливості використовувати його для створення векторів, другий параметр конструктора заданий як замовчується зі значенням 1. Для початкової ініціалізації елементів матриці нулями використовується функція setmem( ).

Конструктор копіювання Matrix (const Matrix &):

Конструктор приймає як параметр посилання на об'єкт класу (на існуючу матрицю), визначає її розмір, виділяє для неї пам'ять і копіює в цю пам'ять вміст матриці, що приймається за посиланням. Таким чином створюється точна копія матриці з поточними значеннями її елементів.

Деструктор

Matrix( ):

Деструктор звільняє пам'ять, виділену конструкторами елементів матриці.

Функція операції присвоєння "=" Matrix& operator= (Matrix&):

Ця функція порівнює адресу переданого за посиланням об'єкта з адресою власного класу, щоб спроба привласнити об'єкт самому собі. Після цього створюється новий масив з числом елементів, рівним числу елементів масиву прийнятого за посиланням, і в цей масив заноситься вміст масиву. Повертається розіменований покажчик цього (return *this;).

Функції операцій підсумовування, віднімання, множення матриць та множення матриці на число:

Ці функції реалізовані як дружні функції та алгоритми цих функцій аналогічні за своїм складом.Загальний вид прототипу цих функцій: friend Matrix operator @ (const Matrix &, const Matrix &). Застосування дружніх функцій у разі доцільно у тому, щоб мати можливість передавати в оператор функцію об'єкти у будь-якій послідовності. У цих операторах-функціях спочатку створюється тимчасовий об'єкт типу матриця (за допомогою конструктора копіювання), який копіюється перша матриця і який при виході з функції є об'єктом, що повертається. Потім ця матриця підсумовується (віднімається, множиться) з матрицею, що стоїть після знака оператора за відповідними правилами матричних операцій. При цьому для доступу до елементів матриці та індексування використовуються перевантажені оператори виклику функції operator() (dim x, dim x) та operator() (dim x).

Функція - оператор Matrix operator ^ (int):

Цей оператор-функція реалізований як член класу та призначений для зведення матриці у ступінь. У разі коли значення вхідного параметра дорівнює мінус одиниці здійснюється виклик функції обчислення зворотної матриці методом перетворень Гауса, для чого розроблена окрема функція Matrix & Gauss (dim, dim). Таким чином, використання цього оператора дозволяє вирішувати систему лінійних рівнянь алгебри в уявленні X = (A^-1)*B, де X і B –вектора невідомих і правих частин відповідно.

Функція - оператор Matrix operator! ( ):

Оператор визначення транспонованої матриці.

Функція – оператор friend VARTYPE operator %(const Matrix&, const Matrix&):

Функція обчислення скалярного добутку векторів. У ній на початку перевіряється, чи є об'єкти, що передаються векторами, а потім обчислюється скалярне твір.

Функції-члени VARTYPE determ( ) та VARTYPE vmodule( ):

Перша функція обчислює визначник свого об'єкта (матриці). У цьому використовуються функція Matrix & Gauss(dim, dim). Функція VARTYPE vmodule( ) обчислює довжину (модуль) вектора

Функція операції виведення friend ostream& operator<(ostream&, Matrix&):

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

Функція операції введення friend istream& operator>(istream&, Matrix&):

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

Функції-члени dim write(ofstream&) та dim read(ifstream&):

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

Функція void ERROR_MATRIX(dim):

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

реалізація конструкторів та деструктора;

реалізація методів введення/виводу;

оголошення матриці у програмі тестування, виклик методу виведення матриці, запуск тестуючої програми;

створення інтерфейсної програми
Постановка задачі
Завдання полягає у створенні динамічного класу для роботи з матрицями.

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

Інтерфейс.

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

Процес створення алгоритму – найважливіший. Якщо тут припустилися помилок, то усунути їх на етапі кодування дуже важко.

Алгоритм роботи програми полягає в наступному:

1) Введення розмірності матриці m1a та значень її елементів

2) Введення розмірності матриці m2a та значень її елементів

3) Складаємо матриці (m1a+m2a)

4) Віднімаємо матриці (m1a-m2a)

5) Розмножуємо матриці (m1a*m2a)
Реалізація проекту
Комп'ютерна програма - це набір елементарних команд процесора, які у файлі як послідовності байтів (машинний код). Кожна команда може бути закодована одним або декількома байтами. Програми в такому вигляді можна складати вручну, але подібна робота людині просто не під силу через незручність управління процесором за допомогою простих команд. Тому програма пишеться однією з мов програмування, як звичайний текст. Цей текст називається вихідним текстом (або вихідним кодом) програми. Команди мови програмування зрозумілі та наочні.

Свою програму я писатиму в середовищі Microsoft Visual Studio.

Microsoft Visual Studio – це нова розробка компанії Microsoft, що дозволяє створювати програми, що працюють на платформі .net. Особливість цієї платформи полягає у широкому наборі сервісів, які доступні у різних мовах програмування. У цьому послуги реалізуються як проміжного коду, який залежить від базової архітектури. Чи не головною метою створення такої платформи було оснащення розробників спеціальними сервісно-орієнтованими програмами, які могли б працювати на будь-якій платформі, починаючи від персонального комп'ютера та закінчуючи мобільним пристроєм.

Microsoft Visual Studio об'єднує в собі безліч функцій, що дозволяють здійснювати розробки для Windows всіх версій, у тому числі і 8, Інтернету, SharePoint, різноманітних мобільних пристроїв та хмарних технологій. У Visual Studio реалізується нове середовище розробника, завдяки якому створювати програми стало простіше.Microsoft Visual Studio - це оновлене і спрощене програмне середовище, для якого характерна висока продуктивність, причому вона не залежить від особливостей обладнання.

Кожна нова версія програми складається з новітніх інструментів та технологій, що дозволяють розробляти програми з урахуванням особливостей та позитивних моментів сучасних платформ. Наприклад, Visual Studio 2012 може підтримувати більш ранні версії, у тому числі Windows XP і Windows Server 2003. При цьому розробникам відкрито шлях до створення нових та модернізації вже існуючих програм, призначених для ранніх версій Windows. Варто відзначити, що в процесі використання варіантів, що підтримуються системою, вихідні файли, проекти і рішення у програмі Visual Studio будуть працездатними, але вихідний код може потребувати змін.

Visual Studio є передовою програмою, яка дає можливість будь-яким за розміром командам здійснювати проектування та створення привабливих додатків. Завдяки інструментам гнучкого планування можна впроваджувати методи послідовної розробки та застосовувати гнучкі методології в темпі, зручному для користувача.

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

C# (вимовляється сі шарп) - об'єктно-орієнтована мова програмування. Розроблено в 1998-2001 роках групою інженерів під керівництвом Андерса Хейлсберга в компанії Microsoft як мова розробки додатків для платформи Microsoft.NET Framework і згодом був стандартизований як ECMA-334 та ISO/IEC 23270.

C# відноситься до сім'ї мов з C-подібним синтаксисом, їх синтаксис найбільш близький до C++ і Java. Мова має статичну типізацію, підтримує поліморфізм, навантаження операторів (у тому числі операторів явного та неявного приведення типу), делегати, атрибути, події, властивості, узагальнені типи та методи, ітератори, анонімні функції з підтримкою замикань, LINQ, винятки, коментарі у форматі XML

Назва «Сі шарп» (від англ. sharp - діез) походить від музичної нотації, де знак діез, що додається до основного позначення ноти, означає підвищення відповідного ноті звуку на півтон, що аналогічно назві мови C++, де «++» позначає інкремент змінної.
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int N = 5;

Random r = new Random();

int[,] A = new int[5, 5];

int iNumbersCount = 100;

int[] aNumbers = new int[iNumbersCount];

for (int i = 0; i < aNumbers.Length; i++)

aNumbers[i] = i;

for (int i = 0; i < 5; i++)

{

for (int j = 0; j < 5; j++)

{

int iIndex = r.Next(iNumbersCount);

A[i, j] = aNumbers[iIndex];

aNumbers[iIndex] = aNumbers[iNumbersCount - 1];

iNumbersCount--;

Console.Write(" \t " + A[i, j]);

}

}

Console.WriteLine();

int iMax = 1; int jMax = 1;

// головна діагональ

for (int i = 0; i < N; i++)

{

if (A[i, i] > A[iMax, jMax])

{

iMax = i; jMax = i;

}

}

// побічна діагональ

for (int i = 0; i < N; i++)

{

if (A[i, N - 1 - i] > A[iMax, jMax])

{

iMax = i; jMax = N - 1 - i;

}

Console.ReadKey();

}

}

}

}
Приклад створення шаблонного класу Матриця із динамічним виділенням пам'яті

У прикладі показується створення шаблонного класу MATRIX. Клас реалізує матрицю розміром m*n. Пам'ять для матриці виділяється динамічно.

За даним прикладом можна створювати і використовувати власні класи, які містять структури даних, в яких пам'ять виділяється динамічно.

У класі реалізовані:
прихована (private) внутрішня змінна M типу «покажчик на покажчик». Ця змінна визначає матрицю. Пам'ять для матриці виділятиметься динамічно;

дві цілоцінні внутрішні private-змінні m, n. Ці змінні визначають розмірність матриці M;

конструктор за замовчуванням (без параметрів);

конструктор із двома параметрами MATRIX(int, int). Цей конструктор створює матрицю розміром m*n. У конструкторі виділяється пам'ять для стовпців та рядків матриці. Значення кожного елемента матриці встановлюється 0;

конструктор копіювання MATRIX(MATRIX&). Цей конструктор необхідний створення копії об'єкта-матриці з іншого об'єкта-матриці;

методи читання/запису елементів матриці GetMij(), SetMij();

метод Print(), який виводить матрицю;

оператор копіювання operator=(MATRIX&). Цей оператор перевантажує оператор надання = і призначений для коректного копіювання об'єктів типу obj2=obj1;

деструктор.

Реалізація класу для програми типу Console Application має такий вигляд

#include using namespace std; // шаблонний клас Матриця template <typename T> class MATRIX { private: T** M; // матриця int m; // кількість рядків int n; // кількість стовпців public: // конструктори MATRIX() { n = m = 0; M = nullptr; } // конструктор із двома параметрами MATRIX(int _m, int _n) { m = _m; n = _n; // Виділити пам'ять для матриці // Виділити пам'ять для масиву покажчиків M = (T**) new T*[m]; // кількість рядків, кількість вказівників // Виділити пам'ять для кожного вказівника for (int i = 0; i < m; i++) M[i] = (T*)new T[n]; // заповнити масив M нулями for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) M[i][j] = 0; } // Конструктор копіювання – обов'язковий MATRIX(const MATRIX& _M) { // Створюється новий об'єкт, для якого бачиться пам'ять // Копіювання даних *this <= _M n = _M.n; // Виділити пам'ять для M M = (T**) new T*[m]; // кількість рядків, кількість вказівників for (int i = 0; i < m; i++) M[i] = (T*) new T[n]; // заповнити значеннями for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) M[i][j] = _M.M[i][j]; } // методи доступу T GetMij(int i, int j) { if ((m > 0) && (n > 0)) return M[i][j]; else return 0; } void SetMij(int i, int j, T value) { if ((i < 0) || (i >= m)) return; if ((j < 0) || (j >= n)) return; M[i][j] = value; } // метод, що виводить матрицю void Print(const char* ObjName) { cout << "Object: " << ObjName << endl; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) cout << M[i][j] << "\t"; cout << endl; } cout << "---------------------" << endl << endl; } // оператор копіювання – обов'язковий MATRIX operator=(const MATRIX& _M) { if (n > 0) { // звільнити пам'ять, виділену раніше для об'єкта *this for (int i = 0; i < m; i++) delete[] M[i]; } if (m > 0) { delete[] M; } // Копіювання даних M <= _M m = _M.m; n = _M.n; // Виділити пам'ять для M знову M = (T**) new T*[m]; // кількість рядків, кількість вказівників for (int i = 0; i < m; i++) M[i] = (T*) new T[n]; // заповнити значеннями for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) M[i][j] = _M.M[i][j]; return *this; } // Деструктор – звільняє пам'ять, виділену для матриці MATRIX() { if (n > 0) { // звільнити виділену пам'ять для кожного рядка for (int i = 0; i < m; i++) delete[] M[i]; } if (m > 0) delete[] M; } }; void main() { // тест для класу MATRIX MATRIX<int> M(2, 3); M.Print("M"); // Заповнити матрицю значеннями за формулою int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) M.SetMij(i, j, i + j); M.Print("M"); MATRIX<int> M2 = M; // виклик конструктора копіювання M2.Print("M2"); MATRIX<int> M3; // виклик оператора копіювання - перевірка M3 = M; M3.Print("M3"); MATRIX<int> M4; M4 = M3 = M2 = M; // виклик оператора копіювання у вигляді "ланцюжка" M4.Print("M4"); }

Результат виконання програми

Object: M 0       0       0 0       0       0 --------------------- Object: M 0       1       2 1       2       3 --------------------- Object: M2 0       1       2 1       2      3 --------------------- Object: M3 0       1       2 1       2       3 --------------------- Object: M4 0       1       2 1       2       3 ---------------------
Реалізація класу матриця

const double eps = 1e-9;

class matrix
{
private:
   double **a;
   int n, m;
public:
   // матриця без елементів



   matrix ()
   {
      a = 0;
      n = 0;
      m = 0;
   }
   // матриця NxM, якщо E, то одинична, інакше нульова



   matrix (int N, int M, bool E = 0)
   {
      n = N;
      m = M;
      a = new double *[n];
      for (int i = 0; i < n; ++ i)
      {
         a[i] = new double[m];
         for (int j = 0; j < m; ++ j)
            a[i][j] = (i == j) * E;
      }
   }
   // матриця із елементів array, якщо horizontal, то  горизонтальна, інакше вертикальна



   matrix (double array[], int N, bool horizontal)
   {
      if (horizontal)
      {
         n = 1;
         m = N;
         a = new double *[1];
         a[0] = new double[m];
         for (int i = 0; i < m; ++ i)
            a[0][i] = array[i];
      }
      else
      {
         n = N;
         m = 1;
         a = new double *[n];
         for (int i = 0; i < n; ++ i)
         {
            a[i] = new double[1];
            a[i][0] = array[i];
         }
      }
   }
   int N ()
   {
      return n;
   }
   int M ()
   {
      return m;
   }
   double* operator [] (int index)
   {
      return getRow (index);
   }
   // 
отримати рядок матриці


   double* getRow (int index)
   {
      if (index >= 0 && index < n)
         return a[index];
      return 0;
   }
   //отримати стовпчик матриці



   double* getColumn (int index)
   {
      if (index < 0 || index >= m)
         return 0;
      double * c = new double [n];
      for (int i = 0; i < n; ++ i)
         c[i] = a[i][index];
      return c;
   }
   // 
поміняти місцями два рядки


   void swapRows (int index1, int index2)
   {
      if (index1 < 0 || index2 < 0 || index1 >= n || index2 >= n)
         return ;
      for (int i = 0; i < m; ++ i)
         swap (a[index1][i], a[index2][i]);
   }
   // поміняти місцями два стовпці



   void swapColumns (int index1, int index2)
   {
      if (index1 < 0 || index2 < 0 || index1 >= m || index2 >= m)
         return ;
      for (int i = 0; i < n; ++ i)
         swap (a[i][index1], a[i][index2]);
   }
   // приписування матриці b до поточної матриці справа



   matrix concateMatrix (matrix & b)
   {
      if (n != b.N ())
         return matrix ();
      matrix c = matrix (n, m + b.M ());
      for (int i = 0; i < n; ++ i)
      {
         for (int j = 0; j < m; ++ j)
            c[i][j] = a[i][j];
         for (int j = 0; j < b.M (); ++ j)
            c[i][j + m] = b[i][j];
      }
      return c;
   }
   //видалення стовпців index1 по index2
   matrix eraseColumns (int index1, int index2)
   {
      matrix c = matrix (n, m - (index2 - index1 + 1));
      for (int j = 0; j < index1; ++ j)
         for (int i = 0; i < n; ++ i)
            c[i][j] = a[i][j];
      for (int j = index2 + 1; j < m; ++ j)
         for (int i = 0; i < n; ++ i)
            c[i][j - index2 - 1 + index1] = a[i][j];
      return c;
   }
};

// прочитати матрицю з консолі



matrix scanMatrix ()
{
   int n, m;
   scanf ("%d%d", & n, & m);
   matrix a = matrix (n, m);
   for (int i = 0; i < n; ++ i)
      for (int j = 0; j < m; ++ j)
         scanf ("%lf", & a[i][j]);
   return a;
}

// вивести матрицю



void printMatrix (matrix & a)
{
   for (int i = 0; i < a.N (); ++ i)
   {
      for (int j = 0; j < a.M (); ++ j)
         printf ("%5.3lf ", a[i][j]);
      puts ("");
   }
}

// 
скласти дві матриці


matrix add (matrix & a, matrix & b)
{
   if (a.N () != b.N () || a.M () != b.M ())
      return matrix ();
   matrix c = matrix (a.N (), b.M ());
   for (int i = 0; i < a.N (); ++ i)
      for (int j = 0; j < a.M (); ++ j)
         c[i][j] = a[i][j] + b[i][j];
   return c;
}
// множення матриці на число



matrix mul (matrix & a, double k)
{
   matrix c = matrix (a.N (), a.M ());
   for (int i = 0; i < a.N (); ++ i)
      for (int j = 0; j < a.M (); ++ j)
         c[i][j] = a[i][j] * k;
   return c;
}
// 
множення двох матриць


matrix mul (matrix & a, matrix & b)
{
   if (a.M () != b.N ())
      return matrix ();
   matrix c = matrix (a.N (), b.M ());
   for (int i = 0; i < a.N (); ++ i)
      for (int j = 0; j < b.M (); ++ j)
         for (int k = 0; k < a.M (); ++ k)
            c[i][j] += a[i][k] * b[k][j];
   return c;
}
//
транспонування матриці


matrix transp (matrix & a)
{
   matrix c = matrix (a.M (), a.N ());
   for (int i = 0; i < a.N (); ++ i)
      for (int j = 0; j < a.M (); ++ j)
         c[j][i] = a[i][j];
   return c;
}

Висновок
В результаті виконання курсового проекту було розроблено клас Матриця для вирішення найпростіших завдань. Число цих функцій порівняно невелике, проте можна легко додати до цього класу складніші функції, побудовані на базі вже наявних.

У процесі виконання курсової роботи було виконано:

- на першому етапі роботи було проаналізовано завдання та визначено перелік питань, які були вирішені в даній роботі, визначення того, що, власне, виконуватиме програма, що розробляється, не розглядаючи конкретну реалізацію цих функцій;

- розробка алгоритму програми, що розробляється;

- розробка програми та інтерфейсу користувача;

- Здійснено налагодження програми.
Джерела:

https://www.bestprog.net/ru/2019/08/23/c-an-example-of-creating-a-template-class-matrix-dynamic-memory-allocation-ru/

https://studbooks.net/2076720/informatika/osnovnye_terminy_polozheniya

https://zinvapel.github.io/it/prog/oop/2017/10/30/oop-base/

https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

http://iwanoff.inf.ua/algorithmization_2/LabTraining01.html

http://hardfire.ru/class_matrix
скачати

© Усі права захищені
написати до нас