Macierze kwadratowe na klasach

0

Witam
Mam za zadanie stworzyć program, który będzie generował 2 macierze kwadratowe (o rozmiarze podanym z klawiatury przez użytkownika) i dokonywał na nich operacji: wyświetlanie, dodawanie, odejmowanie, mnożenie, dzielenie.
Program koniecznie musi być na klasach.
Pierwszy program pojawił się już przy generowaniu macierzy. Nie bardzo wiem w jaki sposób zadeklarować tablicę o rozmiarze, który będzie podany dopiero w czasie wykonywania się programu. kiedy piszę np.

var
a:byte;
mac1:array[0..a,0..a] of integer;
mac2:array[0..a,0..a] of integer;

Kompilator wywala błąd, że a nie jest określone.
Proszę o pomoc i z góry dziękuję.

1
kromka92 napisał(a)

Kompilator wywala błąd, że a nie jest określone.

No bo a nie jest określone, to stan surowy, jeszcze nie została do niej wpisana żadna wartość stąd kompilator krzyczy; Gdyby to była stała nie byłoby najmniejszego problemu, ale jeżeli to jest zmienna, to trzeba jej najpierw nadać wartość;

kromka92 napisał(a)

Mam za zadanie stworzyć program, który będzie generował 2 macierze kwadratowe (o rozmiarze podanym z klawiatury przez użytkownika)

Widać, że nie zrozumiałeś treści zadania; Jeżeli jest napisane, że program będzie tworzył dwie macierze o rozmiarze, jaki poda użytkownik to nie możesz ich na sztywno próbować ustawić już w bloku deklaracyjnym; Gdzieś w kodzie musisz poprosić użytkownika o podanie rozmiaru, a potem ustawić ich rozmiar według podanej danej; Pachnie mi tutaj dwuwymiarowymi dynamicznymi tablicami, więc postaraj się poczytać o nich; Bo skoro nie znasz rozmiaru macierzy, to nie możesz ich ustawić w deklaracji, a jedyna możliwość to skorzystanie z dynamicznych tablic (chyba, że jeszcze jakieś pieroństwo istnieje...);

Więc co musisz zrobić? Najpierw pobrać rozmiar dla tablic z klawiatury, później procedurą SetLength ustawić ich rozmiar i dalej operować na polach tych macierzy; Niestety dalej nie wiem o co chodzi w tym zdaniu:

kromka92 napisał(a)

program, który będzie generował 2 macierze kwadratowe i dokonywał na nich operacji: wyświetlanie, dodawanie, odejmowanie, mnożenie, dzielenie.

W jaki sposób będą realizowane te operacje? Gdzie tu chcesz umieścić klasy? Pola macierzy mają być obiektami jakiejś klasy czy jak?

Jak dla mnie mało informacji podałeś; Podasz więcej i dokładniejsze - w miarę możliwości pomogę Ci; Czekam na odzew;

0

Dzięki za zainteresowanie. Dokładna treść zadania które otrzymałem:

Klasa statyczna : dane : Macierz kwadratowa metody klasy: konstruktor - ustalenie rozmiaru macierzy, generowanie macierzy, wyświetlanie, dodawanie, odejmowanie, mnożenie, dzielenie

Wg mnie trochę mało precyzyjne polecenie, ale już napisałem do prowadzącego maila z prośbą o wyjaśnienie kliku kwestii których nie jestem pewny.
Czy to coś pomogło? Może ja coś źle zrozumiałem?

1

No już lepiej, ale jest problem - regulamin zabrania proszenia o rozwiązanie zadania do szkoły / na studia; Jeżeli nie wykażesz się chęciami temat zostanie usunięty;

Musisz sam coś dać z siebie, nie tylko czekać na gotowy kod;

Tłumaczę (jak ja to rozumiem):

dane : Macierz kwadratowa

Czyli dwuwymiarowa dynamiczna tablica jako właściwość klasy;

metody klasy: konstruktor - ustalenie rozmiaru macierzy, generowanie macierzy

Arumentem konstruktora będzie rozmiar macierzy (czyli [X, Y]), w jego ciele będzie ustawienie wielkości tej macierzy; Ale nie wiem czy to ma być jedna macierz, czy wiele;

wyświetlanie, dodawanie, odejmowanie, mnożenie, dzielenie

Publiczne metody, które będą realizowały dane operacje na liczbach zawartych w macierzy; Stąd będą to funkcje, które w argumentach będą przejmować współrzędne dwóch liczb w macierzy, na których będą wykonywane operacje;

