Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрицы на паскале
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Валерия
В каждом столбце матрицы упорядочить по возрастанию все элементы,расположенные между минимальным и максимальным элементами этого столбца.

решите кто может... sad.gif
volvo

const
  nRow = 5;
  nCol = 4;

var
  a: array[1 .. nRow, 1 .. nCol] of integer;
  i, j, k, T: integer;
  min_ix, max_ix: integer;

begin
  for i := 1 to nRow do
    begin
      writeln('вводим ряд #', i);
      for j := 1 to nCol do
        begin
          write('a[', i, ', ', j, '] = ');
          readln(a[i, j]);
        end;
    end;

  for i := 1 to nCol do
    begin
      min_ix := 1; max_ix := 1;
      for j := 1 to nRow do
        begin
          if a[j, i] < a[min_ix, i] then min_ix := j;
          if a[j, i] > a[max_ix, i] then max_ix := j;
        end;
      if min_ix > max_ix then
        begin
          T := min_ix; min_ix := max_ix; max_ix := T
        end;

      for j := min_ix to max_ix do
        for k := j to max_ix do
          if a[j, i] > a[k, i] then
            begin
              T := a[j, i]; a[j, i] := a[k, i]; a[k, i] := T
            end;
    end;

  for i := 1 to nRow do
    begin
      for j := 1 to nCol do
        write(a[i, j]:4);
      writeln
    end;
  writeln('press enter');
  readln

end.


:p2:
Altair
Const
 n=10;
 m=10;
Type
 atype=array[1..n,1..m] of integer;

var
 a:atype;
 i,j:integer;
 min,min0,max,max0:integer;
 si,sj:integer;
 ssi,ssj:integer;
 k,l:integer;
begin
 for i:=1 to n do for j:=1 to m do read(a[i,j]); {ввод}
 For j:=1 to m do
 begin
  Min0:=MaxInt;
  For i:=1 to n do If a[i,j]<min0 then begin min0:=a[i,j]; si:=i; end;
  {Это был поиск минимального}
  Max0:=-maxint;
  For i:=1 to n do If a[i,j]>max0 then begin max0:=a[i,j]; ssi:=i; end;
  {это был поиск минимума}
  {тперь сортируем}
  If ssi>si then
  begin
   for i:=ssi downto si do for k:=si to i-1 do
   begin
    If a[k,j]>a[k+1,j] then begin l:=a[k,j]; a[k,l]:=a[k+1,l]; a[k+1,l]:=l; end;
   end;
  end;
 end;
 {все, остортировали, осталось только вывести}

end.

Я мог допустить ошибку, только если уже хочу спать ...
и вообще, Валерия, пожулуйста, не грустите, не добавляйте сегодня еще грусти в этот день... sad.gif sad.gif
Любая задача алгоритмически разрешима.
Если я и ошибся где-то (не проверял на компиляторе), то все легко исправимо..
алгоритм верный...
Думаю вы поймете как я решал... вам ее толькоосталось подправить ...
только прошу, не надо грустить sad.gif
volvo
Oleg_Z
:P Опоздал...
Altair
Не может быть! :o
По дате 4 минуты мое позднее, но я когда отправил, то мое сообщение было вторым после сообщения Валерии! :o

4 минуты мессага твоя что-ли добиралась до сервака? huh.gif blink.gif

Ладно, главное, что Валерия получила решение! :yes: smile.gif
Валерия
о! мальчики спасибо :p2:

если будет еще что поможите? rolleyes.gif
Валерия
а, у меня вопрос!!

number = 10 это для чего? smile.gif
volvo
Валерия
Не обращайте внимания - это я вовремя не удалил... Эта строка не нужна...
Валерия
а еще вопрос smile.gif

почему когда он определив мак и мин элементы столбца меняет их, если сначала в столбце стоит максимальный элемент и потом минимальный, можно ли сделать так что бы он не трогая мин и мак элементы делал сортировку между ними? smile.gif

поняли вопрос? smile.gif
volvo
Валерия
Вопрос ясен... Дело в том, что в Паскале (в отличие от других языков программирования) чтобы организовать цикл от 3 до 6 (т.е. от меньшего к большему), пользуются таким циклом: for i := 3 to 6 do ...

А от большего к меньшему - вот таким for i := 6 downto 3 do ...

Чтобы избежать использования 2-х разных циклов я и меняю местами индекс min и max элементов (не путайте, это не мин. и макс. элементы, это всего лишь их индексы, т.е. места, на которых они находятся в массиве) так, чтобы индекс минимального хранился в переменной min_ix ... Это позволяет мне обойтись одним циклом в любом случае :yes:
Валерия
хорошо smile.gif а можно их как нить зафиксировать? допустим есть место минимального и максимального! в програме он их меняет местами! т.е сортирует тоже! а мне надо чтобы они не двигались smile.gif

такое возможно?
volvo
Вместо

      for j := min_ix to max_ix do
       for k := j to max_ix do
         if a[j, i] > a[k, i] then
           begin
             T := a[j, i]; a[j, i] := a[k, i]; a[k, i] := T
           end;

можно поставить:

      for j := min_ix+1 to max_ix-1 do
       for k := j to max_ix-1 do
         if a[j, i] > a[k, i] then
           begin
             T := a[j, i]; a[j, i] := a[k, i]; a[k, i] := T
           end;



По-моему, так...
Валерия
во smile.gif вот ет работает, то что нужно, сенк!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.