Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 20:22   #1
backspace567
 
Регистрация: 17.10.2012
Сообщений: 8
По умолчанию Дано 2-х мерный массив отсортировать содержимое в порядке возрастания.

Дано 2-х мерный массив отсортировать содержимое в порядке возрастания.

мой код
что я не правильно написал исправьте плз

program yporyadochivanie_2d_massiva;

var mas: array [1..10,1..10] of integer;
a,b: byte;
buf,e,f: integer;
begin
writeln('Исходный массив');
for a:=1 to 3 do
begin
for b:=1 to 3 do
begin
mas[a,b]:=random(9);
write(mas[a,b]:4);
end;
writeln;
end;
e:=0;
while e<=3 do
begin
for a:=1 to 3 do
if (mas[a]>mas[a+1]) then
begin
buf:=mas[a];
mas[a]:=mas[a+1];
mas[a+1]:=buf;
end;
inc(e);
end;
f:=0;
while f<=3 do
begin
for b:=1 to 3-1 do
if (mas[b]>mas[b+1]) then
begin
buf:=mas[b];
mas[b]:=mas[b+1];
mas[b+1]:=buf;
end;
inc(f);
end;
writeln('Итоговый массив');
for a:=1 to 3 do
begin
for b:=1 to 3 do
begin
write(mas[a,b]:4);
end;
writeln;
end;
readln;
end.
backspace567 вне форума Ответить с цитированием
Старый 17.10.2012, 20:36   #2
JIeIIIa
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 54
По умолчанию

Начиная с
Код:
f (mas[a]>mas[a+1]) then
 begin
 buf:=mas[a];
массив стал одномерным.

А вот тут опять двумерный
Код:
writeln('Итоговый массив');
 for a:=1 to 3 do
 begin
    for b:=1 to 3 do
    begin
       write(mas[a,b]:4);
    end;
    writeln;
 end;
JIeIIIa вне форума Ответить с цитированием
Старый 17.10.2012, 20:42   #3
backspace567
 
Регистрация: 17.10.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от JIeIIIa Посмотреть сообщение
Начиная с
Код:
f (mas[a]>mas[a+1]) then
 begin
 buf:=mas[a];
массив стал одномерным.

А вот тут опять двумерный
Код:
writeln('Итоговый массив');
 for a:=1 to 3 do
 begin
    for b:=1 to 3 do
    begin
       write(mas[a,b]:4);
    end;
    writeln;
 end;
я только начал учить массивы исправьте мне пожалуйста код, буду очень и очень благодарен ...

Последний раз редактировалось backspace567; 17.10.2012 в 21:04.
backspace567 вне форума Ответить с цитированием
Старый 17.10.2012, 21:58   #4
JIeIIIa
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 54
По умолчанию

Код:
mas: array [1..10,1..10] of integer;
Это массив 10 на 10. А заполняете for'ом Вы только его часть 3 на 3 - это так задуманно?

Что значит отсортировать двумерный массив в порядке возростания? Каждую строку отсортировать по возростанию или как?
JIeIIIa вне форума Ответить с цитированием
Старый 17.10.2012, 22:31   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
const
  ssize = 10;
  csize = 10;
  s = 3;
  c = 4;

var
  mas: array [1..ssize, 1..csize] of integer;
  i, j: integer;
  tmp, i1, j1, i2, j2: integer;

begin
  writeln('Исходный массив');
  for i := 1 to s do
  begin
    for j := 1 to c do
    begin
      mas[i, j] := random(11) - 5;
      write(mas[i, j]:4);
    end;
    writeln;
  end;
  for i := 1 to s * c - 1 do
    for j := i + 1 to s * c do
    begin
      i1 := 1 + i div c - 1 div (1 + i mod c);
      j1 := i - (i1 - 1) * c;
      i2 := 1 +  j div c - 1 div (1 + j mod c);
      j2 := j - (i2 - 1) * c;
      if mas[i1, j1] > mas[i2, j2] then
      begin
        tmp := mas[i1, j1];
        mas[i1, j1] := mas[i2, j2];
        mas[i2, j2] := tmp;
      end;
    end;
  writeln('Итоговый массив');
  for i := 1 to s do
  begin
    for j := 1 to c do
      write(mas[i, j]:4);
    writeln;
  end;
  readln;
end.
Вот такой вариант сортировки.
Считается, что элементы расположены так:
Цитата:
1 2 3 4
5 6 7 8
9 10 11 12
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.10.2012, 00:32   #6
backspace567
 
Регистрация: 17.10.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
const
  ssize = 10;
  csize = 10;
  s = 3;
  c = 4;

var
  mas: array [1..ssize, 1..csize] of integer;
  i, j: integer;
  tmp, i1, j1, i2, j2: integer;