Inaczej za pierona tego nie zrozumiem; Zbyt mało idiota podał informacji; Tak naprawdę to nic nie wiadomo, bo jakiego typu będą pola macierzy, jakie argumenty będą przechowywać metody, czy to mają być procedury czy funkcje, nic nie wiadomo; Więc skąd masz wiedzieć jak się za to zabrać? 50% Inforamcji jest, 50% nie ma; Raczej obstawiał bym, że 50% słów w treści zadania nie ma, niż informacji; Pisać mu się nie chciało czy co...? Nie wiem;

Jeżeli znasz się mniej więcej na podstawach OOP to dasz radę pod warunkiem, że zrozumiesz treść zadania; Ja tego nie bardzo rozumiem, więc mogę się mylić;

1

Gdyby to była stała nie byłoby najmniejszego problemu, ale jeżeli to jest zmienna, to trzeba jej najpierw nadać wartość;

Nie do końca (w moim rozumieniu). Po prostu typowa tablica nie może zmieniać swojego rozmiaru po kompilacji, proste :P .

To czego kolega szuka to dynamic array.

50% Inforamcji jest, 50% nie ma

Pewnie na zajęciach mówił.

Więc niech autor:
1.poda więcej informacji o zadaniu
2.poda więcej kodu żeby nie było że piszemy za niego (ew. dział praca)

0

To jeszcze raz dzięki za zainteresowanie i pomoc.
Zabieram się za pisanie i czekam na odpowiedź na maila (od prowadzącego z dokładniejszymi informacjami o zadaniu). Na zajęciach nic nie było mówione na ten temat, tylko przed wyjściem każdy dostał kartkę z zadaniem na święta (każdy dostał inne zadanie). Jak coś stworzę to tu wrzucę i zobaczymy co dalej.

0
Oho napisał(a)

Nie do końca

Do końca, @oho, do końca; Indeksem macierzy w deklaracji może być wpisana na sztywno liczba, lub stała przechowująca liczbę; Inaczej nie będzie;

Oho napisał(a)

To czego kolega szuka to dynamic array.

Ja napisał(a)

Czyli dwuwymiarowa dynamiczna tablica jako właściwość klasy;

Jak napisałem dwa posty wyżej;

Musimy miec więcej informacji, bo większości trzeba się domyślać; A Ty nie masz wymyślić zadanie, tylko je rozwiązać; Więc dowiedz się szczegółów i daj znać (razem z kodem);

EDIT:

kromka92 napisał(a)

Zabieram się za pisanie i czekam na odpowiedź na maila.

Jeżeli napisałeś na forum - rozmawiamy na forum; Gdybyś napisał na e-mail'a - pisalibyśmy Ci e-mail'e;

0

Do końca, @oho, do końca; Indeksem macierzy w deklaracji może być wpisana na sztywno liczba, lub stała przechowująca liczbę; Inaczej nie będzie;

Jakoś twoje tłumaczenie mnie nie przekonuje, tylko o to chodzi. Dla mnie po prostu ta liczba nie może się zmieniać. Tłumaczenie proste, do mnie bardziej trafia. Gadamy o tym samym, tylko w innych słowach :-] .

Więc dowiedz się szczegółów i daj znać (razem z kodem); [...] Jeżeli napisałeś na forum - rozmawiamy na forum; Gdybyś napisał na e-mail'a - pisalibyśmy Ci e-mail'e;

A czy on nie napisał maila do wykładowcy? =.=

0

W sumie tak, o jedno chodzi ale w innych słowach :P

Zabieram się za pisanie i czekam na odpowiedź na maila (od prowadzącego z dokładniejszymi informacjami o zadaniu).

Gdzie mi się podziało to zdanie w nawiasach... Wybaczcie, nie przeczytałem uważnie;

0
Oho napisał(a)

Jakoś twoje tłumaczenie mnie nie przekonuje, tylko o to chodzi. Dla mnie po prostu ta liczba nie może się zmieniać.
ależ może się zmieniać - ważne jest to, że w momencie kompilacji musi ona być ZNANA, co implikuje (mówimy o pascalu) fakt, że albo będzie to stała (const) albo wprost wpisana wartość liczbowa. Co nie zmienia faktu, że obaj macie rację tylko każdy z Was inaczej to tłumaczy.

A co do pytania to przede wszystkim musisz napisać klasę, która
a) jako parametr konstruktora przyjmuje rozmiar macierzy
b) trzyma macierz jako zmienną prywatną
c) pozwala się do tej macierzy dostać (np. właściwość publiczna

  private
    function  GetMacierz(X, Y: Integer): Integer;
    procedure SetMacierz(X, Y: Integer; Value: Integer);
  public
    property Macierz[x, y: Integer]: Integer read GetMacierz write SetMacierz;

d) i mieć metody Wyswietl, dodaj, odejmij, mnoz, dziel
np. GetMacierz, SetMacierz powinny najpierw sprawdzać, czy nie próbujesz się odwołać poza zakres macierzy

0

