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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2010, 18:40   #1
zevs116
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 21
По умолчанию Преобразования матрицы

Вот задачка:
"Допустимым преобразованием матрицы назовем перестановку двух соседних строк или столбцов. Пусть дана вещественная квадратная матрица порядка N. C помощью допустимых преобразований получите матрицу, в которой один из элементов с наибольшим значением располагается в левом верхнем углу. Преобразование строк и столбцов осуществить через процедуры."

Это как? хотябы принцип действия объясните пожалуйста. Не пойму, как запомнить номер максимального элемента и потом еще переставить его, ппц.
zevs116 вне форума Ответить с цитированием
Старый 18.10.2010, 18:46   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

язык?
если (остальное в подписи)
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 18.10.2010, 18:49   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Для статической матрицы:
1) сначала нужно определить порядок матрицы.
2) заполнить ее элементами - тут либо псевдослучайными числами, либо сделать ввод от пользователя.
3) найти максимальный элемент.
4) двигать строку с элементом вверх, меняясь местами с соседними верхними строками попорядку.
5) когда строка с этим максимальным элементом будет первой, двигать столбец с этим максимальным элементом влево, опят же меняясь местами со столбцами , котрые стоят левее.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 18.10.2010, 19:14   #4
zevs116
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 21
По умолчанию

Язык паскаль. 1.2.3. пункты я уж понял, вот 4 пункт немного непонятен, как переместить всю строку, зная только номер строки...
zevs116 вне форума Ответить с цитированием
Старый 18.10.2010, 19:17   #5
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

перебирать строку поэлементно от первого элемента до последнего, каждый элемент текущей строки менять местами с элементом верхней строки.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 18.10.2010, 19:30   #6
zevs116
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 21
По умолчанию

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

Код:
uses CRT;
Const
  NumRow = 5;
  NumCol = 5;
var
  i, j,n,k,l,max : integer;
  Mas : array[1..NumRow,1..NumCol] of integer;
  Mas2:array[1..20] of integer;
begin

  Randomize;
  {создание исходного массива}

  for i := 1 to NumRow do
    for j := 1 to NumCol do
      Mas[i, j] := Random(10);

  WriteLn('Исходная матрица:') ;
  for i := 1 to NumRow do begin
    for j := 1 to NumCol do
        Write(Mas[i, j]:2);
    WriteLn;
  end;
  WriteLn('------------------') ;


   {нахождение максимума}

  max:=Mas[1,1]; k:=i; l:=j;
  for i:=1 to NumRow do
   for j:=1 to NumCol do
    if Mas[i,j]>max then
     begin
     max:=Mas[i,j];
     k:=i;
     l:=j;
     end;
     writeln('max=',max, k,l);
   For i:=1 to NumRow do
   {преобразование матрицы,==============КАК быть здесь=============}

  WriteLn('Матрица после сортировки:') ;
  for i := 1 to NumRow do begin
    for j := 1 to NumCol do
        Write(Mas[i, j]:2);
    WriteLn;
  end;

  readln;

end.

Последний раз редактировалось zevs116; 18.10.2010 в 19:39.
zevs116 вне форума Ответить с цитированием
Старый 18.10.2010, 20:19   #7
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

нну хорошо, вот тебе пример, тут осталось дописать только процедуру для перестановки столбцов. Для строк я уже написал:
Код:
program mymatrix;
uses Crt;
const
  N = 5; //порядок матрицы
var
  MyArr: array [1..N, 1..N] of Real; //объявляем наш массив
  Maxi, Maxj : Integer;

//процедура ввода матрицы
procedure EnterMatrix;
var
  i, j: Integer;
begin
  for i := 1 to N do
    for j := 1 to N do
      MyArr[i, j] := Random(100) / 10;
end;

//процедура вывода матрицы
procedure PrintMatrix;
var
  i, j: Integer;
begin
  for i := 1 to N do begin
    for j := 1 to N do
      Write(MyArr[i, j]:2:2, '  ');
    WriteLn;
  end;
end;

//поиск максимального элемента
procedure FindMax;
var
  i, j: Integer;
begin
  Maxi := 1;
  Maxj := 1;
  for i := 1 to N do
    for j := 1 to N do
      if MyArr[i, j] > MyArr[Maxi, Maxj] then begin
        Maxi := i;
        Maxj := j;
      end;
end;

//процедура для обмена строк
procedure SwapRows;
var
  j: Integer;
  temp :Real;
begin
  while Maxi > 1 do begin
    for j := 1 to N do begin
      temp := MyArr[Maxi - 1, j];
      MyArr[Maxi - 1, j] := MyArr[Maxi, j];
      MyArr[Maxi, j] := temp;
    end;
    Dec(Maxi);
  end;
end;


begin
  ClrScr;
  Randomize;
  EnterMatrix;
  PrintMatrix;
  FindMax;
  WriteLn;
  WriteLn('Строка максимального ', Maxi, '   ', ' столбец максимального ', Maxj);
  SwapRows;
  WriteLn('Матрица после допустимых преобразований: ');
  PrintMatrix;
  ReadLn;
end.
P.S:
1)зачем тебе NumRow и NumCol - ведь матрица квадратная. Сказано - порядок матрицы, а это одно число только.
2)зачем же второй массив?
3)матрица вещественная, а ты объявляешь как of integer.
4)Проверяй код мой. И напиши самостоятельно процедуру для перестановки двух соседних столбцов.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 18.10.2010 в 20:27.
Roof вне форума Ответить с цитированием
Старый 18.10.2010, 20:40   #8
zevs116
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 21
По умолчанию

