Tablice w pascalu

0

To znow ja, niedawo mi bardzo pomogliscie na tym forum, gdy mialem problem z procedurami i funkcjami.

Teraz mam inny: chce napisac funkcje dla opracji na wektorach i te wektory to maja byc jednowymiarowe tablice (tak twierdzi ksiazka). W rl wektory sa proste, ale nie wiem jak je zaprogramowac w pascalu - pomyslalem, ze takie podstawowe funkcje jak zadaj_wektor, wypisz, dodaj, odejmij, dlugosc, iloczyn skalarny i wektorowy. Do takiego wektora trzeba 2 zmiennych? Jedna do wspolrzednych a druga do dlugosci?

Znalazlem podobny problem na tym forum, ale to w delphi i tam jest jakis typ "point", a ja chcialem jako array [1..n] of real;

Jakies pomysly? Niekoniecznie gotowy skrypt, chetniej bym jakas podpowiedz dostal jak to samemu zrobic (a gotowy jako sprawdzenie tylko). Z gory dzieki :)

0

Rozumiem że chcesz tablice dynamiczną? jeżeli tak, to możesz zrobić to w ten sposób :

type
 ttab        = array[0..0] of real;
 TWektor = object 
   data      : ^Ttab;
   n           :  word;
   procedure nowy_wektor(_n:word);
   procedure ustaw(i:word; l:real);
   function   pobierz(i:word):real;
   procedure free;
 end;

procedure twektor.nowy_wektor(_n:word);
 begin
    n :=0;
    if longint(n)*sizeof(real)>65535 then exit;
    n:=_n;
    getmem(data, n*sizeof(real));
  end;

procedure twektor.ustaw(i:word; l:real);
 begin
   if  ((i>=0)and(i<n)) then data^[i]:=l;
 end;

function   twektor.pobierz(i:word):real;
 begin
  if ((i>=0)and(i<n)) then pobierz:=data^[i] else pobierz:=0;
 end;

procedure twektor.free;
 begin
  if  (n=0) then exit;
  freemem(data, n*sizeof(real));
  n:=0;
 end;

Taki rekord powinien wystarczyć do obsługi tego co chcesz =P pisałem bez sprawdzania wiec mogą być jakieś błędy.

0

Ee...dzieki, ale nie o to mi chyba chodzi. Tzn, ucze sie z ksiazki, i na razie przerabiam tablice, o strukturach dynamicznych niewiele (czyt. nic) wiem, tak samo jak o wskaznikach. To tutaj, to chyba object pascal, ja sie ucze w zwyklym, strukturalnym. Jakis inny sposob istnieje?

0

Jeżeli nie chodzi ci o tablice o dowolnym wymiarze to o co?

0
Mashimaru napisał(a)

W rl wektory sa proste, ale nie wiem jak je zaprogramowac w pascalu - pomyslalem, ze takie podstawowe funkcje jak zadaj_wektor, wypisz, dodaj, odejmij, dlugosc, iloczyn skalarny i wektorowy. Do takiego wektora trzeba 2 zmiennych? Jedna do wspolrzednych a druga do dlugosci?

Znalazlem podobny problem na tym forum, ale to w delphi i tam jest jakis typ "point", a ja chcialem jako array [1..n] of real;

W biegunowym układzie wsp. podajesz długość i kąt nachylenia do wykresu Start zawsze od zera. W prostokątnym podajesz wsp. punktu startu i końca wektora. Co do typu "Point". Jest to coś takiego

type
 TPoint = record x, y z :Single; end;

Struktura ta umożliwia przechowanie wsp. punktu w 3D. Poczytaj tego posta, jest dość podobny, może coś wyłapiesz.

0

No jeśli chodzi wektor uporządkowanych liczb rzeczywistych (np. oś lub odcinek) to najlepiej zapamiętać jego dwa końce (x i y, albo jak napisał Oleksy_Adam x, y i z) i wtedy można obliczyć jakie punkty do niego należą i w/w przez Ciebie operacje. Ale jeśli chodzi o wektor jakichś dowolnych liczb, to pewnie chodzi po prostu o tablicę jednowymiarową (która jest po prostu nazywana wektorem). Ale operacje matematyczne na tablicach są troszkę bardzej złożone i różnią się od tych wektorów z geometrii analitycznej.

Mam nadzieję, że nic nie pokręciłem :P

Pozdrawiam.

0

Mm, moze nie umiem sam wyjasnic, z czym mam problem. Wklepie wiec zadanie z ksiazki:

"Do reprezentowanie wektora będziemy używali tablicy o elementach rzeczywistych (współrzędne wektora) oraz zmiennej całkowitej (rzeczywista długość wektora).
Napisz zestaw funkcji i procedur obsługujących tak reprezentowany wektor (zadaj_wektor, wypisz_wektor, dodaj, odejmij, długość, iloczyn_skalarny, iloczyn_wektorowy)."

Nie umiem (jeszcze) obslugiwac wskaznikow, wiec sposob podany przez ADucha odpada :/

0

Jeżeli nie możesz stosować tablic dynamicznych, to musisz skorzystać z takiej trochę głupiej techniki, definiujesz odpowiednio dużą tablicę i korzystasz tylko z n elementów, przykład :

Ad 1.

const
 MaxLength = 100;  { maxymalnie wektor 100 - wyamiarowy }

type
 TWektor :array[0..MaxLength-1] of real; { i taki typ wektora }

var
  wektor: TWektor;
  n        : word;

n nie może byćwiększe od MaxLength, największa wada to Zajmowanie dużego obszaru pamięci bez jej wykorzystania. Zaleta : możesz bez problemu w programie korzystać z wektorów różnej długości.

Ad2.

 const
   n = 10;  

 type
  TWektor : array[0..n-1] of real;

var
 wektor:Twektror;

W tym wypadku możemy korzystać z wektorów które zawsze mają długość N, co to oznacza? że w programie możemy mieć wektor tylko jednej długości (ale można ją zmienić przed kompilacją - zmiana wartość n)

0

To czaje, fajnie - czyli bym stosowal raczej ta z zadeklarowanym stalym n, i tylko je w razie potrzeby zmienial. Tylko jak te ww operacje przetlumaczyc na pascalowy jezyk? Gdy obliczam dlugosc wektora w rl, to licze z wzoru: sqrt( sqr(xB-xA)+sqr(yB-yA)). A tu? Koncowe i poczatkowe wspolrzedne to pierwszy i ostatni index tablicy? Czyli to dziala tylko "na osi"? Bo na plaszczyznie juz dwie zmienne okreslaja punkt :/

0

No masz rację, że trochę to nielogiczne... Chyba, że długość oznaczysz nie jako wielkość tablicy, tylko jako różnicę ostatniego i pierwszego elementu; bo ogólnie to współrzędne wektora to (x, x *tg(alfa)), a w twoim zadaniu mógłbyś mieć kolejne elementy zupełnie różne... Ale takie obliczenia jak podałeś powyżej też można wykonywać na tego typu wektorach, ale nie z tych wzorów, które znasz - poczytaj o tym na wiki.

Pozdro.

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