Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 29

Составить подпрограмму заменяющую каждый элемент матрицы на максимальный элемент в пересечении которых он находится

27.12.2013, 18:39. Показов 893. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать подпрограмму которая каждый элемент таблицы заменяет на максимальный элемент строки и столбца, на пересечении которых он находится.
Помогите исправить программу. Вроде что-то написал (по логике должно работать), но она заменяет элементы учитывая только максимальный элемент строки. Основная проблема в том что можно использовать только 1 дополнительный массив и тот одномерный. Я подумал что можно сначала найти максимумы каждого столбца и записать их в этот одномерный массив который даже не массив а дополнительная строка под основным массивом. Потом по логике функция должна идти по строкам, находя максимальный элемент в строке записывать его в обнуляющуюся каждую строку переменную и сравнивать переменную с элементом из доп строки но как то оно не работает так как я хочу. Помогите исправить. вот сама функция.

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
type telem=single;
     tarr=array[1..1] of telem;
     parr=^tarr;
     tmas=array[1..1] of parr;
     pmas=^tmas;
function var10 (var b: pmas; n1,m1:integer):integer;
{Функция заменяет каждый элемент матрицы на максимальный элемент столбца и
строки на пересечении которых он находится
Входные данные: b-динамический массив,
                m1-количество строк,
                n1-количество столбцов.
Выходные данные: b-измененная матрица
                 err-код ошибки(если 0 то всё хорошо
                                если 1 то пустой массив
                                если 2 то неверный размер массива)}
var i,j:integer;
     need:longint;
    it,sumo:telem;
    bool:boolean;
begin
var10:=0;
if b=nil then var10:= 1
else
begin
if (n1<=0) or (m1<=0) then var10:=2
else
begin
  var10:=0;
  for j:=1 to n1 do b^[j]^[m1+1]:=b^[j]^[1];
 
 
  for j:=1 to n1 do for i:=1 to m1 do
       if b^[j]^[i]>b^[j]^[m1+1] then b^[j]^[m1+1]:=b^[j]^[i];
 
  For i:=1 to m1 do begin
    it:=b^[1]^[i];
    for j:=1 to n1 do  if b^[j]^[i]>it then it:=b^[j]^[i];
    for j:=1 to n1 do if b^[j]^[m+1]>=it then b^[j]^[i]:=b^[j]^[m+1] else b^[j]^[i]:=it;
  end;
end;
end;
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2013, 18:39
Ответы с готовыми решениями:

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

Обнулить строку и столбец матрицы, на пересечении которых находится её максимальный элемент
Не мог бы кто-нибудь помочь переписать такой код только для VBA пожалуйста Var x: Array of Integer; i,j,n,imax,jmax: Byte; ...

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

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.12.2013, 02:34
Больше кода показывай, пока не понятно, то ли ты все индексы перевернул с ног на голову, либо у тебя действительно матрица - это не массив строк (как принято в Паскале), а массив столбцов (Фортрановский вариант). С матрицей строк вот это:
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
87
88
89
90
91
92
{$R-}
type telem=single;
     tarr=array[1..1] of telem;
     parr=^tarr;
     tmas=array[1..1] of parr;
     pmas=^tmas;
function var10 (var b: pmas; n1,m1:integer):integer;
{Функция заменяет каждый элемент матрицы на максимальный элемент столбца и
строки на пересечении которых он находится
Входные данные: b-динамический массив,
                m1-количество строк,
                n1-количество столбцов.
Выходные данные: b-измененная матрица
                 err-код ошибки(если 0 то всё хорошо
                                если 1 то пустой массив
                                если 2 то неверный размер массива)}
var i,j:integer;
    need:longint;
    it,sumo:telem;
    bool:boolean;
    ix, row_ix : integer;
    max_cols:parr;