begin
  writeln('Исходный массив');
  for i := 1 to s do
  begin
    for j := 1 to c do
    begin
      mas[i, j] := random(11) - 5;
      write(mas[i, j]:4);
    end;
    writeln;
  end;
  for i := 1 to s * c - 1 do
    for j := i + 1 to s * c do
    begin
      i1 := 1 + i div c - 1 div (1 + i mod c);
      j1 := i - (i1 - 1) * c;
      i2 := 1 +  j div c - 1 div (1 + j mod c);
      j2 := j - (i2 - 1) * c;
      if mas[i1, j1] > mas[i2, j2] then
      begin
        tmp := mas[i1, j1];
        mas[i1, j1] := mas[i2, j2];
        mas[i2, j2] := tmp;
      end;
    end;
  writeln('Итоговый массив');
  for i := 1 to s do
  begin
    for j := 1 to c do
      write(mas[i, j]:4);
    writeln;
  end;
  readln;
end.
Вот такой вариант сортировки.
Считается, что элементы расположены так:
Благодарю всех за оперативную помощь. Очень полезный форум с отзывчивыми людьми.
backspace567 вне форума Ответить с цитированием
Старый 18.10.2012, 01:09   #7
backspace567
 
Регистрация: 17.10.2012
Сообщений: 8
По умолчанию

помогите разобраться с этим участком кода :
Снимок222.PNG

Опишите пожалуйста словами, что происходит в этом кусочке кода. Зачем стоит s * c - 1, а не просто 12 так как константы с=4 s=3 и почему во второй строчке (for j := i + 1 to s * c do) нет -1 и зачем в этих строчках i1 := 1 + i div c - 1 div (1 + i mod c) div и mod ?
backspace567 вне форума Ответить с цитированием
Старый 18.10.2012, 01:27   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

По порядку.
Чуть упростил формулы:
Код:
for i := 1 to s * c - 1 do
    for j := i + 1 to s * c do
    begin
      i1 := (i - 1) div c + 1;
      j1 := i - (i1 - 1) * c;
      i2 := (j - 1) div c + 1;
      j2 := j - (i2 - 1) * c;
      if mas[i1, j1] > mas[i2, j2] then
      begin
        tmp := mas[i1, j1];
        mas[i1, j1] := mas[i2, j2];
        mas[i2, j2] := tmp;
      end;
    end;
Стоит s * c, чтобы код можно было легко изменить (изменив константы).
Далее, почему есть и нет -1.
Перебор идет всех элементов таким образом:
1-й со всеми последующими
2-й со всеми последующими
i-й со всеми последующими (от i+1 до n)
(n-1)-й с n-ым
Если -1 не будет, то возникнет сравнение n-го элемента, не пойми с каким.
Теперь к вопросу о div и mod.
Поскольку в исправленном варианте нету mod, то не буду его обсуждать.
Вот у нас есть числа: 1 2 3 4 5 6 7 8 - номера элементов по порядку.
Нужно сделать пересчет в 2 измерения (распределить элементы по строкам), т.е.
1 2 3 4
5 6 7 8
Для упрощения формул вычтем из номера элемента единицу и получим:
0 1 2 3 4 5 6 7
Теперь берем остаток от деления на 4 (именно столько элементов в строке) для каждого элемента:
0 1 2 3 4 5 6 7
0 0 0 0 1 1 1 1
Т.е. у первых 4 элементов остаток 0, у вторых - 1.
Теперь просто прибавляем единицу, чтобы вернуться в привычный отсчет от 1 до k.
Нашли строку в массиве, где расположен рассматриваемый элемент.
Осталось понять, какой это элемент по счету в строке.
Для этого отнимаем от номера элемента столько раз число элементов в строке, сколько строк находится перед найденной строкой.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.10.2012 в 01:30.
BDA на форуме Ответить с цитированием
Старый 18.10.2012, 10:58   #9
backspace567
 
Регистрация: 17.10.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
По порядку.
Чуть упростил формулы:
....
благодарю за разъяснение !
BDA вы учитесь еще или уже работаете ?



_____
1. Излишнее цитирование (overquoting) запрещены правилами форума

2. Личные вопросы лучше задавать в личку...

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

Модератор

Последний раз редактировалось Serge_Bliznykov; 18.10.2012 в 11:13.
backspace567 вне форума Ответить с цитированием
Старый 18.10.2012, 11:15   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Пожалуйста.
На будущее - не нужно цитировать сообщение полностью, а то можно получить «горчичник» (предупреждение).
Еще учусь

Update Чтобы не плодить сообщения и т.к. у Вас пока не работает "личка"
Цитата:
а где если не секрет ?
Ответ (белый цвет): МГУ ВМК
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.10.2012 в 15:03.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двумерный массив malaia Общие вопросы C/C++ 1 11.04.2012 20:03
с++ двумерный массив killeraleksana Помощь студентам 0 08.01.2012 18:37
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Двумерный массив jUvkeE Помощь студентам 2 03.02.2011 22:08
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40