[Pascal]Tablica 3D- jak poradzić sobie z jej elementami?


(M4thy5) #1

Rozpisanie zmiennych dwuwymiarowej tablicy nie stanowi raczej problemu, sprawa komplikuje sie przy tablicy trójwymiarowej.

Czy tablica trójwymiarowa [0..1, 0..1, 0..1] działa tak że pierwszy zakres 0..1 informuje ile jest katalogów zmiennych które są również zmiennymi i kolejne te zakresy są podkatalogami/zmiennymi zmiennych zakresu poprzedniego?

Czy rozpis [0..1, 0..1, 0..1] powinien być taki (od końca brane liczby):

000

001

011


100

101

111

czy taki (po kolei brane liczby):

000

010

011


100

110

111

? Rozpisałem [0..2, 0..3, 0..3] jak ja to widzę- czyli by były 3 foldery, w nim 3 pod foldery a w każdym pod folderze 3 pliki. Nazwy w każdym folderze są takie same jak w poprzednim folderze dla przejrzystości. Dobrze to robię?

var

  a: array[0..2, 0..3, 0..3] of String;


begin

{folder pierwszy}

  a[0][0][0]:='FOLDER_0';

   {1} a[0][1][0]:='podFOLDER_0';

		a[0][1][1]:='PLIK_0';

		a[0][1][2]:='PLIK_1';

		a[0][1][3]:='PLIK_2';

   {2} a[0][2][0]:='podFOLDER_1';

		a[0][2][1]:='PLIK_0';

		a[0][2][2]:='PLIK_1';

		a[0][2][3]:='PLIK_2';

   {3} a[0][3][0]:='podFOLDER_2';

		a[0][3][1]:='PLIK_0';

		a[0][3][2]:='PLIK_1';

		a[0][3][3]:='PLIK_2';


{folder drugi}

  a[1][0][0]:='FOLDER_1';

   {1} a[1][1][0]:='podFOLDER_0';

		a[1][1][1]:='PLIK_0';

		a[1][1][2]:='PLIK_1';

		a[1][1][3]:='PLIK_2';

   {2} a[1][2][0]:='podFOLDER_1';

		a[1][2][1]:='PLIK_0';

		a[1][2][2]:='PLIK_1';

		a[1][2][3]:='PLIK_2';

   {3} a[1][3][0]:='podFOLDER_2';

		a[1][3][1]:='PLIK_0';

		a[1][3][2]:='PLIK_1';

		a[1][3][3]:='PLIK_2';


{folder trzeci}

  a[2][0][0]:='FOLDER_2';

   {1} a[2][1][0]:='podFOLDER_0';

		a[2][1][1]:='PLIK_0';

		a[2][1][2]:='PLIK_1';

		a[2][1][3]:='PLIK_2';

   {2} a[2][2][0]:='podFOLDER_1';

		a[2][2][1]:='PLIK_0';

		a[2][2][2]:='PLIK_1';

		a[2][2][3]:='PLIK_2';

   {3} a[2][3][0]:='podFOLDER_2';

		a[2][3][1]:='PLIK_0';

		a[2][3][2]:='PLIK_1';

		a[2][3][3]:='PLIK_2';

end.

P.S. Wymyśliłem to na podstawie tego

program arrayarray;


var

  Tablica : array[0..1, 0..2] of String;


begin

  Tablica[0][0] := 'Fiat';

  { marka samochodu }


	Tablica[0][1] := 'Uno';

	Tablica[0][2] := 'Punto';

	{ modele samochodów }


  Tablica[1][0] := 'Audi';


	Tablica[1][1] := 'A4';

	Tablica[1][2] := 'A8';


end.

ze strony: http://4programmers.net/Delphi/Tablice

Ale tu właśnie tylko dwuwymiarowa tablica jest zaprezentowana i stąd moje wątpliwości.


([alex]) #2

To nie da się tak wprost do katalogów porównać. No chyba że te katalogi tak zorganizowane ze pliki są tylko na określonym ostatnim poziomie, na każdym poziomie jest dokładnie taka sama ilość podkatalogów a na ostatnich poziomach dokładnie taka sama ilość plików.

Trzywymiarową tablice o wiele łatwiej sobie wyobrazić jako prostopadłościan złożony z kostek, do każdej możesz zajrzeć podając współrzędne X,Y,Z

Ja mam sposób na wydobrzenie sobie nawet 6-ciu wymiarów. :lol:


(M4thy5) #3

Do folderów porównałem bo rozrysowałem sobie tą strukturę na kartce i oznaczyłem jako foldery by było łatwiej sobie wyobrazić :slight_smile: No ale sztywne to bardzo i nie da sie dowolnej struktury stworzyć ;/ Chyba że na wyrost deklarować zmienne, ale to nie wygodne później gdyby coś dopisywać.


([alex]) #4

To możesz mieć coś mniej sztywnego:

TFoldery=array of TFolder;

TFolder=record Name:String; Foldery:TFoldery; end;

W Delphi działa.


(M4thy5) #5

Wracając jeszcze do tego o czym na samym początku pisałem- źle to rozpisałem. Wg pętli:

uses crt;

var i,j,k,licznik:integer;

    a:array[0..2,0..3,0..3]of integer;

    begin

    clrscr;

    for i:=0 to 2 do

    for j:=0 to 3 do

    for k:=0 to 3 do

    begin

    licznik:=licznik+1;

    write('a[',i,j,k,'] ');

    if (k=3) and (j<>3) then writeln;

    if (j=3) and (k=3) then

        begin

        writeln;

        writeln;

        end;

    end;

    writeln(licznik);

    end.

pominąłem aż 9 zmiennych:

a[000] a[001] a[002] a[003]

a[010] a[011] a[012] a[013]

a[020] a[021] a[022] a[023]

a[030] a[031] a[032] a[033]

a[100] a[101] a[102] a[103]

a[110] a[111] a[112] a[113]

a[120] a[121] a[122] a[123]

a[130] a[131] a[132] a[133]

a[200] a[201] a[202] a[203]

a[210] a[211] a[212] a[213]

a[220] a[221] a[222] a[223]

a[230] a[231] a[232] a[233]

Ideę tej pętli rozumiem oczywiście ale nie rozumiem dlaczego taka jest struktura prawdziwa tych indeksów tablicy trójwymiarowej. Zaburzona jest struktura katalogowa (może do katalogów można porównać jedynie w tablicy dwuwymiarowej...), ponieważ gdy: [0..2, 0..3, 0..3] to powinno być tak:

Od 0 do 2 są 3 zmienne. 0..3 to 4 pod-zmienne (podrzędne względem tych pierwszych), ale jedna zmienna jest zabierana do pierwszej i pozostają 3 zmienne (tu właśnie też nie rozumiem dlaczego tak jest), podrzędnymi tych zmiennych są kolejne trzy zmienne (3 ponieważ jedna jest brana do zmiennej która jest nadrzędną tych zmiennych.

a jest tak:

Od 0 do 2 są 3 zmienne. W każdej z nich są 3 zmienne (jedna brana wyżej i dlatego nie 4) z trzema pod-zmiennymi. W trzech tych najwyżej położonych zmiennych ([0..2]) są jeszcze dodatkowo 3 zmienne bez pod-zmiennych (to jest dziwne) i to tylko w tych pierwszych najwyżej położonych zmiennych :o.

Wiem że pętle te w logiczny sposób obrazują jak to powinno wyglądać, w logiczny sposób dla pętli. Ale patrząc na tą strukturę kątem struktury tablicy dwuwymiarowej jest to dziwne. Jak to rozumieć?