begin
   var10:=0;
   if b=nil then var10:= 1
   else
   begin
      if (n1<=0) or (m1<=0) then var10:=2
      else
      begin
         var10:=0;
         getmem(max_cols, sizeof(telem)*n1);
         for j:=1 to n1 do
         begin
            ix := 1;
            for i := 1 to m1 do
               if b^[i]^[j] > b^[ix]^[j] then ix := i;
            max_cols^[j] := b^[ix]^[j];
         end;
 
         for i := 1 to m1 do
         begin
            row_ix := 1;
            for j := 1 to n1 do
               if b^[i]^[j] > b^[i]^[row_ix] then row_ix := j; // max in row
            it := b^[i]^[row_ix];
            for j := 1 to n1 do
               if it > max_cols^[j] then b^[i]^[j] := it
               else b^[i]^[j] := max_cols^[j];
         end;
         freemem(max_cols);
      end;
   end;
end;
 
const
   m = 4; // lines
   n = 5; // cols
 
var
   arr : pmas;
   i, j : integer;
begin
   getmem(arr, m * sizeof(parr));
   for i := 1 to m do
   begin
      getmem(arr^[i], n * sizeof(telem));
      for j := 1 to n do arr^[i]^[j] := random(50) - 20;
   end;
 
   for i := 1 to m do
   begin
      for j := 1 to n do
         write(arr^[i]^[j]:5:1);
      writeln;
   end;
   writeln;
 
   var10(arr, n, m);
 
   for i := 1 to m do
   begin
      for j := 1 to n do
         write(arr^[i]^[j]:5:1);
      writeln;
   end;
 
   for i := 1 to m do
      freemem(arr^[i]);
   freemem(arr);
   readln;
end.
прекрасно отрабатывает, можешь запустить и убедиться...
1
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 29
28.12.2013, 11:04  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Больше кода показывай, пока не понятно, то ли ты все индексы перевернул с ног на голову, либо у тебя действительно матрица - это не массив строк (как принято в Паскале), а массив столбцов (Фортрановский вариант).
Да там изначально у меня массив столбцов. Вот весь код:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
program z1;
{$R-} {$I-}
uses crt;
const m=500;
      v=6;
      v1=2;
      qq=20;
type telem=single;
     tarr=array[1..1] of telem;
     parr=^tarr;
     tmas=array[1..1] of parr;
     pmas=^tmas;
function var10 (var b:pmas; n1,m1:integer):integer;
{Входные данные: b-динамический массив,
                m1-количество строк,
                n1-количество столбцов.
Выходные данные: b-измененная таблица
                          err-код ошибки(если 0 то всё хорошо
                                если 1 то пустой массив
                                если 2 то неверный размер массива)}
var i,j:integer;
     need:longint;
    it:telem;
begin
var10:=0;
if b=nil then var10:= 1
else
begin
if (n1<=0) or (m1<=0) then var10:=2
else
begin
  var10:=0;
  for j:=1 to n1 do b^[j]^[m1+1]:=b^[j]^[1];
 
 
  for j:=1 to n1 do for i:=1 to m1 do
       if b^[j]^[i]>b^[j]^[m1+1] then b^[j]^[m1+1]:=b^[j]^[i];
 
  For i:=1 to m1 do begin
    it:=b^[1]^[i];
    for j:=1 to n1 do  if b^[j]^[i]>it then it:=b^[j]^[i];
    for j:=1 to n1 do if b^[j]^[m+1]>=it then b^[j]^[i]:=b^[j]^[m+1] else b^[j]^[i]:=it;
  end;
end;
end;
end;
var y,n1,m1,i,j,err:integer;
    a:pmas;
    need1,need2:longint;
    k,n2,m2,res:single;
    fil:string;
    zu:file of telem;
