Ошибка времени выполнения: Индекс находился вне границ массива - PascalABC.NET (121173)
Формулировка задачи:
Решение задачи: «Ошибка времени выполнения: Индекс находился вне границ массива»
textual
Листинг программы
type matrix=array [,] of real; vector=array[0..4] of real; function MassCenter(klass: matrix): vector; begin for var j := 0 to klass.GetLength(1)-1 do result[j]:=klass.Col(j).Average; end; function Rasseivanie(klass: matrix):real; begin result := 0; for var i := 0 to klass.GetLength(0)-1 do for var j := 0 to klass.GetLength(1)-1 do result+=sqr(MassCenter(klass)[j]-klass[i,j]); result:=result/klass.GetLength(0); end; function Krit_Komp(klass1,klass2:matrix):=(Rasseivanie(klass1)+Rasseivanie(klass2))/2; function Range(index: integer; klass: matrix):real; begin result:=0; for var j := 0 to klass.GetLength(1)-1 do result+=sqr(klass[index,j]-MassCenter(klass)[j]); result:=sqrt(result); end; function Rebel(klass:matrix):integer; begin var max_int: integer; var max_range: real = 0; var r:real:=0; for var i := 0 to klass.GetLength(0)-1 do begin for var j := 0 to klass.GetLength(1)-1 do r:=r+sqr(MassCenter(klass)[j]-klass[i,j]); if (sqrt(r)>max_range) then begin max_range:=sqrt(r); max_int:=i; end; r:=0; end; result:=max_int; end; function Rebel_In_1st_klass(klass1,klass2:matrix):= Range(Rebel(klass1),klass1)>(Range(Rebel(klass2),klass2)); procedure vector_move(index:integer; klass1,klass2:matrix);//из klass1 в klass2 begin SetLength(klass2,klass2.GetLength(0)+1,klass2.GetLength(1)); for var j := 0 to klass2.GetLength(1)-1 do klass2[klass2.GetLength(0)-1,j]:=klass1[index,j]; for var i := index to klass1.GetLength(0)-2 do for var j := 0 to klass1.GetLength(1)-1 do klass1[i,j]:=klass1[i+1,j]; SetLength(klass1,klass1.GetLength(0)-1,klass1.GetLength(1)); end; begin var f : Text; Reset(f, 'c:\1.txt'); var arr: array [0..19, 0..4] of real; var file_i := 0; while not Eof(f) do begin var file_j := 0; while not Eoln(f) do begin Read(f, arr[file_i, file_j]); Inc(file_j); end; ReadLn(f); Inc(file_i); end; Close(f); var k1,k2 : matrix; SetLength(k1,10,5); SetLength(k2,10,5); for var i := 0 to k1.GetLength(0)-1 do for var j := 0 to k1.GetLength(1)-1 do k1[i,j]:=arr[i,j]; for var i := 0 to k2.GetLength(0)-1 do for var j := 0 to k2.GetLength(1)-1 do k2[i,j]:=arr[i+10,j]; var initial_kk:=Krit_Komp(k1,k2); WriteLn(initial_kk); end.
Объяснение кода листинга программы
В данном коде на языке PascalABC.Net реализуется алгоритм для вычисления среднего значения, расстояния между точками, площади и индекса центра масс объекта в двухмерном пространстве. Также в коде присутствуют функции для нахождения максимального значения индекса и для перемещения элементов из одного массива в другой. Список функций и их описания:
- MassCenter - вычисляет среднее значение по столбцу матрицы.
- Rasseivanie - вычисляет сумму квадратов разностей между средними значениями столбцов и центроидами.
- Krit_Komp - вычисляет среднее значение двух матриц.
- Range - вычисляет расстояние между двумя точками в двумерном пространстве.
- Rebel - находит индекс максимального расстояния от центра масс.
- Rebel_In_1st_klass - сравнивает два индекса максимального расстояния от центра масс.
- vector_move - перемещает элементы из одного массива в другой. Список действий в коде:
- Считывание данных из файла в массив.
- Создание двух матриц размером 10x5.
- Заполнение первой матрицы данными из массива.
- Заполнение второй матрицы данными из массива, сдвинутыми на 10 элементов вправо.
- Вычисление начального значения критерия.
- Вывод начального значения критерия на экран.