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.

0

Długośc wektora to nic innego jak odległość w metryce euklidesowej....

0

@ADuch: mam 10 lat, nie mam pojecia co to jest metryka euklidesowa, a wzoru Minkowskiego z wikipedii zupelnie nie lapie :/ Przyklad, ktory podales to chyba wlasnie to. Widze, ze sam tego nie napisze, moglbys zaproponowac pelne rozwiazanie w stylu:

"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)" <--- tak jak pisales wczeniej?

@Dannte: o, wlasnie, moze tak to ma byc jak w wiki? w geometrii syntetycznej (jakostak to sie nazywa w ksiazce)?

0

Używaj znaczników kodu.
Jak można prosto policzyć długość wektora n - wymiarowego? liczysz d(0,v) w metryce euklidesowej gdzie v to wektor n wymiarowe, a zero to też jak gdyby wektor n- wyamiarowy o wartościach 0,0,0..0
http://pl.wikipedia.org/wiki/Przestrze%C5%84_metryczna
czyli wynik d(0,v) = sqrt( (0-v1)2 + (0-v2)2 +.. +(0-vN)2) korzystamy z tego że (0-vI)2 dla I=1..N wynosi (-vI)2 a to z kolei jest (vI)2 dla I=1..n czyli cały wzór
d(0,v) = sqrt( (v1)2 + (v2)2 +.. +(vN)^2)
Tak dla formalności (v1)^2 = v1*v1.
Ten wzór łatwo wyprowadzić w inny sposób (z pitagorasa )
przekątna kwadratu(długość wektora w 2D) = sqrt(x2 + y2)
przekątna prostopadłościanu ( długość wektora w 3D ) = sqrt (x2 + y2 +z^2 ) łatwo zauwarzyc że każdy następny różni się dodaniem kolejnej współrzędnej do kwadratu :P

program as;

const
 n = 3;

type 
 TWektor = array[0..n-1] of real;   { pierwsza wsp. ma index 0, ostatnia n-1 }
var
 v1,v2:twektor;

function w_length(var w:TWektor):real;
var suma:real;
      i : integer;
 begin
  suma:=0; { zerujemy sumę }

  for i:=0 to n-1 do
   suma:=suma+w[i]*w[i];  { dodajemy kolejne współrzędne^2 do sumy)

  { tutaj mamy już sumękwadratów wszystkich współrzędnych => zwracamy pierwiastek }
   w_length:=sqrt(suma);
 end;

procedure w_dodaj(var a,b:twektor);
var i:integer;
 begin
   for i:=0 to n-1 do
    a[i]:=a[i]+b[i];         { dodajemy odpowiednie współrzędne z b do a i zapamiętujemy w a}
 end;


begin
 v1[0]:=8;
 v1[1]:=4;
 v1[2]:=1;

 v2[0]:=4;
 v2[1]:=5;
 v2[2]:=-10;

 w_dodaj(v2,v1);

 writeln(' len v1 = ', w_length(v1):10:5);  { zdaje się powinno dać wynik 9 } 
 writeln(' v2[',v2[0]:5:3,', ',v2[1]:5:3,', ',v2[2]:5:3,']'); { wektor v2 po dodaniu v1 }
end.
0

Teraz lapie ^^
Dzieki, z tym co napisales juz dam rade ilotczyny skalarny/wektorowy :)

0

Potrzebuje program który dla dwóch wektorów W1 i W2 zawierających 10 liczb całkowitych wprowadzonych z klawiatury odwróci mi kolejno element wektorów.
Z góry dziękuje wszystkim.
;]

0

Potrzebuje program który dla dwóch wektorów W1 i W2 zawierających 10 liczb całkowitych wprowadzonych z klawiatury odwróci mi kolejno element wektorów.
Z góry dziękuje wszystkim.
;]

0

Mashimaru móglobys pokazac na forum rozwiązanie swojego zadania mam podobne i ciagle :/ wyskakuja jakieś blędy. Dziox

0

Mashimaru móglobys pokazac na forum rozwiązanie swojego zadania mam podobne i ciagle :/ wyskakuja jakieś blędy. Dziox

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