begin
a:=nil;
randomize;
repeat
clrscr;
writeln('1. Задать размеры');
writeln('2. Заполнить случайными числами');
writeln('3. Заполнить с клавиатуры');
writeln('4. Посмотреть таблицу');
writeln('5. Выполнить');
writeln('6. Вывод информации из файла');
writeln('7. Сохранить в файл');
writeln('8. Конец');
writeln('Ввести номер пункта');
readln(y);
case y of
        1:begin
          if a<>nil then   begin
                              for i:=1 to n1 do
                                   FREEMEM(a^[i],need1);
                                 FREEMEM(a,need2);
                              a:=nil
                            end;
                repeat
                writeln('Введите кол-во столбов');
                readln(n1);
                until ioresult=0;
                repeat
                writeln('Введите кол-во строк');
                readln(m1);
                until ioresult=0;
                need1:=longint(n1)*longint(m1+1)*sizeof(parr);
                need2:=longint(m1+1)*sizeof(telem);
                GETMEM(a,need1);
                for i:=1 to n1 do
                        GETMEM(a^[i],need2);
                for i:=1 to n1 do
                        for j:=1 to m1+1 do
                                a^[i]^[j]:=0;
          end;
        2:begin
                for j:=1 to m1 do
                        for i:=1 to n1 do
                                A^[i]^[j]:=random(qq)-qq/2;
          end;
        3:begin
          for j:=1 to m1 do
                begin
                for i:=1 to n1 do
                        begin
                        repeat
                        writeln('Введите элемент номер  ', i, ' строки номер ', j);
                        readln(A^[i]^[j]);
                        until ioresult=0;
                        end;
                end;
          end;
        4:begin
                for j:=1 to m1 do
                begin
                for i:=1 to n1 do
                           write(A^[i]^[j]:v:v1,' ');
                           writeln;
                end;
                readln;
          end;
        5:begin
 
                err:=var10(a,n1,m1);
                if err=0 then begin
                readln;
                end
                else begin
                writeln('Код ошибки ' ,err);
                readln;
                end;
          end;
        6:begin
                writeln('Введите путь и имя файла');
                readln(fil);
                assign(zu,fil);
                reset(zu);
                if ioresult<> 0 then begin
                writeln('Фаил не существует');
                readln;
                end
                else
                begin
                        if a<>nil then
                        begin
                                for i:=1 to n1 do
                                                FREEMEM(a^[i],need2);
                                        FREEMEM(a,need1);
                                a:=nil;
                        end;
                        read(zu,n2);
                        read(zu,m2);
                        n1:=trunc(n2);
                        m1:=trunc(m2);
                        need1:=longint(n1)*longint(m1+1)*sizeof(parr);
                        need2:=longint(m1+1)*sizeof(telem);
                        GETMEM(a,need1);
                        for i:=1 to n1 do
                                GETMEM(a^[i],need2);
                        for i:=1 to n1 do
                                for j:=1 to m1 do
                                        read(zu,a^[i]^[j]);
                end;
                close(zu);
          end;
        7:begin
                writeln('Введите путь и имя файла');
                readln(fil);
                assign(zu,fil);
                rewrite(zu);
                write(zu,n1);
                write(zu,m1);
                for i:=1 to n1 do
                        for j:=1 to m1 do
                           write(zu,a^[i]^[j]);
                close(zu);
 
          end;
        8:exit;
else writeln('Введите другую цифру от 1 до 8');
end;
until y=8;
readln;
{$I+}
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.12.2013, 13:47
С массивом столбцов прекрасно работает вот это:
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
87
88
89
90
91
92
93
{$R-}
type telem=single;
     tarr=array[1..1] of telem;
     parr=^tarr;
     tmas=array[1..1] of parr;
     pmas=^tmas;
function var10 (var b: pmas; n1,m1:integer):integer;
{Функция заменяет каждый элемент матрицы на максимальный элемент столбца и
строки на пересечении которых он находится
Входные данные: b-динамический массив,
                m1-количество строк,
                n1-количество столбцов.
Выходные данные: b-измененная матрица
                 err-код ошибки(если 0 то всё хорошо
                                если 1 то пустой массив
                                если 2 то неверный размер массива)}
var i,j:integer;
    need:longint;
    it,sumo:telem;
    bool:boolean;
    ix, row_ix : integer;
    max_cols:parr;
