alcoholistЕсли программа набрана и компилируется - это ещё не значит, что она завершена. Её ещё надо отладить! И тут начинается такое, отчего дух захватывает: оказывается, что отладка занимает 90% времени, а написание кода всего 10% времени. А ещё поговаривают, что иногда математиков просили вместо отладки провести доказать правильность работы ихней программы.
Зри в корень...Давайте вспомним такие определения как «программа» и «алгоритм». Программа - это алгоритм записанный на языке программирования. А алгоритм - это чёткая последовательность действий преобразующий входные данные в выходные.
Вот вам и ошибка. В вашей программе не предусмотрен ввод данных. А между прочим в определение алгоритма и как следствие программы требуется что-бы были входные данные. Значит протестировать её подав на вход разные данные уже не возможно.
Вторая ошибка декомпозиция программы. Она у вас попросту отсутствует. Как минимум следовало разбить код на: модель, ввод, вывод.
Зачем нужна декомпозиция? Да, для отладки! Основным инструментом отладки являются тесты.
Так вот алгоритм тестируется по входным данным. И чем их больше тем больше вариантов данных надо подать на вход.
Если у нас 2 параметра то на потребуется проверить
тестов. А если у нас 3 параметра то уже
и тд
Число вариантов растёт экспоненциально! Это очень крутой рост.
Правильная декомпозиция строится так что-бы разбить алгоритм на как можно более простые составляющие. В приделе имеем одна функция - один цикл или одно условие. И это стоит взять за правило, исключение пожалуй для вложенных циклов, для их можно сделать 2 в одном цикле.
Что нам даёт правильная декомпозиция?
1. Она повышает качество кода.
2. Снижается вероятность ошибки программиста.
3. Упрощает тестирование мы можем проверить разные участки программы по отдельности.
4. Элементарные функции можно проверить просто просмотрев код. (Это для опытных программистов) А так на элементарную функцию всего с одним или двумя параметрами проще написать тест.
5. Снижается число необходимых тестов, так как уже не требуется проверять все комбинации, а можно использовать правило сведения к предыдущему. Если функция от тестирована, то она гарантированно правильно работает.
Что по сути устремляет сложность тестирования к линейной функции.
6. Упрощается восприятие кода. Человек может сосредоточиться на небольшом куске кода. Одновременно человек может удерживать в уме порядка 7-10 предметов. Чем меньше код тем меньше таких «предметов» ему требуется запомнить. Следовательно исключается фактор забывчивости.
Знал бы где подстелил соломку(А горожанин газетку постелет).Есть ещё ряд методик который позволят так сказать подстелить соломку. Избежать допуска ошибок при наборе программы.
За подробностями советую обратиться к книге «Совершенный код».
Объединять циклы не комильфо.
for j:=0 to 4 do
begin
S[j]:=0;
for i:=0 to 4 do
begin
lt[i,j]:=0;
llt[i,j]:=0;
matr[i,j]:=0;
end;
end;
Разделяем:
for j:=0 to 4 do
S[j]:=0;
for j:=0 to 4 do
for i:=0 to 4 do
begin
lt[i,j]:=0;
llt[i,j]:=0;
matr[i,j]:=0;
end;
Разбиваем на функции
type
TArrayReal:array[0..8] of real;
TMatrixReal:array[0..4,0..4] of real;
procedure doZeroArray(Value:TArrayReal);
var i:Integer;
begin
for j:=0 to 4 do // Тут уже видно что массив не целиком обновляется так как тут вместо 4 должно быть 8
Value[j]:=0;
end;
procedure doZeroMatrix(Value:TArrayReal);
var i,j:Integer;
begin
for i:=0 to 4 do
for j:=0 to 4 do
Value[i,j]:=0;
end;
...
doZeroArray(Z);
doZeroMatrix(lt);
doZeroMatrix(llt);
doZeroMatrix(matr);
Волшебные константы зло их следует заменить параметрами. Оставляю на самостоятельную работу.
П.С. Хотелось бы ещё немного рассказать про тестирование. Но пожалуй тоже оставлю для самостоятельного изучения такие темы как тестирование по входу, тестирование по выходу, протоколирование, фазинг и так далее.