Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ преоброзование массива

Автор: goatsee 22.06.2007 4:16

как из 2х мерного массива, сделать 1мерный, если размеры совтадают??? жду ответа, буду сидеть до утра=(

Автор: volvo 22.06.2007 4:45

TypeCast-ом...

type
arr_2d = array[1 .. 10, 1 .. 10] of integer;
arr_1d = array[1 .. 100] of integer;

var
mx: arr_2d;
...
arr_1d(mx)[1] := 10;
...

Идея понятна? При записи arr_1d(mx) матрица рассматривается как одномерный массив...

Автор: goatsee 22.06.2007 5:53

что то не выходит, а другова способа нет?

Автор: volvo 22.06.2007 5:57

Не знаю, что там у тебя не выходит... А насчет другого способа - если у тебя ЭТО не получилось, с чего ты взял, что ДРУГОЕ получится? Ну, попробуй так:

type
arr_2d = array[1 .. 10, 1 .. 10] of integer;
arr_1d = array[1 .. 100] of integer;

var
mx: arr_2d;
arr: arr_1d absolute mx; { <--- физически накладываешь массив на матрицу }

Все, дальше можно работать с массивом arr, ибо как массив так и матрица находятся в одном и том же месте в памяти...

Автор: goatsee 22.06.2007 11:01

volvo супер 2рой вариант сработал=)
один вопрос остался

Код

program practuka;
uses crt;
type
  arr_2d=  array[1 .. 2, 1 .. 2] of integer;
  arr_1d=  array[1 .. 4] of integer;
var  f: text; x,i,j:integer;
mx: arr_2d;
arr: arr_1d absolute mx;
begin
assign(f, 'matr.txt');
rewrite(f);
clrscr;
begin
for i:=1 to 4 do
begin
write('3HA4EHUE',i,':');
read(arr[i]);
writeln;
end;
end;
for j := 1 to 4 do
for i := 1 to 4 do
if arr[i]<arr[i+1] then
begin
x:=arr[i];
arr[i]:=arr[i+1];
arr[i+1]:=x;
end;
writeln;
for i:=1 to 4 do
writeln(f,'(',arr[i],')','(',i,',',j,')'); {в файле выводятся координаты}
close(f);
end.

проблема в том, что координаты с 1мевого массива, как переделать что б в файле записывались координаты 2мерного массива
пример:
1 2
3 5
выводит:
(5)(1,4)
(3)(2,4)
(2)(3,4)
(1)(4,4)
а надо
(5)(2,2)
(3)(2,1)
(2)(1,2)
(1)(1,1)


Автор: hiv 22.06.2007 12:07

Цитата(goatsee @ 22.06.2007 8:01) *

один вопрос остался
проблема в том, что координаты с 1мевого массива, как переделать что б в файле записывались координаты 2мерного массива

Подумай хорошенько над этим!
Код

...
for j := 1 to 4 do {зачем тебе этот цикл, ведь j потом нигде не используется}
for i := 1 to 4 do
if arr[i]<arr[i+1] then {при i=4, чему будет равен arr[i+1]}
begin
x:=arr[i];
arr[i]:=arr[i+1]; {аналогично предыдущему}
arr[i+1]:=x;       {аналогично предыдущему}
end;
...


Автор: goatsee 22.06.2007 12:39

просто он сортирует, но не выводит данные координат
я согласен, что тут лушнее, но по другому он не хочет

Автор: hiv 22.06.2007 12:57

Цитата(goatsee @ 22.06.2007 9:39) *

просто он сортирует...
У нас здесь телепатов нет! Откуда я знал что здесь должна быть сортировка? Да даже если она и должна быть там, то все мои вопросы остаются в силе, т.к. запрограммировано неправильно! См. http://forum.pascal.net.ru/index.php?showtopic=3065&hl=%F1%EE%F0%F2%E8%F0%EE%E2%EA%E0+%EC%E0%F2%F0%E8%F6%FB

Автор: hiv 22.06.2007 13:44