begin
   var10:=0;
   if b=nil then var10:= 1
   else
   begin
      if (n1<=0) or (m1<=0) then var10:=2
      else
      begin
         var10:=0;
         getmem(max_cols, sizeof(telem)*m1); // max in lines
         for j := 1 to m1 do
         begin
            ix := 1;
            for i := 1 to n1 do
               if b^[i]^[j] > b^[ix]^[j] then ix := i;
            max_cols^[j] := b^[ix]^[j];
         end;
 
         for i := 1 to n1 do
         begin
            row_ix := 1;
            for j := 1 to m1 do
               if b^[i]^[j] > b^[i]^[row_ix] then row_ix := j;
            it := b^[i]^[row_ix];
            for j := 1 to m1 do
               if it > max_cols^[j] then b^[i]^[j] := it
               else b^[i]^[j] := max_cols^[j]
         end;
         freemem(max_cols);
      end;
   end;
end;
 
const
   m = 4; // lines
   n = 5; // cols
 
var
   arr : pmas;
   i, j : integer;
begin
   getmem(arr, n*sizeof(parr)); // n columns
   for i := 1 to n do
   begin
      getmem(arr^[i], m*sizeof(telem));
      for j := 1 to m do arr^[i]^[j] := random(50) - 20;
   end;
 
   for j := 1 to m do
   begin
      for i := 1 to n do
         write(arr^[i]^[j]:6:1);
      writeln;
   end;
   writeln;
 
   var10(arr, n, m);
 
   for j := 1 to m do
   begin
      for i := 1 to n do
         write(arr^[i]^[j]:6:1);
      writeln;
   end;
   writeln;
 
   for i := 1 to n do
      freemem(arr^[i]);
   freemem(arr);
   readln;
end.
, вот результат прогона:

Bash
1
2
3
4
5
6
7
8
9
10
Running "d:\programs\pascal\test_arr.exe"
   7.0  10.0   1.0   1.0  28.0
   9.0  22.0  11.0  -6.0  -7.0
  15.0   7.0  12.0  24.0  -1.0
  22.0  22.0  -1.0 -18.0   3.0
 
  28.0  28.0  28.0  28.0  28.0
  22.0  22.0  22.0  24.0  28.0
  24.0  24.0  24.0  24.0  28.0
  22.0  22.0  22.0  24.0  28.0
1
0 / 0 / 2
Регистрация: 03.11.2013
Сообщений: 28
26.05.2014, 15:35
а что означает символ ^ ?

Добавлено через 54 секунды
Цитата Сообщение от max2014 Посмотреть сообщение
parr=^tarr;
наример здесь
0
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 29
26.05.2014, 16:42  [ТС]
Это указатель. Указатель – это переменная, которая содержит адрес другой переменной (байта памяти).
В ТР имеется два вида указателей: указатель на объект некоторого типа (типизированный) и указатель, не связанный с типом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2014, 16:42
Помогаю со студенческими работами здесь

Обнулить строку и столбец матрицы, на пересечении которых находится её максимальный элемент
Привет,всем) Дана матрица размером mxn. Обнулить строку и столбец матрицы, на пересечении которых находится её максимальный элемент. но...

Удалить строку и столбец матрицы, на пересечении которых находится максимальный элемент
Сформировать матрицу 5*5 случайных целых чисел в диапазоне от -20 до 60. Напечатать матрицу. Найти максимальный элемент и удалить строку и...

Вычеркнуть из матрицы строки и столбцы, на пересечении которых находится максимальный элемент
Дана матрица A(5*5). Получить матрицу C(4*4) вычеркнуть из матрицы A строки и столбцы на пересечении которых находится максимальный...

Обменять строку и столбец матрицы, на пересечении которых находится ее максимальный элемент
Добрый вечер. Помогите пожалуйста как можно скорее сделать задачку по Assembler. Буду очень вам признателен! Задача: Задача. В матрице...

Исключить из матрицы строку и столбец, на пересечении которых находится максимальный элемент
сформировать случайным образом матрицу размером N*M, где N,M- натуральные числа. исключить из нее строку и столбец, на пересечении которых...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru