[C#] Multidimensional Arrays - 6 задача


8

Здравейте,

Може ли някой да помогне със 6 задача, която очевидно е най-трудната в темата:

6.* Write a class Matrix, to holds a matrix of integers. Overload the operators for adding, subtracting and multiplying of matrices, indexer for accessing the matrix content and ToString().

Имам някакви познания за класове, но не са ми достатъчни, затова бих помолил за всякакви допълнителни материали по темата или пък решение с обяснения, въобще всякакви hint-ове са добре дошли.

Разгледах лекциите от академията за дефиниране и ползване на класове и обекти, но не намерих това, което търся. Чичко Google този път не ми е пръв приятел също.

Смятам, че темата би била полезна не само на мен, ами и на всички, които имат затруднение с тази задача.

Благодаря!




Отговори



13

След кратко търсене за "operator overloading C#", ето моето решение: sourceНямам претенции да е добре написано, но работи.

MSDN: Operator Overloading Tutorial.


от jasssonpet (6814 точки)


0

Да добавя няколко разсъждения за матриците:

1. За да не се правят проверки за валидност на пропъртитата .Rows и .Columns, могат да се декларират като uint.

2. Същите би трябвало да са достъпни за четене, но не и за промяна. Тоест,

{ get; private set; }

3. Както вече vic.alexiev писа, ако искаме да имаме конструктор от вида

public Matrix(int[,] array), редно е матрицата да се прави с клонирано копие  на оригиналния масив. В този случай е добре и самия клас Matrix да може да се клонира (да имплементира ICloneable).

4. Задачата може да се разшири за generic class Matrix<T> (не само за int). В този случай най-лесния начин (но не много препоръчителен) за дефиниране на аритметичните операторите е с кастване на операндите към (dynamic).


от AntonPetrov (654 точки)


0

Цък

Ето я и моята реализация. Мисля, че няма, какво да се разяснява, повечето решения са подобни. Аз съм решил задачата с generics ( не че това се иска в исловието )




0

GitHub

Поне си припомних как се умножават матрици :)

Това е моят примерен клас - пренаписъл съм  ТoString и операторите + - * .Оставил съм методите Add / Substract / Multiply публични - така едно и също нещо може да се прави и чрез извикването им и чрез самите оператори.


от dzhenko (3893 точки)


1

Сорс код на класа и методите му - http://git.io/x94z5w 

Демонстрация - http://git.io/X4Po3Q

Може би не трябваше да ги слагам отделно, но във VisualStudio така е доста по-прегледно, мисля.

В случай, че имате желание да тествате - трябва или да създадете проект с два class файла (.cs) (може да се добави с десен клик на Project-а в Solution Explorer-a -> Add Class (или просто Shift + Alt + C)) и да копирате съдържанието на двата линка и.... оф, май никой няма да тества :D

Може и просто да копирате всички методи и дефиниции и т.н. в един файл, но внимавайте кое къде слагате.

По-специфичното при моята "имплементация" е, че може да се събират матрици с различен брой колони и редове. Клетките от резултатната матрица, за които няма стойности в нито една матрица се запълват с нули.

Тази задача ми беше особено приятна и научих доста за ООП и ми стана още по-ясно как работят неща като List и StringBuilder.


от georgiwe (720 точки)


0

Ето го моето решение. http://pastebin.com/vnR6ii0A

Направил съм си и елеменарен exception да хвърлям, когато на може да се извърши действието (незнам дали е много разумно). Не съм сигурен с умножението дали съм се справил добре. Иначе като цяло схванах принципа на overload - а на операторите.


от nikolap (555 точки)