Задача такая: Дана матрица А (m.n). Надо из матрицы А сделать матрицу B так,чтобы все столбцы матрицы А были упорядочены по убыванию максимальных элементов.Заранее спасибо. Пршограмма на паскале должна быть.
volvo
26.07.2005 23:37
Алгоритм такой: 1. Описываешь массив Max размером N (я правильно понимаю, что это - число столбцов? )... 2. В каждый элемент этого массива заносишь максимум соответствующего столбца матрицы A... 3. Копируешь всю матрицу A в матрицу B... 4. Сортируешь матрицу В вместе с массивом Max любым алгоритмом сортировки (для примера - "пузырьком") примерно так, как это было сделано здесь: задачка на двумерный массив, только вместо
If mx[Pred(j)][k] > mx[j][k] ThenBegin
T := mx[Pred(j)]; mx[Pred(j)] := mx[j]; mx[j] := T
End;
делать так:
If max[Pred(j)] > max[j] ThenBegin
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
27.07.2005 0:00
А ты не мог бы полностью написать прогу,дело в том что мне 28 числа все нужно сдавать,а у менЯ еще несколько прог,простых,которые я сейчас делаю
volvo
27.07.2005 0:11
:no: Нет, полностью программы я НЕ пишу.
Я могу помочь решить задачу, но не решать ее ЗА КОГО-ТО...
Katenok8777
27.07.2005 17:22
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
27.07.2005 17:28
Цитата(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
27.07.2005 18:12
Зачем мне использовать массив,если у меня дана матрица и с ней же должно быть проще?
Katenok8777
27.07.2005 18:35
Пожалуйста напиши мне полностью программу в долгу не останусь,обещаю,мне очень срочно нужно. :molitva:
volvo
27.07.2005 18:50
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 := 2To size_row DoIf 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;
BeginFor i := 1To size_col DoFor j := size_col DownTo i+1DoIf row[Pred(j)] > row[j] ThenBegin
Tint := row[Pred(j)]; row[Pred(j)] := row[j]; row[j] := Tint;
T := mx[Pred(j)]; mx[Pred(j)] := mx[j]; mx[j] := T;
EndEnd;
Procedure ReadMatrix(Var mx: TMatrix);
Var i, j: Integer;
BeginFor i := 1To size_row DoBegin
WriteLn('row #', i);
For j := 1To size_col DoBegin
Write('matrix[', j,',',i, ']: '); ReadLn(mx[j][i]);
End;
End;
End;
Procedure WriteMatrix(Var mx: TMatrix);
Var i, j: Integer;
BeginFor i := 1To size_row DoBeginFor j := 1To size_col DoBegin
Write(mx[j][i]:4);
End;
WriteLn
End;
End;
Var
max: TRow;
A, B: TMatrix;
i: integer;
begin
ReadMatrix(A);
B := A;
For i := 1To size_col Do
max[i] := GetMax(A, i);
Bubble(B, max);
WriteMatrix(B);
end.
Больше полностью ничего не буду делать... Все уже было написано во 2-ом посте, нужно было ТОЛЬКО собрать это в одну программу, неужели это НАСТОЛЬКО трудно?
Katenok8777
27.07.2005 18:53
огромное тебе спасибо,как будем расчитываться?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.