Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 22.11.2017
Сообщений: 10

Дана вещественная матрица. Упорядочить ее строки по неубыванию их наибольших элементов

25.02.2018, 18:12. Показов 3504. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста решить эту задачу в 4 разных условиях.

Дана вещественная матрица. Упорядочить ее строки по неубыванию их наибольших элементов.

Матрицы следует разместить в "куче" при выполнении следующих условий:

а) число строк и число столбцов - константы;
б) число строк - константа, а число столбцов - исходное данное;
в) число строк - исходное данное, число столбцов - константа;
г) число строк и число столбцов - исходные данные.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2018, 18:12
Ответы с готовыми решениями:

Дана вещественная матрица размером n x m . Упорядочить ее строки по неубыванию суммы их элементов
Ребят помогите, кто сможет, срочно надо;) Дана вещественная матрица размером n x m . Упорядочить ее строки по неубыванию суммы...

Дана действительная матрица размера m*n; упорядочить строки матрицы по неубыванию значений наименьших элементов строк.
Дана действительная матрица размера m*n; упорядочить строки матрицы по неубыванию значений наименьших элементов строк.

дана действительная матрица размера n*m: упорядочить строки матрицы по невозрастанию значений наибольших элементов
дана действительная матрица размера n*m: упорядочить строки матрицы по невозрастанию значений наибольших элементов

5
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
25.02.2018, 18:36
Упорядочить строки матрицы по неубыванию их наибольших элементов
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
25.02.2018, 19:59
m, n -- переменные
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const W=6; D=1;
type
  TElement = Real;
  PArray = ^TArray;
  TArray = array [0..$FFFE div SizeOf(TElement)-1] of TElement;
  PMatrix = ^TMatrix;
  TMatrix = array [0..$FFFE div SizeOf(PArray)-1] of PArray;
var
  m, n, i, j, ni: Integer;
  mx, t: TElement;
  a: PMatrix;
  b, p: PArray;
