Другие языки программирования и технологии

Проверить рациональность выполнения программы pascal

Помогите, пожалуйста, проверить, рационально ли выполняется программа, нет ли в ней лишних проверок

const
t = 100;

var
a: array[1..t, 1..t] of integer;
i, j, n, m, index_i, index_j: integer;

begin

repeat
write('Ввведите размерность n<=100 и m<=100 для матрицы A: ');
readln(n, m);
until (n >= 1) and (n <= 100) and (m >= 1) and (m <= 100);

writeln('Введите матрицу A :');
for i := 1 to n do
for j := 1 to m do
begin
read(a[i, j]);
end;

index_i := 0;
index_j := 0;

for i := 1 to n do
for j := 1 to m do
begin
if index_i = 0 then
if (a[i, j] < 0) and ((i + j) mod 2 = 1) then {проверка, является ли наш элемент отрицательным с нечетной суммой индексов}
begin
index_i := i; {если да, запоминаем его позицию}
index_j := j;
end
else if (a[i, j] < 0) and (index_i <> 0) and (a[i, j] > a[index_i, index_j]) and ((i + j) mod 2 = 1) then
{в этом IF проверка index_i <> 0 нужна для того, чтобы при index_i = 0 мы не вышли за границы массива при проверке a[i, j] > a[index_i, index_j] }
begin
index_i := i; {если условия выполнены, запоминаем позицию минимального отриц с нечет суммой индексов}
index_j := j;
end;
end;
if index_i = 0 then writeln('Ответ: нет таких элементов')
else writeln('Ответ: ', a[index_i, index_j]);
end.
Сам разбирай неформатированый код. Лучше б картинку прислал.
Денис Строев
Денис Строев
89 589
Лучший ответ
Вадим Жучков ее отформатировать в pascal abc в один клик можно. халявщик, который зарабатывает баллы на конченых ответах
Если упрощать твой алгоритм:

if (a[i, j] < 0) and odd(i + j) then begin
if index_i = 0 then begin
index_i := i;
index_j := j
end else if a[i, j] > a[index_i, index_j] then begin
index_i := i;
index_j := j
end
end;

В некоторых диалектах Pascal можно упростить (если компилятор оптимизирует логическое выражение так, что при истинности index_i = 0 подвыражение a[i, j] > a[index_i, index_j] не будет выполнено). Но нет гарантии, что сработает в любом компиляторе:

if (a[i, j] < 0) and odd(i + j) and ((index_i = 0) or (a[i, j] > a[index_i, index_j])) then begin
index_i := i;
index_j := j
end;

Ещё проще (и гарантировано работает в любом случае) - запоминать не индексы, а значение:

max := 0; {целочисленная переменная}
for i := 1 to n do
for j := 1 to m do
if odd(i + j) and (a[i, j] < 0) and ((max = 0) or (a[i, j] > max)) max := a[i, j];
write('Ответ: ');
if max = 0 then writeln('нет таких элементов') else writeln(max)
Вадим Жучков благодарю
if (a[i, j] < 0) and (index_i <> 0) and (a[i, j] > a[index_i, index_j]) and ((i + j) mod 2 = 1)
это условие никогда не будет верным, потому что иф вложен в if index=0
Вадим Жучков будет, когда по ветке then его значение изменится