Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++]Klasa macierz, działania na macierzach, kilka błędów

panwrona 12 Cze 2011 14:13 2987 6
  • #1 12 Cze 2011 14:13
    panwrona
    Poziom 8  

    Witam, mam pewien problem. Otóż mam sobie pewien program do działań na macierzach. Tablice dwuwymiarowe muszą być dynamiczne i wartości wprowadzane do nich z poziomu programu. Mam jednak z nim kilka problemów, otóż:

    1. Tablice dwuwymiarowe ( macierze ) tworzone są z poziomu main. Nie mogę sobie poradzić, aby tworzyła je jedna funkcja w klasie macierz2d.
    2. Mnożenie wychodzi tylko wtedy, gdy jedna z macierzy jest kwadratowa, oraz gdy 2 macierz ma najwyżej o jedną kolumnę więcej, tzn. mnoży np macierze 2x2 X 2x3, a np. 2x2 X 2x4 już nie.
    3. Wyznacznik jest funkcją, która jest w klasie macierz_k. Problem jest taki, że wyznacznik moge policzyć tylko o takich wymiarach, jakie miala pierwsza macierz którą mnożyłem.

    Oto kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 6
  • #2 12 Cze 2011 16:36
    Dżyszla
    Poziom 42  

    1. No a gdzie stosowny kod? Chyba przy konstruktorze powinno być tworzenie, a przy destruktorze zwalnianie...
    2. Jakim cudem mnożenie przejmuje tylko jeden wymiar, skoro mnożone macierze mogą mieć różne wymiary?
    3. Nie bardzo rozumiem...

    Moim zdaniem cała struktura jest niezaplanowana. Macierz mogłaby być obiektem, a metody np tworzyłyby nową w oparciu o konkretne działanie, albo modyfikowały istniejącą. Ponadto powinny pobierać całe obiekty, dzięki czemu nie trzeba by np przekazywać rozmiarów. Czemu wyznacznik jest w osobnej klasie - też nie pojmuję.

    0
  • #3 12 Cze 2011 16:56
    panwrona
    Poziom 8  

    Ad. 3 - Wyznacznik jest w osobnej klasie bo takie jest odgórne założenie :) po prostu ma być klasa macierz_k, która ma dziedziczyć i w niej ma być wyznacznik.

    Ad. 2 - nie rozumiem troszkę pytania :D

    Ad. 1 - Czy mógłbyś mi przybliżyć jak miałby wyglądać taki konstruktor i destruktor? Wiem, że destruktor charakteryzuje sie mniej wiecej taka skladnia:


    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    A w mainie? Czy trzeba jakoś się odwołać?

    I przy konstruktorze chciałbym się spytać, jak mniej więcej miałby wyglądać taki konstruktor, aby był w klasie, i potem np jak tworze obiekty klasy macierz2d, tworzy mi odpowiednie tablice?

    0
  • #4 12 Cze 2011 17:06
    Dżyszla
    Poziom 42  

    2. A jakie są zasady mnożenia macierzy? Ile danych wejściowych potrzebnych jest do takiego działania?
    1. To klasa macierzy powinna posiadać tablice moim zdaniem. A tworzysz tak, jak w przypadku tablic wykorzystanych w bloku głównym.

    0
  • #5 12 Cze 2011 17:09
    panwrona
    Poziom 8  

    Liczba kolumn 1 macierzy powinna rownac sie liczbie wierszy 2 macierzy. To akurat wiem. Ciezko z samym algorytmem ;)

    Ad. 1

    Czyli mam po prostu stworzyc konstruktor, ktory z miejsca stworzy mi w klasie 5 tablic? Tylko potem gdy bede tworzyc 3 obiekty klasy w mainie, to czy kazdy z nich nie bedzie miec tych 5 tablic? Jak to wszystko kontrolowac?

    0
  • #6 12 Cze 2011 17:47
    Dżyszla
    Poziom 42  

    No dobra, a co z liczbą wierszy pierwszej macierzy i kolumn drugiej? Mają być też takie same czy mogą być różne? A jeśli różne to chyba masz 3 zmienne - k1=w2, w1 i k2, prawda?

    Wszystko zależy od założeń. Ja bym widział to tak, że każdy obiekt posiada jedną tablicę reprezentującą macierz. Transponowanie mogłoby powodować zmianę macierzy danego obiektu lub zwracać nowy obiekt. Mnożenie analogicznie. Z tego powodu należy przewidzieć konstruktor, który w parametrze przejmie tablicę (oraz wymiary) i przepisze do swojej. Drugim przeładowanym konstruktorem byłoby podawanie wyłącznie wymiarów. Pozbywamy się funkcji wprowadz (zastąpi ją konstruktor) i usun (destruktor).

    Po co wyswietl i wyswietl2? O co chodziło?

    0
  • #7 17 Lip 2011 12:45
    Matejkos
    Poziom 20  

    Czy napisanie klasy z macierzami jest twoim głównym zadaniem czy tylko częścią czegoś większego, bo nie warto wymyślać koła na nowo kiedy coś takiego już istnieje poczytaj o bibliotece boost, w której w części numeric jest coś takiego już zaimplementowane. Pozdrawiam Matejkos

    0