Цитата(goatsee @ 22.06.2007 9:39) *
... , но по другому он не хочет
Захочет, если репу почесать...
program practuka;
uses crt;
type
arr_2d= array[1 .. 2, 1 .. 2] of integer;
arr_1d= array[1 .. 4] of integer;
var f: text;
x,i,k,j:integer;
mx: arr_2d;
arr: arr_1d absolute mx;
sort: boolean;
begin
assign(f, 'matr.txt');
rewrite(f);
clrscr;
for i:=1 to 4 do
begin
write('3HA4EHUE',i,':');
read(arr[i]);
writeln;
end;

repeat
sort:=true;
for i := 1 to 3 do
if arr[i]<arr[i+1] then
begin
x:=arr[i];
arr[i]:=arr[i+1];
arr[i+1]:=x;
sort:=false;
end;
until sort;
writeln;

for i:=1 to 4 do
begin
k := (i-1) div 2 + 1;
j := i-(k-1)*2;
writeln(f,'(',arr[i],')','(',k,',',j,')'); {в файле выводятся координаты}
end;
close(f);
end.



Автор: volvo 22.06.2007 15:37

hiv, не совсем... Надо вводить индексный массив, чтобы распечатать изначальные позиции чисел:

program practuka;
uses crt;
type
arr_2d= array[1 .. 2, 1 .. 2] of integer;
arr_1d= array[1 .. 4] of integer;
var f: text;
x,i,k,j:integer;
mx: arr_2d;
arr: arr_1d absolute mx;
indexes: arr_1d;
sort: boolean;
begin
assign(f, 'matr.txt');
rewrite(f);
clrscr;
for i:=1 to 4 do
begin
write('3HA4EHUE',i,':');
read(arr[i]);
writeln;
indexes[i] := i;
end;

repeat
sort:=true;
for i := 1 to 3 do
if arr[i]<arr[i+1] then
begin
x:=arr[i];
arr[i]:=arr[i+1];
arr[i+1]:=x;

x := indexes[i];
indexes[i] := indexes[i+1];
indexes[i+1] := x;

sort:=false;
end;
until sort;
writeln;

for i:=1 to 4 do
begin
k := (indexes[i]-1) div 2 + 1;
j := indexes[i]-(k-1)*2;
writeln(f,'(',arr[i],')','(',k,',',j,')');
end;
close(f);
end.



У тебя печатается нечто другое... yes2.gif

Автор: hiv 22.06.2007 15:47

Цитата(volvo @ 22.06.2007 12:37) *

hiv, не совсем... Надо вводить индексный массив...
Понял - введем!

Вот:
program practuka;
uses crt;
type
arr_2d= array[1 .. 2, 1 .. 2] of integer;
arr_1d= array[1 .. 4] of integer;
var f: text;
x,i,k,j:integer;
mx: arr_2d;
arr: arr_1d absolute mx;
index: arr_1d;
sort: boolean;
begin
assign(f, 'matr.txt');
rewrite(f);
clrscr;
for i:=1 to 4 do
begin
write('3HA4EHUE',i,':');
read(arr[i]);
writeln;
index[i]:=i; {инициализируем индексы}
end;

repeat
sort:=true;
for i := 1 to 3 do
if arr[i]<arr[i+1] then
begin
x:=arr[i];
arr[i]:=arr[i+1];
arr[i+1]:=x;
sort:=false;
x:=index[i]; {также меняем местами и индексы}
index[i]:=index[i+1];
index[i+1]:=x;
end;
until sort;
writeln;

for i:=1 to 4 do
begin
k := (index[i]-1) div 2 + 1; {вместо i используем индексный массив}
j := index[i]-(k-1)*2;
writeln(f,'(',arr[i],')','(',k,',',j,')'); {в файле выводятся координаты}
end;
close(f);
end.

На выходе:
Код
(5)(2,2)
(3)(2,1)
(2)(1,2)
(1)(1,1)

Автор: goatsee 22.06.2007 18:43

большое спасибо