Помощь - Поиск - Пользователи - Календарь
Полная версия: Трёхмерный массив! HELP!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klik1602
Помогите пожалуйста! что-то совсем голова не варит((
Требуется отсортировать трёхмерный массив по возрастанию.
как я понимаю, проще это будет сделать, преобразовав данный массив в одномерный.
Подскажите, как выполнить преобразование?!
volvo
Не надо никаких преобразований. Как сортировать-то нужно?
klik1602
по возрастанию
volvo
По возрастанию ЧЕГО? Сумм элементов третьего изменения? Среднего значения элементов строки? Возрастаний я тебе сотню придумать могу. Напиши какой массив был и какой должен стать после сортировки.
klik1602
Дан трёхмерный массив. Расположите его элементы по возрастанию
klik1602

uses
crt;
var
n,m,k,i,j,t:integer;
a:array[1..10,1..10,1..10] of integer;
procedure swap(var x,y,z:integer);
var t,q:integer;
begin
t := x;
x := y;
y := z;
z := t;
end;
begin
clrscr;
writeln ('vvod poryadok matrica n');
readln (n);
m:=n; k:=n;
randomize;
for i := 1 to n do
for j := 1 to m do
for t := 1 to k do
a[i, j, t] := Random(10);
for i := 1 to n do
begin
for j := 1 to m do
begin
for t := 1 to k do
write(a[i,j,t]);
writeln;
end;
end;
for k:=1 to n-1 do
for j:=1 to n-k do
for i:=1 to n-j do
begin
if (a[i,j,k] > a[i+1,j,k]) and (a[i,j,k] > a[i+2,j,k]) then
swap(a[i,j,k],a[i+1,j,k],a[i+2,j,k]);
end;
for i := 1 to n do
begin
for j := 1 to m do
begin
for t := 1 to k do
write(a[i,j,t]);
writeln;
end;
end;
end.


что-то не то((
подскажите, как лучше вывести трёхмерный массив
Lapp
Цитата(klik1602 @ 13.01.2011 18:54) *
Дан трёхмерный массив. Расположите его элементы по возрастанию

klik1602, от тебя пытаются добиться вдоль чего сортировать. С одномернум массивом этого вопроса на возникает. Легко сказать, какая точка больше и какая меньше, если они на отрезке или даже на целой прямой. А вот попробуй сравни так две точки на плоскости (или в трехмерном пространстве). Поэтому всегда нужно указывать, вдоль чего ты сортируешь. Например, на плоскости ты можешь сказать, что сортировка по близости к какому-то центру. Это будет первый уровень сортировки, а второй - внутри окружностей (все точки которых находятся на одинаковом расстоянии от центра), там можно сортировать по углу.

Тут, я думаю, тебе нужна сквозная сортировка по слоям-строкам-элементам. Слой - это первый индекс, строка - второй, элементы - третий. Сквозная сортировка подразумевает, что ВСЕ элементы преддыдущего слоя не превосходят элементов следующего. В каждом слое - то же самое по строкам. А в каждой строке - поэлементно. Такая сортировка выглядит вполне естественно, но все же есть неоднозначность, и вопросы к тебе были совешенно законны. Например, можно сортировать элемент-слой-строка. Или вообще какой-нить змейкой хитрой..

Если же тебе надо сквозную сортировку слой-строка-элемент, то все довольно просто. Поскольку этот порядок совпадает с порядком организации трехмерного массива в памяти, то можно просто отсортировать всю эту область как большой одномерный массив. Например, вот так:
type
tElement= integer;

const
n= 3;
m= 6;
k= 8;
l= n*m*k;

var
a: array [1..n,1..m,1..k] of integer;
b: array [1..l] of integer absolute a;


procedure Show;
var
i,j,t: integer;
begin
for i:= 1 to n do begin
WriteLn(i,':');
for j:= 1 to m do begin
for t:= 1 to k do Write(a[i,j,t]:4);
WriteLn
end;
WriteLn
end
end;


var
i,j,t: integer;
buf: tElement;

begin
for i := 1 to n do
for j := 1 to m do
for t := 1 to k do
a[i, j, t] := Random(100)-49;

Show;

{ Сквозная сортировка }
for i:=2 to l do
for j:=l downto i do if b[j-1]>b[j] then begin
buf:= b[j-1];
b[j-1]:= b[j];
b[j]:= buf
end;

WriteLn('Отсортированный массив:');
Show;

ReadLn
end.

Что касается вывода, то он тоже организован по слоям.

Иногда в задаче требуется не прибегать к представлению массива как одномерного. Если у тебя как раз такой случай - скажи.
Удачи.
klik1602
большое спасибо за помощь))
задача поставлена так, как я вам её написала, а именно
Цитата
Дан трёхмерный массив. Расположите его элементы по возрастанию
, с преподавателем я не увижусь уже до сдачи лаб, и не смогу спросить, какая именно сортировка от меня требуется, но скорее всего сквозная))
не могли бы вы мне объяснить вот эту строчку
Цитата
b: array [1..l] of integer absolute a;
она у меня не читается при выполнении программы, выскакивает ошибка
Цитата
Ожидалось ';'

что означает absolute a ??
-TarasBer-
> она у меня не читается при выполнении программы, выскакивает ошибка

При выполнении?!
Может, при компиляции? Не путай, это очень большая разница.
Какой компилятор?

> Ожидалось ';'

Значит, при КОМПИЛЯЦИИ.
А вовсе не при выполнении.

> что означает absolute a ??

Это означает, что под переменную не будет выделяться память, переменная будет расположена в памяти там же, где и a.
volvo
Цитата
выскакивает ошибка

Включаем режим телепатии: компилятор - Pascal ABC? Тогда забудь про Absolute, там эта директива отменена. В ABC надо действовать по-другому.
volvo
М-да... В Pascal ABC убрали все возможности работы с указателями, вот что с людьми делает автоматическая сборка мусора... Никакими ухищрениями мне не удалось ни преобразовать указатель на 3-мерную структуру в указатель на обычный линейный массив (это стандартная в общем-то операция, тут она невозможна), ни просто сделать

type
vector = array[1 .. L] of telement;

// и дальше где-то привести:
vector(a)[i] := ...

Это тоже стандартное решение, и оно в ABC тоже не работает, он пишет что не может разные структуры приводить друг к другу, хотя вообще-то должен, размер-то абсолютно одинаковый...

Получилось сделать сквозную сортировку только
вот таким извращением... (Показать/Скрыть)
(тестировалось в PascalABC.NET 1.3.354)
Lapp
Цитата(klik1602 @ 14.01.2011 19:33) *
что означает absolute a ??
Что это буквально означает, тебе уже объяснили. А фигурально выражаясь, это означает, что пора бросать это уродство, Pascal ABC (если, конечно, это не есть ОБЯЗАТЕЛЬНОЕ требование твоего учебного заведения, что было бы еще бОльшим уродством), установить FreePascal и делать ДЕЛО, а не в бирюльки играть.

Я уважаю труды volvo (не забудь ему поставить +1), но промолчать не могу. Pascal ABC был задуман как простая альтернатива, но реализация всегда была goofy, а теперь они и вообще исказили основную идею языка.. norespect.gif

Скачай FPC с официального сайта http://freepascal.org/download.var , и будет тебе щастье..
klik1602
ещё раз, большое спасибо за помощь. smile.gif
P.S> FreePascal уже установила;))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.