begin
  Randomize;
  Write('m n: '); ReadLn(m,n);
  { распределение памяти }
  GetMem(b,SizeOf(b^[0])*m);
  GetMem(a,SizeOf(a^[0])*m);
  for i:=0 to m-1 do GetMem(a^[i],SizeOf(a^[0]^[0])*n);
  { инициализация }
  for i:=0 to m-1 do begin
    t:=Random(1000)/10; a^[i]^[0]:=t; mx:=t;
    for j:=1 to n-1 do begin
      t:=Random(1000)/10; a^[i]^[j]:=t;
      if mx<t then mx:=t;
    end;
    b^[i]:=mx;
  end;
  { вывод }
  WriteLn('A =');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a^[j+1]; a^[j+1]:=a^[j]; a^[j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  { вывод }
  WriteLn('A''=');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { очистка памяти }
  for i:=0 to m-1 do FreeMem(a^[i],SizeOf(a^[0]^[0])*n);
  FreeMem(a,SizeOf(a^[0])*m);
  FreeMem(b,SizeOf(b^[0])*m);
end.

Если m и/или n перенести в константы, код останется рабочим, но возможны дополнительные оптимизации.
m -- переменная, n -- константа

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const n=6; W=6; D=1;
type
  TElement = Real;
  PArray = ^TArray;
  TArray = array [0..n-1] of TElement;
  PMatrix = ^TMatrix;
  TMatrix = array [0..$FFFE div SizeOf(PArray)-1] of PArray;
var
  m, i, j, ni: Integer;
  mx, t: TElement;
  a: PMatrix;
  b, p: PArray;
begin
  Randomize;
  Write('m: '); ReadLn(m);
  { распределение памяти }
  GetMem(b,SizeOf(b^[0])*m);
  GetMem(a,SizeOf(a^[0])*m);
  for i:=0 to m-1 do New(a^[i]);
  { инициализация }
  for i:=0 to m-1 do begin
    t:=Random(1000)/10; a^[i]^[0]:=t; mx:=t;
    for j:=1 to n-1 do begin
      t:=Random(1000)/10; a^[i]^[j]:=t;
      if mx<t then mx:=t;
    end;
    b^[i]:=mx;
  end;
  { вывод }
  WriteLn('A =');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a^[j+1]; a^[j+1]:=a^[j]; a^[j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  { вывод }
  WriteLn('A''=');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { очистка памяти }
  for i:=0 to m-1 do Dispose(a^[i]);
  FreeMem(a,SizeOf(a^[0])*m);
  FreeMem(b,SizeOf(b^[0])*m);
end.
m -- константа, n -- переменная
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const m=6; W=6; D=1;
type
  TElement = Real;
  PArray = ^TArray;
  TArray = array [0..$FFFE div SizeOf(TElement)-1] of TElement;
  PMatrix = ^TMatrix;
  TMatrix = array [0..m-1] of PArray;
var
  n, i, j, ni: Integer;
  mx, t: TElement;
  a: PMatrix;
  b, p: PArray;
begin
  Randomize;
  Write('n: '); ReadLn(n);
  { распределение памяти }
  New(b);
  New(a);
  for i:=0 to m-1 do GetMem(a^[i],SizeOf(a^[0]^[0])*n);
  { инициализация }
  for i:=0 to m-1 do begin
    t:=Random(1000)/10; a^[i]^[0]:=t; mx:=t;
    for j:=1 to n-1 do begin
      t:=Random(1000)/10; a^[i]^[j]:=t;
      if mx<t then mx:=t;
    end;
    b^[i]:=mx;
  end;
  { вывод }
  WriteLn('A =');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a^[j+1]; a^[j+1]:=a^[j]; a^[j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  { вывод }
  WriteLn('A''=');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { очистка памяти }
  for i:=0 to m-1 do FreeMem(a^[i],SizeOf(a^[0]^[0])*n);
  Dispose(a);
  Dispose(b);
end.
m, n -- константы
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const m=6; n=6; W=6; D=1;
type
  TElement = Real;
  PArray = ^TArray;
  TArray = array [0..n-1] of TElement;
  PMatrix = ^TMatrix;
  TMatrix = array [0..m-1] of PArray;
var
  i, j, ni: Integer;
  mx, t: TElement;
  a: PMatrix;
  b, p: PArray;
begin
  Randomize;
  { распределение памяти }
  New(b);
  New(a);
  for i:=0 to m-1 do New(a^[i]);
  { инициализация }
  for i:=0 to m-1 do begin
    t:=Random(1000)/10; a^[i]^[0]:=t; mx:=t;
    for j:=1 to n-1 do begin
      t:=Random(1000)/10; a^[i]^[j]:=t;
      if mx<t then mx:=t;
    end;
    b^[i]:=mx;
  end;
  { вывод }
  WriteLn('A =');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a^[j+1]; a^[j+1]:=a^[j]; a^[j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  { вывод }
  WriteLn('A''=');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(a^[i]^[j]:W:D); WriteLn(' |',b^[i]:W:D);
  end;
  { очистка памяти }
  for i:=0 to m-1 do Dispose(a^[i]);
  Dispose(a);
  Dispose(b);
end.


Есть и другой подход — выделять память под матрицу не построчно, а одним куском.
0
0 / 0 / 0
Регистрация: 22.11.2017
Сообщений: 10
26.02.2018, 16:32  [ТС]
bormant, а как это делать через открытые массивы в подпрограммах, для того чтобы подпрограммы были универсальны?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
26.02.2018, 17:42
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Просто не нужно пытаться передать копию массива для неконстантного числа столбцов, т.е. использовать явное указание const или var.
В остальном никаких особенностей, при константном числе столбцов это число можно получить при помощи High, в остальных случаях — передавать параметром.
Pascal
1
2
3
4
5
6
function vMax(const v: array of TElement; n: Integer): TElement;
var r: TElement;
begin
  r:=v[0]; for n:=1 to n-1 do if r<v[n] then r:=v[n];
  vMax:=r;
end;
Соответственно убираем поиск максимума из инициализации и дописываем вызов:
Pascal
1
2
3
  { инициализация }
  for i:=0 to m-1 do for j:=0 to n-1 do a^[i]^[j]:=Random(1000)/10;
  for i:=0 to m-1 do b^[i]:=vMax(a^[i]^,n);
Добавлено через 5 минут
Аналогично можем сделать процедуру для генерации строки:
Pascal
1
2
3
4
procedure vGen(var v: array of TElement; n: Integer);
begin
  for n:=0 to n-1 do v[n]:=Random(1000/10);
end;
Применяем:
Pascal
1
2
3
4
5
  { инициализация }
  for i:=0 to m-1 do begin
    vGen(a^[i]^,n);
    b^[i]:=vMax(a^[i]^,n);
  end;
Добавлено через 15 минут
Поиск максимумов можно инкапсулировать в собственно процедуру сортировки (они ведь нигде больше не нужны по условию задачи).
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure SortByRowMax(var a: TMatrix; m,n: Integer);
var
  i, j, ni: Integer;
  b, p: PArray;
  t: TElement;
begin
  GetMem(b,SizeOf(b^[0])*m);
  for i:=0 to m-1 do b^[i]:=vMax(a[i]^);
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a [j+1]; a [j+1]:=a [j]; a [j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  FreeMem(b,SizeOf(b^[0])*m);
end;
Добавлено через 16 минут
Можно добавить вывод вектора и матрицы:
Pascal
1
2
3
4
5
6
7
8
9
10
procedure vWriteLn(const v: array of TElement; n: Integer);
begin
  for n:=0 to n-1 do Write(' ',v[n]:W-1:D);
end;
 
procedure mWrite(const a: TMatrix; m,n: Integer; const s: String);
begin
  if s<>'' then WriteLn(s);
  for m:=0 to m-1 do vWriteLn(a[m]^,n);
end;
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
27.02.2018, 14:40
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Собираем всё сказанное вместе:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
const W=6; D=1;
type
  TElement = Real;
  PVector = ^TVector;
  TVector = array [0..$FFFE div SizeOf(TElement)-1] of TElement;
  PMatrix = ^TMatrix;
  TMatrix = array [0..$FFFE div SizeOf(PVector)-1] of PVector;
 
procedure vGen(var v: array of TElement; n: Integer);
begin
  for n:=0 to n-1 do v[n]:=Random(1000)/10;
end;
 
function vMax(const v: array of TElement; n: Integer): TElement;
var r: TElement;
begin
  r:=v[0]; for n:=1 to n-1 do if r<v[n] then r:=v[n];
  vMax:=r;
end;
 
procedure vWriteLn(const v: array of TElement; n: Integer; s: String);
begin
  if s<>'' then Write(s);
  for n:=0 to n-1 do Write(' ',v[n]:W-1:D); WriteLn;
end;
 
procedure mGen(var a: array of PVector; m,n: Integer);
begin
  for m:=0 to m-1 do vGen(a[m]^, n);
end;
 
procedure mWrite(const a: array of PVector; m,n: Integer; const s: String);
begin
  if s<>'' then WriteLn(s);
  for m:=0 to m-1 do vWriteLn(a[m]^,n,'');
end;
 
procedure mSortByRowMax(var a: array of PVector; m,n: Integer);
var
  i, j, ni: Integer;
  b, p: PVector;
  t: TElement;
begin
  GetMem(b,SizeOf(b^[0])*m);
  for i:=0 to m-1 do b^[i]:=vMax(a[i]^,n);
  { сортировка пузырьком }
  ni:=m-1;
  repeat
    i:=ni; ni:=0;
    for j:=0 to i-1 do
      if b^[j+1]<b^[j] then begin
        p:=a [j+1]; a [j+1]:=a [j]; a [j]:=p;
        t:=b^[j+1]; b^[j+1]:=b^[j]; b^[j]:=t;
        ni:=j;
      end;
  until ni=0;
  FreeMem(b,SizeOf(b^[0])*m);
end;
 
procedure mGetMem(var a: PMatrix; m,n: Integer);
var i: Integer;
begin
  GetMem(a,SizeOf(a^[0])*m);
  for i:=0 to m-1 do GetMem(a^[i],SizeOf(a^[0]^[0])*n);
end;
 
procedure mFreeMem(var a: PMatrix; m,n: Integer);
var i: Integer;
begin
  for i:=0 to m-1 do FreeMem(a^[i],SizeOf(a^[0]^[0])*n);
  FreeMem(a,SizeOf(a^[0])*m);
end;
 
var
  a: PMatrix;
  m, n: Integer;
begin
  Randomize;
  Write('m n: '); ReadLn(m,n);
  mGetMem(a, m,n);
  mGen(a^, m,n);
  mWrite(a^, m,n, 'A =');
  mSortByRowMax(a^, m,n);
  mWrite(a^, m,n, 'A''=');
  mFreeMem(a, m,n);
end.
Добавлено через 2 часа 55 минут
Olya Koroleva,
стесняюсь спросить, мы с вами справились с задачей? Мы молодцы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2018, 14:40
Помогаю со студенческими работами здесь

Упорядочить строки по неубыванию наибольших элементов
Упорядочить строки по неубыванию наибольших элементов.

Упорядочить строки матрицы по неубыванию их наибольших элементов
дана матрица вещественных чисел. Упорядочить ее строки по неубыванию их наибольших элементов. написать программу при помощи...

Упорядочить строки матрицы по неубыванию их наибольших элементов.
Пожалуйста помогите решить задачу: Дана вешественная матрица NxM. Упорядочить ее строки по неубыванию их наибольших элементов.

Матрица. Упорядочить строки по неубыванию первых элементов строк
Помогите пожалуйста с алгоритмом решения задачи Пусть дана вещ.матрица размером 20на30. Упорядочите её строки по неубыванию первых...

Дана матрица. Упорядочить ее строки по не убыванию суммы их элементов
4.8. Дана вещественная матрица размером 5x6. Упорядочить ее строки по не убыванию суммы их элементов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru