Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрицы на паскале
Форум «Всё о Паскале» > 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 вот ет работает, то что нужно, сенк!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.