Задача. Да се създаде клас, който описва матрица от реални числа и да се реализират подходящи операции за матрици.
  • Представяне на матрицата
    • Ще изберем "плоско" представяне на матрицата, за да спестим памет. Ще капсулираме операциите за индексиране (т.е. ще напишем специални функции за тях), като така ще скрием от потребителя на класа как точно е представена матрицата
  • Реализирайте голямата четворка
  • Реализирайте селектори и модификатори
    • за размерносттите на матрицата ще напишем само селектори
    • напишете функции за четене и промяна на елемент. Правете проверка за коректност
  • Реализирайте функции за извеждане и четене на матрици.
  • Операции с матрици
    • Реализирайте операторна функция за операцията "събиране на матрици"
      • правете проверка за коректност!
      • декларацията изглежда така: Matrix operator+(Matrix const& M) const
      • защо не можем да върнем Matrix&?
      • опишете каква последователност от действия се извършва при присвояване A = A + B
      • за оптимизация е добре да реализираме operator+=. Защо тук може (и е добре) да върнем Matrix&?
      • Можете ли да реализирате + като използвате +=? Какви са недостатъците?
      • Напишете подходяща private функция, която се използва и в operator+ и в operator +=
      • Член-Функция, която не използва пряко или косвено (с друга функция) член-данните на обекта, се нарича функция на класа или още статична функция. Статичните функции се бележат със static преди декларацията им.
    • Реализирайте операции за умножение и деление на матрица с число
      • напишете подходяща private функция, която върши по-голямата част от работата
      • Реализирайте operator* и operator*=
      • ако се опитаме да напишем A = 3*B ще получим грешка. Защо?
      • Приятелска функция е такава, която получава достъп до private с protected компонентите на класа. Тя не е член-функция
      • Реализирайте приятелска функция, която реализира втори вариант на operator* с разменени аргументи. Може ли функцията да не е приятелска?
      • Реализирайте operator/ и operator /=. Тук не се налага втора форма на operator/. Защо?
    • Реализирайте операция за умножение на две матрици
      • правете проверка за коректност!
      • има ли смисъл да реализираме operator *=
      • защо според вас компилаторът не се обърква от двата operator* които написахме?
  • Реализирайте индексиране на матрици, т.е. ако M е обект от клас Matrix, да можем да достъпваме елементите му с M[i][j]
    • горното се превежда от компилатора като M.operator[](i)[j]
    • Какво трябва да връща предефинирания оператор за да може да работи индексирането?
    • Ще можем ли да мишем например M[0][1] = 5?
    • Какви са недостатъците на оператора в сравнение със селекторите и модификаторите?
    • Какво е нередното в този код: Matrix const M(3,4); M[1][2] = 3.14?
    • Как може да се реши горния проблем?
      • дефинирайте константен и неконстантен вариант на operator[]
  • * Реализирайте други функции за работа с матрици:
    • Транспониране на матрица
    • Намиране на детерминанта
    • Намиране на адюнгирано количество
    • Намиране на обратна матрица
    • Намиране на ранг на матрица
    • Решаване на система линейни уравнения с използване на обратна матрица
    • Привеждане на матрица в триъгълна форма
    • Решаване на система линейни уравнения по метода на Гаус
    • Намиране на характеристичните стойности и характеристичните вектори на матрица
Задача ** Реализирайте клас за n-мерен масив. Измислете подходящо представяне, конструктори, селектори и модификатори операции. Как ще се реализира оператор за индексиране, за да можем да пишем например M[0][0][0][0][0] за 5-мерна матрица?
Последно модифициране: събота, 12 ноември 2011, 17:38