блин,у меня проснулся спортивный интерес, почему моя только один раз строку переставляет, а не до получения результата?
Код:
uses CRT;
Const
  NumRow = 5;
  NumCol = 5;
var
  i, j,n,k,l,max : integer;
  Mas : array[1..NumRow,1..NumCol] of integer;
  Mas2:array[1..20] of integer;
begin

  Randomize;
  {создание исходного массива}

  for i := 1 to NumRow do
    for j := 1 to NumCol do
      Mas[i, j] := Random(10);

  WriteLn('Исходная матрица:') ;
  for i := 1 to NumRow do begin
    for j := 1 to NumCol do
        Write(Mas[i, j]:2);
    WriteLn;
  end;
  WriteLn('------------------') ;


   {сортировка массива по неубыванию их первых элементов}

  max:=Mas[1,1]; k:=i; l:=j;
  for i:=1 to NumRow do
   for j:=1 to NumCol do
    if Mas[i,j]>max then
     begin
     max:=Mas[i,j];
     k:=i;
     l:=j;
     end;
     writeln('max=',max, k,l);
     
 For i:=1 to k do begin
   For i:=1 to NumRow do
   begin
     Mas2[i] := Mas[k-1,i];
     Mas[k-1,i] := Mas[k,i];
     Mas[k,i] := Mas2[i];
  end;
  
  for i := 1 to NumRow do
        Writeln(Mas2[i]:2);

 end;



   {==============КАК быть здесь=============}

  WriteLn('Матрица после сортировки:') ;
  for i := 1 to NumRow do begin
    for j := 1 to NumCol do
        Write(Mas[i, j]:2);
    WriteLn;
  end;

  readln;

end.
PS второй массив - для перестановки строк методом пузырьков,
матрица квадратная - да забыл))

Последний раз редактировалось zevs116; 18.10.2010 в 20:43.
zevs116 вне форума Ответить с цитированием
Старый 18.10.2010, 20:50   #9
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Цитата:
PS второй массив - для перестановки строк методом пузырьков,
- совсем не понял тебя, ты что-то явно напутал.
Проанализируй мой код внимательно - все встанет на свои места.

P.S:
1)сортировка тут, на мой взгляд, не совсем уместное понятие. Для запоминания элемента используется переменная temp. Анализируй мою процедуру перестановки строк.
2)что такое Maxi и Maxj - это понятно?
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 18.10.2010 в 20:55.
Roof вне форума Ответить с цитированием
Старый 18.10.2010, 21:00   #10
zevs116
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 21
По умолчанию

да, Maxi и maxj это номера строки и столбца максимального элемента.

Да, у Вас это перестановка очень легко делается, а я делал типо сначала всю строку запоминаем в отдельный массив-строку, потом заменяем всю строку и тд и тп...
вот код, работает:


Код:
program mymatrix;
uses Crt;
const
  N = 5; //порядок матрицы
var
  MyArr: array [1..N, 1..N] of Real; //объявляем наш массив
  Maxi, Maxj : Integer;

//процедура ввода матрицы
procedure EnterMatrix;
var
  i, j: Integer;
begin
  for i := 1 to N do
    for j := 1 to N do
      MyArr[i, j] := Random(100) / 10;
end;

//процедура вывода матрицы
procedure PrintMatrix;
var
  i, j: Integer;
begin
  for i := 1 to N do begin
    for j := 1 to N do
      Write(MyArr[i, j]:2:2, '  ');
    WriteLn;
  end;
end;

//поиск максимального элемента
procedure FindMax;
var
  i, j: Integer;
begin
  Maxi := 1;
  Maxj := 1;
  for i := 1 to N do
    for j := 1 to N do
      if MyArr[i, j] > MyArr[Maxi, Maxj] then begin
        Maxi := i;
        Maxj := j;
      end;
end;

//процедура для обмена строк
procedure SwapRows;
var
  j: Integer;
  temp :Real;
begin
  while Maxi > 1 do begin
    for j := 1 to N do begin
      temp := MyArr[Maxi - 1, j];
      MyArr[Maxi - 1, j] := MyArr[Maxi, j];
      MyArr[Maxi, j] := temp;
    end;
    Dec(Maxi);
  end;
end;

//процедура для обмена столбцов
procedure SwapCols;
var
  j: Integer;
  temp :Real;
begin
  while Maxj > 1 do begin
    for j := 1 to N do begin
      temp := MyArr[j,Maxj - 1];
      MyArr[j,Maxj -1] := MyArr[j,Maxj];
      MyArr[j,Maxj] := temp;
    end;
    Dec(Maxj);
  end;
end;


begin
  ClrScr;
  Randomize;
  EnterMatrix;
  PrintMatrix;
  FindMax;
  WriteLn;
  WriteLn('Строка максимального ', Maxi, '   ', ' столбец максимального ', Maxj, 'сам максимальный', MyArr[Maxi, Maxj]);
  SwapRows;
  SwapCols;
  WriteLn('Матрица после допустимых преобразований: ');
  PrintMatrix;
  ReadLn;
  end.
zevs116 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразования изображения!!!=)) KoSSteN Помощь студентам 0 29.03.2010 23:28
явные преобразования breate Общие вопросы C/C++ 2 17.12.2009 00:45
Аффинные преобразования meradone Общие вопросы Delphi 0 22.11.2009 15:00