Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

PASCAL. Нужно найти минимальный элемент матрицы. нашел. Как найти индексы?

Владимир Весёлый Мудрец (12165), закрыт 14 лет назад
program variant3;
var
a:array[1..10,1..5] of integer;
i,j,n,k,min,nmin:integer;
begin
readln(n,k);
for i:=1 to n do
for j:=1 to k do begin
writeln('a(',i,';',j,')=');
readln(a[i,j]);
end;
min:=a[1,1];
nmin:= ???
for i:=1 to n do
for j:=1 to k do begin
if a[i,j]<min>nmin:=????
end;
writeln ('MIN=',min,'nmin=',nmin);
end.
Дополнен 14 лет назад
ГЛЮКИ:
program variant3;
var
a:array[1..10,1..5] of integer;
i,j,n,k,min,nmin:integer;
begin
readln(n,k);
for i:=1 to n do
for j:=1 to k do begin
writeln('a(',i,';',j,')=');
readln(a[i,j]);
end;
min:=a[1,1];
nmin:= ???
for i:=1 to n do
for j:=1 to k do begin
if a[i,j]
Лучший ответ
Gennady Гений (60494) 14 лет назад
Доброго времени суток.

Ищите только индексы. По индексам всегда отобразите сам минимальный элемент

MinI := 1;
MinJ := 1;
for i:=1 to n do
for j:=1 to k do
if a[i,j] < a[MinI,MinJ] then begin
MinI := i;
MinJ := j;
end;
{индексы нашли}
WriteLn(A[MinI, MinJ]); {а так показываем минимальный элемент}

Удачи!
Vlad02Профи (557) 14 лет назад
В
if a[i,j] < a[MinI,MinJ] then begin
MinI := i;
MinJ := j;
end;
Пропущена строка собственно поиска минимального элемента
Соответственно нормальная программа выглядит примерно так:
program variant3;
const
Max_X=10;
Max_Y=5
Type
T_Arr= array[1.. Max_X,1.. Max_Y] of integer;
var
a: T_Arr;
i,j,n,k,min,minI,minJ:integer;
begin
Write(‘Строк=’);
readln(n);
Write(‘Столбцов=’);
readln(k);
for i:=1 to n do
for j:=1 to k do begin
writeln('a(',i,';',j,')=');
readln(a[i,j]);
end;
min:=a[1,1];
minI:=1;
minJ:=1 ;
for i:=1 to n do
for j:=1 to k do begin
if a[i,j]
Gennady Гений (60494) Ничего не пропущено! Именно так изадумано. Ищем только индексы. Когда их найдем, то элемент покажем. Зато не надо переменной для хранения самого минимального значения, как у вас. Вдумайтесь.
Vlad02Профи (557) 14 лет назад
А сам минимальный элемент вам на блюдечке? или третий цикл перебора? Вот мой вариант и ищет ОДНОВРЕМЕННО минимальный элемент массива и его индексы, а ваш на выходе выдаст элемент за номером 1,1 , можете компильнуть и проверить
Gennady Гений (60494) А зачем искать ОДНОВРЕМЕННО? Еще раз для танкистов. Элемент массива однозначно определяется своими индексами. Когда нашли индексы, то нашли и сам элемент! Выводить надо так WriteLn('Минимальный элемент: ', A[MinI, MinJ], ' строка - ', MinI, ' столбец - ', MinJ); Если не обратили внимания, то при сравнивании элементов массива значение переименных MinI и MinJ переопределяется, в результат чего после циклов они будут содержать как раз индексы минимального элемента. Учите матчасть.
Vlad02Профи (557) 14 лет назад
Насчет подсчетов вызовов в вашем вариант осуществляется за цикл ДВА ОБЯЗАТЕЛЬНЫХ вызова элемента массива в моём ОДИН ОБЯЗАТЕЛЬНЫЙ и один в случае выполнения условия сравнения, то есть в наихудшем варианте(монотонно убывающий массив) мой вариант по количеству вызовов равен вашему, в остальных случаях имеем количество необязательных вызовов равное количеству элементов меньших чем все предыдущие, а в среднем это как минимум в 1Ю5 раза меньше, на массивах под милион элементов с динамическим вызовом это скажется существенно, ну а мой последний вариант вообще массивы не использует:)
Остальные ответы
Vlad02 Профи (557) 14 лет назад
Собственно Геннадий напомнил студенчество, и соответственно простейшее решение задачи :) с приведёнными требованиями

program variant3;
Var
i,j, IndexI,IndexJ,MinI,MinJ:integer;
x,y:real;{необходимый тип}
begin
y:=1,8e38;{наибольшее возможное число для данного типа}
write('Число столбцов=');
readln(IndexJ);
write('Число строк=');
readln(IndexI);
write('Элемент [',i,';',j']=');
readln(x);
for i:=1 to IndexI do
for i:=1 to IndexI do
if x
Vlad02Профи (557) 14 лет назад
Сожрала и исковеркала программу-program variant3;
Var
i,j, IndexI,IndexJ,MinI,MinJ:integer;
x,y:real;{необходимый тип}
begin
y:=1,8e38;{наибольшее возможное число для данного типа}
write('Число столбцов=');
readln(IndexJ);
write('Число строк=');
readln(IndexI);
for i:=1 to IndexI do
for j:=1 to IndexI do begin
write('Элемент [',i,';',j']=');
readln(x);
if x
Vlad02Профи (557) 14 лет назад
так как убивает после знака написал словом меньше
program variant3;
Var
i,j, IndexI,IndexJ,MinI,MinJ:integer;
x,y:real;{необходимый тип}
begin
y:=1,8e38;{наибольшее возможное число для данного типа}
write('Число столбцов=');
readln(IndexJ);
write('Число строк=');
readln(IndexI);
for i:=1 to IndexI do
for j:=1 to IndexI do begin
write('Элемент [',i,';',j']=');
readln(x);
if x меньше y then begin y:=x;MinI:=i;MinJ:=j end;
end;{j}
write('Минимальный элемент X[',MinI,';',MinJ']=',y);
end.
Vlad02 Профи (557) Чуть не забыл приведённый вариант ищет ПЕРВОЕ вхождение минимального числа, если изменить на меньше равно будет искать последнее вхождение, порой это бывает важно :)
Похожие вопросы