Z góry przepraszam jeżeli to co piszę to będą jakieś głupoty. Czytałem o klasach na internecie, ale nie bardzo rozumiem.

Ad. a)
Czy to będzie coś w tym stylu?

Type Tmatcierz=class
  rozm:integer;
  Constructor Create(_rozm:integer);
  Destructor Destroy;
end;  

Ad. b)
Mógłbyś rozwinąć? W jaki sposób macierz ma być przechowywana jako zmienna?

0
type
  TMacierzType = array of array of Integer;
  TMacierz = class
  private
    FMacierz: TMacierzType; //masz macierz jako zmienna :p
    FRozmiar: Integer;
  public
    constructor Create(Rozmiar: Integer);
    destructor Destroy; override;
  end;
0

Miałem chwilkę czasu i napisałem Ci szkielet klasy, bo widzę, że nie bardzo rozumiesz jeszcze programowanie obiektowe i pisanie własnych klas; Widać, że dopiero co zacząłeś się ich uczyć;

Napisałem Ci samą deklarację klasy, jej pola i metody; Twoja działka to definicja metod w niej zawartych; Masz o czym poczytać, więc przeglądnij sobie np. ten kurs o podstawach programowania obiektowego i tworzeniu klas;

Poniżej kod deklaracji klasy (razem z krótkim tłumaczeniem):

type
  { TYP MACIERZY KWADRATOWEJ }
  TSquareArray = array of array of Integer;

type
  { KLASA OPERUJĄCA NA MACIERZY KWADRATOWEJ }
  TSquareArr = class(TObject)
  private
    { MACIERZ KWADRATOWA JAKO PRYWATNE POLE (ZMIENNA) }
    FSquareArr: TSquareArray;
  protected
    { ODCZYT POJEDYNCZEJ LICZBY Z MACIERZY }
    function GetSquareArr(X, Y: Integer): Integer;
    { ZAPIS POJEDYNCZEJ LICZBY W MACIERZY }
    procedure SetSquareArr(X, Y, Value: Integer);
  public
    { KONSTRUKTOR I DESTRUKTOR OBIEKTU }
    constructor Create(ArrSize: Integer);
    destructor Destroy(); override;

    { WYŚWIETLANIE ZAWARTOŚCI MACIERZY }
    procedure Show();

    { SUMOWANIE LICZB }
    function Sum(const X1, Y1, X2, Y2: Integer): Integer;
    { ODEJMOWANIE LICZB }
    function Subtract(const X1, Y1, X2, Y2: Integer): Integer;
    { MNOŻENIE LICZB }
    function Multiply(const X1, Y1, X2, Y2: Integer): Integer;
    { DZIELENIE LICZB }
    function Devide(const X1, Y1, X2, Y2: Integer): Integer;

    { MACIERZ KWADRATOWA JAKO WŁAŚCIWOŚĆ }
    property SquareArr[X, Y: Integer]: Integer read GetSquareArr write SetSquareArr;
  end;

Nie wiem jakie chcesz mieć argumenty w funkcjach obliczeniowych, w każdym razie ja podałem przykładowe; Możesz zamiast czterech współrzędnych pobierać dwa argumenty jako TPoint - ciekawsze rozwiązanie (ja bym je wykorzystał, ale nie chcę Ci narzucać stylu):

{ SUMOWANIE LICZB }
function Sum(const N1, N2: TPoint): Integer;

Możesz coś pozmieniać jak Ci nie będzie pasowało; Rób co chcesz, ale musisz zrozumieć ten kod; Jeżeli miałbyś jakieś pytania to pytaj, ale najpierw próbuj sam i testuj;

0

Myślę, że jemu chodziło o dodawanie, odejmowanie itd macierzy a nie liczb

0

Teraz to już sam nie wiem czego to dodawanie ma być... No ale jak to ma być "dodawanie macierzy" to w jaki sposób? Tylko dzielenie jakoś nie pasuje do tego; Jak dla mnie to ma być dodawanie / odejmowanie / mnożenie / dzielenie wybranych liczb zawartych w tej macierzy; Jest tylko jedna macierz, więc jak ją chciałeś dodać? Do czego? Nie bardzo rozumiem...

0

przez przekazywaną macierz jako parametr - http://pl.wikipedia.org/wiki/Macierz#Podstawowe_dzia.C5.82ania (tylko nie wiem co z dzieleniem :p)

0

Wydaje mi się, że w zadanie polega na tym co napisał Misiekd Dostałem informacje, że wielkość macierzy i poszczególne elementy będą wpisywane "z klawiatury", ale to chyba dużo nie zmienia ;D
Macie może jeszcze jakieś artykuły/kursy o programowaniu obiektowym w pascalu? Ten od** Furious Programming**przeczytałem, dużo rozjaśnił, ale przydało by mi się coś więcej.

