Помощь - Поиск - Пользователи - Календарь
Полная версия: Матричная задачка на паскале.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Katenok8777
Задача такая: Дана матрица А (m.n). Надо из матрицы А сделать матрицу B так,чтобы все столбцы матрицы А были упорядочены по убыванию максимальных элементов.Заранее спасибо. Пршограмма на паскале должна быть.
volvo
Алгоритм такой:
1. Описываешь массив Max размером N (я правильно понимаю, что это - число столбцов? smile.gif )...
2. В каждый элемент этого массива заносишь максимум соответствующего столбца матрицы A...
3. Копируешь всю матрицу A в матрицу B...
4. Сортируешь матрицу В вместе с массивом Max любым алгоритмом сортировки (для примера - "пузырьком") примерно так, как это было сделано здесь: задачка на двумерный массив, только вместо
If mx[Pred(j)][k] > mx[j][k] Then Begin
  T := mx[Pred(j)]; mx[Pred(j)] := mx[j]; mx[j] := T
End;

делать так:
If max[Pred(j)] > max[j] Then Begin
  Tint := max[Pred(j)]; max[Pred(j)] := max[j]; max[j] := Tint {Tint: integer}
  T := B[Pred(j)]; B[Pred(j)] := B[j]; B[j] := T {T: TColumn}
End;
Guest
А ты не мог бы полностью написать прогу,дело в том что мне 28 числа все нужно сдавать,а у менЯ еще несколько прог,простых,которые я сейчас делаю
volvo
:no: Нет, полностью программы я НЕ пишу.

Я могу помочь решить задачу, но не решать ее ЗА КОГО-ТО...
Katenok8777
Uses Crt; {для того, чтобы вызывать ClrScr и др }

Const
M = 2; {кол-во строк}
N = 3; {кол-во столбцов}

Type
MyType = integer; {здесь можно менять тип элементов матрицы}
TMyMatrix = array[1..M, 1..N] of MyType ; {для передачи матриц параметром в функцию,
для меньшей писанины, в общем, для удобства}

Var
A, B: TMyMatrix; {исходная и результирующая матрицы}
used: array [1..N] of byte;{массив для отметки использованных столбцов при поискке максималньго элемента матрицы}
i, j: integer; {переменные для циклов}

procedure Proceed(SrcMtr: TMyMatrix; var DstMtr: TMyMatrix);
var
cc:integer; {счетчик для количества пройденных столбцов}
CurMax: mytype; {текущий максимальный элемент}
CurColumn:integer; {столбец максимального элемента}
begin
cc := 1;
for i := 1 To N do
used[i] := 0;

while (cc <= N) do
begin
{берем первый элемент в первом найденном неиспользованном столбце}
for i := 1 To N do
if (used[i] = 0) then
begin
CurMax := SrcMtr[1, i];
CurColumn := i;
break;
end;

{находим максимум и его столбец}
for i := 1 to M do
for j := 1 to N do
if used[j] = 0 then
if(SrcMtr[i, j] > CurMax) then
begin
CurMax := SrcMtr[i, j];
CurColumn := j;
end;

{заполняем столбец результирующей матрицы}
for i := 1 To M do
DstMtr[i, cc] := SrcMtr[i, CurColumn];
Inc(cc);{прибавляем счетчик использованных столбцов}
used[CurColumn] := 1; {отмечаем, что столбец использован}
end;
end;

{процедура для вывода матрицы на экран}
procedure WriteMatrix(Mtr: TMyMatrix);
var
i, j:integer;
begin
for i := 1 To M do
begin
for j := 1 To N do
begin
Write(Mtr[i, j]:5, ' ';
end;
WriteLn;
end
end;

Begin
ClrScr;
{вводим элементы матрицы - каждый вводим enter ом. Если поменяшь mytype на real, то десятые вводятся точкой}
for i := 1 To M do
for j := 1 To N do
begin
Write('Enter matrix element [', i,',',j, ']: ';
ReadLn(A[i, j]);
end;
{выведем исходнуюматрицу на экран}
WriteLn;
WriteLn('Source matrix:';
WriteMatrix(A);
{заполним результирующую по нашему алгоритму}
Proceed(A, B);
{выведем результирующую матрицу на экран}
WriteLn('Result matrix:';
WriteMatrix(B);
{ждем нажатия клавиши}
ReadKey;
End.
Что тут не так????
volvo
Цитата(Katenok8777 @ 27.07.05 13:22)
Что тут не так????

ВСЁ !!!
И потом, теги CОDE к Вам не относятся?

TMyMatrix = array[1..M, 1..N] of MyType;
{для передачи матриц параметром в функцию,
для меньшей писанины, в общем, для удобства}

ЭТО - не удобство !!! Удобно - это когда столбцы меняются одним оператором:
Const
  size_col = 6;  { число столбцов }
  size_row = 8; { число строк }
Type
  TColumn = Array[1 .. size_row] Of Integer;
  TMatrix = Array[1 .. size_col] Of TColumn;
...
Var
  mx: TMatrix;
  T: TColumn;
...
T := mx[1]; mx[1] := mx[2]; mx[2] := T;

А то, что выше - это, извините, извращение...
Katenok8777
Зачем мне использовать массив,если у меня дана матрица и с ней же должно быть проще?
Katenok8777
Пожалуйста напиши мне полностью программу в долгу не останусь,обещаю,мне очень срочно нужно. :molitva:
volvo
Const
  size_col = 6; { число столбцов }
  size_row = 8; { число строк }
Type
  TColumn = Array[1 .. size_row] Of Integer;
  TRow = Array[1 .. size_col] Of Integer;

  TMatrix = Array[1 .. size_col] Of TColumn;

Function GetMax(A: TMatrix; num_row: Integer): Integer;
Var max_value, i: Integer;
Begin
  max_value := A[num_row][1];
  For i := 2 To size_row Do
    If max_value < A[num_row][i] Then
      max_value := A[num_row][i];
  GetMax := max_value
End;

Procedure Bubble(Var mx: TMatrix; Var row: TRow);
Var
  i, j, Tint: Integer;
  T: TColumn;
Begin
  For i := 1 To size_col Do
    For j := size_col DownTo i+1 Do
      If row[Pred(j)] > row[j] Then Begin
        Tint := row[Pred(j)]; row[Pred(j)] := row[j]; row[j] := Tint;
        T := mx[Pred(j)]; mx[Pred(j)] := mx[j]; mx[j] := T;
      End
End;

Procedure ReadMatrix(Var mx: TMatrix);
Var i, j: Integer;
Begin
  For i := 1 To size_row Do Begin
    WriteLn('row #', i);
    For j := 1 To size_col Do Begin
      Write('matrix[', j,',',i, ']: '); ReadLn(mx[j][i]);
    End;
  End;
End;

Procedure WriteMatrix(Var mx: TMatrix);
Var i, j: Integer;
Begin
  For i := 1 To size_row Do Begin
    For j := 1 To size_col Do Begin
      Write(mx[j][i]:4);
    End;
    WriteLn
  End;
End;

Var
  max: TRow;
  A, B: TMatrix;
  i: integer;

begin
  ReadMatrix(A);

  B := A;
  For i := 1 To size_col Do
    max[i] := GetMax(A, i);
  Bubble(B, max);

  WriteMatrix(B);

end.

Больше полностью ничего не буду делать...
Все уже было написано во 2-ом посте, нужно было ТОЛЬКО собрать это в одну программу, неужели это НАСТОЛЬКО трудно?
Katenok8777
огромное тебе спасибо,как будем расчитываться?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.