Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задача с матрицей на Turbo Pascal
Форум Точек.нет - общение без границ ! > Техномир > Программирование > Архив
Baxyz®
Дорогие посетители, помогите, пожалуйста, с задачей:

Дана матрица A(N,N) вещественных значений. Упорядочить по убыванию элементы каждой диагонали, параллельной побочной.
Ахинея
Цитата(Baxyz® @ 24.05.2010 - 23:49) *
Дана матрица A(N,N) вещественных значений. Упорядочить по убыванию элементы каждой диагонали, параллельной побочной.


А разве для большинства задач одновременное упорядочивание по обеим диагоналям не будет противоречеще? bm.gif
Fоxik
Цитата(Соловей @ 24.05.2010 - 23:08) *
А разве для большинства задач одновременное упорядочивание по обеим диагоналям не будет противоречеще? bm.gif

А может 2 упорядочивания по очереди?
Ахинея
Цитата(Foxik @ 25.05.2010 - 0:11) *
А может 2 упорядочивания по очереди?


хз. Автор, уточните, желательно на примере.
Ахинея
Короче объявляешь 2 типа - квадратную матрицу и вектор размерности этой квадратной матрицы. Засовываешь в вектор значения диагонали, сортируешь и обратно присваеваешь матрице уже отсортированные значения.

Если надо обе диагонали, то тупо делай последовательно сначало с одной действия, а потом с другой.

» Кликните сюда для просмотра оффтоп текста.. «
Baxyz®
Цитата(Соловей @ 24.05.2010 - 23:12) *
хз. Автор, уточните, желательно на примере.

Насколько я понял задание, то надо из матрицы
Код
2 1 7 3
4 3 2 8
5 6 7 1
9 7 5 3

надо сделать такую:
Код
2 4 7 3
1 5 2 8
3 6 7 5
9 7 1 3
Ахинея
Тогда как-то так(упорядочивание вектора любым способом):

Код
for i:=2 to n-1 do begin  {бежим со второй до предпоследней строчки так как первая диагональ будет из всего одного элемента, а последняя - сама побочная}
  for j:=1 to i do a[j]:=m[j,i-j+1]; {записываем выктор из элементов i-той диаганали}
   {упорядочивание вектора a из i элементов}
  for j:=1 to i do m[j,i-j+1]:=a[j]; {упорядоченную диагональ записываем обратно в матрицу}
end;


Если у нас матрица:

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

Мы замечаем, что диагональ, которая начинается со второй строки, состоит из 2х элементов, с 3ей строки - из 3х и т.д.

Это для того, что выше побочной диагонали, остальное делается также, индексы только по симметрии ищем.
Baxyz®
Ещё вопрос возник - при
Код
var
a:array[1..10,1..10] of real;
n,i,j:integer;

программа обижается и выдаёт ошибку несоответствия типов. Что в таком случае лучше изменить?
» Кликните сюда для просмотра оффтоп текста.. «
Ахинея
Во-первых, что такое
Цитата(Baxyz® @ 31.05.2010 - 20:09) *
a[j]:=a[j,i-j+1];


Почему у них одинаковые имена? a[j,i-j+1] - это твоя матрица array[1..10,1..10] of real; А вот это a[j] - длжно быть вектором, т.е. array[1..10] of real; И имена у них должны быть разные, это совершенно разные переменные.

Во-вторых, Baxyz®, вместо строчки
Цитата(Baxyz® @ 31.05.2010 - 20:09) *
{упорядочивание вектора a из i элементов}


надо написать упорядочивание. К примеру:
Код
for k:=1 to n-1 do begin
  imax:=k;
  for l:=k to n do
     if a[l]>a[imax] then imax:=i
  t:=a[k]; a[k]:=a[l]; a[l]:=t;
end;



Baxyz®
Соловей, а в случае моей программы какая запись упорядочивания вектора должна быть?
» Кликните сюда для просмотра оффтоп текста.. «
Ахинея
Цитата(Baxyz® @ 31.05.2010 - 23:31) *
Извините, что Вас нагружаю, просто я слаб в области турбо-паскаля :(


Бывает)

короче вот ваша прога, у меня нет компилятора паскаля, поэтому за орфографию не ручаюсь:

Код
var m:array [1..10,1..10] of real;
      v: array [1..10] of real;
      i,j,k,l,imax:byte;
      t:real;

begin
{здесь ввод матрицы}

  for i:=2 to 9 do begin
     for j:=1 to i do v[j]:=m[j,i-j+1];
     for k:=1 to i-1 do begin
         imax:=k;
         for l:=k to i do
             if v[l]>v[imax] then imax:=i;
         t:=v[k]; v[k]:=v[imax]; v[imax]:=t;
      end;
      for j:=1 to i do m[j.i-j+1]:=v[j];
  end;
{вывод наэкран}


Этот код упорядочит все что выше побочной диагонали. Нижняя часть делается так же, только индекс у матрицы m поменяется по симметрии.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2023 IPS, Inc.