0

function Devide(const X1, Y1, X2, Y2: Integer): Integer;

To chyba miało być divide (no chyba że dzielenie całkowitych to jest dev nie div :P ).

0
Misiekd napisał(a)

Myślę, że jemu chodziło o dodawanie, odejmowanie itd macierzy a nie liczb

Teraz już rozumiem o co chodzi z dodawaniem macierzy;

Tyle, że do dodawania macierzy potrzebne są dwie, a my mamy (z naszych pomysłów) tylko jedną; Nie wiem czy nie chodzi tutaj właśnie o operacje na pojedynczych liczbach z tego względu, że nie ma w tych artykułach dzielenia macierzy, oto lista operacji na macierzach:

Wikipedia napisał(a)

Operacje na macierzach
mnożenie przez skalar
dodawanie i odejmowanie
mnożenie macierzy
odwracanie macierzy
transpozycja macierzy
sprzężenie macierzy
operacje elementarne
macierz dopełnień algebraicznych
macierz dołączona
diagonalizacja
postać Jordana

Źródło: Macierz w Wikipedii

Trochę to dziwne, bo treść tego zadania jest niejasna;

Misiekd napisał(a)

przez przekazywaną macierz jako parametr

Hmm... Mamy jak na razie tylko jedną macierz jako zmienną prywatną, więc nie ma potrzeby przekazywać jej w parametrze, można bezpośrednio wykonywać na niej operacje;

Ten od Furious Programming przeczytałem, dużo rozjaśnił, ale przydało by mi się coś więcej.

To jest artykuł z tego forum z działu Kompendium wiedzy - Delphi - OOP, przedstawia on podstawy programowania obiektowego, które wypada znać, żeby móc tworzyć klasy; Takich artykułów jest bardzo dużo w sieci, po polsku i angielsku, wystarczy poszukać;

kromka92 napisał(a)

Dostałem informacje, że wielkość macierzy i poszczególne elementy będą wpisywane "z klawiatury"

Ciekawe, ile będzie trzeba wpisywać te liczby ręcznie, jak zadeklarujesz sobie macierz o wielkości 0 .. 9, 0 .. 9... :P

kromka92 napisał(a)

ale to chyba dużo nie zmienia

Nie zmienia nic, bo Ty miałeś napisać definicję metod i to do Ciebie należy oprogramowanie wprowadzania liczb; Musisz nam w końcu napisać, czy to będzie dodawanie itd. macierzy czy liczb z macierzy, bo jak do tej pory widziałem same spekulacje, a nie konktery; Napisz jakiś kod i wstaw tutaj, bo nie wiemy czy piszesz tą klasę czy nie... :P

0

Ok podpytałem się trochę i wiem, że:
-mają być 2 macierze
-macierze mają być wpisywane z klawiatury.
Czyli już chyba wszystkie wątpliwości rozwiane. Ja zabieram się za pisanie i jak coś już stworzę to podzielę się z Wami ;)

0

Udało mi się już stworzyć kod, który by generował macierze. Rozmiar macierzy jest w kodzie, ale może to przejdzie :). Jakbyście mogli to zerknijcie na to i powiedzcie czy wszystko ok. Nie wiem czy dobrze tablice zadeklarowałem bo miały być w klasach, ale nie bardzo wiem jak to zrobić :/ Mam jeszcze jedno pytanie - dodawanie, odejmowanie, mnożenie, dzielenie powinny być jako funkcje?
Mój kod:

 program test;
uses  SysUtils;
Const RM=3;
Type matrix1=array[1..RM,1..RM]of Byte;
Type matrix2=array[1..RM,1..RM]of Byte;
Type matrix3=array[1..RM,1..RM]of Byte;
procedure Create1(var M : matrix1);
Var  i, j :byte;  //zmienne lokalne
Begin
Randomize;
  for i:=1 to RM do
       for j:=1 to RM do
           M[i,j]:=random(6);
end;
procedure Create2(var N : matrix2);
Var  i, j :byte;
Begin
Randomize;
  for i:=1 to RM do
       for j:=1 to RM do
           N[i,j]:=random(10);
end;
 procedure wypisz1(M :matrix1);
Var i,j: byte;
begin
  for i:=1 to RM do
    begin
      for j:=1 to RM do
          write(M[i,j]:4);
       writeln;
     end;
     writeln;
 End;
procedure wypisz2(N :matrix2);
Var i,j: byte;
begin
 for i:=1 to RM do
   begin
     for j:=1 to RM do
         write(N[i,j]:4);
      writeln;
    end;
    writeln;
End;

Var
  M : Matrix1;
  N : Matrix2;
//Czesc wykonawcza
Begin
    Create1(M);
  wypisz1(M);
  Create2(N);
  wypisz2(N);
  readln;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1