Что не так с этой программой? Паскаль пишет "Ошибка времени выполнения: Индекс находился...

0 голосов
51 просмотров

Что не так с этой программой? Паскаль пишет "Ошибка времени выполнения: Индекс находился вне границ массива." и "Параметр цикла for в PascalABC.NET должен описываться в заголовке цикла" PROGRAM Massiv; VAR M: array [1..4, 1..4] of integer; a, b, min, max: integer; begin writeln('Исходная матрица:'); for a := 1 to 4 do begin for b := 1 to 4 do begin M[a, b] := random(10); write(M[a, b]:4) end; writeln end; min := 10; max := 0; for a := 1 to 4 do if M[a, 4+1-a] < M[min, min] then min := M[a, 4+1-a] else if M[a, 4+1-a] > M[max, max] then max := M[a, 4+1-a]; writeln('Мин. эл-т побоч. диаг. матрицы: M[', min:2, ', ', min:2, '] = ', M[min, min]:3); writeln('Макс. эл-т побоч. диаг. матрицы: M[', max:2, ', ', max:2, '] = ', M[max, max]:3); a := M[min, min]; M[min, min] := M[max, max]; M[max, max] := a; writeln('Результат:'); for a := 1 to 4 do begin for b := 1 to 4 do write(M[a, b]:4); writeln end; readln end.


Информатика (20 баллов) | 51 просмотров
Дан 1 ответ
0 голосов

if M[a, 4+1-a] < M[min, min]

 then min := M[a, 4+1-a]

- у тебя в матрице рандомные числа максимум до 10, ты назначаешь их в min и max, а потом эти min и max пытаешься использовать как индексы.

Заведи отдельные переменные для сохранения индексов, например imin и imax и пользуйся ими, например как-то так:

for a := 1 to 4 do

if M[a, 4+1-a] < M[imin, imin]

 then begin

                      min := M[a, 4+1-a];

                      imin := a;

                end


По поводу параметра цикла не уверен, возможно в Pascal.ABC есть какие-то особенности по сравнению с обычным паскалем. Нашел вот такое:

"Описание параметра цикла for в заголовке цикла соблюдает принцип локальности: переменная описывается в том месте, где она впервые понадобилась


begin

 for i: integer := 1 to 9 do

   write(i,' ');

 // Здесь переменная i не доступна!

 for var i := 9 downto 1 do // описание с автоопределением типа

   write(i,' ');

end."

(1.2k баллов)
0

я уже немного изменила программу, то исправила, но новое выскочило:"writeln('Мин. эл-т побоч. диаг. матрицы:', M[a, b]= min); writeln('Макс. эл-т побоч. диаг. матрицы:', M[a, b] = max);"но пишет:"Мин. эл-т побоч. диаг. матрицы: FalseМакс. эл-т побоч. диаг. матрицы: False"что опять не так? и у меня правильно написано "М [a, b]" или надо как-то по-другому?

0

Надо writeln('Мин. эл-т побоч. диаг. матрицы:', min);, а оно у тебя выводит результат сравнения "M[a, b] = min"

0

не, мне в задаче просто надо указать еще и расположение эл-та, как именно это провернуть?

0

writeln('Мин. эл-т побоч. диаг. матрицы:', min, ', индекс: ', imin); например

0

не совсем поняла про индексы и как они используются в задаче, поясни, пожалуйста