Задача такая: Дана матрица А (m.n). Надо из матрицы А сделать матрицу B так,чтобы все столбцы матрицы А были упорядочены по убыванию максимальных элементов.Заранее спасибо. Пршограмма на паскале должна быть.
volvo
26.07.2005 19:37
Алгоритм такой: 1. Описываешь массив Max размером N (я правильно понимаю, что это - число столбцов? )... 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
26.07.2005 20:00
А ты не мог бы полностью написать прогу,дело в том что мне 28 числа все нужно сдавать,а у менЯ еще несколько прог,простых,которые я сейчас делаю
volvo
26.07.2005 20:11
:no: Нет, полностью программы я НЕ пишу.
Я могу помочь решить задачу, но не решать ее ЗА КОГО-ТО...
Katenok8777
27.07.2005 13: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 13: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 14:12
Зачем мне использовать массив,если у меня дана матрица и с ней же должно быть проще?
Katenok8777
27.07.2005 14:35
Пожалуйста напиши мне полностью программу в долгу не останусь,обещаю,мне очень срочно нужно. :molitva:
volvo
27.07.2005 14: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 := 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
27.07.2005 14:53
огромное тебе спасибо,как будем расчитываться?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.