Помощь - Поиск - Пользователи - Календарь
Полная версия: преоброзование массива
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
goatsee
как из 2х мерного массива, сделать 1мерный, если размеры совтадают??? жду ответа, буду сидеть до утра=(
volvo
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
что то не выходит, а другова способа нет?
volvo
Не знаю, что там у тебя не выходит... А насчет другого способа - если у тебя ЭТО не получилось, с чего ты взял, что ДРУГОЕ получится? Ну, попробуй так:

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
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
Цитата(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
просто он сортирует, но не выводит данные координат
я согласен, что тут лушнее, но по другому он не хочет
hiv
Цитата(goatsee @ 22.06.2007 9:39) *

просто он сортирует...
У нас здесь телепатов нет! Откуда я знал что здесь должна быть сортировка? Да даже если она и должна быть там, то все мои вопросы остаются в силе, т.к. запрограммировано неправильно! См. FAQ Методы сортировок
hiv
Цитата(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
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
Цитата(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
большое спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.